diff --git a/.gitignore b/.gitignore index 1937d52f4..af76202e7 100644 --- a/.gitignore +++ b/.gitignore @@ -388,3 +388,4 @@ freeciv-web/valhallabuild.sh freeciv-web/vdebug-remake.sh publite2/supercows.txt publite2/supercows.txt +publite2/init-freeciv-web.sh diff --git a/README.md b/README.md index 461d66b0a..1431f3426 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ under the GNU Affero General Public License. See [License](LICENSE.txt) for the Currently known servers based on Freeciv-web: - [Freecivweb.org](https://www.freecivweb.org) - Full Freeciv-web +- [Freeciv TnT](https://www.tacticsandtriumph.com) - Freeciv-web Games & Mods (no PBEM) - [moving borders](https://fcw.movingborders.es) (Everything except longturn and real-Earth) ![Freeciv-web](https://raw.githubusercontent.com/Lexxie9952/fcw.org-server/master/fcw-2021.png "Freeciv-web screenshot") @@ -193,11 +194,15 @@ Developers interested in Freeciv-web If you want to contibute to Freeciv-web, see the [issues](https://github.com/freeciv/freeciv-web/issues) on GibHub and the [TODO file](TODO.md) for some tasks you can work on. Pull requests on Github is welcome! + +Freeciv WebGL +------------- +Freeciv WebGL is the 3D version, which uses the Three.js 3D engine. More info about the WebGL 3D version can be found for [developers](https://github.com/freeciv/freeciv-web/tree/develop/freeciv-web/src/main/webapp/javascript/webgl) and [3D artists](https://github.com/freeciv/freeciv-web/wiki/Contributing-Blender-models-for-Freeciv-WebGL). Contributors to Freeciv-web --------------------------- -Lexxie9952 [@lexxie9952](https://discordapp.com/users/Lexxie9952) +Lexxie9952 [@lexxie9952](https://discordapp.com/users/Lexxie9952) Andreas Røsdal [@andreasrosdal](https://github.com/andreasrosdal) Marko Lindqvist [@cazfi](https://github.com/cazfi) Sveinung Kvilhaugsvik [@kvilhaugsvik](https://github.com/kvilhaugsvik) @@ -205,8 +210,3 @@ Máximo Castañeda [@lonemadmax](https://github.com/lonemadmax) Gerik Bonaert [@adaxi](https://github.com/adaxi) and the [Freeciv.org project](http://freeciv.wikia.com/wiki/People)! -About FCW and this repository ------------------------------ -HELP! We have a dispute against this repository! -Licensing restrictions not contained in the (A)GPL have been legally threatened against this repository. They seek to restrict our repository- and user- policies from having content allowed by our licenses. Claiming additional restrictions not contained within a license, misrepresenting them as being within that license, and threatening legal enforcement of said restrictions, legally qualifies as a breach of the license by the parties making the claim. Please be patient. FCW has suspended its Repository Policy pending resolution of the licensing infractions against us. - diff --git a/blender/CREDITS b/blender/CREDITS new file mode 100644 index 000000000..2e90e7af2 --- /dev/null +++ b/blender/CREDITS @@ -0,0 +1,8 @@ +Some of the models were borrowed from www.blendswap.com and then modified. Original model were in public domain. +I want to thank the following people who made their work available under Public Domain licence: + +1. Joni Vvaris for low poly ak-47 +2. Edimar Dos Reis Silva aka Mutte for his Lot Angel rigged character -- huge help. +3. Anonymous for hs Black Hawk helicopter model +4. Praydude for C-5B airplane model +5. Jeff2207 for a nice model of an elephant. diff --git a/blender/README.md b/blender/README.md new file mode 100644 index 000000000..684729fe5 --- /dev/null +++ b/blender/README.md @@ -0,0 +1,39 @@ +Blender 3d models created for Freeciv-web. +========================================== + +![Freeciv-web](https://raw.githubusercontent.com/freeciv/freeciv-web/develop/freeciv-web/src/main/webapp/javascript/webgl/freeciv-webgl.png "Freeciv-web WebGL screenshot") + +These are the original Blender files for all 3D models in the WebGL version. + +3D artists are welcome to improve these models! + +Export from Blender to glTF 2.0 .glb binary format +============================================================ + +Follow these steps to prepare the 3D models for usage in Freeciv-web: + +1. Install and activate the Blender glTF 2.0 exporter +https://github.com/KhronosGroup/glTF-Blender-Exporter + +2. Export the blender file from Blender: File -> Export -> glTF 2.0 (.glb) + - Don't export normals. + - Export to the .glb file to freeciv-web/src/main/webapp/gltf/ + - Filename must match unit name from Freeciv ruleset. + +3. Rebuild Freeciv-web using freeciv-web/build.sh script. + +When creating new additional 3D-models they must also be added to preload.js in Freeciv-web so that they are preloaded correctly. + +Be sure to limit the file size and number of verticies, since the result +will be rendered in a web browser. Check the file size of the generated .glb file! + +Don't export any lights or cameras. + +3D Models with textures +======================= + +See the citywalls.blend for an example of a 3D model with textures which works in Freeciv-web 3D. + + +The unit models come from here: http://opengameart.org/content/blender-models-for-freeciv-units + diff --git a/blender/blender_models_version_1/AEGIS Cruiser.blend b/blender/blender_models_version_1/AEGIS Cruiser.blend new file mode 100644 index 000000000..da94460df Binary files /dev/null and b/blender/blender_models_version_1/AEGIS Cruiser.blend differ diff --git a/blender/blender_models_version_1/AWACS.blend b/blender/blender_models_version_1/AWACS.blend new file mode 100644 index 000000000..6226d9c33 Binary files /dev/null and b/blender/blender_models_version_1/AWACS.blend differ diff --git a/blender/blender_models_version_1/Airbase.blend b/blender/blender_models_version_1/Airbase.blend new file mode 100644 index 000000000..a76e93b84 Binary files /dev/null and b/blender/blender_models_version_1/Airbase.blend differ diff --git a/blender/blender_models_version_1/Alpine Troops.blend b/blender/blender_models_version_1/Alpine Troops.blend new file mode 100644 index 000000000..639725851 Binary files /dev/null and b/blender/blender_models_version_1/Alpine Troops.blend differ diff --git a/blender/blender_models_version_1/Archers.blend b/blender/blender_models_version_1/Archers.blend new file mode 100644 index 000000000..2ba2f9b14 Binary files /dev/null and b/blender/blender_models_version_1/Archers.blend differ diff --git a/blender/blender_models_version_1/Armor.blend b/blender/blender_models_version_1/Armor.blend new file mode 100644 index 000000000..30b567a02 Binary files /dev/null and b/blender/blender_models_version_1/Armor.blend differ diff --git a/blender/blender_models_version_1/Artillery.blend b/blender/blender_models_version_1/Artillery.blend new file mode 100644 index 000000000..32b5a7e2d Binary files /dev/null and b/blender/blender_models_version_1/Artillery.blend differ diff --git a/blender/blender_models_version_1/Barbarian Leader.blend b/blender/blender_models_version_1/Barbarian Leader.blend new file mode 100644 index 000000000..f007dd0f9 Binary files /dev/null and b/blender/blender_models_version_1/Barbarian Leader.blend differ diff --git a/blender/blender_models_version_1/Battleship.blend b/blender/blender_models_version_1/Battleship.blend new file mode 100644 index 000000000..b30d96b5a Binary files /dev/null and b/blender/blender_models_version_1/Battleship.blend differ diff --git a/blender/blender_models_version_1/Bomber.blend b/blender/blender_models_version_1/Bomber.blend new file mode 100644 index 000000000..2cfdf0086 Binary files /dev/null and b/blender/blender_models_version_1/Bomber.blend differ diff --git a/blender/blender_models_version_1/Cannon.blend b/blender/blender_models_version_1/Cannon.blend new file mode 100644 index 000000000..c3da868af Binary files /dev/null and b/blender/blender_models_version_1/Cannon.blend differ diff --git a/blender/blender_models_version_1/Caravan.blend b/blender/blender_models_version_1/Caravan.blend new file mode 100644 index 000000000..d6d82c273 Binary files /dev/null and b/blender/blender_models_version_1/Caravan.blend differ diff --git a/blender/blender_models_version_1/Caravel.blend b/blender/blender_models_version_1/Caravel.blend new file mode 100644 index 000000000..da2282061 Binary files /dev/null and b/blender/blender_models_version_1/Caravel.blend differ diff --git a/blender/blender_models_version_1/Carrier.blend b/blender/blender_models_version_1/Carrier.blend new file mode 100644 index 000000000..8ee12640b Binary files /dev/null and b/blender/blender_models_version_1/Carrier.blend differ diff --git a/blender/blender_models_version_1/Catapult.blend b/blender/blender_models_version_1/Catapult.blend new file mode 100644 index 000000000..0f67f5c17 Binary files /dev/null and b/blender/blender_models_version_1/Catapult.blend differ diff --git a/blender/blender_models_version_1/Cavalry.blend b/blender/blender_models_version_1/Cavalry.blend new file mode 100644 index 000000000..5a2772805 Binary files /dev/null and b/blender/blender_models_version_1/Cavalry.blend differ diff --git a/blender/blender_models_version_1/Chariot.blend b/blender/blender_models_version_1/Chariot.blend new file mode 100644 index 000000000..45af515ef Binary files /dev/null and b/blender/blender_models_version_1/Chariot.blend differ diff --git a/blender/blender_models_version_1/Cruise Missile.blend b/blender/blender_models_version_1/Cruise Missile.blend new file mode 100644 index 000000000..1457d5f0c Binary files /dev/null and b/blender/blender_models_version_1/Cruise Missile.blend differ diff --git a/blender/blender_models_version_1/Cruiser.blend b/blender/blender_models_version_1/Cruiser.blend new file mode 100644 index 000000000..a7a76fff2 Binary files /dev/null and b/blender/blender_models_version_1/Cruiser.blend differ diff --git a/blender/blender_models_version_1/Destroyer.blend b/blender/blender_models_version_1/Destroyer.blend new file mode 100644 index 000000000..37100e114 Binary files /dev/null and b/blender/blender_models_version_1/Destroyer.blend differ diff --git a/blender/blender_models_version_1/Diplomat.blend b/blender/blender_models_version_1/Diplomat.blend new file mode 100644 index 000000000..aa1aa933b Binary files /dev/null and b/blender/blender_models_version_1/Diplomat.blend differ diff --git a/blender/blender_models_version_1/Dragoons.blend b/blender/blender_models_version_1/Dragoons.blend new file mode 100644 index 000000000..abc3f5714 Binary files /dev/null and b/blender/blender_models_version_1/Dragoons.blend differ diff --git a/blender/blender_models_version_1/Engineers.blend b/blender/blender_models_version_1/Engineers.blend new file mode 100644 index 000000000..4aeebf5a6 Binary files /dev/null and b/blender/blender_models_version_1/Engineers.blend differ diff --git a/blender/blender_models_version_1/Explorer.blend b/blender/blender_models_version_1/Explorer.blend new file mode 100644 index 000000000..25853ea87 Binary files /dev/null and b/blender/blender_models_version_1/Explorer.blend differ diff --git a/blender/blender_models_version_1/Fighter.blend b/blender/blender_models_version_1/Fighter.blend new file mode 100644 index 000000000..cc9e94296 Binary files /dev/null and b/blender/blender_models_version_1/Fighter.blend differ diff --git a/blender/blender_models_version_1/Fish.blend b/blender/blender_models_version_1/Fish.blend new file mode 100644 index 000000000..24cc6473b Binary files /dev/null and b/blender/blender_models_version_1/Fish.blend differ diff --git a/blender/blender_models_version_1/Fortress.blend b/blender/blender_models_version_1/Fortress.blend new file mode 100644 index 000000000..4f3836c07 Binary files /dev/null and b/blender/blender_models_version_1/Fortress.blend differ diff --git a/blender/blender_models_version_1/Freight.blend b/blender/blender_models_version_1/Freight.blend new file mode 100644 index 000000000..5431034cf Binary files /dev/null and b/blender/blender_models_version_1/Freight.blend differ diff --git a/blender/blender_models_version_1/Frigate.blend b/blender/blender_models_version_1/Frigate.blend new file mode 100644 index 000000000..c7e9b3f2a Binary files /dev/null and b/blender/blender_models_version_1/Frigate.blend differ diff --git a/blender/blender_models_version_1/Galleon.blend b/blender/blender_models_version_1/Galleon.blend new file mode 100644 index 000000000..cbfa55b34 Binary files /dev/null and b/blender/blender_models_version_1/Galleon.blend differ diff --git a/blender/blender_models_version_1/Helicopter.blend b/blender/blender_models_version_1/Helicopter.blend new file mode 100644 index 000000000..3e536222d Binary files /dev/null and b/blender/blender_models_version_1/Helicopter.blend differ diff --git a/blender/blender_models_version_1/Horsemen.blend b/blender/blender_models_version_1/Horsemen.blend new file mode 100644 index 000000000..58fe3bce7 Binary files /dev/null and b/blender/blender_models_version_1/Horsemen.blend differ diff --git a/blender/blender_models_version_1/Howitzer.blend b/blender/blender_models_version_1/Howitzer.blend new file mode 100644 index 000000000..b38d42d35 Binary files /dev/null and b/blender/blender_models_version_1/Howitzer.blend differ diff --git a/blender/blender_models_version_1/Hut.blend b/blender/blender_models_version_1/Hut.blend new file mode 100644 index 000000000..394002e2d Binary files /dev/null and b/blender/blender_models_version_1/Hut.blend differ diff --git a/blender/blender_models_version_1/Ironclad.blend b/blender/blender_models_version_1/Ironclad.blend new file mode 100644 index 000000000..5bef6d353 Binary files /dev/null and b/blender/blender_models_version_1/Ironclad.blend differ diff --git a/blender/blender_models_version_1/Knights.blend b/blender/blender_models_version_1/Knights.blend new file mode 100644 index 000000000..4df949987 Binary files /dev/null and b/blender/blender_models_version_1/Knights.blend differ diff --git a/blender/blender_models_version_1/Legion.blend b/blender/blender_models_version_1/Legion.blend new file mode 100644 index 000000000..e76141bfc Binary files /dev/null and b/blender/blender_models_version_1/Legion.blend differ diff --git a/blender/blender_models_version_1/Marines.blend b/blender/blender_models_version_1/Marines.blend new file mode 100644 index 000000000..a77d37244 Binary files /dev/null and b/blender/blender_models_version_1/Marines.blend differ diff --git a/blender/blender_models_version_1/Mech. Inf..blend b/blender/blender_models_version_1/Mech. Inf..blend new file mode 100644 index 000000000..629710779 Binary files /dev/null and b/blender/blender_models_version_1/Mech. Inf..blend differ diff --git a/blender/blender_models_version_1/Migrants.blend b/blender/blender_models_version_1/Migrants.blend new file mode 100644 index 000000000..e9922555a Binary files /dev/null and b/blender/blender_models_version_1/Migrants.blend differ diff --git a/blender/blender_models_version_1/Mine.blend b/blender/blender_models_version_1/Mine.blend new file mode 100644 index 000000000..90cd46a89 Binary files /dev/null and b/blender/blender_models_version_1/Mine.blend differ diff --git a/blender/blender_models_version_1/Musketeers.blend b/blender/blender_models_version_1/Musketeers.blend new file mode 100644 index 000000000..d108ca684 Binary files /dev/null and b/blender/blender_models_version_1/Musketeers.blend differ diff --git a/blender/blender_models_version_1/Nuclear.blend b/blender/blender_models_version_1/Nuclear.blend new file mode 100644 index 000000000..2263f09dc Binary files /dev/null and b/blender/blender_models_version_1/Nuclear.blend differ diff --git a/blender/blender_models_version_1/Paratroopers.blend b/blender/blender_models_version_1/Paratroopers.blend new file mode 100644 index 000000000..6528a044c Binary files /dev/null and b/blender/blender_models_version_1/Paratroopers.blend differ diff --git a/blender/blender_models_version_1/Partisan.blend b/blender/blender_models_version_1/Partisan.blend new file mode 100644 index 000000000..6a20f525f Binary files /dev/null and b/blender/blender_models_version_1/Partisan.blend differ diff --git a/blender/blender_models_version_1/Phalanx.blend b/blender/blender_models_version_1/Phalanx.blend new file mode 100644 index 000000000..eb6637c17 Binary files /dev/null and b/blender/blender_models_version_1/Phalanx.blend differ diff --git a/blender/blender_models_version_1/Pikemen.blend b/blender/blender_models_version_1/Pikemen.blend new file mode 100644 index 000000000..ed74d1f2f Binary files /dev/null and b/blender/blender_models_version_1/Pikemen.blend differ diff --git a/blender/blender_models_version_1/Riflemen.blend b/blender/blender_models_version_1/Riflemen.blend new file mode 100644 index 000000000..628239745 Binary files /dev/null and b/blender/blender_models_version_1/Riflemen.blend differ diff --git a/blender/blender_models_version_1/Ruins.blend b/blender/blender_models_version_1/Ruins.blend new file mode 100644 index 000000000..c02c87308 Binary files /dev/null and b/blender/blender_models_version_1/Ruins.blend differ diff --git a/blender/blender_models_version_1/Settlers.blend b/blender/blender_models_version_1/Settlers.blend new file mode 100644 index 000000000..8d3b21c3f Binary files /dev/null and b/blender/blender_models_version_1/Settlers.blend differ diff --git a/blender/blender_models_version_1/Spy.blend b/blender/blender_models_version_1/Spy.blend new file mode 100644 index 000000000..e87167f46 Binary files /dev/null and b/blender/blender_models_version_1/Spy.blend differ diff --git a/blender/blender_models_version_1/Stealth Bomber.blend b/blender/blender_models_version_1/Stealth Bomber.blend new file mode 100644 index 000000000..089c265a8 Binary files /dev/null and b/blender/blender_models_version_1/Stealth Bomber.blend differ diff --git a/blender/blender_models_version_1/Stealth Fighter.blend b/blender/blender_models_version_1/Stealth Fighter.blend new file mode 100644 index 000000000..32a6492bd Binary files /dev/null and b/blender/blender_models_version_1/Stealth Fighter.blend differ diff --git a/blender/blender_models_version_1/Submarine.blend b/blender/blender_models_version_1/Submarine.blend new file mode 100644 index 000000000..ee41eaafc Binary files /dev/null and b/blender/blender_models_version_1/Submarine.blend differ diff --git a/blender/blender_models_version_1/Transport.blend b/blender/blender_models_version_1/Transport.blend new file mode 100644 index 000000000..df7bab361 Binary files /dev/null and b/blender/blender_models_version_1/Transport.blend differ diff --git a/blender/blender_models_version_1/Trireme.blend b/blender/blender_models_version_1/Trireme.blend new file mode 100644 index 000000000..baae5de2b Binary files /dev/null and b/blender/blender_models_version_1/Trireme.blend differ diff --git a/blender/blender_models_version_1/Warriors.blend b/blender/blender_models_version_1/Warriors.blend new file mode 100644 index 000000000..842ea46a3 Binary files /dev/null and b/blender/blender_models_version_1/Warriors.blend differ diff --git a/blender/blender_models_version_1/Whales.blend b/blender/blender_models_version_1/Whales.blend new file mode 100644 index 000000000..b5db4e514 Binary files /dev/null and b/blender/blender_models_version_1/Whales.blend differ diff --git a/blender/blender_models_version_1/Workers.blend b/blender/blender_models_version_1/Workers.blend new file mode 100644 index 000000000..4331b4bc4 Binary files /dev/null and b/blender/blender_models_version_1/Workers.blend differ diff --git a/blender/blender_models_version_1/blender-settlers-example.png b/blender/blender_models_version_1/blender-settlers-example.png new file mode 100644 index 000000000..507b6c4c6 Binary files /dev/null and b/blender/blender_models_version_1/blender-settlers-example.png differ diff --git a/blender/blender_models_version_1/brick1.png b/blender/blender_models_version_1/brick1.png new file mode 100644 index 000000000..7debbf780 Binary files /dev/null and b/blender/blender_models_version_1/brick1.png differ diff --git a/blender/blender_models_version_1/city_classical_0.blend b/blender/blender_models_version_1/city_classical_0.blend new file mode 100644 index 000000000..f356f29c5 Binary files /dev/null and b/blender/blender_models_version_1/city_classical_0.blend differ diff --git a/blender/blender_models_version_1/city_classical_1.blend b/blender/blender_models_version_1/city_classical_1.blend new file mode 100644 index 000000000..aae17263f Binary files /dev/null and b/blender/blender_models_version_1/city_classical_1.blend differ diff --git a/blender/blender_models_version_1/city_classical_2.blend b/blender/blender_models_version_1/city_classical_2.blend new file mode 100644 index 000000000..ad4f31647 Binary files /dev/null and b/blender/blender_models_version_1/city_classical_2.blend differ diff --git a/blender/blender_models_version_1/city_european_0.blend b/blender/blender_models_version_1/city_european_0.blend new file mode 100644 index 000000000..f356f29c5 Binary files /dev/null and b/blender/blender_models_version_1/city_european_0.blend differ diff --git a/blender/blender_models_version_1/city_european_1.blend b/blender/blender_models_version_1/city_european_1.blend new file mode 100644 index 000000000..aae17263f Binary files /dev/null and b/blender/blender_models_version_1/city_european_1.blend differ diff --git a/blender/blender_models_version_1/city_european_2.blend b/blender/blender_models_version_1/city_european_2.blend new file mode 100644 index 000000000..ad4f31647 Binary files /dev/null and b/blender/blender_models_version_1/city_european_2.blend differ diff --git a/blender/blender_models_version_1/citywalls.blend b/blender/blender_models_version_1/citywalls.blend new file mode 100644 index 000000000..7a994af8c Binary files /dev/null and b/blender/blender_models_version_1/citywalls.blend differ diff --git a/blender/blender_models_version_1/farmland.png b/blender/blender_models_version_1/farmland.png new file mode 100644 index 000000000..c488d4663 Binary files /dev/null and b/blender/blender_models_version_1/farmland.png differ diff --git a/blender/blender_models_version_2/BaseModel.blend b/blender/blender_models_version_2/BaseModel.blend new file mode 100644 index 000000000..b31ca5443 Binary files /dev/null and b/blender/blender_models_version_2/BaseModel.blend differ diff --git a/blender/blender_models_version_2/Buildings/EuropeanCity.blend b/blender/blender_models_version_2/Buildings/EuropeanCity.blend new file mode 100644 index 000000000..c5f7b348b Binary files /dev/null and b/blender/blender_models_version_2/Buildings/EuropeanCity.blend differ diff --git a/blender/blender_models_version_2/Buildings/Export/EuropeanCity_Tier1.glb b/blender/blender_models_version_2/Buildings/Export/EuropeanCity_Tier1.glb new file mode 100644 index 000000000..ec9579621 Binary files /dev/null and b/blender/blender_models_version_2/Buildings/Export/EuropeanCity_Tier1.glb differ diff --git a/blender/blender_models_version_2/Buildings/Export/EuropeanCity_Tier2.glb b/blender/blender_models_version_2/Buildings/Export/EuropeanCity_Tier2.glb new file mode 100644 index 000000000..805ee5cdb Binary files /dev/null and b/blender/blender_models_version_2/Buildings/Export/EuropeanCity_Tier2.glb differ diff --git a/blender/blender_models_version_2/Buildings/Export/EuropeanCity_Tier3.glb b/blender/blender_models_version_2/Buildings/Export/EuropeanCity_Tier3.glb new file mode 100644 index 000000000..989c8498b Binary files /dev/null and b/blender/blender_models_version_2/Buildings/Export/EuropeanCity_Tier3.glb differ diff --git a/blender/blender_models_version_2/Buildings/Export/EuropeanCity_Tier4.glb b/blender/blender_models_version_2/Buildings/Export/EuropeanCity_Tier4.glb new file mode 100644 index 000000000..d5a8227df Binary files /dev/null and b/blender/blender_models_version_2/Buildings/Export/EuropeanCity_Tier4.glb differ diff --git a/blender/blender_models_version_2/Buildings/Export/EuropeanCity_Tier5.glb b/blender/blender_models_version_2/Buildings/Export/EuropeanCity_Tier5.glb new file mode 100644 index 000000000..f1a85c0e8 Binary files /dev/null and b/blender/blender_models_version_2/Buildings/Export/EuropeanCity_Tier5.glb differ diff --git a/blender/blender_models_version_2/Buildings/Export/ModernCity_Tier1.glb b/blender/blender_models_version_2/Buildings/Export/ModernCity_Tier1.glb new file mode 100644 index 000000000..971ee043a Binary files /dev/null and b/blender/blender_models_version_2/Buildings/Export/ModernCity_Tier1.glb differ diff --git a/blender/blender_models_version_2/Buildings/Export/ModernCity_Tier2.glb b/blender/blender_models_version_2/Buildings/Export/ModernCity_Tier2.glb new file mode 100644 index 000000000..f6dec0dce Binary files /dev/null and b/blender/blender_models_version_2/Buildings/Export/ModernCity_Tier2.glb differ diff --git a/blender/blender_models_version_2/Buildings/Export/ModernCity_Tier3.glb b/blender/blender_models_version_2/Buildings/Export/ModernCity_Tier3.glb new file mode 100644 index 000000000..b38cd9dd4 Binary files /dev/null and b/blender/blender_models_version_2/Buildings/Export/ModernCity_Tier3.glb differ diff --git a/blender/blender_models_version_2/Buildings/Export/ModernCity_Tier4.glb b/blender/blender_models_version_2/Buildings/Export/ModernCity_Tier4.glb new file mode 100644 index 000000000..7059bbc8e Binary files /dev/null and b/blender/blender_models_version_2/Buildings/Export/ModernCity_Tier4.glb differ diff --git a/blender/blender_models_version_2/Buildings/Export/ModernCity_Tier5.glb b/blender/blender_models_version_2/Buildings/Export/ModernCity_Tier5.glb new file mode 100644 index 000000000..cb384c18e Binary files /dev/null and b/blender/blender_models_version_2/Buildings/Export/ModernCity_Tier5.glb differ diff --git a/blender/blender_models_version_2/Buildings/Export/ModernCity_Tier5_pbr.glb b/blender/blender_models_version_2/Buildings/Export/ModernCity_Tier5_pbr.glb new file mode 100644 index 000000000..af1ee9a63 Binary files /dev/null and b/blender/blender_models_version_2/Buildings/Export/ModernCity_Tier5_pbr.glb differ diff --git a/blender/blender_models_version_2/Buildings/ModernCity.blend b/blender/blender_models_version_2/Buildings/ModernCity.blend new file mode 100644 index 000000000..2f9b26d6a Binary files /dev/null and b/blender/blender_models_version_2/Buildings/ModernCity.blend differ diff --git a/blender/blender_models_version_2/Buildings/Renders/CityPlates.psd b/blender/blender_models_version_2/Buildings/Renders/CityPlates.psd new file mode 100644 index 000000000..10f5890e3 Binary files /dev/null and b/blender/blender_models_version_2/Buildings/Renders/CityPlates.psd differ diff --git a/blender/blender_models_version_2/Buildings/Renders/EuropeanCity.jpg b/blender/blender_models_version_2/Buildings/Renders/EuropeanCity.jpg new file mode 100644 index 000000000..2100c83ab Binary files /dev/null and b/blender/blender_models_version_2/Buildings/Renders/EuropeanCity.jpg differ diff --git a/blender/blender_models_version_2/Buildings/Renders/EuropeanCity.png b/blender/blender_models_version_2/Buildings/Renders/EuropeanCity.png new file mode 100644 index 000000000..01eca0c1a Binary files /dev/null and b/blender/blender_models_version_2/Buildings/Renders/EuropeanCity.png differ diff --git a/blender/blender_models_version_2/Buildings/Renders/EuropeanCity1.png b/blender/blender_models_version_2/Buildings/Renders/EuropeanCity1.png new file mode 100644 index 000000000..c7d0d4397 Binary files /dev/null and b/blender/blender_models_version_2/Buildings/Renders/EuropeanCity1.png differ diff --git a/blender/blender_models_version_2/Buildings/Renders/ModernCity.jpg b/blender/blender_models_version_2/Buildings/Renders/ModernCity.jpg new file mode 100644 index 000000000..95e570149 Binary files /dev/null and b/blender/blender_models_version_2/Buildings/Renders/ModernCity.jpg differ diff --git a/blender/blender_models_version_2/Buildings/Renders/ModernCity.png b/blender/blender_models_version_2/Buildings/Renders/ModernCity.png new file mode 100644 index 000000000..0f1977a79 Binary files /dev/null and b/blender/blender_models_version_2/Buildings/Renders/ModernCity.png differ diff --git a/blender/blender_models_version_2/Buildings/Renders/ModernCity1.png b/blender/blender_models_version_2/Buildings/Renders/ModernCity1.png new file mode 100644 index 000000000..c9091e03c Binary files /dev/null and b/blender/blender_models_version_2/Buildings/Renders/ModernCity1.png differ diff --git a/blender/blender_models_version_2/Buildings/Renders/ModernCity2.png b/blender/blender_models_version_2/Buildings/Renders/ModernCity2.png new file mode 100644 index 000000000..2511b225b Binary files /dev/null and b/blender/blender_models_version_2/Buildings/Renders/ModernCity2.png differ diff --git a/blender/blender_models_version_2/Buildings/Textures/CityTextures.psd b/blender/blender_models_version_2/Buildings/Textures/CityTextures.psd new file mode 100644 index 000000000..f04e23670 Binary files /dev/null and b/blender/blender_models_version_2/Buildings/Textures/CityTextures.psd differ diff --git a/blender/blender_models_version_2/Buildings/Textures/EuropeanCity.png b/blender/blender_models_version_2/Buildings/Textures/EuropeanCity.png new file mode 100644 index 000000000..2feea08f9 Binary files /dev/null and b/blender/blender_models_version_2/Buildings/Textures/EuropeanCity.png differ diff --git a/blender/blender_models_version_2/Buildings/Textures/ModernCity.png b/blender/blender_models_version_2/Buildings/Textures/ModernCity.png new file mode 100644 index 000000000..cb626ab64 Binary files /dev/null and b/blender/blender_models_version_2/Buildings/Textures/ModernCity.png differ diff --git a/blender/blender_models_version_2/Characters/Explorer.blend b/blender/blender_models_version_2/Characters/Explorer.blend new file mode 100644 index 000000000..48970e280 Binary files /dev/null and b/blender/blender_models_version_2/Characters/Explorer.blend differ diff --git a/blender/blender_models_version_2/Characters/Export/Explorer.glb b/blender/blender_models_version_2/Characters/Export/Explorer.glb new file mode 100644 index 000000000..57ea517ea Binary files /dev/null and b/blender/blender_models_version_2/Characters/Export/Explorer.glb differ diff --git a/blender/blender_models_version_2/Characters/Export/Settlers.glb b/blender/blender_models_version_2/Characters/Export/Settlers.glb new file mode 100644 index 000000000..1cc5019e9 Binary files /dev/null and b/blender/blender_models_version_2/Characters/Export/Settlers.glb differ diff --git a/blender/blender_models_version_2/Characters/Renders/Explorer.png b/blender/blender_models_version_2/Characters/Renders/Explorer.png new file mode 100644 index 000000000..7808a8e93 Binary files /dev/null and b/blender/blender_models_version_2/Characters/Renders/Explorer.png differ diff --git a/blender/blender_models_version_2/Characters/Renders/Settler.png b/blender/blender_models_version_2/Characters/Renders/Settler.png new file mode 100644 index 000000000..027386d39 Binary files /dev/null and b/blender/blender_models_version_2/Characters/Renders/Settler.png differ diff --git a/blender/blender_models_version_2/Characters/Settler.blend b/blender/blender_models_version_2/Characters/Settler.blend new file mode 100644 index 000000000..16904762d Binary files /dev/null and b/blender/blender_models_version_2/Characters/Settler.blend differ diff --git a/blender/blender_models_version_2/Characters/Textures/Base.psd b/blender/blender_models_version_2/Characters/Textures/Base.psd new file mode 100644 index 000000000..2f5ace68f Binary files /dev/null and b/blender/blender_models_version_2/Characters/Textures/Base.psd differ diff --git a/blender/blender_models_version_2/Characters/Textures/BaseTexture.png b/blender/blender_models_version_2/Characters/Textures/BaseTexture.png new file mode 100644 index 000000000..e43f7c826 Binary files /dev/null and b/blender/blender_models_version_2/Characters/Textures/BaseTexture.png differ diff --git a/blender/blender_models_version_2/Characters/Textures/Explorer.png b/blender/blender_models_version_2/Characters/Textures/Explorer.png new file mode 100644 index 000000000..92be637a3 Binary files /dev/null and b/blender/blender_models_version_2/Characters/Textures/Explorer.png differ diff --git a/blender/blender_models_version_2/Characters/Textures/HorseBase.psd b/blender/blender_models_version_2/Characters/Textures/HorseBase.psd new file mode 100644 index 000000000..da6c985da Binary files /dev/null and b/blender/blender_models_version_2/Characters/Textures/HorseBase.psd differ diff --git a/blender/blender_models_version_2/Characters/Textures/Settler.png b/blender/blender_models_version_2/Characters/Textures/Settler.png new file mode 100644 index 000000000..0478a9691 Binary files /dev/null and b/blender/blender_models_version_2/Characters/Textures/Settler.png differ diff --git a/blender/blender_models_version_2/Characters/Textures/SettlerCart.png b/blender/blender_models_version_2/Characters/Textures/SettlerCart.png new file mode 100644 index 000000000..d41e47a0e Binary files /dev/null and b/blender/blender_models_version_2/Characters/Textures/SettlerCart.png differ diff --git a/blender/blender_models_version_2/CityWallBig.glb b/blender/blender_models_version_2/CityWallBig.glb new file mode 100644 index 000000000..9609ef114 Binary files /dev/null and b/blender/blender_models_version_2/CityWallBig.glb differ diff --git a/blender/blender_models_version_2/CityWallSmall.glb b/blender/blender_models_version_2/CityWallSmall.glb new file mode 100644 index 000000000..0df539113 Binary files /dev/null and b/blender/blender_models_version_2/CityWallSmall.glb differ diff --git a/blender/blender_models_version_2/EuropeanCity_Tier1.glb b/blender/blender_models_version_2/EuropeanCity_Tier1.glb new file mode 100644 index 000000000..55a5deb5e Binary files /dev/null and b/blender/blender_models_version_2/EuropeanCity_Tier1.glb differ diff --git a/blender/blender_models_version_2/EuropeanCity_Tier2.glb b/blender/blender_models_version_2/EuropeanCity_Tier2.glb new file mode 100644 index 000000000..288afc673 Binary files /dev/null and b/blender/blender_models_version_2/EuropeanCity_Tier2.glb differ diff --git a/blender/blender_models_version_2/EuropeanCity_Tier3.glb b/blender/blender_models_version_2/EuropeanCity_Tier3.glb new file mode 100644 index 000000000..3a900677f Binary files /dev/null and b/blender/blender_models_version_2/EuropeanCity_Tier3.glb differ diff --git a/blender/blender_models_version_2/EuropeanCity_Tier4.glb b/blender/blender_models_version_2/EuropeanCity_Tier4.glb new file mode 100644 index 000000000..56eb5871d Binary files /dev/null and b/blender/blender_models_version_2/EuropeanCity_Tier4.glb differ diff --git a/blender/blender_models_version_2/EuropeanCity_Tier5.glb b/blender/blender_models_version_2/EuropeanCity_Tier5.glb new file mode 100644 index 000000000..50a1e0b56 Binary files /dev/null and b/blender/blender_models_version_2/EuropeanCity_Tier5.glb differ diff --git a/blender/blender_models_version_2/Explorer.glb b/blender/blender_models_version_2/Explorer.glb new file mode 100644 index 000000000..57ea517ea Binary files /dev/null and b/blender/blender_models_version_2/Explorer.glb differ diff --git a/blender/blender_models_version_2/Hut.glb b/blender/blender_models_version_2/Hut.glb new file mode 100644 index 000000000..4d3bf1dee Binary files /dev/null and b/blender/blender_models_version_2/Hut.glb differ diff --git a/blender/blender_models_version_2/ModernCity_Tier1.glb b/blender/blender_models_version_2/ModernCity_Tier1.glb new file mode 100644 index 000000000..971ee043a Binary files /dev/null and b/blender/blender_models_version_2/ModernCity_Tier1.glb differ diff --git a/blender/blender_models_version_2/ModernCity_Tier2.glb b/blender/blender_models_version_2/ModernCity_Tier2.glb new file mode 100644 index 000000000..f6dec0dce Binary files /dev/null and b/blender/blender_models_version_2/ModernCity_Tier2.glb differ diff --git a/blender/blender_models_version_2/ModernCity_Tier3.glb b/blender/blender_models_version_2/ModernCity_Tier3.glb new file mode 100644 index 000000000..b38cd9dd4 Binary files /dev/null and b/blender/blender_models_version_2/ModernCity_Tier3.glb differ diff --git a/blender/blender_models_version_2/ModernCity_Tier4.glb b/blender/blender_models_version_2/ModernCity_Tier4.glb new file mode 100644 index 000000000..7059bbc8e Binary files /dev/null and b/blender/blender_models_version_2/ModernCity_Tier4.glb differ diff --git a/blender/blender_models_version_2/ModernCity_Tier5.glb b/blender/blender_models_version_2/ModernCity_Tier5.glb new file mode 100644 index 000000000..cb384c18e Binary files /dev/null and b/blender/blender_models_version_2/ModernCity_Tier5.glb differ diff --git a/blender/blender_models_version_2/ModernCity_Tier5_pbr.glb b/blender/blender_models_version_2/ModernCity_Tier5_pbr.glb new file mode 100644 index 000000000..af1ee9a63 Binary files /dev/null and b/blender/blender_models_version_2/ModernCity_Tier5_pbr.glb differ diff --git a/blender/blender_models_version_2/Settler.glb b/blender/blender_models_version_2/Settler.glb new file mode 100644 index 000000000..40b8b828a Binary files /dev/null and b/blender/blender_models_version_2/Settler.glb differ diff --git a/blender/blender_models_version_2/Worker.glb b/blender/blender_models_version_2/Worker.glb new file mode 100644 index 000000000..1513af6e4 Binary files /dev/null and b/blender/blender_models_version_2/Worker.glb differ diff --git a/blender/blender_models_version_2/Worrior.glb b/blender/blender_models_version_2/Worrior.glb new file mode 100644 index 000000000..ab48c4ee9 Binary files /dev/null and b/blender/blender_models_version_2/Worrior.glb differ diff --git a/fcw-2021.png b/fcw-2021.png deleted file mode 100644 index 65df9c6f3..000000000 Binary files a/fcw-2021.png and /dev/null differ diff --git a/freeciv-proxy/civcom.py b/freeciv-proxy/civcom.py index bf5600236..d7f5452df 100755 --- a/freeciv-proxy/civcom.py +++ b/freeciv-proxy/civcom.py @@ -59,6 +59,7 @@ def run(self): self.send_error_to_client( "Proxy unable to connect to civserver. Error: %s" % (reason)) + self.close_connection() return # send initial login packet to civserver @@ -126,8 +127,13 @@ def close_connection(self): "Server connection closed. Removing civcom thread for " + self.username) - if (hasattr(self.civwebserver, "civcoms") and self.key in list(self.civwebserver.civcoms.keys())): - del self.civwebserver.civcoms[self.key] + # Flush buffers + self.send_packets_to_client() + self.send_packets_to_civserver() + + if self.civwebserver is not None: + conn = self.civwebserver + conn.io_loop.add_callback(lambda: conn.close()) if (self.socket is not None): self.socket.close() @@ -154,7 +160,8 @@ def send_packets_to_client(self): packet = self.get_client_result_string() if (packet is not None and self.civwebserver is not None): # Calls the write_message callback on the next Tornado I/O loop iteration (thread safely). - self.civwebserver.io_loop.add_callback(lambda: self.civwebserver.write_message(packet)) + conn = self.civwebserver + conn.io_loop.add_callback(lambda: conn.write_message(packet)) def get_client_result_string(self): result = "" diff --git a/freeciv-proxy/freeciv-proxy.py b/freeciv-proxy/freeciv-proxy.py index a815f6b58..847d9e9b9 100755 --- a/freeciv-proxy/freeciv-proxy.py +++ b/freeciv-proxy/freeciv-proxy.py @@ -159,17 +159,38 @@ def get_game_auth_method(self, cursor): return "password" def check_user_password(self, cursor, username, password): - query = ("select secure_hashed_password, activated from auth where lower(username)=lower(%(usr)s)") - cursor.execute(query, {'usr': username, 'pwd': password}) + # Encryption method transition period code. Clear out first query and + # compat_encrypt use after the transition period. + query = ("select digest_pw from auth where lower(username) = lower(%(usr)s)") + cursor.execute(query, {'usr': username}) + result = cursor.fetchall() + if len(result) == 0: + return True + compat_encrypt = not result[0][0] + if compat_encrypt: + query = ("select secure_hashed_password, CAST(ENCRYPT(%(pwd)s, secure_hashed_password) AS CHAR), activated, id from auth where lower(username)=lower(%(usr)s)") + cursor.execute(query, {'usr': username, 'pwd': password}) + else: + query = ("select secure_hashed_password, activated from auth where lower(username)=lower(%(usr)s)") + cursor.execute(query, {'usr': username}) result = cursor.fetchall() if len(result) == 0: # Unreserved user, no password needed return True - for secure_shashed_password, active in result: - if (active == 0): return False - if secure_shashed_password == hashlib.sha256(password.encode('utf-8')).hexdigest(): return True + if compat_encrypt: + for db_pass, encrypted_pass, active, uid in result: + if (active == 0): return False + if db_pass == encrypted_pass: + new_hash = hashlib.sha256(password.encode('utf-8')).hexdigest() + query = ("update auth set secure_hashed_password = %(pwd)s, digest_pw = TRUE where id = %(uid)s;") + cursor.execute(query, {'pwd': new_hash, 'uid': uid}) + return True + else: + for secure_shashed_password, active in result: + if (active == 0): return False + if secure_shashed_password == hashlib.sha256(password.encode('utf-8')).hexdigest(): return True return False diff --git a/freeciv-web/build-js.sh b/freeciv-web/build-js.sh index fd73a354a..43e7d53ef 100755 --- a/freeciv-web/build-js.sh +++ b/freeciv-web/build-js.sh @@ -6,12 +6,14 @@ FCW_DEST=/var/lib/tomcat8/webapps/freeciv-web mvn compile && \ echo "Copying target/javascript/webclient.* to ${FCW_DEST}/javascript" && \ cp target/freeciv-web/javascript/webclient.* "${FCW_DEST}"/javascript/ && \ -echo target/freeciv-web/javascript/webgl/libs/webgl-client* "${FCW_DEST}"/javascript/webgl/libs && \ - cp target/freeciv-web/javascript/webgl/libs/webgl-client* "${FCW_DEST}"/javascript/webgl/libs/ +echo target/freeciv-web/javascript/webgl-client* "${FCW_DEST}"/javascript/ && \ + cp target/freeciv-web/javascript/webgl-client* "${FCW_DEST}"/javascript/ # update timestamp to clear browser cache. sed -i.bak -e "s/ts=\"/ts=\"1/" -e "s/\?ts=/\?ts=1/" "${FCW_DEST}"/webclient/index.jsp +# 3d webgl shaders +cp src/main/webapp/javascript/webgl/shaders/*.* "${FCW_DEST}"/javascript/webgl/shaders/ # let user know when it's finished echo $'\a' diff --git a/freeciv-web/build-rules.sh b/freeciv-web/build-rules.sh index c5715688b..90202b390 100755 --- a/freeciv-web/build-rules.sh +++ b/freeciv-web/build-rules.sh @@ -1,7 +1,7 @@ #!/bin/bash # builds Freeciv-web, copies the war file to Tomcat and builds the selected rulesets. -RULESETS=(civ2civ3 classic multiplayer mpplus mp2 ag mp2-brava experimental mp2-caravel mp2-dragoon) +RULESETS=(mp2-dragoon mp2-caravel mp2-brava mp2-ag mpplus classic civ2civ3 multiplayer civ1 civ2 mp2 sandbox webperimental experimental alien) TOPDIR="$( cd ../"$( dirname "${BASH_SOURCE[0]}" )" > /dev/null && pwd )" printf "\n**********************************************************************\n" diff --git a/freeciv-web/clean-rules.sh b/freeciv-web/clean-rules.sh index d57d6240e..b7100adfa 100644 --- a/freeciv-web/clean-rules.sh +++ b/freeciv-web/clean-rules.sh @@ -1,7 +1,7 @@ #!/bin/bash # builds Freeciv-web, copies the war file to Tomcat and builds the selected rulesets. -RULESETS=(classic civ2civ3 maptest multiplayer mpplus mp2sandbox mp2 ag ag2 mp2-brava mp2-caravel mp2-dragoon) +RULESETS=(classic civ2civ3 maptest multiplayer mpplus mp2sandbox mp2 ag mp2-ag mp2-brava mp2-caravel mp2-dragoon) TOPDIR="$( cd ../"$( dirname "${BASH_SOURCE[0]}" )" > /dev/null && pwd )" printf "\n./clean-rules.sh: DEPLOYED SERVER VERSION. Use ./vclean-rules.sh for vagrant installations.\n" @@ -16,6 +16,7 @@ printf "************************************************************************ printf "\nOverwriting auto-generated manual with release-version: MP2-Avant Garde" cp ~/freeciv-web/freeciv-web/src/derived/webapp/man/ag7.bak.html ~/freeciv-web/freeciv-web/src/derived/webapp/man/ag7.html + cp ~/freeciv-web/freeciv-web/src/derived/webapp/man/ag7.bak.html ~/freeciv-web/freeciv-web/src/derived/webapp/man/mp2-ag7.html printf "\nOverwriting auto-generated manual with release-version: MP2-Brava" cp ~/freeciv-web/freeciv-web/src/derived/webapp/man/mp2-brava7.bak.html ~/freeciv-web/freeciv-web/src/derived/webapp/man/mp2-brava7.html printf "\nOverwriting auto-generated manual with release-version: MP2-Caravel" diff --git a/freeciv-web/coredumpon.sh b/freeciv-web/coredumpon.sh new file mode 100644 index 000000000..9d2bd08fe --- /dev/null +++ b/freeciv-web/coredumpon.sh @@ -0,0 +1,4 @@ +#!/bin/bash +# builds javascript files Freeciv-web and copies the resulting file to tomcat. + +ulimit -c unlimited diff --git a/freeciv-web/pom.xml b/freeciv-web/pom.xml index d4bd6c582..88111c518 100644 --- a/freeciv-web/pom.xml +++ b/freeciv-web/pom.xml @@ -374,6 +374,7 @@ Rerun the sync-js-hand.js script. libs/*.js 2dcanvas/*.js 2dcanvas/tilespec-constants.js + webgl/*.js webclient.js @@ -387,6 +388,24 @@ Rerun the sync-js-hand.js script. minify + + webgl-minify + + ${project.build.directory}/${project.build.finalName} + javascript/webgl/libs + javascript + webgl-client.js + + *.js + + + three.min.js + + + + minify + + index-minify diff --git a/freeciv-web/remake-nodebug.sh b/freeciv-web/remake-nodebug.sh new file mode 100644 index 000000000..b8eeeac17 --- /dev/null +++ b/freeciv-web/remake-nodebug.sh @@ -0,0 +1,12 @@ +#!/bin/bash +# Does EVERY step to re-build C-server and restart freeciv-web. + +printf "\n**********************************************************************\n" +printf "./remake.sh: DEPLOYED SERVER version. Re-builds server executables.\n" +printf "Important: Use ./vremake.sh for vagrant installations.\n" +printf "**********************************************************************\n" + +cd ~/freeciv-web/freeciv && ./prepare_freeciv.sh && cd build && make install && cd ../../scripts && ./stop-freeciv-web.sh && ./start-freeciv-web.sh + +# let user know when it's finished +echo $'\a' diff --git a/freeciv-web/remake.sh b/freeciv-web/remake.sh index b8eeeac17..80fceee65 100644 --- a/freeciv-web/remake.sh +++ b/freeciv-web/remake.sh @@ -6,6 +6,8 @@ printf "./remake.sh: DEPLOYED SERVER version. Re-builds server executables.\n" printf "Important: Use ./vremake.sh for vagrant installations.\n" printf "**********************************************************************\n" +CFLAGS="-g" + cd ~/freeciv-web/freeciv && ./prepare_freeciv.sh && cd build && make install && cd ../../scripts && ./stop-freeciv-web.sh && ./start-freeciv-web.sh # let user know when it's finished diff --git a/freeciv-web/scenario-build.sh b/freeciv-web/scenario-build.sh index 0128f271a..a47348d17 100644 --- a/freeciv-web/scenario-build.sh +++ b/freeciv-web/scenario-build.sh @@ -21,7 +21,7 @@ printf "\n********************************************************************** printf "This refreshes only the SCENARIOS marked for rebuild inside this script.\n" printf "****************************************************************************\n" -SCENARIOS=(europe.sav europe-new-positions.sav tutorial.sav) +SCENARIOS=(europe.sav europe-new-positions.sav tutorial.sav riverland.sav) TOPDIR="$( cd ../"$( dirname "${BASH_SOURCE[0]}" )" > /dev/null && pwd )" printf "\nUpdating scenarios...\n" diff --git a/freeciv-web/src/derived/webapp/images/flags/abkhazia-web.png b/freeciv-web/src/derived/webapp/images/flags/abkhazia-web.png index 29d360334..c93a68850 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/abkhazia-web.png and b/freeciv-web/src/derived/webapp/images/flags/abkhazia-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/aborigines-web.png b/freeciv-web/src/derived/webapp/images/flags/aborigines-web.png index d97fda348..905f8cd91 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/aborigines-web.png and b/freeciv-web/src/derived/webapp/images/flags/aborigines-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/africa-web.png b/freeciv-web/src/derived/webapp/images/flags/africa-web.png index 301ef7cd4..81a3644b4 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/africa-web.png and b/freeciv-web/src/derived/webapp/images/flags/africa-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/anishinaabe-web.png b/freeciv-web/src/derived/webapp/images/flags/anishinaabe-web.png index d4fd1912f..169786259 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/anishinaabe-web.png and b/freeciv-web/src/derived/webapp/images/flags/anishinaabe-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/antarctica-web.png b/freeciv-web/src/derived/webapp/images/flags/antarctica-web.png index 731efa061..665f2fc3d 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/antarctica-web.png and b/freeciv-web/src/derived/webapp/images/flags/antarctica-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/argentina-web.png b/freeciv-web/src/derived/webapp/images/flags/argentina-web.png index 302827c34..ac2ab7f10 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/argentina-web.png and b/freeciv-web/src/derived/webapp/images/flags/argentina-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/armenia-web.png b/freeciv-web/src/derived/webapp/images/flags/armenia-web.png index fa5fefd64..54be8035d 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/armenia-web.png and b/freeciv-web/src/derived/webapp/images/flags/armenia-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/assam-web.png b/freeciv-web/src/derived/webapp/images/flags/assam-web.png index 0c399c3e3..ba1b70e08 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/assam-web.png and b/freeciv-web/src/derived/webapp/images/flags/assam-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/assyria-web.png b/freeciv-web/src/derived/webapp/images/flags/assyria-web.png index 305dcbccb..fc89d947d 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/assyria-web.png and b/freeciv-web/src/derived/webapp/images/flags/assyria-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/australia-web.png b/freeciv-web/src/derived/webapp/images/flags/australia-web.png index 87e9dea64..5ff9d474c 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/australia-web.png and b/freeciv-web/src/derived/webapp/images/flags/australia-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/azerbaijan-web.png b/freeciv-web/src/derived/webapp/images/flags/azerbaijan-web.png index cfc747b35..03177b158 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/azerbaijan-web.png and b/freeciv-web/src/derived/webapp/images/flags/azerbaijan-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/babylon-web.png b/freeciv-web/src/derived/webapp/images/flags/babylon-web.png index 8740b921c..026f6156d 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/babylon-web.png and b/freeciv-web/src/derived/webapp/images/flags/babylon-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/bahamas-web.png b/freeciv-web/src/derived/webapp/images/flags/bahamas-web.png index 0d80055ef..95805a4d0 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/bahamas-web.png and b/freeciv-web/src/derived/webapp/images/flags/bahamas-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/bangladesh-web.png b/freeciv-web/src/derived/webapp/images/flags/bangladesh-web.png index 6a474b210..91b60bba9 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/bangladesh-web.png and b/freeciv-web/src/derived/webapp/images/flags/bangladesh-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/barbados-web.png b/freeciv-web/src/derived/webapp/images/flags/barbados-web.png index 5ecb86575..eb4333949 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/barbados-web.png and b/freeciv-web/src/derived/webapp/images/flags/barbados-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/belarus-web.png b/freeciv-web/src/derived/webapp/images/flags/belarus-web.png index f96707d34..971ce1551 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/belarus-web.png and b/freeciv-web/src/derived/webapp/images/flags/belarus-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/boii-web.png b/freeciv-web/src/derived/webapp/images/flags/boii-web.png index 299ee94bb..d97432f84 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/boii-web.png and b/freeciv-web/src/derived/webapp/images/flags/boii-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/bosnia-web.png b/freeciv-web/src/derived/webapp/images/flags/bosnia-web.png index 65a8a7f6c..a2c2c8821 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/bosnia-web.png and b/freeciv-web/src/derived/webapp/images/flags/bosnia-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/brasil-web.png b/freeciv-web/src/derived/webapp/images/flags/brasil-web.png index 9e7733894..0728dbb3b 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/brasil-web.png and b/freeciv-web/src/derived/webapp/images/flags/brasil-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/britannia-web.png b/freeciv-web/src/derived/webapp/images/flags/britannia-web.png index e970fc4dd..96021f8bc 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/britannia-web.png and b/freeciv-web/src/derived/webapp/images/flags/britannia-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/brunei-web.png b/freeciv-web/src/derived/webapp/images/flags/brunei-web.png index bc1342d85..94f2adc4b 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/brunei-web.png and b/freeciv-web/src/derived/webapp/images/flags/brunei-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/canada-web.png b/freeciv-web/src/derived/webapp/images/flags/canada-web.png index 6da64c2f0..7c0383873 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/canada-web.png and b/freeciv-web/src/derived/webapp/images/flags/canada-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/carantanian-web.png b/freeciv-web/src/derived/webapp/images/flags/carantanian-web.png index cf3a51897..fa6609871 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/carantanian-web.png and b/freeciv-web/src/derived/webapp/images/flags/carantanian-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/corsica-web.png b/freeciv-web/src/derived/webapp/images/flags/corsica-web.png index 8a891d307..d39ca8986 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/corsica-web.png and b/freeciv-web/src/derived/webapp/images/flags/corsica-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/crimean_tatar-web.png b/freeciv-web/src/derived/webapp/images/flags/crimean_tatar-web.png index a43b4a825..03ccda73c 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/crimean_tatar-web.png and b/freeciv-web/src/derived/webapp/images/flags/crimean_tatar-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/croatia-web.png b/freeciv-web/src/derived/webapp/images/flags/croatia-web.png index c3e07bd4a..9dd43b2ba 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/croatia-web.png and b/freeciv-web/src/derived/webapp/images/flags/croatia-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/cuba-web.png b/freeciv-web/src/derived/webapp/images/flags/cuba-web.png index 1446f357d..e48f2ff2e 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/cuba-web.png and b/freeciv-web/src/derived/webapp/images/flags/cuba-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/czech-web.png b/freeciv-web/src/derived/webapp/images/flags/czech-web.png index 236fe6f65..5843cfdd9 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/czech-web.png and b/freeciv-web/src/derived/webapp/images/flags/czech-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/czechoslovakia-web.png b/freeciv-web/src/derived/webapp/images/flags/czechoslovakia-web.png index 339fef3ec..c68aab905 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/czechoslovakia-web.png and b/freeciv-web/src/derived/webapp/images/flags/czechoslovakia-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/dacian-web.png b/freeciv-web/src/derived/webapp/images/flags/dacian-web.png index 6b5412d8e..d8112afd8 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/dacian-web.png and b/freeciv-web/src/derived/webapp/images/flags/dacian-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/dominica-web.png b/freeciv-web/src/derived/webapp/images/flags/dominica-web.png index 08c6f19c9..8e2bb22db 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/dominica-web.png and b/freeciv-web/src/derived/webapp/images/flags/dominica-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/dryad-web.png b/freeciv-web/src/derived/webapp/images/flags/dryad-web.png index 830525119..d9d8d86fd 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/dryad-web.png and b/freeciv-web/src/derived/webapp/images/flags/dryad-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/egypt_ancient-web.png b/freeciv-web/src/derived/webapp/images/flags/egypt_ancient-web.png index e1a62a62d..074ef2db6 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/egypt_ancient-web.png and b/freeciv-web/src/derived/webapp/images/flags/egypt_ancient-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/eritrea-web.png b/freeciv-web/src/derived/webapp/images/flags/eritrea-web.png index 3bc68b71a..9f524c0e0 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/eritrea-web.png and b/freeciv-web/src/derived/webapp/images/flags/eritrea-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/ethiopia-web.png b/freeciv-web/src/derived/webapp/images/flags/ethiopia-web.png index a7001cd32..086514be8 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/ethiopia-web.png and b/freeciv-web/src/derived/webapp/images/flags/ethiopia-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/etruscan-web.png b/freeciv-web/src/derived/webapp/images/flags/etruscan-web.png index 29cb25872..e306cdb39 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/etruscan-web.png and b/freeciv-web/src/derived/webapp/images/flags/etruscan-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/europe-web.png b/freeciv-web/src/derived/webapp/images/flags/europe-web.png index 4b3391e40..9043e0741 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/europe-web.png and b/freeciv-web/src/derived/webapp/images/flags/europe-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/fiji-web.png b/freeciv-web/src/derived/webapp/images/flags/fiji-web.png index 3df2b5049..7377ede05 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/fiji-web.png and b/freeciv-web/src/derived/webapp/images/flags/fiji-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/finland-web.png b/freeciv-web/src/derived/webapp/images/flags/finland-web.png index 1a0abff80..3a17c425e 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/finland-web.png and b/freeciv-web/src/derived/webapp/images/flags/finland-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/florence-web.png b/freeciv-web/src/derived/webapp/images/flags/florence-web.png index 35ff0c2d3..0179ba695 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/florence-web.png and b/freeciv-web/src/derived/webapp/images/flags/florence-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/france-web.png b/freeciv-web/src/derived/webapp/images/flags/france-web.png index b42b43f92..41e19c2e9 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/france-web.png and b/freeciv-web/src/derived/webapp/images/flags/france-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/gaul-web.png b/freeciv-web/src/derived/webapp/images/flags/gaul-web.png index 2daf3f9e3..35ae8f62a 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/gaul-web.png and b/freeciv-web/src/derived/webapp/images/flags/gaul-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/germanic-web.png b/freeciv-web/src/derived/webapp/images/flags/germanic-web.png index 8fabcdf03..5d2bad500 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/germanic-web.png and b/freeciv-web/src/derived/webapp/images/flags/germanic-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/germany-web.png b/freeciv-web/src/derived/webapp/images/flags/germany-web.png index e0b777025..f8572d828 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/germany-web.png and b/freeciv-web/src/derived/webapp/images/flags/germany-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/ghaznavid-web.png b/freeciv-web/src/derived/webapp/images/flags/ghaznavid-web.png index 8f4e57aa4..d2344a595 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/ghaznavid-web.png and b/freeciv-web/src/derived/webapp/images/flags/ghaznavid-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/gokturk-web.png b/freeciv-web/src/derived/webapp/images/flags/gokturk-web.png index 3a258994c..9582b2565 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/gokturk-web.png and b/freeciv-web/src/derived/webapp/images/flags/gokturk-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/golden_horde-web.png b/freeciv-web/src/derived/webapp/images/flags/golden_horde-web.png index e3c992ee0..4d4998a33 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/golden_horde-web.png and b/freeciv-web/src/derived/webapp/images/flags/golden_horde-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/guatemala-web.png b/freeciv-web/src/derived/webapp/images/flags/guatemala-web.png index 1a5e81b32..d29b15c8a 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/guatemala-web.png and b/freeciv-web/src/derived/webapp/images/flags/guatemala-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/guinea-bissau-web.png b/freeciv-web/src/derived/webapp/images/flags/guinea-bissau-web.png index 48474aa0f..7d96bb49f 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/guinea-bissau-web.png and b/freeciv-web/src/derived/webapp/images/flags/guinea-bissau-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/hawaii-web.png b/freeciv-web/src/derived/webapp/images/flags/hawaii-web.png index f52209132..e07082e90 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/hawaii-web.png and b/freeciv-web/src/derived/webapp/images/flags/hawaii-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/honduras-web.png b/freeciv-web/src/derived/webapp/images/flags/honduras-web.png index d4558cee2..3a1ca001b 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/honduras-web.png and b/freeciv-web/src/derived/webapp/images/flags/honduras-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/hungary-web.png b/freeciv-web/src/derived/webapp/images/flags/hungary-web.png index a379b7f95..31df9b512 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/hungary-web.png and b/freeciv-web/src/derived/webapp/images/flags/hungary-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/iceland-web.png b/freeciv-web/src/derived/webapp/images/flags/iceland-web.png index ecc940f4e..cf682050d 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/iceland-web.png and b/freeciv-web/src/derived/webapp/images/flags/iceland-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/illyria-web.png b/freeciv-web/src/derived/webapp/images/flags/illyria-web.png index e04410dc0..4337c32bb 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/illyria-web.png and b/freeciv-web/src/derived/webapp/images/flags/illyria-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/indoeuropean-web.png b/freeciv-web/src/derived/webapp/images/flags/indoeuropean-web.png index 3227d78f4..2a9658bc8 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/indoeuropean-web.png and b/freeciv-web/src/derived/webapp/images/flags/indoeuropean-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/ireland-web.png b/freeciv-web/src/derived/webapp/images/flags/ireland-web.png index 499c6b0f5..f550fe109 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/ireland-web.png and b/freeciv-web/src/derived/webapp/images/flags/ireland-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/israel-web.png b/freeciv-web/src/derived/webapp/images/flags/israel-web.png index 643d032e6..ab773e87f 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/israel-web.png and b/freeciv-web/src/derived/webapp/images/flags/israel-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/israel_ancient-web.png b/freeciv-web/src/derived/webapp/images/flags/israel_ancient-web.png index e35bedf13..f25bcc87f 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/israel_ancient-web.png and b/freeciv-web/src/derived/webapp/images/flags/israel_ancient-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/jamaica-web.png b/freeciv-web/src/derived/webapp/images/flags/jamaica-web.png index 94aef3268..b994aef6d 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/jamaica-web.png and b/freeciv-web/src/derived/webapp/images/flags/jamaica-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/japan-web.png b/freeciv-web/src/derived/webapp/images/flags/japan-web.png index 781462b5d..99b7ad28f 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/japan-web.png and b/freeciv-web/src/derived/webapp/images/flags/japan-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/jordan-web.png b/freeciv-web/src/derived/webapp/images/flags/jordan-web.png index 9ab41270f..123263e00 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/jordan-web.png and b/freeciv-web/src/derived/webapp/images/flags/jordan-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/kazakhstan-web.png b/freeciv-web/src/derived/webapp/images/flags/kazakhstan-web.png index 02f387087..f06b0f07a 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/kazakhstan-web.png and b/freeciv-web/src/derived/webapp/images/flags/kazakhstan-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/khmer-web.png b/freeciv-web/src/derived/webapp/images/flags/khmer-web.png index 18608c977..7e634e7d5 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/khmer-web.png and b/freeciv-web/src/derived/webapp/images/flags/khmer-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/kiribati-web.png b/freeciv-web/src/derived/webapp/images/flags/kiribati-web.png index 88f0d3b3f..1b9575d9e 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/kiribati-web.png and b/freeciv-web/src/derived/webapp/images/flags/kiribati-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/kurd-web.png b/freeciv-web/src/derived/webapp/images/flags/kurd-web.png index 4a4fd16d9..32d5ff74f 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/kurd-web.png and b/freeciv-web/src/derived/webapp/images/flags/kurd-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/kuwait-web.png b/freeciv-web/src/derived/webapp/images/flags/kuwait-web.png index d1313f66b..b0479ffe7 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/kuwait-web.png and b/freeciv-web/src/derived/webapp/images/flags/kuwait-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/latvia-web.png b/freeciv-web/src/derived/webapp/images/flags/latvia-web.png index d4d96879d..3f51c37c4 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/latvia-web.png and b/freeciv-web/src/derived/webapp/images/flags/latvia-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/lebanon-web.png b/freeciv-web/src/derived/webapp/images/flags/lebanon-web.png index 4c3a3ab97..a777989f3 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/lebanon-web.png and b/freeciv-web/src/derived/webapp/images/flags/lebanon-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/libya-web.png b/freeciv-web/src/derived/webapp/images/flags/libya-web.png index 9cb4d7731..d538a3de7 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/libya-web.png and b/freeciv-web/src/derived/webapp/images/flags/libya-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/libya_old-web.png b/freeciv-web/src/derived/webapp/images/flags/libya_old-web.png index b5a1ebab6..29aefb0b1 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/libya_old-web.png and b/freeciv-web/src/derived/webapp/images/flags/libya_old-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/macedonia-web.png b/freeciv-web/src/derived/webapp/images/flags/macedonia-web.png index e644da5bc..bfc0b6c16 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/macedonia-web.png and b/freeciv-web/src/derived/webapp/images/flags/macedonia-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/malaysia-web.png b/freeciv-web/src/derived/webapp/images/flags/malaysia-web.png index 603ed14bc..7f3e624ea 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/malaysia-web.png and b/freeciv-web/src/derived/webapp/images/flags/malaysia-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/man-web.png b/freeciv-web/src/derived/webapp/images/flags/man-web.png index 8cf22089b..ff9e3f78e 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/man-web.png and b/freeciv-web/src/derived/webapp/images/flags/man-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/messapian-web.png b/freeciv-web/src/derived/webapp/images/flags/messapian-web.png index fb53648da..03fee3b2d 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/messapian-web.png and b/freeciv-web/src/derived/webapp/images/flags/messapian-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/moldova-web.png b/freeciv-web/src/derived/webapp/images/flags/moldova-web.png index 5aa495871..cfbc3ae8c 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/moldova-web.png and b/freeciv-web/src/derived/webapp/images/flags/moldova-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/moluccas-web.png b/freeciv-web/src/derived/webapp/images/flags/moluccas-web.png index 6f39b76dc..867601f62 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/moluccas-web.png and b/freeciv-web/src/derived/webapp/images/flags/moluccas-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/monaco_alternative-web.png b/freeciv-web/src/derived/webapp/images/flags/monaco_alternative-web.png index 54b08e0c6..b380f25e1 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/monaco_alternative-web.png and b/freeciv-web/src/derived/webapp/images/flags/monaco_alternative-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/mongolia-web.png b/freeciv-web/src/derived/webapp/images/flags/mongolia-web.png index b84416628..31f64821f 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/mongolia-web.png and b/freeciv-web/src/derived/webapp/images/flags/mongolia-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/montenegro-web.png b/freeciv-web/src/derived/webapp/images/flags/montenegro-web.png index 9c72761fe..8971445a5 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/montenegro-web.png and b/freeciv-web/src/derived/webapp/images/flags/montenegro-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/nauru-web.png b/freeciv-web/src/derived/webapp/images/flags/nauru-web.png index 360e7f0f1..36ac3d41b 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/nauru-web.png and b/freeciv-web/src/derived/webapp/images/flags/nauru-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/nenetsia-web.png b/freeciv-web/src/derived/webapp/images/flags/nenetsia-web.png index 6e184b3bc..3b8f81ba5 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/nenetsia-web.png and b/freeciv-web/src/derived/webapp/images/flags/nenetsia-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/newzealand-web.png b/freeciv-web/src/derived/webapp/images/flags/newzealand-web.png index 133e3025e..e90ab85e0 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/newzealand-web.png and b/freeciv-web/src/derived/webapp/images/flags/newzealand-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/nigeria-web.png b/freeciv-web/src/derived/webapp/images/flags/nigeria-web.png index 726947d36..205229922 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/nigeria-web.png and b/freeciv-web/src/derived/webapp/images/flags/nigeria-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/north_korea-web.png b/freeciv-web/src/derived/webapp/images/flags/north_korea-web.png index a5597b5d4..cb0b8106f 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/north_korea-web.png and b/freeciv-web/src/derived/webapp/images/flags/north_korea-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/norway-web.png b/freeciv-web/src/derived/webapp/images/flags/norway-web.png index 042f37b55..3628327a4 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/norway-web.png and b/freeciv-web/src/derived/webapp/images/flags/norway-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/numidia-web.png b/freeciv-web/src/derived/webapp/images/flags/numidia-web.png index 6be5ac2db..9cdb5cf3f 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/numidia-web.png and b/freeciv-web/src/derived/webapp/images/flags/numidia-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/ohlone-web.png b/freeciv-web/src/derived/webapp/images/flags/ohlone-web.png index 7173f9c2d..e1cdca56e 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/ohlone-web.png and b/freeciv-web/src/derived/webapp/images/flags/ohlone-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/oldenburg-web.png b/freeciv-web/src/derived/webapp/images/flags/oldenburg-web.png index 0576a7552..aafb1e1f8 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/oldenburg-web.png and b/freeciv-web/src/derived/webapp/images/flags/oldenburg-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/palmyra-web.png b/freeciv-web/src/derived/webapp/images/flags/palmyra-web.png index b99d02a0f..521f90c75 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/palmyra-web.png and b/freeciv-web/src/derived/webapp/images/flags/palmyra-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/philippines-web.png b/freeciv-web/src/derived/webapp/images/flags/philippines-web.png index 915e1574a..592354086 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/philippines-web.png and b/freeciv-web/src/derived/webapp/images/flags/philippines-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/poland-web.png b/freeciv-web/src/derived/webapp/images/flags/poland-web.png index 0355098e3..b7a84cdf8 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/poland-web.png and b/freeciv-web/src/derived/webapp/images/flags/poland-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/russia-web.png b/freeciv-web/src/derived/webapp/images/flags/russia-web.png index 10b11e169..30a2d0fcb 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/russia-web.png and b/freeciv-web/src/derived/webapp/images/flags/russia-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/scotland-web.png b/freeciv-web/src/derived/webapp/images/flags/scotland-web.png index 972277622..f36160d4b 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/scotland-web.png and b/freeciv-web/src/derived/webapp/images/flags/scotland-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/scottishgaelic-web.png b/freeciv-web/src/derived/webapp/images/flags/scottishgaelic-web.png index d6ebf7c6a..42eb31b60 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/scottishgaelic-web.png and b/freeciv-web/src/derived/webapp/images/flags/scottishgaelic-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/seleucid-web.png b/freeciv-web/src/derived/webapp/images/flags/seleucid-web.png index 0d4f7f463..c12b8dcea 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/seleucid-web.png and b/freeciv-web/src/derived/webapp/images/flags/seleucid-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/spartan-web.png b/freeciv-web/src/derived/webapp/images/flags/spartan-web.png index 99820de48..26dc618dc 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/spartan-web.png and b/freeciv-web/src/derived/webapp/images/flags/spartan-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/sweden-web.png b/freeciv-web/src/derived/webapp/images/flags/sweden-web.png index 3dedfdc78..70cb574c5 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/sweden-web.png and b/freeciv-web/src/derived/webapp/images/flags/sweden-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/switzerland-web.png b/freeciv-web/src/derived/webapp/images/flags/switzerland-web.png index 578cfba95..289c45139 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/switzerland-web.png and b/freeciv-web/src/derived/webapp/images/flags/switzerland-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/templar-web.png b/freeciv-web/src/derived/webapp/images/flags/templar-web.png index ce9a026e8..f69d9397b 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/templar-web.png and b/freeciv-web/src/derived/webapp/images/flags/templar-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/tuareg-web.png b/freeciv-web/src/derived/webapp/images/flags/tuareg-web.png index e307e7dbe..9d5778e01 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/tuareg-web.png and b/freeciv-web/src/derived/webapp/images/flags/tuareg-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/vandal-web.png b/freeciv-web/src/derived/webapp/images/flags/vandal-web.png index 3e31bc178..44021995b 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/vandal-web.png and b/freeciv-web/src/derived/webapp/images/flags/vandal-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/visigoth-web.png b/freeciv-web/src/derived/webapp/images/flags/visigoth-web.png index 88233d24c..f57f6cb86 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/visigoth-web.png and b/freeciv-web/src/derived/webapp/images/flags/visigoth-web.png differ diff --git a/freeciv-web/src/derived/webapp/images/flags/xiongnu-web.png b/freeciv-web/src/derived/webapp/images/flags/xiongnu-web.png index 3031cdf84..11d2ca909 100644 Binary files a/freeciv-web/src/derived/webapp/images/flags/xiongnu-web.png and b/freeciv-web/src/derived/webapp/images/flags/xiongnu-web.png differ diff --git a/freeciv-web/src/derived/webapp/man/mp2-caravel6.bak.html b/freeciv-web/src/derived/webapp/man/mp2-caravel6.bak.html index 28706379d..8b23ab2c2 100644 --- a/freeciv-web/src/derived/webapp/man/mp2-caravel6.bak.html +++ b/freeciv-web/src/derived/webapp/man/mp2-caravel6.bak.html @@ -1,4 +1,8 @@ - + + + + + @@ -11,11 +15,47 @@

Anarchy

Anarchy offers slightly less corruption than Despotism, but slightly more unhappiness. - +Celebrating cities cannot rapture. No citizens are made unhappy by each aggressive unit. 25% Base corruption in cities 2% Extra corruption per each tile in distance from capital + +City Happiness vs. Empire Size + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Cities:0-910-1516-2122-2728-3334-3940-4546-51
First Unhappy:54321
Extra Unhappy:0+1+2+3+4+5+6+7
Features: • Trade production will suffer some losses. @@ -39,10 +79,48 @@

Despotism

Despotism suffers the highest level of corruption of all forms of government. +Celebrating cities cannot rapture. No citizens are made unhappy by each aggressive unit. 37% Base corruption in cities 4% Extra corruption per each tile in distance from capital -Gulag:You can starve cities without disorder, with 2 martial law units. +Gulag:You can starve cities without disorder, with 2 martial law units or a Police Station. + + +City Happiness vs. Empire Size + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Cities:0-1011-2021-3031-4041-5051-6061-7071-80
First Unhappy:54321
Extra Unhappy:0+1+2+3+4+5+6+7
Features: • Trade production will suffer massive losses. @@ -65,13 +143,49 @@

Monarchy

Monarchy suffers the same small amount of corruption that the Republic does. - +Celebrating cities cannot rapture. No citizens are made unhappy by each aggressive unit. 15% Base corruption in cities 2% Extra corruption per each tile in distance from capital Requires knowledge of the technology Monarchy. + +City Happiness vs. Empire Size + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Cities:0-1112-2324-3536-4748-5960-7172-8384-95
First Unhappy:54321
Extra Unhappy:0+1+2+3+4+5+6+7
+ Features: • Trade production will suffer some losses. • Trade losses will increase with distance from capital. @@ -96,6 +210,42 @@

+City Happiness vs. Empire Size + Cities: + 0-23 + 24-35 + 36-47 + 48-59 + 60-71 + 72-83 + 84-95 + 96-107 + + + First Unhappy: + 5 + 4 + 3 + 2 + 1 + + + + + + Extra Unhappy: + 0 + +1 + +2 + +3 + +4 + +5 + +6 + +7 + + + Features: • Trade production will suffer some losses. • Trade losses will increase with distance from capital. @@ -131,6 +281,42 @@

Republic

Requires knowledge of the technology The Republic. + +City Happiness vs. Empire Size + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Cities:0-1314-2728-4142-5556-6970-8384-9798-111
First Unhappy:54321
Extra Unhappy:0+1+2+3+4+5+6+7
+ Features: • Trade production will suffer some losses. • Trade losses will increase with distance from capital. @@ -161,6 +347,42 @@

Democracy

Requires knowledge of the technology Democracy. + +City Happiness vs. Empire Size + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Cities:0-1415-3031-4647-6263-7879-9495-110111-126
First Unhappy:54321
Extra Unhappy:0+1+2+3+4+5+6+7
+ Features: • Trade production will suffer a small amount of losses. • Trade losses will increase slowly with distance from capital. @@ -186,8 +408,9 @@

Theocracy

The people are devoted and often willing to die for their faith. Cities very near a capital have very low corruption. Cost for enemies to incite cities or bribe units is 2x, but Zealots cannot be bribed. Enemies cannot establish embassies without first making Ceasefire or Peace. -Improvements that appease unhappy citizens produce 1 gold in tithes for each citizen appeased. Tithes also boost gold income by +20%, but science output suffers -20%. Palace gives +50% to gold income in its city. In cities, two military units may impose martial law, affecting one citizen each. Pilgrims can be made to migrate and grow cities. +Improvements that appease unhappy citizens add +1 base gold in tithes for each citizen appeased. Tithes also boost gold income by +20%, but science output suffers -20%. Palace gives +50% to gold income in its city. In cities, two military units may impose martial law, affecting one citizen each. Pilgrims can be made to migrate and grow cities. +Having an Ecclesiastical Palace allows instant and orderly transition to this government. No citizens are made unhappy by each aggressive unit. 2% Base corruption in cities @@ -195,6 +418,42 @@

Theocracy

Requires knowledge of the technology Theocracy. + +City Happiness vs. Empire Size + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Cities:0-1415-2930-4445-5960-7475-8990-104105-119
First Unhappy:54321
Extra Unhappy:0+1+2+3+4+5+6+7
+ Features: • Trade production will suffer a small amount of losses. • Trade losses will increase with distance from capital. @@ -236,6 +495,42 @@

Communism

Requires knowledge of the technology Communism. + +City Happiness vs. Empire Size + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Cities:0-1213-∞------
First Unhappy:54444444
Extra Unhappy:0+1+1+1+1+1+1+1
+ Features: • Trade production will suffer some losses. • Each of your cities will avoid paying 4 Shield upkeep for your units. @@ -244,7 +539,7 @@

Communism

• The maximum rate you can set for science, gold, or luxuries is 80%. • Your units may impose martial law. Each military unit inside a city will force 2 unhappy citizens to become content. • A maximum of 3 units in each city can enforce martial law. -• New Diplomat units will be veteran. +• New Diplomat and Spy units will be veteran. • Each worked tile with Trade will yield +1 more Trade while its city is celebrating. (Cities below size 3 will not celebrate.) • Cathedral and Michelangelo effects diminished by -1. • Disqualified from all bonuses to Coinage. @@ -256,7 +551,7 @@

Communism

Nationalism

-
Nationalism glorifies national supremacy over other peoples. Zealous citizens and corporatations align under a dictator who rules over a unified populace, military, and isolationist economy.
+
Nationalism glorifies national supremacy over other peoples. Citizens and corporatations align under a dictator who rules over a unified populace, military, and isolationist economy.
 
 
 Content cities get a +1 trade bonus on Land tiles only. Celebrating cities also get Ocean tiles. Cities may rapture if founded under the original national hegemony. Luxury suffers a 15% penalty. Government mandated Science gets +15% in original cities.
@@ -274,6 +569,42 @@ 

Nationalism

Requires knowledge of the technology Nationalism. + +City Happiness vs. Empire Size + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Cities:0-2021-3233-4445-5657-6869-8081-9293-104
First Unhappy:54321
Extra Unhappy:0+1+2+3+4+5+6+7
+ Features: • Trade production will suffer a small amount of losses. • Trade losses will increase with distance from capital. @@ -288,7 +619,7 @@

Nationalism

* New Riflemen units will have the rank of veteran. * Fighter and Dive Bomber units are promoted 50% more frequently. • Luxury production is decreased 15%. -• Science production is increased 15% in original cities. +• Science production is increased 20% in original cities. • Cities originally founded by you can grow by means of rapture. (Cities below size 3 cannot grow in this way.) • +1 trade on each Land tile that produces trade. • Each worked Sea tile yields +1 more Trade while its city is celebrating. (Cities below size 3 will not celebrate.) diff --git a/freeciv-web/src/derived/webapp/man/mp2-caravel7.bak.html b/freeciv-web/src/derived/webapp/man/mp2-caravel7.bak.html index 081ffed34..6b6c4cb14 100644 --- a/freeciv-web/src/derived/webapp/man/mp2-caravel7.bak.html +++ b/freeciv-web/src/derived/webapp/man/mp2-caravel7.bak.html @@ -16,9 +16,9 @@

Founders

Firepower: 1
Hitpoints: 25
Obsolete by: None
-
At game start, Founders are a more populous portion of your nomadic tribe. 
+
At game start, Founders are a more populous portion of your nomadic tribe. 
 
-Founders are Settlers who found a city of size 2—usually the first city and capital of a tribe. They are a start unit that cannot be built. In all other respects they are exactly like Settlers, except they cannot be bribed.
+Founders are Settlers who found a city of size 2—usually the first city and capital of a tribe. They are a start unit that cannot be built. In all other respects they are exactly like Settlers, except they cannot be bribed.
 
➤ Belongs to Land unit class. • Subject to zones of control. • Slowed down while damaged. @@ -29,16 +29,16 @@

Founders

• Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can build Quay, Road, Railroad, Maglev, Canal, and Waterway on tiles. ➤ Can build Fort, Fortress, and Naval Base on tiles. ➤ Can clean Pollution from tiles. ➤ Can clean Fallout from tiles. ➤ Can Build City - • uses up the Settlers. - • initial population: 1. + • uses up the Founders. + • initial population: 2. ➤ Can Add to City - • uses up the Settlers. + • uses up the Founders. • max target size: 39. • adds 1 population. ➤ Can Pillage @@ -70,11 +70,11 @@

Settlers

Firepower: 1
Hitpoints: 20
Obsolete by: None
-
Population Cost: 1. Adds Population: 1.
+
Population Cost: 1. Adds Population: 1.
   
 Settlers are your only means of founding new cities.
-Settlers can perform most of the terrain alterations as Workers (but cannot build Airbases or Buoys).
-Upkeep for Settlers costs food as well as production. A Settler can die if its supporting city runs out of food. Settlers in a Republic, Democracy, or Theocratic nation require twice as much food per turn.
+Settlers can perform most of the terrain alterations as Workers (but cannot build Airbases or Buoys).
+Upkeep for Settlers costs food as well as production. A Settler can die if its supporting city runs out of food. Settlers in a Republic, Democracy, or Theocratic nation require twice as much food per turn.
 
➤ Belongs to Land unit class. • Subject to zones of control. • Slowed down while damaged. @@ -85,7 +85,7 @@

Settlers

• Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can build Quay, Road, Railroad, Maglev, Canal, and Waterway on tiles. ➤ Can build Fort, Fortress, and Naval Base on tiles. ➤ Can clean Pollution from tiles. @@ -124,7 +124,7 @@

Tribesmen

Firepower: 1
Hitpoints: 8
Obsolete by: None
-
Tribesmen came before cities and specialized division of labor. During ancient times, they get primitive versatility bonuses: 
+
Tribesmen came before cities and specialized division of labor. During ancient times, they get primitive versatility bonuses: 
   Tribesmen can explore, moving over terrain with no penalty. They don’t obey or exert ZOC. They can build roads, irrigate, or mine at half the rate of Workers. 
   Tribesmen can make basic diplomatic contact and freely Investigate cities. They can carry Goods and enter nations with whom you are at Peace. They can do primitive combat—they can’t conquer cities and only attack for 10 combat rounds. 
   Tribesmen help build nations by recycling into city production with a 2× bonus, donating their life-work of 20 shields into any output EXCEPT units. ** Changing production targets loses their work! ** 
@@ -139,7 +139,7 @@ 

Tribesmen

➤ Can build infrastructure until T20 (2000BC). • Can Road, 2 turns. (4-6 turns for slower roaded terrain.) • Can Mine, 10 turns. - • Can Irrigate, 6 turns. + • Can Irrigate, 5 turns. ➤ Ignores terrain effects (moving costs at most ⅓ MP per tile). ➤ Never imposes a zone of control. ➤ Not subject to zones of control imposed by other units. @@ -151,7 +151,7 @@

Tribesmen

• Can't conquer cities. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can Investigate City (does not spend the unit) ➤ Can Recycle • Must be done in a domestic city making a Building, Wonder, or Coinage. @@ -186,7 +186,7 @@

Well-Digger

Firepower: 1
Hitpoints: 8
Obsolete by: Workers
-
This unit can fix unlucky starts, but has very high upkeep.
+
This unit can fix unlucky starts, but has very high upkeep.
 If you have no water, make a Well-Digger in a city that can support it, create a water source, then disband the unit.
 This unit can dig wells to create irrigation sources. It will cost its home city -2 Food -2 Prod. This unit WILL NOT WORK: • Outside your borders, • After Alphabet or Pottery, • After any player discovers Writing, • After it reaches an age of 10 turns. >> Don't fool around: high upkeep will permanently hinder you. Only make this unit if you lack water when the game starts!
 
➤ Belongs to Land unit class. @@ -198,7 +198,7 @@

Well-Digger

• Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can Dig Well or Irrigate tiles with no water. ➤ Can clean Pollution from tiles. ➤ Can clean Fallout from tiles. @@ -232,11 +232,11 @@

Proletarians

Firepower: 1
Hitpoints: 10
Obsolete by: None
-
Population Cost: 1. Adds Population: 2.
+
Population Cost: 1. Adds Population: 2.
   
 Proletarians can only be controlled by Communist governments.
-Communist States can assign Proletarians from one city to another, which transfers population from one to the other. They can also be ordered to the same tasks as Workers. Proletarians are extremely valuable as Workers for a third of the price. The disadvantage is that they cost one population to make. However, this is compensated by the fact that when they join a city, they add two to the population!
-Large numbers of Proletarians can be used to rapidly complete important State projects, which you may organize into Five-turn Plans.
+Communist States can assign Proletarians from one city to another, which transfers population from one to the other. They can also be ordered to the same tasks as Workers. Proletarians are extremely valuable as Workers for a third of the price. The disadvantage is that they cost one population to make. However, this is compensated by the fact that when they join a city, they add two to the population!
+Large numbers of Proletarians can be used to rapidly complete important State projects, which you may organize into Five-turn Plans.
 
➤ Belongs to Land unit class. • Subject to zones of control. • Slowed down while damaged. @@ -250,7 +250,7 @@

Proletarians

• Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can build Quay, Road, Railroad, Maglev, Canal, and Waterway on tiles. ➤ Can build Fort, Fortress, Naval Base, Airbase, Radar, and Buoy on tiles. ➤ Can clean Pollution from tiles. @@ -285,7 +285,7 @@

Pilgrims

Firepower: 1
Hitpoints: 10
Obsolete by: None
-
Population Cost: 0. Adds Population: 1.
+
Population Cost: 0. Adds Population: 1.
   
 Pilgrims are wayfaring migrants from Theocratic nations. Like Zealots, they have no upkeep if under a Theocratic government. Heeding the call of ecclesiastic authority, Pilgrims can be guided from one city to another in order to transfer population from city to city. Pilgrims have no population cost, so can be thought of as rapture for the price of 10 shields.
 
➤ Belongs to Land unit class. @@ -300,7 +300,7 @@

Pilgrims

• Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can Add to City • is done to domestic individual cities. • uses up the Pilgrims. @@ -343,7 +343,7 @@

Migrants

• Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can Add to City • is done to domestic individual cities. • uses up the Migrants. @@ -371,10 +371,10 @@

Workers

Firepower: 1
Hitpoints: 8
Obsolete by: Engineers
-
Workers can improve terrain tiles. See the manual on Terrain for details.
-Masonry lets Workers build Forts. Construction lets them build Fortresses and Oil Wells. Engineering lets them build Canals and Naval Bases. 
+
Workers can improve terrain tiles. See the manual on Terrain for details.
+Masonry lets Workers build Forts. Construction lets them build Fortresses and Oil Wells. Engineering lets them build Canals and Naval Bases. 
   Feudalism with Construction lets them build Castles. Steel lets them build Bunkers and Sea Bridges. Radio lets them build Airbases and Buoys, which Settlers cannot. Workers must be on a ship to build Buoys.
-Communism tech allows Communist governments to conscript Workers into Riflemen via the Convert order. And vice versa.
+Communism tech allows Communist governments to conscript Workers into Riflemen via the Convert order. And vice versa.
 
➤ Belongs to Land unit class. • Subject to zones of control. • Slowed down while damaged. @@ -386,7 +386,7 @@

Workers

• Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can build Quay, Road, Railroad, Maglev, Canal, and Waterway on tiles. ➤ Can build Fort, Fortress, Naval Base, Airbase, Radar, and Buoy on tiles. ➤ Can clean Pollution from tiles. @@ -427,7 +427,7 @@

Engineers

Firepower: 1
Hitpoints: 20
Obsolete by: None
-
Engineers can do everything Workers can do, at twice the speed. Unlike Workers, Engineers can Transform, such as converting Desert to Plains. Converting Ocean to Swamp requires being on a ship on a tile bordering 2 land tiles.
+
Engineers can do everything Workers can do, at twice the speed. Unlike Workers, Engineers can Transform, such as converting Desert to Plains. Converting Ocean to Swamp requires being on a ship on a tile bordering 2 land tiles. Constructing a Sea Bridge requires being on a ship on a tile cardinally adjacent to land.
 
➤ Belongs to Land unit class. • Subject to zones of control. • Slowed down while damaged. @@ -438,7 +438,7 @@

Engineers

• Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can build Quay, Road, Railroad, Maglev, Canal, and Waterway on tiles. ➤ Can build Fort, Fortress, Naval Base, Airbase, Radar, and Buoy on tiles. ➤ Can clean Pollution from tiles. @@ -465,10 +465,10 @@

Warriors

Firepower: 1
Hitpoints: 10
Obsolete by: Pikemen
-
The Warrior is the weakest military unit, but can also be very cost effective.
-
+
The Warrior is the weakest military unit, but can also be very cost effective.
+
 With the discovery of Conscription, Warriors can convert to Musketeers in any domestic city.
-
+
 The discovery of Banking changes upkeep from shields to gold.
 
➤ Belongs to Land unit class. • Can occupy empty enemy cities. @@ -478,6 +478,7 @@

Warriors

• Can't attack as Cargo. Must first unload. ➤ Unable to attack air units. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ The discovery of Banking converts the shield upkeep of this unit to 1 gold upkeep. ➤ Under certain conditions, cities can make more than one of this unit per turn, plus one of any other unit type. ➤ Can Upgrade @@ -522,11 +523,11 @@

Phalanx

Firepower: 1
Hitpoints: 10
Obsolete by: Pikemen
-
The Phalanx is armored infantry, excellent for city defense and holding tactical positions. Phalanxes can do standard attacks and Rumble attacks while remaining fortified. 
- 
-If a Phalanx hasn’t moved, it can Rumble Attack adjacent enemies. Rumbles are disciplined skirmish—not mortal combat. The formation gives the Phalanx little or no vulnerability. The trade-off is that the Phalanx can only thrust at a single target for 3 combat rounds. Rumble attacks are used to unsettle enemies: they can discourage fortifying into tactical positions, or weaken them prior to attacks from other units. The action uses ⁵⁄₉ of a move point and doesn’t alter the fortified status of the Phalanx. 
+
The Phalanx is armored infantry, excellent for city defense and holding tactical positions. Phalanxes can do standard attacks and Rumble attacks while remaining fortified. 
+
+If a Phalanx hasn’t moved, it can Rumble Attack adjacent enemies. Rumbles are disciplined skirmish—not mortal combat. The formation gives the Phalanx little or no vulnerability. The trade-off is that the Phalanx can only thrust at a single target for 3 combat rounds. Rumble attacks are used to unsettle enemies: they can discourage fortifying into tactical positions, or weaken them prior to attacks from other units. The action uses ⁵⁄₉ of a move point and doesn’t alter the fortified status of the Phalanx. 
 
-With the discovery of Conscription, Phalanxes can convert to Musketeers in any domestic city. The discovery of Banking changes upkeep from shields to gold.
+With the discovery of Conscription, Phalanxes can convert to Musketeers in any domestic city. The discovery of Banking changes upkeep from shields to gold.
 
➤ Belongs to Land unit class. • Can occupy empty enemy cities. • Subject to zones of control. @@ -546,6 +547,7 @@

Phalanx

- Using the D command to click the target will preserve fortified status of Phalanx. ➤ Unable to attack air units. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ The discovery of Banking converts the shield upkeep of this unit to 1 gold upkeep. ➤ Under certain conditions, cities can make more than one of this unit per turn, plus one of any other unit type. ➤ Can Expel @@ -593,12 +595,11 @@

Archers

Firepower: 1
Hitpoints: 10
Obsolete by: Musketeers
-
Archers fight with bows and arrows. They have good offense and decent defense. Rather than fight to the death, Archers can also do a ranged Volley Attack which avoids hand-to-hand retaliation: two volleys of arrows are fired on up to 7 enemy units on the tile, causing 1-2hp of damage to any units who are hit. This includes Oceanic tiles if not transported. This is useful for softening enemies prior to battle, or for deterring an approach to a strategic location. (Volley Attack is not possible on Cities or Fortresses.) Archers can do a retaliatory Volley attack against any unit which does a Special Unit Attack on them.
+
Archers fight with bows and arrows. They have good offense and decent defense. Rather than fight to the death, Archers can also do a ranged Volley Attack which avoids hand-to-hand retaliation: two volleys of arrows are fired on up to 3 enemy units on the tile, causing 1-2hp of damage to any units who are hit. This includes Oceanic tiles if not transported. This is useful for softening enemies prior to battle, or for deterring an approach to a strategic location. (Volley Attack is not possible on Cities or Fortresses.) Archers can do a retaliatory Volley attack against any unit which does a Special Unit Attack on them.
 
 With the discovery of Conscription, Archers can convert to Musketeers in any domestic city.
 
-
-The discovery of Banking changes upkeep from shields to gold.
+The discovery of Banking changes upkeep from shields to gold.
 
➤ Belongs to Land unit class. • Can occupy empty enemy cities. • Subject to zones of control. @@ -616,6 +617,7 @@

Archers

- Using the D command to click the target will preserve fortified status of Archers. ➤ Unable to attack air units. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Has Special Defense against Special Attacks / Ranged Attacks. • Gives 2 free rounds of combat against up to 7 units in an enemy stack. ➤ The discovery of Banking converts the shield upkeep of this unit to 1 gold upkeep. @@ -667,14 +669,12 @@

Legion

Firepower: 1
Hitpoints: 10
Obsolete by: Musketeers
-
Legions are heavily armed well disciplined soldiers with excellent offensive strength. They are famous for their engineering abilities: with the required technology they can build Forts and Fortresses. They can build Roads outside domestic national territory and inside Forts and Fortresses.
+
Legions are heavily armed well disciplined soldiers with excellent offensive strength. They are famous for their engineering abilities: with the required technology they can build Forts and Fortresses. They can build Roads outside domestic national territory and inside Forts and Fortresses.
 Legions are feared for how they start battle: a Pilum Assault targets the shields of the enemy. A pilum stuck in a shield renders it useless, leaving the front line vulnerable to a full-on charge. The Pilum Assault does 1 round of combat at 2× attack bonus on up to 2 units on the tile.
 
-
-With the discovery of Conscription, Legions can convert to Musketeers in any domestic city.
+With the discovery of Conscription, Legions can convert to Musketeers in any domestic city.
 
-
-The discovery of Banking changes upkeep from shields to gold.  
+The discovery of Banking changes upkeep from shields to gold.  
 
➤ Belongs to Land unit class. • Can occupy empty enemy cities. • Subject to zones of control. @@ -692,6 +692,7 @@

Legion

➤ Can build Quay, Road, Railroad, Maglev, Canal, and Waterway on tiles. ➤ Can build Fort, Fortress, and Naval Base on tiles. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ The discovery of Banking converts the shield upkeep of this unit to 1 gold upkeep. ➤ Under certain conditions, cities can make more than one of this unit per turn, plus one of any other unit type. ➤ Can Capture Unit @@ -745,13 +746,11 @@

Pikemen

Firepower: 1
Hitpoints: 10
Obsolete by: Musketeers
-
Long sharp pikes give Pikemen a counter to the height and mobility of mounted units. They enjoy a 2× defense bonus against mounted units.
+
Long sharp pikes give Pikemen a counter to the height and mobility of mounted units. They enjoy a 2× defense bonus against mounted units.
 
-
-With the discovery of Conscription, Pikemen can convert to Musketeers in any domestic city.
+With the discovery of Conscription, Pikemen can convert to Musketeers in any domestic city.
 
-
-The discovery of Banking changes upkeep from shields to gold.  
+The discovery of Banking changes upkeep from shields to gold.  
 
➤ Belongs to Land unit class. • Can occupy empty enemy cities. • Subject to zones of control. @@ -761,6 +760,7 @@

Pikemen

2× defense bonus if attacked by Horsemen, Chariot, Elephants, Crusaders, Knights, or Dragoons. ➤ Unable to attack air units. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ The discovery of Banking converts the shield upkeep of this unit to 1 gold upkeep. ➤ Under certain conditions, cities can make more than one of this unit per turn, plus one of any other unit type. ➤ Can Expel @@ -808,10 +808,9 @@

Musketeers

Firepower: 1
Hitpoints: 20
Obsolete by: Riflemen
-
Musketeers are infantry equipped with early firearms. They replace Pikemen as the preferred city defender, and replace Archers and Legions for offensive foot soldiers. The discovery of Labor Union allows upgrading Musketeers to Riflemen for free in any domestic city.
+
Musketeers are infantry equipped with early firearms. They replace Pikemen as the preferred city defender, and replace Archers and Legions for offensive foot soldiers. The discovery of Labor Union allows converting Musketeers to Riflemen for free in any domestic city.
 
-
-The discovery of Banking changes upkeep from shields to gold.
+The discovery of Banking changes upkeep from shields to gold.
 
➤ Belongs to Land unit class. • Can occupy empty enemy cities. • Subject to zones of control. @@ -821,6 +820,7 @@

Musketeers

➤ Unable to attack air units. ➤ May load onto and disembark from Trains or Transport Helicopters even when underway. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ The discovery of Banking converts the shield upkeep of this unit to 1 gold upkeep. ➤ Under certain conditions, cities can make more than one of this unit per turn, plus one of any other unit type. ➤ Can Capture Unit @@ -883,6 +883,7 @@

Falconeers

➤ Unable to attack air units. ➤ May load onto and disembark from Trains or Transport Helicopters even when underway. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Under certain conditions, cities can make more than one of this unit per turn, plus one of any other unit type. ➤ Can Capture Unit • target unit must be alone, not on Mountains, and not in a Fort, Fortress, or Naval Base. @@ -936,13 +937,11 @@

Zealots

Firepower: 1
Hitpoints: 20
Obsolete by: None
-
Zealots are warriors devoted to a higher cause. Their faith is strong and they cannot be bribed.
-Theocratic nations can maintain Zealots without paying their steep upkeep. (Zealots are unhappy if not under Theocracy, requiring high upkeep to stay content.) Zealots produced in a city with Ecclesiastical Palace are inspired by fervorous faith to +1 higher veteran level.
-Zealots zealously defend their homeland, and can do surprise skirmish assaults to snipe and injure foreign occupants: Up to 4 invaders on the tile will endure three combat rounds without defense. Skirmish assaults can also be done to foreign occupied cities if they have a remaining Foreign National population.
+
Zealots are warriors devoted to a higher cause. Their faith is strong and they cannot be bribed.
+Theocratic nations can maintain Zealots without paying their steep upkeep. (Zealots are unhappy if not under Theocracy, requiring high upkeep to stay content.) Zealots produced in a city with Ecclesiastical Palace are inspired by fervorous faith to +1 higher veteran level.
+Zealots fervently defend their homeland, and can do surprise skirmish assaults to snipe and injure foreign occupants: Up to 4 invaders on the tile will endure three combat rounds without defense. Skirmish assaults can also be done to foreign occupied cities if they have a remaining Foreign National population.
 
-
-
-The discovery of Banking changes upkeep from shields to gold.
+The discovery of Banking changes upkeep from shields to gold.
 
➤ Belongs to Land unit class. • Can occupy empty enemy cities. • Subject to zones of control. @@ -960,6 +959,7 @@

Zealots

➤ Unable to attack air units. ➤ May load onto and disembark from Trains or Transport Helicopters even when underway. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Under certain conditions, cities can make more than one of this unit per turn, plus one of any other unit type. ➤ Can attack against Helicopter units, which are usually not reachable. ➤ Can Capture Unit @@ -999,7 +999,7 @@

Zealots

Partisan

-
Cost: 50 shields
+
Cost: 45 shields
Upkeep: 1 Unhappy
Moves: 2
Vision: 2.00 tiles
@@ -1008,8 +1008,8 @@

Partisan

Firepower: 1
Hitpoints: 20
Obsolete by: None
-
Partisans are guerilla fighters who can use the terrain to their advantage.  Like the Explorer that they upgrade, they can slip through ZOC and live off the land with no upkeep.
-Proportional to city size, up to 8 Partisans appear when an enemy conquers your city. They randomly fortify on any tile inside the circle defined by its workable radius. Partisans prefer defensive tiles, and ignore tile nationality. They spawn only when:
+
Partisans are guerilla fighters who can use the terrain to their advantage.  Like the Explorer that they upgrade, they can slip through ZOC and live off the land with no upkeep.
+Proportional to city size, up to 8 Partisans appear when an enemy conquers your city. They randomly fortify on any tile inside the circle defined by its workable radius. Partisans prefer defensive tiles, and ignore tile nationality. They spawn only when:
 ➣ Guerilla Warfare is known by any player.
 ➣ The city was originally built by you.
 ➣ You must be Theocratic, OR,
@@ -1024,6 +1024,7 @@ 

Partisan

➤ May load onto and disembark from Trains or Transport Helicopters even when underway. ➤ Ignores terrain effects (moving costs at most 1/3 MP per tile). ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Not subject to zones of control imposed by other units. ➤ The discovery of Banking converts the shield upkeep of this unit to 1 gold upkeep. ➤ Under certain conditions, cities can make more than one of this unit per turn, plus one of any other unit type. @@ -1073,12 +1074,11 @@

Riflemen

Firepower: 1
Hitpoints: 20
Obsolete by: None
-
Riflemen are World War-era infantry. They are good at defending cities and strategic Fortresses. They also have good attack capability. 
+
Riflemen are World War-era infantry. They are good at defending cities and strategic Fortresses. They also have good attack capability. 
 
-Under Communism this unit costs 5 less. Also, Communism tech allows Communist governments to de-commission Riflemen into Workers via the Convert order. And vice versa.
+Under Communism this unit costs 5 less. Also, Communism tech allows Communist governments to de-commission Riflemen into Workers via the Convert order. And vice versa.
 
-
-The discovery of Banking changes upkeep from shields to gold.
+The discovery of Banking changes upkeep from shields to gold.
 
➤ Belongs to Land unit class. • Can occupy empty enemy cities. • Subject to zones of control. @@ -1088,6 +1088,7 @@

Riflemen

➤ Under Communism, may be obtained by conversion of Workers. ➤ Unable to attack air units. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ The discovery of Banking converts the shield upkeep of this unit to 1 gold upkeep. ➤ Under certain conditions, cities can make more than one of this unit per turn, plus one of any other unit type. ➤ Can attack against Helicopter units, which are usually not reachable. @@ -1138,10 +1139,9 @@

Alpine Troops

Firepower: 1
Hitpoints: 20
Obsolete by: None
-
Alpine Troops are highly mobile units and excellent defenders.  Similar to an Explorer, they treat every land tile like a road were on it.
+
Alpine Troops are highly mobile units and excellent defenders.  Similar to an Explorer, they treat every land tile like a road were on it.
 
-
-The discovery of Banking changes upkeep from shields to gold.
+The discovery of Banking changes upkeep from shields to gold.
 
➤ Belongs to Land unit class. • Can occupy empty enemy cities. • Subject to zones of control. @@ -1152,6 +1152,7 @@

Alpine Troops

➤ May load onto and disembark from Trains or Transport Helicopters even when underway. ➤ Ignores terrain effects (moving costs at most ⅓ MP per tile). ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ The discovery of Banking converts the shield upkeep of this unit to 1 gold upkeep. ➤ Under certain conditions, cities can make more than one of this unit per turn, plus one of any other unit type. ➤ Can attack against Helicopter units, which are usually not reachable. @@ -1191,7 +1192,7 @@

Alpine Troops

Marines

-
Cost: 60 shields
+
Cost: 55 shields
Upkeep: 1 Shield, 1 Unhappy
Moves: 2
Vision: 2.83 tiles
@@ -1200,14 +1201,13 @@

Marines

Firepower: 1
Hitpoints: 20
Obsolete by: None
-
Marines are experts at all-terrain warfare. They are the strongest foot unit in the game, and are armed with diverse weaponry.
+
Marines are experts at all-terrain warfare. They are the strongest foot unit in the game, and are armed with diverse weaponry.
 Unlike other units, Marines can attack Sea units (at a 50% penalty). Air units do not stop them from attacking reachable targets. They can attack while fortified and maintain fortified status. They can attack from a Transport or Helicopter, and can offload without losing a turn of movement. Marines can make Forts and Airbases. Marines get an extra 2/9 movement points for each veteran level they possess. Starting at v2, they gain the ability to do long-range bazooka attacks for 3 combat rounds, hitting up to 2 units on the tile and killing a maximum of 1.
 Bazooka attacks can be done to Ocean tiles if the Marines aren't transported.
 
 Marines built in a city with an Airport, Port Facility, and Barracks III receive an extra veteran level.
 
-
-The discovery of Banking changes upkeep from shields to gold.
+The discovery of Banking changes upkeep from shields to gold.
 
➤ Belongs to LandAirSea unit class. • Can attack from Ships and Helicopters. • Can occupy empty enemy cities. @@ -1231,6 +1231,7 @@

Marines

➤ May load and unload from Trains and Helicopters even when underway. ➤ Won't lose all movement when moving from non-native terrain to native terrain, or unloading from transport. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ The discovery of Banking converts the shield upkeep of this unit to 1 gold upkeep. ➤ Under certain conditions, cities can make more than one of this unit per turn, plus one of any other unit type. ➤ Can attack against Helicopter units, which are usually not reachable. @@ -1270,7 +1271,7 @@

Marines

Paratroopers

-
Cost: 60 shields
+
Cost: 55 shields
Upkeep: 1 Shield, 1 Unhappy
Moves: 2
Vision: 2.00 tiles
@@ -1279,8 +1280,8 @@

Paratroopers

Firepower: 1
Hitpoints: 20
Obsolete by: None
-
Paratroopers are experts at airborne attacks. From a friendly city or airbase, Paratroopers who have moves left and have not already paradropped in the current turn, can paradrop directly to any tile in range, and be immediately ready to act there. Beware dropping into unseen territory, as Paratroopers landing on a tile occupied by enemy units will be lost. Also note: Paradropping is assumed to be done from aircraft. Therefore, Fighters on Vigil may auto-attack the tile you land on, if adjacent.
-
+
Paratroopers are experts at airborne attacks. From a friendly city or airbase, Paratroopers who have moves left and have not already paradropped in the current turn, can paradrop directly to any tile in range, and be immediately ready to act there. Beware dropping into unseen territory, as Paratroopers landing on a tile occupied by enemy units will be lost. Also note: Paradropping is assumed to be done from aircraft. Therefore, Fighters on Vigil may auto-attack the tile you land on, if adjacent.
+
 The discovery of Banking changes upkeep from shields to gold.
 
➤ Belongs to Land unit class. • Can occupy empty enemy cities. @@ -1292,6 +1293,7 @@

Paratroopers

➤ Unable to attack air units. ➤ May load onto and disembark from Trains or Transport Helicopters even when underway. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ The discovery of Banking converts the shield upkeep of this unit to 1 gold upkeep. ➤ Under certain conditions, cities can make more than one of this unit per turn, plus one of any other unit type. ➤ Can attack against Helicopter units, which are usually not reachable. @@ -1345,10 +1347,9 @@

Mechanized Infantry

Firepower: 1
Hitpoints: 30
Obsolete by: None
-
Mechanized Infantry have the strongest general defense strength of any land unit. They have decent attack strength in open field engagements, and excellent mobility.
+
Mechanized Infantry have the strongest general defense strength of any land unit. They have decent attack strength in open field engagements, and excellent mobility.
 
-
-Upkeep for Mechanized infantry is paid in gold instead of shields.
+Upkeep for Mechanized infantry is paid in gold instead of shields.
 
➤ Belongs to Land unit class. • Can occupy empty enemy cities. • Subject to zones of control. @@ -1358,6 +1359,7 @@

Mechanized Infantry

➤ Unable to attack air units. ➤ May load onto Transport Helicopters even when underway. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ The discovery of Banking converts the shield upkeep of this unit to 1 gold upkeep. ➤ Under certain conditions, cities can make more than one of this unit per turn, plus one of any other unit type. ➤ Can attack against Helicopter units, which are usually not reachable. @@ -1402,7 +1404,7 @@

Horsemen

Firepower: 1
Hitpoints: 10
Obsolete by: Knights
-
Horsemen are mounted warriors and an early shock-troop that can penetrate deep into enemy territory.
+
Horsemen are mounted warriors and an early shock-troop that can penetrate deep into enemy territory.
 
➤ Belongs to Land unit class. • Can occupy empty enemy cities. • Subject to zones of control. @@ -1413,6 +1415,7 @@

Horsemen

➤ Knights defend at 3 when attacked by this unit. ➤ Unable to attack air units. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can Expel • target unit must be alone and not on Mountains. • uses one movement point @@ -1456,7 +1459,7 @@

Chariot

Firepower: 1
Hitpoints: 10
Obsolete by: Knights
-
Chariots are horse-pulled war wagons, stronger but more expensive than horsemen.
+
Chariots are horse-pulled war wagons, stronger but more expensive than horsemen.
 
➤ Belongs to Land unit class. • Can occupy empty enemy cities. • Subject to zones of control. @@ -1467,6 +1470,7 @@

Chariot

➤ Knights defend at 3 when attacked by this unit. ➤ Unable to attack air units. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can Capture Unit • target unit must be alone, not on Mountains, and not in a Fort, Fortress, or Naval Base. ➤ Can Expel @@ -1512,7 +1516,7 @@

Elephants

Firepower: 1
Hitpoints: 10
Obsolete by: Crusaders
-
Elephants are towering animals trained for war. Their mobility and formidable attack strength make them excellent for offensive engagements, but they defend poorly against most units.
+
Elephants are towering animals trained for war. Their mobility and formidable attack strength make them excellent for offensive engagements, but they defend poorly against most units.
 
➤ Belongs to Land unit class. • Can occupy empty enemy cities. • Subject to zones of control. @@ -1523,6 +1527,7 @@

Elephants

➤ Knights defend at 3 when attacked by this unit. ➤ Unable to attack air units. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can Capture Unit • target unit must be alone, not on Mountains, and not in a Fort, Fortress, or Naval Base. ➤ Can Expel @@ -1568,7 +1573,7 @@

Crusaders

Firepower: 1
Hitpoints: 10
Obsolete by: Dragoons
-
Crusaders are mounted warriors driven by a higher cause. They have superior attack to Knights, but are poor at defending. They are ideally suited for leading the charge in offensive campaigns.
+
Crusaders are mounted warriors driven by a higher cause. They have superior attack to Knights, but are poor at defending. They are ideally suited for leading the charge in offensive campaigns.
 
➤ Belongs to Land unit class. • Can occupy empty enemy cities. • Subject to zones of control. @@ -1579,6 +1584,7 @@

Crusaders

➤ Knights defend at 3 when attacked by this unit. ➤ Unable to attack air units. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can Capture Unit • target unit must be alone, not on Mountains, and not in a Fort, Fortress, or Naval Base. ➤ Can Expel @@ -1624,7 +1630,7 @@

Knights

Firepower: 1
Hitpoints: 10
Obsolete by: Dragoons
-
Knights are heavily armored mounted warriors. They defend at D:3 against mounted units. They defend at D:2 against foot units. They defend at D:1 against everything else. Their noble status allows them to attack cities without population reduction.
+
Knights are heavily armored mounted warriors. They defend at D:3 against mounted units. They defend at D:2 against foot units. They defend at D:1 against everything else. Their noble status allows them to attack cities without population reduction, and conquer a size 1 city without destroying it.
 
➤ Belongs to LandNoKill unit class. • Does not reduce population when attacking city. • Can occupy empty enemy cities. @@ -1638,6 +1644,7 @@

Knights

➤ Knights defend at 3 when attacked by this unit. ➤ Unable to attack air units. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can Capture Unit • target unit must be alone, not on Mountains, and not in a Fort, Fortress, or Naval Base. ➤ Can Expel @@ -1683,7 +1690,7 @@

Dragoons

Firepower: 1
Hitpoints: 20
Obsolete by: Cavalry
-
Dragoons are mounted warriors carrying early firearms. Being the first highly mobile gunpowder unit, they are formidable for offensive campaigns.
+
Dragoons are mounted warriors carrying early firearms. Being the first highly mobile gunpowder unit, they are formidable for offensive campaigns.
 
➤ Belongs to Land unit class. • Can occupy empty enemy cities. • Subject to zones of control. @@ -1694,6 +1701,7 @@

Dragoons

➤ Knights defend at 3 when attacked by this unit. ➤ Unable to attack air units. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can Capture Unit • target unit must be alone, not on Mountains, and not in a Fort, Fortress, or Naval Base. ➤ Can Expel @@ -1739,7 +1747,7 @@

Cavalry

Firepower: 1
Hitpoints: 20
Obsolete by: Armor
-
The combination of mobility and superior attack strength make Cavalry the most feared offensive unit in their era.
+
The combination of mobility and superior attack strength make Cavalry the most feared offensive unit in their era.
 
➤ Belongs to Land unit class. • Can occupy empty enemy cities. • Subject to zones of control. @@ -1749,6 +1757,7 @@

Cavalry

➤ -50% attack penalty when attacking Helicopter. ➤ Unable to attack air units. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can attack against Helicopter units, which are usually not reachable. ➤ Can Capture Unit • target unit must be alone, not on Mountains, and not in a Fort, Fortress, or Naval Base. @@ -1795,7 +1804,8 @@

Armor

Firepower: 1
Hitpoints: 30
Obsolete by: Armor II
-
Armor is the mechanized equivalent of a Cavalry unit. They have high attack strength, superb mobility, and the highest defense of any offensive unit. They are massive all-terrain vehicles, well-suited for penetrating defensive fortifications: Units inside Forts get no defense bonus against Armor. Units inside Fortresses get a reduced bonus of 1.67× instead of 2×.
+
Armor is the mechanized equivalent of a Cavalry unit. They have high attack strength, superb mobility, and the highest defense of any offensive unit. They are massive all-terrain vehicles, well-suited for penetrating defensive fortifications: Units inside Forts get no defense bonus against Armor. Units inside Fortresses get a reduced bonus of 1.67× instead of 2×.
+Communists pay 10 less for this unit.
 
➤ Belongs to Land unit class. • Can occupy empty enemy cities. • Subject to zones of control. @@ -1810,6 +1820,7 @@

Armor

Defending Forts get no bonus. +33% attack bonus vs. Fortress (reduces it to 1.67× defense). ➤ May load onto Helicopter transports even when underway. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can attack against Helicopter units, which are usually not reachable. ➤ Can Expel • target unit must be alone and not on Mountains. @@ -1854,7 +1865,7 @@

Armor II

Firepower: 1
Hitpoints: 30
Obsolete by: None
-
Armor II is the ultra-modern upgrade to Armor. It features high tech composite armor and electronic countermeasures (ECM). Forts and Fortresses gain no bonus against its ability to blast and break through fortifications. ECM and composite armor give a 2× defense bonus against Missiles. Unlike most land units, Armor II can attack reachable units regardless of whether unreachable units protect the tile.
+
Armor II is the ultra-modern upgrade to Armor. It features high tech composite armor and electronic countermeasures (ECM). Forts and Fortresses gain no bonus against its ability to blast and break through fortifications. ECM and composite armor give a 2× defense bonus against Missiles. Unlike most land units, Armor II can attack reachable units regardless of whether unreachable units protect the tile.
 
➤ Belongs to Land unit class. • Can occupy empty enemy cities. • Subject to zones of control. @@ -1872,6 +1883,7 @@

Armor II

Defending Fortresses get no bonus. ➤ May load onto Helicopter transports even when underway. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can attack against Helicopter units, which are usually not reachable. ➤ Can Expel • target unit must be alone and not on Mountains. @@ -1914,10 +1926,9 @@

Catapult

Firepower: 1
Hitpoints: 10
Obsolete by: Cannon
-
Catapults are large rock-throwing war machines. The ballistic delivery of massive stones diminishes the defense bonus vs land attacks by Fortifications and City Walls by -25%, yielding a 1.25× and 2.75× bonus, respectively. 
+
Catapults are large rock-throwing war machines. The ballistic delivery of massive stones diminishes the defense bonus vs land attacks by Fortifications and City Walls by -25%, yielding a 1.25× and 2.75× bonus, respectively. 
 
-
-Catapults are weak defenders, and will need an escort to be effective. Even so, it is better to rush attack them than do special unit attacks from range:when attacked from range or rammed in a Fortress, Catapults can retaliate for 4 rounds of combat.
+Catapults are weak defenders, and will need an escort to be effective. Even so, it is better to rush attack them than do special unit attacks from range:when attacked from range or rammed in a Fortress, Catapults can retaliate for 4 rounds of combat.
 
➤ Belongs to Land unit class, Ballistic sub-class. • 25% is subtracted from the bonus of City defense improvements against Land attacks: • Fortifications are reduced from 1.5× to 1.25× @@ -1929,6 +1940,7 @@

Catapult

• Can't attack as Cargo. Must first unload. ➤ Unable to attack air units. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Has Special Defense against Special Attacks / Ranged Attacks. • Gives 4 free rounds of combat against up to 1 unit in an enemy stack. • A maximum of 1 unit can be killed. @@ -1975,7 +1987,7 @@

Siege Ram

Firepower: 1
Hitpoints: 10
Obsolete by: Cannon
-
Siege Rams launch a tremendous thrusting force through iron-capped timber shafts. They can break through City Walls if they are not killed first. City Walls have counter defenses, giving Siege Rams even odds of success. Wall defense in capitals is twice as stiff—cutting odds to 25%.
+
Siege Rams launch a tremendous thrusting force through iron-capped timber shafts. They can break through City Walls if they are not killed first. City Walls have counter defenses, giving Siege Rams even odds of success. Wall defense in capitals is twice as stiff—cutting odds to 25%.
 
 Siege Rams may also ram Fortresses, doing up to 4hp of damage on each occupant. This emulates damage to the Fortress defense bonus, which is partly or fully repaired/recovered next turn.
 
@@ -2002,6 +2014,7 @@ 

Siege Ram

• Cannot be done to any tile except a Fortress or Naval Base. ➤ Unable to attack air units. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can Upgrade • upgrades to Cannon or, when possible, to the unit type it upgrades to. ➤ Can Pillage @@ -2023,10 +2036,9 @@

Cannon

Firepower: 1
Hitpoints: 20
Obsolete by: Artillery
-
Cannons are huge guns that use gunpowder to fire massive metallic projectiles much faster and more accurately than earlier ballistic weapons. The aerial delivery of high speed massive metal gives an edge against Fortifications and City Walls. The defense bonuses vs. land attacks from those are reduced by -50%. This leaves Fortifications only with their terrain bonus, and reduces City walls to 2.5x.
+
Cannons are huge guns that use gunpowder to fire massive metallic projectiles much faster and more accurately than earlier ballistic weapons. The aerial delivery of high speed massive metal gives an edge against Fortifications and City Walls. The defense bonuses vs. land attacks from those are reduced by -50%. This leaves Fortifications only with their terrain bonus, and reduces City walls to 2.5x.
 
-
-While Cannons are strong attackers, they are also weak defenders. Yet they are not without defensive purpose. They can retaliate 6 rounds of bombardment against special unit attacks from other units.
+While Cannons are strong attackers, they are also weak defenders. Yet they are not without defensive purpose. They can retaliate 6 rounds of bombardment against special unit attacks from other units.
 
➤ Belongs to Land unit class, Ballistic sub-class. • 50% is subtracted from the bonus of City defense improvements against Land attacks: • Fortifications are reduced to terrain bonus only. @@ -2039,6 +2051,7 @@

Cannon

➤ Unable to attack air units. ➤ May load onto and disembark from Transport Helicopters even when underway. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Has Special Defense against Special Attacks / Ranged Attacks. • Gives 5 free rounds of combat against up to 2 units in an enemy stack. • A maximum of 1 unit can be killed. @@ -2085,10 +2098,9 @@

Artillery

Firepower: 2
Hitpoints: 20
Obsolete by: Howitzer
-
Artillery are a major upgrade to Cannons, with doubled firepower. Accuracy and projectile speed go to a whole new level. Thus, they have an even greater bonus than their predecessors against Fortifications and City Walls. Such bonuses are reduced -75%. This leaves Fortifications only with their terrain bonus, and reduces the bonus from Walls down to 2.25x. 
+
Artillery are a major upgrade to Cannons, with doubled firepower. Accuracy and projectile speed go to a whole new level. Thus, they have an even greater bonus than their predecessors against Fortifications and City Walls. Such bonuses are reduced -75%. This leaves Fortifications only with their terrain bonus, and reduces the bonus from Walls down to 2.25x. 
 
-
-Like their predecessors, Artillery are poor at defense, and need an escort to be effective. However, they can retaliate 6 rounds of bombardment against special unit attacks from other units.
+Like their predecessors, Artillery are poor at defense, and need an escort to be effective. However, they can retaliate 6 rounds of bombardment against special unit attacks from other units.
 
➤ Belongs to Land unit class, Ballistic sub-class. • 75% is subtracted from the bonus of City defense improvements against Land attacks: • Fortifications are reduced to terrain bonus only. @@ -2101,6 +2113,7 @@

Artillery

➤ Unable to attack air units. ➤ May load onto and disembark from Transport Helicopters even when underway. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Has Special Defense against Special Attacks / Ranged Attacks. • Gives 6 free rounds of combat against up to 3 units in an enemy stack. • A maximum of 1 unit can be killed. @@ -2147,10 +2160,9 @@

Anti-Aircraft Artillery

Firepower: 2
Hitpoints: 20
Obsolete by: None
-
Anti-Aircraft Artillery (AAA) can attack almost anything from anywhere. AAA get a 2× bonus against Air units. AAA qualify as weaponry for Marines and have the same abilities: they can be transported on any unit that carries Marines, can attack from or to non-native tiles, and do not lose a turn when unloading. Transported AAA defend their tile on both Land and Sea. (AAA cannot attack Submarines, Missiles, or Jet Bombers.)
+
Anti-Aircraft Artillery (AAA) can attack almost anything from anywhere. AAA get a 2× bonus against Air units. AAA qualify as weaponry for Marines and have the same abilities: they can be transported on any unit that carries Marines, can attack from or to non-native tiles, and do not lose a turn when unloading. Transported AAA defend their tile on both Land and Sea. (AAA cannot attack Submarines, Missiles, or Jet Bombers.)
 
-
-After Space Flight and 10 turns of service, AAA can be retrofitted to Mobile SAM. The Convert order must be done in your capital, and takes 4 turns.
+After Space Flight and 10 turns of service, AAA can be retrofitted to Mobile SAM. The Convert order must be done in a capital, and takes 4 turns.
 
➤ Belongs to LandAirSea unit class. • Can attack from Ships and Helicopters. • Can occupy empty enemy cities. @@ -2167,6 +2179,7 @@

Anti-Aircraft Artillery

➤ Anti-Air bonus of this unit is less effective against Stealth, which has a 25% bonus against this unit. ➤ May load and unload from Trains and Helicopters even when underway. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can attack against Helicopter units, which are usually not reachable. ➤ Can attack against Air units, which are usually not reachable. ➤ Can attack against AirProtect units, which are usually not reachable. @@ -2215,10 +2228,9 @@

Mobile SAM

Firepower: 2
Hitpoints: 30
Obsolete by: None
-
The Mobile SAM is the strongest Anti-Air unit on the ground. It can attack nearby aircraft. It has a 2× bonus against all Air units. The Mobile SAM can also carry one Missile of any type. Unlike the AAA, it cannot attack non-native tiles or attack while transported.
+
The Mobile SAM is the strongest Anti-Air unit on the ground. It can attack nearby aircraft. It has a 2× bonus against all Air units. The Mobile SAM can also carry one Missile of any type. Unlike the AAA, it cannot attack non-native tiles or attack while transported.
 
-
-AAA can upgrade to Mobile SAM for free on its 10th turn of service. The Convert order must be done in the capital city and takes 4 turns.
+AAA can upgrade to Mobile SAM for free on its 10th turn of service. The Convert order must be done in the capital city and takes 4 turns.
 
➤ Belongs to Land unit class. • Can occupy empty enemy cities. • Subject to zones of control. @@ -2232,9 +2244,10 @@

Mobile SAM

➤ Anti-Air bonus of this unit is less effective against Stealth, which has a 25% bonus against this unit. ➤ Can carry and refuel 1 Missile unit. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can attack against Helicopter units, which are usually not reachable. ➤ Can attack against Air units, which are usually not reachable. -➤ Can attack against AirPillage units, which are usually not reachable. +➤ Can attack against Air_High_Altitude units, which are usually not reachable. ➤ Can attack against AirProtect units, which are usually not reachable. ➤ Can Expel • target unit must be alone and not on Mountains. @@ -2261,10 +2274,9 @@

Howitzer

Firepower: 2
Hitpoints: 30
Obsolete by: None
-
Howitzers are upgraded Artillery with a terrifying increase to mobility and attack strength. Fortifications get no bonus except their terrain bonus, and City Walls are completely ineffective against Howitzers. 
+
Howitzers are upgraded Artillery with a terrifying increase to mobility and attack strength. Fortifications get no bonus except their terrain bonus, and City Walls are completely ineffective against Howitzers. 
 
-
-While Howitzers are vulnerable when not escorted, they can retaliate 7 rounds of bombardment against special unit attacks from other units. This is a strong deterrent.
+While Howitzers are vulnerable when not escorted, they can retaliate 7 rounds of bombardment against special unit attacks from other units. This is a strong deterrent.
 
➤ Belongs to Land unit class, Ballistic sub-class. • Fortifications are reduced to terrain bonus only. • City Walls get no bonus against this unit. @@ -2275,6 +2287,7 @@

Howitzer

• Can't attack as Cargo. Must first unload. ➤ Unable to attack air units. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Has Special Defense against Special Attacks / Ranged Attacks. • Gives 7 free rounds of combat against up to 4 units in an enemy stack. • A maximum of 1 unit can be killed. @@ -2319,8 +2332,8 @@

Balloon

Firepower: 1
Hitpoints: 10
Obsolete by: None
-
Balloons gather intel on potential battle areas. They have great vision and are unreachable by units prior to Riflemen and Ironclads. They can stay in the air for one Turn Change before landing in a City, Quay, Base, or transport unit with cargo capacity of 4+. Balloons do not block units under them from being attacked, and cannot fly over mountains.
-
+
Balloons gather intel on potential battle areas. They have great vision and are unreachable by units prior to Riflemen and Ironclads. They can stay in the air for one Turn Change before landing in a City, Quay, Base, or transport unit with cargo capacity of 4+. Balloons give sentry reports of nearby unit movements even when not on sentry. Balloons do not block units under them from being attacked, and cannot fly over mountains.
+
 NOTE: GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.    
 
➤ Belongs to Balloon unit class. • Speed is not affected by terrain. @@ -2333,8 +2346,9 @@

Balloon

• Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Never imposes a zone of control. +➤ Reconnaissance: reports visible enemy movement even if not sentried. ➤ Unit must be in a City, Fort, Fortress, Naval Base, Airbase; or on a Galleon, Cargo Ship, Transport, or Carrier, after 2 turns. ➤ Can't be bribed. ➤ Can't be sabotaged. @@ -2353,9 +2367,9 @@

Zeppelin

Firepower: 2
Hitpoints: 20
Obsolete by: None
-
As new technology inspires the upgrade of Balloons, the Zeppelin appears. In theory, it can be used for tactical advantage in combat. However, vulnerability and cost make it better for intel. It can do limited attack with bombs, or 20 combat rounds with medium caliber ordnance. It can stay out for two Turn Changes before landing in a City, Quay, Fortress, Naval Base, Airbase, or transport with 6+ capacity.
-Zeppelins have great vision and are unreachable by units prior to Marines and Destroyers. Zeppelins do not block units under them from being attacked. Unlike Balloons, they can fly over Mountains.
-
+
As new technology inspires the upgrade of Balloons, the Zeppelin appears. In theory, it can be used for tactical advantage in combat. However, vulnerability and cost make it better for intel. It can do limited attack with bombs, or 20 combat rounds with medium caliber ordnance. It can stay out for two Turn Changes before landing in a City, Quay, Fortress, Naval Base, Airbase, or transport with 6+ capacity.
+Zeppelins have great vision and are unreachable by units prior to Marines and Destroyers. Zeppelins do not block units under them from being attacked. Zeppelins give sentry reports of nearby unit movements even when not on sentry. Unlike Balloons, they can fly over Mountains.
+
 NOTE: GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.
 
➤ Belongs to Zeppelin unit class. • Speed is not affected by terrain. @@ -2369,6 +2383,7 @@

Zeppelin

• A maximum of 1 unit can be killed. • Can be done to Cities, Forts, Fortresses, Naval Bases, Land Tiles, and Oceanic Tiles. ➤ Never imposes a zone of control. +➤ Reconnaissance: reports visible enemy movement even if not sentried. ➤ INTERCEPTED by Fighter types on Vigil: they auto-attack if they have better odds attacking than defending. ➤ Unit has to be in a City, Fortress, Naval Base, Airbase; or on a Carrier, Transport, or Train, after 3 turns. ➤ Can Attack @@ -2404,8 +2419,8 @@

Airplane

Firepower: 1
Hitpoints: 20
Obsolete by: None
-
Airplanes can carry a single diplomatic unit. They can land in any domestic or allied city. For missions to non-allied nations, an empty Airbase must be available for landing. Airplanes have two turns of fuel. Each new aviation tech upgrades range by +2 moves per turn.
-
+
Airplanes can carry a diplomatic unit or a Freight unit. They can land in any domestic or allied city. For missions to non-allied nations, an empty Airbase must be available for landing. Airplanes have two turns of fuel. Each new aviation tech upgrades range by +2 moves per turn.
+
 Airplanes can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker. NOTE:GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.
 
➤ Belongs to Air unit class. • Speed is not affected by terrain. @@ -2413,7 +2428,7 @@

Airplane

• Not subject to zones of control. • Unreachable. Most units cannot attack this one. ◦ Doesn't prevent enemy units from attacking other units on its tile. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. ➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if it has more moves left than attacker. ➤ Never imposes a zone of control. @@ -2440,10 +2455,10 @@

Fighter

Firepower: 2
Hitpoints: 20
Obsolete by: Jet Fighter
-
Fighters are the first offensive Air units. Their superior mobility and firepower alter the very nature of warfare. They can move anywhere and attack any unit (except Submarines and Jet Bombers.)
-
+
Fighters are the first offensive Air units. Their superior mobility and firepower alter the very nature of warfare. They can move anywhere and attack any unit (except Submarines and Jet Bombers.)
+
 INTERCEPTOR: the Vigil order lets Fighters auto-attack adjacent Air units if they have better attack odds. A Fighter can Vigil if it uses 2 move points or less.
-
+
 Fighters can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker. NOTE:GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.
 
➤ Belongs to AirProtect unit class. • INTERCEPTOR: can be given the Vigil order to auto-attack adjacent Air units. @@ -2452,7 +2467,7 @@

Fighter

• Does not get defense bonuses from terrain. • Not subject to zones of control. • Unreachable. Most units cannot attack this one. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. ➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if it has more moves left than attacker. ➤ Anti-Air units have bonuses against this unit. @@ -2482,6 +2497,11 @@

Fighter

crack210%10% + 1 ace220%10% + 1 top gun230%-+ 1 + +Fighters types on Vigil will engage the following units: + +* Note: Propeller-type fighters are unable to reach high altitude aircraft (Jet Bomber, Spy Plane.) +
@@ -2496,9 +2516,9 @@

Escort Fighter

Firepower: 2
Hitpoints: 20
Obsolete by: Jet Fighter
-
Escort Fighters are large fighters with high fuel capacity. Higher mass and stronger construction allow them to absorb more damage. They do not attack as well as standard Fighters, but can return home on the next turn. They are good for long-range missions, defensive air support, and escorting bombers.
-
-INTERCEPTOR: the Vigil order lets Escort Fighters auto-attack adjacent Air units if they have better attack odds. This unit can Vigil if it uses 3 move points or less.
+
Escort Fighters are large fighters with high fuel capacity. Higher mass and stronger construction allow them to absorb more damage. They do not attack as well as standard Fighters, but can return home on the next turn. They are good for long-range missions, defensive air support, and escorting bombers.
+
+INTERCEPTOR: the Vigil order lets Escort Fighters auto-attack adjacent Air units if they have better attack odds. This unit can Vigil if it uses 3 move points or less.
 This aircraft can Stack-Escape:a 60% chance to escape a killed stack if it has more remaining moves than the attacker. NOTE:GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.
 
➤ Belongs to AirProtect unit class. • INTERCEPTOR: can be given the Vigil order to auto-attack adjacent Air units. @@ -2507,7 +2527,7 @@

Escort Fighter

• Does not get defense bonuses from terrain. • Not subject to zones of control. • Unreachable. Most units cannot attack this one. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. ➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if it has more moves left than attacker. ➤ Anti-Air units have bonuses against this unit. @@ -2536,7 +2556,12 @@

Escort Fighter

elite200%15% - crack210%15% + 1 ace220%15% + 1 -top gun230%-+ 1
+top gun230%-+ 1 + +Fighters types on Vigil will engage the following units: +
+* Note: Propeller-type fighters are unable to reach high altitude aircraft (Jet Bomber, Spy Plane.) +

Dive Bomber

@@ -2561,7 +2586,7 @@

Dive Bomber

• A3 instead of A4 in Air-to-Air • Can't block its tile • Can't intercept
- + Communists pay 10 less for this unit. GOTO prevents unit loss from lack of fuel. Override this by ordering adjacent moves.
➤ Belongs to Air unit class. • Speed is not affected by terrain. @@ -2569,7 +2594,7 @@

Dive Bomber

• Not subject to zones of control. • Unreachable. Most units cannot attack this one. ◦ Doesn't prevent enemy units from attacking other units on its tile. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. ➤ Can safely iPillage: Instant Ground Strike against tile infrastructure. • 50% odds of success. +5% for each veteran level. @@ -2619,11 +2644,11 @@

Medium Bomber

Firepower: 2
Hitpoints: 20
Obsolete by: Jet Bomber
-
The Medium Bomber is well suited for moderately strong targets or multiple weak targets. It may not attack other Air units. It is a Soft Field Unit and can't carry Bomb units, causing less discontent than other types of Bombers.
+
The Medium Bomber is well suited for moderately strong targets or multiple weak targets. It may not attack other Air units. It is a Soft Field Unit and can't carry Bomb units, causing less discontent than other types of Bombers.
 ➤ Unhappy effect for Soft Field units:
 Republic:0   Democracy:1    (non-aggressive)
 Republic:1   Democracy:2    (aggressive)
-
+
 This aircraft can Stack-Escape:a 60% chance to escape a killed stack if it has more remaining moves than the attacker. NOTE:GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.
 
➤ Belongs to Air unit class. • Speed is not affected by terrain. @@ -2631,7 +2656,7 @@

Medium Bomber

• Not subject to zones of control. • Unreachable. Most units cannot attack this one. ◦ Doesn't prevent enemy units from attacking other units on its tile. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. ➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if it has more moves left than attacker. ➤ Anti-Air units have bonuses against this unit. @@ -2672,10 +2697,10 @@

Heavy Bomber

Firepower: 2
Hitpoints: 20
Obsolete by: Jet Bomber
-
Heavy Bombers are large and sturdy Bombers with larger payload and numerous gunner defense stations. They are excellent for hitting strong well-defended ground targets. They cannot attack Air units. They can carry one Bomb. Like most Bombers, the Heavy Bomber is a Field Unit. Field Units cause the same unhappiness no matter if aggressively or peacefully deployed.
+
Heavy Bombers are large and sturdy Bombers with larger payload and numerous gunner defense stations. They are excellent for hitting strong well-defended ground targets. They cannot attack Air units. They can carry one Bomb. Like most Bombers, the Heavy Bomber is a Field Unit. Field Units cause the same unhappiness no matter if aggressively or peacefully deployed.
 ➤ Unhappy effect for Field units:
 Republic:1   Democracy:2
-
+
 This aircraft can Stack-Escape:a 60% chance to escape a killed stack if it has more remaining moves than the attacker. NOTE:GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.
 
➤ Belongs to Air unit class. • Speed is not affected by terrain. @@ -2683,7 +2708,7 @@

Heavy Bomber

• Not subject to zones of control. • Unreachable. Most units cannot attack this one. ◦ Doesn't prevent enemy units from attacking other units on its tile. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. ➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if it has more moves left than attacker. ➤ Anti-Air units have bonuses against this unit. @@ -2726,8 +2751,8 @@

Strategic Bomber

Firepower: 2
Hitpoints: 20
Obsolete by: Jet Bomber
-
The Strategic Bomber offers a small improvement in attack. Higher altitude offers a good upgrade in defense. It has considerably longer range, with one more turn of fuel. Upgraded payload enables instant-Pillage bombing. May carry two Bombs. May carry two Bombs.
-
+
The Strategic Bomber offers a small improvement in attack. Higher altitude offers a good upgrade in defense. It has considerably longer range, with one more turn of fuel. Upgraded payload enables instant-Pillage bombing. May carry two Bombs. May carry two Bombs.
+
 This aircraft can Stack-Escape:a 60% chance to escape a killed stack if it has more remaining moves than the attacker. NOTE:GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.
 
➤ Belongs to Air unit class. • Speed is not affected by terrain. @@ -2735,7 +2760,7 @@

Strategic Bomber

• Not subject to zones of control. • Unreachable. Most units cannot attack this one. ◦ Doesn't prevent enemy units from attacking other units on its tile. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. ➤ Can safely iPillage: Instant Bomb against tile infrastructure. • 60% odds of success. +5% for each veteran level. @@ -2782,8 +2807,8 @@

AWACS

Firepower: 1
Hitpoints: 20
Obsolete by: Spy Plane
-
The AWACS has great fuel capacity for long range flights, and advanced radar that can determine the location of enemy units over a wide area. The AWACS has 2 turns of fuel.
-
+
The AWACS has great fuel capacity for long range flights, and advanced radar that can determine the location of enemy units over a wide area. The AWACS has 2 turns of fuel.
+
 AWACS can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker. NOTE:GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.
 
➤ Belongs to Air unit class. • Speed is not affected by terrain. @@ -2791,7 +2816,7 @@

AWACS

• Not subject to zones of control. • Unreachable. Most units cannot attack this one. ◦ Doesn't prevent enemy units from attacking other units on its tile. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. ➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if it has more moves left than attacker. ➤ Never imposes a zone of control. @@ -2816,8 +2841,8 @@

Spy Plane

Firepower: 1
Hitpoints: 20
Obsolete by: None
-
The Spy Plane is an ultrasonic high altitude aircraft with long range. It gathers intel over a wide area. Stealth technology makes it invisible, except to enemies on adjacent tiles. Spy Planes have 2 turns of fuel. They are unreachable to primitive propeller based aircraft.
-
+
The Spy Plane is an ultrasonic high altitude aircraft with long range. It gathers intel over a wide area. Stealth technology makes it invisible, except to enemies on adjacent tiles. Spy Planes have 2 turns of fuel. They are unreachable to primitive propeller based aircraft.
+
 Spy Planes can Stack-Escape:a 67% chance to escape a killed stack if they have more remaining moves than the attacker. NOTE:GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.
 
➤ Belongs to Air_High_Altitude unit class. • Invisible except when next to an enemy unit or city. @@ -2826,7 +2851,7 @@

Spy Plane

• Not subject to zones of control. • Unreachable. Most units cannot attack this one. ◦ Doesn't prevent enemy units from attacking other units on its tile. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. ➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if it has more moves left than attacker. ➤ Is invisible except when next to an enemy unit or city. @@ -2851,8 +2876,8 @@

Satellite

Firepower: 1
Hitpoints: 20
Obsolete by: None
-
Satellites orbit the Earth above the atmosphere. They are unreachable to anything but missiles. Their orbital velocity allows them to circumnavigate the planet in a couple turns. Telescopic cameras allow them to Investigate City, even if the city has a Police Station. Satellites cannot be seen by others unless adjacent. Satellites require Laser tech, and can only be built in the city with the Apollo Program.
-
+
Satellites orbit the Earth above the atmosphere. They are unreachable to anything but missiles. Their orbital velocity allows them to circumnavigate the planet in a couple turns. Telescopic cameras allow them to Investigate City, even if the city has a Police Station. Satellites cannot be seen by others unless adjacent. Satellites require Laser tech, and can only be built in the city with the Apollo Program.
+
 Satellites can Stack-Escape:a 100% chance to escape a killed stack if they have more remaining move points than the attacker.
NOTE: Due to game mechanics, Satellites block terrestrial movement over a tile. This is solved by killing it with any Missile. To avoid this, end your turn far away from developed or trafficked areas.

➤ Belongs to Space unit class. @@ -2861,7 +2886,7 @@

Satellite

• Not subject to zones of control. • Unreachable. Only missile types can attack this unit. ◦ Doesn't prevent enemy units from attacking other units on its tile. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.STACK ESCAPE: 100% odds to escape if stack defender loses, if it has more moves left than attacker. ➤ Is invisible except when next to an enemy unit or city. ➤ Never imposes a zone of control. @@ -2883,12 +2908,12 @@

Transport Helicopter

Firepower: 2
Hitpoints: 21
Obsolete by: None
-
Transport Helicopters can carry three land units, which they can pick up from anywhere
-   Foot and artillery types can unload by stepping off to any adjacent tile, but will lose all moves (except Marine types). Other types need a City, Airbase, or Naval Base to unload.
+
Transport Helicopters can carry three land units, which they can pick up from anywhere
+   Foot and artillery types can unload by stepping off to any adjacent tile, but will lose all moves (except Marine types). Other types need a City, Airbase, or Naval Base to unload.
 
-   Helicopters lose 1 hp for each turn not ended in a City, Base, or Carrier. +1 move is awarded if starting a turn in a City or Airbase.
+   Helicopters lose 1 hp for each turn not ended in a City, Base, or Carrier. +1 move is awarded if starting a turn in a City or Airbase.
 
-   All Helicopters can be attacked by land from Riflemen onward; by sea from Ironclad onward; get +50% defence vs. foot units; and are unreachable to artillery types. Unlike attack Helicopters, Transport Helicopters are intercepted by Fighters on vigil.
+   All Helicopters can be attacked by land from Riflemen onward; by sea from Ironclad onward; get +50% defence vs. foot units; and are unreachable to artillery types. Unlike attack Helicopters, Transport Helicopters are intercepted by Fighters on vigil.
   
➤ Belongs to Helicopter unit class. • Speed is not affected by terrain. • Does not get defense bonuses from terrain. @@ -2933,14 +2958,14 @@

Helicopter

Firepower: 2
Hitpoints: 21
Obsolete by: None
-
Helicopters are the Air Cavalry of modern armies. They can attack multiple targets and conquer cities. Unaffected by terrain, they are good for Partisan suppression. They can transport Marines and AAA and are thus well-suited for commando ops.
+
Helicopters are the Air Cavalry of modern armies. They can attack multiple targets and conquer cities. Unaffected by terrain, they are good for Partisan suppression. They can transport Marines and AAA and are thus well-suited for commando ops.
 
-For each turn not ended in a City, Base, or Carrier, 1hp is lost. +1 move is awarded if starting a turn in a City or Airbase.
+For each turn not ended in a City, Base, or Carrier, 1hp is lost. +1 move is awarded if starting a turn in a City or Airbase.
 
-Helicopters fly low to avoid Interception. This invites attacks by ground units from Riflemen onward. They are unreachable to Artillery types and get +50% defense vs. foot units. Helicopters can be attacked by Sea from Ironclad onward.
+Helicopters fly low to avoid Interception. This invites attacks by ground units from Riflemen onward. They are unreachable to Artillery types and get +50% defense vs. foot units. Helicopters can be attacked by Sea from Ironclad onward.
 Helicopters can retaliate 3 rounds against Special Unit Attacks.
 
-Helicopters can transport one Marines or AAA unit.
+Helicopters can transport one Marines or AAA unit.
 
➤ Belongs to Helicopter unit class. • Can occupy empty enemy cities. • Speed is not affected by terrain. @@ -2955,6 +2980,7 @@

Helicopter

➤ Gets +1 move point if starting its turn in a City or Airbase. ➤ Can carry and refuel 1 Marines or Anti-Aircraft Artillery unit. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Has Special Defense against Special Attacks / Ranged Attacks. • Gives 3 free rounds of combat against up to 3 units in an enemy stack. • A maximum of 1 unit can be killed. @@ -2991,11 +3017,11 @@

Jet Fighter

Firepower: 2
Hitpoints: 20
Obsolete by: None
-
Jet Fighters upgrade the Fighter with improved attack, defense, and range.
-
+
Jet Fighters upgrade the Fighter with improved attack, defense, and range.
+
 INTERCEPTOR: the Vigil order lets Jet Fighters auto-attack adjacent Air units if they have better attack odds. This unit can Vigil if it uses 3 move points or less.
-
-Helicopters can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker. NOTE:GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.
+
+Jet Fighters can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker. NOTE:GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.
 
➤ Belongs to AirProtect unit class. • INTERCEPTOR: can be given the Vigil order to auto-attack adjacent Air units. • AIR COVER: Most units who cannot attack this unit also cannot attack other units on the tile. @@ -3003,7 +3029,7 @@

Jet Fighter

• Does not get defense bonuses from terrain. • Not subject to zones of control. • Unreachable. Most units cannot attack this one. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. ➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if it has more moves left than attacker. ➤ Anti-Air units have bonuses against this unit. @@ -3012,7 +3038,7 @@

Jet Fighter

➤ Can attack against Missile units, which are usually not reachable. ➤ Can attack against Helicopter units, which are usually not reachable. ➤ Can attack against Air units, which are usually not reachable. -➤ Can attack against AirPillage units, which are usually not reachable. +➤ Can attack against Air_High_Altitude units, which are usually not reachable. ➤ Can attack against AirProtect units, which are usually not reachable. ➤ Unit must be in a City, Airbase, or on a Carrier after 1 turn. ➤ Can Expel Airplane and AWACS. @@ -3032,6 +3058,11 @@

Jet Fighter

crack210%10% + 1 ace220%10% + 1 top gun230%-+ 1 + +Fighters types on Vigil will engage the following units: + +* Note: Propeller-type fighters are unable to reach high altitude aircraft (Jet Bomber, Spy Plane.) +
@@ -3046,7 +3077,7 @@

Ground Strike Fighter

Firepower: 2
Hitpoints: 20
Obsolete by: None
-
Ground Strike Fighters upgrade the Dive Bomber. They cannot block attacks on other units on their tile, nor engage against Fighters. However, like the Dive Bomber, they can interdict ZoC over land tiles. High fuel capacity allows two turns in the air. No unit can stop this unit from attacking surface units on a tile. This unit can also do pinpointed surgical strikes to pillage tiles. This aircraft is a specialized niche unit. It is not an interceptor.
+
Ground Strike Fighters upgrade the Dive Bomber. They cannot block attacks on other units on their tile, nor engage against Fighters. However, like the Dive Bomber, they can interdict ZoC over land tiles. High fuel capacity allows two turns in the air. No unit can stop this unit from attacking surface units on a tile. This unit can also do pinpointed surgical strikes to pillage tiles. This aircraft is a specialized niche unit. It is not an interceptor.
 This aircraft can Stack-Escape:a 60% chance to escape a killed stack if it has more remaining moves than the attacker. NOTE:GOTO prevents unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.
 
➤ Belongs to Air unit class. • Speed is not affected by terrain. @@ -3054,7 +3085,7 @@

Ground Strike Fighter

• Not subject to zones of control. • Unreachable. Most units cannot attack this one. ◦ Doesn't prevent enemy units from attacking other units on its tile. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. ➤ Can safely iPillage: Instant Ground Strike against tile infrastructure. • 75% odds of success. +5% for each veteran level. @@ -3100,8 +3131,8 @@

Jet Bomber

Firepower: 2
Hitpoints: 20
Obsolete by: None
-
Jet Bombers are stratospheric long-range bombers with 3 turns of fuel: they can be airborne for two turn-changes. Their range makes them useful even after Stealth Bombers are available. Stratospheric altitude is unreachable to propeller-based Fighters and AAA. Jet Bombers can carpet-bomb, pillaging tiles from the air. May carry three Bombs. 
-
+
Jet Bombers are stratospheric long-range bombers with 3 turns of fuel: they can be airborne for two turn-changes. Their range makes them useful even after Stealth Bombers are available. Stratospheric altitude is unreachable to propeller-based Fighters and AAA. Jet Bombers can carpet-bomb, pillaging tiles from the air. May carry three Bombs. 
+
 Jet Bombers can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker. NOTE:GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.
 
➤ Belongs to Air_High_Altitude unit class. • Speed is not affected by terrain. @@ -3109,7 +3140,7 @@

Jet Bomber

• Not subject to zones of control. • Unreachable. Most units cannot attack this one, including AAA and propeller aircraft. ◦ Doesn't prevent enemy units from attacking other units on its tile. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. ➤ Can safely iPillage: Instant Carpet Bomb against tile infrastructure. • 75% odds of success. +5% for each veteran level. @@ -3155,10 +3186,10 @@

Stealth Fighter

Firepower: 2
Hitpoints: 20
Obsolete by: None
-
The most advanced Fighter, with improved attack and longer range. Stealth Fighters cannot be seen unless adjacent to an enemy. Stealth evasion gives a 25% bonus against all Anti-Air units, and reduces SAM Batteries down to a smaller 25% bonus.
-
+
The most advanced Fighter, with improved attack and longer range. Stealth Fighters cannot be seen unless adjacent to an enemy. Stealth evasion gives a 25% bonus against all Anti-Air units, and reduces SAM Batteries down to a smaller 25% bonus.
+
 INTERCEPTOR: the Vigil order lets Stealth Fighters auto-attack adjacent Air units if they have better attack odds. This unit can Vigil if it uses 4 move points or less.
-
+
 Stealth Fighters can Stack-Escape:a 67% chance to escape a killed stack if they have more remaining moves than the attacker.
NOTE: GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.

➤ Belongs to AirProtect unit class. @@ -3168,7 +3199,7 @@

Stealth Fighter

• Does not get defense bonuses from terrain. • Not subject to zones of control. • Unreachable. Most units cannot attack this one. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. ➤ +25% attack bonus when attacking Anti-Aircraft Artillery, Mobile SAM, or AEGIS Cruiser. ➤ +25% defense bonus if attacked by Anti-Aircraft Artillery, Mobile SAM, or AEGIS Cruiser. @@ -3181,7 +3212,7 @@

Stealth Fighter

➤ Can attack against Missile units, which are usually not reachable. ➤ Can attack against Helicopter units, which are usually not reachable. ➤ Can attack against Air units, which are usually not reachable. -➤ Can attack against AirPillage units, which are usually not reachable. +➤ Can attack against Air_High_Altitude units, which are usually not reachable. ➤ Can attack against AirProtect units, which are usually not reachable. ➤ Unit must be in a City, Airbase, or on a Carrier after 1 turn. ➤ Can Expel Airplane and AWACS. @@ -3201,6 +3232,11 @@

Stealth Fighter

crack210%10% + 1 ace220%10% + 1 top gun230%-+ 1 + +Fighters types on Vigil will engage the following units: + +* Note: Propeller-type fighters are unable to reach high altitude aircraft (Jet Bomber, Spy Plane.) +
@@ -3215,8 +3251,8 @@

Stealth Bomber

Firepower: 2
Hitpoints: 20
Obsolete by: None
-
The deadliest Bomber, with improved attack and speed. Stealth Bombers cannot be seen unless adjacent to an enemy. Stealth evasion gives a 25% bonus against all Anti-Air units, and reduces SAM Batteries down to only a 25% bonus. May carry two Bombs.
-
+
The deadliest Bomber, with improved attack and speed. Stealth Bombers cannot be seen unless adjacent to an enemy. Stealth evasion gives a 25% bonus against all Anti-Air units, and reduces SAM Batteries down to only a 25% bonus. May carry two Bombs.
+
 Stealth Bombers can Stack-Escape:a 67% chance to escape a killed stack if they have more remaining moves than the attacker.
NOTE: GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.

➤ Belongs to Air unit class. @@ -3225,7 +3261,7 @@

Stealth Bomber

• Not subject to zones of control. • Unreachable. Most units cannot attack this one. ◦ Doesn't prevent enemy units from attacking other units on its tile. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. ➤ +25% attack bonus when attacking Anti-Aircraft Artillery, Mobile SAM, or AEGIS Cruiser. ➤ +25% defense bonus if attacked by Anti-Aircraft Artillery, Mobile SAM, or AEGIS Cruiser. @@ -3269,7 +3305,7 @@

Boat

Firepower: 1
Hitpoints: 10
Obsolete by: Trireme
-
Boats were used pre-historically for exploration, transport, and interaction with other tribes. They can travel rivers and oceans, but must always stay near shore. Boats can carry one unit and do ancient commerce: building Wonders or setting up Trade Routes. Early bartering may help you advance faster or create relations with ancient neighbors.
+
Boats were used pre-historically for exploration, transport, and interaction with other tribes. They can travel rivers and oceans, but must always stay near shore. Boats can carry one unit and do ancient commerce: building Wonders or setting up Trade Routes. Early bartering may help you advance faster or create relations with ancient neighbors.
 
➤ Belongs to RiverShip unit class. • Speed is not affected by terrain. • Does not get defense bonuses from terrain. @@ -3284,14 +3320,11 @@

Boat

• Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. ➤ Never imposes a zone of control. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can Establish Trade Route • is done to foreign cities 15 or more tiles distant. • inactive during War. • uses up the Caravan. -➤ Can Enter Marketplace - • is done to foreign cities not at war. - • uses up the Caravan. ➤ Can Help Build Wonder • is done in friendly cities. Contributes the unit's shield cost to current production • uses up the Boat. @@ -3326,13 +3359,11 @@

Trireme

Firepower: 1
Hitpoints: 10
Obsolete by: Galley
-
Triremes are used for exploration, transport, and Commerce. The entry on Caravan explains what Commerce units may do.
+
Triremes are used for exploration, transport, and Commerce. The entry on Caravan explains what Commerce units may do.
 
-
-Triremes can enter Deep Ocean, but there is risk: they must end every second turn on river, coastline, or a city—or else be lost at sea. They can attack and travel on rivers, but cannot attack the shore.
+Triremes can enter Deep Ocean, but there is risk: they must end every second turn on river, coastline, or a city—or else be lost at sea. They can attack and travel on rivers, but cannot attack the shore.
 
-
-Like most ancient sea units, when it initiates combat there will be 15 rounds of combat and 15 total hp lost between both units. This may or may not result in a victor. Triremes do not cause unhappiness.
+Like most ancient sea units, when it initiates combat there will be 15 rounds of combat and 15 total hp lost between both units. This may or may not result in a victor. Triremes do not cause unhappiness.
 
➤ Belongs to Trireme unit class. • Speed is not affected by terrain. • Does not get defense bonuses from terrain. @@ -3343,14 +3374,12 @@

Trireme

➤ Can carry and refuel up to 2 Land, LandNoKill, or LandAirSea units. ➤ PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. ➤ May impose a zone of control on its adjacent tiles. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Unit must be next to safe coast, in a city or a base after 2 turns. ➤ Can Establish Trade Route • is done to foreign cities 15 or more tiles distant. • inactive during War. • uses up the Caravan. -➤ Can Enter Marketplace - • is done to foreign cities not at war. - • uses up the Caravan. ➤ Can Help Build Wonder • is done in friendly cities. Contributes the unit's shield cost to current production • uses up the Trireme. @@ -3386,10 +3415,9 @@

Longboat

Firepower: 1
Hitpoints: 10
Obsolete by: Caravel
-
The Longboat is a warship. It can attack at sea, attack the shore, and carry one land unit. It is useful for ancient sea campaigns. Longboats can travel on rivers.
+
The Longboat is a warship. It can attack at sea, attack the shore, and carry one land unit. It is useful for ancient sea campaigns. Longboats can travel on rivers.
 
-
-Like most early sea units, when it initiates combat there will be 15 rounds of combat and 15 total hp lost between both units. This may or may not result in the loss of one of the units.
+Like most early sea units, when it initiates combat there will be 15 rounds of combat and 15 total hp lost between both units. This may or may not result in the loss of one of the units.
 
➤ Belongs to RiverShip unit class. • Speed is not affected by terrain. • Does not get defense bonuses from terrain. @@ -3401,13 +3429,14 @@

Longboat

➤ Can carry and refuel 1 Land, LandNoKill, or LandAirSea unit. ➤ PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can Upgrade • upgrades to Caravel or, when possible, to the unit type it upgrades to. ➤ Attacking with fractional move points gives fractional attack power. ➤ May acquire veteran status. • Veterans have increased strength in combat. -Veteran Levels for Zeppelins: +Veteran Levels for Longboat:
@@ -3432,10 +3461,9 @@

Galley

Firepower: 1
Hitpoints: 10
Obsolete by: Caravel
-
The Galley is an all-purpose sea unit and upgrades the Trireme. It has decent combat strength, can transport, and is a Commerce unit. The entry on Caravan explains what Commerce units may do. Galleys can attack and travel on rivers, but cannot attack the shore. Galleys do not cause unhappiness.
+
The Galley is an all-purpose sea unit and upgrades the Trireme. It has decent combat strength, can transport, and is a Commerce unit. The entry on Caravan explains what Commerce units may do. Galleys can attack and travel on rivers, but cannot attack the shore. Galleys do not cause unhappiness.
 
-
-Like most early sea units, when it initiates an attack, there will be 15 rounds of combat and 15 total hp lost between both units. This may or may not result in the loss of one of the units.
+Like most early sea units, when it initiates an attack, there will be 15 rounds of combat and 15 total hp lost between both units. This may or may not result in the loss of one of the units.
 
➤ Belongs to RiverShip unit class. • Speed is not affected by terrain. • Does not get defense bonuses from terrain. @@ -3447,13 +3475,11 @@

Galley

➤ Can only attack units on native tiles. ➤ PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. ➤ May impose a zone of control on its adjacent tiles. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can Establish Trade Route • is done to foreign cities 15 or more tiles distant. • inactive during War. • uses up the Caravan. -➤ Can Enter Marketplace - • is done to foreign cities not at war. - • uses up the Caravan. ➤ Can Help Build Wonder • is done in friendly cities. Contributes the unit's shield cost to current production • uses up the Galley. @@ -3489,10 +3515,9 @@

War Galley

Firepower: 1
Hitpoints: 10
Obsolete by: Caravel
-
The War Galley has improved offense, defense, and cargo capacity, but lacks commerce ability. War Galleys can attack and travel on rivers, and do shore attacks from the sea.
+
The War Galley has improved offense, defense, and cargo capacity, but lacks commerce ability. War Galleys can attack and travel on rivers, and do shore attacks from the sea.
 
-
-Like most ancient sea units, when it initiates combat there will be 15 rounds of combat and 15 total hitpoints lost between both units. This may or may not result in the loss of one of the units.
+Like most ancient sea units, when it initiates combat there will be 15 rounds of combat and 15 total hitpoints lost between both units. This may or may not result in the loss of one of the units.
 
➤ Belongs to RiverShip unit class. • Speed is not affected by terrain. • Does not get defense bonuses from terrain. @@ -3504,6 +3529,7 @@

War Galley

➤ Can carry and refuel up to 3 Land, LandNoKill, or LandAirSea units. ➤ PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can Upgrade • upgrades to Caravel or, when possible, to the unit type it upgrades to. ➤ Attacking with fractional move points gives fractional attack power. @@ -3535,7 +3561,7 @@

Ram Ship

Firepower: 1
Hitpoints: 10
Obsolete by: Caravel
-
The Ram Ship has one purpose:to destroy other ships. It has poor vision, and no transport or commerce ability. Unlike other early ships, there will always be a winner and a loser when Ram Ships attack. They are good for first-strike, and are good counter units for nations not invested into sea tech. Ram Ships cannot do shore attacks.
+
The Ram Ship has one purpose:to destroy other ships. It has poor vision, and no transport or commerce ability. Unlike other early ships, there will always be a winner and a loser when Ram Ships attack. They are good for first-strike, and are good counter units for nations not invested into sea tech. Ram Ships cannot do shore attacks.
 
➤ Belongs to Sea unit class. • Speed is not affected by terrain. • Does not get defense bonuses from terrain. @@ -3545,6 +3571,7 @@

Ram Ship

➤ Can only attack units on native tiles. ➤ PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can Upgrade • upgrades to Caravel or, when possible, to the unit type it upgrades to. ➤ Attacking with fractional move points gives fractional attack power. @@ -3577,10 +3604,9 @@

Caravel

Firepower: 1
Hitpoints: 10
Obsolete by: Galleon
-
Caravels upgrade older sea units, and are a big advance in combat, speed, range, and transport capacity. They have the commerce ability of the Galley, but cannot build Wonders. Caravels can attack and travel on rivers and do shore attacks. As a Commerce unit, the Caravel does not cause unhappiness.
+
Caravels upgrade older sea units, and are a big advance in combat, speed, range, and transport capacity. They have the commerce ability of the Galley, but cannot build Wonders. Caravels can attack and travel on rivers and do shore attacks. As a Commerce unit, the Caravel does not cause unhappiness.
 
-
-Like most early sea units, when it initiates an attack, there will be 15 rounds of combat and 15 total hitpoints lost between both units. This may or may not result in the loss of one of the units.
+Like most early sea units, when it initiates an attack, there will be 15 rounds of combat and 15 total hitpoints lost between both units. This may or may not result in the loss of one of the units.
 
➤ Belongs to RiverShip unit class. • Speed is not affected by terrain. • Does not get defense bonuses from terrain. @@ -3592,13 +3618,11 @@

Caravel

➤ Can carry and refuel up to 3 Land, LandNoKill, or LandAirSea units. ➤ PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. ➤ May impose a zone of control on its adjacent tiles. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can Establish Trade Route • is done to foreign cities 15 or more tiles distant. • inactive during War. • uses up the Caravan. -➤ Can Enter Marketplace - • is done to foreign cities not at war. - • uses up the Caravan. ➤ Can Upgrade • upgrades to Galleon or, when possible, to the unit type it upgrades to. ➤ Attacking with fractional move points gives fractional attack power. @@ -3630,13 +3654,11 @@

Galleon

Firepower: 1
Hitpoints: 20
Obsolete by: Transport
-
The Galleon is a heavily armed transport ship that can carry up to 4 units. Galleons can attack and travel on rivers, and also do shore attacks. Galleon crews repair their ship an extra +1hp per turn, regardless of whether it has moved. Although the Galleon is not a Commerce unit, it retains one vestige of the commercial abilities for the ships it upgrades. It can enter Peace waters to deliver commercial cargo, and does not cause unhappiness.
+
The Galleon is a heavily armed transport ship that can carry up to 4 units. Galleons can attack and travel on rivers, and also do shore attacks. Galleon crews repair their ship an extra +1hp per turn, regardless of whether it has moved. Although the Galleon is not a Commerce unit, it retains one vestige of the commercial abilities for the ships it upgrades. It can enter Peace waters to deliver commercial cargo, and does not cause unhappiness.
 
-
-Like most early sea units, when it initiates combat there will be 15 rounds of combat and 15 total hitpoints lost between both units. This may or may not result in the loss of one of the units.
+Like most early sea units, when it initiates combat there will be 15 rounds of combat and 15 total hitpoints lost between both units. This may or may not result in the loss of one of the units.
 
-
-Galleons can Stack-Escape: a 60% chance to escape a killed stack if they have more remaining moves than the attacker.
+Galleons can Stack-Escape: a 60% chance to escape a killed stack if they have more remaining moves than the attacker.
 
➤ Belongs to RiverShip unit class. • Speed is not affected by terrain. • Does not get defense bonuses from terrain. @@ -3649,6 +3671,7 @@

Galleon

➤ Can carry and refuel up to 4 Land, LandNoKill, LandAirSea, or Balloon units. ➤ PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. ➤ May impose a zone of control on its adjacent tiles. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can attack against Submarine units, which are usually not reachable. ➤ Can Upgrade • upgrades to Transport. @@ -3681,10 +3704,9 @@

Frigate

Firepower: 1
Hitpoints: 20
Obsolete by: Ironclad
-
The Frigate is versatile — it's a superior offensive unit and also a decent transport ship. Frigates can attack and travel on rivers, or make shore attacks from sea. Frigate crews repair their ship an extra +1hp per turn, regardless of whether it has moved.
+
The Frigate is versatile — it's a superior offensive unit and also a decent transport ship. Frigates can attack and travel on rivers, or make shore attacks from sea. Frigate crews repair their ship an extra +1hp per turn, regardless of whether it has moved.
 
-
-From Frigates onward, all sea attacks end with a single victor. Frigates can Stack-Escape: a 60% chance to escape a killed stack if they have more remaining move points than the attacker.
+From Frigates onward, all sea attacks end with a single victor. Frigates can Stack-Escape: a 60% chance to escape a killed stack if they have more remaining move points than the attacker.
 
➤ Belongs to RiverShip unit class. • Speed is not affected by terrain. • Does not get defense bonuses from terrain. @@ -3698,6 +3720,7 @@

Frigate

➤ Can carry and refuel up to 2 Land, LandNoKill, or LandAirSea units. ➤ PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can attack against Submarine units, which are usually not reachable. ➤ Can Upgrade • upgrades to Ironclad or, when possible, to the unit type it upgrades to. @@ -3730,7 +3753,7 @@

Cargo Ship

Firepower: 1
Hitpoints: 30
Obsolete by: None
-
Cargo ships are Commerce units: they can establish Trade Routes and help build Wonders. They can travel rivers and oceans. Cargo ships can also carry four land units: thus, they are useful for transporting units by river or sea.
+
Cargo ships are Commerce units: they can establish Trade Routes and help build Wonders. They can travel rivers and oceans. Cargo ships can also carry four land units: thus, they are useful for transporting units by river or sea.
 
➤ Belongs to RiverShip unit class. • Speed is not affected by terrain. • Does not get defense bonuses from terrain. @@ -3745,14 +3768,11 @@

Cargo Ship

• Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can Establish Trade Route • is done to foreign cities 15 or more tiles distant. • inactive during War. • uses up the Caravan. -➤ Can Enter Marketplace - • is done to foreign cities not at war. - • uses up the Caravan. ➤ Can Help Build Wonder • is done in friendly cities. Contributes the unit's shield cost to current production • uses up the Cargo Ship. @@ -3772,7 +3792,7 @@

Transport

Firepower: 1
Hitpoints: 30
Obsolete by: None
-
The Transport cannot attack but can defend itself when under attack. Marines and Anti-Aircraft Artillery can directly attack from a Transport. Its large cargo capacity makes it a significant logistical upgrade for sea transportation. The Transport is considered a military vessel: unwelcome in the waters of nations with whom you are at Peace. Transports do not cause unhappiness.
+
The Transport cannot attack but can defend itself when under attack. Marines and Anti-Aircraft Artillery can directly attack from a Transport. Its large cargo capacity makes it a significant logistical upgrade for sea transportation. The Transport is considered a military vessel: unwelcome in the waters of nations with whom you are at Peace. Transports do not cause unhappiness.
 
➤ Belongs to Sea unit class. • Crew Repair: each turn, regardless of movement, recovers 2 hit points. • Speed is not affected by terrain. @@ -3784,6 +3804,7 @@

Transport

➤ Can carry and refuel up to 8 Land, LandNoKill, LandAirSea, or Balloon units. ➤ PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working its tile. ➤ Can Pillage ➤ May acquire veteran status. • Veterans have increased strength in combat. @@ -3813,10 +3834,9 @@

Ironclad

Firepower: 1
Hitpoints: 30
Obsolete by: Destroyer
-
The Ironclad is an armored ship that is much more sturdy than the Frigate but loses transport capability and the ability to navigate rivers. From the Ironclad onward, warships are excellent at attacking shore targets, and can also pillage buoys.
+
The Ironclad is an armored ship that is much more sturdy than the Frigate but loses transport capability and the ability to navigate rivers. From the Ironclad onward, warships are excellent at attacking shore targets, and can also pillage buoys.
 
-
-Ironclads and all modern ships can Stack-Escape: a 60% chance to escape a killed stack if they have more remaining move points than the attacker.
+Ironclads and all modern ships can Stack-Escape: a 60% chance to escape a killed stack if they have more remaining move points than the attacker.
 
➤ Belongs to Sea unit class. • Crew Repair: each turn, regardless of movement, recovers 2 hit points. • Speed is not affected by terrain. @@ -3830,6 +3850,7 @@

Ironclad

Unable to attack air units.PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can attack against Submarine units, which are usually not reachable. ➤ Can attack against Helicopter units, which are usually not reachable. ➤ Can Upgrade @@ -3864,7 +3885,7 @@

Destroyer

Firepower: 1
Hitpoints: 30
Obsolete by: Missile Destroyer
-
Destroyers are the first of the modern ships to start your modern navy. Their main roles are fast scouting, seek-and-destroy, anti-submarine warfare, shore bombardment of lighter targets, and supporting the needs of larger fleets. 4× ASW defence gives a 35% chance defending vs Submarines.
+
Destroyers are the first of the modern ships to start your modern navy. Their main roles are fast scouting, seek-and-destroy, anti-submarine warfare, shore bombardment of lighter targets, and supporting the needs of larger fleets. 4× ASW defence gives a 35% chance defending vs Submarines.
 Destroyers can Stack-Escape:a 67% chance to escape a killed stack if they have more remaining move points than the attacker.
 
➤ Belongs to Sea unit class. • Crew Repair: each turn, regardless of movement, recovers 2 hit points. @@ -3880,6 +3901,7 @@

Destroyer

Unable to attack air units.PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can attack against Submarine units, which are usually not reachable. ➤ Can attack against Helicopter units, which are usually not reachable. ➤ Can Upgrade @@ -3914,8 +3936,8 @@

Cruiser

Firepower: 2
Hitpoints: 30
Obsolete by: AEGIS Cruiser
-
The Cruiser is a large and fast surface warship with equally strong offensive and defensive strength. More often than not, its 2× ASW defence allows it to survive a Submarine attack.
-The main duties of the Cruiser are offensive strikes against lesser ships, and escorting weaker ships.
+
The Cruiser is a large and fast surface warship with equally strong offensive and defensive strength. More often than not, its 2× ASW defence allows it to survive a Submarine attack.
+The main duties of the Cruiser are offensive strikes against lesser ships, and escorting weaker ships.
 
➤ Belongs to Sea unit class. • Crew Repair: each turn, regardless of movement, recovers 2 hit points. • Speed is not affected by terrain. @@ -3930,6 +3952,7 @@

Cruiser

Unable to attack air units.PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can attack against Submarine units, which are usually not reachable. ➤ Can attack against Helicopter units, which are usually not reachable. ➤ Can Upgrade @@ -3964,7 +3987,7 @@

Missile Destroyer

Firepower: 2
Hitpoints: 30
Obsolete by: None
-
The Missile Destroyer has double the firepower of a Destroyer, and shares the same roles as its ancestor. It gains 2× defense against Air and Missile units. It has a 2× ASW bonus and can can carry one Missile.
+
The Missile Destroyer has double the firepower of a Destroyer, and shares the same roles as its ancestor. It gains 2× defense against Air and Missile units. It has a 2× ASW bonus and can carry one Missile.
 Missile Destroyers can Stack-Escape:a 67% chance to escape a killed stack if they have more remaining move points than the attacker.
 
➤ Belongs to Sea unit class. • Crew Repair: each turn, regardless of movement, recovers 2 hit points. @@ -3982,6 +4005,7 @@

Missile Destroyer

➤ Can carry and refuel 1 Missile unit. ➤ PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can attack against Submarine units, which are usually not reachable. ➤ Can attack against Helicopter units, which are usually not reachable. ➤ Attacking with fractional move points gives fractional attack power. @@ -4014,8 +4038,8 @@

AEGIS Cruiser

Firepower: 2
Hitpoints: 30
Obsolete by: None
-
The AEGIS Cruiser has an Anti-Air missile system. Radar and sonar give superior vision and 2× defense bonus against Submarines. The AEGIS can carry two Missiles, and is the only ship that can attack Air and Missile units.
-Excellent vision and 3× Anti-Air bonus are ideal for scouting and escorting.
+
The AEGIS Cruiser has an Anti-Air missile system. Radar and sonar give superior vision and 2× defense bonus against Submarines. The AEGIS can carry two Missiles, and is the only ship that can attack Air and Missile units.
+Excellent vision and 3× Anti-Air bonus are ideal for scouting and escorting.
 
➤ Belongs to Sea unit class. • Crew Repair: each turn, regardless of movement, recovers 2 hit points. • Speed is not affected by terrain. @@ -4032,6 +4056,7 @@

AEGIS Cruiser

➤ Can carry and refuel up to 2 Missile units. ➤ PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on.Can attack against Aircraft, Helicopter, or Missile units, which are usually not reachable. ➤ Can attack against Submarine units, which are usually not reachable. ➤ Attacking with fractional move points gives fractional attack power. @@ -4064,7 +4089,7 @@

Battleship

Firepower: 2
Hitpoints: 40
Obsolete by: None
-
The Battleship is the supreme naval unit with excellent offensive and defensive strength. It has a 2× defense bonus vs Submarines. Battleships may expend 5 move points to do a 3 round bombardment which hits up to 4 units within a stack, of which only a maximum of one can be killed. Defending Battleships get a free bombardment against Special Unit Attacks.
+
The Battleship is the supreme naval unit with excellent offensive and defensive strength. It has a 2× defense bonus vs Submarines. Battleships may expend 5 move points to do a 3 round bombardment which hits up to 4 units within a stack, of which only a maximum of one can be killed. Defending Battleships get a free bombardment against Special Unit Attacks.
 
➤ Belongs to Sea unit class. • Crew Repair: each turn, regardless of movement, recovers 3 hit points. • Speed is not affected by terrain. @@ -4079,6 +4104,7 @@

Battleship

Unable to attack air units.PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Has Special Defense against Special Attacks / Ranged Attacks. • Gives 3 free rounds of combat against up to 4 units in an enemy stack. • A maximum of 1 unit can be killed. @@ -4119,9 +4145,9 @@

Submarine

Firepower: 2
Hitpoints: 28
Obsolete by: None
-
Submarines are strong attackers but weak defenders. They can carry 8 Missiles. They are unreachable by Air units, but do not block air attacks on surface ships. Submarines cannot attack units on shore. Submarines cannot be seen by other players unless they have a unit or city adjacent to it.
+
Submarines are strong attackers but weak defenders. They can carry 8 Missiles. They are unreachable by Air units, but do not block air attacks on surface ships. Submarines cannot attack units on shore. Submarines cannot be seen by other players unless they have a unit or city adjacent to it.
 
-Submarines have superior attrition rates when attacking in numbers. They excel at hit-and-run against weaker ships.
+Submarines have superior attrition rates when attacking in numbers. They excel at hit-and-run against weaker ships.
 Submarines can Stack-Escape:a 75% chance to escape a killed stack if they have more remaining move points than the attacker.
 
➤ Belongs to Submarine unit class. • Invisible except when next to an enemy unit or city. @@ -4141,6 +4167,7 @@

Submarine

➤ Can only attack units on native tiles. ➤ PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can attack against Submarine units, which are usually not reachable. ➤ Attacking with fractional move points gives fractional attack power. ➤ Can Pillage @@ -4173,8 +4200,8 @@

Carrier

Firepower: 2
Hitpoints: 40
Obsolete by: None
-
The Carrier is a mobile airport that can carry Air units, Helicopters, AAA, Marines, and Missiles. Fighters can Vigil on a Carrier if they have enough moves and the Carrier has not moved since the Vigil order was given.
-Carriers are very expensive and thus, usually protected by a fleet of scouts and escorts.
+
The Carrier is a mobile airport that can carry Air units, Helicopters, AAA, Marines, and Missiles. Fighters can Vigil on a Carrier if they have enough moves and the Carrier has not moved since the Vigil order was given.
+Carriers are very expensive and thus, usually protected by a fleet of scouts and escorts.
 
➤ Belongs to Sea unit class. • Crew Repair: each turn, regardless of movement, recovers 3 hit points. • Speed is not affected by terrain. @@ -4185,10 +4212,11 @@

Carrier

2× defense bonus if attacked by Marines or Anti-Aircraft Artillery. ➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if it has more moves left than attacker. ➤ Unable to attack air units. -➤ Can carry and refuel up to 9 Missile, LandAirSea, Helicopter, Air, AirPillage, AirProtect, or Balloon units. +➤ Can carry and refuel up to 10 Missile, LandAirSea, Helicopter, Air, Air_High_Altitude, AirProtect, or Balloon units. ➤ Can only attack units on native tiles. ➤ PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can attack against Submarine units, which are usually not reachable. ➤ Can attack against Helicopter units, which are usually not reachable. ➤ Attacking with fractional move points gives fractional attack power. @@ -4221,14 +4249,14 @@

Cruise Missile

Firepower: 3
Hitpoints: 10
Obsolete by: None
-
A Cruise Missile can strike distant targets. It cannot attack Air units, but Air units never block a strike on reachable surface units. Cruise Missiles can be relocated by ending their turn on a city, airbase, Submarine, Missile Destroyer, AEGIS Cruiser, Carrier, or Mobile SAM. A Cruise Missile cannot block attacks on other units on its tile.
+
A Cruise Missile can strike distant targets. It cannot attack Air units, but Air units never block a strike on reachable surface units. Cruise Missiles can be relocated by ending their turn on a city, airbase, Submarine, Missile Destroyer, AEGIS Cruiser, Carrier, or Mobile SAM. A Cruise Missile cannot block attacks on other units on its tile.
 
➤ Belongs to Missile unit class. • Speed is not affected by terrain. • Does not get defense bonuses from terrain. • Not subject to zones of control. • Unreachable. Most units cannot attack this one. ◦ Doesn't prevent enemy units from attacking other units on its tile. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. ➤ Unblockable: unreachable units can't block its attacks on reachable units. ➤ AEGIS and Armor II have a defense bonus against this unit. @@ -4257,14 +4285,14 @@

Atom Bomb

Firepower: 1
Hitpoints: 10
Obsolete by: None
-
If you have Nuclear Fission and the Manhattan Project has been built by any player, you can make Atom Bombs. A Bomber can drop it within two tiles of its location. Unload the bomb and fly the Bomber out of range, then attack the target (or detonate by pressing D twice.) The blast destroys ALL cardinally adjacent tiles. City population is reduced by half. Land tiles may get nuclear fallout.
-Fallout reduces tile output and increases risk of nuclear winter.
+
If you have Nuclear Fission and the Manhattan Project has been built by any player, you can make Atom Bombs. A Bomber can drop it within two tiles of its location. Unload the bomb and fly the Bomber out of range, then attack the target (or detonate by pressing D twice.) The blast destroys ALL cardinally adjacent tiles. City population is reduced by half. Land tiles may get nuclear fallout.
+Fallout reduces tile output and increases risk of nuclear winter.
 
➤ Belongs to Bomb unit class. • Speed is not affected by terrain. • Not subject to zones of control. • Unreachable. Most units cannot attack this one. ◦ Doesn't prevent enemy units from attacking other units on its tile. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. ➤ Unblockable: unreachable units can't block its attacks on reachable units. ➤ Can perform a Nuclear Detonation obliterating all cardinally adjacent tiles. @@ -4294,16 +4322,16 @@

Hydrogen Bomb

Firepower: 1
Hitpoints: 10
Obsolete by: None
-
Hydrogen Bombs make Atom Bombs seem tame. Any unprotected city at Ground Zero will be absolutely annihilated. In other cities in the blast radius, population is reduced by about 75%. Blast area is 21 tiles: the same area as an entire city (5×5 minus the corners.) All units within the blast are destroyed.
+
Hydrogen Bombs make Atom Bombs seem tame. Any unprotected city at Ground Zero will be absolutely annihilated. In other cities in the blast radius, population is reduced by about 75%. Blast area is 21 tiles: the same area as an entire city (5×5 minus the corners.) All units within the blast are destroyed.
 A Bomber can drop a Hydrogen Bomb within two tiles of its location. Unload the bomb, fly the Bomber out of range, then detonate by pressing D twice.
 If you have Fusion Power and the Manhattan Project was built, a Hydrogen Bomb can be made in a city with an Enrichment Facility. 
-Fallout from a Hydrogen Bomb is grave, with more than double the contaminated area.
+Fallout from a Hydrogen Bomb is grave, with more than double the contaminated area.
 
➤ Belongs to Bomb unit class. • Speed is not affected by terrain. • Not subject to zones of control. • Unreachable. Most units cannot attack this one. ◦ Doesn't prevent enemy units from attacking other units on its tile. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. ➤ Can only be built if there is Enrichment Facility in the city. ➤ Unblockable: unreachable units can't block its attacks on reachable units. @@ -4334,16 +4362,16 @@

Doomsday Bomb

Firepower: 1
Hitpoints: 30
Obsolete by: None
-
The Doomsday Bomb is the mother of all bombs. Blast area is about 100 tiles. Only one can be made at a time. A city at Ground Zero will be annihilated. Other cities in the blast area lose about 75% of their population. All units within the blast are completely destroyed.
+
The Doomsday Bomb is the mother of all bombs. Blast area is about 100 tiles. Only one can be made at a time. A city at Ground Zero will be annihilated. Other cities in the blast area lose about 75% of their population. All units within the blast are completely destroyed.
 A Bomber can drop the Bomb within two tiles of its location. Unload the Bomb and pray that you can fly the Bomber out of range. Detonate by pressing D twice.
 If you have Fusion Power and the Manhattan Project was built, a Doomsday Bomb can be made in a city with an Enrichment Facility. 
-The Fallout from a Doomsday Bomb is a sure ticket to Nuclear Winter.
+The Fallout from a Doomsday Bomb is a sure ticket to Nuclear Winter.
 
➤ Belongs to Bomb unit class. • Speed is not affected by terrain. • Not subject to zones of control. • Unreachable. Most units cannot attack this one. ◦ Doesn't prevent enemy units from attacking other units on its tile. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. ➤ Can only be built if there is Enrichment Facility in the city. ➤ Unblockable: unreachable units can't block its attacks on reachable units. @@ -4376,15 +4404,15 @@

Nuclear Missile

Firepower: 1
Hitpoints: 10
Obsolete by: None
-
If you have Space Flight and the Manhattan Project has been built by any player, you can make Nuclear Missiles. Nuclear blasts destroy ALL units in a 3×3 area. City population is reduced by half. Land tiles may get nuclear fallout. Fallout reduces tile output and increases risk of nuclear winter.
-If Fallout is cleaned on the turn it appears, the chance of nuclear winter is reduced.
+
If you have Space Flight and the Manhattan Project has been built by any player, you can make Nuclear Missiles. Nuclear blasts destroy ALL units in a 3×3 area. City population is reduced by half. Land tiles may get nuclear fallout. Fallout reduces tile output and increases risk of nuclear winter.
+If Fallout is cleaned on the turn it appears, the chance of nuclear winter is reduced.
 
➤ Belongs to Missile unit class. • Speed is not affected by terrain. • Does not get defense bonuses from terrain. • Not subject to zones of control. • Unreachable. Most units cannot attack this one. ◦ Doesn't prevent enemy units from attacking other units on its tile. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. ➤ Unblockable: unreachable units can't block its attacks on reachable units. ➤ Can perform a Nuclear Detonation obliterating all adjacent tiles. @@ -4414,7 +4442,7 @@

Tactical Nuke

Firepower: 1
Hitpoints: 10
Obsolete by: None
-
Tactical Nukes are very small warheads attached to missiles. A Tactical Nuke destroys all units on a single tile. City population is reduced by half. The target tile may get Fallout. In theory, Tactical Nukes are small enough to get the advantages of nuclear armaments without the severity of consequences. In reality, they might be a gateway that escalates toward mutual assured destruction.
+
Tactical Nukes are very small warheads attached to missiles. A Tactical Nuke destroys all units on a single tile. City population is reduced by half. The target tile may get Fallout. In theory, Tactical Nukes are small enough to get the advantages of nuclear armaments without the severity of consequences. In reality, they might be a gateway that escalates toward mutual assured destruction.
 If you have Fusion Power and the Manhattan Project was built, a Tactical Nuke can be made in a city with an Enrichment Facility. 
 
➤ Belongs to Missile unit class. • Speed is not affected by terrain. @@ -4422,7 +4450,7 @@

Tactical Nuke

• Not subject to zones of control. • Unreachable. Most units cannot attack this one. ◦ Doesn't prevent enemy units from attacking other units on its tile. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. ➤ Can only be built if there is Enrichment Facility in the city. ➤ Unblockable: unreachable units can't block its attacks on reachable units. @@ -4451,7 +4479,7 @@

Diplomat

Attack: 0
Defense: 0
Firepower: 1
-
Hitpoints: 10
+
Hitpoints: 8
Obsolete by: Spy
A Diplomat performs official or covert actions. Covert actions make incidents which let Senates break treaties. Diplomats in cities may defend such acts with diplomatic combat. Diplomats can • Bribe a lone unit • Establish embassy • Investigate City • Sabotage random production or buildings • Steal tech • Steal maps • Incite city revolt.
 Except for Bribing and Investigate City, diplomatic actions will spend the Diplomat, making it unavailable for further use. Diplomats may claim a tile for your nation if adjacent to a tile claim made inside your own national border. Foreign tile claims require the Diplomat be accompanied by another unit.
@@ -4468,7 +4496,7 @@ 

Diplomat

• Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can do Diplomatic Operations: • uses up the Diplomat. • is done to foreign cities. @@ -4518,10 +4546,10 @@

Spy

Attack: 0
Defense: 0
Firepower: 1
-
Hitpoints: 10
+
Hitpoints: 8
Obsolete by: None
-
Spies can do what a Diplomat can, and also: • Survive ops • Sabotage lone units • Poison city water • Steal specific tech • Steal tech from cities more than once • Sabotage specific targets in cities.
-Spies who survive ops escape to the nearest friendly city. Spies have a 25% advantage over Diplomats in combat: a base 75% chance to win. Spies may claim a tile for your nation if adjacent to a tile claim made inside your own national border. Tile claims require the Spy to be accompanied by a military unit. Full rules are in the Manual.
+
Spies can do what a Diplomat can, and also: • Survive ops • Sabotage lone units • Poison city water • Steal specific tech • Steal tech from cities more than once • Sabotage specific targets in cities.
+Spies who survive ops escape to the nearest friendly city. Spies have a 25% advantage over Diplomats in combat: a base 75% chance to win. Spies may claim a tile for your nation if adjacent to a tile claim made inside your own national border. Tile claims require the Spy to be accompanied by another unit. Full rules are in the Manual.
 
➤ Belongs to Land unit class. • Slowed down while damaged. • AIRLIFT: Can be airlifted if it has remaining moves. @@ -4534,7 +4562,7 @@

Spy

• Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can do Diplomatic Operations: • is done to foreign cities. * 'Establish Embassy' @@ -4594,7 +4622,6 @@

Caravan

Compared to other early Commerce units, the Caravan is the only one who can travel by land off roads and rails, and cause no military threat to trade partners. It can defend itself and also fortify. They have 2 7/9 moves.
  
 Commerce units can help build Wonders in any city with whom you are not at war. In foreign cities 20+ tiles distant, they can create Trade Routes, increasing net trade in both cities relative to their combined trade. Routes are inactive during war and (re)activate during peace.
-Commerce units can enter the Marketplace of non-hostile foreign cities to sell their wares:revenue derives from total trade in both cities. This is only profitable between cities with very high trade.
 Commerce units can build any Wonders for which you have the tech requirement. To use them for a Trade Route, they need to have given a Home City.
 All Commerce units can carry Goods as cargo.
   
➤ Belongs to Land unit class. @@ -4604,19 +4631,15 @@

Caravan

➤ Can carry up to 2 Cargo units. ➤ Never imposes a zone of control. ➤ Not subject to zones of control imposed by other units. -➤ Under certain conditions, cities can make more than one of this unit per turn, plus one of any other unit type. ➤ A non-military unit: • Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can Establish Trade Route • is done to foreign cities 15 or more tiles distant. • inactive during War. • uses up the Caravan. -➤ Can Enter Marketplace - • is done to foreign cities not at war. - • uses up the Caravan. ➤ Can Help Build Wonder • is done in friendly cities. Contributes the unit's shield cost to current production • uses up the Caravan. @@ -4647,10 +4670,9 @@

Wagon

Firepower: 1
Hitpoints: 10
Obsolete by: Truck
-
Wagons are the first Commerce unit that can travel by land. Compared to a Caravan, they are defenseless. They must stay on roads and quays. Wagons are useful for transporting slower units. Wagons have 3⅓ move points, giving a range of 10 tiles on roads. 
+
Wagons are the first Commerce unit that can travel by land. Compared to a Caravan, they are defenseless. They must stay on roads and quays. Wagons are useful for transporting slower units. Wagons have 3⅓ move points, giving a range of 10 tiles on roads. 
  
-
-Wagons allow units with less than 3 move points to travel your roads faster. Any cargo can board a Wagon anywhere; but needs a city, quay, or base to deboard. Cargo can disembark anywhere, but it uses up all move points. 
+Wagons allow units with less than 3 move points to travel your roads faster. Any cargo can board a Wagon anywhere; but needs a city, quay, or base to deboard. Cargo can disembark anywhere, but it uses up all move points. 
 Read the help on Caravans to see what Commerce units can do.
 
➤ Belongs to LandRoad unit class. • Only able to move on road tiles. @@ -4667,15 +4689,12 @@

Wagon

• is done to foreign cities 15 or more tiles distant. • inactive during War. • uses up the Wagon. -➤ Can Enter Marketplace - • is done to foreign cities not at war. - • uses up the Wagon. ➤ Never imposes a zone of control. ➤ A non-military unit: • Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.Capturable: can be captured if conditions allow it. ➤ Expellable: can be expelled from foreign tiles. ➤ Can Upgrade @@ -4695,7 +4714,7 @@

Train

Firepower: 1
Hitpoints: 30
Obsolete by: None
-
Trains are Commerce units with a bonus:they allow units with less than 3 move points to travel your rails at distances comparable to other units. Transport logistics for Trains are more restricted than for Wagons and Trucks. Except for Foot soldiers, all units need to be in a city to get on or off a Train. 
+
Trains are Commerce units with a bonus:they allow units with less than 3 move points to travel your rails at distances comparable to other units. Transport logistics for Trains are more restricted than for Wagons and Trucks. Except for Foot soldiers, all units need to be in a city to get on or off a Train. 
 Foot Soldiers use Trains the same as Wagons and Trucks, and can: 
   1. Board anywhere; 
   2. Deboard in a Base or Quay.; 
@@ -4720,15 +4739,12 @@ 

Train

• is done to foreign cities 15 or more tiles distant. • inactive during War. • uses up the Train. -➤ Can Enter Marketplace - • is done to foreign cities not at war. - • uses up the Train. ➤ Never imposes a zone of control. ➤ A non-military unit: • Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.Capturable: can be captured if conditions allow it. ➤ Will never achieve veteran status.
@@ -4745,9 +4761,9 @@

Truck

Firepower: 1
Hitpoints: 20
Obsolete by: None
-
The Truck replaces the Caravan as the basic Commerce unit on Land. It moves at more than twice the speed; but is restricted to the same roads and quays as Wagons, and can't use rails. Each Truck used to build a Wonder will add 50 shields. See the entry on Caravan to read what Commerce units may do. 
+
The Truck replaces the Caravan as the basic Commerce unit on Land. It moves at more than twice the speed; but is restricted to the same roads and quays as Wagons, and can't use rails. Each Truck used to build a Wonder will add 50 shields. See the entry on Caravan to read what Commerce units may do. 
 
-Trucks allow units with less than 3 move points to travel your roads faster: Like the Wagon, any cargo can board a Truck anywhere, but a city, quay, or base is needed to deboard. Disembarking is legal for all cargo types, but uses up all moves (except Marines.)
+Trucks allow units with less than 3 move points to travel your roads faster: Like the Wagon, any cargo can board a Truck anywhere, but a city, quay, or base is needed to deboard. Disembarking is legal for all cargo types, but uses up all moves (except Marines.)
 
➤ Belongs to LandRoad unit class. • Can only travel on roads. • Slowed down while damaged. @@ -4755,23 +4771,15 @@

Truck

• Units with less than 3 moves: e.g., Foot Soldier, Artillery, Workers, Caravan, Freight, Bomb units. • Some cargo cannot be loaded/unloaded except in a City. ➤ Never imposes a zone of control. -➤ Not subject to zones of control imposed by other units. -➤ Can Help Build Wonder - • is done in friendly cities. Contributes the unit's shield cost to current production - • uses up the Truck. - • adds 35 production. ➤ A non-military unit: • Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can Establish Trade Route • is done to foreign cities 15 or more tiles distant. • inactive during War. • uses up the Truck. -➤ Can Enter Marketplace - • is done to foreign cities not at war. - • uses up the Truck. ➤ Can Help Build Wonder • is done in friendly cities. Contributes the unit's shield cost to current production • uses up the Truck. @@ -4795,9 +4803,9 @@

Goods

Hitpoints: 1
Obsolete by: Freight
Goods are commodities. The cargo containers of the ancient world were amphorae, which carried for trade goods.
-Goods can be used to establish Trade Route or Enter Marketplace. They can be carried by Commerce units, allowing you to establish multiple trade routes in one voyage. Also, Goods can Recycle Production with only a 25% penalty, rendering 19 shields into a city production target.
+Goods can be used to establish Trade Route. They can be carried by Commerce units, allowing you to establish multiple trade routes in one voyage. Also, Goods can Recycle Production with only a 25% penalty, rendering 19 shields into a city production target.
 
-By themselves, Goods can only move onto tiles with a City, Quay, Fortress, or Naval Base. Commerce units, Tribesmen, and Galleons may carry them as cargo. If adjacent to a foreign city, use the D command (D) for Commerce functions.
+By themselves, Goods can only move onto tiles with a City, Quay, Fortress, Airbase, or Naval Base. Commerce units, Tribesmen, and Galleons may carry them as cargo. If adjacent to a foreign city, use the D command (D) for Commerce functions.
 
➤ Belongs to Cargo unit class. • Is NOT a unit. It is goods and materials for production and commerce. • Only able to move onto Cities, Quays, Fortresses, and Naval Bases. @@ -4815,9 +4823,6 @@

Goods

• is done to foreign cities 15 or more tiles distant. • inactive during War. • uses up the Goods. -➤ Can Enter Marketplace - • is done to foreign cities not at war. - • uses up the Goods. ➤ Can Upgrade • upgrades to Freight. ➤ Capturable: can be captured if conditions allow it. @@ -4836,38 +4841,31 @@

Freight

Firepower: 1
Hitpoints: 1
Obsolete by: None
-
The methodical logistics of modern shipping render the Freight unit: a cargo container separate from the transport vehicle. Freight brings benefits of organized efficiency. Like all Commerce units, it can Help Build Wonders, and Establish Trade Route or Enter Marketplace (with a lower unit cost.) Unlike other Commerce units, it can Disband to Recycle Production with no net loss in shields. This gives Freight a variety of creative industrial uses. 
+
The methodical logistics of modern shipping render the Freight unit: a cargo container separate from the transport vehicle. Freight brings benefits of organized efficiency. Like all Commerce units, it can Help Build Wonders, and Establish Trade Route. Unlike other Commerce units, it can Disband to Recycle Production with no net loss in shields. This gives Freight a variety of creative industrial uses. 
 
-By itself, Freight is only able to move to tiles with loading infrastructure: Cities, Quays, Fortresses, and Naval Bases. To be transported, it must be carried by Train, Truck, Airplane, or ship. If adjacent to a foreign city, use the D key to do Commerce functions.
+By itself, Freight is only able to move to tiles with loading infrastructure: Cities, Quays, Fortresses, Airbases, and Naval Bases. To be transported, it must be carried by Train, Truck, Airplane, or ship. If adjacent to a foreign city, use the D key to do Commerce functions.
 
➤ Belongs to Cargo class. • Is NOT a unit. It is goods and materials for production and commerce. • Only able to move onto Cities, Quays, Fortresses, and Naval Bases. • Pays no penalty for recycling production into Units, Buildings, or Wonders. • Subject to zones of control. • Can't Fortify. - • Can be carried by Train, Truck, Cargo Ship, Transport. + • Can be carried by Train, Truck, Cargo Ship, Transport, Airplane. ➤ Never imposes a zone of control. ➤ Not subject to zones of control imposed by other units. -➤ Can Help Build Wonder - • is done in friendly cities. Contributes the unit's shield cost to current production - • uses up the Freight. - • adds 35 production. ➤ A non-military unit: • Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can Establish Trade Route • is done to foreign cities 15 or more tiles distant. • inactive during War. • uses up the Freight. -➤ Can Enter Marketplace - • is done to foreign cities not at war. - • uses up the Freight. ➤ Can Help Build Wonder • is done in friendly cities. Contributes the unit's shield cost to current production • uses up the Freight. - • adds 50 production. + • adds 25 production. ➤ Capturable: can be captured if conditions allow it. • does not count as an extra unit on tile to prevent capture.
@@ -4895,7 +4893,7 @@

Explorer

• Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can Investigate City (does not spend the unit) ➤ Can Upgrade • upgrades to Partisan. @@ -4923,9 +4921,9 @@

Leader

Firepower: 1
Hitpoints: 20
Obsolete by: None
-
This is you. If you lose this unit, you lose the game.
-Will not unleash barbarians from huts.
-You can use the DO command to change the gender of the Leader.
+
This is you. If you lose this unit, you lose the game.
+Will not unleash barbarians from huts.
+You can use the DO command to change the gender of the Leader.
 
➤ Belongs to Land unit class. • Slowed down while damaged. • AIRLIFT: Can be airlifted if it has remaining moves. @@ -4943,7 +4941,7 @@

Leader

• Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can Destroy City • is done to domestic individual cities. ➤ Can Pillage @@ -4967,9 +4965,9 @@

Queen

Firepower: 1
Hitpoints: 20
Obsolete by: None
-
(Alternate form of Leader. Behaves identically in-game.) This is you. If you lose this unit, you lose the game.
-Will not unleash barbarians from huts.
-You can use the DO command to change the gender of the Leader.
+
(Alternate form of Leader. Behaves identically in-game.) This is you. If you lose this unit, you lose the game.
+Will not unleash barbarians from huts.
+You can use the DO command to change the gender of the Leader.
 
➤ Belongs to Land unit class. • Slowed down while damaged. • AIRLIFT: Can be airlifted if it has remaining moves. @@ -4987,7 +4985,7 @@

Queen

• Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can Destroy City • is done to domestic individual cities. ➤ Can Pillage @@ -5011,8 +5009,8 @@

Barbarian Leader

Firepower: 1
Hitpoints: 10
Obsolete by: None
-
One Barbarian Leader appears every time there is a barbarian uprising somewhere in the world.
-When a Barbarian Leader is killed on a tile without any defending units, the 100 gold ransom is paid, but only to land units and helicopters.
+
One Barbarian Leader appears every time there is a barbarian uprising somewhere in the world.
+When a Barbarian Leader is killed on a tile without any defending units, the 100 gold ransom is paid, but only to land units and helicopters.
 
➤ Belongs to Land unit class. • Slowed down while damaged. ➤ May not be built in cities. @@ -5025,7 +5023,7 @@

Barbarian Leader

• Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can Pillage ➤ Can Fortify. Only makes the Barbarian Leader stay put. ➤ Can't be bribed. @@ -5036,7 +5034,7 @@

Barbarian Leader

Peasants

Cost: 10 shields
-
Upkeep: 2 Food
+
Upkeep: 0
Moves: 2
Vision: 2.00 tiles
Attack: 0
@@ -5044,7 +5042,7 @@

Peasants

Firepower: 1
Hitpoints: 10
Obsolete by: None
-
Population Cost: 1. Adds Population: 1.
+
Population Cost: 1. Adds Population: 1.
   
 Peasants are the common people of Monarchies. You can encourage them by royal edict to migrate to other cities and help colonize new areas. But to have such access, you must be a Constitutional Monarchy with the Magna Carta wonder: Peasants can only be made in the city with Magna Carta, so choose that city carefully. 
 If managed correctly, Peasants can increase your national population growth. They give a tremendous advantage for growing new colonies and settlements faster. 
@@ -5062,7 +5060,7 @@ 

Peasants

• Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Under certain conditions, cities can make more than one of this unit per turn, plus one of any other unit type. ➤ Can Add to City • is done to domestic individual cities. diff --git a/freeciv-web/src/derived/webapp/man/mp2-dragoon6.bak.html b/freeciv-web/src/derived/webapp/man/mp2-dragoon6.bak.html index d1845ee85..d58549776 100644 --- a/freeciv-web/src/derived/webapp/man/mp2-dragoon6.bak.html +++ b/freeciv-web/src/derived/webapp/man/mp2-dragoon6.bak.html @@ -1,4 +1,8 @@ - + + + + + @@ -11,20 +15,54 @@

Anarchy

Anarchy offers slightly less corruption than Despotism, but slightly more unhappiness. - +Celebrating cities cannot rapture. No citizens are made unhappy by each aggressive unit. -25% Base corruption in cities -2% Extra corruption per each tile in distance from capital - +25% base corruption in cities +2% extra corruption per each tile in distance from a capital + +
Veteran levelPower factorPromotion OddsMove bonus
+City Happiness vs. Empire Size + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Cities:0-910-1516-2122-2728-3334-3940-4546-51
First Unhappy:54321
Extra Unhappy:0+1+2+3+4+5+6+7
Features: -• Trade production will suffer some losses. -• Trade losses will increase with distance from capital. • Each of your cities will avoid paying 3 Shield upkeep for your units. • If you lose your capital, the base chance of civil war is 90%. • You can have up to 9 cities before an additional unhappy citizen appears in each city due to civilization size. • After the first unhappy citizen due to civilization size, for each 6 additional cities another unhappy citizen will appear. -• Has unlimited science/gold/luxuries rates. +• Science/gold/luxuries rates will be ignored, and all trade will be alotted to luxury. • Your units may impose martial law. Each military unit inside a city will force 1 unhappy citizen to become content. • Each worked tile that gives more than 2 Food, Shield, or Trade suffers a -1 penalty unless its city is celebrating. (Cities below size 3 will not celebrate.) @@ -36,18 +74,57 @@

Despotism

Under Despotism, you are the absolute ruler of your people.  Your control over your citizens is maintained largely by martial law. Under Despotism, tiles suffer a -1 tile output penalty if they produce 3 resource points.
 
-
 Despotism suffers the highest level of corruption of all forms of government.
 
+Celebrating cities cannot rapture.
 No citizens are made unhappy by each aggressive unit.
-37% Base corruption in cities
-4% Extra corruption per each tile in distance from capital
-Gulag:You can starve cities without disorder, with 2 martial law units.
+37% base corruption in cities
+4% extra corruption per each tile in distance from a capital
+Gulag:You can starve cities without disorder, with 2 martial law units or a Police Station.
+Authoritarian: Police Stations force an additional 2 citizens to be content.
+
+
+City Happiness vs. Empire Size
+    
+        
+         
+        
+        
+         
+        
+         
+        
+         
+      
+      
+        
+        
+        
+        
+        
+        
+        
+        
+        
+      
+      
+        
+        
+        
+        
+        
+        
+        
+        
+        
+      
+
Cities:0-1011-2021-3031-4041-5051-6061-7071-80
First Unhappy:54321
Extra Unhappy:0+1+2+3+4+5+6+7
Features: +• Capital city (with Palace) gains +75% shield production. • Newly founded cities get +2 food (+4 for capital.) -• Trade production will suffer massive losses. -• Trade losses will increase quickly with distance from capital. +• Trade production suffers massive losses. +• Trade losses increase quickly with distance from capital. • Each of your cities will avoid paying 3 Shield upkeep for your units. • If you lose your capital, the base chance of civil war is 80%. • You can have up to 10 cities before an additional unhappy citizen appears in each city due to civilization size. @@ -66,17 +143,54 @@

Monarchy

Monarchy suffers the same small amount of corruption that the Republic does. - +Celebrating cities cannot rapture. No citizens are made unhappy by each aggressive unit. -15% Base corruption in cities -2% Extra corruption per each tile in distance from capital +15% base corruption in cities +2% extra corruption per each tile in distance from a capital Requires knowledge of the technology Monarchy. + +City Happiness vs. Empire Size + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Cities:0-1112-2324-3536-4748-5960-7172-8384-95
First Unhappy:54321
Extra Unhappy:0+1+2+3+4+5+6+7
+ Features: -• Trade production will suffer some losses. -• Trade losses will increase with distance from capital. +• Capital city (with Palace) gains +50% shield production. +• Trade losses increase with distance from capital. • Each of your cities will avoid paying 3 Shield upkeep for your units. +• Each of your cities will avoid paying 1 Gold upkeep for your units. • If you lose your capital, the base chance of civil war is 70%. • You can have up to 11 cities before an additional unhappy citizen appears in each city due to civilization size. • After the first unhappy citizen due to civilization size, for each 12 additional cities another unhappy citizen will appear. @@ -89,27 +203,100 @@

Monarchy

 Constitutional Monarchy

Constitutional Monarchy is somewhat between Monarchy and representative government. - +Celebrating cities founded by you can rapture every turn. +Celebrating cities not founded by you rapture 1 out of 4 turns. +Celebrating cities not founded by you can rapture 3 out of 5 turns, if they have no foreign citizens. 1 citizen is made unhappy by each aggressive unit*. (* first two aggressive units do not cause unhappy) -15% Base corruption in cities -2% Extra corruption per each tile in distance from capital +15% base corruption in cities +2% extra corruption per each tile in distance from a capital Requires knowledge of the technology Monarchy and the Magna Carta Wonder. + +City Happiness vs. Empire Size + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Cities:0-2324-3536-4748-5960-7172-8384-9596-107
First Unhappy:54321
Extra Unhappy:0+1+2+3+4+5+6+7
+ + + City Rapture Rates + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Foreigners:60%+50%40%30%20%10%0%
Original:80%80%80%80%80%80%80%
Conquered:25%25%25%25%25%25%60%
+ Features: -• Trade production will suffer some losses. -• Trade losses will increase with distance from capital. +• Capital city (with Palace) gains +50% shield production. +• Trade losses increase with distance from capital. • Each of your cities will avoid paying 1 Shield upkeep for your units. +• Each of your cities will avoid paying 1 Gold upkeep for your units. • If you lose your capital, the base chance of civil war is 50%. • You can have up to 23 cities before an additional unhappy citizen appears in each city due to civilization size. • After the first unhappy citizen due to civilization size, for each 12 additional cities another unhappy citizen will appear. • The maximum rate you can set for science, gold, or luxuries is 70%. • One unit may impose martial law, forcing 1 unhappy citizen to become content. • • • -• +1 trade on each Land tile that produces trade. -• Each worked Sea tile yields +1 more Trade while its city is celebrating. (Cities below size 3 will not celebrate.) -• Cities originally founded by you can grow by means of rapture. (Cities below size 3 cannot grow in this way.) +• When not celebrating, +1 Trade on each Land tile that produces trade. +• When celebrating, +1 Trade on every tile that produces Trade. (Cities below size 3 will not celebrate.) +• Celebrating cities can grow by rapture. (Cities below size 3 cannot grow in this way.) • Military units away from home and field units will each cause 1 citizen to become unhappy. • Each of your cities will avoid 2 unhappiness caused by aggressive units. • Allows you to build Peasants in the city with Magna Carta. @@ -124,17 +311,86 @@

Republic

Under a Republican government, citizens hold an election to select a representative who will govern them; since elected leaders must remain popular to remain in control, citizens are given a greater degree of freedom.  Citizens under the Republic become unhappy easily, but the self-sufficiency of your citizens allows high levels of trade.
 
-
+Celebrating cities can rapture every turn.
 1 citizen is made unhappy by each aggressive unit*.
      (* first aggressive unit does not cause unhappy)
-15% Base corruption in cities
-2% Extra corruption per each tile in distance from capital
+15% base corruption in cities
+2% extra corruption per each tile in distance from a capital
 
 Requires knowledge of the technology The Republic.
 
+
+City Happiness vs. Empire Size
+        
+         
+        
+        
+         
+        
+         
+        
+         
+      
+      
+        
+        
+        
+        
+        
+        
+        
+        
+        
+      
+      
+        
+        
+        
+        
+        
+        
+        
+        
+        
+      
+
Cities:0-1314-2728-4142-5556-6970-8384-9798-111
First Unhappy:54321
Extra Unhappy:0+1+2+3+4+5+6+7
+ + + City Rapture Rates + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Foreigners:60%+50%40%30%20%10%0%
Original:90%90%90%90%90%90%90%
Conquered:33%33%33%33%33%33%80%
+ Features: -• Trade production will suffer some losses. -• Trade losses will increase with distance from capital. +• Trade losses increase with distance from capital. • Each of your cities will avoid 1 unhappiness caused by units. • You pay 2 times normal Food upkeep for your units. • Military units away from home and field units will each cause 1 citizen to become unhappy. @@ -142,7 +398,7 @@

Republic

• You can have up to 13 cities before an additional unhappy citizen appears in each city due to civilization size. • After the first unhappy citizen due to civilization size, for each 14 additional cities another unhappy citizen will appear. • The maximum rate you can set for science, gold, or luxuries is 80%. -• You may grow your cities by means of rapture. (Cities below size 3 cannot grow in this way.) +• Celebrating cities may grow by rapture. (Cities below size 3 cannot grow in this way.) • Each worked tile with at least 1 Trade will yield +1 more Trade. • Has a senate that may prevent declaration of war. • May ignore senate if you have the Statue of Liberty. @@ -155,23 +411,84 @@

Democracy

Under Democracy, citizens govern directly by voting on issues. Democracy offers the highest level of trade. Base corruption is half that of Republic or Monarchy, and corruption from distance to a capital is very low. Citizens become very upset during wars. Democracy revolts to Anarchy if any city remains in disorder for two turns. Cities and units belonging to Democracy have triple the cost to incite or bribe, respectively.
 
-
+Celebrating cities with less than 10% foreign citizens can rapture every turn.
+Celebrating cities with 10% or more foreign citizens can rapture 1 out of 2 turns.
 2 citizens are made unhappy by each aggressive unit.
-8% Base corruption in cities
-0.4% Extra corruption per each tile in distance from capital
+8% base corruption in cities
+0.4% extra corruption per each tile in distance from a capital
 
 Requires knowledge of the technology Democracy.
 
+
+City Happiness vs. Empire Size
+        
+         
+        
+        
+         
+        
+         
+        
+         
+      
+      
+        
+        
+        
+        
+        
+        
+        
+        
+        
+      
+      
+        
+        
+        
+        
+        
+        
+        
+        
+        
+      
+
Cities:0-1415-3031-4647-6263-7879-9495-110111-126
First Unhappy:54321
Extra Unhappy:0+1+2+3+4+5+6+7
+ + + City Rapture Rates + + + + + + + + + + + + + + + + + + + + +
Foreigners:60%+50%40%30%20%10%0%
All Cities:25%25%25%25%50%100%100%
+ Features: -• Trade production will suffer a small amount of losses. -• Trade losses will increase slowly with distance from capital. +• Trade production suffers small losses. +• Trade losses increase very slowly with distance from capital. • You pay 2 times normal Food upkeep for your units. • Military units away from home and field units will each cause 2 citizens to become unhappy. • If you lose your capital, the base chance of civil war is 30%. • You can have up to 14 cities before an additional unhappy citizen appears in each city due to civilization size. • After the first unhappy citizen due to civilization size, for each 16 additional cities another unhappy citizen will appear. • Has unlimited science/gold/luxuries rates. -• You may grow your cities by means of rapture. (Cities below size 3 cannot grow in this way.) +• Celebrating cities can grow by rapture. (Cities below size 3 cannot grow in this way.) • Each worked tile with at least 1 Trade will yield +1 more Trade. • If a city is in disorder for more than 2 turns in a row, government will fall into anarchy. • Has a senate that may prevent declaration of war. @@ -185,35 +502,113 @@

Theocracy

Theocracy is formed on religious beliefs which are the law of the land.
 
-The people are devoted and often willing to die for their faith. Cities very near a capital have very low corruption. Cost for enemies to incite cities or bribe units is 2x, but Zealots cannot be bribed. Enemies cannot establish embassies without first making Ceasefire or Peace.
+The people are devoted and often willing to die for their faith. Each city has +1 happy citizen. Cities very near a capital have very low corruption. Cost for enemies to incite cities or bribe units is 2x, but Zealots cannot be bribed. Cost to incite foreign cities is reduced by a third. Enemies cannot establish embassies without first making Ceasefire or Peace.
 
-Improvements that appease unhappy citizens produce 1 gold in tithes for each citizen appeased. Tithes also boost gold income by +20%, but science output suffers -20%. Palace gives +50% to gold income in its city. In cities, two military units may impose martial law, affecting one citizen each. Pilgrims can be made to migrate and grow cities.
+Improvements that appease unhappy citizens add +1 base gold in tithes for each citizen appeased. Tithes also boost gold income by +20%, but science output suffers -20%. Palace gives +50% to gold income in its city. In cities, two military units may impose martial law, affecting one citizen each. Pilgrims can be made to migrate and grow cities.
 
+Having an Ecclesiastical Palace allows instant and orderly transition to this government.
 
+Celebrating cities can rapture 2 out of 5 turns.
+Celebrating cities can rapture 4 out of 7 turns if they have a Cathedral building present in the city.
+Each city gains +1 happy citizen.
 No citizens are made unhappy by each aggressive unit.
-2% Base corruption in cities
-2% Extra corruption per each tile in distance from capital
+0% base corruption in cities
+1% extra corruption per each tile in distance from a capital
 
 Requires knowledge of the technology Theocracy.
 
+
+City Happiness vs. Empire Size
+        
+         
+        
+        
+         
+        
+         
+        
+         
+      
+      
+        
+        
+        
+        
+        
+        
+        
+        
+        
+      
+      
+        
+        
+        
+        
+        
+        
+        
+        
+        
+      
+
Cities:0-1415-2930-4445-5960-7475-8990-104105-119
First Unhappy:54321
Extra Unhappy:0+1+2+3+4+5+6+7
+ + + City Rapture Rates + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Foreigners:60%+50%40%30%20%10%0%
No Cathedral:40%40%40%40%40%40%40%
With Cathedral:57%57%57%57%57%57%57%
+ Features: -• Trade production will suffer a small amount of losses. -• Trade losses will increase with distance from capital. +• Capital city (with Palace) gains +50% gold production. +• No trade losses from base corruption. +• Trade losses only accrue based on distance to a capital, at a slow rate. • You pay 2 times normal Food upkeep for your units. • Each of your cities will avoid paying 10 Shield upkeep for your units. +• Each of your cities will avoid paying 1 Gold upkeep for your units. • You can have up to 14 cities before an additional unhappy citizen appears in each city due to civilization size. • After the first unhappy citizen due to civilization size, for each 15 additional cities another unhappy citizen will appear. • The maximum rate you can set for science, gold, or luxuries is 80%. +• Celebrating cities can grow by rapture. (Cities below size 3 cannot grow in this way.) • Your units may impose martial law. Each military unit inside a city will force 1 unhappy citizen to become content. • A maximum of 2 units in each city can enforce martial law. • Each worked tile with Trade will yield +1 more Trade while its city is celebrating. (Cities below size 3 will not celebrate.) • Science production is decreased 20%. -• Buildings and Wonders that make citizens content or happy give 1 base gold per citizen affected. • Gold production is increased 20%. +• Buildings and Wonders that make citizens content or happy give 1 base gold per citizen affected. • Pays no upkeep for Pilgrims or Zealots. -• Allows you to build Pilgrims. -• Allows you to build Falconeers. -• Allows you to build Zealots. +• Allows Pilgrims. +• Allows Falconeers. +• Allows Patriarch (with Ecclesiastical Palace.) +• Allows Zealots (with Conscription.)
@@ -223,33 +618,104 @@

Communism

In Communism, all work, output, and goods are owned by the state.
 
-Each city gets 4 shields of free unit upkeep. Buildings with 1 upkeep are free. The city with a Palace gets +25% production.
+Content cities get a +1 trade bonus on irrigated tiles that produce trade. Each city gets 4 shields and 3 gold of free unit upkeep. Buildings with 1 upkeep are free. The city with a Palace gets +40% production.
 
-Riflemen cost 5 less; Armor and Dive Bombers, 10 less. Diplomats and Spies get +1 vet level. The effect of Cathedrals and Michelangelo is reduced -1.
+Each city gets 4 shields of free unit upkeep. Buildings with 1 upkeep are free. The city with a Palace gets +40% production.
 
-Communists can transfer Proletarians between cities to re-distribute population, or use them as workers on State projects. The Communism tech allows a Communist government to convert Workers to Riflemen and vice versa, if in domestic territory and possessing the necessary tech.
+Riflemen cost 5 less; Armor and Dive Bombers, 10 less. Diplomats and Spies get +1 vet level. The effect of Cathedrals and Michelangelo is reduced -1. Each city gets the effects of a Supermarket for free.
 
+Communists can transfer Proletarians between cities to re-distribute population, or use them as workers on State projects. The Communism tech allows a Communist government to convert Workers to Riflemen and vice versa, if in domestic territory and possessing the necessary tech.
 
+Your nation is completely unaffected by empire size and number of cities.
+Celebrating cities can rapture 2 out of 5 turns.
+Celebrating cities which have a Granary gain +1 food output.
 No citizens are made unhappy by aggressive units.
-20% Base corruption in cities
-No Extra corruption per each tile in distance from capital
-Gulag:You can starve cities without disorder, with 2 martial law units.
+20% base corruption in cities
+No extra corruption per each tile in distance from a capital
+Gulag:You can starve cities without disorder, with 2 martial law units or 1 martial law unit and a Police Station.
+Authoritarian: Police Stations force an additional 2 citizens to be content.
 
 Requires knowledge of the technology Communism.
 
+
+City Happiness vs. Empire Size
+        
+        
+        
+        
+         
+        
+         
+        
+         
+      
+      
+        
+        
+        
+        
+        
+        
+        
+        
+        
+      
+      
+        
+        
+        
+        
+        
+        
+        
+        
+        
+      
+
Cities:0-∞-------
First Unhappy:55555555
Extra Unhappy:00000000
+ + + City Rapture Rates + + + + + + + + + + + + + + + + + + + + +
Foreigners:60%+50%40%30%20%10%0%
All Cities:40%40%40%40%40%40%40%
+ Features: -• Trade production will suffer some losses. +• Capital city (with Palace) gains +40% shield production. +• Trade production will suffer moderate losses. +• Distance from capital does not increase trade losses. • Each of your cities will avoid paying 4 Shield upkeep for your units. +• Each of your cities will avoid paying 3 Gold upkeep for your units. • If you lose your capital, the base chance of civil war is 50%. -• You can have up to 12 cities before an additional unhappy citizen appears in each city due to civilization size. +• You may have an unlimited number of cities without an increase in unhappy citizens. • The maximum rate you can set for science, gold, or luxuries is 80%. +• Celebrating cities can grow by rapture. (Cities below size 3 cannot grow in this way.) +• When not celebrating, +1 trade on each irrigated tile that produces trade. +• When celebrating, +1 trade on each tile that produces trade. • Your units may impose martial law. Each military unit inside a city will force 2 unhappy citizens to become content. • A maximum of 3 units in each city can enforce martial law. -• New Diplomat units will be veteran. +• New Emissary, Diplomat, and Spy units will be veteran. • Each worked tile with Trade will yield +1 more Trade while its city is celebrating. (Cities below size 3 will not celebrate.) • Cathedral and Michelangelo effects diminished by -1. • Disqualified from all bonuses to Coinage. -• Allows you to build Proletarians. +• Allows Proletarians.
@@ -257,43 +723,118 @@

Communism

Nationalism

-
Nationalism glorifies national supremacy over other peoples. Zealous citizens and corporatations align under a dictator who rules over a unified populace, military, and isolationist economy.
+
Nationalism glorifies national supremacy over other peoples. Citizens and corporatations align under a dictator who rules over a unified populace, military, and isolationist economy.
 
 
-Content cities get a +1 trade bonus on Land tiles only. Celebrating cities also get Ocean tiles. Cities may rapture if founded under the original national hegemony. Luxury suffers a 15% penalty. Government mandated Science gets +15% in original cities.
+Content cities get a +1 trade bonus on Land tiles only. Celebrating cities also get Ocean tiles. Cities may rapture if founded under the original national hegemony. Luxury suffers a 15% penalty. Government mandated Science gets +20% in original cities.
 
 
 Each city gets 1 shield of free unit upkeep. The city with a Palace gets +15% production. Original cities have a 3x incite cost, otherwise cost one third.
 
 
-Police Stations suppress +1 unhappy Foreign National and cost 10 shields less. Five military units may impose martial law, affecting one citizen each. Migrants can be made to help grow cities. Tile workers gain a ⅑ move bonus. Cost of upgrades is 25% less. Riflemen are produced at +1 vet level. Armor gets a +1 move bonus. Fighters and Dive Bombers have 50% higher odds of promotion.
+Police Stations cost 10 shields less. Five military units may impose martial law, affecting one citizen each. Migrants can be made to help grow cities. Tile workers gain a ⅑ move bonus. Cost of upgrades is 25% less. Riflemen are produced at +1 vet level. Armor gets a +1 move bonus. Fighters and Dive Bombers have 50% higher odds of promotion.
 
 
+Celebrating cities founded by you can rapture every turn.
+Celebrating cities not founded by you can rapture 1 out of 3 turns.
+Celebrating cities not founded by you can rapture 2 out of 3 turns, if they have no foreign citizens.
 No citizens are made unhappy by each aggressive unit.
-8% Base corruption in capital,
-2% Extra corruption per each tile in distance from capital
+8% base corruption in capital,
+2% extra corruption per each tile in distance from a capital
+Authoritarian: Police Stations force an additional 2 citizens to be content.
 
 Requires knowledge of the technology Nationalism.
 
+
+City Happiness vs. Empire Size
+        
+         
+        
+        
+         
+        
+         
+        
+         
+      
+      
+        
+        
+        
+        
+        
+        
+        
+        
+        
+      
+      
+        
+        
+        
+        
+        
+        
+        
+        
+        
+      
+
Cities:0-2021-3233-4445-5657-6869-8081-9293-104
First Unhappy:54321
Extra Unhappy:0+1+2+3+4+5+6+7
+ + + City Rapture Rates + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Foreigners:60%+50%40%30%20%10%0%
Original:50%50%50%50%50%50%100%
Conquered:33%33%33%33%33%33%67%
+ Features: -• Trade production will suffer a small amount of losses. -• Trade losses will increase with distance from capital. +• Capital city (with Palace) gains +15% shield production. +• Trade production suffers a small amount of losses. +• Trade losses increase with distance from capital. • You pay 2 times normal Food upkeep for your units. • Each of your cities will avoid paying 1 Shield upkeep for your units. • If you lose your capital, the base chance of civil war is 40%. • You can have up to 20 cities before an additional unhappy citizen appears in each city due to civilization size. • After the first unhappy citizen due to civilization size, for each 12 additional cities another unhappy citizen will appear. • The maximum rate you can set for science, gold, or luxuries is 90%. +• Celebrating cities can grow by rapture. (Cities below size 3 cannot grow in this way.) • Your units may impose martial law. Each military unit inside a city will force 1 unhappy citizen to become content. • A maximum of 5 units in each city can enforce martial law. * New Riflemen units will have the rank of veteran. * Fighter and Dive Bomber units are promoted 50% more frequently. • Luxury production is decreased 15%. -• Science production is increased 15% in original cities. -• Cities originally founded by you can grow by means of rapture. (Cities below size 3 cannot grow in this way.) -• +1 trade on each Land tile that produces trade. +• Science production is increased 20% in original cities. +• When not celebrating, +1 trade on each Land tile that produces trade. • Each worked Sea tile yields +1 more Trade while its city is celebrating. (Cities below size 3 will not celebrate.) -• Allows you to build Migrants. +• Allows Migrants.
diff --git a/freeciv-web/src/derived/webapp/man/mp2-dragoon7.bak.html b/freeciv-web/src/derived/webapp/man/mp2-dragoon7.bak.html index e4b2050ad..505f1a083 100644 --- a/freeciv-web/src/derived/webapp/man/mp2-dragoon7.bak.html +++ b/freeciv-web/src/derived/webapp/man/mp2-dragoon7.bak.html @@ -16,8 +16,7 @@

Founders

Firepower: 1
Hitpoints: 25
Obsolete by: None
-
At game start, Founders are a more populous portion of your nomadic tribe. 
-
+
At game start, Founders are a more populous portion of your nomadic tribe.
 Founders are Settlers who found a city of size 2—usually the first city and capital of a tribe. They are a start unit that cannot be built. In all other respects they are exactly like Settlers, except they cannot be bribed.
 
➤ Belongs to Land unit class. • Subject to zones of control. @@ -29,16 +28,16 @@

Founders

• Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can build Quay, Road, Railroad, Maglev, Canal, and Waterway on tiles. ➤ Can build Fort, Fortress, and Naval Base on tiles. ➤ Can clean Pollution from tiles. ➤ Can clean Fallout from tiles. ➤ Can Build City - • uses up the Settlers. - • initial population: 1. + • uses up the Founders. + • initial population: 2. ➤ Can Add to City - • uses up the Settlers. + • uses up the Founders. • max target size: 39. • adds 1 population. ➤ Can Pillage @@ -85,7 +84,7 @@

Settlers

• Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can build Quay, Road, Railroad, Maglev, Canal, and Waterway on tiles. ➤ Can build Fort, Fortress, and Naval Base on tiles. ➤ Can clean Pollution from tiles. @@ -135,11 +134,12 @@

Tribesmen

• Slowed down while damaged. • Can't attack as Cargo. Must first unload. ➤ A Start Unit only: may not be built in cities. -➤ Can carry up to 1 Goods unit. +➤ Can carry 1 Goods unit. + • Cargo not visible except to allies. ➤ Can build infrastructure until T20 (2000BC). • Can Road, 2 turns. (4-6 turns for slower roaded terrain.) • Can Mine, 10 turns. - • Can Irrigate, 6 turns. + • Can Irrigate, 5 turns. ➤ Ignores terrain effects (moving costs at most ⅓ MP per tile). ➤ Never imposes a zone of control. ➤ Not subject to zones of control imposed by other units. @@ -151,7 +151,7 @@

Tribesmen

• Can't conquer cities. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can Investigate City (does not spend the unit) ➤ Can Recycle • Must be done in a domestic city making a Building, Wonder, or Coinage. @@ -175,52 +175,92 @@

Tribesmen

-

Well-Digger

+

Peasants

-
Cost: 5 shields
-
Upkeep: 2 Food, 5 Shield, 2 Gold
-
Moves: 3
+
Cost: 10 shields
+
Upkeep: 0
+
Moves: 2
Vision: 2.00 tiles
Attack: 0
Defense: 1
Firepower: 1
-
Hitpoints: 8
-
Obsolete by: Workers
-
This unit can fix unlucky starts, but has very high upkeep.
-If you have no water, make a Well-Digger in a city that can support it, create a water source, then disband the unit.
-This unit can dig wells to create irrigation sources. It will cost its home city -2 Food -2 Prod. This unit WILL NOT WORK: • Outside your borders, • After Alphabet or Pottery, • After any player discovers Writing, • After it reaches an age of 10 turns. >> Don't fool around: high upkeep will permanently hinder you. Only make this unit if you lack water when the game starts!
+
Hitpoints: 10
+
Obsolete by: None
+
Population Cost: 1. Adds Population: 1.
+  
+Peasants are the common people of Monarchies. You can encourage them by royal edict to migrate to other cities and help colonize new areas. But to have such access, you must be a Constitutional Monarchy with the Magna Carta wonder: Peasants can only be made in the city with Magna Carta, so choose that city carefully. 
+If managed correctly, Peasants can increase your national population growth. They give a tremendous advantage for growing new colonies and settlements faster. 
+Peasants can only be made in one city, but you can make more than one per turn under the right conditions. When a city completes a unit, it will try to make more of them if it doesn’t have a worklist. So be careful!
 
➤ Belongs to Land unit class. • Subject to zones of control. • Slowed down while damaged. -➤ Each player may only have one of this type of unit. + • AIRLIFT: Can be airlifted if it has remaining moves. +➤ Can only be built with Constitutional Monarchy as government. +➤ Can only be built if there is Magna Carta in the city. +➤ Costs 1 population to build. +➤ May load onto and unload from Transport Helicopters even when underway. ➤ Never imposes a zone of control. ➤ A non-military unit: • Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. -➤ Can Dig Well or Irrigate tiles with no water. -➤ Can clean Pollution from tiles. -➤ Can clean Fallout from tiles. -➤ Can Recycle Unit - • is done in cities. Contributes half the unit's shield cost to current production - • uses up the Well-Digger. -➤ Can Disband - • uses up the Well-Digger. Recycles cost if done in a city. -➤ Can Upgrade - • upgrades to Workers. -➤ Can Pillage -➤ Can Road -➤ Can Irrigate + • Doesn't prevent enemy cities from working the tile it's on. +➤ Multislot: Under certain conditions, cities can make one (or more) multislot unit(s) per turn, plus one of any other unit type. +➤ Can Add to City + • is done to domestic individual cities. + • uses up the Pilgrims. + • max target size: 39. + • adds 1 population. +➤ Capturable: can be captured if conditions allow it. ➤ Expellable: can be expelled from foreign tiles. +➤ Unable to pillage tiles. ➤ Will never achieve veteran status. +
+
+
+

Pilgrims

+ +
Cost: 10 shields
+
Upkeep: 2 Food
+
Moves: 2
+
Vision: 2.00 tiles
+
Attack: 0
+
Defense: 1
+
Firepower: 1
+
Hitpoints: 10
+
Obsolete by: None
+
Population Cost: 0. Adds Population: 1.
+  
+Pilgrims are wayfaring migrants from Theocratic nations. Like Zealots, they have no upkeep if under a Theocratic government. Heeding the call of ecclesiastic authority, Pilgrims can be guided from one city to another in order to transfer population from city to city. Pilgrims have no population cost, so can be thought of as geographically controlled rapture for the price of 10 shields.
+
➤ Belongs to Land unit class. + • Subject to zones of control. + • Slowed down while damaged. + • AIRLIFT: Can be airlifted if it has remaining moves. +➤ Can only be built with Theocracy as government. +➤ Costs no population to build (0). +➤ May load onto and disembark from Transport Helicopters even when underway. +➤ Never imposes a zone of control. +➤ A non-military unit: + • Cannot attack. + • Doesn't impose martial law. + • Can enter foreign territory regardless of peace treaty. + • Doesn't prevent enemy cities from working the tile it's on. +➤ Can Add to City + • is done to domestic individual cities. + • uses up the Pilgrims. + • max target size: 39. + • adds 1 population. +➤ Capturable: can be captured if conditions allow it. +➤ Expellable: can be expelled from foreign tiles. +➤ Unable to pillage tiles. +➤ Will never achieve veteran status.
Transport Loading Logistics Transport Unloading Logistics
-
+

Proletarians

Cost: 10 shields
@@ -250,7 +290,7 @@

Proletarians

• Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can build Quay, Road, Railroad, Maglev, Canal, and Waterway on tiles. ➤ Can build Fort, Fortress, Naval Base, Airbase, Radar, and Buoy on tiles. ➤ Can clean Pollution from tiles. @@ -273,8 +313,8 @@

Proletarians

-
-

Pilgrims

+
+

Migrants

Cost: 10 shields
Upkeep: 2 Food
@@ -285,25 +325,25 @@

Pilgrims

Firepower: 1
Hitpoints: 10
Obsolete by: None
-
Population Cost: 0. Adds Population: 1.
+
Population Cost: 1. Adds Population: 1.
   
-Pilgrims are wayfaring migrants from Theocratic nations. Like Zealots, they have no upkeep if under a Theocratic government. Heeding the call of ecclesiastic authority, Pilgrims can be guided from one city to another in order to transfer population from city to city. Pilgrims have no population cost, so can be thought of as rapture for the price of 10 shields.
-
➤ Belongs to Land unit class. +Migrants are citizens under Nationalist governments who are encouraged to settle in new cities, often in conquered or colonial areas. They can be guided from one city to another in order to transfer population from city to city. If managed correctly, they can increase the overall rate of national population growth.
+
➤ Belongs to Land unit class. • Subject to zones of control. • Slowed down while damaged. • AIRLIFT: Can be airlifted if it has remaining moves. -➤ Can only be built with Theocracy as government. -➤ Costs no population to build (0). +➤ Can only be built with Nationalism as government. +➤ Costs 1 population to build. ➤ May load onto and disembark from Transport Helicopters even when underway. ➤ Never imposes a zone of control. ➤ A non-military unit: • Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can Add to City • is done to domestic individual cities. - • uses up the Pilgrims. + • uses up the Migrants. • max target size: 39. • adds 1 population. ➤ Capturable: can be captured if conditions allow it. @@ -316,51 +356,68 @@

Pilgrims

-
-

Migrants

+
+

Workers

-
Cost: 10 shields
-
Upkeep: 2 Food
+
Cost: 30 shields
+
Upkeep: 1 Shield
Moves: 2
Vision: 2.00 tiles
Attack: 0
Defense: 1
Firepower: 1
-
Hitpoints: 10
-
Obsolete by: None
-
Population Cost: 1. Adds Population: 1.
-  
-Migrants are citizens under Nationalist governments who are encouraged to settle in new cities, often in conquered or colonial areas. They can be guided from one city to another in order to transfer population from city to city. If managed correctly, they can increase the overall rate of national population growth.
-  
➤ Belongs to Land unit class. +
Hitpoints: 8
+
Obsolete by: Workers II
+
Workers can improve terrain tiles. See the manual on Terrain for details. 
+Masonry lets Workers build Forts. Construction lets them build Fortresses and Oil Wells. Engineering lets them build Canals and Naval Bases. 
+Feudalism with Construction lets them build Castles. Steel lets them build Bunkers and Sea Bridges. Radio lets them build Airbases and Buoys, which Settlers cannot. Workers must be on a ship to build Buoys. 
+Communism tech allows Communist governments to conscript Workers into Riflemen via the Convert order. And vice versa.
+
➤ Belongs to Land unit class. • Subject to zones of control. • Slowed down while damaged. • AIRLIFT: Can be airlifted if it has remaining moves. -➤ Can only be built with Nationalism as government. -➤ Costs 1 population to build. +➤ Under Communism, may be obtained by conversion of Riflemen. ➤ May load onto and disembark from Transport Helicopters even when underway. ➤ Never imposes a zone of control. ➤ A non-military unit: • Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. -➤ Can Add to City - • is done to domestic individual cities. - • uses up the Migrants. - • max target size: 39. - • adds 1 population. + • Doesn't prevent enemy cities from working the tile it's on. +➤ Can build Quay, Road, Railroad, Maglev, Canal, and Waterway on tiles. +➤ Can build Fort, Fortress, Naval Base, Airbase, Radar, and Buoy on tiles. +➤ Can clean Pollution from tiles. +➤ Can clean Fallout from tiles. +➤ Can Upgrade + • upgrades to Engineers. +➤ Can Pillage +➤ Can Road +➤ Can Convert Unit + • is converted into Riflemen (takes 2 MP). +➤ Can Build Bases +➤ Can Mine and make Oil Well +➤ Can IrrigateCapturable: can be captured if conditions allow it. ➤ Expellable: can be expelled from foreign tiles. -➤ Unable to pillage tiles. -➤ Will never achieve veteran status. +➤ May not acquire veteran status. +➤ May retain veteran status after conversion. +
+ + +
+ + + + +
Veteran levelWork factorPromotion OddsMove bonus
apprentice100%0% -
journeyman100%0% + 1/9
foreman100%0% + 1/9
chief engineer100%0% + 1/9

Transport Loading Logistics Transport Unloading Logistics
-
-

Workers

+
+

Workers II

Cost: 30 shields
Upkeep: 1 Shield
@@ -371,10 +428,16 @@

Workers

Firepower: 1
Hitpoints: 8
Obsolete by: Engineers
-
Workers can improve terrain tiles. See the manual on Terrain for details.
-Masonry lets Workers build Forts. Construction lets them build Fortresses and Oil Wells. Engineering lets them build Canals and Naval Bases. 
-  Feudalism with Construction lets them build Castles. Steel lets them build Bunkers and Sea Bridges. Radio lets them build Airbases and Buoys, which Settlers cannot. Workers must be on a ship to build Buoys.
-Communism tech allows Communist governments to conscript Workers into Riflemen via the Convert order. And vice versa.
+
As civilization progresses, socioeconomic trends improve education, efficiency and methods: for each turn of work completed, Workers II gain a small chance of promotion. 
+• v1 do 6 turns of work in 5 turns (Journeyman); 
+• v2 do 5 turns of work in 4 turns (Foreman); 
+• v3 do 4 turns of work in 3 turns (Master Workman). 
+These bonuses stack with other work rate bonuses. 
+
+In other respects, this unit is identical to Workers I. 
+Masonry lets Workers build Forts. Construction lets them build Fortresses and Oil Wells. Engineering lets them build Canals and Naval Bases. Feudalism with Construction lets them build Castles. Steel lets them build Bunkers and Sea Bridges. Radio lets them build Airbases and Buoys, which Settlers cannot. Workers must be on a ship to build Buoys. 
+Until the discovery of Explosives, Workers will immediately upgrade for free to Workers II. No moves are spent, no city is needed, and the current job is not interrupted.
+Communism tech allows Communist governments to conscript Workers II into Riflemen via the Convert order. And vice versa.
 
➤ Belongs to Land unit class. • Subject to zones of control. • Slowed down while damaged. @@ -386,7 +449,7 @@

Workers

• Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can build Quay, Road, Railroad, Maglev, Canal, and Waterway on tiles. ➤ Can build Fort, Fortress, Naval Base, Airbase, Radar, and Buoy on tiles. ➤ Can clean Pollution from tiles. @@ -403,19 +466,24 @@

Workers

Capturable: can be captured if conditions allow it. ➤ Expellable: can be expelled from foreign tiles. ➤ May acquire veteran status. +➤ Veteran bonuses stack with other work rate bonuses. -Veteran level Move bonus -
green 100% - -army worker + 1/9 -army engineer + 1/9 -chief engineer + 1/9 +Veteran Levels for Workers II are unique to this unit type: + + +
+ + + + +
Veteran levelWork factorPromotion Odds per turn/workMove bonus
apprentice100%7% -
journeyman120%5% + 1/9
foreman125%3% + 1/9
master workman133%0% + 1/9

Transport Loading Logistics Transport Unloading Logistics
-
+

Engineers

Cost: 40 shields
@@ -427,7 +495,7 @@

Engineers

Firepower: 1
Hitpoints: 20
Obsolete by: None
-
Engineers can do everything Workers can do, at twice the speed. Unlike Workers, Engineers can Transform, such as converting Desert to Plains. Converting Ocean to Swamp requires being on a ship on a tile bordering 2 land tiles.
+
Engineers can do everything Workers can do, at twice the speed. Unlike Workers, Engineers can Transform, such as converting Desert to Plains. Converting Ocean to Swamp requires being on a ship on a tile bordering 2 land tiles. Constructing a Sea Bridge requires being on a ship on a tile cardinally adjacent to land.
 
➤ Belongs to Land unit class. • Subject to zones of control. • Slowed down while damaged. @@ -438,7 +506,7 @@

Engineers

• Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can build Quay, Road, Railroad, Maglev, Canal, and Waterway on tiles. ➤ Can build Fort, Fortress, Naval Base, Airbase, Radar, and Buoy on tiles. ➤ Can clean Pollution from tiles. @@ -453,7 +521,7 @@

Engineers

➤ Will never achieve veteran status.
-
+

Warriors

Cost: 8 shields
@@ -478,8 +546,9 @@

Warriors

• Can't attack as Cargo. Must first unload. ➤ Unable to attack air units. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ The discovery of Banking converts the shield upkeep of this unit to 1 gold upkeep. -➤ Under certain conditions, cities can make more than one of this unit per turn, plus one of any other unit type. +➤ Multislot: Under certain conditions, cities can make one (or more) multislot unit(s) per turn, plus one of any other unit type. ➤ Can Upgrade • upgrades to Pikemen or, when possible, to the unit type it upgrades to. ➤ Attacking with fractional move points gives fractional attack power. @@ -510,7 +579,7 @@

Warriors

-
+

Phalanx

Cost: 16 shields
@@ -543,14 +612,15 @@

Phalanx

No unit can be killed. • Cannot be done to Cities, Forts, Fortresses, Naval Bases, nor Oceanic tiles. • Can do action while fortified and remain fortified afterwards. - - Using the D command to click the target will preserve fortified status of Phalanx. +➤ Can attack while fortified and remain fortified afterwards. ➤ Unable to attack air units. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ The discovery of Banking converts the shield upkeep of this unit to 1 gold upkeep. -➤ Under certain conditions, cities can make more than one of this unit per turn, plus one of any other unit type. +➤ Multislot: Under certain conditions, cities can make one (or more) multislot unit(s) per turn, plus one of any other unit type. ➤ Can Expel • target unit must be alone and not on Mountains. - • uses one movement point + • uses ⅔ movement point • actor stays on its own tile ➤ Can Upgrade • upgrades to Pikemen or, when possible, to the unit type it upgrades to. @@ -581,7 +651,7 @@

Phalanx

-
+

Archers

Cost: 24 shields
@@ -593,12 +663,11 @@

Archers

Firepower: 1
Hitpoints: 10
Obsolete by: Musketeers
-
Archers fight with bows and arrows. They have good offense and decent defense. Rather than fight to the death, Archers can also do a ranged Volley Attack which avoids hand-to-hand retaliation: two volleys of arrows are fired on up to 7 enemy units on the tile, causing 1-2hp of damage to any units who are hit. This includes Oceanic tiles if not transported. This is useful for softening enemies prior to battle, or for deterring an approach to a strategic location. (Volley Attack is not possible on Cities or Fortresses.) Archers can do a retaliatory Volley attack against any unit which does a Special Unit Attack on them.
+
Archers fight with bows and arrows. They have good offense and decent defense. Rather than fight to the death, Archers can also do a ranged Volley Attack which avoids hand-to-hand retaliation: two volleys of arrows are fired on up to 3 enemy units on the tile, causing 1-2hp of damage to any units who are hit. This includes Oceanic tiles if not transported. This is useful for softening enemies prior to battle, or for deterring an approach to a strategic location. (Volley Attack is not possible on Cities or Fortresses.) Archers can do a retaliatory Volley attack against any unit which does a Special Unit Attack on them.
 
 With the discovery of Conscription, Archers can convert to Musketeers in any domestic city.
 
-
-The discovery of Banking changes upkeep from shields to gold.
+The discovery of Banking changes upkeep from shields to gold.
 
➤ Belongs to Land unit class. • Can occupy empty enemy cities. • Subject to zones of control. @@ -613,18 +682,20 @@

Archers

No unit can be killed. • Cannot be done to Cities, Fortresses, nor Naval Bases. • Can do action while fortified and remain fortified afterwards. - - Using the D command to click the target will preserve fortified status of Archers. ➤ Unable to attack air units. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Has Special Defense against Special Attacks / Ranged Attacks. • Gives 2 free rounds of combat against up to 7 units in an enemy stack. ➤ The discovery of Banking converts the shield upkeep of this unit to 1 gold upkeep. -➤ Under certain conditions, cities can make more than one of this unit per turn, plus one of any other unit type. +➤ Multislot: Under certain conditions, cities can make one (or more) multislot unit(s) per turn, plus one of any other unit type. ➤ Can Capture Unit • target unit must be alone, not on Mountains, and not in a Fort, Fortress, or Naval Base. + • uses ⅔ movement point + • actor stays on its own tile ➤ Can Expel • target unit must be alone and not on Mountains. - • uses one movement point + • uses ⅔ movement point • actor stays on its own tile ➤ Can Upgrade • upgrades to Musketeers or, when possible, to the unit type it upgrades to. @@ -655,10 +726,10 @@

Archers

-
+

Legion

-
Cost: 32 shields
+
Cost: 30 shields
Upkeep: 1 Shield, 1 Unhappy
Moves: 2
Vision: 2.00 tiles
@@ -670,11 +741,9 @@

Legion

Legions are heavily armed well disciplined soldiers with excellent offensive strength. They are famous for their engineering abilities: with the required technology they can build Forts and Fortresses. They can build Roads outside domestic national territory and inside Forts and Fortresses.
 Legions are feared for how they start battle: a Pilum Assault targets the shields of the enemy. A pilum stuck in a shield renders it useless, leaving the front line vulnerable to a full-on charge. The Pilum Assault does 1 round of combat at 2× attack bonus on up to 2 units on the tile.
 
-
-With the discovery of Conscription, Legions can convert to Musketeers in any domestic city.
+With the discovery of Conscription, Legions can convert to Musketeers in any domestic city.
 
-
-The discovery of Banking changes upkeep from shields to gold.  
+The discovery of Banking changes upkeep from shields to gold.  
 
➤ Belongs to Land unit class. • Can occupy empty enemy cities. • Subject to zones of control. @@ -692,13 +761,16 @@

Legion

➤ Can build Quay, Road, Railroad, Maglev, Canal, and Waterway on tiles. ➤ Can build Fort, Fortress, and Naval Base on tiles. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ The discovery of Banking converts the shield upkeep of this unit to 1 gold upkeep. -➤ Under certain conditions, cities can make more than one of this unit per turn, plus one of any other unit type. +➤ Multislot: Under certain conditions, cities can make one (or more) multislot unit(s) per turn, plus one of any other unit type. ➤ Can Capture Unit • target unit must be alone, not on Mountains, and not in a Fort, Fortress, or Naval Base. + • uses ⅔ movement point + • actor stays on its own tile ➤ Can Expel • target unit must be alone and not on Mountains. - • uses one movement point + • uses ⅔ movement point • actor stays on its own tile ➤ Can Upgrade • upgrades to Musketeers or, when possible, to the unit type it upgrades to. @@ -733,7 +805,7 @@

Legion

-
+

Pikemen

Cost: 18 shields
@@ -747,11 +819,9 @@

Pikemen

Obsolete by: Musketeers
Long sharp pikes give Pikemen a counter to the height and mobility of mounted units. They enjoy a 2× defense bonus against mounted units.
 
-
-With the discovery of Conscription, Pikemen can convert to Musketeers in any domestic city.
+With the discovery of Conscription, Pikemen can convert to Musketeers in any domestic city.
 
-
-The discovery of Banking changes upkeep from shields to gold.  
+The discovery of Banking changes upkeep from shields to gold.  
 
➤ Belongs to Land unit class. • Can occupy empty enemy cities. • Subject to zones of control. @@ -761,11 +831,12 @@

Pikemen

2× defense bonus if attacked by Horsemen, Chariot, Elephants, Crusaders, Knights, or Dragoons. ➤ Unable to attack air units. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ The discovery of Banking converts the shield upkeep of this unit to 1 gold upkeep. -➤ Under certain conditions, cities can make more than one of this unit per turn, plus one of any other unit type. +➤ Multislot: Under certain conditions, cities can make one (or more) multislot unit(s) per turn, plus one of any other unit type. ➤ Can Expel • target unit must be alone and not on Mountains. - • uses one movement point + • uses ⅔ movement point • actor stays on its own tile ➤ Can Upgrade • upgrades to Musketeers or, when possible, to the unit type it upgrades to. @@ -796,7 +867,7 @@

Pikemen

-
+

Musketeers

Cost: 30 shields
@@ -808,10 +879,9 @@

Musketeers

Firepower: 1
Hitpoints: 20
Obsolete by: Riflemen
-
Musketeers are infantry equipped with early firearms. They replace Pikemen as the preferred city defender, and replace Archers and Legions for offensive foot soldiers. The discovery of Labor Union allows upgrading Musketeers to Riflemen for free in any domestic city.
+
Musketeers are infantry equipped with early firearms. They replace Pikemen as the preferred city defender, and replace Archers and Legions for offensive foot soldiers. The discovery of Labor Union allows converting Musketeers to Riflemen for free in any domestic city.
 
-
-The discovery of Banking changes upkeep from shields to gold.
+The discovery of Banking changes upkeep from shields to gold.
 
➤ Belongs to Land unit class. • Can occupy empty enemy cities. • Subject to zones of control. @@ -821,13 +891,16 @@

Musketeers

➤ Unable to attack air units. ➤ May load onto and disembark from Trains or Transport Helicopters even when underway. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ The discovery of Banking converts the shield upkeep of this unit to 1 gold upkeep. -➤ Under certain conditions, cities can make more than one of this unit per turn, plus one of any other unit type. +➤ Multislot: Under certain conditions, cities can make one (or more) multislot unit(s) per turn, plus one of any other unit type. ➤ Can Capture Unit • target unit must be alone, not on Mountains, and not in a Fort, Fortress, or Naval Base. + • uses ⅔ movement point + • actor stays on its own tile ➤ Can Expel • target unit must be alone and not on Mountains. - • uses one movement point + • uses ⅔ movement point • actor stays on its own tile ➤ Can Upgrade • upgrades to Riflemen. @@ -858,7 +931,7 @@

Musketeers

-
+

Falconeers

Cost: 20 shields
@@ -872,8 +945,7 @@

Falconeers

Obsolete by: Zealots
Falconeers are Theocratic holy warriors armed with Falconets—the largest hand cannons humans can carry. Ottoman Janissaries, Reconquistadores, Persian Safavid, and Indian Mughal used them to prove whose side God is on.
 Falconets are huge and heavy. They have woeful accuracy but lethal firepower:they either kill or totally miss. On paper, attack odds are closest to a Musketeer (A3). Yet there is a high chance of losing when a win is expected, or winning when a loss is expected. The outcome is in God's hands! Falconeers defend a bit worse than they attack.
-Righteous faith is needed to fight with slow heavy inaccurate weaponry: only Theocracies can train Falconeers. Other governments will incur high upkeep or see them retire.
-
+Righteous faith is needed to fight with slow heavy inaccurate weaponry: only Theocracies can train Falconeers. Other governments will incur high upkeep or see them retire.
 
➤ Belongs to Land unit class. • Can occupy empty enemy cities. • Subject to zones of control. @@ -883,12 +955,15 @@

Falconeers

➤ Unable to attack air units. ➤ May load onto and disembark from Trains or Transport Helicopters even when underway. ➤ May impose a zone of control on its adjacent tiles. -➤ Under certain conditions, cities can make more than one of this unit per turn, plus one of any other unit type. + • Prevents enemy cities from working the tile it's on. +➤ Multislot: Under certain conditions, cities can make one (or more) multislot unit(s) per turn, plus one of any other unit type. ➤ Can Capture Unit • target unit must be alone, not on Mountains, and not in a Fort, Fortress, or Naval Base. + • uses ⅔ movement point + • actor stays on its own tile ➤ Can Expel • target unit must be alone and not on Mountains. - • uses one movement point + • uses ⅔ movement point • actor stays on its own tile ➤ Can Upgrade • upgrades to Zealots. @@ -924,11 +999,11 @@

Falconeers

-
-

Zealots

+
+

Partisan

-
Cost: 20 shields
-
Upkeep: 1 Shield, 2 Unhappy
+
Cost: 45 shields
+
Upkeep: 1 Unhappy
Moves: 2
Vision: 2.00 tiles
Attack: 4
@@ -936,37 +1011,36 @@

Zealots

Firepower: 1
Hitpoints: 20
Obsolete by: None
-
Zealots are warriors devoted to a higher cause. Their faith is strong and they cannot be bribed.
-Theocratic nations can maintain Zealots without paying their steep upkeep. (Zealots are unhappy if not under Theocracy, requiring high upkeep to stay content.) Zealots produced in a city with Ecclesiastical Palace are inspired by fervorous faith to +1 higher veteran level.
-Zealots zealously defend their homeland, and can do surprise skirmish assaults to snipe and injure foreign occupants: Up to 4 invaders on the tile will endure three combat rounds without defense. Skirmish assaults can also be done to foreign occupied cities if they have a remaining Foreign National population.
+
Partisans are guerilla fighters who can use the terrain to their advantage. Like the Scout that they upgrade, they can slip through ZOC and live off the land with no upkeep, and gain +²⁄₉ move per veteran level. Partisans provide sentry intel even if not sentried. 
 
-
-
-The discovery of Banking changes upkeep from shields to gold.
+Proportional to city size, up to 8 Partisans appear when an enemy conquers your city. They randomly fortify on any tile inside the circle defined by its workable radius. Partisans prefer defensive tiles, and ignore tile nationality. They spawn only when:
+➣ Guerilla Warfare is known by any player.
+➣ The city was originally built by you.
+➣ You must be Theocratic, OR,
+➣ You must be Democracy or Communist, AND know Communism AND Gunpowder.
 
➤ Belongs to Land unit class. • Can occupy empty enemy cities. - • Subject to zones of control. • Slowed down while damaged. • AIRLIFT: Can be airlifted if it has remaining moves. • Can't attack as Cargo. Must first unload. -➤ Can only be built with Theocracy as government. -➤ Can safely conduct Skirmish Assaults. (Ranged Attack) - • Gives 3 free rounds of combat against up to 4 units in an enemy stack. - • Uses 159 movement points. - • Can do this action while transported. - • Must be inside domestic territory OR attacking a City with foreign nationals. - • Cannot be done to Fortresses, Naval Bases, or Oceanic Tiles. - • No unit can be killed. +➤ Never has a home city. +➤ Reconnaissance: reports visible enemy movement even if not sentried. ➤ Unable to attack air units. ➤ May load onto and disembark from Trains or Transport Helicopters even when underway. +➤ Ignores terrain effects (moving costs at most 1/3 MP per tile). ➤ May impose a zone of control on its adjacent tiles. -➤ Under certain conditions, cities can make more than one of this unit per turn, plus one of any other unit type. + • Prevents enemy cities from working the tile it's on. +➤ Not subject to zones of control imposed by other units. +➤ The discovery of Banking converts the shield upkeep of this unit to 1 gold upkeep. +➤ Multislot: Under certain conditions, cities can make one (or more) multislot unit(s) per turn, plus one of any other unit type. ➤ Can attack against Helicopter units, which are usually not reachable. ➤ Can Capture Unit • target unit must be alone, not on Mountains, and not in a Fort, Fortress, or Naval Base. + • uses ⅔ movement point + • actor stays on its own tile ➤ Can Expel • target unit must be alone and not on Mountains. - • uses one movement point + • uses ⅔ movement point • actor stays on its own tile ➤ Attacking with fractional move points gives fractional attack power. ➤ Can Conquer City @@ -975,76 +1049,80 @@

Zealots

• Gets the 50% defensive bonus automatically while in cities. ➤ Can Make Hideout • Requires Forest, Jungle, Swamp, or Mountains. Land units will be invisible. -➤ Can't be bribed. ➤ May acquire veteran status. • Veterans have increased strength in combat. -Veteran Levels for Zealots are the standard ruleset default: +Veteran Levels for Partisans are unique to this unit type:
- - - - - -
Veteran levelPower factorPromotion OddsMove bonus
green100%50% -
veteran150%33% -
hardened175%20% -
elite200%15% -
crack210%15% + 1/9
master220%15% + 1/9
champion230%-+ 1/9
+veteran150%33% + 2/9 +hardened175%20% + 4/9 +elite200%15% + 2/3 +crack210%15% + 8/9 +master220%15% +1 1/9 +wind walker230%-+1 1/3
Transport Loading Logistics Transport Unloading Logistics
-
-

Partisan

+
+

Riflemen

-
Cost: 50 shields
-
Upkeep: 1 Unhappy
+
Cost: 40 shields
+
Upkeep: 1 Gold, 1 Unhappy
Moves: 2
Vision: 2.00 tiles
-
Attack: 4
+
Attack: 5
Defense: 4
Firepower: 1
Hitpoints: 20
-
Obsolete by: None
-
Partisans are guerilla fighters who can use the terrain to their advantage.  Like the Scout that they upgrade, they can slip through ZOC and live off the land with no upkeep.
-Proportional to city size, up to 8 Partisans appear when an enemy conquers your city. They randomly fortify on any tile inside the circle defined by its workable radius. Partisans prefer defensive tiles, and ignore tile nationality. They spawn only when:
-➣ Guerilla Warfare is known by any player.
-➣ The city was originally built by you.
-➣ You must be Theocratic, OR,
-➣ You must be Democracy or Communist, AND know Communism AND Gunpowder.
+
Obsolete by: Ground Troops
+
Riflemen are World War-era infantry. They are good at defending cities and strategic Fortresses. They also have good attack capability.  
+
+Under Communism this unit costs 5 less. Also, Communism tech allows Communist governments to de-commission Riflemen into Workers II via the Convert order. And vice versa. 
+
+The discovery of Banking changes upkeep from shields to gold.
 
➤ Belongs to Land unit class. • Can occupy empty enemy cities. + • Subject to zones of control. • Slowed down while damaged. • AIRLIFT: Can be airlifted if it has remaining moves. • Can't attack as Cargo. Must first unload. -➤ Never has a home city. +➤ Under Communism, may be obtained by conversion of Workers. ➤ Unable to attack air units. -➤ May load onto and disembark from Trains or Transport Helicopters even when underway. -➤ Ignores terrain effects (moving costs at most 1/3 MP per tile). ➤ May impose a zone of control on its adjacent tiles. -➤ Not subject to zones of control imposed by other units. + • Prevents enemy cities from working the tile it's on. ➤ The discovery of Banking converts the shield upkeep of this unit to 1 gold upkeep. -➤ Under certain conditions, cities can make more than one of this unit per turn, plus one of any other unit type. +➤ Multislot: Under certain conditions, cities can make one (or more) multislot unit(s) per turn, plus one of any other unit type. ➤ Can attack against Helicopter units, which are usually not reachable. ➤ Can Capture Unit • target unit must be alone, not on Mountains, and not in a Fort, Fortress, or Naval Base. + • uses ⅔ movement point + • actor stays on its own tile ➤ Can Expel • target unit must be alone and not on Mountains. - • uses one movement point + • uses ⅔ movement point • actor stays on its own tile +➤ Can Upgrade + • upgrades to Ground Troops. + • upgrade cost is 4 gold. ➤ Attacking with fractional move points gives fractional attack power. ➤ Can Conquer City ➤ Can Pillage ➤ Can Fortify, granting a 50% defensive bonus when not in a city. • Gets the 50% defensive bonus automatically while in cities. +➤ Can Convert Unit + • is converted into Workers (takes 2 MP). ➤ Can Make Hideout • Requires Forest, Jungle, Swamp, or Mountains. Land units will be invisible. ➤ May acquire veteran status. • Veterans have increased strength in combat. -Veteran Levels for Partisans are the standard ruleset default: +Veteran Levels for Riflemen are the standard ruleset default:
@@ -1061,22 +1139,22 @@

Partisan

-
-

Riflemen

+
+

Zealots

-
Cost: 40 shields
-
Upkeep: 1 Shield, 1 Unhappy
+
Cost: 20 shields
+
Upkeep: 1 Shield, 2 Unhappy
Moves: 2
Vision: 2.00 tiles
-
Attack: 5
+
Attack: 4
Defense: 4
Firepower: 1
Hitpoints: 20
Obsolete by: None
-
Riflemen are World War-era infantry. They are good at defending cities and strategic Fortresses. They also have good attack capability. 
-
-Under Communism this unit costs 5 less. Also, Communism tech allows Communist governments to de-commission Riflemen into Workers via the Convert order. And vice versa.
-
+
Zealots are warriors devoted to a higher cause. Their faith is strong and they cannot be bribed.
+Theocratic nations can maintain Zealots without paying their steep upkeep. (Zealots are unhappy if not under Theocracy, requiring high upkeep to stay content.) Zealots produced in a city with Ecclesiastical Palace are inspired by fervorous faith to +1 higher veteran level.
+Zealots fervently defend their homeland, and can do surprise skirmish assaults to snipe and injure foreign occupants: Up to 4 invaders on the tile will endure three combat rounds without defense. Skirmish assaults can also be done to foreign occupied cities if they have a remaining Foreign National population.
+Zealots can Estabish Home City in any allied city that is Theocracy, allowing control to pass between nations who share the same faith.
 
 The discovery of Banking changes upkeep from shields to gold.
 
➤ Belongs to Land unit class. @@ -1085,34 +1163,40 @@

Riflemen

• Slowed down while damaged. • AIRLIFT: Can be airlifted if it has remaining moves. • Can't attack as Cargo. Must first unload. -➤ Under Communism, may be obtained by conversion of Workers. +➤ Can only be built with Theocracy as government. +➤ Can safely conduct Skirmish Assaults. (Ranged Attack) + • Gives 3 free rounds of combat against up to 4 units in an enemy stack. + • Uses 159 movement points. + • Can do this action while transported. + • Must be inside domestic territory OR attacking a City with foreign nationals. + • Cannot be done to Fortresses, Naval Bases, or Oceanic Tiles. + • No unit can be killed. ➤ Unable to attack air units. +➤ May load onto and disembark from Trains or Transport Helicopters even when underway. ➤ May impose a zone of control on its adjacent tiles. -➤ The discovery of Banking converts the shield upkeep of this unit to 1 gold upkeep. -➤ Under certain conditions, cities can make more than one of this unit per turn, plus one of any other unit type. + • Prevents enemy cities from working the tile it's on. +➤ Multislot: Under certain conditions, cities can make one (or more) multislot unit(s) per turn, plus one of any other unit type. ➤ Can attack against Helicopter units, which are usually not reachable. ➤ Can Capture Unit • target unit must be alone, not on Mountains, and not in a Fort, Fortress, or Naval Base. + • uses ⅔ movement point + • actor stays on its own tile ➤ Can Expel • target unit must be alone and not on Mountains. - • uses one movement point + • uses ⅔ movement point • actor stays on its own tile -➤ Can Upgrade - • upgrades to Ground Troops. - • upgrade cost is 4 gold. ➤ Attacking with fractional move points gives fractional attack power. ➤ Can Conquer City ➤ Can Pillage ➤ Can Fortify, granting a 50% defensive bonus when not in a city. • Gets the 50% defensive bonus automatically while in cities. -➤ Can Convert Unit - • is converted into Workers (takes 2 MP). ➤ Can Make Hideout • Requires Forest, Jungle, Swamp, or Mountains. Land units will be invisible. +➤ Can't be bribed. ➤ May acquire veteran status. • Veterans have increased strength in combat. -Veteran Levels for Riflemen are the standard ruleset default: +Veteran Levels for Zealots are the standard ruleset default:
Veteran levelPower factorPromotion OddsMove bonus

@@ -1129,22 +1213,21 @@

Riflemen

-
+

Alpine Troops

Cost: 50 shields
-
Upkeep: 1 Shield, 1 Unhappy
+
Upkeep: 1 Gold, 1 Unhappy
Moves: 2
Vision: 2.00 tiles
Attack: 5
Defense: 5
Firepower: 1
Hitpoints: 20
-
Obsolete by: None
+
Obsolete by: Ground Troops
Alpine Troops are highly mobile units and excellent defenders.  Similar to a Scout, they treat every land tile like a road were on it.
 
-
-The discovery of Banking changes upkeep from shields to gold.
+The discovery of Banking changes upkeep from shields to gold.
 
➤ Belongs to Land unit class. • Can occupy empty enemy cities. • Subject to zones of control. @@ -1155,14 +1238,17 @@

Alpine Troops

➤ May load onto and disembark from Trains or Transport Helicopters even when underway. ➤ Ignores terrain effects (moving costs at most ⅓ MP per tile). ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ The discovery of Banking converts the shield upkeep of this unit to 1 gold upkeep. -➤ Under certain conditions, cities can make more than one of this unit per turn, plus one of any other unit type. +➤ Multislot: Under certain conditions, cities can make one (or more) multislot unit(s) per turn, plus one of any other unit type. ➤ Can attack against Helicopter units, which are usually not reachable. ➤ Can Capture Unit • target unit must be alone, not on Mountains, and not in a Fort, Fortress, or Naval Base. + • uses ⅔ movement point + • actor stays on its own tile ➤ Can Expel • target unit must be alone and not on Mountains. - • uses one movement point + • uses ⅔ movement point • actor stays on its own tile ➤ Can Upgrade • upgrades to Ground Troops. @@ -1194,11 +1280,11 @@

Alpine Troops

-
+

Marines

-
Cost: 60 shields
-
Upkeep: 1 Shield, 1 Unhappy
+
Cost: 55 shields
+
Upkeep: 1 Gold, 1 Unhappy
Moves: 2
Vision: 2.83 tiles
Attack: 8
@@ -1206,24 +1292,27 @@

Marines

Firepower: 1
Hitpoints: 20
Obsolete by: None
-
Marines are experts at all-terrain warfare. They are the strongest foot unit in the game, and are armed with diverse weaponry.
-Unlike other units, Marines can attack Sea units (at a 50% penalty). Air units do not stop them from attacking reachable targets. They can attack while fortified and maintain fortified status. They can attack from a Transport or Helicopter, and can offload without losing a turn of movement. Marines can make Forts and Airbases. Marines get an extra 2/9 movement points for each veteran level they possess. Starting at v2, they gain the ability to do long-range bazooka attacks for 3 combat rounds, hitting up to 2 units on the tile and killing a maximum of 1.
-Bazooka attacks can be done to Ocean tiles if the Marines aren't transported.
-
-Marines built in a city with an Airport, Port Facility, and Barracks III receive an extra veteran level.
-
-
-The discovery of Banking changes upkeep from shields to gold.
+
Marines are experts at all-terrain warfare. Armed with diverse weaponry, they are the strongest foot unit in the game. Marines have special abilities. They can:
+  ▪ Attack Sea units (at a 50% penalty). 
+  ▪ Attack while fortified and maintain fortified status. 
+  ▪ Attack from a Transport or Helicopter. 
+  ▪ Attack reachable targets on a tile without being blocked by Fighters. 
+  ▪ Do Bazooka attacks, if vet-2: 3 rounds on 2 units, max. 1 kill. 
+  ▪ Do Bazooka attacks on ocean tiles, if not transported. 
+  ▪ Disembark from non-native tiles using only 1 move point. 
+  ▪ (De)board and (un)load without using or needing move points. 
+  ▪ Make Forts and Airbases.
+ 
+Marines gain greater strength bonuses with veterancy, and get +2/9 move points for each veteran level. Marines built in a city with an Airport, Port Facility, and Barracks III receive an extra veteran level.
 
➤ Belongs to LandAirSea unit class. • Can attack from Ships and Helicopters. • Can occupy empty enemy cities. • Subject to zones of control. • Slowed down while damaged. - • Can attack units on non-native tiles. • AIRLIFT: Can be airlifted if it has remaining moves. - • Can launch attack from non-native tiles. + • Can attack ocean tiles, even while transported. + • Can attack from ocean tiles, while transported.Unblockable: unreachable units can't block its attacks on reachable units. -➤ Can launch attack from non-native tiles and while transported. ➤ Can safely conduct Bazooka Attacks. (Ranged Attack) • Gives 3 free rounds of combat against up to 2 units in an enemy stack. • Uses 159 movement points. @@ -1233,24 +1322,37 @@

Marines

• Cannot be done to a City, Fortress, or Naval Base. • A maximum of 1 unit can be killed. • Can do action while fortified and remain fortified afterwards. - - Using the D command to click the target will preserve fortified status of Marines. +➤ Can attack while fortified and remain fortified afterwards. +➤ Can attack reachable units on ocean tiles. ➤ May load and unload from Trains and Helicopters even when underway. -➤ Won't lose all movement when moving from non-native terrain to native terrain, or unloading from transport. +➤ Loses only 1 move point when disembarking from non-native terrain to native terrain. + • Native disembark uses terrain move cost. +➤ Transport Board and Transport Deboard do not use or need move points. + • The same is true when the AAA is the affected cargo of Transport Load, Transport Unload. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ The discovery of Banking converts the shield upkeep of this unit to 1 gold upkeep. -➤ Under certain conditions, cities can make more than one of this unit per turn, plus one of any other unit type. +➤ Multislot: Under certain conditions, cities can make one (or more) multislot unit(s) per turn, plus one of any other unit type. +➤ Can attack against Sea units, which are usually not reachable. + • attacks at a -50% penalty. ➤ Can attack against Helicopter units, which are usually not reachable. ➤ Can Capture Unit • target unit must be alone, not on Mountains, and not in a Fort, Fortress, or Naval Base. + • uses ⅔ movement point + • actor stays on its own tile ➤ Can Expel • target unit must be alone and not on Mountains. - • uses one movement point + • uses ⅔ movement point • actor stays on its own tile ➤ Attacking with fractional move points gives fractional attack power. ➤ Can Conquer City ➤ Can Pillage ➤ Can Fortify, granting a 50% defensive bonus when not in a city. • Gets the 50% defensive bonus automatically while in cities. +➤ Can Build Bases + • can build Fort and Airbase. + • cannot build Fortress, Naval Base, Castle, Bunker, Radar, or Buoy. + • veteran work rates apply. ➤ Can Make Hideout • Requires Forest, Jungle, Swamp, or Mountains. Land units will be invisible. ➤ May acquire veteran status. @@ -1273,7 +1375,7 @@

Marines

-
+

Ground Troops

Cost: 40 shields
@@ -1285,7 +1387,7 @@

Ground Troops

Firepower: 1
Hitpoints: 20
Obsolete by: None
-
Ground Troops upgrade earlier infantry with better weaponry. The upgrade cost for Riflemen and Alpine Troops is 4 gold. Veteran Ground Troops enjoy a +⅓ move bonus. Ground Troops can stay fortified while attacking, and veterans enjoy a +⅓ move bonus.
+
Ground Troops upgrade earlier infantry with better weaponry. The upgrade cost for Riflemen and Alpine Troops is 4 gold. Ground Troops can stay fortified while attacking, and veterans enjoy a +⅓ move bonus.
 
➤ Belongs to Land unit class. • Can occupy empty enemy cities. • Subject to zones of control. @@ -1294,13 +1396,16 @@

Ground Troops

• Can't attack as Cargo. Must first unload. ➤ Unable to attack air units. ➤ May impose a zone of control on its adjacent tiles. -➤ Under certain conditions, cities can make more than one of this unit per turn, plus one of any other unit type. + • Prevents enemy cities from working the tile it's on. +➤ Multislot: Under certain conditions, cities can make one (or more) multislot unit(s) per turn, plus one of any other unit type. ➤ Can attack against Helicopter units, which are usually not reachable. ➤ Can Capture Unit • target unit must be alone, not on Mountains, and not in a Fort, Fortress, or Naval Base. + • uses ⅔ movement point + • actor stays on its own tile ➤ Can Expel • target unit must be alone and not on Mountains. - • uses one movement point + • uses ⅔ movement point • actor stays on its own tile ➤ Attacking with fractional move points gives fractional attack power. ➤ Can Conquer City @@ -1319,23 +1424,23 @@

Ground Troops


- - - - - -
Veteran levelPower factorPromotion OddsMove bonus
Veteran levelPower factorPromotion OddsMove bonus
green100%50% -
veteran150%33% -
hardened175%20% -
elite200%15% -
crack210%15% + 1/9
master220%15% + 1/9
champion230%-+ 1/9
+veteran150%33% + 1/3 +hardened175%20% + 1/3 +elite200%15% + 1/3 +crack210%15% + 1/3 +master220%15% + 1/3 +champion230%-+ 1/3
Transport Loading Logistics Transport Unloading Logistics
-
+

Paratroopers

-
Cost: 60 shields
-
Upkeep: 1 Shield, 1 Unhappy
+
Cost: 55 shields
+
Upkeep: 1 Gold, 1 Unhappy
Moves: 2
Vision: 2.00 tiles
Attack: 6
@@ -1356,14 +1461,17 @@

Paratroopers

➤ Unable to attack air units. ➤ May load onto and disembark from Trains or Transport Helicopters even when underway. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ The discovery of Banking converts the shield upkeep of this unit to 1 gold upkeep. -➤ Under certain conditions, cities can make more than one of this unit per turn, plus one of any other unit type. +➤ Multislot: Under certain conditions, cities can make one (or more) multislot unit(s) per turn, plus one of any other unit type. ➤ Can attack against Helicopter units, which are usually not reachable. ➤ Can Capture Unit • target unit must be alone, not on Mountains, and not in a Fort, Fortress, or Naval Base. + • uses ⅔ movement point + • actor stays on its own tile ➤ Can Expel • target unit must be alone and not on Mountains. - • uses one movement point + • uses ⅔ movement point • actor stays on its own tile ➤ Can Paradrop • target must be between 1 and 14 tiles away. @@ -1397,11 +1505,11 @@

Paratroopers

-
+

Mechanized Infantry

Cost: 50 shields
-
Upkeep: 1 Shield, 1 Unhappy
+
Upkeep: 1 Gold, 1 Unhappy
Moves: 6
Vision: 2.00 tiles
Attack: 6
@@ -1411,8 +1519,7 @@

Mechanized Infantry

Obsolete by: None
Mechanized Infantry have the strongest general defense strength of any land unit. They have decent attack strength in open field engagements, and excellent mobility.
 
-
-Upkeep for Mechanized infantry is paid in gold instead of shields.
+Upkeep for Mechanized infantry is paid in gold instead of shields.
 
➤ Belongs to Land unit class. • Can occupy empty enemy cities. • Subject to zones of control. @@ -1422,12 +1529,13 @@

Mechanized Infantry

➤ Unable to attack air units. ➤ May load onto Transport Helicopters even when underway. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ The discovery of Banking converts the shield upkeep of this unit to 1 gold upkeep. -➤ Under certain conditions, cities can make more than one of this unit per turn, plus one of any other unit type. +➤ Multislot: Under certain conditions, cities can make one (or more) multislot unit(s) per turn, plus one of any other unit type. ➤ Can attack against Helicopter units, which are usually not reachable. ➤ Can Expel • target unit must be alone and not on Mountains. - • uses one movement point + • uses ⅔ movement point • actor stays on its own tile ➤ Attacking with fractional move points gives fractional attack power. ➤ Can Conquer City @@ -1454,7 +1562,63 @@

Mechanized Infantry

-
+
+

Scout

+ +
Cost: 30 shields
+
Upkeep: 0
+
Moves: 2
+
Vision: 2.24 tiles
+
Attack: 0
+
Defense: 1
+
Firepower: 1
+
Hitpoints: 10
+
Obsolete by: Partisan
+
Scouts are explorers of unknown territory. They live off the land with no upkeep. They can slip through ZOC. They ignore terrain penalties, treating every tile as if it had a road. They can move 4 tiles per turn (6 after discovering Map Making.) For each veteran level, they gain an additional +²⁄₉ move point. Scouts can Investigate City to gather intel, and their terrain scouting can give tactical advantage. Scouts can make contact with far-off lands to arrange Cease-fire or Peace. In later times, Scouts upgrade to Partisans. 
+
+Scouts provide sentry intel even if not sentried. Scouts gain the same veteran levels from buildings and wonders as other land units.
+
➤ Belongs to Land unit class. + • Slowed down while damaged. + • AIRLIFT: Can be airlifted if it has remaining moves. +➤ Ignores terrain effects (moving costs at most 1/3 MP per tile). +➤ Map Making gives +2/3 moves, giving a range of +2 tiles. +➤ Never imposes a zone of control. +➤ Not subject to zones of control imposed by other units. +➤ Reconnaissance: reports visible enemy movement even if not sentried. +➤ A non-military unit: + • Cannot attack. + • Doesn't impose martial law. + • Can enter foreign territory regardless of peace treaty. + • Doesn't prevent enemy cities from working the tile it's on. +➤ Can Investigate City (does not spend the unit) +➤ Can Upgrade + • upgrades to Partisan. +➤ Can Fortify, granting a 50% defensive bonus when not in a city. + • Gets the 50% defensive bonus automatically while in cities. +➤ Capturable: can be captured if conditions allow it. +➤ Expellable: can be expelled from foreign tiles. +➤ May acquire veteran status. + • Can get veteran status when built, from Barracks and wonders. + • Veterans have increased strength in combat. + +Veteran Levels for Scouts are unique to this unit type: + + +
+ + + + + + +
Veteran levelPower factorPromotion OddsMove bonus
green100%50% -
veteran150%33% + 2/9
hardened175%20% + 4/9
elite200%15% + 2/3
crack210%15% + 8/9
master220%15% +1 1/9
wind walker230%-+1 1/3
+
Transport Loading Logistics + +Transport Unloading Logistics + +
+
+

Horsemen

Cost: 18 shields
@@ -1477,9 +1641,10 @@

Horsemen

➤ Knights defend at 3 when attacked by this unit. ➤ Unable to attack air units. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can Expel • target unit must be alone and not on Mountains. - • uses one movement point + • uses ⅔ movement point • actor stays on its own tile ➤ Can Upgrade • upgrades to Knights or, when possible, to the unit type it upgrades to. @@ -1508,7 +1673,7 @@

Horsemen

-
+

Chariot

Cost: 27 shields
@@ -1531,11 +1696,14 @@

Chariot

➤ Knights defend at 3 when attacked by this unit. ➤ Unable to attack air units. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can Capture Unit • target unit must be alone, not on Mountains, and not in a Fort, Fortress, or Naval Base. + • uses ⅔ movement point + • actor stays on its own tile ➤ Can Expel • target unit must be alone and not on Mountains. - • uses one movement point + • uses ⅔ movement point • actor stays on its own tile ➤ Can Upgrade • upgrades to Knights or, when possible, to the unit type it upgrades to. @@ -1564,7 +1732,7 @@

Chariot

-
+

Elephants

Cost: 36 shields
@@ -1587,11 +1755,14 @@

Elephants

➤ Knights defend at 3 when attacked by this unit. ➤ Unable to attack air units. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can Capture Unit • target unit must be alone, not on Mountains, and not in a Fort, Fortress, or Naval Base. + • uses ⅔ movement point + • actor stays on its own tile ➤ Can Expel • target unit must be alone and not on Mountains. - • uses one movement point + • uses ⅔ movement point • actor stays on its own tile ➤ Can Upgrade • upgrades to Crusaders or, when possible, to the unit type it upgrades to. @@ -1620,34 +1791,40 @@

Elephants

-
-

Crusaders

+
+

Knights

Cost: 38 shields
Upkeep: 1 Shield, 1 Unhappy
Moves: 4
Vision: 2.00 tiles
-
Attack: 5
-
Defense: 1
+
Attack: 4
+
Defense: 2
Firepower: 1
Hitpoints: 10
Obsolete by: Dragoons
-
Crusaders are mounted warriors driven by a higher cause. They have superior attack to Knights, but are poor at defending. They are ideally suited for leading the charge in offensive campaigns.
-
➤ Belongs to Land unit class. +
Knights are heavily armored mounted warriors. They defend at D3 against mounted units. Their noble status allows them to attack cities without population reduction, and conquer a size 1 city without destroying it.
+
➤ Belongs to LandNoKill unit class. + • Does not reduce population when attacking city. • Can occupy empty enemy cities. • Subject to zones of control. • Slowed down while damaged. • AIRLIFT: Can be airlifted if it has remaining moves. • Can't attack as Cargo. Must first unload. +➤ 3× defense bonus if attacked by Horsemen, Chariot, Elephants, Crusaders, Knights, or Dragoons. +➤ 2× defense bonus if attacked by Foot Soldiers. ➤ Attack value halved when attacking Pikemen. ➤ Knights defend at 3 when attacked by this unit. ➤ Unable to attack air units. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can Capture Unit • target unit must be alone, not on Mountains, and not in a Fort, Fortress, or Naval Base. + • uses ⅔ movement point + • actor stays on its own tile ➤ Can Expel • target unit must be alone and not on Mountains. - • uses one movement point + • uses ⅔ movement point • actor stays on its own tile ➤ Can Upgrade • upgrades to Dragoons or, when possible, to the unit type it upgrades to. @@ -1659,7 +1836,7 @@

Crusaders

➤ May acquire veteran status. • Veterans have increased strength in combat. -Veteran Levels for Crusaders are the standard ruleset default: +Veteran Levels for Knights are the standard ruleset default:
@@ -1676,37 +1853,37 @@

Crusaders

-
-

Knights

+
+

Crusaders

Cost: 38 shields
Upkeep: 1 Shield, 1 Unhappy
Moves: 4
Vision: 2.00 tiles
-
Attack: 4
-
Defense: 1
+
Attack: 5
+
Defense: 1.5
Firepower: 1
Hitpoints: 10
Obsolete by: Dragoons
-
Knights are heavily armored mounted warriors. They defend at D:3 against mounted units. They defend at D:2 against foot units. They defend at D:1 against everything else. Their noble status allows them to attack cities without population reduction.
-
➤ Belongs to LandNoKill unit class. - • Does not reduce population when attacking city. +
Crusaders are mounted warriors driven by a higher cause. They have superior attack to Knights, but are only half as good defending against mounted units. They are ideally suited for leading the charge in offensive campaigns.
+
➤ Belongs to Land unit class. • Can occupy empty enemy cities. • Subject to zones of control. • Slowed down while damaged. • AIRLIFT: Can be airlifted if it has remaining moves. • Can't attack as Cargo. Must first unload. -➤ 3× defense bonus if attacked by Horsemen, Chariot, Elephants, Crusaders, Knights, or Dragoons. -➤ 2× defense bonus if attacked by Foot Soldiers. ➤ Attack value halved when attacking Pikemen. ➤ Knights defend at 3 when attacked by this unit. ➤ Unable to attack air units. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can Capture Unit • target unit must be alone, not on Mountains, and not in a Fort, Fortress, or Naval Base. + • uses ⅔ movement point + • actor stays on its own tile ➤ Can Expel • target unit must be alone and not on Mountains. - • uses one movement point + • uses ⅔ movement point • actor stays on its own tile ➤ Can Upgrade • upgrades to Dragoons or, when possible, to the unit type it upgrades to. @@ -1718,7 +1895,7 @@

Knights

➤ May acquire veteran status. • Veterans have increased strength in combat. -Veteran Levels for Knights are the standard ruleset default: +Veteran Levels for Crusaders are the standard ruleset default:
Veteran levelPower factorPromotion OddsMove bonus

@@ -1735,7 +1912,7 @@

Knights

-
+

Dragoons

Cost: 50 shields
@@ -1758,11 +1935,14 @@

Dragoons

➤ Knights defend at 3 when attacked by this unit. ➤ Unable to attack air units. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can Capture Unit • target unit must be alone, not on Mountains, and not in a Fort, Fortress, or Naval Base. + • uses ⅔ movement point + • actor stays on its own tile ➤ Can Expel • target unit must be alone and not on Mountains. - • uses one movement point + • uses ⅔ movement point • actor stays on its own tile ➤ Can Upgrade • upgrades to Cavalry or, when possible, to the unit type it upgrades to. @@ -1791,7 +1971,7 @@

Dragoons

-
+

Cavalry

Cost: 60 shields
@@ -1813,12 +1993,15 @@

Cavalry

➤ -50% attack penalty when attacking Helicopter. ➤ Unable to attack air units. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can attack against Helicopter units, which are usually not reachable. ➤ Can Capture Unit • target unit must be alone, not on Mountains, and not in a Fort, Fortress, or Naval Base. + • uses ⅔ movement point + • actor stays on its own tile ➤ Can Expel • target unit must be alone and not on Mountains. - • uses one movement point + • uses ⅔ movement point • actor stays on its own tile ➤ Can Upgrade • upgrades to Armor or, when possible, to the unit type it upgrades to. @@ -1847,19 +2030,21 @@

Cavalry

-
+

Armor

Cost: 80 shields
Upkeep: 1 Shield, 1 Unhappy
Moves: 6
Vision: 2.00 tiles
-
Attack: 10
+
Attack: 11
Defense: 5
Firepower: 1
Hitpoints: 30
Obsolete by: Armor II
-
Armor is the mechanized equivalent of a Cavalry unit. They have high attack strength, superb mobility, and the highest defense of any offensive unit. They are massive all-terrain vehicles, well-suited for penetrating defensive fortifications: Units inside Forts get no defense bonus against Armor. Units inside Fortresses get a reduced bonus of 1.67× instead of 2×.
+
Armor is the mechanized equivalent of a Cavalry unit. They have high attack strength, superb mobility, and the highest defense of any offensive unit. They are massive all-terrain vehicles, well-suited for penetrating defensive fortifications: Units inside Forts get no defense bonus against Armor. Units inside Fortresses get a reduced bonus of 1.67× instead of 2×.
+Communists pay 10 less for this unit.
+Stack-Escape:40% odds to evade stack-death if attacker doesn’t have more moves than it does.
 
➤ Belongs to Land unit class. • Can occupy empty enemy cities. • Subject to zones of control. @@ -1868,16 +2053,17 @@

Armor

• Can't attack as Cargo. Must first unload. ➤ Can safely iPillage: Instant Blitz Sack against tile infrastructure. • 75% odds of success. +5% for each veteran level. - • Destroys 1 selected infrastructural improvement on the tile, instantly. + • Destroys 1 selected infrastructural improvement on the tile, instantly. • Uses 2 movement points. ➤ Unable to attack air units. ➤ Defending Forts get no bonus. +33% attack bonus vs. Fortress (reduces it to 1.67× defense). ➤ May load onto Helicopter transports even when underway. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can attack against Helicopter units, which are usually not reachable. ➤ Can Expel • target unit must be alone and not on Mountains. - • uses one movement point + • uses ⅔ movement point • actor stays on its own tile ➤ Can Upgrade • upgrades to Armor II. @@ -1906,7 +2092,7 @@

Armor

-
+

Armor II

Cost: 85 shields
@@ -1918,7 +2104,9 @@

Armor II

Firepower: 1
Hitpoints: 30
Obsolete by: None
-
Armor II is the ultra-modern upgrade to Armor. It features high tech composite armor and electronic countermeasures (ECM). Forts and Fortresses gain no bonus against its ability to blast and break through fortifications. ECM and composite armor give a 2× defense bonus against Missiles. Unlike most land units, Armor II can attack reachable units regardless of whether unreachable units protect the tile.
+
Armor II is the ultra-modern upgrade to Armor. It features high tech composite armor and electronic countermeasures (ECM). Forts and Fortresses gain no bonus against its ability to blast and break through fortifications. ECM and composite armor give a 50% defense bonus against Missiles. Unlike most land units, Armor II can attack reachable units regardless of whether unreachable units protect the tile.
+
+Stack-Escape:40% odds to evade stack-death if attacker doesn’t have more moves than it does.
 
➤ Belongs to Land unit class. • Can occupy empty enemy cities. • Subject to zones of control. @@ -1927,7 +2115,7 @@

Armor II

• Can't attack as Cargo. Must first unload. ➤ Can safely iPillage: Instant Blitz Sack against tile infrastructure. • 75% odds of success. +5% for each veteran level. - • Destroys 1 selected infrastructural improvement on the tile, instantly. + • Destroys 1 selected infrastructural improvement on the tile, instantly. • Uses 2 movement points. ➤ 2× defense bonus if attacked by Cruise Missile. ➤ Unblockable: unreachable units can't block its attacks on reachable units. @@ -1936,10 +2124,11 @@

Armor II

Defending Fortresses get no bonus. ➤ May load onto Helicopter transports even when underway. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can attack against Helicopter units, which are usually not reachable. ➤ Can Expel • target unit must be alone and not on Mountains. - • uses one movement point + • uses ⅔ movement point • actor stays on its own tile ➤ Attacking with fractional move points gives fractional attack power. ➤ Can Conquer City @@ -1966,7 +2155,7 @@

Armor II

-
+

Catapult

Cost: 34 shields
@@ -1978,14 +2167,17 @@

Catapult

Firepower: 1
Hitpoints: 10
Obsolete by: Cannon
-
Catapults are large rock-throwing war machines. The ballistic delivery of massive stones diminishes the defense bonus vs land attacks by Fortifications and City Walls by -25%, yielding a 1.25× and 2.75× bonus, respectively. 
+
Catapults are rock-throwing war machines. Massive stones diminish the defense bonus of City Walls by -25%, down to 1.75×. 
 
+If they haven't moved, Catapults can do 4 rounds of Bombardment on a single unit, which may possibly be killed. When special attacked from range or rammed in a Fortress, they can retaliate with the same type of Bombardment. 
+  
+Catapults are weak defenders, and need an escort to be effective.
 
-Catapults are weak defenders, and will need an escort to be effective. Even so, it is better to rush attack them than do special unit attacks from range:when attacked from range or rammed in a Fortress, Catapults can retaliate for 4 rounds of combat.
+VIGIL:the Vigil order lets Catapults auto-Bombard adjacent military units if they have better attack odds. Can be done in cities or bases if it has used no moves. 
 
➤ Belongs to Land unit class, Ballistic sub-class. - • 25% is subtracted from the bonus of City defense improvements against Land attacks: - • Fortifications are reduced from 1.5× to 1.25× - • City Walls are reduced from 3× to 2.75× + • 25% is subtracted from the bonus of City Walls: + • Bonus reduced from 2× to 1.75× + • VIGIL: can be given the Vigil order to auto-Bombard adjacent military units. • Can occupy empty enemy cities. • Subject to zones of control. • Slowed down while damaged. @@ -1993,12 +2185,23 @@

Catapult

• Can't attack as Cargo. Must first unload. ➤ Unable to attack air units. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. +➤ Can safely conduct Bombard Attack. + • Gives 4 free rounds of combat against 1 unit in an enemy stack. + • Uses 2 movement points. + • A maximum of 1 unit can be killed. + • Can be done to ocean tiles if not transported. + • Cannot be done to Cities, Fortresses, Naval Bases, Castles, and Bunkers. + • Can do action while fortified and remain fortified afterwards. + • Action requires: + - a minimum of 2 move points + - Catapult to have used no moves this turn. ➤ Has Special Defense against Special Attacks / Ranged Attacks. • Gives 4 free rounds of combat against up to 1 unit in an enemy stack. • A maximum of 1 unit can be killed. ➤ Can Expel • target unit must be alone and not on Mountains. - • uses one movement point + • uses ⅔ movement point • actor stays on its own tile ➤ Can Upgrade • upgrades to Cannon or, when possible, to the unit type it upgrades to. @@ -2027,7 +2230,7 @@

Catapult

-
+

Siege Ram

Cost: 45 shields
@@ -2056,6 +2259,8 @@

Siege Ram

• Can't attack as Cargo. Must first unload. ➤ Can Destroy City WallsRequires one full remaining move point, at minimum. +➤ Can carry and 1 Foot soldier unit. + • Cargo not visible except to allies. ➤ Can safely conduct Ram Fortress. (Ranged Attack) • Gives 4 free round of combat on all units in an enemy Fortress or Naval Base. • Attack odds receive an 8.75× bonus. @@ -2066,6 +2271,7 @@

Siege Ram

• Cannot be done to any tile except a Fortress or Naval Base. ➤ Unable to attack air units. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can Upgrade • upgrades to Cannon or, when possible, to the unit type it upgrades to. ➤ Can Pillage @@ -2074,8 +2280,66 @@

Siege Ram

➤ May acquire veteran status. • Veterans have increased strength in unit-to-unit combat. -
-
+
+
+

Ballista

+ +
Cost: 45 shields
+
Upkeep: 1 Shield, 1 Unhappy
+
Moves: 2
+
Vision: 2.00 tiles
+
Attack: 1
+
Defense: 1
+
Firepower: 5
+
Hitpoints: 10
+
Obsolete by: Cannon
+
Ballistae don’t conventionally attack. Ranged Attack fires massive bolts through enemy formations for 5 rounds, targeting up to 2 units who can’t conventionally retaliate. This may also target Ocean tiles. They must have all their move points to do attack, and can't target Fortresses or Cities. Though they only have A1 accuracy, 5FP causes 5× damage. 
+
+When conventionally defending against foot and mounted units, Ballistae defend at 20% defense strength (0.2). This roughly cancels the 5× damage, making them like a D1 defender. However, a lucky hit or strong defensive terrain can reveal the 5FP as very effective. Against other attackers, the 5× damage is a deadly deterrent. 
+
+Ballistae excel at degrading forts and well-fortified tiles. Defensively, they are capable of Special Unit Defense, reciprocating against ranged attacks with their own retaliatory attack. 
+
+VIGIL:the Vigil order lets Ballistae automatically Range-Attack adjacent military units if they have better attack odds. Can be done in cities or bases if it has used no moves. 
+
➤ Belongs to Land unit class, Ballistic sub-class. + • VIGIL: can be given the Vigil order to auto-Bombard adjacent military units. + • Can occupy empty enemy cities. + • Subject to zones of control. + • Slowed down while damaged. + • AIRLIFT: Can be airlifted if it has remaining moves. + • Can safely conduct Ranged Attacks. + • Cannot do conventional combat attacks. +➤ -80% defense bonus if attacked by Mounted units or Foot Soldiers. +➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. +➤ Can safely conduct Ranged Attack. + • Gives 5 free rounds of combat on 2 units in an enemy stack. + • Uses 2 movement points. + • A maximum of 2 units can be killed. + • Cannot do this action while transported. + • Can be done to Oceanic tiles. + • Cannot be done to Cities, Fortresses, Naval Bases, Castles, and Bunkers. + • Action requires: + - a minimum of 2 move points + - Ballista to have used no moves this turn. +➤ Has Special Defense against Special Attacks / Ranged Attacks. + • Gives 5 free rounds of combat against up to 2 units in an enemy stack. + • A maximum of 2 units can be killed. +➤ Can Expel + • target unit must be alone and not on Mountains. + • uses ⅔ movement point + • actor stays on its own tile +➤ Can Upgrade + • upgrades to Cannon or, when possible, to the unit type it upgrades to. +➤ Attacking with fractional move points gives fractional attack power. +➤ Can Conquer City +➤ Can Pillage +➤ Can Fortify, granting a 50% defensive bonus when not in a city. + • Gets the 50% defensive bonus automatically while in cities. +➤ May acquire veteran status. + • Veterans have increased strength in combat. +
+
+

Cannon

Cost: 40 shields
@@ -2087,14 +2351,15 @@

Cannon

Firepower: 1
Hitpoints: 20
Obsolete by: Artillery
-
Cannons are huge guns that use gunpowder to fire massive metallic projectiles much faster and more accurately than earlier ballistic weapons. The aerial delivery of high speed massive metal gives an edge against Fortifications and City Walls. The defense bonuses vs. land attacks from those are reduced by -50%. This leaves Fortifications only with their terrain bonus, and reduces City walls to 2.5x.
+
Cannons are guns that fire massive metallic projectiles faster and more accurately than earlier ballistic weapons. This reduces the defense bonuses of City Walls in half, down to 1.5×. 
 
+If they haven't moved, Cannons can do 5 rounds of Bombardment on two units, with one possible fatality. When special attacked from range or rammed in a Fortress, they can retaliate with the same type of Bombardment.
 
-While Cannons are strong attackers, they are also weak defenders. Yet they are not without defensive purpose. They can retaliate 6 rounds of bombardment against special unit attacks from other units.
+VIGIL:the Vigil order lets Cannons auto-Bombard adjacent military units if they have better attack odds. Can be done in cities or bases if it has used no moves. 
 
➤ Belongs to Land unit class, Ballistic sub-class. - • 50% is subtracted from the bonus of City defense improvements against Land attacks: - • Fortifications are reduced to terrain bonus only. - • City Walls are reduced from 3× to 2.5× + • 50% is subtracted from the bonus of City Walls: + • Bonus reduced from 2× to 1.5× + • VIGIL: can be given the Vigil order to auto-Bombard adjacent military units. • Can occupy empty enemy cities. • Subject to zones of control. • Slowed down while damaged. @@ -2103,12 +2368,23 @@

Cannon

➤ Unable to attack air units. ➤ May load onto and disembark from Transport Helicopters even when underway. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. +➤ Can safely conduct Bombard Attack. + • Gives 5 free rounds of combat against up to 2 units in an enemy stack. + • Uses 2 movement points. + • A maximum of 1 unit can be killed. + • Can be done to ocean tiles if not transported. + • Cannot be done to Cities, Fortresses, Naval Bases, Castles, and Bunkers. + • Can do action while fortified and remain fortified afterwards. + • Action requires: + - a minimum of 2 move points + - Cannon to have used no moves this turn. ➤ Has Special Defense against Special Attacks / Ranged Attacks. • Gives 5 free rounds of combat against up to 2 units in an enemy stack. • A maximum of 1 unit can be killed. ➤ Can Expel • target unit must be alone and not on Mountains. - • uses one movement point + • uses ⅔ movement point • actor stays on its own tile ➤ Can Upgrade • upgrades to Artillery or, when possible, to the unit type it upgrades to. @@ -2120,7 +2396,7 @@

Cannon

➤ May acquire veteran status. • Veterans have increased strength in combat. -Veteran Levels for Siege Rams are the standard ruleset default: +Veteran Levels for Cannons are the standard ruleset default:
Veteran levelPower factorPromotion OddsMove bonus

@@ -2137,7 +2413,7 @@

Cannon

-
+

Artillery

Cost: 50 shields
@@ -2149,14 +2425,15 @@

Artillery

Firepower: 2
Hitpoints: 20
Obsolete by: Howitzer
-
Artillery are a major upgrade to Cannons, with doubled firepower. Accuracy and projectile speed go to a whole new level. Thus, they have an even greater bonus than their predecessors against Fortifications and City Walls. Such bonuses are reduced -75%. This leaves Fortifications only with their terrain bonus, and reduces the bonus from Walls down to 2.25x. 
+
Artillery upgrade Cannons with doubled firepower. Against Artillery, the bonus of City Walls is reduced -50% down to 1.5×. 
 
+If they haven’t moved, Artillery can do 6 rounds of Bombardment on three units, with one possible fatality. When special attacked from range, they retaliate with the same type of Bombardment.
 
-Like their predecessors, Artillery are poor at defense, and need an escort to be effective. However, they can retaliate 6 rounds of bombardment against special unit attacks from other units.
+VIGIL:the Vigil order lets Artillery auto-Bombard adjacent military units if they have better attack odds. Can be done in cities or bases if it has used no moves. 
 
➤ Belongs to Land unit class, Ballistic sub-class. - • 75% is subtracted from the bonus of City defense improvements against Land attacks: - • Fortifications are reduced to terrain bonus only. - • City Walls are reduced from 3× to 2.25×. + • 50% is subtracted from the bonus of City Walls: + • Bonus reduced from 2× to 1.5×. + • VIGIL: can be given the Vigil order to auto-Bombard adjacent military units. • Can occupy empty enemy cities. • Subject to zones of control. • Slowed down while damaged. @@ -2165,12 +2442,23 @@

Artillery

➤ Unable to attack air units. ➤ May load onto and disembark from Transport Helicopters even when underway. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. +➤ Can safely conduct Bombard Attack. + • Gives 6 free rounds of combat against up to 3 units in an enemy stack. + • Uses 2 movement points. + • A maximum of 1 unit can be killed. + • Can be done to ocean tiles if not transported. + • Cannot be done to Cities, Fortresses, Naval Bases, Castles, and Bunkers. + • Can do action while fortified and remain fortified afterwards. + • Action requires: + - a minimum of 2 move points + - Artillery to have used no moves this turn. ➤ Has Special Defense against Special Attacks / Ranged Attacks. • Gives 6 free rounds of combat against up to 3 units in an enemy stack. • A maximum of 1 unit can be killed. ➤ Can Expel • target unit must be alone and not on Mountains. - • uses one movement point + • uses ⅔ movement point • actor stays on its own tile ➤ Can Upgrade • upgrades to Howitzer. @@ -2199,11 +2487,11 @@

Artillery

-
+

Anti-Aircraft Artillery

Cost: 50 shields
-
Upkeep: 1 Shield, 1 Unhappy
+
Upkeep: 1 Gold, 1 Unhappy
Moves: 2
Vision: 2.83 tiles
Attack: 2
@@ -2211,32 +2499,34 @@

Anti-Aircraft Artillery

Firepower: 2
Hitpoints: 20
Obsolete by: None
-
Anti-Aircraft Artillery (AAA) can attack almost anything from anywhere. AAA get a 2× bonus against Air units. AAA qualify as weaponry for Marines and have the same abilities: they can be transported on any unit that carries Marines, can attack from or to non-native tiles, and do not lose a turn when unloading. Transported AAA defend their tile on both Land and Sea. (AAA cannot attack Submarines, Missiles, or Jet Bombers.)
-
+
Anti-Aircraft Artillery (AAA) get a 2× bonus against Air units. They can attack any tile. They can be transported by any unit that can carry Marines. Transported AAA can defend their tile, even at sea. AAA can’t attack while transported, and cannot attack Submarines, Missiles, and High Altitude aircraft.
 
-After Space Flight and 10 turns of service, AAA can be retrofitted to Mobile SAM. The Convert order must be done in your capital, and takes 4 turns.
+After Space Flight and 9 turns of service, AAA can be retrofitted to Mobile SAM. The Convert order must be done in a domestic capital, and takes 3 turns.
 
➤ Belongs to LandAirSea unit class. - • Can attack from Ships and Helicopters. + • Can be cargo on Ships and Helicopters. • Can occupy empty enemy cities. • Subject to zones of control. • Slowed down while damaged. - • Can attack units on non-native tiles. + • Can attack reachable units on ocean tiles.AIRLIFT: Can be airlifted if it has remaining moves. -➤ Can launch attack from non-native tiles and while transported. -➤ 2× attack bonus when attacking Fighter, Escort Fighter, Dive Bomber, Medium Bomber, Heavy Bomber, Strategic Bomber, Helicopter, Jet Fighter, Ground Strike Fighter, Stealth Fighter, or Stealth Bomber. -➤ 2× defense bonus if attacked by Fighter, Escort Fighter, Dive Bomber, Medium Bomber, Heavy Bomber, Strategic Bomber, Helicopter, Jet Fighter, Ground Strike Fighter, Jet Bomber, Stealth Fighter, or Stealth Bomber. + • Can't attack as Cargo. Must first unload. +➤ 2× attack bonus when attacking Airplanes and Helicopters. +➤ 2× defense bonus if attacked by Airplanes and Helicopters. ➤ Unblockable: unreachable units can't block its attacks on reachable units. -➤ Can launch attack from non-native tiles. -➤ Can defend while transported on non-native tiles. +➤ Can defend while transported on land and ocean tiles. ➤ Anti-Air bonus of this unit is less effective against Stealth, which has a 25% bonus against this unit. -➤ May load and unload from Trains and Helicopters even when underway. +➤ May load onto and disembark from Transport Helicopters even when underway. ➤ May impose a zone of control on its adjacent tiles. -➤ Can attack against Helicopter units, which are usually not reachable. -➤ Can attack against Air units, which are usually not reachable. -➤ Can attack against AirProtect units, which are usually not reachable. + • Prevents enemy cities from working the tile it's on. +➤ Can attack while fortified and remain fortified afterwards. +➤ Can attack units which are usually not reachable: + • Helicopter types. + • Sea units (with 50% penalty). + • Air and AirProtect units. +➤ Cannot attack Submarines, Cruise Missiles, Nuclear Missiles, Tactical Nukes, Jet Bombers, Spy Planes, or Satellites. ➤ Can Expel • target unit must be alone and not on Mountains. - • uses one movement point + • uses ⅔ movement point • actor stays on its own tile ➤ Attacking with fractional move points gives fractional attack power. ➤ Can Conquer City @@ -2244,9 +2534,9 @@

Anti-Aircraft Artillery

➤ Can Fortify, granting a 50% defensive bonus when not in a city. • Gets the 50% defensive bonus automatically while in cities. ➤ Can Convert Unit - • is converted into Mobile SAM (takes 4 turns). - • must be converted in capital city with same nationality as the unit. - • age of unit must be 10 turns or more + • is converted into Mobile SAM (takes 3 turns). + • must be converted in a domestic city with the same nationality as the unit. + • age of unit must be 9 turns or more ➤ May acquire veteran status. • Veterans have increased strength in combat. @@ -2262,12 +2552,12 @@

Anti-Aircraft Artillery

Veteran levelPower factorPromotion OddsMove bonus
master220%15% + 1/9
champion230%-+ 1/9

Transport Loading Logistics - + Transport Unloading Logistics - +
-
+

Mobile SAM

Cost: 75 shields
@@ -2279,30 +2569,34 @@

Mobile SAM

Firepower: 2
Hitpoints: 30
Obsolete by: None
-
The Mobile SAM is the strongest Anti-Air unit on the ground. It can attack nearby aircraft. It has a 2× bonus against all Air units. The Mobile SAM can also carry one Missile of any type. Unlike the AAA, it cannot attack non-native tiles or attack while transported.
+
The Mobile SAM is the strongest Anti-Air unit on the ground. It can attack nearby aircraft. It has a 2× bonus against all Air and Missile units. The Mobile SAM can also carry two Missiles of any type. Like the AAA, it can attack non-native tiles but not while transported. Transported Mobile SAMs can always defend their tile, even at sea. The discovery of Laser gives all units on its tile a 33% chance to survive nuclear attack.
 
-
-AAA can upgrade to Mobile SAM for free on its 10th turn of service. The Convert order must be done in the capital city and takes 4 turns.
+AAA can upgrade to Mobile SAM for free on its 9th turn of service. The Convert order must be done in a domestic city and takes 3 turns.
 
➤ Belongs to Land unit class. • Can occupy empty enemy cities. • Subject to zones of control. • Slowed down while damaged. + • Can attack reachable units on ocean tiles.AIRLIFT: Can be airlifted if it has remaining moves. • Can't attack as Cargo. Must first unload. ➤ 2× attack bonus when attacking Airplanes and Helicopters. -➤ 2× defense bonus if attacked by Airplanes and Helicopters. +➤ 2× defense bonus if attacked by Aircraft, Helicopter, or Cruise Missile. ➤ Unblockable: unreachable units can't block its attacks on reachable units. ➤ May be obtained by conversion of Anti-Aircraft Artillery. ➤ Anti-Air bonus of this unit is less effective against Stealth, which has a 25% bonus against this unit. -➤ Can carry and refuel 1 Missile unit. +➤ Can carry and refuel up to 2 Missile units. + • Cargo not visible except to allies. ➤ May impose a zone of control on its adjacent tiles. -➤ Can attack against Helicopter units, which are usually not reachable. -➤ Can attack against Air units, which are usually not reachable. -➤ Can attack against AirPillage units, which are usually not reachable. -➤ Can attack against AirProtect units, which are usually not reachable. + • Prevents enemy cities from working the tile it's on. +➤ Can attack units which are usually not reachable: + • Helicopter types. + • Sea units (with 50% penalty). + • Air, AirProtect, and AirHighAltitude units. +➤ Can defend units on its tile from Nuclear Attack: + • 33% chance of success, all units on tile will survive. ➤ Can Expel • target unit must be alone and not on Mountains. - • uses one movement point + • uses ⅔ movement point • actor stays on its own tile ➤ Attacking with fractional move points gives fractional attack power. ➤ Can Conquer City @@ -2313,7 +2607,7 @@

Mobile SAM

• Veterans have increased strength in combat.
-
+

Howitzer

Cost: 70 shields
@@ -2325,13 +2619,14 @@

Howitzer

Firepower: 2
Hitpoints: 30
Obsolete by: None
-
Howitzers are upgraded Artillery with a terrifying increase to mobility and attack strength. Fortifications get no bonus except their terrain bonus, and City Walls are completely ineffective against Howitzers. 
+
Howitzers are upgraded Artillery with a terrifying increase to mobility and attack strength. City Walls are completely ineffective against Howitzers. 
 
+If they haven't moved, Howitzers can do 7 rounds of Bombardment on four units, with one possible fatality. When special attacked from range, they can retaliate with the same type of Bombardment. This is a strong deterrent.
 
-While Howitzers are vulnerable when not escorted, they can retaliate 7 rounds of bombardment against special unit attacks from other units. This is a strong deterrent.
+VIGIL:the Vigil order lets Howitzers auto-Bombard adjacent military units if they have better attack odds. Can be done in cities or bases if it has used no moves. 
 
➤ Belongs to Land unit class, Ballistic sub-class. - • Fortifications are reduced to terrain bonus only. • City Walls get no bonus against this unit. + • VIGIL: can be given the Vigil order to auto-Bombard adjacent military units. • Can occupy empty enemy cities. • Subject to zones of control. • Slowed down while damaged. @@ -2339,12 +2634,23 @@

Howitzer

• Can't attack as Cargo. Must first unload. ➤ Unable to attack air units. ➤ May impose a zone of control on its adjacent tiles. -➤ Has Special Defense against Special Attacks / Ranged Attacks. - • Gives 7 free rounds of combat against up to 4 units in an enemy stack. + • Prevents enemy cities from working the tile it's on. +➤ Can safely conduct Bombard Attack. + • Gives 7 free rounds of combat against up to 4 units in an enemy stack. + • Uses 2 movement points. + • A maximum of 1 unit can be killed. + • Can be done to ocean tiles if not transported. + • Cannot be done to Cities, Fortresses, Naval Bases, Castles, and Bunkers. + • Can do action while fortified and remain fortified afterwards. + • Action requires: + - a minimum of 2 move points + - Howitzer to have used no moves this turn. +➤ Has Special Defense against Special Attacks / Ranged Attacks. + • Gives 7 free rounds of combat against up to 4 units in an enemy stack. • A maximum of 1 unit can be killed. ➤ Can Expel • target unit must be alone and not on Mountains. - • uses one movement point + • uses ⅔ movement point • actor stays on its own tile ➤ Attacking with fractional move points gives fractional attack power. ➤ Can Conquer City @@ -2371,7 +2677,7 @@

Howitzer

-
+

Balloon

Cost: 25 shields
@@ -2383,7 +2689,7 @@

Balloon

Firepower: 1
Hitpoints: 10
Obsolete by: None
-
Balloons gather intel on potential battle areas. They have great vision and are unreachable by units prior to Riflemen and Ironclads. They can stay in the air for one Turn Change before landing in a City, Quay, Base, or transport unit with cargo capacity of 4+. Balloons do not block units under them from being attacked, and cannot fly over mountains.
+
Balloons gather intel on potential battle areas. They have great vision and are unreachable by units prior to Riflemen and Ironclads. They can stay in the air for one Turn Change before landing in a City, Quay, Base, or transport unit with cargo capacity of 4+. Balloons give sentry reports of nearby unit movements even when not on sentry. Balloons do not block units under them from being attacked, and cannot fly over mountains.
 
 NOTE: GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.    
 
➤ Belongs to Balloon unit class. @@ -2397,30 +2703,31 @@

Balloon

• Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Never imposes a zone of control. +➤ Reconnaissance: reports visible enemy movement even if not sentried. ➤ Unit must be in a City, Fort, Fortress, Naval Base, Airbase; or on a Galleon, Cargo Ship, Transport, or Carrier, after 2 turns. ➤ Can't be bribed. ➤ Can't be sabotaged. ➤ Will never achieve veteran status.
-
+

Zeppelin

Cost: 45 shields
Upkeep: 0
-
Moves: 6
+
Moves: 7
Vision: 4.90 tiles
Attack: 2
Defense: 1
Firepower: 2
Hitpoints: 20
Obsolete by: None
-
As new technology inspires the upgrade of Balloons, the Zeppelin appears. In theory, it can be used for tactical advantage in combat. However, vulnerability and cost make it better for intel. It can do limited attack with bombs, or 20 combat rounds with medium caliber ordnance. It can stay out for two Turn Changes before landing in a City, Quay, Fortress, Naval Base, Airbase, or transport with 6+ capacity.
-Zeppelins have great vision and are unreachable by units prior to Marines and Destroyers. Zeppelins do not block units under them from being attacked. Unlike Balloons, they can fly over Mountains.
+
As new technology inspires the upgrade of Balloons, the Zeppelin appears. In theory, it can be used for tactical advantage in combat. However, vulnerability and cost make it better for intel. It can do limited attack with bombs, or 20 combat rounds with medium caliber ordnance. It has 7 turns of fuel so can stay out for many turns before landing in a City, Quay, Fortress, Naval Base, Airbase, or transport with 6+ capacity. 
+Zeppelins have great vision and are unreachable by units prior to Marines and Destroyers. Zeppelins do not block units under them from being attacked. Zeppelins give sentry reports of nearby unit movements even when not on sentry. Unlike Balloons, they can fly over Mountains.
 
-NOTE: GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.
+NOTE:GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.
 
➤ Belongs to Zeppelin unit class. • Speed is not affected by terrain. • Does not get defense bonuses from terrain. @@ -2433,6 +2740,7 @@

Zeppelin

• A maximum of 1 unit can be killed. • Can be done to Cities, Forts, Fortresses, Naval Bases, Land Tiles, and Oceanic Tiles. ➤ Never imposes a zone of control. +➤ Reconnaissance: reports visible enemy movement even if not sentried. ➤ INTERCEPTED by Fighter types on Vigil: they auto-attack if they have better odds attacking than defending. ➤ Unit has to be in a City, Fortress, Naval Base, Airbase; or on a Carrier, Transport, or Train, after 3 turns. ➤ Can Attack @@ -2455,8 +2763,8 @@

Zeppelin

ace220%15% + 1 top gun230%-+ 1
-
-
+
+

Airplane

Cost: 50 shields
@@ -2468,22 +2776,23 @@

Airplane

Firepower: 1
Hitpoints: 20
Obsolete by: None
-
Airplanes can carry a single diplomatic unit. They can land in any domestic or allied city. For missions to non-allied nations, an empty Airbase must be available for landing. Airplanes have two turns of fuel. Each new aviation tech upgrades range by +2 moves per turn.
+
Airplanes can carry a diplomatic unit or a Freight unit. They can land in any domestic or allied city. For missions to non-allied nations, an empty Airbase must be available for landing. Airplanes have two turns of fuel. Each new aviation tech upgrades range by +2 moves per turn.
 
-Airplanes can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker. NOTE:GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.
+Stack-Escape:60% odds to evade stack-death if attacker doesn’t have more moves than it does. NOTE:GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.
 
➤ Belongs to Air unit class. • Speed is not affected by terrain. • Does not get defense bonuses from terrain. • Not subject to zones of control. • Unreachable. Most units cannot attack this one. ◦ Doesn't prevent enemy units from attacking other units on its tile. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. -➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if it has more moves left than attacker. +➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if attacker doesn’t have more moves than it does. ➤ Never imposes a zone of control. ➤ INTERCEPTED by Fighter types on Vigil: they auto-attack if they have better odds attacking than defending. -➤ Can carry and refuel 1 Diplomat or Spy. +➤ Can carry 1 Emissary, Diplomat, or Spy. • Cargo cannot be loaded or unloaded except in a City or a Airbase. + • Cargo not visible except to allies. ➤ Unit has to be in a City, Airbase, or on a Carrier after 2 turns. ➤ Can't be bribed. ➤ Can't be sabotaged. @@ -2492,7 +2801,7 @@

Airplane

-
+

Fighter

Cost: 60 shields
@@ -2504,11 +2813,11 @@

Fighter

Firepower: 2
Hitpoints: 20
Obsolete by: Jet Fighter
-
Fighters are the first offensive Air units. Their superior mobility and firepower alter the very nature of warfare. They can move anywhere and attack any unit (except Submarines and Jet Bombers.)
+
Fighters are the first offensive Air units. Their superior mobility and firepower alter the very nature of warfare. They can move anywhere and attack any unit except Submarines, Jet Bombers, Spy Planes, and Satellites. Fighters need fuel to avoid crashing and thus must end every turn in a city, Airbase, or Carrier. Air units can't conquer undefended enemy cities. Fighters can attack twice per turn.
 
 INTERCEPTOR: the Vigil order lets Fighters auto-attack adjacent Air units if they have better attack odds. A Fighter can Vigil if it uses 2 move points or less.
 
-Fighters can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker. NOTE:GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.
+Stack-Escape:60% odds to evade stack-death if attacker doesn’t have more moves than it does. NOTE:GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.
 
➤ Belongs to AirProtect unit class. • INTERCEPTOR: can be given the Vigil order to auto-attack adjacent Air units. • AIR COVER: Most units who cannot attack this unit also cannot attack other units on the tile. @@ -2516,10 +2825,11 @@

Fighter

• Does not get defense bonuses from terrain. • Not subject to zones of control. • Unreachable. Most units cannot attack this one. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. -➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if it has more moves left than attacker. +➤ Can attack a maximum of 2 times per turn. ➤ Anti-Air units have bonuses against this unit. +➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if attacker doesn’t have more moves than it does. ➤ Never imposes a zone of control. ➤ INTERCEPTED by Fighter types on Vigil: they auto-attack if they have better odds attacking than defending. ➤ Can attack against Missile units, which are usually not reachable. @@ -2546,9 +2856,14 @@

Fighter

crack210%10% + 1 ace220%10% + 1 top gun230%-+ 1 + +Fighters types on Vigil will (usually) engage the following units: + +* Note: Propeller-type fighters are unable to reach high altitude aircraft (Jet Bomber, Spy Plane.) +
-
+

Escort Fighter

Cost: 80 shields
@@ -2559,11 +2874,11 @@

Escort Fighter

Defense: 5
Firepower: 2
Hitpoints: 20
-
Obsolete by: Jet Fighter
-
Escort Fighters are large fighters with high fuel capacity. Higher mass and stronger construction allow them to absorb more damage. They do not attack as well as standard Fighters, but can return home on the next turn. They are good for long-range missions, defensive air support, and escorting bombers.
+
Obsolete by: Multi-Fighter
+
Escort Fighters are large fighters with high fuel capacity. Higher mass and stronger construction allow them to absorb more damage. They do not attack as well as standard Fighters, but can return home on the next turn. They are good for long-range missions, defensive air support, and escorting bombers. Escort Fighters can attack twice per turn.
 
 INTERCEPTOR: the Vigil order lets Escort Fighters auto-attack adjacent Air units if they have better attack odds. This unit can Vigil if it uses 3 move points or less.
-This aircraft can Stack-Escape:a 60% chance to escape a killed stack if it has more remaining moves than the attacker. NOTE:GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.
+Stack-Escape:60% odds to evade stack-death if attacker doesn’t have more moves than it does. NOTE:GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.
 
➤ Belongs to AirProtect unit class. • INTERCEPTOR: can be given the Vigil order to auto-attack adjacent Air units. • AIR COVER: Most units who cannot attack this unit also cannot attack other units on the tile. @@ -2571,11 +2886,13 @@

Escort Fighter

• Does not get defense bonuses from terrain. • Not subject to zones of control. • Unreachable. Most units cannot attack this one. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. -➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if it has more moves left than attacker. +➤ Can attack a maximum of 2 times per turn. ➤ Anti-Air units have bonuses against this unit. +➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if attacker doesn’t have more moves than it does. ➤ Never imposes a zone of control. +➤ Reconnaissance: reports visible enemy movement even if not sentried. ➤ INTERCEPTED by Fighter types on Vigil: they auto-attack if they have better odds attacking than defending. ➤ Can attack against Missile units, which are usually not reachable. ➤ Can attack against Helicopter units, which are usually not reachable. @@ -2600,21 +2917,27 @@

Escort Fighter

elite200%15% - crack210%15% + 1 ace220%15% + 1 -top gun230%-+ 1
+top gun230%-+ 1 + +Fighters types on Vigil will (usually) engage the following units: + +* Note: Propeller-type fighters are unable to reach high altitude aircraft (Jet Bomber, Spy Plane.) + +
-
+

Dive Bomber

Cost: 60 shields
Upkeep: 1 Shield
Moves: 18
Vision: 3.46 tiles
-
Attack: 3
+
Attack: 4.5
Defense: 3
Firepower: 2
Hitpoints: 20
Obsolete by: Ground Strike Fighter
-
Dive Bombers are fitted with armor and armaments for Ground Attack and Sea combat. They do better attacking surface targets and defending vs Anti-Air, but have reduced range and Air-to-Air ability. They do not block attacks on their same tile, but exert ZoC on adjacent land tiles and can iPillage. The Dive Bomber is not an interceptor. Role specialization yields the following gains and losses over a Fighter:
+
Dive Bombers are fitted with armor and armaments for Ground Attack and Sea combat. They do better attacking surface targets and defending vs Anti-Air, but have reduced range and Air-to-Air ability. They do not block attacks on their same tile, but exert ZoC on adjacent land tiles and can iPillage. The Dive Bomber is not an interceptor, and can only attack once per turn. Role specialization yields the following gains and losses over a Fighter:
 
 GAINS:
 • A:4½  vs Surface units (Land or Sea)
@@ -2624,27 +2947,30 @@ 

Dive Bomber

LOSSES: • A3 instead of A4 in Air-to-Air • Can't block its tile +• One attack per turn. • Can't intercept
-Communists pay 10 less for this unit. Can Stack-Escape:a 60% chance to escape a killed stack if it has more remaining moves than the attacker. GOTO prevents unit loss from lack of fuel. Override this by ordering adjacent moves. +Communists pay 10 less for this unit. Stack-Escape:60% odds to evade stack-death if attacker doesn’t have more moves than it does. GOTO prevents unit loss from lack of fuel. Override this by ordering adjacent moves.

➤ Belongs to Air unit class. • Speed is not affected by terrain. • Does not get defense bonuses from terrain. • Not subject to zones of control. • Unreachable. Most units cannot attack this one. ◦ Doesn't prevent enemy units from attacking other units on its tile. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. ➤ Can safely iPillage: Instant Ground Strike against tile infrastructure. • 50% odds of success. +5% for each veteran level. - • Destroys 1 selected infrastructural improvement on the tile, instantly. + • Destroys 1 selected infrastructural improvement on the tile, instantly. • Uses 6 movement points. May result in Dive Bomber being unable to re-fuel. -➤ +50% attack bonus when attacking all Surface units: +➤ Can attack a maximum of 1 time per turn. +➤ Anti-Air units have bonuses against this unit. +➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if attacker doesn’t have more moves than it does. +➤ Attacks at 4.5 when attacking all Surface units: • Applies to all Land units • Applies to all Sea units (except Submarines are unreachable.) +➤ Attacks at 3 when attacking Air units. ➤ +33% defense bonus if attacked by Anti-Aircraft Artillery, Mobile SAM, or AEGIS Cruiser. -➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if it has more moves left than attacker. -➤ Anti-Air units have bonuses against this unit. ➤ May impose a zone of control on its adjacent tiles. ➤ INTERCEPTED by Fighter types on Vigil: they auto-attack if they have better odds attacking than defending. ➤ Can attack against Helicopter units, which are usually not reachable. @@ -2671,7 +2997,7 @@

Dive Bomber

top gun230%-+ 1
-
+

Medium Bomber

Cost: 85 shields
@@ -2683,23 +3009,28 @@

Medium Bomber

Firepower: 2
Hitpoints: 20
Obsolete by: Jet Bomber
-
The Medium Bomber is well suited for moderately strong targets or multiple weak targets. It may not attack other Air units. It is a Soft Field Unit and can't carry Bomb units, causing less discontent than other types of Bombers.
+
The Medium Bomber is well suited for hitting a moderately strong target. It may not attack other Air units, and can only attack once per turn. It can only carry conventional Bombs, not nuclear bombs units. This makes it a Soft Field Unit, causing less discontent than other types of Bombers.
 ➤ Unhappy effect for Soft Field units:
 Republic:0   Democracy:1    (non-aggressive)
 Republic:1   Democracy:2    (aggressive)
 
-This aircraft can Stack-Escape:a 60% chance to escape a killed stack if it has more remaining moves than the attacker. NOTE:GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.
+Stack-Escape:60% odds to evade stack-death if attacker doesn’t have more moves than it does. NOTE:GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.
 
➤ Belongs to Air unit class. • Speed is not affected by terrain. • Does not get defense bonuses from terrain. • Not subject to zones of control. • Unreachable. Most units cannot attack this one. ◦ Doesn't prevent enemy units from attacking other units on its tile. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. -➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if it has more moves left than attacker. +➤ Can attack a maximum of 1 time per turn. ➤ Anti-Air units have bonuses against this unit. -➤ Unable to attack air units. +➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if attacker doesn’t have more moves than it does. +➤ Unable to attack Air units. +➤ Can carry and refuel 1 Bombs unit. + • Can't carry nuclear bombs. + • Cargo cannot be loaded except in a city or a base native to this transport. + • Cargo not visible except to allies. ➤ Never imposes a zone of control. ➤ Soft Field unit: unhappiness may apply even when non-aggressive. ➤ INTERCEPTED by Fighter types on Vigil: they auto-attack if they have better odds attacking than defending. @@ -2724,7 +3055,7 @@

Medium Bomber

top gun230%-+ 1
-
+

Heavy Bomber

Cost: 120 shields
@@ -2736,24 +3067,26 @@

Heavy Bomber

Firepower: 2
Hitpoints: 20
Obsolete by: Jet Bomber
-
Heavy Bombers are large and sturdy Bombers with larger payload and numerous gunner defense stations. They are excellent for hitting strong well-defended ground targets. They cannot attack Air units. They can carry one Bomb. Like most Bombers, the Heavy Bomber is a Field Unit. Field Units cause the same unhappiness no matter if aggressively or peacefully deployed.
+
Heavy Bombers are large and sturdy Bombers with larger payload and numerous gunner defense stations. They are excellent for hitting strong well-defended ground targets, and can attack once per turn. They cannot attack Air units. They can carry one Bomb. Like most Bombers, the Heavy Bomber is a Field Unit. Field Units cause the same unhappiness no matter if aggressively or peacefully deployed.
 ➤ Unhappy effect for Field units:
 Republic:1   Democracy:2
 
-This aircraft can Stack-Escape:a 60% chance to escape a killed stack if it has more remaining moves than the attacker. NOTE:GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.
+Stack-Escape:60% odds to evade stack-death if attacker doesn’t have more moves than it does. NOTE:GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.
 
➤ Belongs to Air unit class. • Speed is not affected by terrain. • Does not get defense bonuses from terrain. • Not subject to zones of control. • Unreachable. Most units cannot attack this one. ◦ Doesn't prevent enemy units from attacking other units on its tile. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. -➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if it has more moves left than attacker. +➤ Can attack a maximum of 1 time per turn. ➤ Anti-Air units have bonuses against this unit. -➤ Unable to attack air units. +➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if attacker doesn’t have more moves than it does. +➤ Unable to attack Air units. ➤ Can carry and refuel 1 Bomb unit. • Cargo cannot be loaded except in a city or a base native to this transport. + • Cargo not visible except to allies. ➤ Never imposes a zone of control. ➤ Field unit: one unhappiness applies even when non-aggressive. ➤ INTERCEPTED by Fighter types on Vigil: they auto-attack if they have better odds attacking than defending. @@ -2778,7 +3111,7 @@

Heavy Bomber

top gun230%-+ 1
-
+

Strategic Bomber

Cost: 135 shields
@@ -2790,26 +3123,28 @@

Strategic Bomber

Firepower: 2
Hitpoints: 20
Obsolete by: Jet Bomber
-
The Strategic Bomber offers a small improvement in attack. Higher altitude offers a good upgrade in defense. It has considerably longer range, with one more turn of fuel. Upgraded payload enables instant-Pillage bombing. May carry two Bombs. May carry two Bombs.
+
The Strategic Bomber can do two attacks per turn. Higher altitude offers a good upgrade in defense. It has considerably longer range, with one more turn of fuel. Upgraded payload enables instant-Pillage bombing. May carry two Bombs. May carry two Bombs.
 
-This aircraft can Stack-Escape:a 60% chance to escape a killed stack if it has more remaining moves than the attacker. NOTE:GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.
+Stack-Escape:60% odds to evade stack-death if attacker doesn’t have more moves than it does. NOTE:GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.
 
➤ Belongs to Air unit class. • Speed is not affected by terrain. • Does not get defense bonuses from terrain. • Not subject to zones of control. • Unreachable. Most units cannot attack this one. ◦ Doesn't prevent enemy units from attacking other units on its tile. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. ➤ Can safely iPillage: Instant Bomb against tile infrastructure. • 60% odds of success. +5% for each veteran level. • Destroys 1 random infrastructural improvement on the tile, instantly. • Uses 3 movement points. May result in Strategic Bomber being unable to re-fuel. -➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if it has more moves left than attacker. +➤ Can attack a maximum of 2 times per turn. ➤ Anti-Air units have bonuses against this unit. -➤ Unable to attack air units. +➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if attacker doesn’t have more moves than it does. +➤ Unable to attack Air units. ➤ Can carry and refuel up to 2 Bomb units. • Cargo cannot be loaded except in a city or a base native to this transport. + • Cargo not visible except to allies. ➤ Never imposes a zone of control. ➤ Field unit: one unhappiness applies even when non-aggressive. ➤ INTERCEPTED by Fighter types on Vigil: they auto-attack if they have better odds attacking than defending. @@ -2834,7 +3169,7 @@

Strategic Bomber

top gun230%-+ 1
-
+

AWACS

Cost: 140 shields
@@ -2848,17 +3183,18 @@

AWACS

Obsolete by: Spy Plane
The AWACS has great fuel capacity for long range flights, and advanced radar that can determine the location of enemy units over a wide area. The AWACS has 2 turns of fuel.
 
-AWACS can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker. NOTE:GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.
+Stack-Escape:60% odds to evade stack-death if attacker doesn’t have more moves than it does. NOTE:GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.
 
➤ Belongs to Air unit class. • Speed is not affected by terrain. • Does not get defense bonuses from terrain. • Not subject to zones of control. • Unreachable. Most units cannot attack this one. ◦ Doesn't prevent enemy units from attacking other units on its tile. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. -➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if it has more moves left than attacker. +➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if attacker doesn’t have more moves than it does. ➤ Never imposes a zone of control. +➤ Reconnaissance: reports visible enemy movement even if not sentried. ➤ INTERCEPTED by Fighter types on Vigil: they auto-attack if they have better odds attacking than defending. ➤ Unit must be in a City, Airbase, or on a Carrier after 2 turns. ➤ Can't be bribed. @@ -2868,7 +3204,7 @@

AWACS

-
+

Spy Plane

Cost: 160 shields
@@ -2882,7 +3218,7 @@

Spy Plane

Obsolete by: None
The Spy Plane is an ultrasonic high altitude aircraft with long range. It gathers intel over a wide area. Stealth technology makes it invisible, except to enemies on adjacent tiles. Spy Planes have 2 turns of fuel. They are unreachable to primitive propeller based aircraft.
 
-Spy Planes can Stack-Escape:a 67% chance to escape a killed stack if they have more remaining moves than the attacker.
+Stack-Escape:67% odds to evade stack-death if attacker doesn’t have more moves than it does.
NOTE: GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.

➤ Belongs to Air_High_Altitude unit class. • Invisible except when next to an enemy unit or city. @@ -2891,11 +3227,12 @@

Spy Plane

• Not subject to zones of control. • Unreachable. Most units cannot attack this one. ◦ Doesn't prevent enemy units from attacking other units on its tile. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. -➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if it has more moves left than attacker. +➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if attacker doesn’t have more moves than it does. ➤ Is invisible except when next to an enemy unit or city. ➤ Never imposes a zone of control. +➤ Reconnaissance: reports visible enemy movement even if not sentried. ➤ INTERCEPTED by Fighter types on Vigil: they auto-attack if they have better odds attacking than defending. ➤ Unit has to be in a City, Airbase, or on a Carrier after 2 turns. ➤ Can't be bribed. @@ -2904,7 +3241,7 @@

Spy Plane

-
+

Satellite

Cost: 140 shields
@@ -2918,7 +3255,7 @@

Satellite

Obsolete by: None
Satellites orbit the Earth above the atmosphere. They are unreachable to anything but missiles. Their orbital velocity allows them to circumnavigate the planet in a couple turns. Telescopic cameras allow them to Investigate City, even if the city has a Police Station. Satellites cannot be seen by others unless adjacent. Satellites require Laser tech, and can only be built in the city with the Apollo Program.
 
-Satellites can Stack-Escape:a 100% chance to escape a killed stack if they have more remaining move points than the attacker.
+Stack-Escape:100% odds to evade stack-death if attacker doesn’t have more moves than it does.
 NOTE:  Due to game mechanics, Satellites block terrestrial movement over a tile. This is solved by killing it with any Missile. To avoid this, end your turn far away from developed or trafficked areas.
 
➤ Belongs to Space unit class. • Speed is not affected by terrain. @@ -2926,17 +3263,18 @@

Satellite

• Not subject to zones of control. • Unreachable. Only missile types can attack this unit. ◦ Doesn't prevent enemy units from attacking other units on its tile. - • Doesn't prevent enemy cities from working the tile it's on. -➤ STACK ESCAPE: 100% odds to escape if stack defender loses, if it has more moves left than attacker. + • Doesn't prevent enemy cities from working the tile it's on. +➤ STACK ESCAPE: 100% odds to escape if stack defender loses, if attacker doesn’t have more moves than it does. ➤ Is invisible except when next to an enemy unit or city. ➤ Never imposes a zone of control. +➤ Reconnaissance: reports visible enemy movement even if not sentried. ➤ Can't be bribed. ➤ Can't be sabotaged. ➤ Will never achieve veteran status.
-
+

Transport Helicopter

Cost: 90 shields
@@ -2949,11 +3287,11 @@

Transport Helicopter

Hitpoints: 21
Obsolete by: None
Transport Helicopters can carry three land units, which they can pick up from anywhere
- Foot and artillery types can unload by stepping off to any adjacent tile, but will lose all moves (except Marine types). Other types need a City, Airbase, or Naval Base to unload.
+Foot and artillery types can unload by stepping off to any adjacent tile, but will lose all moves (except Marine types). Other types need a City, Airbase, or Naval Base to unload.
 
- Helicopters lose 1 hp for each turn not ended in a City, Base, or Carrier. +1 move is awarded if starting a turn in a City or Airbase.
+Helicopters lose 1 hp for each turn not ended in a City, Base, or Carrier. +1 move is awarded if starting a turn in a City or Airbase. The first turn spent in a city, all Helicopter types regain 10hp.
 
- All Helicopters can be attacked by land from Riflemen onward; by sea from Ironclad onward; get +50% defence vs. foot units; and are unreachable to artillery types. Unlike attack Helicopters, Transport Helicopters are intercepted by Fighters on vigil. Transport Helicopters can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker.
+All Helicopters can be attacked by land from Riflemen onward; by sea from Ironclad onward; get +50% defence vs. foot units; and are unreachable to artillery types. Unlike attack Helicopters, Transport Helicopters are intercepted by Fighters on vigil. Stack-Escape:60% odds to evade stack-death if attacker doesn’t have more moves than it does.
 
➤ Belongs to Helicopter unit class. • Speed is not affected by terrain. • Does not get defense bonuses from terrain. @@ -2961,13 +3299,15 @@

Transport Helicopter

Unreachable. Artillery, Howitzer, and units prior to Riflemen and Ironclad can't attack this unit. • AIRLIFT: Can be airlifted if it has remaining moves. ➤ +50% defense bonus if attacked by Foot Soldiers or Cavalry. -➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if it has more moves left than attacker. +➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if attacker doesn’t have more moves than it does. ➤ INTERCEPTED by Fighter types on Vigil: they auto-attack if they have better odds attacking than defending. ➤ Anti-Air units have bonuses against this unit. ➤ Loses 1hp for every turn in the air. ➤ Gets +1 move point if starting its turn in a City or Airbase. -➤ Can carry and refuel up to 3 qualifying Land units. +➤ The first turn spent in a city, all Helicopter types regain 10hp. +➤ Can carry up to 3 qualifying Land units. • Some cargo cannot be loaded or unloaded except in a City or a Base native to this transport. + • Cargo not visible except to allies. ➤ Never imposes a zone of control. ➤ Can't be bribed. ➤ Can't be sabotaged. @@ -2986,7 +3326,7 @@

Transport Helicopter

-
+

Helicopter

Cost: 95 shields
@@ -3000,12 +3340,12 @@

Helicopter

Obsolete by: None
Helicopters are the Air Cavalry of modern armies. They can attack multiple targets and conquer cities. Unaffected by terrain, they are good for Partisan suppression. They can transport Marines and AAA and are thus well-suited for commando ops.
 
-For each turn not ended in a City, Base, or Carrier, 1hp is lost. +1 move is awarded if starting a turn in a City or Airbase.
+For each turn not ended in a City, Base, or Carrier, 1hp is lost. +1 move is awarded if starting a turn in a City or Airbase. The first turn spent in a city, all Helicopter types regain 10hp.
 
 Helicopters fly low to avoid Interception. This invites attacks by ground units from Riflemen onward. They are unreachable to Artillery types and get +50% defense vs. foot units. Helicopters can be attacked by Sea from Ironclad onward.
 Helicopters can retaliate 3 rounds against Special Unit Attacks.
 
-Helicopters can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker. Helicopters can transport one Marines or AAA unit.
+Stack-Escape:60% odds to evade stack-death if attacker doesn’t have more moves than it does. Helicopters can transport one Marines or AAA unit.
 
➤ Belongs to Helicopter unit class. • Can occupy empty enemy cities. • Speed is not affected by terrain. @@ -3014,12 +3354,15 @@

Helicopter

Unreachable. Artillery, Howitzer, and units prior to Riflemen and Ironclad can't attack this unit. • AIRLIFT: Can be airlifted if it has remaining moves. ➤ +50% defense bonus if attacked by Foot Soldiers or Cavalry. -➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if it has more moves left than attacker. +➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if attacker doesn’t have more moves than it does. ➤ Anti-Air units have bonuses against this unit. ➤ Loses 1hp for every turn in the air. ➤ Gets +1 move point if starting its turn in a City or Airbase. -➤ Can carry and refuel 1 Marines or Anti-Aircraft Artillery unit. +➤ The first turn spent in a city, all Helicopter types regain 10hp. +➤ Can carry 1 Marines or Anti-Aircraft Artillery unit. + • Cargo not visible except to allies. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Has Special Defense against Special Attacks / Ranged Attacks. • Gives 3 free rounds of combat against up to 3 units in an enemy stack. • A maximum of 1 unit can be killed. @@ -3044,23 +3387,23 @@

Helicopter

top gun230%-+ 1
-
+

Jet Fighter

Cost: 70 shields
Upkeep: 1 Shield
Moves: 24
Vision: 3.46 tiles
-
Attack: 6
-
Defense: 5
+
Attack: 7
+
Defense: 6
Firepower: 2
Hitpoints: 20
Obsolete by: None
-
Jet Fighters upgrade the Fighter with improved attack, defense, and range.
+
Jet Fighters upgrade the Fighter with improved attack, defense, and range. A Jet Fighter can do a maximum of three attacks per turn.
 
 INTERCEPTOR: the Vigil order lets Jet Fighters auto-attack adjacent Air units if they have better attack odds. This unit can Vigil if it uses 3 move points or less.
 
-Helicopters can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker. NOTE:GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.
+Stack-Escape:60% odds to evade stack-death if attacker doesn’t have more moves than it does. NOTE:GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.
 
➤ Belongs to AirProtect unit class. • INTERCEPTOR: can be given the Vigil order to auto-attack adjacent Air units. • AIR COVER: Most units who cannot attack this unit also cannot attack other units on the tile. @@ -3068,16 +3411,16 @@

Jet Fighter

• Does not get defense bonuses from terrain. • Not subject to zones of control. • Unreachable. Most units cannot attack this one. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. -➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if it has more moves left than attacker. +➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if attacker doesn’t have more moves than it does. ➤ Anti-Air units have bonuses against this unit. ➤ Never imposes a zone of control. ➤ INTERCEPTED by Fighter types on Vigil: they auto-attack if they have better odds attacking than defending. ➤ Can attack against Missile units, which are usually not reachable. ➤ Can attack against Helicopter units, which are usually not reachable. ➤ Can attack against Air units, which are usually not reachable. -➤ Can attack against AirPillage units, which are usually not reachable. +➤ Can attack against Air_High_Altitude units, which are usually not reachable. ➤ Can attack against AirProtect units, which are usually not reachable. ➤ Unit must be in a City, Airbase, or on a Carrier after 1 turn. ➤ Can Expel Airplane and AWACS. @@ -3097,37 +3440,102 @@

Jet Fighter

crack210%10% + 1 ace220%10% + 1 top gun230%-+ 1 + +Fighters types on Vigil will (usually) engage the following units: + +* Note: Propeller-type fighters are unable to reach high altitude aircraft (Jet Bomber, Spy Plane.) +
-
+
+

Multi-Fighter

+ +
Cost: 90 shields
+
Upkeep: 1 Shield
+
Moves: 22
+
Vision: 3.46 tiles
+
Attack: 6
+
Defense: 7
+
Firepower: 2
+
Hitpoints: 20
+
Obsolete by: None
+
Multi-Fighters are fitted for mission versatility. They are sturdy, defend better, and have two turns of fuel. They are good for escorting bombers, pursuing enemy bombers on long range missions, defensive ground support, naval missions, reconnaissance, and interception. A Multi-Fighter can vigil at any range, and can do a maximum of two attacks per turn.
+
+INTERCEPTOR:the Vigil order lets Multi-Fighters auto-attack adjacent Air units if they have better attack odds. This unit can Vigil if it has 1 turn of fuel or more. 
+
+Stack-Escape:60% odds to evade stack-death if attacker doesn’t have more moves than it does. NOTE:GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.
+
➤ Belongs to AirProtect unit class. + • INTERCEPTOR: can be given the Vigil order to auto-attack adjacent Air units. + • AIR COVER: Most units who cannot attack this unit also cannot attack other units on the tile. + • Speed is not affected by terrain. + • Does not get defense bonuses from terrain. + • Not subject to zones of control. + • Unreachable. Most units cannot attack this one. + • Doesn't prevent enemy cities from working the tile it's on. + • AIRLIFT: Can be airlifted if it has remaining moves. +➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if attacker doesn’t have more moves than it does. +➤ Anti-Air units have bonuses against this unit. +➤ Never imposes a zone of control. +➤ Reconnaissance: reports visible enemy movement even if not sentried. +➤ INTERCEPTED by Fighter types on Vigil: they auto-attack if they have better odds attacking than defending. +>➤ Can attack against Helicopter units, which are usually not reachable. +➤ Can attack against Air units, which are usually not reachable. +➤ Can attack against Air_High_Altitude units, which are usually not reachable. +➤ Can attack against AirProtect units, which are usually not reachable. +➤ Unit must be in a City, Airbase, or on a Carrier after 1 turn. +➤ Can Expel Airplane and AWACS. +➤ Attacking with fractional move points gives fractional attack power. +➤ Can't be bribed. +➤ Can't be sabotaged. +➤ May acquire veteran status. + +Veteran Levels for Multi-Fighters are the same as Escort Fighters: + + +
+ + + + + + +
Veteran levelPower factorPromotion OddsMove bonus
green100%50% -
veteran150%33% -
hardened175%20% -
elite200%15% -
crack210%15% + 1
ace220%15% + 1
top gun230%-+ 1
+ +Fighters types on Vigil will (usually) engage the following units: + +* Note: Propeller-type fighters are unable to reach high altitude aircraft (Jet Bomber, Spy Plane.) + +
+
+

Ground Strike Fighter

Cost: 80 shields
Upkeep: 1 Shield
Moves: 21
Vision: 3.46 tiles
-
Attack: 7
-
Defense: 4
+
Attack: 8
+
Defense: 5
Firepower: 2
Hitpoints: 20
Obsolete by: None
-
Ground Strike Fighters upgrade the Dive Bomber. They cannot block attacks on other units on their tile, nor engage against Fighters. However, like the Dive Bomber, they can interdict ZoC over land tiles. High fuel capacity allows two turns in the air. No unit can stop this unit from attacking surface units on a tile. This unit can also do pinpointed surgical strikes to pillage tiles. This aircraft is a specialized niche unit. It is not an interceptor.
-This aircraft can Stack-Escape:a 60% chance to escape a killed stack if it has more remaining moves than the attacker. NOTE:GOTO prevents unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.
+
Ground Strike Fighters upgrade the Dive Bomber. They cannot block attacks on other units on their tile, nor engage against Fighters. However, like the Dive Bomber, they can interdict ZoC over land tiles. High fuel capacity allows two turns in the air. No unit can stop this unit from attacking surface units on a tile. This unit has no limit to attacks per turn and can also do pinpointed surgical strikes to pillage tiles. This aircraft is a specialized niche unit. It is not an interceptor.
+Stack-Escape:60% odds to evade stack-death if attacker doesn’t have more moves than it does. NOTE:GOTO prevents unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.
 
➤ Belongs to Air unit class. • Speed is not affected by terrain. • Does not get defense bonuses from terrain. • Not subject to zones of control. • Unreachable. Most units cannot attack this one. ◦ Doesn't prevent enemy units from attacking other units on its tile. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. ➤ Can safely iPillage: Instant Ground Strike against tile infrastructure. • 75% odds of success. +5% for each veteran level. - • Destroys 1 selected infrastructural improvement on the tile, instantly. + • Destroys 1 selected infrastructural improvement on the tile, instantly. • Uses 3 movement points. May result in Ground Strike Fighter being unable to re-fuel. ➤ +33% defense bonus if attacked by Anti-Aircraft Artillery, Mobile SAM, or AEGIS Cruiser. ➤ Unblockable: unreachable units can't block its attacks on reachable units. -➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if it has more moves left than attacker. +➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if attacker doesn’t have more moves than it does. ➤ Anti-Air units have bonuses against this unit. ➤ May impose a zone of control on its adjacent tiles. ➤ INTERCEPTED by Fighter types on Vigil: they auto-attack if they have better odds attacking than defending. @@ -3153,7 +3561,7 @@

Ground Strike Fighter

top gun230%-+ 1
-
+

Jet Bomber

Cost: 145 shields
@@ -3165,27 +3573,28 @@

Jet Bomber

Firepower: 2
Hitpoints: 20
Obsolete by: None
-
Jet Bombers are stratospheric long-range bombers with 3 turns of fuel: they can be airborne for two turn-changes. Their range makes them useful even after Stealth Bombers are available. Stratospheric altitude is unreachable to propeller-based Fighters and AAA. Jet Bombers can carpet-bomb, pillaging tiles from the air. May carry three Bombs. 
+
Jet Bombers are stratospheric long-range bombers with 3 turns of fuel: they can be airborne for two turn-changes. Their range makes them useful even after Stealth Bombers are available. A Jet Bomber may do a maximum of three attacks per turn. Stratospheric altitude is unreachable to propeller-based Fighters and AAA. Jet Bombers can carpet-bomb, pillaging tiles from the air. May carry three Bombs. 
 
-Jet Bombers can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker. NOTE:GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.
+Stack-Escape:60% odds to evade stack-death if attacker doesn’t have more moves than it does. NOTE:GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.
 
➤ Belongs to Air_High_Altitude unit class. • Speed is not affected by terrain. • Does not get defense bonuses from terrain. • Not subject to zones of control. • Unreachable. Most units cannot attack this one, including AAA and propeller aircraft. ◦ Doesn't prevent enemy units from attacking other units on its tile. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. ➤ Can safely iPillage: Instant Carpet Bomb against tile infrastructure. • 75% odds of success. +5% for each veteran level. • Destroys up to 2 random infrastructural improvements on the tile, instantly. • Odds of hitting targets are calculated separately. • Uses 3 movement points. May result in Jet Bomber being unable to re-fuel. -➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if it has more moves left than attacker. +➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if attacker doesn’t have more moves than it does. ➤ Anti-Air units have bonuses against this unit. ➤ Unable to attack air units. ➤ Can carry and refuel up to 3 Bomb units. • Cargo cannot be loaded except in a city or a base native to this transport. + • Cargo not visible except to allies. ➤ Never imposes a zone of control. ➤ Field unit: one unhappiness applies even when non-aggressive. ➤ INTERCEPTED by Fighter types on Vigil: they auto-attack if they have better odds attacking than defending. @@ -3208,7 +3617,7 @@

Jet Bomber

top gun230%-+ 1
-
+

Stealth Fighter

Cost: 80 shields
@@ -3220,11 +3629,11 @@

Stealth Fighter

Firepower: 2
Hitpoints: 20
Obsolete by: None
-
The most advanced Fighter, with improved attack and longer range. Stealth Fighters cannot be seen unless adjacent to an enemy. Stealth evasion gives a 25% bonus against all Anti-Air units, and reduces SAM Batteries down to a smaller 25% bonus.
+
The most advanced Fighter, with improved attack and longer range. Stealth Fighters cannot be seen unless adjacent to an enemy. Stealth evasion gives a 25% bonus against all Anti-Air units, and reduces SAM Batteries down to a smaller 25% bonus. A Stealth Fighter has no limit to the number of attacks per turn it can do.
 
 INTERCEPTOR: the Vigil order lets Stealth Fighters auto-attack adjacent Air units if they have better attack odds. This unit can Vigil if it uses 4 move points or less.
 
-Stealth Fighters can Stack-Escape:a 67% chance to escape a killed stack if they have more remaining moves than the attacker.
+Stack-Escape:67% odds to evade stack-death if attacker doesn’t have more moves than it does.
NOTE: GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.

➤ Belongs to AirProtect unit class. • INTERCEPTOR: can be given the Vigil order to auto-attack adjacent Air units. @@ -3233,11 +3642,11 @@

Stealth Fighter

• Does not get defense bonuses from terrain. • Not subject to zones of control. • Unreachable. Most units cannot attack this one. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. ➤ +25% attack bonus when attacking Anti-Aircraft Artillery, Mobile SAM, or AEGIS Cruiser. ➤ +25% defense bonus if attacked by Anti-Aircraft Artillery, Mobile SAM, or AEGIS Cruiser. -➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if it has more moves left than attacker. +➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if attacker doesn’t have more moves than it does. ➤ Anti-Air units have bonuses against this unit. ➤ Unreachable AND can protect its tile from units unable to attack this unit. ➤ Invisible except when next to an enemy unit or city. @@ -3246,7 +3655,7 @@

Stealth Fighter

➤ Can attack against Missile units, which are usually not reachable. ➤ Can attack against Helicopter units, which are usually not reachable. ➤ Can attack against Air units, which are usually not reachable. -➤ Can attack against AirPillage units, which are usually not reachable. +➤ Can attack against Air_High_Altitude units, which are usually not reachable. ➤ Can attack against AirProtect units, which are usually not reachable. ➤ Unit must be in a City, Airbase, or on a Carrier after 1 turn. ➤ Can Expel Airplane and AWACS. @@ -3266,9 +3675,14 @@

Stealth Fighter

crack210%10% + 1 ace220%10% + 1 top gun230%-+ 1 + +Fighters types on Vigil will (usually) engage the following units: + +* Note: Propeller-type fighters are unable to reach high altitude aircraft (Jet Bomber, Spy Plane.) +
-
+

Stealth Bomber

Cost: 160 shields
@@ -3280,9 +3694,9 @@

Stealth Bomber

Firepower: 2
Hitpoints: 20
Obsolete by: None
-
The deadliest Bomber, with improved attack and speed. Stealth Bombers cannot be seen unless adjacent to an enemy. Stealth evasion gives a 25% bonus against all Anti-Air units, and reduces SAM Batteries down to only a 25% bonus. May carry two Bombs.
+
The deadliest Bomber, with improved attack and speed. Stealth Bombers cannot be seen unless adjacent to an enemy. Stealth evasion gives a 25% bonus against all Anti-Air units, and reduces SAM Batteries down to only a 25% bonus. A Stealth Bomber may do a maximum of three attacks per turn. Stealth Bombers can Bome Strike, an instant-Pillage of tiles from the air. May carry two Bombs.
 
-Stealth Bombers can Stack-Escape:a 67% chance to escape a killed stack if they have more remaining moves than the attacker.
+Stack-Escape:67% odds to evade stack-death if attacker doesn’t have more moves than it does.
NOTE: GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.

➤ Belongs to Air unit class. • Speed is not affected by terrain. @@ -3290,15 +3704,16 @@

Stealth Bomber

• Not subject to zones of control. • Unreachable. Most units cannot attack this one. ◦ Doesn't prevent enemy units from attacking other units on its tile. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. ➤ +25% attack bonus when attacking Anti-Aircraft Artillery, Mobile SAM, or AEGIS Cruiser. ➤ +25% defense bonus if attacked by Anti-Aircraft Artillery, Mobile SAM, or AEGIS Cruiser. -➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if it has more moves left than attacker. +➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if attacker doesn’t have more moves than it does. ➤ Anti-Air units have bonuses against this unit. ➤ Unable to attack air units. ➤ Can carry and refuel up to 2 Bomb units. • Cargo cannot be loaded except in a city or a base native to this transport. + • Cargo not visible except to allies. ➤ Invisible except when next to an enemy unit or city. ➤ Never imposes a zone of control. ➤ Field unit: one unhappiness applies even when non-aggressive. @@ -3322,12 +3737,12 @@

Stealth Bomber

top gun230%-+ 1
-
+

Boat

Cost: 10 shields
Upkeep: 0
-
Moves: 4
+
Moves: 5
Vision: 2.00 tiles
Attack: 0
Defense: 1
@@ -3340,8 +3755,10 @@

Boat

• Does not get defense bonuses from terrain. • Not subject to zones of control. • Slowed down while damaged. + • Crew RepairAutomatically repairs +1hp of its damage each turn, regardless of movement. ➤ Can help build a Wonder in any non-hostile city. -➤ Can carry and refuel 1 Land, LandNoKill, or LandAirSea unit. +➤ Can carry 1 Land, LandNoKill, or LandAirSea unit. + • Cargo not visible except to allies. ➤ Must stay next to safe coast. ➤ PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. ➤ A non-military unit: @@ -3349,14 +3766,11 @@

Boat

• Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. ➤ Never imposes a zone of control. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can Establish Trade Route • is done to foreign cities 15 or more tiles distant. • inactive during War. • uses up the Caravan. -➤ Can Enter Marketplace - • is done to foreign cities not at war. - • uses up the Caravan. ➤ Can Help Build Wonder • is done in friendly cities. Contributes the unit's shield cost to current production • uses up the Boat. @@ -3379,7 +3793,7 @@

Boat

sea wolf230%-+ 1
-
+

Trireme

Cost: 20 shields
@@ -3393,29 +3807,30 @@

Trireme

Obsolete by: Galley
Triremes are used for exploration, transport, and Commerce. The entry on Caravan explains what Commerce units may do.
 
-
-Triremes can enter Deep Ocean, but there is risk: they must end every second turn on river, coastline, or a city—or else be lost at sea. They can attack and travel on rivers, but cannot attack the shore.
+Triremes can enter Deep Ocean, but there is risk: they must end every second turn on river, coastline, or a city—or else be lost at sea. They can attack and travel on rivers, but cannot attack the shore.
 
-
-Like most ancient sea units, when it initiates combat there will be 15 rounds of combat and 15 total hp lost between both units. This may or may not result in a victor. Triremes do not cause unhappiness.
+Like most ancient sea units, when it initiates combat there will be 15 rounds of combat and 15 total hp lost between both units. This may or may not result in a victor. Triremes do not cause unhappiness.
 
➤ Belongs to Trireme unit class. • Speed is not affected by terrain. • Does not get defense bonuses from terrain. • Not subject to zones of control. • Slowed down while damaged. + • Crew RepairAutomatically repairs 10% of its hitpoints each turn, regardless of movement (+1hp) +➤ Can enter foreign territory regardless of peace treaty. ➤ Can help build a Wonder in any non-hostile city. ➤ Unable to attack air units. -➤ Can carry and refuel up to 2 Land, LandNoKill, or LandAirSea units. +➤ Can carry up to 2 Land, LandNoKill, or LandAirSea units. + • Cargo not visible except to allies. +➤ Can only attack units on native tiles. + • Battle will last 15 combat rounds, which may or may not result in a victor. ➤ PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. ➤ May impose a zone of control on its adjacent tiles. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Unit must be next to safe coast, in a city or a base after 2 turns. ➤ Can Establish Trade Route • is done to foreign cities 15 or more tiles distant. • inactive during War. • uses up the Caravan. -➤ Can Enter Marketplace - • is done to foreign cities not at war. - • uses up the Caravan. ➤ Can Help Build Wonder • is done in friendly cities. Contributes the unit's shield cost to current production • uses up the Trireme. @@ -3439,7 +3854,7 @@

Trireme

sea wolf230%-+ 1
-
+

Longboat

Cost: 25 shields
@@ -3453,26 +3868,28 @@

Longboat

Obsolete by: Caravel
The Longboat is a warship. It can attack at sea, attack the shore, and carry one land unit. It is useful for ancient sea campaigns. Longboats can travel on rivers.
 
-
-Like most early sea units, when it initiates combat there will be 15 rounds of combat and 15 total hp lost between both units. This may or may not result in the loss of one of the units.
+Like most early sea units, when it initiates combat there will be 15 rounds of combat and 15 total hp lost between both units. This may or may not result in the loss of one of the units.
 
➤ Belongs to RiverShip unit class. • Speed is not affected by terrain. • Does not get defense bonuses from terrain. • Not subject to zones of control. • Slowed down while damaged. - • Can attack units on non-native tiles. - • Can launch attack from non-native tiles. + • Crew RepairAutomatically repairs 10% of its hitpoints each turn, regardless of movement (+1hp) ➤ Unable to attack air units. -➤ Can carry and refuel 1 Land, LandNoKill, or LandAirSea unit. +➤ Can carry 1 Land, LandNoKill, or LandAirSea unit. + • Cargo not visible except to allies. +➤ Can Attack reachable targets on land tiles. + • Battle will last 15 combat rounds, which may or may not result in a victor. ➤ PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can Upgrade • upgrades to Caravel or, when possible, to the unit type it upgrades to. ➤ Attacking with fractional move points gives fractional attack power. ➤ May acquire veteran status. • Veterans have increased strength in combat. -Veteran Levels for Zeppelins: +Veteran Levels for Longboat:
@@ -3485,12 +3902,12 @@

Longboat

Veteran levelPower factorPromotion OddsMove bonus
sea wolf230%-+ 1
-
+

Galley

Cost: 30 shields
Upkeep: 1 Shield
-
Moves: 6
+
Moves: 7
Vision: 2.00 tiles
Attack: 2
Defense: 2
@@ -3499,26 +3916,27 @@

Galley

Obsolete by: Caravel
The Galley is an all-purpose sea unit and upgrades the Trireme. It has decent combat strength, can transport, and is a Commerce unit. The entry on Caravan explains what Commerce units may do. Galleys can attack and travel on rivers, but cannot attack the shore. Galleys do not cause unhappiness.
 
-
-Like most early sea units, when it initiates an attack, there will be 15 rounds of combat and 15 total hp lost between both units. This may or may not result in the loss of one of the units.
+Like most early sea units, when it initiates an attack, there will be 15 rounds of combat and 15 total hp lost between both units. This may or may not result in the loss of one of the units.
 
➤ Belongs to RiverShip unit class. • Speed is not affected by terrain. • Does not get defense bonuses from terrain. • Not subject to zones of control. • Slowed down while damaged. + • Crew RepairAutomatically repairs 10% of its hitpoints each turn, regardless of movement (+1hp) +➤ Can enter foreign territory regardless of peace treaty. ➤ Can help build a Wonder in any non-hostile city. ➤ Unable to attack air units. -➤ Can carry and refuel up to 2 Land, LandNoKill, or LandAirSea units. +➤ Can carry up to 2 Land, LandNoKill, or LandAirSea units. + • Cargo not visible except to allies. ➤ Can only attack units on native tiles. + • Battle will last 15 combat rounds, which may or may not result in a victor. ➤ PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. ➤ May impose a zone of control on its adjacent tiles. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can Establish Trade Route • is done to foreign cities 15 or more tiles distant. • inactive during War. • uses up the Caravan. -➤ Can Enter Marketplace - • is done to foreign cities not at war. - • uses up the Caravan. ➤ Can Help Build Wonder • is done in friendly cities. Contributes the unit's shield cost to current production • uses up the Galley. @@ -3542,12 +3960,12 @@

Galley

sea wolf230%-+ 1
-
+

War Galley

Cost: 40 shields
Upkeep: 1 Shield, 1 Unhappy
-
Moves: 6
+
Moves: 7
Vision: 2.00 tiles
Attack: 3
Defense: 3
@@ -3556,19 +3974,21 @@

War Galley

Obsolete by: Caravel
The War Galley has improved offense, defense, and cargo capacity, but lacks commerce ability. War Galleys can attack and travel on rivers, and do shore attacks from the sea.
 
-
-Like most ancient sea units, when it initiates combat there will be 15 rounds of combat and 15 total hitpoints lost between both units. This may or may not result in the loss of one of the units.
+Like most ancient sea units, when it initiates combat there will be 15 rounds of combat and 15 total hitpoints lost between both units. This may or may not result in the loss of one of the units.
 
➤ Belongs to RiverShip unit class. • Speed is not affected by terrain. • Does not get defense bonuses from terrain. • Not subject to zones of control. • Slowed down while damaged. - • Can attack units on non-native tiles. - • Can launch attack from non-native tiles. + • Crew RepairAutomatically repairs 10% of its hitpoints each turn, regardless of movement (+1hp) ➤ Unable to attack air units. -➤ Can carry and refuel up to 3 Land, LandNoKill, or LandAirSea units. +➤ Can carry up to 3 Land, LandNoKill, or LandAirSea units. + • Cargo not visible except to allies. +➤ Can Attack reachable targets on land tiles. + • Battle will last 15 combat rounds, which may or may not result in a victor. ➤ PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can Upgrade • upgrades to Caravel or, when possible, to the unit type it upgrades to. ➤ Attacking with fractional move points gives fractional attack power. @@ -3588,7 +4008,7 @@

War Galley

sea wolf230%-+ 1
-
+

Ram Ship

Cost: 35 shields
@@ -3606,10 +4026,13 @@

Ram Ship

• Does not get defense bonuses from terrain. • Not subject to zones of control. • Slowed down while damaged. + • Crew RepairAutomatically repairs 10% of its hitpoints each turn, regardless of movement (+1hp) ➤ Unable to attack air units. ➤ Can only attack units on native tiles. + • Battle will result in a victor. ➤ PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can Upgrade • upgrades to Caravel or, when possible, to the unit type it upgrades to. ➤ Attacking with fractional move points gives fractional attack power. @@ -3630,12 +4053,12 @@

Ram Ship

sea wolf230%-+ 1
-
+

Caravel

Cost: 40 shields
Upkeep: 1 Shield
-
Moves: 7
+
Moves: 8
Vision: 2.00 tiles
Attack: 4
Defense: 4
@@ -3644,26 +4067,26 @@

Caravel

Obsolete by: Galleon
Caravels upgrade older sea units, and are a big advance in combat, speed, range, and transport capacity. They have the commerce ability of the Galley, but cannot build Wonders. Caravels can attack and travel on rivers and do shore attacks. As a Commerce unit, the Caravel does not cause unhappiness.
 
-
-Like most early sea units, when it initiates an attack, there will be 15 rounds of combat and 15 total hitpoints lost between both units. This may or may not result in the loss of one of the units.
+Like most early sea units, when it initiates an attack, there will be 15 rounds of combat and 15 total hitpoints lost between both units. This may or may not result in the loss of one of the units.
 
➤ Belongs to RiverShip unit class. • Speed is not affected by terrain. • Does not get defense bonuses from terrain. • Not subject to zones of control. • Slowed down while damaged. - • Can attack units on non-native tiles. - • Can launch attack from non-native tiles. + • Crew RepairAutomatically repairs 10% of its hitpoints each turn, regardless of movement (+1hp) +➤ Can enter foreign territory regardless of peace treaty. ➤ Unable to attack air units. -➤ Can carry and refuel up to 3 Land, LandNoKill, or LandAirSea units. +➤ Can carry up to 3 Land, LandNoKill, or LandAirSea units. + • Cargo not visible except to allies. +➤ Can Attack reachable targets on land tiles. + • Battle will last 15 combat rounds, which may or may not result in a victor. ➤ PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. ➤ May impose a zone of control on its adjacent tiles. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can Establish Trade Route • is done to foreign cities 15 or more tiles distant. • inactive during War. • uses up the Caravan. -➤ Can Enter Marketplace - • is done to foreign cities not at war. - • uses up the Caravan. ➤ Can Upgrade • upgrades to Galleon or, when possible, to the unit type it upgrades to. ➤ Attacking with fractional move points gives fractional attack power. @@ -3683,38 +4106,39 @@

Caravel

sea wolf230%-+ 1
-
+

Galleon

Cost: 40 shields
Upkeep: 1 Shield
-
Moves: 8
+
Moves: 9
Vision: 2.00 tiles
Attack: 2
Defense: 3
Firepower: 1
Hitpoints: 20
Obsolete by: Transport
-
The Galleon is a heavily armed transport ship that can carry up to 4 units. Galleons can attack and travel on rivers, and also do shore attacks. Galleon crews repair their ship an extra +1hp per turn, regardless of whether it has moved. Although the Galleon is not a Commerce unit, it retains one vestige of the commercial abilities for the ships it upgrades. It can enter Peace waters to deliver commercial cargo, and does not cause unhappiness.
+
The Galleon is a heavily armed transport ship that can carry up to 4 units. Galleons can attack and travel on rivers, and also do shore attacks. Galleon crews repair their ship an extra +2hp per turn, regardless of whether it has moved. Although the Galleon is not a Commerce unit, it retains one vestige of the commercial abilities for the ships it upgrades. It can enter Peace waters to deliver commercial cargo, and does not cause unhappiness.
 
-
-Like most early sea units, when it initiates combat there will be 15 rounds of combat and 15 total hitpoints lost between both units. This may or may not result in the loss of one of the units.
+Like most early sea units, when it initiates combat there will be 15 rounds of combat and 15 total hitpoints lost between both units. This may or may not result in the loss of one of the units.
 
-
-Galleons can Stack-Escape: a 60% chance to escape a killed stack if they have more remaining moves than the attacker.
+Stack-Escape:60% odds to evade stack-death if attacker doesn’t have more moves than it does.
 
➤ Belongs to RiverShip unit class. • Speed is not affected by terrain. • Does not get defense bonuses from terrain. • Not subject to zones of control. • Slowed down while damaged. - • Can attack units on non-native tiles. - • Can launch attack from non-native tiles. -➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if it has more moves left than attacker. + • Crew RepairAutomatically repairs 10% of its hitpoints each turn, regardless of movement (+2hp) +➤ Can enter foreign territory regardless of peace treaty. +➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if attacker doesn’t have more moves than it does. ➤ Unable to attack air units. -➤ Can carry and refuel up to 4 Land, LandNoKill, LandAirSea, or Balloon units. +➤ Can carry up to 4 Land, LandNoKill, LandAirSea, or Balloon units. + • Cargo not visible except to allies. +➤ Can Attack reachable targets on land tiles. + • Battle will last 15 combat rounds, which may or may not result in a victor. ➤ PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. ➤ May impose a zone of control on its adjacent tiles. -➤ Can attack against Submarine units, which are usually not reachable. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can Upgrade • upgrades to Transport. ➤ Attacking with fractional move points gives fractional attack power. @@ -3734,36 +4158,37 @@

Galleon

sea wolf230%-+ 1
-
+

Frigate

Cost: 50 shields
Upkeep: 1 Shield, 1 Unhappy
-
Moves: 8
+
Moves: 10
Vision: 2.00 tiles
Attack: 4
Defense: 3
Firepower: 1
Hitpoints: 20
Obsolete by: Ironclad
-
The Frigate is versatile — it's a superior offensive unit and also a decent transport ship. Frigates can attack and travel on rivers, or make shore attacks from sea. Frigate crews repair their ship an extra +1hp per turn, regardless of whether it has moved.
+
The Frigate is versatile — it's a superior offensive unit and also a decent transport ship. Frigates can attack and travel on rivers, or make shore attacks from sea. Frigate crews repair their ship an extra +2hp per turn, regardless of whether it has moved.
 
-
-From Frigates onward, all sea attacks end with a single victor. Frigates can Stack-Escape: a 60% chance to escape a killed stack if they have more remaining move points than the attacker.
+From Frigates onward, all sea attacks end with a single victor. Stack-Escape:60% odds to evade stack-death if attacker doesn’t have more moves than it does.
 
➤ Belongs to RiverShip unit class. • Speed is not affected by terrain. • Does not get defense bonuses from terrain. • Not subject to zones of control. • Slowed down while damaged. - • Can attack units on non-native tiles. - • Can launch attack from non-native tiles. + • Crew RepairAutomatically repairs 10% of its hitpoints each turn, regardless of movement (+2hp) ➤ 2× defense bonus if attacked by Marines or Anti-Aircraft Artillery. -➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if it has more moves left than attacker. +➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if attacker doesn’t have more moves than it does. ➤ Unable to attack air units. -➤ Can carry and refuel up to 2 Land, LandNoKill, or LandAirSea units. +➤ Can carry up to 2 Land, LandNoKill, or LandAirSea units. + • Cargo not visible except to allies. +➤ Can Attack reachable targets on land tiles. + • Battle will result in a victor. ➤ PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. ➤ May impose a zone of control on its adjacent tiles. -➤ Can attack against Submarine units, which are usually not reachable. + • Prevents enemy cities from working the tile it's on. ➤ Can Upgrade • upgrades to Ironclad or, when possible, to the unit type it upgrades to. ➤ Attacking with fractional move points gives fractional attack power. @@ -3783,12 +4208,66 @@

Frigate

sea wolf230%-+ 1
-
+
+

Trawler

+ +
Cost: 30 shields
+
Upkeep: 0
+
Moves: 9
+
Vision: 2.00 tiles
+
Attack: 0
+
Defense: 1
+
Firepower: 1
+
Hitpoints: 15
+
Obsolete by: None
+
Trawlers are high-powered work-boats used for fishing and ocean work. They work at the same rate as Workers, and can put down Fishtraps, Buoys, Sea Bridges, Road types, or clean Pollution and Fallout. Trawlers can carry one Land unit. 
+
+Trawlers can tow ships who haven’t moved, via a Load, Board, or Embark order. Towing helps damaged ships return to port for repair. Crew repair rates for towed ships are improved by letting the ships rest while towed. 
+
+When towing, encumbrance slows the Trawler to 6 move points. Remaining moves reduce proportional to this slower speed. If a Trawler stops towing a ship via Unload or Deboard, it regains pro-rated moves proportional to its natural speed. 
+
+Towed ships lose all moves after release.
+
➤ Belongs to RiverShip unit class. + • Speed is not affected by terrain. + • Does not get defense bonuses from terrain. + • Not subject to zones of control. + • Slowed down while damaged. + • Crew RepairAutomatically repairs 10% of its hitpoints each turn, regardless of movement (+3hp) +➤ Never imposes a zone of control. +➤ Can build some types of infrastructure. + • Can build Quay, Road, Railroad, Maglev, Sea Bridge, and Canal on tiles. + • Can build Buoy. + • Can build Fishtrap. + * must be adjacent to a Fish resource + * must NOT be cardinally adjacent to another Fishtrap +➤ Can clean Pollution or Fallout from river tiles. +➤ Can carry and refuel 1 Cargo, Land, LandNoKill, LandAirSea, or LandRoad unit. + • Cargo is visible to all nations who can see the Trawler. +➤ Can "tow" a ship or submarine as cargo. + • Can't tow other Trawlers. + • Towing reduces the remaining percentage of move points proportional to a move speed of 6 move points per turn. + • Pro-rated move points for the speed of 9 move points are proportionally recovered when a towed ship is released. + • Towed ships are visible to all nations who can see the Trawler. + • Towed ships lose all moves after unload, deboard, or disembark. + • Towed ships who take no action during the turn will experience 10% crew repair and 10% resting repair for a total of 20% repair. + ➤ PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. +➤ A non-military unit: + • Cannot attack. + • Doesn't impose martial law. + • Can enter foreign territory regardless of peace treaty. + • Doesn't prevent enemy cities from working the tile it's on. +➤ Capturable: can be captured on rivers, if conditions allow it. +➤ Expellable: can be expelled from rivers located on foreign tiles. +➤ Will never achieve veteran status. + +
+
+

Cargo Ship

Cost: 45 shields
Upkeep: 0
-
Moves: 7
+
Moves: 8
Vision: 2.00 tiles
Attack: 0
Defense: 1
@@ -3801,23 +4280,21 @@

Cargo Ship

• Does not get defense bonuses from terrain. • Not subject to zones of control. • Slowed down while damaged. - • Can launch attack from non-native tiles. + • Crew RepairAutomatically repairs 10% of its hitpoints each turn, regardless of movement (+3hp) ➤ Can help build a Wonder in any non-hostile city. ➤ Can carry and refuel up to 4 Land, LandNoKill, LandAirSea, or Balloon units. + • Cargo not visible except to allies. ➤ PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. ➤ Never imposes a zone of control. ➤ A non-military unit: • Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can Establish Trade Route • is done to foreign cities 15 or more tiles distant. • inactive during War. • uses up the Caravan. -➤ Can Enter Marketplace - • is done to foreign cities not at war. - • uses up the Caravan. ➤ Can Help Build Wonder • is done in friendly cities. Contributes the unit's shield cost to current production • uses up the Cargo Ship. @@ -3825,12 +4302,12 @@

Cargo Ship

➤ Will never achieve veteran status.
-
+

Transport

Cost: 50 shields
Upkeep: 1 Shield
-
Moves: 10
+
Moves: 11
Vision: 3.46 tiles
Attack: 0
Defense: 3
@@ -3844,11 +4321,14 @@

Transport

• Does not get defense bonuses from terrain. • Not subject to zones of control. • Slowed down while damaged. + • Crew RepairAutomatically repairs 10% of its hitpoints each turn, regardless of movement (+3hp) ➤ 2× defense bonus if attacked by Marines or Anti-Aircraft Artillery. -➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if it has more moves left than attacker. +➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if attacker doesn’t have more moves than it does. ➤ Can carry and refuel up to 8 Land, LandNoKill, LandAirSea, or Balloon units. + • Cargo not visible except to allies. ➤ PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can Pillage ➤ May acquire veteran status. • Veterans have increased strength in combat. @@ -3866,12 +4346,12 @@

Transport

sea wolf230%-+ 1
-
+

Ironclad

Cost: 60 shields
Upkeep: 1 Shield, 1 Unhappy
-
Moves: 8
+
Moves: 9
Vision: 2.83 tiles
Attack: 4
Defense: 4
@@ -3880,21 +4360,23 @@

Ironclad

Obsolete by: Destroyer
The Ironclad is an armored ship that is much more sturdy than the Frigate but loses transport capability and the ability to navigate rivers. From the Ironclad onward, warships are excellent at attacking shore targets, and can also pillage buoys.
 
-
-Ironclads and all modern ships can Stack-Escape: a 60% chance to escape a killed stack if they have more remaining move points than the attacker.
+Ironclads and all modern ships can Stack-Escape:60% odds to evade stack-death if attacker doesn’t have more moves than it does.
 
➤ Belongs to Sea unit class. • Crew Repair: each turn, regardless of movement, recovers 2 hit points. • Speed is not affected by terrain. • Does not get defense bonuses from terrain. • Not subject to zones of control. • Slowed down while damaged. - • Can attack units on non-native tiles. - • Can launch attack from non-native tiles. + • Crew RepairAutomatically repairs 10% of its hitpoints each turn, regardless of movement (+3hp) ➤ 2× defense bonus if attacked by Marines or Anti-Aircraft Artillery. -➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if it has more moves left than attacker. +➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if attacker doesn’t have more moves than it does. ➤ Unable to attack air units. +➤ Can Attack reachable targets on land tiles. + • Battle will last 20 combat rounds, which may or may not result in a victor. + • Chance of attacker promotion is half frequency: 2 battles required for same chance of promotion as 1 sea battle. ➤ PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can attack against Submarine units, which are usually not reachable. ➤ Can attack against Helicopter units, which are usually not reachable. ➤ Can Upgrade @@ -3917,12 +4399,12 @@

Ironclad

sea wolf230%-+ 1
-
+

Destroyer

Cost: 60 shields
Upkeep: 1 Shield, 1 Unhappy
-
Moves: 12
+
Moves: 13
Vision: 3.87 tiles
Attack: 5
Defense: 5
@@ -3930,21 +4412,24 @@

Destroyer

Hitpoints: 30
Obsolete by: Missile Destroyer
Destroyers are the first of the modern ships to start your modern navy. Their main roles are fast scouting, seek-and-destroy, anti-submarine warfare, shore bombardment of lighter targets, and supporting the needs of larger fleets. 4× ASW defence gives a 35% chance defending vs Submarines.
-Destroyers can Stack-Escape:a 67% chance to escape a killed stack if they have more remaining move points than the attacker.
+Stack-Escape:67% odds to evade stack-death if attacker doesn’t have more moves than it does.
 
➤ Belongs to Sea unit class. • Crew Repair: each turn, regardless of movement, recovers 2 hit points. • Speed is not affected by terrain. • Does not get defense bonuses from terrain. • Not subject to zones of control. • Slowed down while damaged. - • Can attack units on non-native tiles. - • Can launch attack from non-native tiles. + • Crew RepairAutomatically repairs 10% of its hitpoints each turn, regardless of movement (+3hp) ➤ 4× defense bonus if attacked by Submarine. ➤ 2× defense bonus if attacked by Marines or Anti-Aircraft Artillery. -➤ STACK ESCAPE: 67% odds to escape if stack defender loses, if it has more moves left than attacker. +➤ STACK ESCAPE: 67% odds to escape if stack defender loses, if attacker doesn’t have more moves than it does. ➤ Unable to attack air units. +➤ Can Attack reachable targets on land tiles. + • Battle will last 20 combat rounds, which may or may not result in a victor. + • Chance of attacker promotion is half frequency: 2 battles required for same chance of promotion as 1 sea battle. ➤ PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can attack against Submarine units, which are usually not reachable. ➤ Can attack against Helicopter units, which are usually not reachable. ➤ Can Upgrade @@ -3967,12 +4452,12 @@

Destroyer

sea wolf230%-+ 1
-
+

Cruiser

Cost: 80 shields
Upkeep: 1 Shield, 1 Unhappy
-
Moves: 11
+
Moves: 12
Vision: 3.61 tiles
Attack: 6
Defense: 6
@@ -3987,14 +4472,19 @@

Cruiser

• Does not get defense bonuses from terrain. • Not subject to zones of control. • Slowed down while damaged. - • Can attack units on non-native tiles. - • Can launch attack from non-native tiles. + • Crew RepairAutomatically repairs 10% of its hitpoints each turn, regardless of movement (+3hp) ➤ 2× defense bonus if attacked by Submarine. ➤ 2× defense bonus if attacked by Marines or Anti-Aircraft Artillery. -➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if it has more moves left than attacker. +➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if attacker doesn’t have more moves than it does. ➤ Unable to attack air units. +➤ Can Attack reachable targets on land tiles. + • Battle will last 20 combat rounds, which may or may not result in a victor. + • Chance of attacker promotion is half frequency: 2 battles required for same chance of promotion as 1 sea battle. + • Firepower is reduced to 1. Attack strength is increased +33% + * Overall effect is -33% reduction in attack strength. ➤ PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can attack against Submarine units, which are usually not reachable. ➤ Can attack against Helicopter units, which are usually not reachable. ➤ Can Upgrade @@ -4017,36 +4507,42 @@

Cruiser

sea wolf230%-+ 1
-
+

Missile Destroyer

Cost: 60 shields
Upkeep: 1 Shield, 1 Unhappy
-
Moves: 12
+
Moves: 13
Vision: 4.00 tiles
Attack: 5
Defense: 5
Firepower: 2
Hitpoints: 30
Obsolete by: None
-
The Missile Destroyer has double the firepower of a Destroyer, and shares the same roles as its ancestor. It gains 2× defense against Air and Missile units. It has a 2× ASW bonus and can can carry one Missile.
-Missile Destroyers can Stack-Escape:a 67% chance to escape a killed stack if they have more remaining move points than the attacker.
+
The Missile Destroyer has double the firepower of a Destroyer, and shares the same roles as its ancestor. It gains 2× defense against Air and Missile units. It has a 2× ASW bonus and can carry two Missiles.
+Stack-Escape:67% odds to evade stack-death if attacker doesn’t have more moves than it does.
 
➤ Belongs to Sea unit class. • Crew Repair: each turn, regardless of movement, recovers 2 hit points. • Speed is not affected by terrain. • Does not get defense bonuses from terrain. • Not subject to zones of control. • Slowed down while damaged. - • Can attack units on non-native tiles. - • Can launch attack from non-native tiles. + • Crew RepairAutomatically repairs 10% of its hitpoints each turn, regardless of movement (+3hp) ➤ 2× defense bonus if attacked by Submarine. ➤ 2× defense bonus if attacked by Marines or Anti-Aircraft Artillery. ➤ 2× defense bonus if attacked by Aircraft, Helicopter, or Cruise Missile. -➤ STACK ESCAPE: 67% odds to escape if stack defender loses, if it has more moves left than attacker. +➤ STACK ESCAPE: 67% odds to escape if stack defender loses, if attacker doesn’t have more moves than it does. ➤ Unable to attack air units. -➤ Can carry and refuel 1 Missile unit. +➤ Can carry and refuel up to 2 Missile units. + • Cargo not visible except to allies. +➤ Can Attack reachable targets on land tiles. + • Battle will last 20 combat rounds, which may or may not result in a victor. + • Chance of attacker promotion is half frequency: 2 battles required for same chance of promotion as 1 sea battle. + • Firepower is reduced to 1. Attack strength is increased +33% + * Overall effect is -33% reduction in attack strength. ➤ PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can attack against Submarine units, which are usually not reachable. ➤ Can attack against Helicopter units, which are usually not reachable. ➤ Attacking with fractional move points gives fractional attack power. @@ -4067,19 +4563,19 @@

Missile Destroyer

sea wolf230%-+ 1
-
+

AEGIS Cruiser

Cost: 100 shields
Upkeep: 1 Shield, 1 Unhappy
-
Moves: 11
+
Moves: 12
Vision: 4.36 tiles
Attack: 8
Defense: 8
Firepower: 2
Hitpoints: 30
Obsolete by: None
-
The AEGIS Cruiser has an Anti-Air missile system. Radar and sonar give superior vision and 2× defense bonus against Submarines. The AEGIS can carry two Missiles, and is the only ship that can attack Air and Missile units.
+
The AEGIS Cruiser has an Anti-Air missile system. Radar and sonar give superior vision and 2× defense bonus against Submarines. The AEGIS can carry five Missiles, and is the only ship that can attack Air and Missile units. The discovery of Laser gives all units on the tile a 50% chance to resist nuclear attack.
 Excellent vision and 3× Anti-Air bonus are ideal for scouting and escorting.
 
➤ Belongs to Sea unit class. • Crew Repair: each turn, regardless of movement, recovers 2 hit points. @@ -4087,16 +4583,24 @@

AEGIS Cruiser

• Does not get defense bonuses from terrain. • Not subject to zones of control. • Slowed down while damaged. - • Can attack units on non-native tiles. - • Can launch attack from non-native tiles. + • Crew RepairAutomatically repairs 10% of its hitpoints each turn, regardless of movement (+3hp) ➤ 3× defense bonus if attacked by Aircraft, Helicopter, or Cruise Missile. ➤ 2× defense bonus if attacked by Submarine. ➤ 2× defense bonus if attacked by Marines or Anti-Aircraft Artillery. -➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if it has more moves left than attacker. +➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if attacker doesn’t have more moves than it does. ➤ Anti-Air bonus of this unit is less effective against Stealth, which has a 25% bonus against this unit. -➤ Can carry and refuel up to 2 Missile units. -➤ PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. +➤ Can carry and refuel up to 5 Missile units. + • Cargo not visible except to allies. +➤ Can Attack reachable targets on land tiles. + • Battle will last 20 combat rounds, which may or may not result in a victor. + • Chance of attacker promotion is half frequency: 2 battles required for same chance of promotion as 1 sea battle. + • Firepower is reduced to 1. Attack strength is increased +33% + * Overall effect is -33% reduction in attack strength. +➤ PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. +➤ Can defend units on its tile from Nuclear Attack: + • 50% chance of success, all units on tile will survive. ➤ Can attack against Aircraft, Helicopter, or Missile units, which are usually not reachable. ➤ Can attack against Submarine units, which are usually not reachable. ➤ Attacking with fractional move points gives fractional attack power. @@ -4117,12 +4621,12 @@

AEGIS Cruiser

sea wolf230%-+ 1
-
+

Battleship

Cost: 160 shields
Upkeep: 1 Shield, 1 Unhappy
-
Moves: 10
+
Moves: 11
Vision: 3.46 tiles
Attack: 12
Defense: 12
@@ -4136,14 +4640,19 @@

Battleship

• Does not get defense bonuses from terrain. • Not subject to zones of control. • Slowed down while damaged. - • Can attack units on non-native tiles. - • Can launch attack from non-native tiles. + • Crew RepairAutomatically repairs 10% of its hitpoints each turn, regardless of movement (+4hp) ➤ 2× defense bonus if attacked by Submarine. ➤ 2× defense bonus if attacked by Marines or Anti-Aircraft Artillery. -➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if it has more moves left than attacker. +➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if attacker doesn’t have more moves than it does. ➤ Unable to attack air units. +➤ Can Attack reachable targets on land tiles. + • Battle will last 20 combat rounds, which may or may not result in a victor. + • Chance of attacker promotion is half frequency: 2 battles required for same chance of promotion as 1 sea battle. + • Firepower is reduced to 1. Attack strength is increased +33% + * Overall effect is -33% reduction in attack strength. ➤ PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Has Special Defense against Special Attacks / Ranged Attacks. • Gives 3 free rounds of combat against up to 4 units in an enemy stack. • A maximum of 1 unit can be killed. @@ -4172,41 +4681,43 @@

Battleship

sea wolf230%-+ 1
-
+

Submarine

Cost: 50 shields
Upkeep: 1 Shield, 1 Unhappy
-
Moves: 10
+
Moves: 11
Vision: 3.46 tiles
Attack: 12
Defense: 2
Firepower: 2
Hitpoints: 28
-
Obsolete by: None
-
Submarines are strong attackers but weak defenders. They can carry 8 Missiles. They are unreachable by Air units, but do not block air attacks on surface ships. Submarines cannot attack units on shore. Submarines cannot be seen by other players unless they have a unit or city adjacent to it.
+
Obsolete by: Missile Submarine
+
Submarines are strong attackers but weak defenders. They are unreachable by Air units, but do not block air attacks on surface ships. Submarines cannot attack units on shore. Submarines cannot be seen by other players unless they have a unit or city adjacent to it.
 
-Submarines have superior attrition rates when attacking in numbers. They excel at hit-and-run against weaker ships.
-Submarines can Stack-Escape:a 75% chance to escape a killed stack if they have more remaining move points than the attacker.
+Submarines have superior attrition rates when attacking in numbers. They excel at hit-and-run against weaker ships. They have a minimum speed of 5 if damaged.
+Stack-Escape:75% odds to evade stack-death if attacker doesn’t have more moves than it does.
 
➤ Belongs to Submarine unit class. • Invisible except when next to an enemy unit or city. • Crew Repair: each turn, regardless of movement, recovers 2 hit points. • Speed is not affected by terrain. • Does not get defense bonuses from terrain. • Not subject to zones of control. - • Slowed down while damaged. + • Slowed down while damaged + • Crew RepairAutomatically repairs 10% of its hitpoints each turn, regardless of movement (+3hp) • Unreachable. Air and Land units cannot attack this one. - ◦ Doesn't prevent enemy units from attacking other units on its tile. - • Can launch attack from non-native tiles. -➤ 2× defense bonus if attacked by Submarine. -➤ STACK ESCAPE: 75% odds to escape if stack defender loses, if it has more moves left than attacker. + ◦ Doesn't prevent enemy units from attacking other units on its tile. + • Cannot perform attacks on Land or cities. +➤ 2× defense bonus if attacked by Submarine or Missile Submarine. +➤ STACK ESCAPE: 75% odds to escape if stack defender loses, if attacker doesn’t have more moves than it does. ➤ Attack value reduced against some ships. ➤ Unable to attack air units. -➤ Can carry and refuel up to 8 Missile units. ➤ Can only attack units on native tiles. ➤ PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can attack against Submarine units, which are usually not reachable. +➤ Can attack against Balloons, which are usually not reachable. ➤ Attacking with fractional move points gives fractional attack power. ➤ Can PillageCan't be sabotaged. @@ -4226,34 +4737,99 @@

Submarine

sea wolf230%-+ 1
-
-

Carrier

+
+

Missile Submarine

-
Cost: 155 shields
+
Cost: 55 shields
Upkeep: 1 Shield, 1 Unhappy
-
Moves: 10
+
Moves: 11
Vision: 3.46 tiles
-
Attack: 1
-
Defense: 9
+
Attack: 12
+
Defense: 4
Firepower: 2
-
Hitpoints: 40
+
Hitpoints: 30
Obsolete by: None
-
The Carrier is a mobile airport that can carry Air units, Helicopters, AAA, Marines, and Missiles. Fighters can Vigil on a Carrier if they have enough moves and the Carrier has not moved since the Vigil order was given.
-Carriers are very expensive and thus, usually protected by a fleet of scouts and escorts.
-
➤ Belongs to Sea unit class. +
A Missile Submarine is an upgraded Submarine. It gains 2hp, greater defense, and capacity for 4 Missiles. It can’t be seen except by an adjacent unit or city. The DIVE DEEP order makes Missile Submarines completely invisible to adjacent units on the following turn: enemies only discover it if moving directly to its tile, at which point they may attack. It can only be done in Deep Ocean while the Missile Submarine stays quietly in place. 
+Missile Submarines are unreachable by Air units, but don’t block air attacks on surface ships. 
+
+Minimum speed is 5, when damaged.
+
+Stack-Escape:75% odds to evade stack-death if attacker doesn’t have more moves than it does.
+
➤ Belongs to Submarine unit class. + • Invisible except when next to an enemy unit or city. • Crew Repair: each turn, regardless of movement, recovers 3 hit points. • Speed is not affected by terrain. • Does not get defense bonuses from terrain. • Not subject to zones of control. • Slowed down while damaged. - • Can launch attack from non-native tiles. -➤ 2× defense bonus if attacked by Marines or Anti-Aircraft Artillery. -➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if it has more moves left than attacker. + • Crew RepairAutomatically repairs 10% of its hitpoints each turn, regardless of movement (+3hp) + • Unreachable. Air and Land units cannot attack this one. + ◦ Doesn't prevent enemy units from attacking other units on its tile. + • Cannot perform attacks on Land or cities. +➤ 2× defense bonus if attacked by Submarine or Missile Submarine. +➤ STACK ESCAPE: 75% odds to escape if stack defender loses, if attacker doesn’t have more moves than it does. +➤ Can DIVE DEEP, becoming totally invisible if it stays motionless on its tile. + • Becomes totally invisible even to adjacent units and cities, on the next turn. + • Bonus is lost if the Submarine moves. + • Other Submarines joining the tile will automatically dive deep to join it at depth. +➤ Attack value reduced against some ships. ➤ Unable to attack air units. -➤ Can carry and refuel up to 9 Missile, LandAirSea, Helicopter, Air, AirPillage, AirProtect, or Balloon units. ➤ Can only attack units on native tiles. ➤ PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. ➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. +➤ Can attack against Submarine units, which are usually not reachable. +➤ Can attack against Balloons, which are usually not reachable. +➤ Attacking with fractional move points gives fractional attack power. +➤ Can Pillage +➤ Can't be sabotaged. +➤ May acquire veteran status. + • Veterans have increased strength in combat. + +Veteran Levels for Missile Submarines: + + +
+ + + + + + +
Veteran levelPower factorPromotion OddsMove bonus
green100%50% -
veteran150%33% -
hardened175%20% -
elite200%15% -
crack210%15% + 1
master220%15% + 1
sea wolf230%-+ 1
+
+
+
+

Carrier

+ +
Cost: 155 shields
+
Upkeep: 1 Shield, 1 Unhappy
+
Moves: 11
+
Vision: 3.46 tiles
+
Attack: 1
+
Defense: 9
+
Firepower: 2
+
Hitpoints: 40
+
Obsolete by: None
+
The Carrier is a mobile airport that can carry Air units, Helicopters, AAA, Marines, and Missiles. Fighters can Vigil on a Carrier if they have enough moves and the Carrier has not moved since the Vigil order was given.
+Carriers are very expensive and thus, usually protected by a fleet of scouts and escorts.
+
➤ Belongs to Sea unit class. + • Crew Repair: each turn, regardless of movement, recovers 3 hit points. + • Speed is not affected by terrain. + • Does not get defense bonuses from terrain. + • Not subject to zones of control. + • Slowed down while damaged. + • Crew RepairAutomatically repairs 10% of its hitpoints each turn, regardless of movement (+4hp) + • Cannot perform attacks on Land or cities. +➤ 2× defense bonus if attacked by Marines or Anti-Aircraft Artillery. +➤ STACK ESCAPE: 60% odds to escape if stack defender loses, if attacker doesn’t have more moves than it does. +➤ Unable to attack air units. +➤ Can carry and refuel up to 10 Missile, LandAirSea, Helicopter, Air, Air_High_Altitude, AirProtect, or Balloon units. + • Cargo not visible except to allies. +➤ Can only attack units on native tiles. +➤ PORT PENALTY: If attacked in a city, firepower is set to 1 and firepower of attacker is doubled. +➤ May impose a zone of control on its adjacent tiles. + • Prevents enemy cities from working the tile it's on. ➤ Can attack against Submarine units, which are usually not reachable. ➤ Can attack against Helicopter units, which are usually not reachable. ➤ Attacking with fractional move points gives fractional attack power. @@ -4274,7 +4850,7 @@

Carrier

sea wolf230%-+ 1
-
+

Cruise Missile

Cost: 60 shields
@@ -4293,7 +4869,7 @@

Cruise Missile

• Not subject to zones of control. • Unreachable. Most units cannot attack this one. ◦ Doesn't prevent enemy units from attacking other units on its tile. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. ➤ Unblockable: unreachable units can't block its attacks on reachable units. ➤ AEGIS and Armor II have a defense bonus against this unit. @@ -4310,7 +4886,118 @@

Cruise Missile

• Veterans have increased strength in combat.
-
+
+

Nuclear Missile

+ +
Cost: 160 shields
+
Upkeep: 1 Shield, 1 Unhappy
+
Moves: 24
+
Vision: 1.41 tiles
+
Attack: 100
+
Defense: 0
+
Firepower: 1
+
Hitpoints: 10
+
Obsolete by: None
+
If you have Space Flight and the Manhattan Project has been built by any player, you can make Nuclear Missiles. Nuclear blasts destroy ALL units in a 3×3 area. City population is reduced by half. Land tiles may get nuclear fallout. Fallout reduces tile output and increases risk of nuclear winter.
+If Fallout is cleaned on the turn it appears, the chance of nuclear winter is reduced.
+
➤ Belongs to Missile unit class. + • Speed is not affected by terrain. + • Does not get defense bonuses from terrain. + • Not subject to zones of control. + • Unreachable. Most units cannot attack this one. + ◦ Doesn't prevent enemy units from attacking other units on its tile. + • Doesn't prevent enemy cities from working the tile it's on. + • AIRLIFT: Can be airlifted if it has remaining moves. +➤ Unblockable: unreachable units can't block its attacks on reachable units. +➤ Can perform a Nuclear Detonation obliterating all adjacent tiles. +➤ Never imposes a zone of control. +➤ Field unit: one unhappiness applies even when non-aggressive. +➤ Unit must be in a City, Airbase, Mobile SAM, Missile Destroyer, AEGIS Cruiser, Submarine, or Carrier after 1 turn. +➤ Can Explode Nuclear + • uses up the Nuclear Missile. +➤ Can Attack + • uses up the Nuclear Missile. + • causes Nuclear Detonation centered on the target tile. + • creates International Outrage: all nations have casus belli. +➤ Can't be bribed. +➤ Can't be sabotaged. +➤ Will never achieve veteran status. +
+
+
+

Tactical Nuke

+ +
Cost: 140 shields
+
Upkeep: 1 Shield, 1 Unhappy
+
Moves: 18
+
Vision: 1.41 tiles
+
Attack: 100
+
Defense: 0
+
Firepower: 1
+
Hitpoints: 10
+
Obsolete by: None
+
Tactical Nukes are very small warheads attached to missiles. A Tactical Nuke destroys all units on a single tile. City population is reduced by half. The target tile may get Fallout. In theory, Tactical Nukes are small enough to get the advantages of nuclear armaments without the severity of consequences. In reality, they might be a gateway that escalates toward mutual assured destruction.
+If you have Fusion Power and the Manhattan Project was built, a Tactical Nuke can be made in a city with an Enrichment Facility. 
+
➤ Belongs to Missile unit class. + • Speed is not affected by terrain. + • Does not get defense bonuses from terrain. + • Not subject to zones of control. + • Unreachable. Most units cannot attack this one. + ◦ Doesn't prevent enemy units from attacking other units on its tile. + • Doesn't prevent enemy cities from working the tile it's on. + • AIRLIFT: Can be airlifted if it has remaining moves. +➤ Can only be built if there is Enrichment Facility in the city. +➤ Unblockable: unreachable units can't block its attacks on reachable units. +➤ Can perform a Nuclear Detonation obliterating only the targeted tile. +➤ Never imposes a zone of control. +➤ Field unit: unhappiness applies even when non-aggressive. +➤ Unit must be in a City, Airbase, Mobile SAM, Missile Destroyer, AEGIS Cruiser, Submarine, or Carrier after 1 turn. +➤ Can Explode Nuclear + • uses up the Tactical Nuke. +➤ Can Attack + • uses up the Tactical Nuke. + • causes Nuclear Detonation only on the target tile. + • creates International Outrage: all nations have casus belli. +➤ Can't be bribed. +➤ Can't be sabotaged. +➤ Will never achieve veteran status. +
+
+
+

Bombs

+ +
Cost: 25 shields
+
Upkeep: 1 Gold, 1 Unhappy
+
Moves: 1
+
Vision: 0.00 tiles
+
Attack: 10
+
Defense: 0
+
Firepower: 1
+
Hitpoints: 10
+
Obsolete by: None
+
Bombs are several tons of explosive payload. While bombers are considered to carry standard weaponry included, the Bombs unit represents heavier payloads of larger, higher grade weaponry. Only bombers with high capacity can carry this unit. 
+Bombs can only be moved by bombers or the airlift order. They can’t attack from inside a domestic city. Bombs are cheap, but they damage more often than kill, and even victory has a cost. Hidden expenses lie in logistics, delivery risk, and non-reusability. 
+
+Multislot: Under certain conditions, cities can make one (or more) multislot units per turn, plus one of any other type.
+
➤ Belongs to Bomb unit class. + • Speed is not affected by terrain. + • Unreachable. Most units cannot attack this one. + ◦ Doesn't prevent enemy units from attacking other units on its tile. + • AIRLIFT: Can be airlifted if it has remaining moves. +➤ Multislot: Under certain conditions, cities can make one (or more) multislot unit(s) per turn, plus one of any other unit type. +➤ Never imposes a zone of control. +➤ Unit has to be in a city, an Airbase, or on a Medium Bomber, Heavy Bomber, Strategic Bomber, Jet Bomber, or Stealth Bomber after 1 turn. +➤ Can Explode + • Must be done while carried by a bomber-type while not inside a friendly city. + • Uses up the Bombs. + • AEGIS and Armor II have a defense bonus against this unit. + • Unable to attack air units. +➤ Can't be bribed. +➤ Can't be sabotaged. +➤ Will never achieve veteran status. +
+
+

Atom Bomb

Cost: 150 shields
@@ -4329,7 +5016,7 @@

Atom Bomb

• Not subject to zones of control. • Unreachable. Most units cannot attack this one. ◦ Doesn't prevent enemy units from attacking other units on its tile. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. ➤ Unblockable: unreachable units can't block its attacks on reachable units. ➤ Can perform a Nuclear Detonation obliterating all cardinally adjacent tiles. @@ -4347,7 +5034,7 @@

Atom Bomb

➤ Will never achieve veteran status.
-
+

Hydrogen Bomb

Cost: 190 shields
@@ -4368,7 +5055,7 @@

Hydrogen Bomb

• Not subject to zones of control. • Unreachable. Most units cannot attack this one. ◦ Doesn't prevent enemy units from attacking other units on its tile. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. ➤ Can only be built if there is Enrichment Facility in the city. ➤ Unblockable: unreachable units can't block its attacks on reachable units. @@ -4387,7 +5074,7 @@

Hydrogen Bomb

➤ Will never achieve veteran status.
-
+

Doomsday Bomb

Cost: 1000 shields
@@ -4408,7 +5095,7 @@

Doomsday Bomb

• Not subject to zones of control. • Unreachable. Most units cannot attack this one. ◦ Doesn't prevent enemy units from attacking other units on its tile. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.AIRLIFT: Can be airlifted if it has remaining moves. ➤ Can only be built if there is Enrichment Facility in the city. ➤ Unblockable: unreachable units can't block its attacks on reachable units. @@ -4429,84 +5116,73 @@

Doomsday Bomb

➤ Will never achieve veteran status.
-
-

Nuclear Missile

+
+

Emissary

-
Cost: 160 shields
-
Upkeep: 1 Shield, 1 Unhappy
-
Moves: 24
-
Vision: 1.41 tiles
-
Attack: 100
+
Cost: 24 shields
+
Upkeep: 0
+
Moves: 3
+
Vision: 2.00 tiles
+
Attack: 0
Defense: 0
Firepower: 1
-
Hitpoints: 10
-
Obsolete by: None
-
If you have Space Flight and the Manhattan Project has been built by any player, you can make Nuclear Missiles. Nuclear blasts destroy ALL units in a 3×3 area. City population is reduced by half. Land tiles may get nuclear fallout. Fallout reduces tile output and increases risk of nuclear winter.
-If Fallout is cleaned on the turn it appears, the chance of nuclear winter is reduced.
-
➤ Belongs to Missile unit class. - • Speed is not affected by terrain. - • Does not get defense bonuses from terrain. - • Not subject to zones of control. - • Unreachable. Most units cannot attack this one. - ◦ Doesn't prevent enemy units from attacking other units on its tile. - • Doesn't prevent enemy cities from working the tile it's on. +
Hitpoints: 8
+
Obsolete by: Diplomat
+
An Emissary performs official or covert actions. Covert actions make incidents which let Senates break treaties. Emissaries in cities may defend such acts with diplomatic combat. Emissaries can • Bribe a lone unit • Establish embassy • Investigate City • Steal tech • Steal maps • Incite city revolt. 
+Except for Bribing and Investigate City, diplomatic actions will spend the Emissary, making him unavailable for further use. Emissaries may claim a tile for your nation if adjacent to a tile claim made inside your own national border. Foreign tile claims require the Emissary to be accompanied by another unit. 
+Emissaries have no upgrade cost. Full rules for Emissaries are in the Manual.
+
➤ Belongs to Land unit class. + • Slowed down while damaged. • AIRLIFT: Can be airlifted if it has remaining moves. -➤ Unblockable: unreachable units can't block its attacks on reachable units. -➤ Can perform a Nuclear Detonation obliterating all adjacent tiles. + • Can't do actions as Cargo. Must first unload. +➤ Defends cities against diplomatic actions. ➤ Never imposes a zone of control. -➤ Field unit: one unhappiness applies even when non-aggressive. -➤ Unit must be in a City, Airbase, Mobile SAM, Missile Destroyer, AEGIS Cruiser, Submarine, or Carrier after 1 turn. -➤ Can Explode Nuclear - • uses up the Nuclear Missile. -➤ Can Attack - • uses up the Nuclear Missile. - • causes Nuclear Detonation centered on the target tile. - • creates International Outrage: all nations have casus belli. -➤ Can't be bribed. -➤ Can't be sabotaged. -➤ Will never achieve veteran status. -
-
-
-

Tactical Nuke

+➤ Not subject to zones of control imposed by other units. +➤ A non-military unit: + • Cannot attack. + • Doesn't impose martial law. + • Can enter foreign territory regardless of peace treaty. + • Doesn't prevent enemy cities from working the tile it's on. +➤ Can do Diplomatic Operations: + • is done to foreign cities. + * 'Become Ambassador' + · creates a permanent Embassy. + • uses up the Emissary. + · can't be done at War if city is Theocratic or has Police Station. + * getting caught before performing this action during Armistice, Cease-fire, or Peace gives the victim Casus Belli against you. + * 'Investigate City' (does not spend the unit) +➤ Can do Hostile Diplomatic Operations: + • uses up the Emissary. + • is done to foreign cities. + • can lead to a diplomatic battle against a defender. + * 'Steal Technology' + * 'Incite a Revolt' + * 'Steal Map Fragments' +➤ Can do Field Operations: + • does not use up the Emissary. + • is done to foreign individual units alone on a tile. + * 'Bribe Enemy Unit' (does not spend the unit) +➤ Can Upgrade + • upgrades to Diplomat. +➤ Can Fortify. Only makes the Emissary stay put. +➤ Expellable: can be expelled from foreign tiles. +➤ May acquire veteran status. + • Veterans have improved chances in diplomatic contests. -
Cost: 140 shields
-
Upkeep: 1 Shield, 1 Unhappy
-
Moves: 18
-
Vision: 1.41 tiles
-
Attack: 100
-
Defense: 0
-
Firepower: 1
-
Hitpoints: 10
-
Obsolete by: None
-
Tactical Nukes are very small warheads attached to missiles. A Tactical Nuke destroys all units on a single tile. City population is reduced by half. The target tile may get Fallout. In theory, Tactical Nukes are small enough to get the advantages of nuclear armaments without the severity of consequences. In reality, they might be a gateway that escalates toward mutual assured destruction.
-If you have Fusion Power and the Manhattan Project was built, a Tactical Nuke can be made in a city with an Enrichment Facility. 
-
➤ Belongs to Missile unit class. - • Speed is not affected by terrain. - • Does not get defense bonuses from terrain. - • Not subject to zones of control. - • Unreachable. Most units cannot attack this one. - ◦ Doesn't prevent enemy units from attacking other units on its tile. - • Doesn't prevent enemy cities from working the tile it's on. - • AIRLIFT: Can be airlifted if it has remaining moves. -➤ Can only be built if there is Enrichment Facility in the city. -➤ Unblockable: unreachable units can't block its attacks on reachable units. -➤ Can perform a Nuclear Detonation obliterating only the targeted tile. -➤ Never imposes a zone of control. -➤ Field unit: unhappiness applies even when non-aggressive. -➤ Unit must be in a City, Airbase, Mobile SAM, Missile Destroyer, AEGIS Cruiser, Submarine, or Carrier after 1 turn. -➤ Can Explode Nuclear - • uses up the Tactical Nuke. -➤ Can Attack - • uses up the Tactical Nuke. - • causes Nuclear Detonation only on the target tile. - • creates International Outrage: all nations have casus belli. -➤ Can't be bribed. -➤ Can't be sabotaged. -➤ Will never achieve veteran status. +Emissaries have their own veteran levels: + + +
+ + + + + + +
Veteran levelPower factorPromotion oddsMove bonus
courier100%60% -
messenger110%50% -
envoy115%40% -
legate120%30% -
consul125%20%
minister130%15%
manus regis135%-
-
+

Diplomat

Cost: 30 shields
@@ -4516,12 +5192,13 @@

Diplomat

Attack: 0
Defense: 0
Firepower: 1
-
Hitpoints: 10
-
Obsolete by: Spy
-
A Diplomat performs official or covert actions. Covert actions make incidents which let Senates break treaties. Diplomats in cities may defend such acts with diplomatic combat. Diplomats can • Bribe a lone unit • Establish embassy • Investigate City • Sabotage random production or buildings • Steal tech • Steal maps • Incite city revolt.
-Except for Bribing and Investigate City, diplomatic actions will spend the Diplomat, making it unavailable for further use. Diplomats may claim a tile for your nation if adjacent to a tile claim made inside your own national border. Foreign tile claims require the Diplomat be accompanied by another unit.
+
Hitpoints: 8
+
Obsolete by: None
+
A Diplomat performs official or covert actions. Covert actions make incidents which let Senates break treaties. Diplomats can do what Emissaries can, and also: • Move faster • Establish Embassy without spending unit • Sabotage random production or buildings. 
+Except for Bribing, Establishing Embassy, and Investigate City, diplomatic actions will spend the Diplomat, making him unavailable for further use. Diplomats may claim a tile for your nation if adjacent to a tile claim made inside your own national border. Foreign tile claims require the Diplomat to be accompanied by another unit. 
+Espionage tech allows Diplomats to establish hostile embassies vs. Courthouse and Homeland Security (but not vs. Police Station or Theocracy.) 
 
-Full rules for Diplomats are in the Manual.
+Diplomats can be upgraded from Emissaries for free. Full rules for Diplomats are in the Manual.
 
➤ Belongs to Land unit class. • Slowed down while damaged. • AIRLIFT: Can be airlifted if it has remaining moves. @@ -4533,13 +5210,13 @@

Diplomat

• Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can do Diplomatic Operations: - • uses up the Diplomat. • is done to foreign cities. - * 'Become Ambassador' + * 'Establish Embassy' (does not spend the unit) · creates a permanent Embassy. · can't be done at War if city is Theocratic or has Police Station. + * getting caught before performing this action during Armistice, Cease-fire, or Peace gives the victim Casus Belli against you. * 'Investigate City' (does not spend the unit) ➤ Can do Hostile Diplomatic Operations: • uses up the Diplomat. @@ -4553,14 +5230,12 @@

Diplomat

• does not use up the Diplomat. • is done to foreign individual units alone on a tile. * 'Bribe Enemy Unit' (does not spend the unit) -➤ Can Upgrade - • upgrades to Spy. ➤ Can Fortify. Only makes the Diplomat stay put. ➤ Expellable: can be expelled from foreign tiles. ➤ May acquire veteran status. • Veterans have improved chances in diplomatic contests. -Veteran levels for Diplomats are unique to diplomatic type units: +Diplomats have their own veteran levels:
@@ -4568,12 +5243,12 @@

Diplomat

- - + +
Veteran levelPower factorPromotion oddsMove bonus
secretary110%50% -
envoy115%40% -
ambassador120%30% -
emissary125%20%
statesman130%15%
statesmen125%20%
premier130%15%
plenipotentiary135%-
-
+

Spy

Cost: 35 shields
@@ -4583,10 +5258,10 @@

Spy

Attack: 0
Defense: 0
Firepower: 1
-
Hitpoints: 10
+
Hitpoints: 8
Obsolete by: None
-
Spies can do what a Diplomat can, and also: • Survive ops • Sabotage lone units • Poison city water • Steal specific tech • Steal tech from cities more than once • Sabotage specific targets in cities.
-Spies who survive ops escape to the nearest friendly city. Spies have a 25% advantage over Diplomats in combat: a base 75% chance to win. Spies may claim a tile for your nation if adjacent to a tile claim made inside your own national border. Tile claims require the Spy to be accompanied by a military unit. Full rules are in the Manual.
+
Except for establishing an embassy, Spies can do what a Diplomat can, and also:• Survive ops • Sabotage lone units • Poison city water • Steal specific tech • Steal tech from cities more than once • Sabotage specific targets in cities. 
+Spies who survive ops escape to the nearest friendly city. Spies have a 25% advantage over Diplomats in combat:a base 75% chance to win. Spies may claim a tile for your nation if adjacent to a tile claim made inside your own national border. Tile claims require the Spy to be accompanied by another unit. Full rules are in the Manual.
 
➤ Belongs to Land unit class. • Slowed down while damaged. • AIRLIFT: Can be airlifted if it has remaining moves. @@ -4599,11 +5274,9 @@

Spy

• Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can do Diplomatic Operations: • is done to foreign cities. - * 'Establish Embassy' - · can't be done at War if city is Theocratic or has Police Station. * 'Investigate City' (does not spend the unit) · can be done while Spy is transported cargo, using the 'D' (Do) command. ➤ Can do Hostile Diplomatic Operations: @@ -4631,7 +5304,7 @@

Spy

• Veterans have improved chances in diplomatic contests. • Veterans are more likely to survive missions. -Veteran levels for Spies are unique to diplomatic type units: +Spies have their own veteran levels:
@@ -4644,63 +5317,72 @@

Spy

Veteran levelPower factorPromotion oddsMove bonus
spymaster135%-
-
-

Caravan

+
+

Patriarch

-
Cost: 30 shields
+
Cost: 55 shields
Upkeep: 0
-
Moves: 2
+
Moves: 4
Vision: 2.00 tiles
Attack: 0
-
Defense: 1
+
Defense: 0
Firepower: 1
-
Hitpoints: 10
-
Obsolete by: Truck
-
The Caravan is versatile and rugged. It is the only all-terrain land Commerce unit. It is also the only one that presents no potential military threat to trade partners. It can defend itself, fortify, and has 2 7/9 moves.
- 
-Commerce units can help build Wonders in any city with whom you are not at war. In foreign cities 20+ tiles distant, they can create Trade Routes, increasing net trade in both cities relative to their combined trade. Routes are inactive during war and (re)activate during peace.
-Commerce units can enter the Marketplace of non-hostile foreign cities to sell their wares:revenue derives from total trade in both cities. This is only profitable between cities with very high trade.
-Commerce units can build any Wonders for which you have the tech requirement. To use them for a Trade Route, they need to have given a Home City.
-All Commerce units can carry Goods as cargo.
-  
➤ Belongs to Land unit class. +
Hitpoints: 8
+
Obsolete by: None
+
The Patriarch is unique—you can make only one, and only with Theocracy in a city with an Ecclesiastical Palace. He can do what Diplomats can do, with extra powers of persuasion. Under Theocracy, the Patriarch converts units to join your side at 1/3 the cost of a normal Bribe; and incites cities to become yours at one third the normal cost. 
+Investigating, Converting, Establishing Embassy, and Inciting can be done multiple times if successful. Other actions spend the Patriarch, allowing no further use. A Patriarch may claim a tile for your nation if adjacent to a tile claim made inside your own national border. Foreign tile claims require the Patriarch to be accompanied by another unit. 
+Espionage tech allows the Patriarch to establish hostile embassies vs. Courthouse and Homeland Security (but not vs. Police Station or Theocracy.) 
+
+In diplomatic contests, the wiles, power, and influence of the Patriarch make him equal to a Spy in strength.
+
➤ Belongs to Land unit class. • Slowed down while damaged. • AIRLIFT: Can be airlifted if it has remaining moves. -➤ Can help build a Wonder in any non-hostile city. -➤ Can carry up to 2 Cargo units. + • Can't do actions as Cargo. Must first unload. +➤ Each player may only have one of this type of unit. +➤ Defends cities against diplomatic actions. ➤ Never imposes a zone of control. ➤ Not subject to zones of control imposed by other units. -➤ Under certain conditions, cities can make more than one of this unit per turn, plus one of any other unit type. ➤ A non-military unit: • Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. -➤ Can Establish Trade Route - • is done to foreign cities 15 or more tiles distant. - • inactive during War. - • uses up the Caravan. -➤ Can Enter Marketplace - • is done to foreign cities not at war. - • uses up the Caravan. -➤ Can Help Build Wonder - • is done in friendly cities. Contributes the unit's shield cost to current production - • uses up the Caravan. - • adds 30 production. -➤ Can Upgrade - • upgrades to Truck. -➤ Can Fortify, granting a 50% defensive bonus when not in a city. - • Gets the 50% defensive bonus automatically while in cities. -➤ Capturable: can be captured if conditions allow it. + • Doesn't prevent enemy cities from working the tile it's on. +➤ Can do Diplomatic Operations: + • is done to foreign cities. + * 'Establish Embassy' (does not spend the unit) + · creates a permanent Embassy. + · can't be done at War if city is Theocratic or has Police Station. + * getting caught before performing this action during Armistice, Cease-fire, or Peace gives the victim Casus Belli against you. + * 'Investigate City' (does not spend the unit) +➤ Can 'Incite a Revolt and Escape': + • Is 1/3 the cost if done with Theocracy government. + • does not spend the Patriarch. + • is done to foreign cities. + • can lead to a diplomatic battle against a defender. +➤ Can do Hostile Diplomatic Operations: + • uses up the Patriarch. + • is done to foreign cities. + • can lead to a diplomatic battle against a defender. + * 'Sabotage City' selects random building or production. + * 'Steal Technology' + * 'Steal Map Fragments' +➤ Can do Field Operations: + • does not use up the Patriarch. + • is done to foreign individual units alone on a tile. + * 'Convert Unit' (does not spend the unit) + * Is 1/3 the cost of 'Bribe Enemy Unit' if done with Theocracy government. +➤ Can Fortify. Only makes the Patriarch stay put. ➤ Expellable: can be expelled from foreign tiles. -➤ May acquire veteran status. - • Veterans have increased strength in combat. -
Transport Loading Logistics - -Transport Unloading Logistics - +➤ Will never achieve veteran status. + +The Patriarch has his own veteran level: + + +
+ -
+

Wagon

Cost: 25 shields
@@ -4714,16 +5396,16 @@

Wagon

Obsolete by: Truck
Wagons are the first Commerce unit that can travel by land. Compared to a Caravan, they are defenseless. They must stay on roads and quays; or flat grasslands, plains, and tundra. Wagons are useful for transporting slower units. Wagons have 3⅓ move points, giving a range of 10 tiles on roads. 
  
-
-Wagons allow units with less than 3 move points to travel your roads faster. Any cargo can board a Wagon anywhere; but needs a city, quay, or base to deboard. Cargo can disembark anywhere, but it uses up all move points. 
+Wagons allow units with less than 3 move points to travel your roads faster. Any cargo can board a Wagon anywhere; but needs a city, quay, or base to deboard. Cargo can disembark anywhere, but it uses up all move points. 
 Read the help on Caravans to see what Commerce units can do.
 
➤ Belongs to LandRoad unit class. • Only able to move on road tiles. • Subject to zones of control. -➤ Can carry up to 2 Foot units. +➤ Can carry up to 2 Foot soldiers, Goods, or Freight units. • Cargo can load outside a City. • Cargo can step off outside a City, and loses all moves. • Cargo cannot unload (T) outside a City, Quay, Fortress, or Naval Base. + • Cargo is visible to all nations who can see the Wagon. ➤ Can Help Build Wonder • is done in friendly cities. Contributes the unit's shield cost to current production • uses up the Wagon. @@ -4732,23 +5414,72 @@

Wagon

• is done to foreign cities 15 or more tiles distant. • inactive during War. • uses up the Wagon. -➤ Can Enter Marketplace - • is done to foreign cities not at war. - • uses up the Wagon. ➤ Never imposes a zone of control. ➤ A non-military unit: • Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.Capturable: can be captured if conditions allow it. ➤ Expellable: can be expelled from foreign tiles. ➤ Can Upgrade • upgrades to Truck. ➤ Will never achieve veteran status.
-
-
+
+
+

Caravan

+ +
Cost: 30 shields
+
Upkeep: 0
+
Moves: 2
+
Vision: 2.00 tiles
+
Attack: 0
+
Defense: 1
+
Firepower: 1
+
Hitpoints: 10
+
Obsolete by: Truck
+
The Caravan is versatile and rugged. It is the only all-terrain land Commerce unit. It is also the only one that presents no potential military threat to trade partners. It can defend itself, fortify, and carry 3 Goods or Freight.
+ 
+Commerce units can help build Wonders in any city with whom you are not at war. In foreign cities 20+ tiles distant, they can create Trade Routes, increasing net trade in both cities relative to their combined trade. Routes are inactive during war and (re)activate during peace.
+Commerce units can build any Wonders for which you have the tech requirement. To use them for a Trade Route, they need to have given a Home City.
+All Commerce units can carry Goods as cargo.
+  
➤ Belongs to Land unit class. + • Slowed down while damaged. + • AIRLIFT: Can be airlifted if it has remaining moves. +➤ Can help build a Wonder in any non-hostile city. +➤ Can carry up to 3 Goods or Freight units. + • Cargo not visible except to allies. +➤ Never imposes a zone of control. +➤ Not subject to zones of control imposed by other units. +➤ A non-military unit: + • Cannot attack. + • Doesn't impose martial law. + • Can enter foreign territory regardless of peace treaty. + • Doesn't prevent enemy cities from working the tile it's on. +➤ Can Establish Trade Route + • is done to foreign cities 15 or more tiles distant. + • inactive during War. + • uses up the Caravan. +➤ Can Help Build Wonder + • is done in friendly cities. Contributes the unit's shield cost to current production + • uses up the Caravan. + • adds 30 production. +➤ Can Upgrade + • upgrades to Truck. +➤ Can Fortify, granting a 50% defensive bonus when not in a city. + • Gets the 50% defensive bonus automatically while in cities. +➤ Capturable: can be captured if conditions allow it. +➤ Expellable: can be expelled from foreign tiles. +➤ May acquire veteran status. + • Veterans have increased strength in combat. +
Transport Loading Logistics + +Transport Unloading Logistics + +
+
+

Train

Cost: 35 shields
@@ -4763,7 +5494,7 @@

Train

Trains are Commerce units with a bonus:they allow units with less than 3 move points to travel your rails at distances comparable to other units. Transport logistics for Trains are more restricted than for Wagons and Trucks. Except for Foot soldiers, all units need to be in a city to get on or off a Train. 
 Foot Soldiers use Trains the same as Wagons and Trucks, and can: 
   1. Board anywhere; 
-  2. Deboard in a Base or Quay.; 
+  2. Deboard in a Base or Quay; 
   3. Disembark outside a City (loses all moves.) 
 
 On non-allied foreign rails, Trains incur full terrain movement cost. Pre-gunpowder units can’t attack Trains. 
@@ -4774,9 +5505,10 @@ 

Train

• Subject to zones of control. • Unreachable to pre-gunpowder units. ➤ Can carry up to 6 qualifying units. - • Units with less than 3 moves: e.g., Foot Soldier, Artillery, Workers, Caravan, Bomb units. - • May also carry and refuel Balloon units. + • Units with less than 3 moves: e.g., Foot soldier, Ballistic class, Workers, Migrant types, Caravan, Freight, Goods, and Bomb units. + • Can also carry and refuel Balloons and Zeppelins. • Some cargo cannot be loaded/unloaded except in a City. + • Cargo not visible except to allies. ➤ Can Help Build Wonder • is done in friendly cities. Contributes the unit's shield cost to current production • uses up the Train. @@ -4785,20 +5517,17 @@

Train

• is done to foreign cities 15 or more tiles distant. • inactive during War. • uses up the Train. -➤ Can Enter Marketplace - • is done to foreign cities not at war. - • uses up the Train. ➤ Never imposes a zone of control. ➤ A non-military unit: • Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on.Capturable: can be captured if conditions allow it. ➤ Will never achieve veteran status.
-
+

Truck

Cost: 50 shields
@@ -4810,33 +5539,26 @@

Truck

Firepower: 1
Hitpoints: 20
Obsolete by: None
-
The Truck replaces the Caravan as the basic Commerce unit on Land. It moves at more than twice the speed; but is restricted to the same roads and flatland tiles as Wagons, and can't use rails. Each Truck used to build a Wonder will add 50 shields. See the entry on Caravan to read what Commerce units may do. 
+
The Truck replaces the Caravan as the basic Commerce unit on Land. It moves at more than twice the speed; but is restricted to roads and quays, and can't use rails. Each Truck used to build a Wonder will add 50 shields. See the entry on Caravan to read what Commerce units may do. 
 
 Trucks allow units with less than 3 move points to travel your roads faster: Like the Wagon, any cargo can board a Truck anywhere, but a city, quay, or base is needed to deboard. Disembarking is legal for all cargo types, but uses up all moves (except Marines.)
 
➤ Belongs to LandRoad unit class. • Can only travel on roads. • Slowed down while damaged. ➤ Can carry up to 3 qualifying units. - • Units with less than 3 moves: e.g., Foot Soldier, Artillery, Workers, Caravan, Freight, Bomb units. + • Units with less than 3 moves: e.g., Foot Soldier, Artillery, Workers, Caravan, Goods, Freight, Bomb units. • Some cargo cannot be loaded/unloaded except in a City. + • Cargo not visible except to allies. ➤ Never imposes a zone of control. -➤ Not subject to zones of control imposed by other units. -➤ Can Help Build Wonder - • is done in friendly cities. Contributes the unit's shield cost to current production - • uses up the Truck. - • adds 35 production. ➤ A non-military unit: • Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can Establish Trade Route • is done to foreign cities 15 or more tiles distant. • inactive during War. • uses up the Truck. -➤ Can Enter Marketplace - • is done to foreign cities not at war. - • uses up the Truck. ➤ Can Help Build Wonder • is done in friendly cities. Contributes the unit's shield cost to current production • uses up the Truck. @@ -4847,7 +5569,7 @@

Truck

Expellable: can be expelled from foreign tiles.
-
+

Goods

Cost: 20 shields
@@ -4859,10 +5581,9 @@

Goods

Firepower: 1
Hitpoints: 1
Obsolete by: Freight
-
Goods are commodities. The cargo containers of the ancient world were amphorae, which carried for trade goods.
-Goods can be used to establish Trade Route or Enter Marketplace. They can be carried by Commerce units, allowing you to establish multiple trade routes in one voyage. Also, Goods can Recycle Production with only a 15% penalty, rendering 17 shields into a city production target.
+
Goods are used to establish Trade Routes, Help Build Wonders, and contribute to city production. Recycle Production has a penalty of only 3 shields, yielding 17 shields into a city’s production target. 
 
-By themselves, Goods can only move onto tiles with a City, Quay, Fortress, or Naval Base. Commerce units, Tribesmen, and Galleons may carry them as cargo. If adjacent to a foreign city, use the D command (D) for Commerce functions.
+Goods can only move to tiles with a City, Quay, Fortress, Airbase, or Naval Base. Otherwise they must be transported. If adjacent to a foreign city, use the Do command (D) for Commerce functions.
 
➤ Belongs to Cargo unit class. • Is NOT a unit. It is goods and materials for production and commerce. • Only able to move onto Cities, Quays, Fortresses, and Naval Bases. @@ -4872,6 +5593,10 @@

Goods

• Can't Fortify. • Can be carried by any Commerce Unit, and Galleons. ➤ Never imposes a zone of control. +➤ Can Help Build Wonder + • is done in friendly cities. Contributes the unit's shield cost to current production + • uses up the Goods. + • adds 20 production. ➤ A non-military unit: • Cannot attack. • Doesn't impose martial law. @@ -4880,16 +5605,13 @@

Goods

• is done to foreign cities 15 or more tiles distant. • inactive during War. • uses up the Goods. -➤ Can Enter Marketplace - • is done to foreign cities not at war. - • uses up the Goods. ➤ Can Upgrade • upgrades to Freight. ➤ Capturable: can be captured if conditions allow it. • does not count as an extra unit on tile to prevent capture.
-
+

Freight

Cost: 25 shields
@@ -4901,83 +5623,37 @@

Freight

Firepower: 1
Hitpoints: 1
Obsolete by: None
-
The methodical logistics of modern shipping render the Freight unit: a cargo container separate from the transport vehicle. Freight brings benefits of organized efficiency. Like all Commerce units, it can Help Build Wonders, and Establish Trade Route or Enter Marketplace (with a lower unit cost.) Unlike other Commerce units, it can Disband to Recycle Production with no net loss in shields. This gives Freight a variety of creative industrial uses. 
-
-By itself, Freight is only able to move to tiles with loading infrastructure: Cities, Quays, Fortresses, and Naval Bases. To be transported, it must be carried by Train, Truck, Airplane, or ship. If adjacent to a foreign city, use the D key to do Commerce functions.
+
Freight brings benefits of organized efficiency. Like all Commerce units, it can Help Build Wonders, and Establish Trade Route. Unlike other Commerce units, it can Disband to Recycle Production with no net loss in shields. This gives Freight a variety of industrial uses. Similar to Infantry, Freight can use extra build slots a city may have.  
+
+By itself, Freight is only able to move to tiles with loading infrastructure: Cities, Quays, Fortresses, Airbases, and Naval Bases. To be transported, it must be carried as cargo. If adjacent to a foreign city, use the D key to do Commerce functions.
 
➤ Belongs to Cargo class. • Is NOT a unit. It is goods and materials for production and commerce. • Only able to move onto Cities, Quays, Fortresses, and Naval Bases. • Pays no penalty for recycling production into Units, Buildings, or Wonders. • Subject to zones of control. • Can't Fortify. - • Can be carried by Train, Truck, Cargo Ship, Transport. + • Can be carried by Train, Truck, Cargo Ship, Transport, Airplane. ➤ Never imposes a zone of control. ➤ Not subject to zones of control imposed by other units. -➤ Can Help Build Wonder - • is done in friendly cities. Contributes the unit's shield cost to current production - • uses up the Freight. - • adds 35 production. +➤ Multislot: Under certain conditions, cities can make one (or more) multislot unit(s) per turn, plus one of any other unit type. ➤ A non-military unit: • Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can Establish Trade Route • is done to foreign cities 15 or more tiles distant. • inactive during War. • uses up the Freight. -➤ Can Enter Marketplace - • is done to foreign cities not at war. - • uses up the Freight. ➤ Can Help Build Wonder • is done in friendly cities. Contributes the unit's shield cost to current production • uses up the Freight. - • adds 50 production. + • adds 25 production. ➤ Capturable: can be captured if conditions allow it. • does not count as an extra unit on tile to prevent capture.
-
-

Scout

- -
Cost: 30 shields
-
Upkeep: 0
-
Moves: 2
-
Vision: 2.24 tiles
-
Attack: 0
-
Defense: 1
-
Firepower: 1
-
Hitpoints: 10
-
Obsolete by: Partisan
-
Scouts are brave explorers of unknown territory. They can slip through enemy ZOC. Like Tribesmen, they ignore all terrain penalties, treating every tile as if it had a road. This means they can move 4 tiles per turn (6 with the discovery of Map Making.) As a non-military traveler, they can also visit far off cities to Investigate City and gather intel. Sometimes generals will use their scouting information for strategic advantage. Scouts can make contact with far-off lands to arrange cease-fire or peace. Best of all, Scouts live off the land and have no upkeep. In later times, Scouts upgrade to Partisans.
-
➤ Belongs to Land unit class. - • Slowed down while damaged. - • AIRLIFT: Can be airlifted if it has remaining moves. -➤ Ignores terrain effects (moving costs at most 1/3 MP per tile). -➤ Map Making gives +2/3 moves, giving a range of +2 tiles. -➤ Never imposes a zone of control. -➤ Not subject to zones of control imposed by other units. -➤ A non-military unit: - • Cannot attack. - • Doesn't impose martial law. - • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. -➤ Can Investigate City (does not spend the unit) -➤ Can Upgrade - • upgrades to Partisan. -➤ Can Fortify, granting a 50% defensive bonus when not in a city. - • Gets the 50% defensive bonus automatically while in cities. -➤ Capturable: can be captured if conditions allow it. -➤ Expellable: can be expelled from foreign tiles. -➤ May acquire veteran status. - • Veterans have increased strength in combat. -
Transport Loading Logistics - -Transport Unloading Logistics - -
-
-
+

Leader

Cost: 10 shields
@@ -5009,7 +5685,7 @@

Leader

• Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can Destroy City • is done to domestic individual cities. ➤ Can Pillage @@ -5021,7 +5697,8 @@

Leader

➤ Will never achieve veteran status.
-
+ +

Queen

Cost: 10 shields
@@ -5053,7 +5730,7 @@

Queen

• Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can Destroy City • is done to domestic individual cities. ➤ Can Pillage @@ -5065,7 +5742,7 @@

Queen

➤ Will never achieve veteran status.
-
+

Barbarian Leader

Cost: 40 shields
@@ -5091,54 +5768,104 @@

Barbarian Leader

• Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. + • Doesn't prevent enemy cities from working the tile it's on. ➤ Can Pillage ➤ Can Fortify. Only makes the Barbarian Leader stay put. ➤ Can't be bribed. ➤ Will never achieve veteran status.
-
-

Peasants

+
+

Well-Digger

-
Cost: 10 shields
-
Upkeep: 2 Food
-
Moves: 2
+
Cost: 5 shields
+
Upkeep: 2 Food, 5 Shield, 2 Gold
+
Moves: 3
Vision: 2.00 tiles
Attack: 0
Defense: 1
Firepower: 1
-
Hitpoints: 10
-
Obsolete by: None
-
Population Cost: 1. Adds Population: 1.
-  
-Peasants are the common people of Monarchies. You can encourage them by royal edict to migrate to other cities and help colonize new areas. But to have such access, you must be a Constitutional Monarchy with the Magna Carta wonder: Peasants can only be made in the city with Magna Carta, so choose that city carefully. 
-If managed correctly, Peasants can increase your national population growth. They give a tremendous advantage for growing new colonies and settlements faster. 
-Peasants can only be made in one city, but you can make more than one per turn under the right conditions. When a city completes a unit, it will try to make more of them if it doesn’t have a worklist. So be careful!
+
Hitpoints: 8
+
Obsolete by: Workers
+
This unit can fix unlucky starts, but has very high upkeep.
+If you have no water, make a Well-Digger in a city that can support it, create a water source, then disband the unit.
+This unit can dig wells to create irrigation sources. It will cost its home city -2 Food -2 Prod. This unit WILL NOT WORK: • Outside your borders, • After Alphabet or Pottery, • After any player discovers Writing, • After it reaches an age of 10 turns. >> Don't fool around: high upkeep will permanently hinder you. Only make this unit if you lack water when the game starts!
 
➤ Belongs to Land unit class. • Subject to zones of control. • Slowed down while damaged. - • AIRLIFT: Can be airlifted if it has remaining moves. -➤ Can only be built with Constitutional Monarchy as government. -➤ Can only be built if there is Magna Carta in the city. -➤ Costs 1 population to build. -➤ May load onto and unload from Transport Helicopters even when underway. +➤ Each player may only have one of this type of unit. ➤ Never imposes a zone of control. ➤ A non-military unit: • Cannot attack. • Doesn't impose martial law. • Can enter foreign territory regardless of peace treaty. - • Doesn't prevent enemy cities from working the tile it's on. -➤ Under certain conditions, cities can make more than one of this unit per turn, plus one of any other unit type. -➤ Can Add to City - • is done to domestic individual cities. - • uses up the Pilgrims. - • max target size: 39. - • adds 1 population. -➤ Capturable: can be captured if conditions allow it. + • Doesn't prevent enemy cities from working the tile it's on. +➤ Can Dig Well or Irrigate tiles with no water. +➤ Can clean Pollution from tiles. +➤ Can clean Fallout from tiles. +➤ Can Recycle Unit + • is done in cities. Contributes half the unit's shield cost to current production + • uses up the Well-Digger. +➤ Can Disband + • uses up the Well-Digger. Recycles cost if done in a city. +➤ Can Upgrade + • upgrades to Workers. +➤ Can Pillage +➤ Can Road +➤ Can IrrigateExpellable: can be expelled from foreign tiles. -➤ Unable to pillage tiles. ➤ Will never achieve veteran status. +
Transport Loading Logistics + +Transport Unloading Logistics +
+
+

Magnum Turret

+ +
Cost: 160 shields
+
Upkeep: 1 Shield
+
Moves: 0
+
Vision: 2.00 tiles
+
Attack: 10
+
Defense: 7
+
Firepower: 3
+
Hitpoints: 40
+
Obsolete by: None
+
On rare occasions in history, nations constructed monumental turret guns. Cost-benefit is debatable among military theorists due to scale, cost, and immobility. The Magnum Turret stays where it’s built. You may build only one. 
+
+Housed in armored defenses, the Magnum Turret deters attackers and nearby enemy encampments. It may attack or bombard ocean tiles.
+
+If it has moves left, the Magnum Turret can do 7 rounds of Bombardment up to 2 tiles distant upon five units, with two possible fatalities. When special attacked from range, it can retaliate with the same type of Bombardment. 
+
+VIGIL:the Vigil order instructs the Magnum Turret to auto-Bombard adjacent military units if they have better attack odds.
+
➤ Belongs to LandImmobile unit class, Ballistic sub-class. + • VIGIL: can be given the Vigil order to auto-Bombard adjacent military units. + • Cannot move. + • Cannot airlift. + • Cannot be transported. + • Gets a 50% defensive bonus while in cities. + • Gets a 50% defensive bonus while in cities. + • NOTb> slowed while damaged. +➤ Unable to attack air units. +➤ Each player may only have one of this type of unit. +➤ Can safely conduct Bombard Attack. + • Can do the action multiple times per turn. + • Has a range of 2 tiles. + • Has a range of 2 tiles. + • Gives 7 free rounds of combat against up to 5 units in an enemy stack. + • Uses 1 movement point. + • A maximum of 2 units can be killed. + • Can be done to Ocean tiles if not transported. + • Can be done to Cities, Forts, Airbases, Fortresses, Naval Bases, Castles, and Bunkers. + • Action requires: + - Magnum Turret to have not yet taken action this turn. +➤ Has Special Defense against Special Attacks / Ranged Attacks. + • Gives 7 free rounds of combat against up to 5 units in an enemy stack. + • A maximum of 2 units can be killed. +➤ Can Fortify + • Gets the 50% defensive bonus automatically while in cities. +➤ May acquire veteran status. + • Veterans have increased strength in combat. diff --git a/freeciv-web/src/main/java/org/freeciv/persistence/DbManager.java b/freeciv-web/src/main/java/org/freeciv/persistence/DbManager.java index 448b0fbbb..2d0c3d7aa 100644 --- a/freeciv-web/src/main/java/org/freeciv/persistence/DbManager.java +++ b/freeciv-web/src/main/java/org/freeciv/persistence/DbManager.java @@ -22,7 +22,7 @@ public static String getQueryCountServersByHost() { } public static String getQuerySaltHash() { - return " SELECT secure_hashed_password FROM auth " // + return " SELECT secure_hashed_password,digest_pw FROM auth " // + " WHERE LOWER(username) = LOWER(?) AND activated = '1' " // + " LIMIT 1 "; } @@ -148,8 +148,8 @@ public static StringBuilder getQueryUpdateServers(boolean serverExists, List. + *******************************************************************************/ +package org.freeciv.servlet; + +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import javax.servlet.RequestDispatcher; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.freeciv.services.Statistics; +import org.json.JSONArray; +import org.json.JSONObject; + +/** + * Hall Of Fame list + * + * URL: /hall_of_fame + */ +public class PrivacyPolicy extends HttpServlet { + + private static final long serialVersionUID = 1L; + + @Override + public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + + RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/jsp/game/privacy.jsp"); + rd.forward(request, response); + } + +} \ No newline at end of file diff --git a/freeciv-web/src/main/java/org/freeciv/servlet/TokenSignin.java b/freeciv-web/src/main/java/org/freeciv/servlet/TokenSignin.java index 56dbd7eeb..eac6e9f6f 100644 --- a/freeciv-web/src/main/java/org/freeciv/servlet/TokenSignin.java +++ b/freeciv-web/src/main/java/org/freeciv/servlet/TokenSignin.java @@ -53,9 +53,7 @@ public class TokenSignin extends HttpServlet { private static final long serialVersionUID = 1L; private static final JacksonFactory jacksonFactory = new JacksonFactory(); - private String google_signin_key; - - public void init(ServletConfig config) throws ServletException { + private String google_signin_key;public void init(ServletConfig config) throws ServletException { super.init(config); try { @@ -67,6 +65,8 @@ public void init(ServletConfig config) throws ServletException { } } + + public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { diff --git a/freeciv-web/src/main/resources/db/migration/V1_15__add_google_ip_log.sql b/freeciv-web/src/main/resources/db/migration/V1_15__add_google_ip_log.sql new file mode 100644 index 000000000..bf5874bb9 --- /dev/null +++ b/freeciv-web/src/main/resources/db/migration/V1_15__add_google_ip_log.sql @@ -0,0 +1,7 @@ +create table google_ip_log( + `id` int(11) NOT NULL AUTO_INCREMENT, + `username` varchar(32) NOT NULL, + `ip_list` JSON NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `username` (`username`) +); \ No newline at end of file diff --git a/freeciv-web/src/main/resources/db/migration/V1_16__encrypt_mode.sql b/freeciv-web/src/main/resources/db/migration/V1_16__encrypt_mode.sql new file mode 100644 index 000000000..6bf8e123d --- /dev/null +++ b/freeciv-web/src/main/resources/db/migration/V1_16__encrypt_mode.sql @@ -0,0 +1,2 @@ +alter table auth add column `digest_pw` BOOLEAN; +update auth set digest_pw = FALSE; \ No newline at end of file diff --git a/freeciv-web/src/main/resources/log4j.properties b/freeciv-web/src/main/resources/log4j.properties deleted file mode 100644 index 65010ea41..000000000 --- a/freeciv-web/src/main/resources/log4j.properties +++ /dev/null @@ -1,15 +0,0 @@ -log4j.rootLogger = DEBUG, stdout - -log4j.category.com.opensymphony.sitemesh=DEBUG -log4j.category.org.apache.struts2=INFO -log4j.category.org.apache=INFO -log4j.category.catalia=INFO - -log4j.appender.stdout = org.apache.log4j.ConsoleAppender -log4j.appender.stdout.Threshold = DEBUG -log4j.appender.stdout.Target = System.out -log4j.appender.stdout.layout = org.apache.log4j.PatternLayout -log4j.appender.stdout.layout.ConversionPattern = %d{ISO8601} %-5p [%F:%L] : %m%n - - - diff --git a/freeciv-web/src/main/webapp/WEB-INF/jsp/errors/404.jsp b/freeciv-web/src/main/webapp/WEB-INF/jsp/errors/404.jsp index 7509e64e4..aaa0aaf5f 100644 --- a/freeciv-web/src/main/webapp/WEB-INF/jsp/errors/404.jsp +++ b/freeciv-web/src/main/webapp/WEB-INF/jsp/errors/404.jsp @@ -6,11 +6,12 @@
<%@include file="/WEB-INF/jsp/fragments/header.jsp"%> -

Welcome to Freeciv-web, but wait...

+

Whoops, looks like this TnT page went boom..

-

The page you are looking for is missing. (Error: 404 file missing error)

+

The page you are looking for is missing. (Error: 404 Error File Missing)

Please continue to the main page

+

If you got here by trying to use a longturn bookmark, rejoin at the games list.

<%@include file="/WEB-INF/jsp/fragments/footer.jsp"%>
- \ No newline at end of file + diff --git a/freeciv-web/src/main/webapp/WEB-INF/jsp/fragments/footer.jsp b/freeciv-web/src/main/webapp/WEB-INF/jsp/fragments/footer.jsp index a7b654b4d..98c0bcaf7 100644 --- a/freeciv-web/src/main/webapp/WEB-INF/jsp/fragments/footer.jsp +++ b/freeciv-web/src/main/webapp/WEB-INF/jsp/fragments/footer.jsp @@ -2,6 +2,6 @@

© 2013-. . - You may play at Freeciv-Web if you consent to the Terms of Service. + You may access Freeciv-Web if you consent to the Terms of Service. FCW Privacy Policy.

diff --git a/freeciv-web/src/main/webapp/WEB-INF/jsp/fragments/head.jsp b/freeciv-web/src/main/webapp/WEB-INF/jsp/fragments/head.jsp index bb3c1ce90..6061405e3 100644 --- a/freeciv-web/src/main/webapp/WEB-INF/jsp/fragments/head.jsp +++ b/freeciv-web/src/main/webapp/WEB-INF/jsp/fragments/head.jsp @@ -2,182 +2,186 @@ <%@ page import="java.util.Properties" %> <%@ page import="java.io.IOException" %> <% - String gaTrackingId = null; - String trackJsToken = null; - try { - Properties prop = new Properties(); - prop.load(getServletContext().getResourceAsStream("/WEB-INF/config.properties")); - gaTrackingId = stripToNull(prop.getProperty("ga-tracking-id")); - trackJsToken = stripToNull(prop.getProperty("trackjs-token")); - } catch (IOException e) { - e.printStackTrace(); - } + String gaTrackingId = null; + String trackJsToken = null; + try { + Properties prop = new Properties(); + prop.load(getServletContext().getResourceAsStream("/WEB-INF/config.properties")); + gaTrackingId = stripToNull(prop.getProperty("ga-tracking-id")); + trackJsToken = stripToNull(prop.getProperty("trackjs-token")); + } catch (IOException e) { + e.printStackTrace(); + } %> -${empty title ? "Freeciv-web - open source turn-based strategy game" : title} +${empty title ? "Tactics & Triumph - Freeciv Games & Mods" : title} - - + + - + - + - + -<% if (gaTrackingId != null) { %> - -<% } %> <% if (trackJsToken != null) { %> - + <% } %> diff --git a/freeciv-web/src/main/webapp/WEB-INF/jsp/fragments/header.jsp b/freeciv-web/src/main/webapp/WEB-INF/jsp/fragments/header.jsp index 1c1a613ce..9960bab35 100644 --- a/freeciv-web/src/main/webapp/WEB-INF/jsp/fragments/header.jsp +++ b/freeciv-web/src/main/webapp/WEB-INF/jsp/fragments/header.jsp @@ -10,30 +10,29 @@ - Freeciv-web + Freeciv TnT
Veteran levelPower factorPromotion oddsMove bonus
chosen one125%0% -
- - - - - - - - - - - - - - - - - - - - -
VersionPatchesCapabilitiesStateRulesetServer ID
${version}${patches}${capability}${state}${ruleset}${serverid}
-
-
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - -
FlagLeaderNationType
- - ${player.flag} - - ${player.name}${player.nation}${player.type}
-
-
- - No players - -
-
- - -
-
- - - Scores:


Settings:
- -
-
-
- - -
-
- -
- - - - - - - - - - - - - - - -
NameValue
${variable.name} ${variable.value}
-
-
-
-
- - - Cannot find the specified server - - Return to game list -
- - - - - <%@include file="/WEB-INF/jsp/fragments/footer.jsp"%> -
- +<%@include file="/WEB-INF/jsp/fragments/header.jsp" %> + + +
+
+ + +
+

Freeciv-web server id: ${port}

+ + ${message} + +
+ +
+
+ + +
+ + Join You can join this game now. +
+
+ +
+ + Join/Observe You can observe this game now. +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + +
VersionPatchesCapabilitiesStateRulesetServer ID
${version}${patches}${capability}${state}${ruleset}${serverid}
+
+
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
FlagLeaderNationType
+ + ${player.flag} + + ${player.name}${player.nation}${player.type}
+
+
+ + No players + +
+
+ + +
+
+ + + Scores: +
+

Settings:
+ +
+
+
+ + +
+
+ +
+ + + + + + + + + + + + + + + +
NameValue
${variable.name} ${variable.value}
+
+
+
+
+
+ + Cannot find the specified server + + Return to game list +
+ + + + <%@include file="/WEB-INF/jsp/fragments/footer.jsp" %> +
diff --git a/freeciv-web/src/main/webapp/WEB-INF/jsp/game/hall_of_fame.jsp b/freeciv-web/src/main/webapp/WEB-INF/jsp/game/hall_of_fame.jsp index 73779aed6..c6825fabc 100644 --- a/freeciv-web/src/main/webapp/WEB-INF/jsp/game/hall_of_fame.jsp +++ b/freeciv-web/src/main/webapp/WEB-INF/jsp/game/hall_of_fame.jsp @@ -1,146 +1,133 @@ -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> -<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> -<%@ taglib prefix = "fmt" uri = "http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> -<%@ include file="/WEB-INF/jsp/fragments/i18n.jsp"%> +<%@ include file="/WEB-INF/jsp/fragments/i18n.jsp" %> -<%@include file="/WEB-INF/jsp/fragments/head.jsp"%> - - - - - - + - <%@include file="/WEB-INF/jsp/fragments/header.jsp" %> - - -
- -
-
- -

Hall Of Fame

- These are the greatest players of Freeciv-web! Each row shows the result of one game. -
- - - - - - - - - - - - - - - - - - - - - - - - -
Rank:Name:Nation:End turn:End date:Score (all):Score:Map:
- .gif"> - .gif" width="70" height="40"> - -
-


-
-
- - - - <%@include file="/WEB-INF/jsp/fragments/footer.jsp"%> -
+<%@include file="/WEB-INF/jsp/fragments/header.jsp" %> + + +
+ +
+
+ +

Hall Of Fame

+ These are the greatest players of Freeciv-web! Each row shows the result of one game. +
+ + + + + + + + + + + + + + + + + + + + + + + + +
Rank:Name:Nation:End turn:End date:Score (all):Score:Map:
+ .gif"> + .gif" width="70" height="40"> + +
+


+
+
+ + + + <%@include file="/WEB-INF/jsp/fragments/footer.jsp" %> +
diff --git a/freeciv-web/src/main/webapp/WEB-INF/jsp/game/list.jsp b/freeciv-web/src/main/webapp/WEB-INF/jsp/game/list.jsp index 068eff6a6..447d73ddb 100644 --- a/freeciv-web/src/main/webapp/WEB-INF/jsp/game/list.jsp +++ b/freeciv-web/src/main/webapp/WEB-INF/jsp/game/list.jsp @@ -1,462 +1,504 @@ -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> -<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> -<%@ include file="/WEB-INF/jsp/fragments/i18n.jsp"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ include file="/WEB-INF/jsp/fragments/i18n.jsp" %> -<%@include file="/WEB-INF/jsp/fragments/head.jsp"%> - - - - - - - + <%@include file="/WEB-INF/jsp/fragments/head.jsp" %> + + + + + + + + - <%@include file="/WEB-INF/jsp/fragments/header.jsp" %> - - -
-
- - - -
-
- - - - - - - - - - - - - - - - - - - - - - -
FlagPlayerAction
- - ${game.flag} - - ${game.player}Observe - Info -
-
- - Start a new single player game! - -
- -
- - - - - - - - - - - - - - - - - - -
Game TitleStateAction
${game.message}${game.state} - - Play - - - Play - - Observe - - - - Info -
-
- - No servers currently listed - -
- -
- - - - - - - - - - - - - - - - - - -
Game Info
Late-join bonus gold ensures FAIR-START™ in the first 10 turns.
TurnAction
- - ${game.message} - - - ${game.message} - - - - ${game.turn} - - - ${game.turn} - - - - Play - - - Play - - Observe - - - - Info -
-
- - No servers currently listed - -
- -
-
-
-

- A Play-By-Email game is a deathmatch on a small map with up to 4 human players, playing - with alternating turns, and players get an e-mail every time it is - their turn to play. These games are often played over a long time - period, each player has 7 days to complete their turn. -

-

- To start a new Play-By-Email game, - log in here. To play your turn - in a running Play-By-Email game, click on the link in the last - e-mail you got from Freeciv-web. Games are expired after 7 days if - you don't play your turn. -

-
-
- -
-
-

Ongoing games

- - - - - - - -
PlayersTime left
-

Current player is marked in bold underline.

-
-
- -
-
-

Finished games

- - - - - - - - - - - - - - - -
WinnerGame DatePlayer 1Player 2
${game.winner}${game.endDate}${game.playerOne} (W: ${game.winsByPlayerOne})${game.playerTwo} (W: ${game.winsByPlayerTwo})
-
-
-
-
-
- - <%@include file="/WEB-INF/jsp/fragments/footer.jsp"%> -
+<%@include file="/WEB-INF/jsp/fragments/header.jsp" %> + + +
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
FlagPlayerAction
+ + ${game.flag} + + ${game.player}Observe + Info +
+
+ + Start a new single player game! + +
+ +
+ + + + + + + + + + + + + + + + + + +
Game TitleStateAction
${game.message}${game.state} + + Play + + + Play + + Observe + + + + Info +
+
+ + No servers currently listed + +
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Game Info
Late-join bonus gold and bulbs ensure FAIR-START™ in the first 10 turns. +
TurnAction
+ + ${game.message} + + + ${game.message} + + + + ${game.turn} + + + ${game.turn} + + + + Play + + + Play + + Observe + + + + Info +
+
+ + No servers currently listed + +
+ +
+
+
+

+ A Play-By-Email game is a deathmatch on a small map with up to 4 human players, playing + with alternating turns, and players get an e-mail every time it is + their turn to play. These games are often played over a long time + period, each player has 7 days to complete their turn. +

+

+ To start a new Play-By-Email game, + log in here. To play your turn + in a running Play-By-Email game, click on the link in the last + e-mail you got from Freeciv-web. Games are expired after 7 days if + you don't play your turn. +

+
+
+ +
+
+

Ongoing games

+ + + + + + + +
PlayersTime left
+

Current player is marked in bold underline.

+
+
+ +
+
+

Finished games

+ + + + + + + + + + + + + + + +
WinnerGame DatePlayer 1Player 2
${game.winner}${game.endDate}${game.playerOne} (W: ${game.winsByPlayerOne})${game.playerTwo} (W: ${game.winsByPlayerTwo})
+
+
+
+
+
+ + <%@include file="/WEB-INF/jsp/fragments/footer.jsp" %> +
+ + diff --git a/freeciv-web/src/main/webapp/WEB-INF/jsp/game/privacy.jsp b/freeciv-web/src/main/webapp/WEB-INF/jsp/game/privacy.jsp new file mode 100644 index 000000000..864552a53 --- /dev/null +++ b/freeciv-web/src/main/webapp/WEB-INF/jsp/game/privacy.jsp @@ -0,0 +1,197 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + +<%@ include file="/WEB-INF/jsp/fragments/i18n.jsp" %> + + + + <%@include file="/WEB-INF/jsp/fragments/head.jsp" %> + + + + + + + + + +<%@include file="/WEB-INF/jsp/fragments/header.jsp" %> + + +
+ +
+

FCW Privacy Policy

+

Preferred Privacy Protection Site

+

FCW is a private gaming community and a private gathering.


+ +
+ Freeciv-Web ("FCW") is a preferred privacy protection site. That is,
+ 1) the data we collect is used only to deliver services the best we can,
+ 2) your data is not shared with third parties,
+ 3) we maintain strict privacy protection policies in our Terms of + Service and code of conduct to ensure our users don't violate + each other's privacy.
+
+
+
+ What information does FCW create or collect?
+ Computers by their nature create information during digital interactions. Information is created:
+ 1. When you register on our site, the information you used to register with.
+ 2. If you register on our Discord, the information and messages that are created in those acts.
+ 3. If you register on our mailing list, the information you submit to that list.
+ 4. Any data that is created in the act of you playing the game.
+
+
+
+ What information is used or reviewed?
+ 1. We review data when you participate in the Discord or participate on our site creating content there.
+ 2. When registering on our site, you may be asked to enter an e-mail address and username.
+ 3. Your e-mail address may be verified by Google for use of the website, Discord for use of our discord group, + and/or verified using a unique consent link. If a link is visited, it would be used to verify that you control the + e-mail address, and/or that your IP address is not affiliated with malicious sources.
+ 4. We may retain server logs which include the IP address of every request to our server.
+
+
+
+ What do we use your information for?
+ Any of the information we collect from you may be used in one of the following ways:
+ 1. To enable the delivery of our services.
+ 2. To improve our site and user experiences - Information and feedback supplied by users may be used to improve + the site experience.
+ 3. To send emails - PBEM games email you when it's your turn. If you subscribe, the Longturn Notification system + notifies you of upcoming games.
+ 4. Site security - Server logs may be used in conventional server security operations, identifying and preventing + malicious sources.
+
+
+
+ How do we protect your privacy and/or information?
+ We implement security measures to maintain the privacy and safety of your personal information.
+
+
+
+ What is your data retention policy?
+ We make a good faith effort to:
+ 1. Retain server logs containing the IP address of all requests.
+ 2. Retain the IP addresses associated with registered users and their posts no more than 5 years.
+
+
+
+ Does FCW use cookies? If so, what kind?
+ 1. FCW does not use marketing, advertising, or commercial cookies.
+ 2. FCW does not use reporting/tracking cookies that communicate with our server or third party servers.
+ 3. FCW uses User Convenience Cookies.
+ What is a 'User Convenience Cookie?'
+ User convenience cookies may remember your personal setup preferences you may submit for graphic display options, + game preferences, and suchlike.
+ They may remember your username and password and store it locally in your browser, so that you do not have to + re-enter this information when re-visiting the site.
+ User convenience cookies are not shared with any third parties and are not stored or accessed on our server. They + are only used by your browser to fill in information you have indicated you would like your browser to remember, + when interacting with our site.
+
+
+
+ Does FCW disclose any information to outside parties?
+ 1. FCW enforces policies against users supplying any information or communications you share within our sphere of + services, to outside parties.
+ 2. We do not sell, trade, or otherwise transfer to outside parties your personally identifiable information.
+ 3. This does not include trusted third parties whose services integrate to our site for the purpose of operating + our site, conducting our business, or servicing you, so long as the policies of those parties do not violate our + own privacy policies.
+ 4. For example, your email address is used during Google_Auth logins that use your gmail account.
+ 5. We may use or release information when we believe that is appropriate to comply with the law, enforce our site + policies, or protect ours or others rights, property, or safety.
+ 6. However, non-personally identifiable visitor information will not be provided to other parties for marketing or + advertising, without your explicit consent.
+
+
+
+ Third party links
+ Occasionally, at our discretion, we may include or offer third party products or services on our site. These third + party sites have separate and independent privacy policies. We therefore have no responsibility or liability for + the content and activities of these linked sites. Nonetheless, we seek to protect the integrity of our site and + welcome any feedback about these sites.
+
+
+
+ Children's Online Privacy Protection Act Compliance
+ Our site, products and services are all directed to people who are at least 13 years old or older. If you are + under the age of 13, per the requirements of COPPA (Children's Online Privacy Protection Act), do not use this + site without parental supervision.
+
+
+
+ Online Privacy Policy Only
+ This online privacy policy applies only to information collected through our site and services and not to + information collected outside of such.
+
+
+
+ Your Consent
+ By using our site and other services, you consent to our service-wide Privacy Policy and Terms of Service.
+
+
+
+ User Privacy Obligations
+ Community members (Users) who partake in the private gathering of FCW are bound by the Terms of Service which + contain restrictions on what actions users may take with respect to each other's privacy.
+ Please review the Terms of Service for further information on user privacy obligations.
+
+
+
+ Changes to our Privacy Policy
+ If we decide to change our privacy policy, we will post those changes on this page.
+
+


+ + <%@include file="/WEB-INF/jsp/fragments/footer.jsp" %> +
+
+ + diff --git a/freeciv-web/src/main/webapp/WEB-INF/jsp/game/rules.jsp b/freeciv-web/src/main/webapp/WEB-INF/jsp/game/rules.jsp index 20174daf9..d662ca638 100644 --- a/freeciv-web/src/main/webapp/WEB-INF/jsp/game/rules.jsp +++ b/freeciv-web/src/main/webapp/WEB-INF/jsp/game/rules.jsp @@ -1,83 +1,64 @@ -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> -<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> -<%@ taglib prefix = "fmt" uri = "http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> -<%@ include file="/WEB-INF/jsp/fragments/i18n.jsp"%> +<%@ include file="/WEB-INF/jsp/fragments/i18n.jsp" %> -<%@include file="/WEB-INF/jsp/fragments/head.jsp"%> + <%@include file="/WEB-INF/jsp/fragments/head.jsp" %> - - - - - + .input-group .form-control:first-child { + background: #000; + color: #ccc; + border-color: #444; + border-radius: 6px 0 0 6px; + } + + .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group { + background: #444; + color: #000; + border-color: #444; + text-shadow: 1px 1px #888; + } + + .navbar-inverse { + background: #2220 url(/images/bg-med-dark.jpg); + } + + a { + text-shadow: 1px 1px #000; + } + + h1, h2, h3, h4, h5, h6 { + font-family: Cinzel, 'Segoe UI', serif; + text-shadow: 1px 1px #222; + } + + body { + color: #ccc; + background-image: url('/images/bg-dark.jpg'); + } + + .container { + background: none !important; + color: #ccc; + } + - <%@include file="/WEB-INF/jsp/fragments/header.jsp" %> +<%@include file="/WEB-INF/jsp/fragments/header.jsp" %>
@@ -85,84 +66,139 @@

Community Rules, Game Rules. and Terms of Service

General Rules for Site, Server, and Discord

- FCW is a private gaming community. By playing in it, you accept membership in the commmunity and represent that you will abide by the following rules:
+ FCW is a private gaming community. By playing in it, you accept membership in the commmunity and represent that + you will abide by the following rules:
- 1. Be polite.
- 2. Don't cheat.
- 3. Keep in-game conflicts in-the-game.
- 4. No abuse, spam, harrassment.
- 5. Don't promote, spam, recruit, or link to other servers and sites.
- 6. Compare or politick against servers or sites somewhere else.
- 7. Constructive ideas are welcome. Directly or indirectly disparaging the site or its members is not.
- 8. Do religious or political discussions somewhere else.
- 9. Private DMs require FCW Discord or FCW Game Server to bridge them and thus fall under these rules.
- 10. FCW is a private gathering and not a public square. Keep speech and conduct appropriate.
-
- Clarification: -
-
- 1. Be polite: This is rule #1 for a reason. We take it very seriously. It covers a lot but is easy enough to follow: be nice. You cannot politely harrass, threaten, DOX, copy-paste someone's content off-site without permission, violate privacy, etc. If you're not sure, ask.
- 2.1. No multi-accounts.
- 2.2. Browser hacking, console hacking, packet hacking, server hacking, and any other form of hacking is 100% considered as cheating.
- 2.3. Information, actions, or access not commonly available through normal use of the game's interface is competitive inequality. At Freeciv-web this is considered cheating without exception.
- 3. Keep in-game conflicts in-the-game.
- 3.1 Remember, your enemy may be your ally in a future game.
- 3.2. You may role play impolite hostility in-game if you represent yourself as your country's fictional leader and do the same for the person you are speaking about. e.g. "The Oldenburgian nation are lying warmongers and cannot be trusted" is acceptable.
- 4. No abuse, spam, harrassment. This includes but is not limited to, using another person or "bot" as the agent for violating any site rules.
- 4.1 Offsite links are almost always spam. Within reason, preserve the game entertainment ambience by keeping in-game chat relative to the in-game play of your player-nation.
- 4.2 Dominating a community discussion in Discord by simply posting many more messages than anyone is also bad form, let others give their views.
- 5. FCW is not the appropriate forum for publicly or privately promoting, recruiting, or poaching to other servers or sites. Ask admin permission.
- 6. FCW is not the appropriate forum for comparison or politicking for or against servers or sites.
- 7. All constructive ideas and contributions are welcome. Politicking against the site or its members can be freely done in locations other than FCW.
- 8. Religious and political discussions are encouraged in locations other than FCW. Such discussions may be deleted from FCW.
- 9. Private DMs must abide by community rules when those DMs were bridged by mutual belonging to FCW Discord or the FCW Game Server which make those communications possible. Private complaints about DMs to other members will be treated the same as if they had been made in public, if those DMs were bridged or conveyed by a FCW server.
- 10. FCW is not a public square with guaranteed free speech. It is more like a friend's house party where you are expected to be nice and enjoy the offerings. We reserve the right to remove posts and ensure posted material is not potentially harmful. As supporters of freedom of speech in general, we exercise these rights carefully with an administrator audit trail and try to mamimize the good spirits of the house party.
+ 1. Be polite.
+ 2. Don't cheat.
+ 3. Keep in-game conflicts in-the-game.
+ 4. No abuse, spam, harrassment, doxxing, personal threats.
+ 5. Don't promote, spam, recruit, or link to other servers and sites.
+ 6. Compare or politick against servers or sites somewhere else.
+ 7. Constructive ideas are welcome. Directly or indirectly disparaging the site or its members is not.
+ 8. Do religious or political discussions somewhere else.
+ 9. Private DMs require FCW Discord or FCW Game Server to bridge them and thus fall under these rules.
+ 10. FCW is a private gathering and not a public square. Keep speech and conduct appropriate.
+ 11. Information, communications, and content that take place within the FCW private gathering may not be shared or + distributed offsite without permission. +
+ Clarification: +
+
+ 1. Be polite: This is rule #1 for a reason. We take it very seriously. It covers a lot but is easy enough to + follow: be nice. You cannot politely harrass, threaten, DOX, copy-paste someone's content off-site without + permission, violate privacy, etc. If you're not sure, ask.
+ 2.1. No multi-accounts.
+ 2.2. Browser hacking, console hacking, packet hacking, server hacking, and any other form of hacking is 100% + considered as cheating.
+ 2.3. Information, actions, or access not commonly available through normal use of the game's interface is + competitive inequality. At Freeciv-web this is considered cheating without exception.
+ 3. Keep in-game conflicts in-the-game.
+ 3.1 Remember, your enemy may be your ally in a future game.
+ 3.2. You may role play impolite hostility in-game if you represent yourself as your country's fictional leader and + do the same for the person you are speaking about. e.g. "The Oldenburgian nation are lying warmongers and cannot + be trusted" is acceptable.
+ 4. No abuse, spam, harrassment. This includes but is not limited to, using another person or "bot" as the agent + for violating any site rules.
+ 4.1 Offsite links are almost always spam. Within reason, preserve the game entertainment ambience by keeping + in-game chat relative to the in-game play of your player-nation.
+ 4.2 Dominating a community discussion in Discord by simply posting many more messages than anyone is also bad + form, let others give their views.
+ 5. FCW is not the appropriate forum for publicly or privately promoting, recruiting, or poaching to other servers + or sites. Ask admin permission.
+ 6. FCW is not the appropriate forum for comparison or politicking for or against servers or sites.
+ 7. All constructive ideas and contributions are welcome. Politicking against the site or its members can be freely + done in locations other than FCW.
+ 8. Religious and political discussions are encouraged in locations other than FCW. Such discussions may be deleted + from FCW.
+ 9. Private DMs must abide by community rules when those DMs were bridged by mutual belonging to FCW Discord or the + FCW Game Server which make those communications possible. Private complaints about DMs to other members will be + treated the same as if they had been made in public, if those DMs were bridged or conveyed by a FCW server.
+ 10. FCW is not a public square with guaranteed free speech. It is more like a friend's house party where you are + expected to be nice and enjoy the offerings. We reserve the right to remove posts and ensure posted material is + not potentially harmful. As supporters of freedom of speech in general, we exercise these rights carefully with an + administrator audit trail and try to mamimize the good spirits of the house party.
+ 11. What happens at FCW stays at FCW: FCW is a private party gathering, our strict Privacy Policy represents to + our users that what they do at FCW takes place in a private gathering on a Preferred Privacy Protection site. + Users need not react to, nor concern themselves about distribution of their information or communications outside + of the FCW services. Do not screenshot, copy-paste, relay, report, journalize, log, transliterate, translate, or + otherwise convey information, communications, or any form of Private Identity Data, within the FCW services to + anywhere outside the FCW privacy sphere, without first obtaining permission. Violation of this policy means you + are no longer deemed to be an authorized user of our site. Private Identity Data includes but is not limited to + real name, address, location, nationality, telephone or digital contact information, and so on.
+ 11a. General sharing permission is already granted by default, for game experiences available from the perspective + of the nation you play in any game, and any message you make that does not interact with or imply or help infer, + another user's private content.

In-game Rules

- 11. Idle players may lose their nation.
- 12. You may request account deletion at any time.
- 13. Delegation should be a last resort, should not last too long, nor happen too frequently.
- 14. Victory conditions are set by the Gamemaster (GM) at the start.
- 14a. Don't declare victory for anyone but yourself. Your surrender is not a surrender for everyone else.
- 15. Customary practices which are not rules, but are generally accepted:
- 15.1 Turn length extension in the late game
- 15.2 Game settings error correction in the early game (at gamesmaster discretion)
- 15.3 Sharing of screenshots and story lines at the conclusion of a game
- 15.4 Victory conditions, unless specified to be different by game master before game start, are:
- 15.4a A player, or an alliance, kills all other players, or all other players surrender
- 15.4b If space race is on, a player lands on alpha centauri
- 15.4c A player, or group of players make a statement about how the game should end, that goes uncontested for 72 hours (or two turns, whichever is longer)
- 16. Allow players to take their turns in peace
- 16.1 No camping. No RTS (when requested)
-
- Clarification: -
+ 11. Idle players may lose their nation.
+ 12. You may request account deletion at any time.
+ 13. Delegation should be a last resort, should not last too long, nor happen too frequently.
+ 14. Victory conditions are set by the Gamemaster (GM) at the start.
+ 14a. Don't declare victory for anyone but yourself. Your surrender is not a surrender for everyone else.
+ 15. Customary practices which are not rules, but are generally accepted:
+ 15.1 Turn length extension in the late game
+ 15.2 Game settings error correction in the early game (at gamesmaster discretion)
+ 15.3 Sharing of screenshots and story lines at the conclusion of a game
+ 15.4 Victory conditions, unless specified to be different by game master before game start, are:
+ 15.4a A player, or an alliance, kills all other players, or all other players surrender
+ 15.4b If space race is on, a player lands on alpha centauri
+ 15.4c A player, or group of players make a statement about how the game should end, that goes uncontested for 72 + hours (or two turns, whichever is longer)
+ 16. Allow players to take their turns in peace
+ 16.1 No camping. No RTS (when requested)
+
+ Clarification: +
- 11. Idle players can lose their nations on: turns 1-13: idle 3 turns; turns 14,15,16: idle 4,5,6 turns; turns 17,18,19: 7,8,9 turns. turn 20 onward: 10 turns.
- 12. Players are allowed to ask for account deletion to change their name, to prevent the same feuds and alliances in every game or for other data protection reasons.
- 13. Delegation should be a last resort, should not last too long, nor happen too frequently. GM will arbitrate complaints.
- 13.1 One delegation per player is allowed, only if the delegate plans to come back, and only up to a week without special permission
- 13.2 Long-term delegations can be approved by the Gamemaster (GM).
- 13.3 Delegations can't be done before turn 3
- 14. Victory conditions are set by the Gamemaster (GM) at the start. When they are met, the game ends. Unless the GM specified against at the outset, scores are published
- 14a. Players are unaware of all game events. Your alliance may be defeated and feel your surrender means victory for your enemies, but perhaps the opposing alliance is about to splinter or a small nation secretly built a large nuclear arsenal. You may declare victory for yourself or your own alliance only. Surrender does not equate to a victory declaration for others. Do NOT declare someone else's victory.
- 15. Customary practices which are not rules, but are generally expected and accepted:
- 15.1 FCW typically extends turn length in the late game of longturn games. (25h, 35h, 37h, or 47h). This meets the needs of players who have successfully grown large nations. Turn length extension will be decided on a case by case basis by the GM who will make a judgement based on their discretion, after the first active player makes a public request. For example, generally, after turn 100, an extension to 35h turns is common practice.
- 15.2 For obvious settings errors, a Gamemaster (GM) can fix any such settings before T10 provided they do not affect any player and provided the GM fully announces such changes, giving at least 1 turn notice before making the change. Exception: announcing creates an exploit, in which case the GM may elect not to give notice (but must inform those members of the admin council who are non-players in the game.)
- 16. Allow players to take their turns in peace. This includes respecting requests not to RTS. RTS is to be expected at turn change, just prior to turn change, and at unitwaittime before and after turn change. All other times, RTS is not allowed if a player requests to take their turn in peace.
- 16.1 No camping. A player should not be online for most the day. Remaining online all day is unfair to everyone else.
- 16.1a Rule 16.1 is relaxed after turn 100 in games or upon discovery of Flight (whichever comes sooner), until a fix for large nations is in place. Gamemaster discretion is final, if players are in dispute.
- 17. Regarding multiple players in the same household or sharing the same device: The Gamemaster for a particular game can approve such cases if asked privately in advance of you joining the game; otherwise it is forbidden. Gamemaster decision will be final, and GM may make special rules for allowing the case like making all players aware of it, or forbidding alliance between the two players.
+ 11. Idle players can lose their nations on: turns 1-13: idle 3 turns; turns 14,15,16: idle 4,5,6 turns; turns + 17,18,19: 7,8,9 turns. turn 20 onward: 10 turns.
+ 12. Players are allowed to ask for account deletion to change their name, to prevent the same feuds and alliances + in every game or for other data protection reasons.
+ 13. Delegation should be a last resort, should not last too long, nor happen too frequently. GM will arbitrate + complaints.
+ 13.1 One delegation per player is allowed, only if the delegate plans to come back, and only up to a week without + special permission
+ 13.2 Long-term delegations can be approved by the Gamemaster (GM).
+ 13.3 Delegations can't be done before turn 3
+ 14. Victory conditions are set by the Gamemaster (GM) at the start. When they are met, the game ends. Unless the + GM specified against at the outset, scores are published
+ 14a. Players are unaware of all game events. Your alliance may be defeated and feel your surrender means victory + for your enemies, but perhaps the opposing alliance is about to splinter or a small nation secretly built a large + nuclear arsenal. You may declare victory for yourself or your own alliance only. Surrender does not equate to a + victory declaration for others. Do NOT declare someone else's victory.
+ 15. Customary practices which are not rules, but are generally expected and accepted:
+ 15.1 FCW typically extends turn length in the late game of longturn games. (25h, 35h, 37h, or 47h). This meets the + needs of players who have successfully grown large nations. Turn length extension will be decided on a case by + case basis by the GM who will make a judgement based on their discretion, after the first active player makes a + public request. For example, generally, after turn 100, an extension to 35h turns is common practice.
+ 15.2 For obvious settings errors, a Gamemaster (GM) can fix any such settings before T10 provided they do not + affect any player and provided the GM fully announces such changes, giving at least 1 turn notice before making + the change. Exception: announcing creates an exploit, in which case the GM may elect not to give notice (but must + inform those members of the admin council who are non-players in the game.)
+ 16. Allow players to take their turns in peace. This includes respecting requests not to RTS. RTS is to be + expected at turn change, just prior to turn change, and at unitwaittime before and after turn change. All other + times, RTS is not allowed if a player requests to take their turn in peace.
+ 16.1 No camping. A player should not be online for most the day. Remaining online all day is unfair to everyone + else.
+ 16.1a Rule 16.1 is relaxed after turn 100 in games or upon discovery of Flight (whichever comes sooner), until a + fix for large nations is in place. Gamemaster discretion is final, if players are in dispute.
+ 17. Regarding multiple players in the same household or sharing the same device: The Gamemaster for a particular + game can approve such cases if asked privately in advance of you joining the game; otherwise it is forbidden. + Gamemaster decision will be final, and GM may make special rules for allowing the case like making all players + aware of it, or forbidding alliance between the two players.
-
- FCW may alter these rules over time. This takes place after admin consultations and such changes will be posted on our Discord #rules channel. -
-
- - <%@include file="/WEB-INF/jsp/fragments/footer.jsp"%> -
+
+ FCW may alter these rules over time. This takes place after admin consultations and such changes will be posted + on our Discord #rules channel. +
+
+ + <%@include file="/WEB-INF/jsp/fragments/footer.jsp" %> +
+
diff --git a/freeciv-web/src/main/webapp/WEB-INF/jsp/game/statistics-details.jsp b/freeciv-web/src/main/webapp/WEB-INF/jsp/game/statistics-details.jsp index 05d7199f4..8168dcf20 100644 --- a/freeciv-web/src/main/webapp/WEB-INF/jsp/game/statistics-details.jsp +++ b/freeciv-web/src/main/webapp/WEB-INF/jsp/game/statistics-details.jsp @@ -1,65 +1,67 @@ -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> -<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> -<%@ include file="/WEB-INF/jsp/fragments/i18n.jsp"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ include file="/WEB-INF/jsp/fragments/i18n.jsp" %> -<%@include file="/WEB-INF/jsp/fragments/head.jsp"%> + <%@include file="/WEB-INF/jsp/fragments/head.jsp" %> - - - - - + + + + + - <%@include file="/WEB-INF/jsp/fragments/header.jsp" %> -
-

Type of games played

-
-
-
-
-
-
-

Shows the number of started new games Freeciv each day in the following categories:

-
    -
  • Freeciv-web singleplayer 2D
  • -
  • Freeciv-web singleplayer 3D WebGL
  • -
  • Freeciv-web multiplayer
  • -
  • Freeciv-web PBEM play-by-email
  • -
  • Freeciv desktop multiplayer: games reported by meta.freeciv.org
  • -
  • Freeciv-web hotseat games
  • -
-
-
-
+<%@include file="/WEB-INF/jsp/fragments/header.jsp" %> +
+

Type of games played

+
+
+
+
+
+
+

Shows the number of started new games Freeciv each day in the following categories:

+
    +
  • Freeciv-web singleplayer 2D
  • +
  • Freeciv-web singleplayer 3D WebGL
  • +
  • Freeciv-web multiplayer
  • +
  • Freeciv-web PBEM play-by-email
  • +
  • Freeciv desktop multiplayer: games reported by meta.freeciv.org
  • +
  • Freeciv-web hotseat games
  • +
+
+
+
- + - - <%@include file="/WEB-INF/jsp/fragments/footer.jsp"%> -
+ + <%@include file="/WEB-INF/jsp/fragments/footer.jsp" %> +
\ No newline at end of file diff --git a/freeciv-web/src/main/webapp/WEB-INF/jsp/index.jsp b/freeciv-web/src/main/webapp/WEB-INF/jsp/index.jsp index 16e040c3c..2b3440c7a 100644 --- a/freeciv-web/src/main/webapp/WEB-INF/jsp/index.jsp +++ b/freeciv-web/src/main/webapp/WEB-INF/jsp/index.jsp @@ -1,510 +1,527 @@ <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> -<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> <%@ include file="/WEB-INF/jsp/fragments/i18n.jsp" %> - <%@include file="/WEB-INF/jsp/fragments/head.jsp"%> - - - + /* Make sure that the development tools used in freeciv are not to big */ + img.small { + max-height: 40px; + } + + /* 2D/3D teasers must remain within their container. */ + img.teaser { + display: block; + margin: auto; + width: 100%; + } + + .statistics { text-align: center; } + + .input-group .form-control:first-child { + background: #0e031a; + color: #598888; + border-color: #344c4d; + border-radius: 6px 0 0 6px; + } + + .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group { + background: #3a6a86; + color: #000; + border-color: #48646c; + text-shadow: 1px 1px rgb(64, 46, 66); + } + + /* Game launcher */ + #game-launcher { + width: 100%; + margin: 0 auto; + font-family: "Arial", "Helvetica", "Open Sans", sans-serif; + } + + #game-launcher .game-type { + width: 100%; + background: url('/images/woodgrey-bg.jpg'); + display: inline-table; + top: 0; + border-radius: 20px 20px 20px 20px; + } + + #game-launcher .game-type:not(:last-child) { + margin-right: 40px; + border: solid 2px #BBA; + border-radius: 20px 20px 20px 20px; + border-bottom-width: 1px; + color: #a8a8a8; + } + + #game-launcher .header { + color: #9d8e5a; + font-family: Cinzel, 'Tahoma', 'Arial', serif; + padding: 15px; + margin-bottom: 0; + background-image: url('/images/bg-odin.jpg'); + background-repeat: repeat; + border: 3px solid #51510c29; + border-radius: 25px 25px 0 0; + border-bottom-width: 1px; + } + + #game-launcher .name { + width: 100%; + font-size: 2em; + display: block; + text-align: center; + padding: 2px 0 2px; + } + + #game-launcher .features { + list-style: none; + text-align: center; + margin: 0; + padding: 10px 0 0 0; + font-size: 0.9em; + } + + #game-launcher .btn { + color: #a8a8a8; + border: 0; + border-radius: 15px 15px 15px 15px; + padding: 10px; + width: 230px; + display: block; + font-weight: 700; + font-size: 20px; + text-transform: uppercase; + margin: 20px auto 10px; + background: #000913d1; + text-shadow: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000; + } + + /* overrides the above */ + #game-launcher .btn { + text-shadow: 1px 1px #000 !important; + color: #9f9665 + } + + #game-launcher a.small { width: 130px; } + + .multiplayer-games th:last-child { width: 80px; } + + .multiplayer-games a.label:first-child { margin-right: 3px; } + + .multiplayer-games .highlight { + color: green; + font-weight: bold; + } + + .table > tbody > tr > td { + padding: 2px; + } + + .videoWrapper { + position: relative; + padding-bottom: 56.25%; /* 16:9 */ + padding-top: 25px; + height: 0; + } + + .videoWrapper iframe { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + } + + .jumbotron { + padding-bottom: 0; + background: #0000 !important; + text-shadow: -2px -2px 20px -50px #08375357, -1px 4px 14px 8px #00000059; + } + + .dropdown-menu { + background-image: url('/images/bg-smooth-mdark.jpg'); + border-radius: 5px; + border: 2px solid #000e; + } + + .dropdown-menu .divider { + height: 1px; + margin: 5px 0; + border: 1px solid #000; + background-color: #000; + } + + .dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #ccc; + white-space: nowrap; + } + + .navbar-inverse { + background: url('/images/unnamedbk-dk.jpg'); + } + + body { + color: #a8a8a8; + background-image: url('/images/bg-alt-dark.jpg'); + } + + .container { + background: none !important; + color: #9d8e5a; + } + + .lead { + color: #9d8e5a + } + + .panel-freeciv { + background-color: #ccc1; + } + + h1, h2, h3, h4, h5, h6 { + font-family: Cinzel, 'Segoe UI', serif; + text-shadow: 1px 1px #222; + } + + .well { + background: #fff1; + } + + a { + text-shadow: 1px 1px #000 !important; + } + + .name { + text-shadow: 2px 1px rgb(0, 0, 0) !important; + } + -
- <%@include file="/WEB-INF/jsp/fragments/header.jsp"%> - -
-
- - - -
-
-
-

- -

-
-
-
- -
- -
-
-
- -
- - -
- Play against the Freeciv AI with 2D HTML5 graphics -
-
- -


- <%-- - -
- Choose your map from a real earth map. -
-
- --%> -
-
-
-
-
- -
- -
- Play a Freeciv-web One Turn per Day, where up to 300 human
players play one turn every day: -
-
- - -
- Start or join a game with multiple human or AI players. -
-
- - -
- Start a play-by-email game where you get an e-mail
when it is your turn to play. -
-
- - -
- Play multiple human players
on the same computer -
-
- - -
-
-
- - - -
-
-
-

0 0
-

- -
-
-
-
- - - -
-
-
-

Multiplayer and One Turn per Day games:

- - - - - - - - - - - - - - - - - - - - - - -
Game nameTurnPlayersActions
- - ${fn:replace(game.message, 'LongTurn', ' One Turn per Day ')} - - - ${game.turn} - - - - None - - - 1 - - - ${game.players} - - - - - - Play - - - Observe - - - Info -
-
- - No servers currently listed. - -
-
- -
-
-

Hall Of Fame

- See the Hall Of Fame, where the best scores of single-player games are listed!
-
-

- - - - - - - - - - - -
RankPlayerWins
-
-
-
- - -
-
-

Find Players and Games to join on Freeciv-Web's live Discord Chat:

-
-
- -
-
-
-
- -
-
-
-
- - <%--
-
-

-
-
-
-
-
- -
-
-
-
- -
-
- - -
--%> - - -
-
-

-
-

- -
- PC Gamer -
-
-
-
- - -
-
-

-
-
-
-
-
-

- Freeciv is open source software released under the GNU General Public License. - and Artists are welcome to join development. -
-
-
-
-

- - - - - - - - - - -
C and C++  Java  Lua 
 JavaScript  HTML5  Python 
Tomcat  MySQL  Ubuntu 
- - - -
-
-
-
-

- - -
-
-
-
- - - <%@include file="/WEB-INF/jsp/fragments/footer.jsp"%> -
- - +
+ <%@include file="/WEB-INF/jsp/fragments/header.jsp" %> + +
+
+ + + +
+
+
+

+ +

+
+
+
+ +
+ +
+
+
+ +
+ + +
+ Play against the Freeciv AI
then try longturn against humans! +
+
+ + +
+ Play multiple human players on the same computer.
Play against yourself or a friend. +
+
+ + +
+
+
+
+
+ +
+ +
+ Play multiplayer one turn per day official longturn games
with up to 100 human + players! negotiate, trade and conquer! +
+
+ + +
+ Start or join custom multiplayer games with human or AI.
When all players log off the game + will close. Save and remake to continue. +
+
+ + +
+ Play the revolutionary Valhalla Calls mod with
arctic terrain, viking units and Norse gods! +
+
+ Valhalla + +
+
+
+ + + +
+
+
+

+
+

+ +
+
+
+ +
+ + +
+
+
+

Official Longturn Games:

+ + + + + + + + + + + + + + + + + + + + + + +
Game nameTurnPlayersActions
+ + ${fn:replace(game.message, 'LongTurn', ' One Turn per Day ')} + + + ${game.turn} + + + + None + + + 1 + + + ${game.players} + + + + + + Play + + + Observe + + + Info +
+
+ + No servers currently listed. + +
+
+ +
+
+

Hall Of Fame

+ See the Hall Of Fame, where the best scores of single-player games are + listed!
+
+

+ + + + + + + + + + + +
RankPlayerWins
+
+
+
+ + + + +
+
+
+
+ +
+
+
+
+ + <%--
+
+

+
+
+
+
+
+ +
+
+
+
+ +
+
+ + +
--%> + + +
+
+

+
+

+ +
+ PC Gamer +
+
+
+
+ + +
+
+

+
+
+
+
+
+

+ Freeciv is open source software released under the GNU General Public License. + and + Artists are welcome to join development. +

Special thanks to friends of the site at freecivweb.org and longturn.net. + for providing code and tech support respectively. Check them out! +
+
+
+
+

+ + + + + + + + + + + + + + + + +
C and C++  Java  Lua 
 JavaScript  HTML5  Python 
Tomcat  MySQL  Ubuntu 
+ + + +
+
+
+
+

+ + +
+
+
+ +
+ + <%@include file="/WEB-INF/jsp/fragments/footer.jsp" %> +
+ + diff --git a/freeciv-web/src/main/webapp/WEB-INF/web.xml b/freeciv-web/src/main/webapp/WEB-INF/web.xml index 2d64393e8..ff14c45ec 100644 --- a/freeciv-web/src/main/webapp/WEB-INF/web.xml +++ b/freeciv-web/src/main/webapp/WEB-INF/web.xml @@ -138,6 +138,18 @@ /rules + + + PrivacyPolicy + org.freeciv.servlet.PrivacyPolicy + + + + PrivacyPolicy + /privacy + + + CivclientLauncher @@ -193,6 +205,17 @@ /token_signin + + + ClientKeyResolver + org.freeciv.servlet.ClientKeyResolver + + + + ClientKeyResolver + /client_key + + ValidateUser diff --git a/freeciv-web/src/main/webapp/css/bluecurve.css b/freeciv-web/src/main/webapp/css/bluecurve.css index 1ed145d1c..46edd7d82 100644 --- a/freeciv-web/src/main/webapp/css/bluecurve.css +++ b/freeciv-web/src/main/webapp/css/bluecurve.css @@ -5,75 +5,74 @@ */ .dynamic-slider-control { - position: relative; - -moz-user-focus: normal; - -moz-user-select: none; - cursor: default; + position: relative; + -moz-user-focus: normal; + -moz-user-select: none; + cursor: default; } .horizontal { - width: 200px; - height: 27px; + width: 200px; + height: 27px; } .vertical { - width: 29px; - height: 200px; + width: 29px; + height: 200px; } .dynamic-slider-control input { - display: none; + display: none; } .dynamic-slider-control .handle { - position: absolute; - font-size: 1px; - overflow: hidden; - -moz-user-select: none; - cursor: default; + position: absolute; + font-size: 1px; + overflow: hidden; + -moz-user-select: none; + cursor: default; } .dynamic-slider-control.horizontal .handle { - width: 23px; - height: 23px; - background-image: url("/images/slider_prod.png"); + width: 23px; + height: 23px; + background-image: url("/images/slider_prod.png"); } .dynamic-slider-control.horizontal .handle div {} + .dynamic-slider-control.horizontal .handle.hover {} .dynamic-slider-control.vertical .handle { - width: 23px; - height: 23px; - background-image: url("/images/slider_prod.png"); + width: 23px; + height: 23px; + background-image: url("/images/slider_prod.png"); } .dynamic-slider-control.vertical .handle.hover {} .dynamic-slider-control .line { - position: absolute; - font-size: 0.01mm; - overflow: hidden; - border: 1px solid rgb(90, 85, 74); - background: rgb(172, 173, 169); - - behavior: url("css/boxsizing.htc"); /* ie path bug */ - box-sizing: content-box; - -moz-box-sizing: content-box; + position: absolute; + font-size: 0.01mm; + overflow: hidden; + border: 1px solid rgb(90, 85, 74); + background: rgb(172, 173, 169); + + box-sizing: content-box; } + .dynamic-slider-control.vertical .line { - width: 3px; + width: 3px; } .dynamic-slider-control.horizontal .line { - height: 3px; + height: 3px; } .dynamic-slider-control .line div { - width: 1px; - height: 1px; - - border: 1px solid; - border-color: rgb(192, 179, 172) rgb(179,180,179) - rgb(189,190,189) rgb(192, 179, 172); + width: 1px; + height: 1px; + + border: 1px solid; + border-color: rgb(192, 179, 172) rgb(179, 180, 179) rgb(189, 190, 189) rgb(192, 179, 172); } diff --git a/freeciv-web/src/main/webapp/css/civclient.css b/freeciv-web/src/main/webapp/css/civclient.css index df6b51e8e..87254d81a 100644 --- a/freeciv-web/src/main/webapp/css/civclient.css +++ b/freeciv-web/src/main/webapp/css/civclient.css @@ -1,3 +1,8 @@ +@font-face { + font-family: Cinzel; + src: url("/fonts/cinzel.variable.woff2") format("woff2"), url("/fonts/cinzel.variable.ttf") format("ttf"); +} + :root { /* Chrome browser family: */ color-scheme: dark; @@ -7,63 +12,68 @@ --contrast_text_color: #000; } -body -{ - margin: 0px; +body { + margin: 0; background: #000000; overflow: hidden; width: 100%; color: var(--default_text_color); } + body, html, div { -/* ***************** Scrollbars *****************/ -/* Firefox scrollbar */ - scrollbar-color: #393812 #000 !important; + /* ***************** Scrollbars *****************/ + /* Firefox scrollbar */ + scrollbar-color: #4d4632 #000 !important; scrollbar-width: thin !important; } + ::-webkit-scrollbar { height: 8px; width: 8px; background: #000; } + ::-webkit-scrollbar-thumb { - background: #393812; -/* -webkit-border-radius:4px; */ + background: #4d4632; + /* -webkit-border-radius:4px; */ -webkit-border-radius: 1ex; - -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.75); + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.75); } -::-webkit-scrollbar-thumb:hover{ - background-color:#42411a; - -webkit-border-radius:4px; + +::-webkit-scrollbar-thumb:hover { + background-color: #42411a; + -webkit-border-radius: 4px; } + ::-webkit-scrollbar-corner { background: #000; } + /************************************************/ -button { - margin: .2em .2em .2em 0; - cursor: pointer; - padding: .2em .6em .3em .6em; - line-height: 1.4em; - width:auto; - overflow:visible; +button { + margin: .2em .2em .2em 0; + cursor: pointer; + padding: .2em .6em .3em .6em; + line-height: 1.4em; + width: auto; + overflow: visible; } .ui-tabs .ui-tabs-panel { - border-width:0; - display:block; - padding:0px; - margin-right:0px; + border-width: 0; + display: block; + padding: 0; + margin-right: 0; color: var(--default_text_color); - font-family: Freeciv; + font-family: Cinzel, serif; } #freeciv_logo { - float:left; + float: left; background-image: url(/images/freeciv-web-logo2.png); - width: 118px; - height: 30px; + width: 118px; + height: 30px; margin-right: 10px; } @@ -79,29 +89,31 @@ button { } .nowrap { - white-space: nowrap ; + white-space: nowrap; } + /* Help Tab >> CONTROLS (Orders buttons, hotkeys) ***************** /* regular text that will be centered in tables */ .vctr { color: var(--default_text_color); } + /* highlights the actual hotkey sequence in different color */ .hotkey { color: #cc8080; - text-shadow:2px 2px #c1183750; + text-shadow: 2px 2px #c1183750; } + .ctrls_tbl tr td { position: relative !important; bottom: 3px !important; } + table.terrain_chart td { border: 1px solid #454d4c; - padding-left: 18px; - padding-right: 18px; - padding-top: 6px; - padding-bottom: 6px; + padding: 6px 18px; } + /******************************************************************/ #game_chat_box { @@ -118,15 +130,15 @@ table.terrain_chart td { flex: 1 1 auto; height: 18px; min-width: 0; - margin: 0 0.3em; + margin: 0 0; border: 1px solid #555555; color: #d0c8c0; background-color: rgba(0, 0, 0, 0.7); - font-family: Consolas; + font-family: "Consolas", monospace; } #overview_map { - cursor:crosshair; + cursor: crosshair; border: none; position: relative; } @@ -145,10 +157,31 @@ table.terrain_chart td { overflow: hidden; } +/*event time stamps*/ +.ts { + color: #d7eeeb; + font-size: 80%; + white-space: nowrap; +} + +.ts::before { + /* content: "⌚"; */ + content: url(/images/e/ts.png); + vertical-align: middle; + padding: 1px; + white-space: nowrap; +} + +/*scrambled unit identifier*/ +.sc { + color: #c1d6fc; + vertical-align: middle; + font-size: 70%; +} + #unit_text_details { - float:left; + float: left; width: 135px; - } #end_game_turn_panel { @@ -162,16 +195,16 @@ table.terrain_chart td { display: inline-block; height: 30px; width: 30px; - visibility:visible; + visibility: visible; } + /* this removes dotted line from appearing around clicked/focused order button */ .order_button > a:focus, .order_button:focus, -.order_button > a > img:focus -{ +.order_button > a > img:focus { outline: none !important; } - + #turn_done_button_div { position: absolute; @@ -182,20 +215,20 @@ table.terrain_chart td { #turn_done_button { float: left; - margin-top: 0px; - padding:7px; + margin-top: 0; + padding: 7px; border-color: #000 !important; } .main_menu_buttons { padding: 1px; - margin: 0px; + margin: 0; } -#freeciv_manual { +#freeciv_manual { color: #ffffff; padding: 10px; - + } .manual-tab { @@ -206,33 +239,35 @@ table.terrain_chart td { /* scrollable but without scrollbars */ .noscrollbars { - overflow-y: scroll; + overflow-y: scroll; overflow-x: scroll; scrollbar-width: none !important; /* Firefox */ } + .noscrollbars::-webkit-scrollbar { /* WebKit */ width: 0; height: 0; } /* no up-down arrows on number inputs */ -input[type=number]::-webkit-inner-spin-button, -input[type=number]::-webkit-outer-spin-button { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - margin: 0; +input[type=number]::-webkit-inner-spin-button, +input[type=number]::-webkit-outer-spin-button { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + margin: 0; } + input[type='number'] { - -moz-appearance:textfield; + -moz-appearance: textfield; } /*warcalc bonus adjusters, small empire tab buttons*/ .tiny_button { padding: 2px; - margin: 0px; + margin: 0; border-radius: 3px 3px 3px 3px; - font-size:85%; + font-size: 85%; background: #444; color: rgb(216, 209, 196); border-color: rgb(111, 111, 111); @@ -243,26 +278,30 @@ input[type='number'] { font-size: 95%; line-height: 110%; margin-top: -2px; - font-family: Segoe; + font-family: "Segoe UI", sans-serif; } + .helptext_pane { max-width: 784px; - font-family: Segoe; + font-family: "Segoe UI", sans-serif; color: #e2e2e2; } + .helptext_pane_mobile { max-width: 984px; } + .unit_desc { color: #9aa; - line-height:115%; - font-size:115%; - font-family:SegoeSB + line-height: 115%; + font-size: 115%; + font-family: "Segoe UI", sans-serif; + font-weight: bolder; } .blue_clickable { - color: #3498DB; - text-decoration:underline; + color: #3498DB; + text-decoration: underline; } /* used for "/" to contrast with numbers which they divide */ @@ -270,25 +309,31 @@ input[type='number'] { color: #f8faff; font-weight: 700; } -.non_priority { /* not all text should be bright-white, if it is less critical or informative */ + +.non_priority { /* not all text should be bright-white, if it is less critical or informative */ color: #d4cfb9; } + .city_dialog_celeb { color: #55cc55; cursor: help; } + .city_dialog_disorder { color: #cc5555; cursor: help; } + .city_dialog_restoring_anarchy { color: #d6a852; cursor: help; } + .city_dialog_celebrate_after_anarchy { color: #99c050; cursor: help; } + .city_dialog_peace { cursor: help; } @@ -296,53 +341,59 @@ input[type='number'] { .hint_of_green { color: #a6f4a6; text-align: right; - padding-top: 0 px; - padding-right: 0 px; + padding-top: 0; + padding-right: 0; max-width: 2em; margin-right: -2px; } + .hint_of_blue { color: #d6d6f1; text-align: right; - padding-top: 0 px; - padding-right: 0 px; + padding-top: 0; + padding-right: 0; max-width: 2em; margin-right: -2px; } + .hint_of_orange { color: #ffecc7; text-align: right; - padding-top: 0 px; - padding-right: 0 px; + padding-top: 0; + padding-right: 0; max-width: 2em; margin-right: -2px; } + .negative_text { color: #d65b52; - padding-top: 0 px; - padding-right: 0 px; + padding-top: 0; + padding-right: 0; max-width: 2em; margin-right: -2px; } + /* reddish because won't produce, but has to differentiate from NOT coming out of disorder next turn */ .restored_anarchy_text { color: #d6a852; - padding-top: 0 px; - padding-right: 0 px; + padding-top: 0; + padding-right: 0; max-width: 2em; margin-right: -2px; } + .food_text { color: #9bff7d; /* adjust city.js city_surplus_color to match */ - padding-top: 0 px; - padding-right: 0 px; + padding-top: 0; + padding-right: 0; max-width: 2em; - margin-right: 0px; + margin-right: 0; text-shadow: 2px 1px #000; } + /* food shield trade: tile output styling for tile info window */ /* shortest length possible because astr_add_line() forces \n at column x */ -.f,.s,.t { +.f, .s, .t { padding-bottom: 1px; border: 1px solid #0003; border-radius: 2px; @@ -351,103 +402,117 @@ input[type='number'] { padding-left: 4px; padding-right: 4px; } + .f { background-color: #00ee01; color: #000; border-style: solid hidden solid solid; } + .s { background-color: #e4e4e4; color: #000; border-style: solid hidden solid solid; } + .t { background-color: #ebde11; color: #000; border-style: solid solid solid solid; } + /*********** KILL ME! After next prod server recompilation of C server * that happens after 14April2021: C server put these classes in the * Tile Info pop-up, but they are now replaced by the above, whose * shorterness avoids forced newline in the middle of tile output text * ********************************************************************/ - .fbt,.sbt,.tbt { +.fbt, .sbt, .tbt { padding-left: 3px; padding-bottom: 1px; border: 1px solid #0003; border-radius: 2px; } + .fbt { background-color: #00ee01; color: #000; border-style: solid hidden solid solid; } + .sbt { background-color: #e4e4e4; color: #000; border-style: solid hidden solid solid !important; } + .tbt { background-color: #ebde11; color: #000; border-style: hidden solid hidden solid !important; padding-right: 3px !important; - border-style: solid solid solid solid; } + /***************************************************** */ .black_shadow { text-shadow: 2px 1px black; } + .negative_food_text { color: #c55c55; /* adjust city.js city_surplus_color to match */ - padding-top: 0 px; - padding-right: 0 px; + padding-top: 0; + padding-right: 0; max-width: 3em; - margin-right: 0px; + margin-right: 0; text-shadow: 2px 1px #000; } + .prod_text { color: #ffffff; - padding-top: 0 px; - padding-right: 0 px; + padding-top: 0; + padding-right: 0; max-width: 2em; - margin-right: 0px; + margin-right: 0; text-shadow: 2px 1px #000; } + .trade_text { color: #fdff7d; - padding-top: 0 px; - padding-right: 0 px; + padding-top: 0; + padding-right: 0; max-width: 2em; - margin-right: 0px; + margin-right: 0; text-shadow: 2px 1px #000; } + .gold_text { - color: #ffd52c; - padding-top: 0 px; - padding-right: 0 px; + color: #ffd52c; + padding-top: 0; + padding-right: 0; max-width: 2em; - margin-right: 0px; + margin-right: 0; text-shadow: 2px 1px #000; } + .lux_text { color: #e2c5ee; - padding-top: 0 px; - padding-right: 0 px; + padding-top: 0; + padding-right: 0; max-width: 2em; - margin-right: 0px; + margin-right: 0; text-shadow: 2px 1px #000; } + .sci_text { color: #98fff3; - padding-top: 0 px; - padding-right: 0 px; + padding-top: 0; + padding-right: 0; max-width: 2em; - margin-right: 0px; + margin-right: 0; text-shadow: 2px 1px #000; } + /* city stats panel, main city dialog (city.js)*/ #city_food, #city_food2, @@ -460,7 +525,7 @@ input[type='number'] { #city_luxury, #city_luxury2, #city_science, -#city_science2, +#city_science2, #city_corruption, #city_pollution, #city_waste, @@ -473,11 +538,13 @@ input[type='number'] { text-align: right; padding-right: 3px; } + /* data column of demographics table */ .dem_table td:nth-of-type(3) { text-align: right; font-weight: bold; } + .dem_table td:nth-of-type(4) { padding-left: 14px; padding-right: 14px; @@ -493,7 +560,7 @@ input[type='number'] { /* numbers align digits in ISO accounting format */ .number_element { text-align: right; - padding-left: 0em; + padding-left: 0; color: #beb38f; } @@ -513,11 +580,11 @@ input[type='number'] { position: absolute; text-align: center; width: 100%; - visibility:hidden; + visibility: hidden; } #city_viewport { -/* background-image: url('/images/bg-med-dark.jpg'); */ + /* background-image: url('/images/bg-med-dark.jpg'); */ overflow: auto; } @@ -529,7 +596,6 @@ input[type='number'] { border: 1px #432 solid; max-height: 100%; overflow: auto; - border-color: #432; } #dialog { @@ -540,23 +606,24 @@ input[type='number'] { /* Research dialog. */ #technologies { clear: left; - position: relative; - overflow: auto; + position: relative; + overflow: auto; width: 100%; background-image: url('/images/bg-dark.jpg'); -} /* theme classes 3 */ +} + +/* theme classes 3 */ #tech_info_box { - float: left; - border: 1px solid rgb(153, 153, 153); + float: left; + border: 1px solid rgb(153, 153, 153); width: 100%; - min-height: 40px; - padding: 4px; - margin: 2px; - margin-left: 0px; - background: url("/images/bg-dark.jpg") repeat scroll 0 0 ; + min-height: 40px; + padding: 4px; + margin: 2px 2px 2px 0; + background: url("/images/bg-dark.jpg") repeat scroll 0 0; color: rgb(226, 226, 226); - font-family: Segoe; + font-family: "Segoe UI", sans-serif; } #tech_goal_box { @@ -565,22 +632,22 @@ input[type='number'] { } #tech_progress_box { - float: left; - padding-left: 80px; + float: left; + padding-left: 80px; width: 280px; } #progress_bg { float: left; - background-color: #bbbbbb40; + background-color: #bbbbbb40; width: 100%; border: 1px solid #ffffff; position: relative; } #progress_fg { - float: left; - width: 60%; + float: left; + width: 60%; background-color: #5582c2; } @@ -590,7 +657,7 @@ input[type='number'] { } #tech_results { - float: left; + float: left; padding-left: 20px; } @@ -610,7 +677,7 @@ input[type='number'] { text-align: center; } -/* Overrides to jquery-ui-1.8.9.custom.css */ +/* Overrides to jquery-ui-1.8.9.custom.css */ .ui-widget-overlay { background: none repeat scroll 0 0 #000000; @@ -626,10 +693,13 @@ input[type='number'] { overflow: hidden; text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black; } + /*!*/ .ui-widget-content { background: url("/images/bg.jpg") repeat scroll 50% 50%; -} /* theme classes 4 */ +} + +/* theme classes 4 */ #game_status_panel_top { float: right; @@ -639,20 +709,22 @@ input[type='number'] { text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black; padding-right: 150px; padding-top: 5px; - font-family: Freeciv; + font-family: Cinzel, serif; } .ui-dialog .ui-dialog-content { position: static; } + #city_canvas_div { border-radius: 6px; } + #city_present_units, #city_supported_units, #city_improvements { float: left; height: 105px; - overflow: auto; - background: url("/images/bg-med-light.jpg") repeat scroll 0 0 ; + overflow: auto; + background: url("/images/bg-med-light.jpg") repeat scroll 0 0; color: var(--contrast_text_color) !important; border: 1px solid #444444; padding: 6px; @@ -661,13 +733,16 @@ input[type='number'] { border-radius: 6px; scrollbar-width: thin; } + #city_improvements { min-width: 280px; overflow-y: hidden; } + #city_improvements_list { margin-top: -5px; } + #city_improvements_title, #city_present_units_title, #city_supported_units_title { font-size: 90%; font-weight: bold; @@ -689,25 +764,25 @@ input[type='number'] { .production_list_item { float: left; - text-align: center; + text-align: center; width: 80px; height: 90px; font-size: 70%; } .production_list_item_sub { - cursor:pointer; - float:left; + cursor: pointer; + float: left; } #unit_info_div { - float:left; + float: left; } #unit_info_image { - cursor:pointer; - float: left; - margin-right: 2px; + cursor: pointer; + float: left; + margin-right: 2px; } #city_production_overview { @@ -716,15 +791,17 @@ input[type='number'] { .ui-widget-header { background: #9e8669 url("/images/ui-widget-header.png") 50% 50% repeat-x; -} /* theme classes 5 */ +} + +/* theme classes 5 */ .ui-dialog .ui-dialog-title { float: none; } #tabs { background-image: url("/images/bg-dark.jpg"); - padding: 0px; - margin: 0px; + padding: 0; + margin: 0; border: none; outline: none; } @@ -732,7 +809,7 @@ input[type='number'] { #tabs_menu { font-size: 0.98em; overflow: hidden; - /* background: #444 url("images/ui-bg_highlight-soft_44_444444_1x100.png") 50% 50% repeat-x; */ + /* background: #444 url("images/ui-bg_highlight-soft_44_444444_1x100.png") 50% 50% repeat-x; */ background: rgb(73, 60, 47) url("/images/ui-widget-header.png") 50% 50% repeat-x; border-color: rgb(73, 60, 47); color: var(--default_text_color); @@ -747,8 +824,8 @@ input[type='number'] { } #rapture_citizen_panel { - margin-top:-20px; - padding-bottom:10px; + margin-top: -20px; + padding-bottom: 10px; display: flex; flex-direction: row-reverse; } @@ -763,14 +840,22 @@ input[type='number'] { font-size: 18px; } +.tablesorter-header { + z-index: 2; +} + .tablesorter-dark { font: 115% sans-serif; - background: url("/images/bg-dark.jpg") repeat scroll 0 0 ; + background: url("/images/bg-dark.jpg") repeat scroll 0 0; color: rgb(223, 223, 223); -} /* theme classes 2 */ +} + +/* theme classes 2 */ .tablesorter-dark thead th { font: 110% sans-serif; + position: sticky; + top: 0; } .tablesorter-dark thead td { @@ -786,22 +871,33 @@ input[type='number'] { } .setting_button { -/* width: 140px; - left blank, let the layout auto-fit: working better -*/ + /* width: 140px; + left blank, let the layout auto-fit: working better + */ } /* makes a button appear as a tab */ .tab_emulator_button { - border-radius: 8px 8px 0px 0px; + border-radius: 8px 8px 0 0; margin-right: -5px; } +#nations_list { + overflow: auto; + height: 99%; +} + #nation_table { cursor: pointer; - padding-bottom: 400px; + padding-bottom: 5px; } +/* +#nation_table thead th { + position: sticky; + top: 0; +}*/ + #nations_button_div { padding-bottom: 15px; clear: left; @@ -835,15 +931,16 @@ input[type='number'] { background-color: #b3b3b3; color: black; } + .tablesorter-dark td { - background-color: inherit; - color: inherit; + background-color: inherit; + color: inherit; } .tablesorter-dark tbody > tr:hover > td, .tablesorter-dark tbody > tr.even:hover > td, .tablesorter-dark tbody > tr.odd:hover > td { - background: inherit; + background: inherit; } .alternate-row-color tr:not(.ui-selected):nth-child(even) { @@ -851,31 +948,38 @@ input[type='number'] { } - .nation_table_body tr td { - padding-left:20px; + padding-left: 20px; } + .nation_row_self { color: lightgreen; } + .nation_row_war { color: #f35f5f; } + .nation_row_ceasefire { - color:#fffabb; + color: #fffabb; } + .nation_row_armistice { - color:#d2ffbd; + color: #d2ffbd; } + .nation_row_peace { - color:#bfe; + color: #bfe; } + .nation_row_alliance { - color:#90adff; + color: #90adff; } + .nation_row_dead { color: #9e9e9e; } + .nation_row_none { color: #d8d8d8; } @@ -900,7 +1004,7 @@ input[type='number'] { } #tech_advance_helptext span { - text-decoration:underline; + text-decoration: underline; cursor: pointer; } @@ -911,7 +1015,7 @@ input[type='number'] { .specific_tech { float: left; - background-color: rgba(2,2,2,0.6); + background-color: rgba(2, 2, 2, 0.6); color: white; border: 1px solid white; padding: 3px; @@ -926,22 +1030,25 @@ input[type='number'] { } #wiki_image { - max-width: 600px; - max-height: 500px; + max-width: 600px; + max-height: 500px; margin: 5px; float: right; } + #help_menu { float: left; background-image: url('/images/bg-dark.jpg'); color: rgb(226, 226, 226); } + #help_info_page { float: left; padding-left: 25px; } + .help_submenu { - max-height: 600px; + max-height: 600px; overflow: auto; min-width: 320px; background-image: url('/images/bg-dark.jpg'); @@ -962,30 +1069,56 @@ input[type='number'] { background-image: url("images/ui-icons_cb672b_256x240.png"); } +/* tech report table */ +.tech_report { + margin: 0; + padding: 0; + border-spacing: 0; +} + +.tech_report td { + text-align: center; + height: 48px; + border: 1px solid #ffc3; + margin: 0; + background-color: #0004; + padding: 0 10px; +} + +.nopad { + padding: 0 !important; +} + /* vet level charts in online manual */ .vet_level { - border-spacing: 12px 0px; + border-spacing: 12px 0; } + table.vet_level td { text-align: center; } + table.vet_level th { color: rgb(192, 206, 206) !important; text-decoration: underline; } + table.vet_level tr:nth-child(3) td { color: #bcdabc; } -table.vet_level tr:nth-child(4) td, -table.vet_level tr:nth-child(5) td, + +table.vet_level tr:nth-child(4) td, +table.vet_level tr:nth-child(5) td, table.vet_level tr:nth-child(6) td { color: #dddd9f; } -table.vet_level tr:nth-child(7) td, -table.vet_level tr:nth-child(8) td, + +table.vet_level tr:nth-child(7) td, +table.vet_level tr:nth-child(8) td, table.vet_level tr:nth-child(9) td { color: #dbc2a1; } + /***********/ #worklist_heading { @@ -1035,25 +1168,27 @@ table.vet_level tr:nth-child(9) td { } .prod_choice_list_item { - text-align: left; + text-align: left; font-size: 100%; - cursor:pointer; + cursor: pointer; } .worklist_table { width: 100%; - border-spacing: 0px; + border-spacing: 0; border-collapse: separate; - font-family: SegoeSB; + font-family: "Segoe UI", sans-serif; + font-weight: bolder; text-shadow: 1px 1px #5554; background-image: url(/images/bg-med-light.jpg); } + #worklist_dialog_headline { width: 100%; - height: 48px; + height: 60px; font-size: 120%; - padding-bottom: 5px; - background-color: rgba(40,40,40,0.2); + padding-bottom: 0; + background-color: rgba(40, 40, 40, 0.2); } .worklist_table .ui-selected { @@ -1061,7 +1196,7 @@ table.vet_level tr:nth-child(9) td { } .cannot_build_item { - background-color: rgba(224,38,38,0.12); + background-color: rgba(224, 38, 38, 0.12); } .cannot_build_item.ui-selected { @@ -1076,30 +1211,32 @@ table.vet_level tr:nth-child(9) td { font-size: 140%; } -.overview_dialog .ui-dialog-titlebar, .unit_dialog .ui-dialog-titlebar, .chatbox_dialog .ui-dialog-titlebar { +.overview_dialog .ui-dialog-titlebar, .unit_dialog .ui-dialog-titlebar, .chatbox_dialog .ui-dialog-titlebar { padding-bottom: 1px; padding-left: 4px; - padding-top: 0px; + padding-top: 0; font-size: 11px; margin-top: -5px; height: 15px; overflow: hidden; border-color: #432; } + .overview_dialog { padding: 4px 2px; border-radius: 7px 7px 3px 3px; } + #game_overview_panel { - padding: 0px; - padding-bottom: 2px; + padding: 0 0 2px; margin-bottom: -5px; overflow: hidden; } -/* Fixes unit panel for >100 units but requires + +/* Fixes unit panel for >100 units but requires hard-coding to add if (is_small_screen()) document.body.classList.add('mobile'); -*/ +*/ body:not(.mobile) .ui-dialog.unit_dialog { overflow: auto !important; height: auto !important; @@ -1107,8 +1244,10 @@ body:not(.mobile) .ui-dialog.unit_dialog { } .chatbox_dialog .ui-dialog-titlebar { - background: #432 url("/images//ui-widget-header.png") 100% 50% repeat-x; -} /* theme classes 6 */ + background: #432 url("/images/ui-widget-header.png") 100% 50% repeat-x; +} + +/* theme classes 6 */ .ui-widget-content a { color: #9cf; @@ -1116,10 +1255,56 @@ body:not(.mobile) .ui-dialog.unit_dialog { .govt_button { width: 60%; - margin: 6px; line-height: 110%; font-size: 115%; - margin-bottom:-5px; + margin: 6px 6px -5px; +} + +/* Government Docs table showing content/unhappy citizens per empire size */ +.gov_city_happy_table, +.gov_city_rapture_table { + width: 100%; + border-collapse: collapse; + cursor: default !important; +} + +.gov_city_happy_table th, +.gov_city_rapture_table th { + text-align: center; + border: 1px solid black; + color: #000; + background: #aaa; +} + +.gov_city_happy_table th:nth-child(2n+1), +.gov_city_rapture_table th:nth-child(2n+1) { + background: #bbb; +} + +.gov_city_happy_table td, +.gov_city_rapture_table td { + text-align: center; + border: 2px solid black; + color: #fff; + background: #777; + font-weight: bold; + text-shadow: 2px 1px #555; +} + +.gov_city_happy_table tr:nth-child(2) td { + color: #fcb; + text-shadow: 2px 1px #650; +} + +/* Government Docs table showing rapture rates */ +.gov_city_rapture_table tr:nth-child(2) td { + color: rgb(187, 219, 255); + text-shadow: 2px 1px rgb(0, 15, 102); +} + +.gov_city_rapture_table tr:nth-child(3) td { + color: rgb(245, 200, 182); + text-shadow: 2px 1px rgb(102, 0, 0); } #governments { @@ -1127,50 +1312,60 @@ body:not(.mobile) .ui-dialog.unit_dialog { } .Democracy { - background-image: url(/images/gov.democracy.png) !important; + background-image: url(/images/gov.democracy.png) !important; } .Anarchy { - background-image: url(/images/gov.anarchy.png) !important; + background-image: url(/images/gov.anarchy.png) !important; } .Republic { - background-image: url(/images/gov.republic.png) !important; + background-image: url(/images/gov.republic.png) !important; } .Despotism { - background-image: url(/images/gov.despotism.png) !important; + background-image: url(/images/gov.despotism.png) !important; } .Communism { - background-image: url(/images/gov.communism.png) !important; + background-image: url(/images/gov.communism.png) !important; } .Monarchy { - background-image: url(/images/gov.monarchy.png) !important; + background-image: url(/images/gov.monarchy.png) !important; } .Fundamentalism { - background-image: url(/images/gov.fundamentalism.png) !important; + background-image: url(/images/gov.fundamentalism.png) !important; } .Tribalism, .Tribal { - background-image: url(/images/gov.tribalism.png) !important; + background-image: url(/images/gov.tribalism.png) !important; } .Tribalism { - background-image: url(/images/gov.tribalism.png) !important; + background-image: url(/images/gov.tribalism.png) !important; } .Federation { - background-image: url(/images/gov.federation.png) !important; + background-image: url(/images/gov.federation.png) !important; } +/* vertically aligned images */ .v, -.lowered_gov +.lowered_gov { + vertical-align: middle; +} + +.vu /* upkeep icons with tight fit in city::Supported Units panel */ { vertical-align: middle; + margin: -6px 7px -5px -1px; +} + +.sb { + vertical-align: sub; } .flag_self { @@ -1190,7 +1385,7 @@ body:not(.mobile) .ui-dialog.unit_dialog { .context-menu-item { font-size: 120%; - padding: 0px 5px 1px; + padding: 0 5px 1px; color: #c7bfbc; background: none; text-shadow: 2px 1px 2px #200; @@ -1199,7 +1394,7 @@ body:not(.mobile) .ui-dialog.unit_dialog { @media (max-width: 900px) { .context-menu-item { font-size: 140%; - padding: 0px 5px 1px; + padding: 0 5px 1px; color: #c7bfbc; background: none; text-shadow: 2px 1px 2px #200; @@ -1207,27 +1402,34 @@ body:not(.mobile) .ui-dialog.unit_dialog { } .chatbox_text_tileinfo { - cursor:pointer; + cursor: pointer; +} + +/* Clip units_oversize images in the Empire panel so they don't disrupt the layout */ +#empire_mode_panel div span { + max-height: 48px; /* 48px is normal height for improvements and units */ } /* city tabs will be on the bottom of the dialog. */ -#city_tabs .ui-tabs-nav { - position: absolute; - left: 0.25em; - right: 0.25em; - bottom: 0.25em; - padding: 0em 0.2em 0.2em; -} -#city_tabs .ui-tabs-nav li { - border-top: none; - border-bottom: 1px solid rgb(51, 51, 51); - -moz-border-radius: 0px 0px 4px 4px; - -webkit-border-radius: 0px 0px 4px 4px; - border-radius: 0px 0px 4px 4px; -} -#city_tabs .ui-tabs-nav li.ui-tabs-selected, -#city_tabs .ui-tabs-nav li.ui-state-active { - top: -1px; +#city_tabs .ui-tabs-nav { + position: absolute; + left: 0.25em; + right: 0.25em; + bottom: 0.25em; + padding: 0 0.2em 0.2em; +} + +#city_tabs .ui-tabs-nav li { + border-top: none; + border-bottom: 1px solid rgb(51, 51, 51); + -moz-border-radius: 0 0 4px 4px; + -webkit-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +#city_tabs .ui-tabs-nav li.ui-tabs-selected, +#city_tabs .ui-tabs-nav li.ui-state-active { + top: -1px; } @@ -1237,11 +1439,11 @@ body:not(.mobile) .ui-dialog.unit_dialog { } .wider-tooltip { - max-width:800px; + max-width: 800px; } .no-close .ui-dialog-titlebar-close { - display: none + display: none } .nation_flags { @@ -1256,7 +1458,7 @@ body:not(.mobile) .ui-dialog.unit_dialog { .scorechart { - height: 530px; + height: 530px; width: 100%; background-color: white; overflow: hidden; @@ -1269,19 +1471,22 @@ body:not(.mobile) .ui-dialog.unit_dialog { .current_focus_unit { border: 1px solid white; - background-color: rgba(240,240,240,0.5); + background-color: rgba(240, 240, 240, 0.5); } + .transported_focus_unit { border: 1px solid skyblue; background-color: rgba(110, 210, 255, 0.75); } + .nonfocus_unit { border: 1px solid white; - background-color: rgba(15,0,0,0.55); + background-color: rgba(15, 0, 0, 0.55); } + .transported_nonfocus_unit { - border: 1px solid skyblue; - background-color: rgba(0, 90, 145, 0.75); + border: 1px solid skyblue; + background-color: rgba(0, 90, 145, 0.75); } #active_unit_info { @@ -1309,18 +1514,26 @@ body:not(.mobile) .ui-dialog.unit_dialog { } .cities_row { - cursor:pointer; - cursor:hand; + cursor: hand; } .cities_row td { - padding-left: 20px; - padding-left: 0px; /* added by Lexxie to experiment */ + padding-left: 0; /* added by Lexxie to experiment */ +} + +/* Empire -> all tabs -> cities_row of images: + clip units_oversize to 48px high to keep layout clean. NB: This should also + target images in normal cities list which uses this class; but it shouldn't + matter because units_oversize get scaled in that one. */ +.cities_row td div, +.cities_row td div span { + max-height: 48px; } #wiki_dialog { overflow: auto; } + #wiki_dialog a { color: #9cf !important; text-shadow: 2px 1px #002850; @@ -1345,8 +1558,8 @@ body:not(.mobile) .ui-dialog.unit_dialog { } .inteldlg_tabs { - background: url("/images/bg-dark.jpg") repeat scroll 0 0 ; - margin: 0.5em 0em; + background: url("/images/bg-dark.jpg") repeat scroll 0 0; + margin: 0.5em 0; color: #dbd5d0; } @@ -1355,7 +1568,7 @@ body:not(.mobile) .ui-dialog.unit_dialog { overflow-y: auto; } -@media(max-height:600px) { +@media (max-height: 600px) { .inteldlg_tabs > ul { max-height: 250px; overflow-y: auto; @@ -1363,7 +1576,7 @@ body:not(.mobile) .ui-dialog.unit_dialog { } #intel_tabs { - background: url("/images/bg-dark.jpg") repeat scroll 0 0 ; + background: url("/images/bg-dark.jpg") repeat scroll 0 0; color: #dbd5d0; } @@ -1391,19 +1604,23 @@ li.tech-them { color: #a9d1a7; cursor: alias; } + li.tech-me_only { color: #caa7a7; font-style: italic; cursor: alias; } + li.tech-both { cursor: alias; } + li.tech-them::before { content: '\2605'; position: absolute; left: 1em; } + li.tech-me_only::before { color: #d10d17; font-weight: bold; @@ -1411,12 +1628,14 @@ li.tech-me_only::before { position: absolute; left: 1em; } + li.tech-both::before { content: '\2713'; position: absolute; left: 1em; } -/* the following classes express a matrix of possibilities, some of which are + +/* the following classes express a matrix of possibilities, some of which are not possible. the first code is who definitely possesses the tech: them, me_only, both, neither the second is two bits for who possess blueprints: [me_bit][them_bit] */ @@ -1425,65 +1644,77 @@ li.tech-them00 { /* no one has blueprints, they have the tech. we don't. */ color: #a9d1a7; cursor: alias; } + li.tech-them10 { /* they have the tech and we have blueprints */ font-weight: bold; color: #a9d1a7; cursor: alias; } + /* themx1: impossible to possess and also have blueprints */ li.tech-neither01 { /* no one has the tech but they have blueprints */ color: #a7c4d1; - font-style: bold; + font-style: italic; cursor: alias; } + li.tech-neither10 { /* no one has the tech but we have blueprints */ color: #a89191; font-style: italic; cursor: alias; } + li.tech-neither11 { /* no one has the tech but both have blueprints */ color: #3876fc; font-style: italic; cursor: alias; } + /* both00: impossible: "no one with tech, nor blueprints" gets filtered out of the list */ -li.tech-me_only00 { /* we have the tech and they lack blueprints */ +li.tech-me_only00 { /* we have the tech and they lack blueprints */ color: #caa7a7; font-style: italic; cursor: alias; } -li.tech-me_only01 { /* we have the tech and they have blueprints */ + +li.tech-me_only01 { /* we have the tech and they have blueprints */ color: #3876fc; font-style: italic; cursor: alias; } + /* me_only1x: impossible, we can't have blueprints if we have the tech */ -li.tech-both00 { /* if we both have the tech then neither has blueprints */ +li.tech-both00 { /* if we both have the tech then neither has blueprints */ cursor: alias; } + /* ----------- */ li.tech-them00::before { /* they have the tech, we don't, and we have no blueprints */ content: '\2605'; position: absolute; left: 1em; } + li.tech-them10::before { /* they have the tech, we don't, and we have blueprints */ content: '\2605'; position: absolute; left: 1em; } -li.tech-neither01::before { /* no one has the tech but they have blueprints and we don't */ + +li.tech-neither01::before { /* no one has the tech but they have blueprints and we don't */ color: #3876fc; content: '\2605'; position: absolute; left: 1em; } -li.tech-neither10::before { /* no one has the tech but we have blueprints and they don't */ + +li.tech-neither10::before { /* no one has the tech but we have blueprints and they don't */ color: #d10d17; content: '\2613'; position: absolute; left: 1em; } + li.tech-me_only00::before { /* we have the tech, they don't, and no one has blueprints */ color: #d10d17; font-weight: bold; @@ -1491,6 +1722,7 @@ li.tech-me_only00::before { /* we have the tech, they don't, and no one has blue position: absolute; left: 1em; } + li.tech-me_only01::before { /* we have the tech, they don't, and they have blueprints */ color: #d10d17; font-weight: bold; @@ -1498,20 +1730,13 @@ li.tech-me_only01::before { /* we have the tech, they don't, and they have bluep position: absolute; left: 1em; } + li.tech-both00::before { /* we both have the tech and neither has blueprints */ content: '\2713'; position: absolute; left: 1em; } - -.e_next_year { - border-top: 2px #555555 groove; - margin-top: 0.5em; - padding-bottom: 0.5em; -} - - #chat_context_dialog { overflow-y: auto; } @@ -1545,7 +1770,7 @@ li.tech-both00::before { /* we both have the tech and neither has blueprints */ /* Diplomacy dialog. */ .diplomacy_messages { - background: url("/images/bg-dark.jpg") repeat scroll 0 0 ; + background: url("/images/bg-dark.jpg") repeat scroll 0 0; min-height: 120px; max-height: 200px; overflow: auto; @@ -1554,19 +1779,23 @@ li.tech-both00::before { /* we both have the tech and neither has blueprints */ font-size: 130%; color: var(--default_text_color); } + .diplomacy_messages a { color: white; } + .diplomacy_player_box { width: 50%; float: left; - text-align:center; + text-align: center; } + .diplomacy_player_box h3 { clear: both; width: 100%; padding-top: 1em; } + .dipl_div { float: left; text-align: left; @@ -1574,24 +1803,30 @@ li.tech-both00::before { /* we both have the tech and neither has blueprints */ white-space: nowrap; z-index: 2000; } + .dipl_div a { color: rgb(202, 187, 153); text-decoration: none; } + .dipl_add { z-index: 100; } + .agree_self { float: left; } + .agree_counterpart { float: right; } + .diplomacy_gold { padding: 8px; font-size: 80%; color: rgb(253, 232, 0) !important; } + .diplomacy_gold input { height: 18px; font-size: 15px; @@ -1601,6 +1836,7 @@ li.tech-both00::before { /* we both have the tech and neither has blueprints */ border-color: #888; text-align: center; } + .row_right { text-align: right; } @@ -1614,11 +1850,11 @@ li.tech-both00::before { /* we both have the tech and neither has blueprints */ vertical-align: top; white-space: pre-line; margin: -5px; - padding: 0px; + padding: 0; transform: scale(0.5); - float:left; + float: left; max-height: 24px; - border-width: 0px; + border-width: 0; border-style: none; } @@ -1628,10 +1864,6 @@ li.tech-both00::before { /* we both have the tech and neither has blueprints */ } .rotateimg270 { - -webkit-transform:rotate(270deg); - -moz-transform: rotate(270deg); - -ms-transform: rotate(270deg); - -o-transform: rotate(270deg); transform: rotate(270deg); } @@ -1642,21 +1874,27 @@ li.tech-both00::before { /* we both have the tech and neither has blueprints */ .faroese1 { background: url("/images/themes/faroese/bg.jpg") repeat scroll 0 0 #222222; } + .faroese2 { - background: url("/images/themes/faroese/bg.jpg") repeat scroll 0 0 ; + background: url("/images/themes/faroese/bg.jpg") repeat scroll 0 0; } + .faroese3 { background: url("/images/themes/faroese/bg.jpg"); } + .faroese4 { background: url("/images/themes/faroese/bg.jpg") repeat scroll 50% 50%; } + .faroese5 { background: #cb842e url("/images/themes/faroese/ui-widget-header.png") 50% 50% repeat-x; } + .faroese6 { background: #cb842e url("/images/themes/faroese/ui-widget-header.png") 100% 50% repeat-x; } + .faroese7 { background: #444444 url(/images/freeciv-web-logo2.png); } @@ -1665,21 +1903,27 @@ li.tech-both00::before { /* we both have the tech and neither has blueprints */ .greek1 { background: url("/images/themes/greek/bg.jpg") repeat scroll 0 0 #222222; } + .greek2 { - background: url("/images/themes/greek/bg.jpg") repeat scroll 0 0 ; + background: url("/images/themes/greek/bg.jpg") repeat scroll 0 0; } + .greek3 { background: url("/images/themes/greek/bg.jpg"); } + .greek4 { background: url("/images/themes/greek/bg.jpg") repeat scroll 50% 50%; } + .greek5 { background: #cb842e url("/images/themes/greek/ui-widget-header.png") 50% 50% repeat-x; } + .greek6 { background: #cb842e url("/images/themes/greek/ui-widget-header.png") 100% 50% repeat-x; } + .greek7 { background: #444444 url(/images/themes/greek/freeciv-web-logo.png); } @@ -1688,14 +1932,16 @@ li.tech-both00::before { /* we both have the tech and neither has blueprints */ background: url('/images/bg-dark.jpg'); color: var(--default_text_color); } + /* city governor sliders */ .cma_slider { - margin-left:10px; - margin-bottom:0px; + margin-left: 10px; + margin-bottom: 0; border: none !important; - background-image: url('/images/string.png') repeat-x scroll 0 0 !important; + background: url('/images/string.png') repeat-x scroll 0 0 !important; height: 12px; } + .no_bg { background-image: none !important; border: none !important; @@ -1704,56 +1950,55 @@ li.tech-both00::before { /* we both have the tech and neither has blueprints */ .ui-dialog:not(#game_message_area, #game_chatbox_panel) { color: var(--default_text_color); - font-family:Segoe; + font-family: "Segoe UI", sans-serif; background: url('/images/bg.jpg'); border: #432 !important; } -/* this probably is doing nothing */ -.ui-dialog-content -.ui-widget-content { - color: var(--default_text_color); -} - /* Standard tool tips */ /* jquery */ .ui-tooltip { white-space: pre-line; background-image: url('/images/bg-light.jpg') !important; color: var(--contrast_text_color) !important; - /* box-shadow: none !important; + /* box-shadow: none !important; box-shadow: 5px 5px 15px #000a, -.01em 0 .27em #ccc5 !important; */ box-shadow: 6px 6px 23px #000b !important; text-shadow: 1px 1px #33222241 !important; - font-family: Segoe !important; + font-family: "Segoe UI", sans-serif !important; line-height: 16px; } + body div.ui-tooltip { max-width: 360px; } .ui-button, button { color: var(--default_text_color); - font-family: Freeciv !important; + font-family: Cinzel, serif !important; background: url('/images/bg-med-dark.jpg') #000; border-color: #000; - box-shadow: "3px 3px 6px #000b" !important; + box-shadow: 3px 3px 6px #000b !important; } + .ui-button:hover, button:hover { background: url('/images/bg-light.jpg') #000; color: #000 !important; - box-shadow: "4px 4px 7px #0008" !important; + box-shadow: 4px 4px 7px #0008 !important; } + .ui-button.ui-button-icon-only:not(#turn_done_button) { border: 1px solid; background: url('/images/bg-med-light.jpg'); margin-right: 4px; } + /* fixes position of dialog-close button */ .ui-button-icon-only .ui-icon { margin-top: -10px; } + .menu-button-activator { float: left; margin: 0 4px 40px 20px; @@ -1764,13 +2009,15 @@ body div.ui-tooltip { text-align: center; color: var(--default_text_color) !important; border-color: #000 !important; - box-shadow: "3px 3px 6px #000b" !important; - font-family: Freeciv !important; + box-shadow: 3px 3px 6px #000b !important; + font-family: Cinzel, serif !important; background: url('/images/bg-med-dark.jpg') #000 !important; } + .menu-button-activator .ui-selected { color: #fff !important; } + .menu-button-activator .ui-icon { position: absolute; top: 50%; @@ -1786,10 +2033,10 @@ body div.ui-tooltip { .ui-dialog-titlebar-restore { border: none !important; background: none !important; - background-image: none !important; - height:16px; + height: 16px; width: 16px; } + /* make titlebar a perfect fit to dialog/div frame around it */ .ui-dialog-titlebar { border-color: #432; @@ -1809,23 +2056,26 @@ body div.ui-tooltip { } .ui-tabs-anchor { - font-family: "Freeciv"; + font-family: Cinzel, serif; background: url('/images/bg-med-dark.jpg'); color: var(--default_text_color) !important; border-color: #000; border-radius: 5px 5px 0 0; } + .ui-tabs-anchor:hover { background: url('/images/bg-light.jpg') #000; color: #000 !important; border-radius: 5px 5px 0 0; } + /* while pushed */ .ui-tabs-anchor:active { background: url('/images/bg-light.jpg') #000; color: rgb(117, 47, 0) !important; border-radius: 5px 5px 0 0; } + .ui-tabs-tab { border-color: #000; /* this is hard coded into client_main.js because @@ -1838,25 +2088,33 @@ body div.ui-tooltip { background: none; border: none; } + #city_tabs .ui-tabs-nav li { border-radius: 9px 9px 0 0; } + /**/ *:focus { - outline: none; + outline: none; } -a:focus { outline: thin dotted; border:none;} + +a:focus { + outline: thin dotted; + border: none; +} + .ui-tabs-active .ui-tabs-anchor { - top: -1px; + top: -1px; background: url('/images/bg-med-light.jpg') #000 !important; - color:#000 !important; + color: #000 !important; border: none !important; border-radius: 5px 5px 0 0; } + .citytab, .fcw_tab { - margin-left:0px; - margin-right:1px !important; + margin-left: 0; + margin-right: 1px !important; } /* Tile info styles, can be used elsewhere too */ @@ -1867,28 +2125,33 @@ a:focus { outline: thin dotted; border:none;} text-decoration: underline; cursor: pointer; } + .highlight_irrigation { - color:#8db2ff; + color: #8db2ff; text-shadow: 2px 1px #00af; } + .highlight_mining { - color:#e76879; + color: #e76879; text-shadow: 2px 1px #500f; } + .highlight_transforming { - color:#f9bd4d; + color: #f9bd4d; text-shadow: 2px 1px #2c2707; } + .highlight_roading { - color:#dbb992; + color: #dbb992; text-shadow: 2px 1px #311907; } input[type="text"], textarea { - background-color : #111; + background-color: #111; color: var(--default_text_color); border-color: #aaa; } + input[type="password" i], #password { -webkit-text-security: disc !important; padding: 1px 2px; @@ -1896,24 +2159,27 @@ input[type="password" i], #password { color: var(--default_text_color) !important; border-color: #aaa; } + input[type="email" i], #email { padding: 1px 2px; background-color: #111 !important; color: var(--default_text_color) !important; border-color: #aaa; } + #pregame_text_input { - background: #111 !important; background-color: #000 !important; border-color: #777 !important; color: rgb(60, 190, 255); } + #pregame_game_info { color: #e0c29a !important; text-shadow: 1px 1px #000; } + #pick_nation_dialog { - color: var(--default-text-color); + color: var(--default_text_color); } .sweet-alert { @@ -1921,12 +2187,11 @@ input[type="email" i], #email { } .chatbox_dialog { - background: rgba(0,0,0,0.75) !important; - background-color: rgba(0,0,0, 0.75) important!; + background: rgba(0, 0, 0, 0.75) !important; } + .mobile_chatbox_dialog { - background: rgba(0,0,0,0.9) !important; - background-color: rgba(0,0,0, 0.9) important!; + background: rgba(0, 0, 0, 0.9) !important; } #ui-dialog-title-game_chatbox_panel { @@ -1935,8 +2200,7 @@ input[type="email" i], #email { } #game_chatbox_panel { - background: rgba(0,0,0,0.75) important!; - background-color: rgba(0,0,0, 0.75) important!; + background: rgba(0, 0, 0, 0.75) !important; overflow: hidden; } @@ -1944,20 +2208,41 @@ input[type="email" i], #email { padding: 5px 0; } +/* prevent game message area from having thick unused 60px margin between it and its scrollbar */ +.mCSB_container { + margin-right: 0; +} + +.mCSB_inside > .mCSB_container { + margin-right: 0; +} + +.mCSB_scrollTools .mCSB_draggerContainer { + margin-left: 0; + margin-right: -12px; + padding: 0; +} + +.mCSB_dragger_bar { + width: 6px !important; + background: rgb(136, 119, 102) !important; +} + +/**************************************************************************************************/ #game_message_area { padding-top: 12px; - padding-left: 0px; + padding-left: 0; + padding-right: 4px; box-sizing: border-box; border: 1px solid #111111; color: rgb(247, 241, 241); list-style-type: none; - margin: 0px; - /* font-family: Consolas; */ + margin: 0; } #selectable li { -/* margin: 3px; - padding: .4em; */ + /* margin: 3px; + padding: .4em; */ cursor: pointer; background: #0000003b; } @@ -1972,37 +2257,66 @@ input[type="email" i], #email { } .e_setting { - color: #777c79; + color: #777c79; } + +.e_setting a { + target: new; + target-name: new; + target-new: tab; +} + .e_chat_msg { color: #dbd5c0 } + .e_chat_msg_public { text-align: center; color: #d8d2c1 } + .e_chat_msg_private_sent { text-align: right; color: #ffb789; } + .e_chat_msg_private_rcvd { color: #ff87b7 } + .e_chat_msg_ally { text-align: center; color: #a9aff1; } + .cht_prv_sndr { color: #c79cae } + .cht_ally_sndr { color: #898fd8; } + .cht_you { color: #c888ff; } -.cht_arw { - color: #ffffff; + +/* chat arrows */ +.arwl, +.arwr { + padding: 3px; +} + +.arwl::before { + content: url(/images/e/a_left.png); + vertical-align: text-top; + white-space: nowrap; +} + +.arwr::before { + content: url(/images/e/a_rght.png); + vertical-align: text-top; + white-space: nowrap; } @@ -2015,17 +2329,18 @@ input[type="email" i], #email { .e_my_unit_was_healed { color: #97e0f0; } + .e_unit_lost_att, .e_unit_lost_def, .e_unit_lost_misc, -.e_unit_was_expelled -{ +.e_unit_was_expelled { color: #8bdaec; } + .e_enemy_diplomat_failed, .e_my_diplomat_poison, .e_my_spy_steal_map, -.e_my_diplomat_escape, +.e_my_diplomat_escape, .e_my_diplomat_bribe, .e_my_spy_steal_gold, .e_my_diplomat_incite, @@ -2036,9 +2351,11 @@ input[type="email" i], #email { .e_unit_win_def { color: #b0e9ff; } + .e_pollution { color: #a79792; } + .e_my_diplomat_failed, .e_enemy_diplomat_poison, .e_enemy_spy_nuke, @@ -2051,37 +2368,49 @@ input[type="email" i], #email { .e_enemy_spy_steal_map { color: #b88f8f; } -.e_unit_orders { /* sentry saw a unit*/ -/* color: #d5e9a7; */ - color: #7caaff; - } - .e_imp_build, + +.e_unit_sentry_wake { + color: #7cb4ff; + font-size: 82%; +} + +.e_unit_orders { + color: #7cb4ff; +} + +.e_imp_build, .e_unit_built { - color: #acb8d3 + color: #acb8d3 } + .e_unit_became_vet { color: #b0b0b0; } + .e_unit_upgraded { color: #efe07a; } + .e_hut_gold, .e_imp_sold, .e_imp_buy, .e_unit_buy { color: #e6ddad; } + .e_wonder_build { color: #eee092; } + .e_diplomacy, .e_treaty_shared_vision, .e_treaty_alliance, .e_treaty_peace, .e_treaty_ceasefire, .e_treaty_embassy { - color:#9baf9b; + color: #9baf9b; } + .e_city_nuked, .e_nuke, .e_diplomatic_incident, @@ -2095,40 +2424,54 @@ input[type="email" i], #email { .e_treaty_broken { color: #e09090; } + .e_caravan_action { color: #c59f6d; } + .e_tech_gain, .e_tech_learned, .e_tech_lost, .e_tech_embassy, .e_tech_goal { - color:#7cffdc; + color: #7cffdc; } + .e_city_cma_release { - color:#5d72ff; + color: #7494ff; + text-shadow: 1px 1px #0000ff; } -.e_spaceship -{ - color:#327aff; + +.e_spaceship { + color: #327aff; } + .e_script { color: #f1f12f; } + .e_next_year { - color: #d5d2d0; + color: #edc; + font-weight: bold; + border-top: 3px #876 double; + border-bottom: 1px #654 dashed; + margin-top: 1.2em; + margin-bottom: 0.5em; + text-align: center; + background: #1c1410; } + .e_new_government { color: #ffffff; font-style: italic; } + .e_first_contact { color: #9ecbff; } /*reclassify later: all other generic messages*/ .e_city_cantbuild, - .e_city_love, .e_unit_built_pop_cost, .e_city_growth, @@ -2136,33 +2479,27 @@ input[type="email" i], #email { .e_city_aqueduct, .e_city_aq_building, .e_city_normal, - .e_city_gran_throttle, .e_city_transfer, .e_city_build, .e_city_production_changed, - -.e_worklist, - +.e_worklist, .e_imp_auctioned, .e_imp_auto, .e_imp_destroyed, - .e_wonder_started, .e_wonder_stopped, .e_wonder_will_be_built, .e_wonder_obsolete, - .e_hut_barb, .e_hut_city, .e_hut_merc, .e_hut_settler, .e_hut_tech, +.e_hut_map, .e_hut_barb_city_near, - .e_embassy_was_expelled, .e_embassy_did_expel, - .e_achievement, .e_uprising, .e_anarchy, @@ -2173,41 +2510,50 @@ input[type="email" i], #email { .e_revolt_done, .e_revolt_start, .e_spontaneous_extra, - .e_chem, .e_broadcast_report, .e_report, - .e_log_fatal, .e_chat_error, .e_bad_command, .e_game_start, -.e_game_end, .e_turn_bell { color: #f1efef; } + +.e_game_end { + font-size: 150%; + color: #fff; +} + .e_beginner_help { - font-size: 70%; + font-size: 80%; color: #ddcec4 } + .e_unit_illegal_action { - color: #848080; + color: #a77979; } + .e_connection { - color:#111 + color: #111 } + .e_global_eco { - color:#eee; + color: #eee; } + .e_bad_command { color: #aba5a5; } -/* Prevent dev/debug messages from text-walling GMs. CTRL-E toggles in-game. */ + +/* Prevent dev/debug messages from text-walling GMs. CTRL-SHIFT-E toggles in-game. */ .e_log_error { display: none; font-size: 70%; color: #F82; } + .e_small { font-size: 70%; } @@ -2215,56 +2561,68 @@ input[type="email" i], #email { /* Font Control over various game elements *******************************************************************/ #pregame_message_area { - font-family: SegoeSB; - line-height:115%; - font-size:115%; - color:rgb(218, 218, 218) !important; + font-family: "Segoe UI", sans-serif; + font-weight: bolder; + line-height: 115%; + font-size: 115%; + color: rgb(218, 218, 218) !important; } + /* override everything in pregame to black */ #pregame_message_area .e_setting { - font-family: ConsolasBold; - line-height:90%; - font-size:90%; + font-family: "Consolas", monospace; + font-weight: bold; + line-height: 90%; + font-size: 90%; color: inherit !important; } + #pregame_message_area .e_connection { - font-family: ConsolasBold; - line-height:90%; - font-size:90%; + font-family: "Consolas", monospace; + font-weight: bold; + line-height: 90%; + font-size: 90%; color: inherit !important; } + #private_message_text, #pregame_text_input { - font-family: Consolas; + font-family: "Consolas", monospace; } + /* info on terrain, gov, wonders, buildings */ #helptext_pane { - /*font-family: Arial;*/ line-height: 115%; font-size: 115%; } + #help_city_improvements { color: #8bf; } + #help_wonders_of_the_world { color: #fc9; } + #help_units { color: #e67; } + #help_government { color: #8b7; } + #help_gen_ruleset { color: #a6f } + #help_controls { color: #cd6; } #city_canvas_div { - width: 384px; - height: 192px; + width: 384px; + height: 192px; float: left; margin: 5px; border: 1px solid #888888; @@ -2279,26 +2637,31 @@ input[type="email" i], #email { margin: 20px; float: left; } + .city_panel { /* background: url("/images/bg-med-dark.jpg") repeat scroll 0 0 #222222; */ padding-right: 30px; margin-top: 20px; - font-family: Segoe; + font-family: "Segoe UI", sans-serif; color: var(--default_text_color); } + #city_right_panel { - float: right; + float: right; width: 55%; background: url("/images/bg.jpg") repeat scroll 0 0 #222222; height: 533px; -} /* theme classes 1 */ +} + +/* theme classes 1 */ #city_improvements_panel { clear: left; width: 95%; - line-height:11px !important; + line-height: 11px !important; } + #prod_descr, #city_dialog, #city_tabs, @@ -2311,9 +2674,11 @@ input[type="email" i], #email { #city_foreigners { color: var(--default_text_color) !important; } + #city_production_tab { background: url("/images/bg-med-dark.jpg"); } + #city_current_worklist { width: 100%; float: left; @@ -2324,6 +2689,7 @@ input[type="email" i], #email { border: 1px solid black; border-radius: 4px; } + #worklist_production_choices { width: 100%; float: left; @@ -2349,20 +2715,24 @@ input[type="email" i], #email { #city_tabs { border-color: #432; } + #city_tabs_panel { border-color: #432; margin-left: -5px; margin-right: -5px; margin-bottom: -5px; } + #city_tabs_panel > li { - margin-left: 0px; - margin-right: 0px; + margin-left: 0; + margin-right: 0; border-color: #000; } + .happy_cause_help { cursor: help; } + /* city governor */ .ui-slider-handle { border: none !important; @@ -2371,58 +2741,8 @@ input[type="email" i], #email { background-image: url('/images/slider_prod.png'); /* default grey */ } -/* Font faces */ -@font-face { - font-family: ConsolasBold; - src: url('/fonts/consolab.ttf'); -} -@font-face { - font-family: Consolas; - src: url('/fonts/consola.ttf'); -} - -@font-face { - font-family: Helvetica; - src: url('/fonts/arial.ttf'); -} -@font-face { - font-family: Freeciv; - src: url('/fonts/freeciv.ttf'); -} -@font-face { - font-family: FreecivSB; - src: url('/fonts/freeciv.m.ttf'); -} -@font-face { - font-family: FreecivBold; - src: url('/fonts/freeciv.b.ttf'); -} -@font-face { - font-family: FreecivBlack; - src: url('/fonts/freeciv.bl.ttf'); -} -@font-face { - font-family: Arial; - src: url('/fonts/arial.ttf'); -} -@font-face { - font-family: SegoeSB; /* semi-bold */ - src: url('/fonts/seg.sb.ttf'); -} -@font-face { - font-family: SegoeBold; - src: url('/fonts/seg.b.ttf'); -} -@font-face { - font-family: SegoeBlack; - src: url('/fonts/seg.bl.ttf'); -} -@font-face { - font-family: Segoe; - src: url('/fonts/seg.ttf'); -} body { - font-family: Arial; + font-family: "Arial", sans-serif; border: none; outline: none; scrollbar-width: thin !important; @@ -2435,94 +2755,117 @@ body { label { -webkit-touch-callout: none; -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; user-select: none; } input[type=checkbox].css-checkbox { - position: absolute; - overflow: hidden; - clip: rect(0 0 0 0); - height:1px; - width:1px; - margin:-1px; - padding:0; - border:0; + position: absolute; + overflow: hidden; + clip: rect(0 0 0 0); + height: 1px; + width: 1px; + margin: -1px; + padding: 0; + border: 0; } input[type=checkbox].css-checkbox + label.css-label { - padding-left:20px; - height:15px; - display:inline-block; - line-height:15px; - background-repeat:no-repeat; + padding-left: 20px; + height: 15px; + display: inline-block; + line-height: 15px; + background-repeat: no-repeat; background-position: 0 0; /* font-size:15px; */ - vertical-align:middle; - cursor:pointer; + vertical-align: middle; + cursor: pointer; } input[type=checkbox].css-checkbox:checked + label.css-label { -background-position: 0 -15px; + background-position: 0 -15px; +} + +.css-label { + background-image: url(/images/dark-check-green.png); +} + +.dark-check-cyan { + background-image: url(/images/dark-check-cyan.png); +} + +.dark-check-green { + background-image: url(/images/dark-check-green.png); +} + +.dark-check-orange { + background-image: url(/images/dark-check-orange.png); } -.css-label{ -background-image:url(/images/dark-check-green.png); +.dark-check-yellow { + background-image: url(/images/dark-check-yellow.png); } -.dark-check-cyan{background-image:url(/images/dark-check-cyan.png);} -.dark-check-green{background-image:url(/images/dark-check-green.png);} -.dark-check-orange{background-image:url(/images/dark-check-orange.png);} -.dark-check-red{background-image:url(/images/dark-check-red.png);} -.dark-check-white{background-image:url(/images/dark-check-white.png);} -.dark-check-blue{background-image:url(/images/dark-check-blue.png);} -.dark-check-purple{background-image:url(/images/dark-check-purple.png);} +.dark-check-red { + background-image: url(/images/dark-check-red.png); +} + +.dark-check-white { + background-image: url(/images/dark-check-white.png); +} + +.dark-check-blue { + background-image: url(/images/dark-check-blue.png); +} + +.dark-check-purple { + background-image: url(/images/dark-check-purple.png); +} input[type=checkbox].css-checkbox.med + label.css-label.med { - padding-left:22px; - height:17px; - display:inline-block; - line-height:17px; - background-repeat:no-repeat; + padding-left: 22px; + height: 17px; + display: inline-block; + line-height: 17px; + background-repeat: no-repeat; background-position: 0 0; /* font-size:15px; */ - vertical-align:middle; - cursor:pointer; + vertical-align: middle; + cursor: pointer; } -input[type=checkbox].css-checkbox.med:checked + label.css-label.med { - background-position: 0 -17px; +input[type=checkbox].css-checkbox.med:checked + label.css-label.med { + background-position: 0 -17px; } + input[type=checkbox].css-checkbox.sme + label.css-label.sme { - padding-left:22px; - height:16px; - display:inline-block; - line-height:16px; - background-repeat:no-repeat; + padding-left: 22px; + height: 16px; + display: inline-block; + line-height: 16px; + background-repeat: no-repeat; background-position: 0 0; -/* font-size:15px; */ - vertical-align:middle; - cursor:pointer; + /* font-size:15px; */ + vertical-align: middle; + cursor: pointer; } - -input[type=checkbox].css-checkbox.sme:checked + label.css-label.sme{ - background-position: 0 -16px; - } + +input[type=checkbox].css-checkbox.sme:checked + label.css-label.sme { + background-position: 0 -16px; +} + input[type=checkbox].css-checkbox.lrg + label.css-label.lrg { - padding-left:22px; - height:20px; - display:inline-block; - line-height:20px; - background-repeat:no-repeat; - background-position: 0 0; - /* font-size:15px; */ - vertical-align:middle; - cursor:pointer; - } - -input[type=checkbox].css-checkbox.lrg:checked + label.css-label.lrg{ - background-position: 0 -20px; - } + padding-left: 22px; + height: 20px; + display: inline-block; + line-height: 20px; + background-repeat: no-repeat; + background-position: 0 0; + /* font-size:15px; */ + vertical-align: middle; + cursor: pointer; +} + +input[type=checkbox].css-checkbox.lrg:checked + label.css-label.lrg { + background-position: 0 -20px; +} diff --git a/freeciv-web/src/main/webapp/css/fg.menu.css b/freeciv-web/src/main/webapp/css/fg.menu.css index 3293d7317..d19332735 100755 --- a/freeciv-web/src/main/webapp/css/fg.menu.css +++ b/freeciv-web/src/main/webapp/css/fg.menu.css @@ -4,75 +4,86 @@ Date: September 2008 */ -/* REQUIRED STYLES - the menus will only render correctly with these rules */ +/* REQUIRED STYLES - the menus will only render correctly with these rules */ + +.fg-menu-container { position: absolute; top: 0; left: -999px; padding: .4em; overflow: hidden; z-index: 2000;} -.fg-menu-container { position: absolute; top:0; left:-999px; padding: .4em; overflow: hidden; z-index: 2000;} .fg-menu-container.fg-menu-flyout { overflow: visible; } -.fg-menu, .fg-menu ul { list-style-type:none; padding: 0; margin:0; } +.fg-menu, .fg-menu ul { list-style-type: none; padding: 0; margin: 0; } + +.fg-menu { position: relative; } + +.fg-menu-flyout .fg-menu { position: static; } -.fg-menu { position:relative; } -.fg-menu-flyout .fg-menu { position:static; } +.fg-menu ul { position: absolute; top: 0; } -.fg-menu ul { position:absolute; top:0; } -.fg-menu ul ul { top:-1px; } +.fg-menu ul ul { top: -1px; } -.fg-menu-container.fg-menu-ipod .fg-menu-content, +.fg-menu-container.fg-menu-ipod .fg-menu-content, .fg-menu-container.fg-menu-ipod .fg-menu-content ul { background: none !important; } .fg-menu.fg-menu-scroll, -.fg-menu ul.fg-menu-scroll { overflow: scroll; overflow-x: hidden; } +.fg-menu ul.fg-menu-scroll { overflow: scroll; overflow-x: hidden; } + +.fg-menu li { clear: both; float: left; width: 100%; margin: 0; padding: 0; border: 0; } + +.fg-menu li li { font-size: 1em; } -.fg-menu li { clear:both; float:left; width:100%; margin: 0; padding:0; border: 0; } -.fg-menu li li { font-size:1em; } /* inner li font size must be reset so that they don't blow up */ +/* inner li font size must be reset so that they don't blow up */ .fg-menu-flyout ul ul { padding: .4em; } -.fg-menu-flyout li { position:relative; } + +.fg-menu-flyout li { position: relative; } .fg-menu-scroll { overflow: scroll; overflow-x: hidden; } .fg-menu-breadcrumb { margin: 0; padding: 0; } -.fg-menu-footer { margin-top: .4em; padding: .4em; } -.fg-menu-header { margin-bottom: .4em; padding: .4em; } +.fg-menu-footer { margin-top: .4em; padding: .4em; } + +.fg-menu-header { margin-bottom: .4em; padding: .4em; } .fg-menu-breadcrumb li { float: left; list-style: none; margin: 0; padding: 0 .2em; font-size: .9em; opacity: .7; } + .fg-menu-breadcrumb li.fg-menu-prev-list, .fg-menu-breadcrumb li.fg-menu-current-crumb { clear: left; float: none; opacity: 1; } + .fg-menu-breadcrumb li.fg-menu-current-crumb { padding-top: .2em; } -.fg-menu-breadcrumb a, +.fg-menu-breadcrumb a, .fg-menu-breadcrumb span { float: left; } .fg-menu-footer a:link, -.fg-menu-footer a:visited { float:left; width:100%; text-decoration: none; } +.fg-menu-footer a:visited { float: left; width: 100%; text-decoration: none; } + .fg-menu-footer a:hover, -.fg-menu-footer a:active { } +.fg-menu-footer a:active { } -.fg-menu-footer a span { float:left; cursor: pointer; } +.fg-menu-footer a span { float: left; cursor: pointer; } .fg-menu-breadcrumb .fg-menu-prev-list a:link, .fg-menu-breadcrumb .fg-menu-prev-list a:visited, .fg-menu-breadcrumb .fg-menu-prev-list a:hover, -.fg-menu-breadcrumb .fg-menu-prev-list a:active { background-image: none; text-decoration:none; } - +.fg-menu-breadcrumb .fg-menu-prev-list a:active { background-image: none; text-decoration: none; } + .fg-menu-breadcrumb .fg-menu-prev-list a { float: left; padding-right: .4em; } + .fg-menu-breadcrumb .fg-menu-prev-list a .ui-icon { float: left; } - + .fg-menu-breadcrumb .fg-menu-current-crumb a:link, .fg-menu-breadcrumb .fg-menu-current-crumb a:visited, .fg-menu-breadcrumb .fg-menu-current-crumb a:hover, -.fg-menu-breadcrumb .fg-menu-current-crumb a:active { display:block; background-image:none; font-size:1.3em; text-decoration:none; } - +.fg-menu-breadcrumb .fg-menu-current-crumb a:active { display: block; background-image: none; font-size: 1.3em; text-decoration: none; } -/* REQUIRED LINK STYLES: links are "display:block" by default; if the menu options are split into +/* REQUIRED LINK STYLES: links are "display:block" by default; if the menu options are split into selectable node links and 'next' links, the script floats the node links left and floats the 'next' links to the right */ .fg-menu a:link, .fg-menu a:visited, .fg-menu a:hover, -.fg-menu a:active { float:left; width:92%; padding:.3em 3%; text-decoration:none; outline: 0 !important; } +.fg-menu a:active { float: left; width: 92%; padding: .3em 3%; text-decoration: none; outline: 0 !important; } .fg-menu a { border: 1px dashed transparent; } @@ -84,21 +95,22 @@ Date: September 2008 .fg-menu a.ui-state-hover:visited, .fg-menu a.ui-state-hover:hover, .fg-menu a.ui-state-hover:active, - .fg-menu a.ui-state-active:link, - .fg-menu a.ui-state-active:visited, - .fg-menu a.ui-state-active:hover, +.fg-menu a.ui-state-active:link, +.fg-menu a.ui-state-active:visited, +.fg-menu a.ui-state-active:hover, .fg-menu a.ui-state-active:active { border-style: solid; font-weight: normal; } -.fg-menu a span { display:block; cursor:pointer; } +.fg-menu a span { display: block; cursor: pointer; } - /* SUGGESTED STYLES - for use with jQuery UI Themeroller CSS */ - -.fg-menu-indicator span { float:left; } -.fg-menu-indicator span.ui-icon { float:right; } +/* SUGGESTED STYLES - for use with jQuery UI Themeroller CSS */ -.fg-menu-content.ui-widget-content, -.fg-menu-content ul.ui-widget-content { border:0; } +.fg-menu-indicator span { float: left; } + +.fg-menu-indicator span.ui-icon { float: right; } + +.fg-menu-content.ui-widget-content, +.fg-menu-content ul.ui-widget-content { border: 0; } /* ICONS AND DIVIDERS */ @@ -106,9 +118,11 @@ Date: September 2008 .fg-menu.fg-menu-has-icons a:link, .fg-menu.fg-menu-has-icons a:visited, .fg-menu.fg-menu-has-icons a:hover, -.fg-menu.fg-menu-has-icons a:active { padding-left:20px; } +.fg-menu.fg-menu-has-icons a:active { padding-left: 20px; } + +.fg-menu .horizontal-divider hr, .fg-menu .horizontal-divider span { padding: 0; margin: 5px .6em; } + +.fg-menu .horizontal-divider hr { border: 0; height: 1px; } -.fg-menu .horizontal-divider hr, .fg-menu .horizontal-divider span { padding:0; margin:5px .6em; } -.fg-menu .horizontal-divider hr { border:0; height:1px; } -.fg-menu .horizontal-divider span { font-size:.9em; text-transform: uppercase; padding-left:.2em; } +.fg-menu .horizontal-divider span { font-size: .9em; text-transform: uppercase; padding-left: .2em; } diff --git a/freeciv-web/src/main/webapp/css/pregame.css b/freeciv-web/src/main/webapp/css/pregame.css index 83988ff02..247e29fde 100644 --- a/freeciv-web/src/main/webapp/css/pregame.css +++ b/freeciv-web/src/main/webapp/css/pregame.css @@ -1,16 +1,16 @@ -body { - font-family: "lucida grande", tahoma, verdana, arial, sans-serif; - font-size: 14px; - margin: 0px 0px 0px 0px; - background-color: #000000; +body { + font-family: "lucida grande", tahoma, verdana, arial, sans-serif; + font-size: 14px; + margin: 0 0 0 0; + background-color: #000000; } #pregame_page { padding: 10px; - background: url("/images/bg-dark.jpg") repeat scroll 0 0 ; + background: url("/images/bg-dark.jpg") repeat scroll 0 0; width: 97%; - float:left; + float: left; } @@ -45,12 +45,12 @@ body { #pregame_game_info:empty { display: none; - padding: 0px 0px; - border: 0px; + padding: 0 0; + border: 0; } #pregame_game_info:not(:empty) { - background: #111111 url(/images/bg.jpg); + background: #111111 url(/images/bg.jpg); color: #000000; max-height: 15%; width: 78%; @@ -69,26 +69,26 @@ body { padding: 5px 5px; border: 1px solid black; list-style-type: none; - margin: 0px; + margin: 0; } #pregame_player_icon { - background: transparent url(/images/player-icon.png); - width: 24px; - height: 24px; + background: transparent url(/images/player-icon.png); + width: 24px; + height: 24px; margin: 5px; - float:left; - + float: left; + } #pregame_ai_icon { - background: transparent url(/images/ai-icon.png); - width: 24px; - height: 24px; + background: transparent url(/images/ai-icon.png); + width: 24px; + height: 24px; margin: 5px; - float:left; - -} + float: left; + +} #pregame_chat_box { width: 100%; @@ -109,17 +109,17 @@ body { #nation_list { - float: left; - height:590px; - overflow: auto; + float: left; + height: 590px; + overflow: auto; width: 29%; } #nation_legend { - float: left; - height: 500px; - overflow: auto; - padding: 10px; + float: left; + height: 500px; + overflow: auto; + padding: 10px; width: 22%; font-size: 120%; margin-left: 10px; @@ -130,7 +130,7 @@ body { } #nation_flag_choice { - width = 25%; + width: 25%; } #nation_style_choices { @@ -139,30 +139,28 @@ body { height: 590px; overflow: auto; float: left; - background-color: rgba(100,100,100,0.3); + background-color: rgba(100, 100, 100, 0.3); } .nation_choice { - width: 260px; - margin-left: 5px; - cursor:pointer; - cursor:hand; + width: 260px; + margin-left: 5px; + cursor: hand; font-weight: bold; - font-size: 1.1em; + font-size: 1.1em; min-height: 33px; } #nation_autocomplete_box { - width: 210px; - background: #111111 url(/images/bg-dark.jpg); - border:1px solid #000000; + width: 210px; + background: #111111 url(/images/bg-dark.jpg); + border: 1px solid #000000; color: white; } #nation_heading { - padding: 3px; - padding-bottom: 10px; + padding: 3px 3px 10px; width: 100%; } @@ -173,34 +171,34 @@ body { #pregame_buttons { - float:left; + float: left; } #share_icons { - float:left; + float: left; margin-left: 50px; } #savegame_note { - font-style:italic; + font-style: italic; font-size: 70%; } -#selectable .ui-selecting { - background: #228822; +#selectable .ui-selecting { + background: #228822; } -#selectable .ui-selected { - background: #117711; - color: white; +#selectable .ui-selected { + background: #117711; + color: white; } #selectable { list-style-type: none; margin: 0; padding: 0; - width: 100%; + width: 100%; overflow: auto; height: 400px; } diff --git a/freeciv-web/src/main/webapp/css/spectrum.css b/freeciv-web/src/main/webapp/css/spectrum.css index 1d0c883c8..8baa1b6da 100644 --- a/freeciv-web/src/main/webapp/css/spectrum.css +++ b/freeciv-web/src/main/webapp/css/spectrum.css @@ -6,178 +6,188 @@ License: MIT ***/ .sp-container { - position:absolute; - top:0; - left:0; - display:inline-block; - *display: inline; - *zoom: 1; - /* https://github.com/bgrins/spectrum/issues/40 */ - z-index: 9999994; - overflow: hidden; + position: absolute; + top: 0; + left: 0; + display: inline-block; + *display: inline; + *zoom: 1; + /* https://github.com/bgrins/spectrum/issues/40 */ + z-index: 9999994; + overflow: hidden; } + .sp-container.sp-flat { - position: relative; + position: relative; } /* Fix for * { box-sizing: border-box; } */ .sp-container, .sp-container * { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; + box-sizing: content-box; } /* http://ansciath.tumblr.com/post/7347495869/css-aspect-ratio */ .sp-top { - position:relative; + position: relative; width: 100%; - display:inline-block; + display: inline-block; } + .sp-top-inner { - position:absolute; - top:0; - left:0; - bottom:0; - right:0; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; } + .sp-color { - position: absolute; - top:0; - left:0; - bottom:0; - right:20%; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 20%; } + .sp-hue { - position: absolute; - top:0; - right:0; - bottom:0; - left:84%; - height: 100%; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 84%; + height: 100%; } .sp-clear-enabled .sp-hue { - top:33px; - height: 77.5%; + top: 33px; + height: 77.5%; } .sp-fill { - padding-top: 80%; + padding-top: 80%; } + .sp-sat, .sp-val { - position: absolute; - top:0; - left:0; - right:0; - bottom:0; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; } .sp-alpha-enabled .sp-top { - margin-bottom: 18px; + margin-bottom: 18px; } + .sp-alpha-enabled .sp-alpha { - display: block; + display: block; } + .sp-alpha-handle { - position:absolute; - top:-4px; - bottom: -4px; - width: 6px; - left: 50%; - cursor: pointer; - border: 1px solid black; - background: white; - opacity: .8; + position: absolute; + top: -4px; + bottom: -4px; + width: 6px; + left: 50%; + cursor: pointer; + border: 1px solid black; + background: white; + opacity: .8; } + .sp-alpha { - display: none; - position: absolute; - bottom: -14px; - right: 0; - left: 0; - height: 8px; + display: none; + position: absolute; + bottom: -14px; + right: 0; + left: 0; + height: 8px; } + .sp-alpha-inner { - border: solid 1px #333; + border: solid 1px #333; } .sp-clear { - display: none; + display: none; } .sp-clear.sp-clear-display { - background-position: center; + background-position: center; } .sp-clear-enabled .sp-clear { - display: block; - position:absolute; - top:0px; - right:0; - bottom:0; - left:84%; - height: 28px; + display: block; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 84%; + height: 28px; } /* Don't allow text selection */ -.sp-container, .sp-replacer, .sp-preview, .sp-dragger, .sp-slider, .sp-alpha, .sp-clear, .sp-alpha-handle, .sp-container.sp-dragging .sp-input, .sp-container button { - -webkit-user-select:none; - -moz-user-select: -moz-none; - -o-user-select:none; - user-select: none; +.sp-container, .sp-replacer, .sp-preview, .sp-dragger, .sp-slider, .sp-alpha, .sp-clear, .sp-alpha-handle, .sp-container.sp-dragging .sp-input, .sp-container button { + -webkit-user-select: none; + user-select: none; } .sp-container.sp-input-disabled .sp-input-container { - display: none; + display: none; } + .sp-container.sp-buttons-disabled .sp-button-container { - display: none; + display: none; } + .sp-container.sp-palette-buttons-disabled .sp-palette-button-container { - display: none; + display: none; } + .sp-palette-only .sp-picker-container { - display: none; + display: none; } + .sp-palette-disabled .sp-palette-container { - display: none; + display: none; } .sp-initial-disabled .sp-initial { - display: none; + display: none; } /* Gradients for hue, saturation and value instead of images. Not pretty... but it works */ .sp-sat { - background-image: -webkit-gradient(linear, 0 0, 100% 0, from(#FFF), to(rgba(204, 154, 129, 0))); - background-image: -webkit-linear-gradient(left, #FFF, rgba(204, 154, 129, 0)); - background-image: -moz-linear-gradient(left, #fff, rgba(204, 154, 129, 0)); - background-image: -o-linear-gradient(left, #fff, rgba(204, 154, 129, 0)); - background-image: -ms-linear-gradient(left, #fff, rgba(204, 154, 129, 0)); - background-image: linear-gradient(to right, #fff, rgba(204, 154, 129, 0)); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr=#FFFFFFFF, endColorstr=#00CC9A81)"; - filter : progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr='#FFFFFFFF', endColorstr='#00CC9A81'); + background-image: -webkit-gradient(linear, 0 0, 100% 0, from(#FFF), to(rgba(204, 154, 129, 0))); + background-image: -webkit-linear-gradient(left, #FFF, rgba(204, 154, 129, 0)); + background-image: -moz-linear-gradient(left, #fff, rgba(204, 154, 129, 0)); + background-image: -o-linear-gradient(left, #fff, rgba(204, 154, 129, 0)); + background-image: -ms-linear-gradient(left, #fff, rgba(204, 154, 129, 0)); + background-image: linear-gradient(to right, #fff, rgba(204, 154, 129, 0)); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr=#FFFFFFFF, endColorstr=#00CC9A81)"; + filter: progid:DXImageTransform.Microsoft.gradient(GradientType=1, startColorstr='#FFFFFFFF', endColorstr='#00CC9A81'); } + .sp-val { - background-image: -webkit-gradient(linear, 0 100%, 0 0, from(#000000), to(rgba(204, 154, 129, 0))); - background-image: -webkit-linear-gradient(bottom, #000000, rgba(204, 154, 129, 0)); - background-image: -moz-linear-gradient(bottom, #000, rgba(204, 154, 129, 0)); - background-image: -o-linear-gradient(bottom, #000, rgba(204, 154, 129, 0)); - background-image: -ms-linear-gradient(bottom, #000, rgba(204, 154, 129, 0)); - background-image: linear-gradient(to top, #000, rgba(204, 154, 129, 0)); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#00CC9A81, endColorstr=#FF000000)"; - filter : progid:DXImageTransform.Microsoft.gradient(startColorstr='#00CC9A81', endColorstr='#FF000000'); + background-image: -webkit-gradient(linear, 0 100%, 0 0, from(#000000), to(rgba(204, 154, 129, 0))); + background-image: -webkit-linear-gradient(bottom, #000000, rgba(204, 154, 129, 0)); + background-image: -moz-linear-gradient(bottom, #000, rgba(204, 154, 129, 0)); + background-image: -o-linear-gradient(bottom, #000, rgba(204, 154, 129, 0)); + background-image: -ms-linear-gradient(bottom, #000, rgba(204, 154, 129, 0)); + background-image: linear-gradient(to top, #000, rgba(204, 154, 129, 0)); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#00CC9A81, endColorstr=#FF000000)"; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00CC9A81', endColorstr='#FF000000'); } .sp-hue { - background: -moz-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); - background: -ms-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); - background: -o-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); - background: -webkit-gradient(linear, left top, left bottom, from(#ff0000), color-stop(0.17, #ffff00), color-stop(0.33, #00ff00), color-stop(0.5, #00ffff), color-stop(0.67, #0000ff), color-stop(0.83, #ff00ff), to(#ff0000)); - background: -webkit-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); - background: linear-gradient(to bottom, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); + background: -moz-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); + background: -ms-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); + background: -o-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); + background: -webkit-gradient(linear, left top, left bottom, from(#ff0000), color-stop(0.17, #ffff00), color-stop(0.33, #00ff00), color-stop(0.5, #00ffff), color-stop(0.67, #0000ff), color-stop(0.83, #ff00ff), to(#ff0000)); + background: -webkit-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); + background: linear-gradient(to bottom, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); } /* IE filters do not support multiple color stops. @@ -185,66 +195,77 @@ License: MIT Yes, really. */ .sp-1 { - height:17%; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0000', endColorstr='#ffff00'); + height: 17%; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0000', endColorstr='#ffff00'); } + .sp-2 { - height:16%; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff00', endColorstr='#00ff00'); + height: 16%; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff00', endColorstr='#00ff00'); } + .sp-3 { - height:17%; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ff00', endColorstr='#00ffff'); + height: 17%; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ff00', endColorstr='#00ffff'); } + .sp-4 { - height:17%; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ffff', endColorstr='#0000ff'); + height: 17%; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ffff', endColorstr='#0000ff'); } + .sp-5 { - height:16%; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0000ff', endColorstr='#ff00ff'); + height: 16%; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0000ff', endColorstr='#ff00ff'); } + .sp-6 { - height:17%; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff00ff', endColorstr='#ff0000'); + height: 17%; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff00ff', endColorstr='#ff0000'); } .sp-hidden { - display: none !important; + display: none !important; } /* Clearfix hack */ .sp-cf:before, .sp-cf:after { content: ""; display: table; } + .sp-cf:after { clear: both; } + .sp-cf { *zoom: 1; } /* Mobile devices, make hue slider bigger so it is easier to slide */ @media (max-device-width: 480px) { - .sp-color { right: 40%; } - .sp-hue { left: 63%; } - .sp-fill { padding-top: 60%; } + .sp-color { right: 40%; } + + .sp-hue { left: 63%; } + + .sp-fill { padding-top: 60%; } } + .sp-dragger { - border-radius: 5px; - height: 5px; - width: 5px; - border: 1px solid #fff; - background: #000; - cursor: pointer; - position:absolute; - top:0; - left: 0; + border-radius: 5px; + height: 5px; + width: 5px; + border: 1px solid #fff; + background: #000; + cursor: pointer; + position: absolute; + top: 0; + left: 0; } + .sp-slider { - position: absolute; - top:0; - cursor:pointer; - height: 3px; - left: -1px; - right: -1px; - border: 1px solid #000; - background: white; - opacity: .8; + position: absolute; + top: 0; + cursor: pointer; + height: 3px; + left: -1px; + right: -1px; + border: 1px solid #000; + background: white; + opacity: .8; } /* @@ -254,176 +275,184 @@ See http://bgrins.github.io/spectrum/themes/ for instructions. */ .sp-container { - border-radius: 0; - background-color: #ECECEC; - border: solid 1px #f0c49B; - padding: 0; + border-radius: 0; + background-color: #ECECEC; + border: solid 1px #f0c49B; + padding: 0; } + .sp-container, .sp-container button, .sp-container input, .sp-color, .sp-hue, .sp-clear { - font: normal 12px "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Verdana, sans-serif; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; + font: normal 12px "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Verdana, sans-serif; + box-sizing: border-box; } + .sp-top { - margin-bottom: 3px; + margin-bottom: 3px; } + .sp-color, .sp-hue, .sp-clear { - border: solid 1px #666; + border: solid 1px #666; } /* Input */ .sp-input-container { - float:right; - width: 100px; - margin-bottom: 4px; + float: right; + width: 100px; + margin-bottom: 4px; } -.sp-initial-disabled .sp-input-container { - width: 100%; + +.sp-initial-disabled .sp-input-container { + width: 100%; } + .sp-input { - font-size: 12px !important; - border: 1px inset; - padding: 4px 5px; - margin: 0; - width: 100%; - background:transparent; - border-radius: 3px; - color: #222; -} -.sp-input:focus { - border: 1px solid orange; + font-size: 12px !important; + border: 1px inset; + padding: 4px 5px; + margin: 0; + width: 100%; + background: transparent; + border-radius: 3px; + color: #222; +} + +.sp-input:focus { + border: 1px solid orange; } + .sp-input.sp-validation-error { - border: 1px solid red; - background: #fdd; + border: 1px solid red; + background: #fdd; } -.sp-picker-container , .sp-palette-container { - float:left; - position: relative; - padding: 10px; - padding-bottom: 300px; - margin-bottom: -290px; + +.sp-picker-container, .sp-palette-container { + float: left; + position: relative; + padding: 10px 10px 300px; + margin-bottom: -290px; } + .sp-picker-container { - width: 172px; - border-left: solid 1px #fff; + width: 172px; + border-left: solid 1px #fff; } /* Palettes */ .sp-palette-container { - border-right: solid 1px #ccc; + border-right: solid 1px #ccc; } .sp-palette-only .sp-palette-container { - border: 0; + border: 0; } .sp-palette .sp-thumb-el { - display: block; - position:relative; - float:left; - width: 24px; - height: 15px; - margin: 3px; - cursor: pointer; - border:solid 2px transparent; + display: block; + position: relative; + float: left; + width: 24px; + height: 15px; + margin: 3px; + cursor: pointer; + border: solid 2px transparent; } + .sp-palette .sp-thumb-el:hover, .sp-palette .sp-thumb-el.sp-thumb-active { - border-color: orange; + border-color: orange; } + .sp-thumb-el { - position:relative; + position: relative; } /* Initial */ .sp-initial { - float: left; - border: solid 1px #333; + float: left; + border: solid 1px #333; } + .sp-initial span { - width: 30px; - height: 25px; - border:none; - display:block; - float:left; - margin:0; + width: 30px; + height: 25px; + border: none; + display: block; + float: left; + margin: 0; } .sp-initial .sp-clear-display { - background-position: center; + background-position: center; } /* Buttons */ .sp-palette-button-container, .sp-button-container { - float: right; + float: right; } /* Replacer (the little preview div that shows up instead of the ) */ .sp-replacer { - margin:0; - overflow:hidden; - cursor:pointer; - padding: 4px; - display:inline-block; - *zoom: 1; - *display: inline; - border: solid 1px #91765d; - background: #eee; - color: #333; - vertical-align: middle; + margin: 0; + overflow: hidden; + cursor: pointer; + padding: 4px; + display: inline-block; + *zoom: 1; + *display: inline; + border: solid 1px #91765d; + background: #eee; + color: #333; + vertical-align: middle; } + .sp-replacer:hover, .sp-replacer.sp-active { - border-color: #F0C49B; - color: #111; + border-color: #F0C49B; + color: #111; } + .sp-replacer.sp-disabled { - cursor:default; - border-color: silver; - color: silver; + cursor: default; + border-color: silver; + color: silver; } + .sp-dd { - padding: 2px 0; - height: 16px; - line-height: 16px; - float:left; - font-size:10px; + padding: 2px 0; + height: 16px; + line-height: 16px; + float: left; + font-size: 10px; } + .sp-preview { - position:relative; - width:25px; - height: 20px; - border: solid 1px #222; - margin-right: 5px; - float:left; - z-index: 0; + position: relative; + width: 25px; + height: 20px; + border: solid 1px #222; + margin-right: 5px; + float: left; + z-index: 0; } .sp-palette { - *width: 220px; - max-width: 220px; + *width: 220px; + max-width: 220px; } + .sp-palette .sp-thumb-el { - width:16px; - height: 16px; - margin:2px 1px; - border: solid 1px #d0d0d0; + width: 16px; + height: 16px; + margin: 2px 1px; + border: solid 1px #d0d0d0; } .sp-container { - padding-bottom:0; + padding-bottom: 0; } /* Buttons: http://hellohappy.org/css3-buttons/ */ .sp-container button { - background-color: #eeeeee; - background-image: -webkit-linear-gradient(top, #eeeeee, #cccccc); - background-image: -moz-linear-gradient(top, #eeeeee, #cccccc); - background-image: -ms-linear-gradient(top, #eeeeee, #cccccc); - background-image: -o-linear-gradient(top, #eeeeee, #cccccc); background-image: linear-gradient(to bottom, #eeeeee, #cccccc); border: 1px solid #ccc; border-bottom: 1px solid #bbb; @@ -436,72 +465,67 @@ See http://bgrins.github.io/spectrum/themes/ for instructions. text-shadow: 0 1px 0 #eee; vertical-align: middle; } + .sp-container button:hover { - background-color: #dddddd; - background-image: -webkit-linear-gradient(top, #dddddd, #bbbbbb); - background-image: -moz-linear-gradient(top, #dddddd, #bbbbbb); - background-image: -ms-linear-gradient(top, #dddddd, #bbbbbb); - background-image: -o-linear-gradient(top, #dddddd, #bbbbbb); - background-image: linear-gradient(to bottom, #dddddd, #bbbbbb); - border: 1px solid #bbb; - border-bottom: 1px solid #999; - cursor: pointer; - text-shadow: 0 1px 0 #ddd; + background-image: linear-gradient(to bottom, #dddddd, #bbbbbb); + border: 1px solid #bbb; + border-bottom: 1px solid #999; + cursor: pointer; + text-shadow: 0 1px 0 #ddd; } + .sp-container button:active { - border: 1px solid #aaa; - border-bottom: 1px solid #888; - -webkit-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; - -moz-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; - -ms-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; - -o-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; - box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; + border: 1px solid #aaa; + border-bottom: 1px solid #888; + box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; } + .sp-cancel { - font-size: 11px; - color: #d93f3f !important; - margin:0; - padding:2px; - margin-right: 5px; - vertical-align: middle; - text-decoration:none; + font-size: 11px; + color: #d93f3f !important; + padding: 2px; + margin: 0 5px 0 0; + vertical-align: middle; + text-decoration: none; } + .sp-cancel:hover { - color: #d93f3f !important; - text-decoration: underline; + color: #d93f3f !important; + text-decoration: underline; } .sp-palette span:hover, .sp-palette span.sp-thumb-active { - border-color: #000; + border-color: #000; } .sp-preview, .sp-alpha, .sp-thumb-el { - position:relative; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==); + position: relative; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==); } + .sp-preview-inner, .sp-alpha-inner, .sp-thumb-inner { - display:block; - position:absolute; - top:0;left:0;bottom:0;right:0; + display: block; + position: absolute; + top: 0;left: 0;bottom: 0;right: 0; } .sp-palette .sp-thumb-inner { - background-position: 50% 50%; - background-repeat: no-repeat; + background-position: 50% 50%; + background-repeat: no-repeat; } .sp-palette .sp-thumb-light.sp-thumb-active .sp-thumb-inner { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIVJREFUeNpiYBhsgJFMffxAXABlN5JruT4Q3wfi/0DsT64h8UD8HmpIPCWG/KemIfOJCUB+Aoacx6EGBZyHBqI+WsDCwuQ9mhxeg2A210Ntfo8klk9sOMijaURm7yc1UP2RNCMbKE9ODK1HM6iegYLkfx8pligC9lCD7KmRof0ZhjQACDAAceovrtpVBRkAAAAASUVORK5CYII=); + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIVJREFUeNpiYBhsgJFMffxAXABlN5JruT4Q3wfi/0DsT64h8UD8HmpIPCWG/KemIfOJCUB+Aoacx6EGBZyHBqI+WsDCwuQ9mhxeg2A210Ntfo8klk9sOMijaURm7yc1UP2RNCMbKE9ODK1HM6iegYLkfx8pligC9lCD7KmRof0ZhjQACDAAceovrtpVBRkAAAAASUVORK5CYII=); } .sp-palette .sp-thumb-dark.sp-thumb-active .sp-thumb-inner { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAMdJREFUOE+tkgsNwzAMRMugEAahEAahEAZhEAqlEAZhEAohEAYh81X2dIm8fKpEspLGvudPOsUYpxE2BIJCroJmEW9qJ+MKaBFhEMNabSy9oIcIPwrB+afvAUFoK4H0tMaQ3XtlrggDhOVVMuT4E5MMG0FBbCEYzjYT7OxLEvIHQLY2zWwQ3D+9luyOQTfKDiFD3iUIfPk8VqrKjgAiSfGFPecrg6HN6m/iBcwiDAo7WiBeawa+Kwh7tZoSCGLMqwlSAzVDhoK+6vH4G0P5wdkAAAAASUVORK5CYII=); + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAMdJREFUOE+tkgsNwzAMRMugEAahEAahEAZhEAqlEAZhEAohEAYh81X2dIm8fKpEspLGvudPOsUYpxE2BIJCroJmEW9qJ+MKaBFhEMNabSy9oIcIPwrB+afvAUFoK4H0tMaQ3XtlrggDhOVVMuT4E5MMG0FBbCEYzjYT7OxLEvIHQLY2zWwQ3D+9luyOQTfKDiFD3iUIfPk8VqrKjgAiSfGFPecrg6HN6m/iBcwiDAo7WiBeawa+Kwh7tZoSCGLMqwlSAzVDhoK+6vH4G0P5wdkAAAAASUVORK5CYII=); } .sp-clear-display { - background-repeat:no-repeat; - background-position: center; - background-image: url(data:image/gif;base64,R0lGODlhFAAUAPcAAAAAAJmZmZ2dnZ6enqKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq/Hx8fLy8vT09PX19ff39/j4+Pn5+fr6+vv7+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAUABQAAAihAP9FoPCvoMGDBy08+EdhQAIJCCMybCDAAYUEARBAlFiQQoMABQhKUJBxY0SPICEYHBnggEmDKAuoPMjS5cGYMxHW3IiT478JJA8M/CjTZ0GgLRekNGpwAsYABHIypcAgQMsITDtWJYBR6NSqMico9cqR6tKfY7GeBCuVwlipDNmefAtTrkSzB1RaIAoXodsABiZAEFB06gIBWC1mLVgBa0AAOw==); + background-repeat: no-repeat; + background-position: center; + background-image: url(data:image/gif;base64,R0lGODlhFAAUAPcAAAAAAJmZmZ2dnZ6enqKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq/Hx8fLy8vT09PX19ff39/j4+Pn5+fr6+vv7+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAUABQAAAihAP9FoPCvoMGDBy08+EdhQAIJCCMybCDAAYUEARBAlFiQQoMABQhKUJBxY0SPICEYHBnggEmDKAuoPMjS5cGYMxHW3IiT478JJA8M/CjTZ0GgLRekNGpwAsYABHIypcAgQMsITDtWJYBR6NSqMico9cqR6tKfY7GeBCuVwlipDNmefAtTrkSzB1RaIAoXodsABiZAEFB06gIBWC1mLVgBa0AAOw==); } diff --git a/freeciv-web/src/main/webapp/css/sweetalert.css b/freeciv-web/src/main/webapp/css/sweetalert.css index 76f159d7f..b3d4bfdac 100644 --- a/freeciv-web/src/main/webapp/css/sweetalert.css +++ b/freeciv-web/src/main/webapp/css/sweetalert.css @@ -3,10 +3,6 @@ body.stop-scrolling { overflow: hidden; } .sweet-overlay { - background-color: black; - /* IE8 */ - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; - /* IE8 */ background-color: rgba(0, 0, 0, 0.4); position: fixed; left: 0; @@ -31,489 +27,456 @@ body.stop-scrolling { overflow: hidden; display: none; z-index: 99999; } - @media all and (max-width: 540px) { - .sweet-alert { - width: auto; - margin-left: 0; - margin-right: 0; - left: 15px; - right: 15px; } } - .sweet-alert h2 { - color: #575757; - font-size: 30px; - text-align: center; - font-weight: 600; - text-transform: none; - position: relative; - margin: 25px 0; - padding: 0; - line-height: 40px; - display: block; } - .sweet-alert p { - color: #797979; - font-size: 16px; - text-align: center; - font-weight: 300; - position: relative; - text-align: inherit; - float: none; - margin: 0; - padding: 0; - line-height: normal; } - .sweet-alert fieldset { - border: none; - position: relative; } - .sweet-alert .sa-error-container { - background-color: #f1f1f1; - margin-left: -17px; - margin-right: -17px; - overflow: hidden; - padding: 0 10px; - max-height: 0; - webkit-transition: padding 0.15s, max-height 0.15s; - transition: padding 0.15s, max-height 0.15s; } - .sweet-alert .sa-error-container.show { - padding: 10px 0; - max-height: 100px; - webkit-transition: padding 0.2s, max-height 0.2s; - transition: padding 0.25s, max-height 0.25s; } - .sweet-alert .sa-error-container .icon { - display: inline-block; - width: 24px; - height: 24px; - border-radius: 50%; - background-color: #ea7d7d; - color: white; - line-height: 24px; - text-align: center; - margin-right: 3px; } - .sweet-alert .sa-error-container p { - display: inline-block; } - .sweet-alert .sa-input-error { - position: absolute; - top: 29px; - right: 26px; - width: 20px; - height: 20px; - opacity: 0; - -webkit-transform: scale(0.5); - transform: scale(0.5); - -webkit-transform-origin: 50% 50%; - transform-origin: 50% 50%; - -webkit-transition: all 0.1s; - transition: all 0.1s; } - .sweet-alert .sa-input-error::before, .sweet-alert .sa-input-error::after { - content: ""; - width: 20px; - height: 6px; - background-color: #f06e57; - border-radius: 3px; - position: absolute; - top: 50%; - margin-top: -4px; - left: 50%; - margin-left: -9px; } - .sweet-alert .sa-input-error::before { - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); } - .sweet-alert .sa-input-error::after { - -webkit-transform: rotate(45deg); - transform: rotate(45deg); } - .sweet-alert .sa-input-error.show { - opacity: 1; - -webkit-transform: scale(1); - transform: scale(1); } - .sweet-alert input { - width: 100%; - box-sizing: border-box; - border-radius: 3px; - border: 1px solid #d7d7d7; - height: 43px; - margin-top: 10px; - margin-bottom: 17px; - font-size: 18px; - box-shadow: inset 0px 1px 1px rgba(0, 0, 0, 0.06); - padding: 0 12px; - display: none; - -webkit-transition: all 0.3s; - transition: all 0.3s; } - .sweet-alert input:focus { - outline: none; - box-shadow: 0px 0px 3px #c4e6f5; - border: 1px solid #b4dbed; } - .sweet-alert input:focus::-moz-placeholder { - transition: opacity 0.3s 0.03s ease; - opacity: 0.5; } - .sweet-alert input:focus:-ms-input-placeholder { - transition: opacity 0.3s 0.03s ease; - opacity: 0.5; } - .sweet-alert input:focus::-webkit-input-placeholder { - transition: opacity 0.3s 0.03s ease; - opacity: 0.5; } - .sweet-alert input::-moz-placeholder { - color: #bdbdbd; } - .sweet-alert input:-ms-input-placeholder { - color: #bdbdbd; } - .sweet-alert input::-webkit-input-placeholder { - color: #bdbdbd; } - .sweet-alert.show-input input { - display: block; } - .sweet-alert .sa-confirm-button-container { - display: inline-block; - position: relative; } - .sweet-alert .la-ball-fall { - position: absolute; - left: 50%; - top: 50%; - margin-left: -27px; - margin-top: 4px; - opacity: 0; - visibility: hidden; } - .sweet-alert button { - background-color: #8CD4F5; - color: white; - border: none; - box-shadow: none; - font-size: 17px; - font-weight: 500; - -webkit-border-radius: 4px; - border-radius: 5px; - padding: 10px 32px; - margin: 26px 5px 0 5px; - cursor: pointer; } - .sweet-alert button:focus { - outline: none; - box-shadow: 0 0 2px rgba(128, 179, 235, 0.5), inset 0 0 0 1px rgba(0, 0, 0, 0.05); } - .sweet-alert button:hover { - background-color: #7ecff4; } - .sweet-alert button:active { - background-color: #5dc2f1; } - .sweet-alert button.cancel { - background-color: #C1C1C1; } - .sweet-alert button.cancel:hover { - background-color: #b9b9b9; } - .sweet-alert button.cancel:active { - background-color: #a8a8a8; } - .sweet-alert button.cancel:focus { - box-shadow: rgba(197, 205, 211, 0.8) 0px 0px 2px, rgba(0, 0, 0, 0.0470588) 0px 0px 0px 1px inset !important; } - .sweet-alert button[disabled] { - opacity: .6; - cursor: default; } - .sweet-alert button.confirm[disabled] { - color: transparent; } - .sweet-alert button.confirm[disabled] ~ .la-ball-fall { - opacity: 1; - visibility: visible; - transition-delay: 0s; } - .sweet-alert button::-moz-focus-inner { - border: 0; } - .sweet-alert[data-has-cancel-button=false] button { - box-shadow: none !important; } - .sweet-alert[data-has-confirm-button=false][data-has-cancel-button=false] { - padding-bottom: 40px; } - .sweet-alert .sa-icon { - width: 80px; - height: 80px; - border: 4px solid gray; - -webkit-border-radius: 40px; - border-radius: 40px; - border-radius: 50%; - margin: 20px auto; - padding: 0; - position: relative; - box-sizing: content-box; } - .sweet-alert .sa-icon.sa-error { - border-color: #F27474; } - .sweet-alert .sa-icon.sa-error .sa-x-mark { - position: relative; - display: block; } - .sweet-alert .sa-icon.sa-error .sa-line { - position: absolute; - height: 5px; - width: 47px; - background-color: #F27474; - display: block; - top: 37px; - border-radius: 2px; } - .sweet-alert .sa-icon.sa-error .sa-line.sa-left { - -webkit-transform: rotate(45deg); - transform: rotate(45deg); - left: 17px; } - .sweet-alert .sa-icon.sa-error .sa-line.sa-right { - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); - right: 16px; } - .sweet-alert .sa-icon.sa-warning { - border-color: #F8BB86; } - .sweet-alert .sa-icon.sa-warning .sa-body { - position: absolute; - width: 5px; - height: 47px; - left: 50%; - top: 10px; - -webkit-border-radius: 2px; - border-radius: 2px; - margin-left: -2px; - background-color: #F8BB86; } - .sweet-alert .sa-icon.sa-warning .sa-dot { - position: absolute; - width: 7px; - height: 7px; - -webkit-border-radius: 50%; - border-radius: 50%; - margin-left: -3px; - left: 50%; - bottom: 10px; - background-color: #F8BB86; } - .sweet-alert .sa-icon.sa-info { - border-color: #C9DAE1; } - .sweet-alert .sa-icon.sa-info::before { - content: ""; - position: absolute; - width: 5px; - height: 29px; - left: 50%; - bottom: 17px; - border-radius: 2px; - margin-left: -2px; - background-color: #C9DAE1; } - .sweet-alert .sa-icon.sa-info::after { - content: ""; - position: absolute; - width: 7px; - height: 7px; - border-radius: 50%; - margin-left: -3px; - top: 19px; - background-color: #C9DAE1; } - .sweet-alert .sa-icon.sa-success { - border-color: #A5DC86; } - .sweet-alert .sa-icon.sa-success::before, .sweet-alert .sa-icon.sa-success::after { - content: ''; - -webkit-border-radius: 40px; - border-radius: 40px; - border-radius: 50%; - position: absolute; - width: 60px; - height: 120px; - background: white; - -webkit-transform: rotate(45deg); - transform: rotate(45deg); } - .sweet-alert .sa-icon.sa-success::before { - -webkit-border-radius: 120px 0 0 120px; - border-radius: 120px 0 0 120px; - top: -7px; - left: -33px; - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); - -webkit-transform-origin: 60px 60px; - transform-origin: 60px 60px; } - .sweet-alert .sa-icon.sa-success::after { - -webkit-border-radius: 0 120px 120px 0; - border-radius: 0 120px 120px 0; - top: -11px; - left: 30px; - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); - -webkit-transform-origin: 0px 60px; - transform-origin: 0px 60px; } - .sweet-alert .sa-icon.sa-success .sa-placeholder { - width: 80px; - height: 80px; - border: 4px solid rgba(165, 220, 134, 0.2); - -webkit-border-radius: 40px; - border-radius: 40px; - border-radius: 50%; - box-sizing: content-box; - position: absolute; - left: -4px; - top: -4px; - z-index: 2; } - .sweet-alert .sa-icon.sa-success .sa-fix { - width: 5px; - height: 90px; - background-color: white; - position: absolute; - left: 28px; - top: 8px; - z-index: 1; - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); } - .sweet-alert .sa-icon.sa-success .sa-line { - height: 5px; - background-color: #A5DC86; - display: block; - border-radius: 2px; - position: absolute; - z-index: 2; } - .sweet-alert .sa-icon.sa-success .sa-line.sa-tip { - width: 25px; - left: 14px; - top: 46px; - -webkit-transform: rotate(45deg); - transform: rotate(45deg); } - .sweet-alert .sa-icon.sa-success .sa-line.sa-long { - width: 47px; - right: 8px; - top: 38px; - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); } - .sweet-alert .sa-icon.sa-custom { - background-size: contain; - border-radius: 0; - border: none; - background-position: center center; - background-repeat: no-repeat; } + +@media all and (max-width: 540px) { + .sweet-alert { + width: auto; + margin-left: 0; + margin-right: 0; + left: 15px; + right: 15px; } +} + +.sweet-alert h2 { + color: #575757; + font-size: 30px; + text-align: center; + font-weight: 600; + text-transform: none; + position: relative; + margin: 25px 0; + padding: 0; + line-height: 40px; + display: block; } + +.sweet-alert p { + color: #797979; + font-size: 16px; + font-weight: 300; + position: relative; + text-align: inherit; + float: none; + margin: 0; + padding: 0; + line-height: normal; } + +.sweet-alert fieldset { + border: none; + position: relative; } + +.sweet-alert .sa-error-container { + background-color: #f1f1f1; + margin-left: -17px; + margin-right: -17px; + overflow: hidden; + padding: 0 10px; + max-height: 0; + transition: padding 0.15s, max-height 0.15s; } + +.sweet-alert .sa-error-container.show { + padding: 10px 0; + max-height: 100px; + transition: padding 0.25s, max-height 0.25s; } + +.sweet-alert .sa-error-container .icon { + display: inline-block; + width: 24px; + height: 24px; + border-radius: 50%; + background-color: #ea7d7d; + color: white; + line-height: 24px; + text-align: center; + margin-right: 3px; } + +.sweet-alert .sa-error-container p { + display: inline-block; } + +.sweet-alert .sa-input-error { + position: absolute; + top: 29px; + right: 26px; + width: 20px; + height: 20px; + opacity: 0; + transform: scale(0.5); + -webkit-transform-origin: 50% 50%; + transform-origin: 50% 50%; + -webkit-transition: all 0.1s; + transition: all 0.1s; } + +.sweet-alert .sa-input-error::before, .sweet-alert .sa-input-error::after { + content: ""; + width: 20px; + height: 6px; + background-color: #f06e57; + border-radius: 3px; + position: absolute; + top: 50%; + margin-top: -4px; + left: 50%; + margin-left: -9px; } + +.sweet-alert .sa-input-error::before { + transform: rotate(-45deg); } + +.sweet-alert .sa-input-error::after { + transform: rotate(45deg); } + +.sweet-alert .sa-input-error.show { + opacity: 1; + transform: scale(1); } + +.sweet-alert input { + width: 100%; + box-sizing: border-box; + border-radius: 3px; + border: 1px solid #d7d7d7; + height: 43px; + margin-top: 10px; + margin-bottom: 17px; + font-size: 18px; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06); + padding: 0 12px; + display: none; + -webkit-transition: all 0.3s; + transition: all 0.3s; } + +.sweet-alert input:focus { + outline: none; + box-shadow: 0 0 3px #c4e6f5; + border: 1px solid #b4dbed; } + +.sweet-alert input:focus::-moz-placeholder { + transition: opacity 0.3s 0.03s ease; + opacity: 0.5; } + +.sweet-alert input:focus:-ms-input-placeholder { + transition: opacity 0.3s 0.03s ease; + opacity: 0.5; } + +.sweet-alert input:focus::-webkit-input-placeholder { + transition: opacity 0.3s 0.03s ease; + opacity: 0.5; } + +.sweet-alert input::-moz-placeholder { + color: #bdbdbd; } + +.sweet-alert input:-ms-input-placeholder { + color: #bdbdbd; } + +.sweet-alert input::-webkit-input-placeholder { + color: #bdbdbd; } + +.sweet-alert.show-input input { + display: block; } + +.sweet-alert .sa-confirm-button-container { + display: inline-block; + position: relative; } + +.sweet-alert .la-ball-fall { + position: absolute; + left: 50%; + top: 50%; + margin-left: -27px; + margin-top: 4px; + opacity: 0; + visibility: hidden; } + +.sweet-alert button { + background-color: #8CD4F5; + color: white; + border: none; + box-shadow: none; + font-size: 17px; + font-weight: 500; + -webkit-border-radius: 4px; + border-radius: 5px; + padding: 10px 32px; + margin: 26px 5px 0 5px; + cursor: pointer; } + +.sweet-alert button:focus { + outline: none; + box-shadow: 0 0 2px rgba(128, 179, 235, 0.5), inset 0 0 0 1px rgba(0, 0, 0, 0.05); } + +.sweet-alert button:hover { + background-color: #7ecff4; } + +.sweet-alert button:active { + background-color: #5dc2f1; } + +.sweet-alert button.cancel { + background-color: #C1C1C1; } + +.sweet-alert button.cancel:hover { + background-color: #b9b9b9; } + +.sweet-alert button.cancel:active { + background-color: #a8a8a8; } + +.sweet-alert button.cancel:focus { + box-shadow: rgba(197, 205, 211, 0.8) 0 0 2px, rgba(0, 0, 0, 0.0470588) 0 0 0 1px inset !important; } + +.sweet-alert button[disabled] { + opacity: .6; + cursor: default; } + +.sweet-alert button.confirm[disabled] { + color: transparent; } + +.sweet-alert button.confirm[disabled] ~ .la-ball-fall { + opacity: 1; + visibility: visible; + transition-delay: 0s; } + +.sweet-alert button::-moz-focus-inner { + border: 0; } + +.sweet-alert[data-has-cancel-button=false] button { + box-shadow: none !important; } + +.sweet-alert[data-has-confirm-button=false][data-has-cancel-button=false] { + padding-bottom: 40px; } + +.sweet-alert .sa-icon { + width: 80px; + height: 80px; + border: 4px solid gray; + -webkit-border-radius: 40px; + border-radius: 50%; + margin: 20px auto; + padding: 0; + position: relative; + box-sizing: content-box; } + +.sweet-alert .sa-icon.sa-error { + border-color: #F27474; } + +.sweet-alert .sa-icon.sa-error .sa-x-mark { + position: relative; + display: block; } + +.sweet-alert .sa-icon.sa-error .sa-line { + position: absolute; + height: 5px; + width: 47px; + background-color: #F27474; + display: block; + top: 37px; + border-radius: 2px; } + +.sweet-alert .sa-icon.sa-error .sa-line.sa-left { + transform: rotate(45deg); + left: 17px; } + +.sweet-alert .sa-icon.sa-error .sa-line.sa-right { + transform: rotate(-45deg); + right: 16px; } + +.sweet-alert .sa-icon.sa-warning { + border-color: #F8BB86; } + +.sweet-alert .sa-icon.sa-warning .sa-body { + position: absolute; + width: 5px; + height: 47px; + left: 50%; + top: 10px; + -webkit-border-radius: 2px; + border-radius: 2px; + margin-left: -2px; + background-color: #F8BB86; } + +.sweet-alert .sa-icon.sa-warning .sa-dot { + position: absolute; + width: 7px; + height: 7px; + -webkit-border-radius: 50%; + border-radius: 50%; + margin-left: -3px; + left: 50%; + bottom: 10px; + background-color: #F8BB86; } + +.sweet-alert .sa-icon.sa-info { + border-color: #C9DAE1; } + +.sweet-alert .sa-icon.sa-info::before { + content: ""; + position: absolute; + width: 5px; + height: 29px; + left: 50%; + bottom: 17px; + border-radius: 2px; + margin-left: -2px; + background-color: #C9DAE1; } + +.sweet-alert .sa-icon.sa-info::after { + content: ""; + position: absolute; + width: 7px; + height: 7px; + border-radius: 50%; + margin-left: -3px; + top: 19px; + background-color: #C9DAE1; } + +.sweet-alert .sa-icon.sa-success { + border-color: #A5DC86; } + +.sweet-alert .sa-icon.sa-success::before, .sweet-alert .sa-icon.sa-success::after { + content: ''; + -webkit-border-radius: 40px; + border-radius: 50%; + position: absolute; + width: 60px; + height: 120px; + background: white; + transform: rotate(45deg); } + +.sweet-alert .sa-icon.sa-success::before { + -webkit-border-radius: 120px 0 0 120px; + border-radius: 120px 0 0 120px; + top: -7px; + left: -33px; + transform: rotate(-45deg); + -webkit-transform-origin: 60px 60px; + transform-origin: 60px 60px; } + +.sweet-alert .sa-icon.sa-success::after { + -webkit-border-radius: 0 120px 120px 0; + border-radius: 0 120px 120px 0; + top: -11px; + left: 30px; + transform: rotate(-45deg); + -webkit-transform-origin: 0 60px; + transform-origin: 0 60px; } + +.sweet-alert .sa-icon.sa-success .sa-placeholder { + width: 80px; + height: 80px; + border: 4px solid rgba(165, 220, 134, 0.2); + -webkit-border-radius: 40px; + border-radius: 50%; + box-sizing: content-box; + position: absolute; + left: -4px; + top: -4px; + z-index: 2; } + +.sweet-alert .sa-icon.sa-success .sa-fix { + width: 5px; + height: 90px; + background-color: white; + position: absolute; + left: 28px; + top: 8px; + z-index: 1; + transform: rotate(-45deg); } + +.sweet-alert .sa-icon.sa-success .sa-line { + height: 5px; + background-color: #A5DC86; + display: block; + border-radius: 2px; + position: absolute; + z-index: 2; } + +.sweet-alert .sa-icon.sa-success .sa-line.sa-tip { + width: 25px; + left: 14px; + top: 46px; + transform: rotate(45deg); } + +.sweet-alert .sa-icon.sa-success .sa-line.sa-long { + width: 47px; + right: 8px; + top: 38px; + transform: rotate(-45deg); } + +.sweet-alert .sa-icon.sa-custom { + background-size: contain; + border-radius: 0; + border: none; + background-position: center center; + background-repeat: no-repeat; } /* * Animations */ -@-webkit-keyframes showSweetAlert { - 0% { - transform: scale(0.7); - -webkit-transform: scale(0.7); } - 45% { - transform: scale(1.05); - -webkit-transform: scale(1.05); } - 80% { - transform: scale(0.95); - -webkit-transform: scale(0.95); } - 100% { - transform: scale(1); - -webkit-transform: scale(1); } } - @keyframes showSweetAlert { 0% { - transform: scale(0.7); - -webkit-transform: scale(0.7); } + transform: scale(0.7); } 45% { - transform: scale(1.05); - -webkit-transform: scale(1.05); } + transform: scale(1.05); } 80% { - transform: scale(0.95); - -webkit-transform: scale(0.95); } + transform: scale(0.95); } 100% { - transform: scale(1); - -webkit-transform: scale(1); } } - -@-webkit-keyframes hideSweetAlert { - 0% { - transform: scale(1); - -webkit-transform: scale(1); } - 100% { - transform: scale(0.5); - -webkit-transform: scale(0.5); } } + transform: scale(1); } +} @keyframes hideSweetAlert { 0% { - transform: scale(1); - -webkit-transform: scale(1); } + transform: scale(1); } 100% { - transform: scale(0.5); - -webkit-transform: scale(0.5); } } - -@-webkit-keyframes slideFromTop { - 0% { - top: 0%; } - 100% { - top: 50%; } } + transform: scale(0.5); } +} @keyframes slideFromTop { 0% { - top: 0%; } + top: 0; } 100% { - top: 50%; } } - -@-webkit-keyframes slideToTop { - 0% { top: 50%; } - 100% { - top: 0%; } } +} @keyframes slideToTop { 0% { top: 50%; } 100% { - top: 0%; } } - -@-webkit-keyframes slideFromBottom { - 0% { - top: 70%; } - 100% { - top: 50%; } } + top: 0; } +} @keyframes slideFromBottom { 0% { top: 70%; } 100% { - top: 50%; } } - -@-webkit-keyframes slideToBottom { - 0% { top: 50%; } - 100% { - top: 70%; } } +} @keyframes slideToBottom { 0% { top: 50%; } 100% { - top: 70%; } } + top: 70%; } +} .showSweetAlert[data-animation=pop] { - -webkit-animation: showSweetAlert 0.3s; animation: showSweetAlert 0.3s; } .showSweetAlert[data-animation=none] { - -webkit-animation: none; animation: none; } .showSweetAlert[data-animation=slide-from-top] { - -webkit-animation: slideFromTop 0.3s; animation: slideFromTop 0.3s; } .showSweetAlert[data-animation=slide-from-bottom] { - -webkit-animation: slideFromBottom 0.3s; animation: slideFromBottom 0.3s; } .hideSweetAlert[data-animation=pop] { - -webkit-animation: hideSweetAlert 0.2s; animation: hideSweetAlert 0.2s; } .hideSweetAlert[data-animation=none] { - -webkit-animation: none; animation: none; } .hideSweetAlert[data-animation=slide-from-top] { - -webkit-animation: slideToTop 0.4s; animation: slideToTop 0.4s; } .hideSweetAlert[data-animation=slide-from-bottom] { - -webkit-animation: slideToBottom 0.3s; animation: slideToBottom 0.3s; } -@-webkit-keyframes animateSuccessTip { - 0% { - width: 0; - left: 1px; - top: 19px; } - 54% { - width: 0; - left: 1px; - top: 19px; } - 70% { - width: 50px; - left: -8px; - top: 37px; } - 84% { - width: 17px; - left: 21px; - top: 48px; } - 100% { - width: 25px; - left: 14px; - top: 45px; } } - @keyframes animateSuccessTip { 0% { width: 0; @@ -534,25 +497,8 @@ body.stop-scrolling { 100% { width: 25px; left: 14px; - top: 45px; } } - -@-webkit-keyframes animateSuccessLong { - 0% { - width: 0; - right: 46px; - top: 54px; } - 65% { - width: 0; - right: 46px; - top: 54px; } - 84% { - width: 55px; - right: 0px; - top: 35px; } - 100% { - width: 47px; - right: 8px; - top: 38px; } } + top: 45px; } +} @keyframes animateSuccessLong { 0% { @@ -565,40 +511,24 @@ body.stop-scrolling { top: 54px; } 84% { width: 55px; - right: 0px; + right: 0; top: 35px; } 100% { width: 47px; right: 8px; - top: 38px; } } - -@-webkit-keyframes rotatePlaceholder { - 0% { - transform: rotate(-45deg); - -webkit-transform: rotate(-45deg); } - 5% { - transform: rotate(-45deg); - -webkit-transform: rotate(-45deg); } - 12% { - transform: rotate(-405deg); - -webkit-transform: rotate(-405deg); } - 100% { - transform: rotate(-405deg); - -webkit-transform: rotate(-405deg); } } + top: 38px; } +} @keyframes rotatePlaceholder { 0% { - transform: rotate(-45deg); - -webkit-transform: rotate(-45deg); } + transform: rotate(-45deg); } 5% { - transform: rotate(-45deg); - -webkit-transform: rotate(-45deg); } + transform: rotate(-45deg); } 12% { - transform: rotate(-405deg); - -webkit-transform: rotate(-405deg); } + transform: rotate(-405deg); } 100% { - transform: rotate(-405deg); - -webkit-transform: rotate(-405deg); } } + transform: rotate(-405deg); } +} .animateSuccessTip { -webkit-animation: animateSuccessTip 0.75s; @@ -615,136 +545,93 @@ body.stop-scrolling { @-webkit-keyframes animateErrorIcon { 0% { transform: rotateX(100deg); - -webkit-transform: rotateX(100deg); opacity: 0; } 100% { transform: rotateX(0deg); - -webkit-transform: rotateX(0deg); - opacity: 1; } } + opacity: 1; } +} @keyframes animateErrorIcon { 0% { transform: rotateX(100deg); - -webkit-transform: rotateX(100deg); opacity: 0; } 100% { transform: rotateX(0deg); - -webkit-transform: rotateX(0deg); - opacity: 1; } } + opacity: 1; } +} .animateErrorIcon { -webkit-animation: animateErrorIcon 0.5s; animation: animateErrorIcon 0.5s; } -@-webkit-keyframes animateXMark { - 0% { - transform: scale(0.4); - -webkit-transform: scale(0.4); - margin-top: 26px; - opacity: 0; } - 50% { - transform: scale(0.4); - -webkit-transform: scale(0.4); - margin-top: 26px; - opacity: 0; } - 80% { - transform: scale(1.15); - -webkit-transform: scale(1.15); - margin-top: -6px; } - 100% { - transform: scale(1); - -webkit-transform: scale(1); - margin-top: 0; - opacity: 1; } } - @keyframes animateXMark { 0% { transform: scale(0.4); - -webkit-transform: scale(0.4); margin-top: 26px; opacity: 0; } 50% { transform: scale(0.4); - -webkit-transform: scale(0.4); margin-top: 26px; opacity: 0; } 80% { transform: scale(1.15); - -webkit-transform: scale(1.15); margin-top: -6px; } 100% { transform: scale(1); - -webkit-transform: scale(1); margin-top: 0; - opacity: 1; } } + opacity: 1; } +} .animateXMark { - -webkit-animation: animateXMark 0.5s; animation: animateXMark 0.5s; } @-webkit-keyframes pulseWarning { 0% { border-color: #F8D486; } 100% { - border-color: #F8BB86; } } + border-color: #F8BB86; } +} @keyframes pulseWarning { 0% { border-color: #F8D486; } 100% { - border-color: #F8BB86; } } + border-color: #F8BB86; } +} .pulseWarning { - -webkit-animation: pulseWarning 0.75s infinite alternate; animation: pulseWarning 0.75s infinite alternate; } @-webkit-keyframes pulseWarningIns { 0% { background-color: #F8D486; } 100% { - background-color: #F8BB86; } } + background-color: #F8BB86; } +} @keyframes pulseWarningIns { 0% { background-color: #F8D486; } 100% { - background-color: #F8BB86; } } + background-color: #F8BB86; } +} .pulseWarningIns { - -webkit-animation: pulseWarningIns 0.75s infinite alternate; animation: pulseWarningIns 0.75s infinite alternate; } @-webkit-keyframes rotate-loading { 0% { transform: rotate(0deg); } 100% { - transform: rotate(360deg); } } + transform: rotate(360deg); } +} @keyframes rotate-loading { 0% { transform: rotate(0deg); } 100% { - transform: rotate(360deg); } } - -/* Internet Explorer 9 has some special quirks that are fixed here */ -/* The icons are not animated. */ -/* This file is automatically merged into sweet-alert.min.js through Gulp */ -/* Error icon */ -.sweet-alert .sa-icon.sa-error .sa-line.sa-left { - -ms-transform: rotate(45deg) \9; } - -.sweet-alert .sa-icon.sa-error .sa-line.sa-right { - -ms-transform: rotate(-45deg) \9; } - -/* Success icon */ -.sweet-alert .sa-icon.sa-success { - border-color: transparent\9; } - -.sweet-alert .sa-icon.sa-success .sa-line.sa-tip { - -ms-transform: rotate(45deg) \9; } - -.sweet-alert .sa-icon.sa-success .sa-line.sa-long { - -ms-transform: rotate(-45deg) \9; } + transform: rotate(360deg); } +} /*! * Load Awesome v1.1.0 (http://github.danielcardoso.net/load-awesome/) @@ -835,98 +722,21 @@ body.stop-scrolling { /* * Animation */ -@-webkit-keyframes ball-fall { - 0% { - opacity: 0; - -webkit-transform: translateY(-145%); - transform: translateY(-145%); } - 10% { - opacity: .5; } - 20% { - opacity: 1; - -webkit-transform: translateY(0); - transform: translateY(0); } - 80% { - opacity: 1; - -webkit-transform: translateY(0); - transform: translateY(0); } - 90% { - opacity: .5; } - 100% { - opacity: 0; - -webkit-transform: translateY(145%); - transform: translateY(145%); } } - -@-moz-keyframes ball-fall { - 0% { - opacity: 0; - -moz-transform: translateY(-145%); - transform: translateY(-145%); } - 10% { - opacity: .5; } - 20% { - opacity: 1; - -moz-transform: translateY(0); - transform: translateY(0); } - 80% { - opacity: 1; - -moz-transform: translateY(0); - transform: translateY(0); } - 90% { - opacity: .5; } - 100% { - opacity: 0; - -moz-transform: translateY(145%); - transform: translateY(145%); } } - -@-o-keyframes ball-fall { - 0% { - opacity: 0; - -o-transform: translateY(-145%); - transform: translateY(-145%); } - 10% { - opacity: .5; } - 20% { - opacity: 1; - -o-transform: translateY(0); - transform: translateY(0); } - 80% { - opacity: 1; - -o-transform: translateY(0); - transform: translateY(0); } - 90% { - opacity: .5; } - 100% { - opacity: 0; - -o-transform: translateY(145%); - transform: translateY(145%); } } - @keyframes ball-fall { 0% { opacity: 0; - -webkit-transform: translateY(-145%); - -moz-transform: translateY(-145%); - -o-transform: translateY(-145%); transform: translateY(-145%); } 10% { opacity: .5; } 20% { opacity: 1; - -webkit-transform: translateY(0); - -moz-transform: translateY(0); - -o-transform: translateY(0); transform: translateY(0); } 80% { opacity: 1; - -webkit-transform: translateY(0); - -moz-transform: translateY(0); - -o-transform: translateY(0); transform: translateY(0); } 90% { opacity: .5; } 100% { opacity: 0; - -webkit-transform: translateY(145%); - -moz-transform: translateY(145%); - -o-transform: translateY(145%); - transform: translateY(145%); } } + transform: translateY(145%); } +} diff --git a/freeciv-web/src/main/webapp/css/theme.dark.css b/freeciv-web/src/main/webapp/css/theme.dark.css index 828e9d209..fa1918340 100644 --- a/freeciv-web/src/main/webapp/css/theme.dark.css +++ b/freeciv-web/src/main/webapp/css/theme.dark.css @@ -3,65 +3,53 @@ *************/ /* overall */ .tablesorter-dark { - width: 100%; - font: 11px/18px Arial, Sans-serif; - color: #ccc; - text-align: left; - background-color: #000; - border-spacing: 0; - border-width: 0; /* added by Lexxie to experiment */ + width: 100%; + font: 11px/18px Arial, Sans-serif; + color: #ccc; + text-align: left; + background-color: #000; + border-spacing: 0; + border-width: 0; } /* header */ .tablesorter-dark th, .tablesorter-dark thead td { - padding: 4px; - padding: 4x 0px; /* added by Lexxie to experiment */ - font: bold 12px/20px Arial, Sans-serif; - color: #fff; - background-color: #000; - border-collapse: collapse; - border-spacing: 0; /* added by Lexxie to experiment */ - border-width: 0; /* added by Lexxie to experiment */ + padding: 4px 0; + font: bold 12px/20px Arial, Sans-serif; + color: #fff; + background-color: #000; + border-collapse: collapse; + border-spacing: 0; + border-width: 0; } + .tablesorter-dark thead th { - border-bottom: #333 2px solid; + border-bottom: #333 2px solid; } + .tablesorter-dark .header, .tablesorter-dark .tablesorter-header { - padding: 4px 20px 4px 20px; - padding: 4px 0px 4px 0px; /* added by Lexxie to experiment */ - - cursor: pointer; - - /* removed by Lexxie to experiment - background-image: url(data:image/gif;base64,R0lGODlhFQAJAIAAAP///////yH5BAEAAAEALAAAAAAVAAkAAAIXjI+AywnaYnhUMoqt3gZXPmVg94yJVQAAOw==); - - background-position: -5px; - background-repeat: no-repeat; - */ + padding: 4px 0 4px 0; + cursor: pointer; } + .tablesorter-dark thead .headerSortUp, .tablesorter-dark thead .tablesorter-headerSortUp, .tablesorter-dark thead .tablesorter-headerAsc { - /* removed by Lexxie to experiment - background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7); - */ - border-bottom: #888 1px solid; + border-bottom: #888 1px solid; } + .tablesorter-dark thead .headerSortDown, .tablesorter-dark thead .tablesorter-headerSortDown, .tablesorter-dark thead .tablesorter-headerDesc { - /* removed by Lexxie to experiment - background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7); - */ - border-bottom: #888 1px solid; + border-bottom: #888 1px solid; } + .tablesorter-dark thead .sorter-false { - background-image: none; - cursor: default; - padding: 4px; - padding: 4px 0px; /* added by Lexxie to experiment */ + background-image: none; + cursor: default; + padding: 4px 0; } /* tfoot */ @@ -69,139 +57,139 @@ .tablesorter-dark tfoot .tablesorter-headerSortDown, .tablesorter-dark tfoot .tablesorter-headerAsc, .tablesorter-dark tfoot .tablesorter-headerDesc { - border-top: #888 1px solid; - /* remove sort arrows from footer */ - background-image: none; + border-top: #888 1px solid; + /* remove sort arrows from footer */ + background-image: none; } /* tbody */ .tablesorter-dark td { -/* padding: 4px; removed by Lexxie to experiment */ - padding: 4px 0px; - background-color: #000; - border-bottom: #333 1px solid; - color: #ccc; + padding: 4px 0; + background-color: #000; + border-bottom: #333 1px solid; + color: #ccc; } /* hovered row colors */ .tablesorter-dark tbody > tr:hover > td, .tablesorter-dark tbody > tr.even:hover > td, .tablesorter-dark tbody > tr.odd:hover > td { - background: #000; + background: #000; } /* table processing indicator */ .tablesorter-dark .tablesorter-processing { - background-position: center center !important; - background-repeat: no-repeat !important; - /* background-image: url(../addons/pager/icons/loading.gif) !important; */ - background-image: url('data:image/gif;base64,R0lGODlhFAAUAKEAAO7u7lpaWgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgACACwAAAAAFAAUAAACQZRvoIDtu1wLQUAlqKTVxqwhXIiBnDg6Y4eyx4lKW5XK7wrLeK3vbq8J2W4T4e1nMhpWrZCTt3xKZ8kgsggdJmUFACH5BAEKAAIALAcAAAALAAcAAAIUVB6ii7jajgCAuUmtovxtXnmdUAAAIfkEAQoAAgAsDQACAAcACwAAAhRUIpmHy/3gUVQAQO9NetuugCFWAAAh+QQBCgACACwNAAcABwALAAACE5QVcZjKbVo6ck2AF95m5/6BSwEAIfkEAQoAAgAsBwANAAsABwAAAhOUH3kr6QaAcSrGWe1VQl+mMUIBACH5BAEKAAIALAIADQALAAcAAAIUlICmh7ncTAgqijkruDiv7n2YUAAAIfkEAQoAAgAsAAAHAAcACwAAAhQUIGmHyedehIoqFXLKfPOAaZdWAAAh+QQFCgACACwAAAIABwALAAACFJQFcJiXb15zLYRl7cla8OtlGGgUADs=') !important; + background-position: center center !important; + background-repeat: no-repeat !important; + background-image: url('data:image/gif;base64,R0lGODlhFAAUAKEAAO7u7lpaWgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgACACwAAAAAFAAUAAACQZRvoIDtu1wLQUAlqKTVxqwhXIiBnDg6Y4eyx4lKW5XK7wrLeK3vbq8J2W4T4e1nMhpWrZCTt3xKZ8kgsggdJmUFACH5BAEKAAIALAcAAAALAAcAAAIUVB6ii7jajgCAuUmtovxtXnmdUAAAIfkEAQoAAgAsDQACAAcACwAAAhRUIpmHy/3gUVQAQO9NetuugCFWAAAh+QQBCgACACwNAAcABwALAAACE5QVcZjKbVo6ck2AF95m5/6BSwEAIfkEAQoAAgAsBwANAAsABwAAAhOUH3kr6QaAcSrGWe1VQl+mMUIBACH5BAEKAAIALAIADQALAAcAAAIUlICmh7ncTAgqijkruDiv7n2YUAAAIfkEAQoAAgAsAAAHAAcACwAAAhQUIGmHyedehIoqFXLKfPOAaZdWAAAh+QQFCgACACwAAAIABwALAAACFJQFcJiXb15zLYRl7cla8OtlGGgUADs=') !important; } /* Zebra Widget - row alternating colors */ .tablesorter-dark tr.odd > td { - background-color: #202020; + background-color: #202020; } + .tablesorter-dark tr.even > td { - background-color: #101010; + background-color: #101010; } /* Column Widget - column sort colors */ .tablesorter-dark td.primary, .tablesorter-dark tr.odd td.primary { - background-color: #0a0a0a; + background-color: #0a0a0a; } + .tablesorter-dark tr.even td.primary { - background-color: #050505; + background-color: #050505; } + .tablesorter-dark td.secondary, .tablesorter-dark tr.odd td.secondary { - background-color: #0f0f0f; + background-color: #0f0f0f; } + .tablesorter-dark tr.even td.secondary { - background-color: #0a0a0a; + background-color: #0a0a0a; } + .tablesorter-dark td.tertiary, .tablesorter-dark tr.odd td.tertiary { - background-color: #191919; + background-color: #191919; } + .tablesorter-dark tr.even td.tertiary { - background-color: #0f0f0f; + background-color: #0f0f0f; } /* caption */ caption { - background: #202020; + background: #202020; } /* filter widget */ .tablesorter-dark .tablesorter-filter-row td { - background: #202020; - line-height: normal; - text-align: center; /* center the input */ - -webkit-transition: line-height 0.1s ease; - -moz-transition: line-height 0.1s ease; - -o-transition: line-height 0.1s ease; - transition: line-height 0.1s ease; + background: #202020; + line-height: normal; + text-align: center; /* center the input */ + -webkit-transition: line-height 0.1s ease; + -moz-transition: line-height 0.1s ease; + -o-transition: line-height 0.1s ease; + transition: line-height 0.1s ease; } + /* optional disabled input styling */ .tablesorter-dark .tablesorter-filter-row .disabled { - opacity: 0.5; - filter: alpha(opacity=50); - cursor: not-allowed; + opacity: 0.5; + filter: alpha(opacity=50); + cursor: not-allowed; } /* hidden filter row */ .tablesorter-dark .tablesorter-filter-row.hideme td { - /*** *********************************************** ***/ - /*** change this padding to modify the thickness ***/ - /*** of the closed filter row (height = padding x 2) ***/ -/* padding: 2px; removed by Lexxie to experiment */ - /*** *********************************************** ***/ - padding: 2px 0px; /* added by Lexxie to experiment */ - margin: 0; - line-height: 0; - cursor: pointer; + padding: 2px 0; + margin: 0; + line-height: 0; + cursor: pointer; } + .tablesorter-dark .tablesorter-filter-row.hideme * { - height: 1px; - min-height: 0; - border: 0; - padding: 0; - margin: 0; - /* don't use visibility: hidden because it disables tabbing */ - opacity: 0; - filter: alpha(opacity=0); + height: 1px; + min-height: 0; + border: 0; + padding: 0; + margin: 0; + /* don't use visibility: hidden because it disables tabbing */ + opacity: 0; + filter: alpha(opacity=0); } /* filters */ .tablesorter-dark input.tablesorter-filter, .tablesorter-dark select.tablesorter-filter { - width: 98%; - height: auto; - margin: 4px; - padding: 4px; - margin: 2px 0px; - padding: 4px 0px; /* added by Lexxie to experiment */ - background-color: #111; - border: 1px solid #222; - color: #ddd; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-transition: height 0.1s ease; - -moz-transition: height 0.1s ease; - -o-transition: height 0.1s ease; - transition: height 0.1s ease; + width: 98%; + height: auto; + margin: 2px 0; + padding: 4px 0; + background-color: #111; + border: 1px solid #222; + color: #ddd; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: height 0.1s ease; + -moz-transition: height 0.1s ease; + -o-transition: height 0.1s ease; + transition: height 0.1s ease; } + /* rows hidden by filtering (needed for child rows) */ .tablesorter .filtered { - display: none; + display: none; } /* ajax error row */ .tablesorter .tablesorter-errorRow td { - text-align: center; - cursor: pointer; - background-color: #e6bf99; + text-align: center; + cursor: pointer; + background-color: #e6bf99; } diff --git a/freeciv-web/src/main/webapp/docs/controls.txt b/freeciv-web/src/main/webapp/docs/controls.txt index 036e8790b..bf21e0c86 100644 --- a/freeciv-web/src/main/webapp/docs/controls.txt +++ b/freeciv-web/src/main/webapp/docs/controls.txt @@ -19,6 +19,8 @@ The current and complete list of Freeciv-web controls can be found here:
Disband unitshift-D + Dive Deepctrl-D + Build Airbase, Radar Towershift-E Fortifyf @@ -37,6 +39,8 @@ The current and complete list of Freeciv-web controls can be found here:
Build Farmlandi + Lay Fishtrapi + Cultivate (Chop Forest)i VigilShift-I @@ -119,6 +123,7 @@ The current and complete list of Freeciv-web controls can be found here:
h set unit's (h)omecity (to city on current tile) shift-H make Hideout i build (i)rrigation or convert terrain (settler/worker units) + i (on ocean tile) lay f(i)shtrap shift-I v(I)gil: (I)ntercept and auto-attack adjacent air units alt-shift-I connect irrigation along path j no orders - skip orders for this unit this turn @@ -162,13 +167,14 @@ The current and complete list of Freeciv-web controls can be found here:
8 move north (alt-i) 9 move north-east (alt-o) double-tap drag move unit +shift-clickon adjacent tile during GOTO: make unit GOTO instead of MOVE

Other Keyboard Shortcuts:

- + @@ -178,6 +184,7 @@ The current and complete list of Freeciv-web controls can be found here:
+ @@ -258,3 +265,10 @@ The current and complete list of Freeciv-web controls can be found here:



+

Admin only:

b Buy production in city under mouse cursor
w Return to map: close tab/window/pop-up
space De-select units, clear GOTO paths, exit drag-select
shift-space Re-focus to previous map position
ctrl-alt-space Paste smartlink to tile/unit under cursor
| Skip music track, go to next track.
shift-\ Skip music track, go to next track.
ctrl-B Highlight borders with flags
ctrl-shift-B Toggle national colors on minimap: primary,secondary,tertiary,diplomatic state
alt-shift-B Animate borders for visibility assistance
ctrl-shift-C Cycle city info display mode on map
ctrl-alt-D Disconnect (disconnected viewing mode)
ctrl-E Emoji selector
alt-F Apply filters to console messages (include/exclude types)
alt-shift-F Focus lock: center on active unit
ctrl-G Map grid on/off
ctrl-alt-shift-I Change style of the letter capital 'I'
+ +
Ctrl-Shift-E Toggle Debug Log Messages
Ctrl-Alt-Shift-S Toggle Supercow Interaction Lock
+
+
+
+
\ No newline at end of file diff --git a/freeciv-web/src/main/webapp/fonts/arial.ttf b/freeciv-web/src/main/webapp/fonts/arial.ttf deleted file mode 100644 index 8682d9462..000000000 Binary files a/freeciv-web/src/main/webapp/fonts/arial.ttf and /dev/null differ diff --git a/freeciv-web/src/main/webapp/fonts/arialb.ttf b/freeciv-web/src/main/webapp/fonts/arialb.ttf deleted file mode 100644 index a6037e686..000000000 Binary files a/freeciv-web/src/main/webapp/fonts/arialb.ttf and /dev/null differ diff --git a/freeciv-web/src/main/webapp/fonts/arialn.ttf b/freeciv-web/src/main/webapp/fonts/arialn.ttf deleted file mode 100644 index 94907a3df..000000000 Binary files a/freeciv-web/src/main/webapp/fonts/arialn.ttf and /dev/null differ diff --git a/freeciv-web/src/main/webapp/fonts/arialnb.ttf b/freeciv-web/src/main/webapp/fonts/arialnb.ttf deleted file mode 100644 index 62437f02f..000000000 Binary files a/freeciv-web/src/main/webapp/fonts/arialnb.ttf and /dev/null differ diff --git a/freeciv-web/src/main/webapp/fonts/arialrndb.ttf b/freeciv-web/src/main/webapp/fonts/arialrndb.ttf deleted file mode 100644 index 20b92a27d..000000000 Binary files a/freeciv-web/src/main/webapp/fonts/arialrndb.ttf and /dev/null differ diff --git a/freeciv-web/src/main/webapp/fonts/ariblk.ttf b/freeciv-web/src/main/webapp/fonts/ariblk.ttf deleted file mode 100644 index e7ae345aa..000000000 Binary files a/freeciv-web/src/main/webapp/fonts/ariblk.ttf and /dev/null differ diff --git a/freeciv-web/src/main/webapp/fonts/cinzel.variable.ttf b/freeciv-web/src/main/webapp/fonts/cinzel.variable.ttf new file mode 100644 index 000000000..d218a0b9c Binary files /dev/null and b/freeciv-web/src/main/webapp/fonts/cinzel.variable.ttf differ diff --git a/freeciv-web/src/main/webapp/fonts/cinzel.variable.woff2 b/freeciv-web/src/main/webapp/fonts/cinzel.variable.woff2 new file mode 100644 index 000000000..4550dc3e1 Binary files /dev/null and b/freeciv-web/src/main/webapp/fonts/cinzel.variable.woff2 differ diff --git a/freeciv-web/src/main/webapp/fonts/consola.ttf b/freeciv-web/src/main/webapp/fonts/consola.ttf deleted file mode 100644 index e881ca4b5..000000000 Binary files a/freeciv-web/src/main/webapp/fonts/consola.ttf and /dev/null differ diff --git a/freeciv-web/src/main/webapp/fonts/consolab.ttf b/freeciv-web/src/main/webapp/fonts/consolab.ttf deleted file mode 100644 index 77f5d6052..000000000 Binary files a/freeciv-web/src/main/webapp/fonts/consolab.ttf and /dev/null differ diff --git a/freeciv-web/src/main/webapp/fonts/copperb.ttf b/freeciv-web/src/main/webapp/fonts/copperb.ttf deleted file mode 100644 index 764965d4a..000000000 Binary files a/freeciv-web/src/main/webapp/fonts/copperb.ttf and /dev/null differ diff --git a/freeciv-web/src/main/webapp/fonts/copperl.ttf b/freeciv-web/src/main/webapp/fonts/copperl.ttf deleted file mode 100644 index a0edd5c63..000000000 Binary files a/freeciv-web/src/main/webapp/fonts/copperl.ttf and /dev/null differ diff --git a/freeciv-web/src/main/webapp/fonts/edward.ttf b/freeciv-web/src/main/webapp/fonts/edward.ttf deleted file mode 100644 index dcc21fddb..000000000 Binary files a/freeciv-web/src/main/webapp/fonts/edward.ttf and /dev/null differ diff --git a/freeciv-web/src/main/webapp/fonts/freeciv.b.ttf b/freeciv-web/src/main/webapp/fonts/freeciv.b.ttf deleted file mode 100644 index 2967c9ccd..000000000 Binary files a/freeciv-web/src/main/webapp/fonts/freeciv.b.ttf and /dev/null differ diff --git a/freeciv-web/src/main/webapp/fonts/freeciv.bl.ttf b/freeciv-web/src/main/webapp/fonts/freeciv.bl.ttf deleted file mode 100644 index 4b6895ff6..000000000 Binary files a/freeciv-web/src/main/webapp/fonts/freeciv.bl.ttf and /dev/null differ diff --git a/freeciv-web/src/main/webapp/fonts/freeciv.m.ttf b/freeciv-web/src/main/webapp/fonts/freeciv.m.ttf deleted file mode 100644 index cd419d257..000000000 Binary files a/freeciv-web/src/main/webapp/fonts/freeciv.m.ttf and /dev/null differ diff --git a/freeciv-web/src/main/webapp/fonts/freeciv.otf b/freeciv-web/src/main/webapp/fonts/freeciv.otf deleted file mode 100644 index fc526ae37..000000000 Binary files a/freeciv-web/src/main/webapp/fonts/freeciv.otf and /dev/null differ diff --git a/freeciv-web/src/main/webapp/fonts/freeciv.ttf b/freeciv-web/src/main/webapp/fonts/freeciv.ttf deleted file mode 100644 index fc526ae37..000000000 Binary files a/freeciv-web/src/main/webapp/fonts/freeciv.ttf and /dev/null differ diff --git a/freeciv-web/src/main/webapp/fonts/seg.b.ttf b/freeciv-web/src/main/webapp/fonts/seg.b.ttf deleted file mode 100644 index ff196d601..000000000 Binary files a/freeciv-web/src/main/webapp/fonts/seg.b.ttf and /dev/null differ diff --git a/freeciv-web/src/main/webapp/fonts/seg.bl.ttf b/freeciv-web/src/main/webapp/fonts/seg.bl.ttf deleted file mode 100644 index b2966570e..000000000 Binary files a/freeciv-web/src/main/webapp/fonts/seg.bl.ttf and /dev/null differ diff --git a/freeciv-web/src/main/webapp/fonts/seg.l.ttf b/freeciv-web/src/main/webapp/fonts/seg.l.ttf deleted file mode 100644 index 23fb04db8..000000000 Binary files a/freeciv-web/src/main/webapp/fonts/seg.l.ttf and /dev/null differ diff --git a/freeciv-web/src/main/webapp/fonts/seg.sb.ttf b/freeciv-web/src/main/webapp/fonts/seg.sb.ttf deleted file mode 100644 index 90b39f72f..000000000 Binary files a/freeciv-web/src/main/webapp/fonts/seg.sb.ttf and /dev/null differ diff --git a/freeciv-web/src/main/webapp/fonts/seg.sl.ttf b/freeciv-web/src/main/webapp/fonts/seg.sl.ttf deleted file mode 100644 index a276476a7..000000000 Binary files a/freeciv-web/src/main/webapp/fonts/seg.sl.ttf and /dev/null differ diff --git a/freeciv-web/src/main/webapp/fonts/seg.ttf b/freeciv-web/src/main/webapp/fonts/seg.ttf deleted file mode 100644 index 0f52cbd9c..000000000 Binary files a/freeciv-web/src/main/webapp/fonts/seg.ttf and /dev/null differ diff --git a/freeciv-web/src/main/webapp/fonts/tahoma.ttf b/freeciv-web/src/main/webapp/fonts/tahoma.ttf deleted file mode 100644 index b7b708633..000000000 Binary files a/freeciv-web/src/main/webapp/fonts/tahoma.ttf and /dev/null differ diff --git a/freeciv-web/src/main/webapp/fonts/tahomab.ttf b/freeciv-web/src/main/webapp/fonts/tahomab.ttf deleted file mode 100644 index 2b694bf1f..000000000 Binary files a/freeciv-web/src/main/webapp/fonts/tahomab.ttf and /dev/null differ diff --git a/freeciv-web/src/main/webapp/fonts/verdana.ttf b/freeciv-web/src/main/webapp/fonts/verdana.ttf deleted file mode 100644 index 9a3499751..000000000 Binary files a/freeciv-web/src/main/webapp/fonts/verdana.ttf and /dev/null differ diff --git a/freeciv-web/src/main/webapp/fonts/verdanab.ttf b/freeciv-web/src/main/webapp/fonts/verdanab.ttf deleted file mode 100644 index fe8e6879b..000000000 Binary files a/freeciv-web/src/main/webapp/fonts/verdanab.ttf and /dev/null differ diff --git a/freeciv-web/src/main/webapp/gltf/AEGIS Cruiser.glb b/freeciv-web/src/main/webapp/gltf/AEGIS Cruiser.glb new file mode 100644 index 000000000..307ae3781 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/AEGIS Cruiser.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/AWACS.glb b/freeciv-web/src/main/webapp/gltf/AWACS.glb new file mode 100644 index 000000000..3179d49a8 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/AWACS.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Airbase.glb b/freeciv-web/src/main/webapp/gltf/Airbase.glb new file mode 100644 index 000000000..d3f66e628 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Airbase.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Alpine Troops.glb b/freeciv-web/src/main/webapp/gltf/Alpine Troops.glb new file mode 100644 index 000000000..66c80b7a3 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Alpine Troops.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Archers.glb b/freeciv-web/src/main/webapp/gltf/Archers.glb new file mode 100644 index 000000000..f5d52d978 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Archers.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Armor.glb b/freeciv-web/src/main/webapp/gltf/Armor.glb new file mode 100644 index 000000000..353ddbb79 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Armor.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Artillery.glb b/freeciv-web/src/main/webapp/gltf/Artillery.glb new file mode 100644 index 000000000..d48992ba4 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Artillery.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Barbarian Leader.glb b/freeciv-web/src/main/webapp/gltf/Barbarian Leader.glb new file mode 100644 index 000000000..7de237fb2 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Barbarian Leader.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Battleship.glb b/freeciv-web/src/main/webapp/gltf/Battleship.glb new file mode 100644 index 000000000..b93a23b0a Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Battleship.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Bomber.glb b/freeciv-web/src/main/webapp/gltf/Bomber.glb new file mode 100644 index 000000000..5c00472c6 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Bomber.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Cannon.glb b/freeciv-web/src/main/webapp/gltf/Cannon.glb new file mode 100644 index 000000000..8c0ad12cc Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Cannon.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Caravan.glb b/freeciv-web/src/main/webapp/gltf/Caravan.glb new file mode 100644 index 000000000..28e464a53 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Caravan.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Caravel.glb b/freeciv-web/src/main/webapp/gltf/Caravel.glb new file mode 100644 index 000000000..49b084b95 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Caravel.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Carrier.glb b/freeciv-web/src/main/webapp/gltf/Carrier.glb new file mode 100644 index 000000000..928cd5d7a Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Carrier.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Catapult.glb b/freeciv-web/src/main/webapp/gltf/Catapult.glb new file mode 100644 index 000000000..046efcf9c Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Catapult.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Cavalry.glb b/freeciv-web/src/main/webapp/gltf/Cavalry.glb new file mode 100644 index 000000000..56b6c8eaf Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Cavalry.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Chariot.glb b/freeciv-web/src/main/webapp/gltf/Chariot.glb new file mode 100644 index 000000000..592cacf9c Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Chariot.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Cruise Missile.glb b/freeciv-web/src/main/webapp/gltf/Cruise Missile.glb new file mode 100644 index 000000000..b9a4ff8cc Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Cruise Missile.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Cruiser.glb b/freeciv-web/src/main/webapp/gltf/Cruiser.glb new file mode 100644 index 000000000..bfb0905dd Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Cruiser.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Destroyer.glb b/freeciv-web/src/main/webapp/gltf/Destroyer.glb new file mode 100644 index 000000000..cbc93aa6d Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Destroyer.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Diplomat.glb b/freeciv-web/src/main/webapp/gltf/Diplomat.glb new file mode 100644 index 000000000..6f77096f6 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Diplomat.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Dragoons.glb b/freeciv-web/src/main/webapp/gltf/Dragoons.glb new file mode 100644 index 000000000..6ec7ef635 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Dragoons.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Engineers.glb b/freeciv-web/src/main/webapp/gltf/Engineers.glb new file mode 100644 index 000000000..ff03dfff6 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Engineers.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Explorer.glb b/freeciv-web/src/main/webapp/gltf/Explorer.glb new file mode 100644 index 000000000..57ea517ea Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Explorer.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Fighter.glb b/freeciv-web/src/main/webapp/gltf/Fighter.glb new file mode 100644 index 000000000..46720724d Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Fighter.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Fish.glb b/freeciv-web/src/main/webapp/gltf/Fish.glb new file mode 100644 index 000000000..72a04e6eb Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Fish.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Fortress.glb b/freeciv-web/src/main/webapp/gltf/Fortress.glb new file mode 100644 index 000000000..1789e03b8 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Fortress.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Freight.glb b/freeciv-web/src/main/webapp/gltf/Freight.glb new file mode 100644 index 000000000..2dd9a249d Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Freight.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Frigate.glb b/freeciv-web/src/main/webapp/gltf/Frigate.glb new file mode 100644 index 000000000..77093a0be Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Frigate.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Galleon.glb b/freeciv-web/src/main/webapp/gltf/Galleon.glb new file mode 100644 index 000000000..9dc861bb3 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Galleon.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Helicopter.glb b/freeciv-web/src/main/webapp/gltf/Helicopter.glb new file mode 100644 index 000000000..6c8f30635 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Helicopter.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Horsemen.glb b/freeciv-web/src/main/webapp/gltf/Horsemen.glb new file mode 100644 index 000000000..33f97d384 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Horsemen.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Howitzer.glb b/freeciv-web/src/main/webapp/gltf/Howitzer.glb new file mode 100644 index 000000000..36eae60f2 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Howitzer.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Hut.glb b/freeciv-web/src/main/webapp/gltf/Hut.glb new file mode 100644 index 000000000..4d3bf1dee Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Hut.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Ironclad.glb b/freeciv-web/src/main/webapp/gltf/Ironclad.glb new file mode 100644 index 000000000..5444899d8 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Ironclad.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Knights.glb b/freeciv-web/src/main/webapp/gltf/Knights.glb new file mode 100644 index 000000000..8fb3e2e36 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Knights.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Legion.glb b/freeciv-web/src/main/webapp/gltf/Legion.glb new file mode 100644 index 000000000..3ed74ee7d Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Legion.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Marines.glb b/freeciv-web/src/main/webapp/gltf/Marines.glb new file mode 100644 index 000000000..71c1605d4 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Marines.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Mech. Inf..glb b/freeciv-web/src/main/webapp/gltf/Mech. Inf..glb new file mode 100644 index 000000000..33ae7ab9c Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Mech. Inf..glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Migrants.glb b/freeciv-web/src/main/webapp/gltf/Migrants.glb new file mode 100644 index 000000000..976f13955 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Migrants.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Mine.glb b/freeciv-web/src/main/webapp/gltf/Mine.glb new file mode 100644 index 000000000..92ddcad68 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Mine.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Musketeers.glb b/freeciv-web/src/main/webapp/gltf/Musketeers.glb new file mode 100644 index 000000000..8493d31ac Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Musketeers.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Nuclear.glb b/freeciv-web/src/main/webapp/gltf/Nuclear.glb new file mode 100644 index 000000000..3b04b4c9f Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Nuclear.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Paratroopers.glb b/freeciv-web/src/main/webapp/gltf/Paratroopers.glb new file mode 100644 index 000000000..8fe9be344 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Paratroopers.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Partisan.glb b/freeciv-web/src/main/webapp/gltf/Partisan.glb new file mode 100644 index 000000000..5af0ad6ea Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Partisan.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Phalanx.glb b/freeciv-web/src/main/webapp/gltf/Phalanx.glb new file mode 100644 index 000000000..3a9932bcf Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Phalanx.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Pikemen.glb b/freeciv-web/src/main/webapp/gltf/Pikemen.glb new file mode 100644 index 000000000..3b338fc0e Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Pikemen.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/README.md b/freeciv-web/src/main/webapp/gltf/README.md new file mode 100644 index 000000000..9c3770d6e --- /dev/null +++ b/freeciv-web/src/main/webapp/gltf/README.md @@ -0,0 +1,7 @@ +glTF 3D models for Freeciv WebGL +================================ + +This directory contains glTF 2.0 binary .glb files, +which have been exported from the /blender directory. + + diff --git a/freeciv-web/src/main/webapp/gltf/Riflemen.glb b/freeciv-web/src/main/webapp/gltf/Riflemen.glb new file mode 100644 index 000000000..937432773 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Riflemen.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Ruins.glb b/freeciv-web/src/main/webapp/gltf/Ruins.glb new file mode 100644 index 000000000..9817d4279 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Ruins.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Settlers.glb b/freeciv-web/src/main/webapp/gltf/Settlers.glb new file mode 100644 index 000000000..40b8b828a Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Settlers.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Spy.glb b/freeciv-web/src/main/webapp/gltf/Spy.glb new file mode 100644 index 000000000..999a9b184 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Spy.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Stealth Bomber.glb b/freeciv-web/src/main/webapp/gltf/Stealth Bomber.glb new file mode 100644 index 000000000..6b887e2ed Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Stealth Bomber.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Stealth Fighter.glb b/freeciv-web/src/main/webapp/gltf/Stealth Fighter.glb new file mode 100644 index 000000000..fbadae108 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Stealth Fighter.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Submarine.glb b/freeciv-web/src/main/webapp/gltf/Submarine.glb new file mode 100644 index 000000000..d460723dd Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Submarine.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Transport.glb b/freeciv-web/src/main/webapp/gltf/Transport.glb new file mode 100644 index 000000000..fa9d35ce8 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Transport.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Trireme.glb b/freeciv-web/src/main/webapp/gltf/Trireme.glb new file mode 100644 index 000000000..47a3e5297 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Trireme.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Warriors.glb b/freeciv-web/src/main/webapp/gltf/Warriors.glb new file mode 100644 index 000000000..ab48c4ee9 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Warriors.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Whales.glb b/freeciv-web/src/main/webapp/gltf/Whales.glb new file mode 100644 index 000000000..bb1548d89 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Whales.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/Workers.glb b/freeciv-web/src/main/webapp/gltf/Workers.glb new file mode 100644 index 000000000..1513af6e4 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/Workers.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/city_european_0.glb b/freeciv-web/src/main/webapp/gltf/city_european_0.glb new file mode 100644 index 000000000..55a5deb5e Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/city_european_0.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/city_european_1.glb b/freeciv-web/src/main/webapp/gltf/city_european_1.glb new file mode 100644 index 000000000..288afc673 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/city_european_1.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/city_european_2.glb b/freeciv-web/src/main/webapp/gltf/city_european_2.glb new file mode 100644 index 000000000..3a900677f Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/city_european_2.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/city_european_3.glb b/freeciv-web/src/main/webapp/gltf/city_european_3.glb new file mode 100644 index 000000000..56eb5871d Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/city_european_3.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/city_european_4.glb b/freeciv-web/src/main/webapp/gltf/city_european_4.glb new file mode 100644 index 000000000..50a1e0b56 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/city_european_4.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/city_modern_0.glb b/freeciv-web/src/main/webapp/gltf/city_modern_0.glb new file mode 100644 index 000000000..971ee043a Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/city_modern_0.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/city_modern_1.glb b/freeciv-web/src/main/webapp/gltf/city_modern_1.glb new file mode 100644 index 000000000..f6dec0dce Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/city_modern_1.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/city_modern_2.glb b/freeciv-web/src/main/webapp/gltf/city_modern_2.glb new file mode 100644 index 000000000..b38cd9dd4 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/city_modern_2.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/city_modern_3.glb b/freeciv-web/src/main/webapp/gltf/city_modern_3.glb new file mode 100644 index 000000000..7059bbc8e Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/city_modern_3.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/city_modern_4.glb b/freeciv-web/src/main/webapp/gltf/city_modern_4.glb new file mode 100644 index 000000000..cb384c18e Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/city_modern_4.glb differ diff --git a/freeciv-web/src/main/webapp/gltf/citywalls.glb b/freeciv-web/src/main/webapp/gltf/citywalls.glb new file mode 100644 index 000000000..9609ef114 Binary files /dev/null and b/freeciv-web/src/main/webapp/gltf/citywalls.glb differ diff --git a/freeciv-web/src/main/webapp/images/bg-alt-dark.jpg b/freeciv-web/src/main/webapp/images/bg-alt-dark.jpg new file mode 100644 index 000000000..bfff653d0 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/bg-alt-dark.jpg differ diff --git a/freeciv-web/src/main/webapp/images/bg-dark50.png b/freeciv-web/src/main/webapp/images/bg-dark50.png new file mode 100644 index 000000000..b00947c2f Binary files /dev/null and b/freeciv-web/src/main/webapp/images/bg-dark50.png differ diff --git a/freeciv-web/src/main/webapp/images/bg-odin.jpg b/freeciv-web/src/main/webapp/images/bg-odin.jpg new file mode 100644 index 000000000..769974afd Binary files /dev/null and b/freeciv-web/src/main/webapp/images/bg-odin.jpg differ diff --git a/freeciv-web/src/main/webapp/images/bg-smooth-mdark.jpg b/freeciv-web/src/main/webapp/images/bg-smooth-mdark.jpg new file mode 100644 index 000000000..e009b9dfa Binary files /dev/null and b/freeciv-web/src/main/webapp/images/bg-smooth-mdark.jpg differ diff --git a/freeciv-web/src/main/webapp/images/chapter_mark.png b/freeciv-web/src/main/webapp/images/chapter_mark.png new file mode 100644 index 000000000..22b5c8b29 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/chapter_mark.png differ diff --git a/freeciv-web/src/main/webapp/images/dark-check-orange.png b/freeciv-web/src/main/webapp/images/dark-check-orange.png index 5a8dbf567..9796c6f3c 100644 Binary files a/freeciv-web/src/main/webapp/images/dark-check-orange.png and b/freeciv-web/src/main/webapp/images/dark-check-orange.png differ diff --git a/freeciv-web/src/main/webapp/images/dark-check-yellow.png b/freeciv-web/src/main/webapp/images/dark-check-yellow.png new file mode 100644 index 000000000..4e0821f9a Binary files /dev/null and b/freeciv-web/src/main/webapp/images/dark-check-yellow.png differ diff --git a/freeciv-web/src/main/webapp/images/e/-bear-.png b/freeciv-web/src/main/webapp/images/e/-bear-.png new file mode 100644 index 000000000..44d51b2a3 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/-bear-.png differ diff --git a/freeciv-web/src/main/webapp/images/e/-crocodile-.png b/freeciv-web/src/main/webapp/images/e/-crocodile-.png new file mode 100644 index 000000000..11ff5c537 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/-crocodile-.png differ diff --git a/freeciv-web/src/main/webapp/images/e/-giantsquid-.png b/freeciv-web/src/main/webapp/images/e/-giantsquid-.png new file mode 100644 index 000000000..9e00b87e8 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/-giantsquid-.png differ diff --git a/freeciv-web/src/main/webapp/images/e/-hippo-.png b/freeciv-web/src/main/webapp/images/e/-hippo-.png new file mode 100644 index 000000000..ba696afce Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/-hippo-.png differ diff --git a/freeciv-web/src/main/webapp/images/e/-leopard-.png b/freeciv-web/src/main/webapp/images/e/-leopard-.png new file mode 100644 index 000000000..489f991a0 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/-leopard-.png differ diff --git a/freeciv-web/src/main/webapp/images/e/-lion-.png b/freeciv-web/src/main/webapp/images/e/-lion-.png new file mode 100644 index 000000000..f7d60d6d4 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/-lion-.png differ diff --git a/freeciv-web/src/main/webapp/images/e/-polarbear-.png b/freeciv-web/src/main/webapp/images/e/-polarbear-.png new file mode 100644 index 000000000..3cf6c443b Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/-polarbear-.png differ diff --git a/freeciv-web/src/main/webapp/images/e/-rhino-.png b/freeciv-web/src/main/webapp/images/e/-rhino-.png new file mode 100644 index 000000000..486e55ed5 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/-rhino-.png differ diff --git a/freeciv-web/src/main/webapp/images/e/-wolf-.png b/freeciv-web/src/main/webapp/images/e/-wolf-.png new file mode 100644 index 000000000..4c1c19bc7 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/-wolf-.png differ diff --git a/freeciv-web/src/main/webapp/images/e/a_left.png b/freeciv-web/src/main/webapp/images/e/a_left.png new file mode 100644 index 000000000..c7ca04c12 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/a_left.png differ diff --git a/freeciv-web/src/main/webapp/images/e/a_rght.png b/freeciv-web/src/main/webapp/images/e/a_rght.png new file mode 100644 index 000000000..8db164050 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/a_rght.png differ diff --git a/freeciv-web/src/main/webapp/images/e/anger.png b/freeciv-web/src/main/webapp/images/e/anger.png new file mode 100644 index 000000000..95834e426 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/anger.png differ diff --git a/freeciv-web/src/main/webapp/images/e/arght.png b/freeciv-web/src/main/webapp/images/e/arght.png new file mode 100644 index 000000000..8db164050 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/arght.png differ diff --git a/freeciv-web/src/main/webapp/images/e/ballista.png b/freeciv-web/src/main/webapp/images/e/ballista.png new file mode 100644 index 000000000..64b0d60fb Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/ballista.png differ diff --git a/freeciv-web/src/main/webapp/images/e/bombs.png b/freeciv-web/src/main/webapp/images/e/bombs.png new file mode 100644 index 000000000..5027e1854 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/bombs.png differ diff --git a/freeciv-web/src/main/webapp/images/e/boot.png b/freeciv-web/src/main/webapp/images/e/boot.png new file mode 100644 index 000000000..f6279caf9 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/boot.png differ diff --git a/freeciv-web/src/main/webapp/images/e/briefcase.png b/freeciv-web/src/main/webapp/images/e/briefcase.png new file mode 100644 index 000000000..3a64ecb47 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/briefcase.png differ diff --git a/freeciv-web/src/main/webapp/images/e/bullseye.png b/freeciv-web/src/main/webapp/images/e/bullseye.png new file mode 100644 index 000000000..2ba33ac36 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/bullseye.png differ diff --git a/freeciv-web/src/main/webapp/images/e/caravan.png b/freeciv-web/src/main/webapp/images/e/caravan.png index 65efde1d3..afa3ca973 100644 Binary files a/freeciv-web/src/main/webapp/images/e/caravan.png and b/freeciv-web/src/main/webapp/images/e/caravan.png differ diff --git a/freeciv-web/src/main/webapp/images/e/codeofhammurabi.png b/freeciv-web/src/main/webapp/images/e/codeofhammurabi.png new file mode 100644 index 000000000..247801759 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/codeofhammurabi.png differ diff --git a/freeciv-web/src/main/webapp/images/e/commissariatofagriculture.png b/freeciv-web/src/main/webapp/images/e/commissariatofagriculture.png new file mode 100644 index 000000000..229914d95 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/commissariatofagriculture.png differ diff --git a/freeciv-web/src/main/webapp/images/e/emissary.png b/freeciv-web/src/main/webapp/images/e/emissary.png new file mode 100644 index 000000000..59387b8bb Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/emissary.png differ diff --git a/freeciv-web/src/main/webapp/images/e/equal.png b/freeciv-web/src/main/webapp/images/e/equal.png index b6aa02885..208edcec0 100644 Binary files a/freeciv-web/src/main/webapp/images/e/equal.png and b/freeciv-web/src/main/webapp/images/e/equal.png differ diff --git a/freeciv-web/src/main/webapp/images/e/events/citydestroy.png b/freeciv-web/src/main/webapp/images/e/events/citydestroy.png new file mode 100644 index 000000000..c8e887180 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/events/citydestroy.png differ diff --git a/freeciv-web/src/main/webapp/images/e/events/democracy.png b/freeciv-web/src/main/webapp/images/e/events/democracy.png new file mode 100644 index 000000000..c84f65e6d Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/events/democracy.png differ diff --git a/freeciv-web/src/main/webapp/images/e/events/theology.png b/freeciv-web/src/main/webapp/images/e/events/theology.png new file mode 100644 index 000000000..c074cb3a2 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/events/theology.png differ diff --git a/freeciv-web/src/main/webapp/images/e/eye.png b/freeciv-web/src/main/webapp/images/e/eye.png new file mode 100644 index 000000000..7324961d2 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/eye.png differ diff --git a/freeciv-web/src/main/webapp/images/e/fanatics.png b/freeciv-web/src/main/webapp/images/e/fanatics.png index 489134b3f..d6a66774c 100644 Binary files a/freeciv-web/src/main/webapp/images/e/fanatics.png and b/freeciv-web/src/main/webapp/images/e/fanatics.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/abkhazia.png b/freeciv-web/src/main/webapp/images/e/flag/abkhazia.png index b9a7a56ee..70877f592 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/abkhazia.png and b/freeciv-web/src/main/webapp/images/e/flag/abkhazia.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/antarctica_alt.png b/freeciv-web/src/main/webapp/images/e/flag/antarctica_alt.png new file mode 100644 index 000000000..3ed97c006 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/antarctica_alt.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/antigua_and_barbuda.png b/freeciv-web/src/main/webapp/images/e/flag/antigua_and_barbuda.png new file mode 100644 index 000000000..37ec86582 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/antigua_and_barbuda.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/argentina.png b/freeciv-web/src/main/webapp/images/e/flag/argentina.png index c73277162..65bc954b1 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/argentina.png and b/freeciv-web/src/main/webapp/images/e/flag/argentina.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/armenia.png b/freeciv-web/src/main/webapp/images/e/flag/armenia.png index 19750a4d6..c9f0e934b 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/armenia.png and b/freeciv-web/src/main/webapp/images/e/flag/armenia.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/azerbaijan.png b/freeciv-web/src/main/webapp/images/e/flag/azerbaijan.png index d75ef3ef6..47e52f19d 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/azerbaijan.png and b/freeciv-web/src/main/webapp/images/e/flag/azerbaijan.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/bahamas.png b/freeciv-web/src/main/webapp/images/e/flag/bahamas.png index 1218a2742..1fe80335d 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/bahamas.png and b/freeciv-web/src/main/webapp/images/e/flag/bahamas.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/belarus.png b/freeciv-web/src/main/webapp/images/e/flag/belarus.png index c95a214b7..47c81b033 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/belarus.png and b/freeciv-web/src/main/webapp/images/e/flag/belarus.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/benin_ancient.png b/freeciv-web/src/main/webapp/images/e/flag/benin_ancient.png new file mode 100644 index 000000000..d0763ea15 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/benin_ancient.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/bosnia.png b/freeciv-web/src/main/webapp/images/e/flag/bosnia.png index 019b70671..b04874657 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/bosnia.png and b/freeciv-web/src/main/webapp/images/e/flag/bosnia.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/brasil.png b/freeciv-web/src/main/webapp/images/e/flag/brasil.png index 0ae8451f5..997c228f1 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/brasil.png and b/freeciv-web/src/main/webapp/images/e/flag/brasil.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/brunei.png b/freeciv-web/src/main/webapp/images/e/flag/brunei.png index dda615ba3..aefc70ba2 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/brunei.png and b/freeciv-web/src/main/webapp/images/e/flag/brunei.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/burkina_faso.png b/freeciv-web/src/main/webapp/images/e/flag/burkina_faso.png new file mode 100644 index 000000000..7413b235a Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/burkina_faso.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/canada.png b/freeciv-web/src/main/webapp/images/e/flag/canada.png index fe9f3ae4c..68d29548e 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/canada.png and b/freeciv-web/src/main/webapp/images/e/flag/canada.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/canada_old.png b/freeciv-web/src/main/webapp/images/e/flag/canada_old.png new file mode 100644 index 000000000..5e4faab11 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/canada_old.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/cape_verde.png b/freeciv-web/src/main/webapp/images/e/flag/cape_verde.png new file mode 100644 index 000000000..008c7b273 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/cape_verde.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/central_america.png b/freeciv-web/src/main/webapp/images/e/flag/central_america.png new file mode 100644 index 000000000..3dc78406a Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/central_america.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/central_lithuania.png b/freeciv-web/src/main/webapp/images/e/flag/central_lithuania.png new file mode 100644 index 000000000..283b62e51 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/central_lithuania.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/costa_rica.png b/freeciv-web/src/main/webapp/images/e/flag/costa_rica.png new file mode 100644 index 000000000..49b63b0d3 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/costa_rica.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/crimean_tatar.png b/freeciv-web/src/main/webapp/images/e/flag/crimean_tatar.png new file mode 100644 index 000000000..db686b955 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/crimean_tatar.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/crimeantatar.png b/freeciv-web/src/main/webapp/images/e/flag/crimeantatar.png index b282aa2bf..c6c322331 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/crimeantatar.png and b/freeciv-web/src/main/webapp/images/e/flag/crimeantatar.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/croatia.png b/freeciv-web/src/main/webapp/images/e/flag/croatia.png index d94a5bdb3..6bdf58c73 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/croatia.png and b/freeciv-web/src/main/webapp/images/e/flag/croatia.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/cuba.png b/freeciv-web/src/main/webapp/images/e/flag/cuba.png index 666daa662..a4d5c3a79 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/cuba.png and b/freeciv-web/src/main/webapp/images/e/flag/cuba.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/czech.png b/freeciv-web/src/main/webapp/images/e/flag/czech.png index dc509e638..38114a100 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/czech.png and b/freeciv-web/src/main/webapp/images/e/flag/czech.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/czechoslovakia.png b/freeciv-web/src/main/webapp/images/e/flag/czechoslovakia.png index e8498f155..2655678ac 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/czechoslovakia.png and b/freeciv-web/src/main/webapp/images/e/flag/czechoslovakia.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/dominica.png b/freeciv-web/src/main/webapp/images/e/flag/dominica.png index d7eabfe5e..4451b0a47 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/dominica.png and b/freeciv-web/src/main/webapp/images/e/flag/dominica.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/dominican_republic.png b/freeciv-web/src/main/webapp/images/e/flag/dominican_republic.png new file mode 100644 index 000000000..c75dccf8c Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/dominican_republic.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/dr_congo.png b/freeciv-web/src/main/webapp/images/e/flag/dr_congo.png new file mode 100644 index 000000000..e9a9c842b Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/dr_congo.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/east_timor.png b/freeciv-web/src/main/webapp/images/e/flag/east_timor.png new file mode 100644 index 000000000..0571f507a Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/east_timor.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/egypt_ancient.png b/freeciv-web/src/main/webapp/images/e/flag/egypt_ancient.png new file mode 100644 index 000000000..96b0ed2e2 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/egypt_ancient.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/el_salvador.png b/freeciv-web/src/main/webapp/images/e/flag/el_salvador.png new file mode 100644 index 000000000..81aca2d81 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/el_salvador.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/equatorial_guinea.png b/freeciv-web/src/main/webapp/images/e/flag/equatorial_guinea.png new file mode 100644 index 000000000..6ba353a10 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/equatorial_guinea.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/eritrea.png b/freeciv-web/src/main/webapp/images/e/flag/eritrea.png index 377d12930..2fac5f81e 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/eritrea.png and b/freeciv-web/src/main/webapp/images/e/flag/eritrea.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/ethiopia.png b/freeciv-web/src/main/webapp/images/e/flag/ethiopia.png index 455088d43..5c79c27dd 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/ethiopia.png and b/freeciv-web/src/main/webapp/images/e/flag/ethiopia.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/ethiopia_old.png b/freeciv-web/src/main/webapp/images/e/flag/ethiopia_old.png new file mode 100644 index 000000000..4e54c89e1 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/ethiopia_old.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/etruscan.png b/freeciv-web/src/main/webapp/images/e/flag/etruscan.png index 3dfaaea2a..d0de8a51a 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/etruscan.png and b/freeciv-web/src/main/webapp/images/e/flag/etruscan.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/europe.png b/freeciv-web/src/main/webapp/images/e/flag/europe.png index 3b6c1cec7..44fc645de 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/europe.png and b/freeciv-web/src/main/webapp/images/e/flag/europe.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/finland.png b/freeciv-web/src/main/webapp/images/e/flag/finland.png index 0cbb7c5b3..310af49b4 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/finland.png and b/freeciv-web/src/main/webapp/images/e/flag/finland.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/france_old.png b/freeciv-web/src/main/webapp/images/e/flag/france_old.png new file mode 100644 index 000000000..99d737d97 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/france_old.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/french_polynesia.png b/freeciv-web/src/main/webapp/images/e/flag/french_polynesia.png new file mode 100644 index 000000000..44c2fa77e Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/french_polynesia.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/germany.png b/freeciv-web/src/main/webapp/images/e/flag/germany.png index 66357a9fa..168c9479d 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/germany.png and b/freeciv-web/src/main/webapp/images/e/flag/germany.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/ghana_ancient.png b/freeciv-web/src/main/webapp/images/e/flag/ghana_ancient.png new file mode 100644 index 000000000..f7a16bfa1 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/ghana_ancient.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/ghaznavid.png b/freeciv-web/src/main/webapp/images/e/flag/ghaznavid.png index 5d7a2c817..5c2997227 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/ghaznavid.png and b/freeciv-web/src/main/webapp/images/e/flag/ghaznavid.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/golden_horde.png b/freeciv-web/src/main/webapp/images/e/flag/golden_horde.png new file mode 100644 index 000000000..6af1469de Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/golden_horde.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/greater_poland.png b/freeciv-web/src/main/webapp/images/e/flag/greater_poland.png new file mode 100644 index 000000000..9f7e23610 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/greater_poland.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/greece_ancient.png b/freeciv-web/src/main/webapp/images/e/flag/greece_ancient.png new file mode 100644 index 000000000..3fe341f5d Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/greece_ancient.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/guatemala.png b/freeciv-web/src/main/webapp/images/e/flag/guatemala.png index 4f8025f83..3c89462e6 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/guatemala.png and b/freeciv-web/src/main/webapp/images/e/flag/guatemala.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/guinea-bissau.png b/freeciv-web/src/main/webapp/images/e/flag/guinea-bissau.png index 3f5637086..5a0ef347f 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/guinea-bissau.png and b/freeciv-web/src/main/webapp/images/e/flag/guinea-bissau.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/honduras.png b/freeciv-web/src/main/webapp/images/e/flag/honduras.png index 12d5bad47..1cef38707 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/honduras.png and b/freeciv-web/src/main/webapp/images/e/flag/honduras.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/hungary.png b/freeciv-web/src/main/webapp/images/e/flag/hungary.png index cb8604a38..b781bd9b4 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/hungary.png and b/freeciv-web/src/main/webapp/images/e/flag/hungary.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/iceland.png b/freeciv-web/src/main/webapp/images/e/flag/iceland.png index b7bc08d3b..c13a6656d 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/iceland.png and b/freeciv-web/src/main/webapp/images/e/flag/iceland.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/iran_ancient.png b/freeciv-web/src/main/webapp/images/e/flag/iran_ancient.png new file mode 100644 index 000000000..a34ff282b Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/iran_ancient.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/iraq_old.png b/freeciv-web/src/main/webapp/images/e/flag/iraq_old.png new file mode 100644 index 000000000..d3ec5d04d Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/iraq_old.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/ireland.png b/freeciv-web/src/main/webapp/images/e/flag/ireland.png index 00104706c..4e36f1309 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/ireland.png and b/freeciv-web/src/main/webapp/images/e/flag/ireland.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/israel.png b/freeciv-web/src/main/webapp/images/e/flag/israel.png index a007cdf96..65d0ea739 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/israel.png and b/freeciv-web/src/main/webapp/images/e/flag/israel.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/israel_ancient.png b/freeciv-web/src/main/webapp/images/e/flag/israel_ancient.png new file mode 100644 index 000000000..045ca8ed6 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/israel_ancient.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/italian_greek.png b/freeciv-web/src/main/webapp/images/e/flag/italian_greek.png new file mode 100644 index 000000000..c314510bb Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/italian_greek.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/ivory_coast.png b/freeciv-web/src/main/webapp/images/e/flag/ivory_coast.png new file mode 100644 index 000000000..9f32c3e12 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/ivory_coast.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/jamaica.png b/freeciv-web/src/main/webapp/images/e/flag/jamaica.png index d8324b711..374d18bb3 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/jamaica.png and b/freeciv-web/src/main/webapp/images/e/flag/jamaica.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/japan.png b/freeciv-web/src/main/webapp/images/e/flag/japan.png index f46492577..413520b7d 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/japan.png and b/freeciv-web/src/main/webapp/images/e/flag/japan.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/jordan.png b/freeciv-web/src/main/webapp/images/e/flag/jordan.png index 7d8675402..160f1c8c9 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/jordan.png and b/freeciv-web/src/main/webapp/images/e/flag/jordan.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/kazakhstan.png b/freeciv-web/src/main/webapp/images/e/flag/kazakhstan.png index 532c8604e..2bc3a09f5 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/kazakhstan.png and b/freeciv-web/src/main/webapp/images/e/flag/kazakhstan.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/kiribati.png b/freeciv-web/src/main/webapp/images/e/flag/kiribati.png index 7704a0ad2..1c1412a01 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/kiribati.png and b/freeciv-web/src/main/webapp/images/e/flag/kiribati.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/korea_ancient.png b/freeciv-web/src/main/webapp/images/e/flag/korea_ancient.png new file mode 100644 index 000000000..26a8576d1 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/korea_ancient.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/kuna_yala.png b/freeciv-web/src/main/webapp/images/e/flag/kuna_yala.png new file mode 100644 index 000000000..5b84ce2a1 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/kuna_yala.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/kurd.png b/freeciv-web/src/main/webapp/images/e/flag/kurd.png index 7b73bb0ce..265b73df3 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/kurd.png and b/freeciv-web/src/main/webapp/images/e/flag/kurd.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/kuwait.png b/freeciv-web/src/main/webapp/images/e/flag/kuwait.png index e4101930b..b24f025a4 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/kuwait.png and b/freeciv-web/src/main/webapp/images/e/flag/kuwait.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/latin_empire.png b/freeciv-web/src/main/webapp/images/e/flag/latin_empire.png new file mode 100644 index 000000000..aa7dac5dc Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/latin_empire.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/latvia.png b/freeciv-web/src/main/webapp/images/e/flag/latvia.png index 1b956d940..2f5db1c5c 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/latvia.png and b/freeciv-web/src/main/webapp/images/e/flag/latvia.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/lebanon.png b/freeciv-web/src/main/webapp/images/e/flag/lebanon.png index f54131040..9998e9180 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/lebanon.png and b/freeciv-web/src/main/webapp/images/e/flag/lebanon.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/lesotho_old.png b/freeciv-web/src/main/webapp/images/e/flag/lesotho_old.png new file mode 100644 index 000000000..000ac97bb Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/lesotho_old.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/libya.png b/freeciv-web/src/main/webapp/images/e/flag/libya.png index a02c7d6d4..4bc23da88 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/libya.png and b/freeciv-web/src/main/webapp/images/e/flag/libya.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/libya_old.png b/freeciv-web/src/main/webapp/images/e/flag/libya_old.png new file mode 100644 index 000000000..b51255518 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/libya_old.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/macedonia.png b/freeciv-web/src/main/webapp/images/e/flag/macedonia.png index 47a816366..315932e37 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/macedonia.png and b/freeciv-web/src/main/webapp/images/e/flag/macedonia.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/malaysia.png b/freeciv-web/src/main/webapp/images/e/flag/malaysia.png index 3dc0d6335..967fe8cfd 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/malaysia.png and b/freeciv-web/src/main/webapp/images/e/flag/malaysia.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/mali_ancient.png b/freeciv-web/src/main/webapp/images/e/flag/mali_ancient.png new file mode 100644 index 000000000..06a839705 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/mali_ancient.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/man.png b/freeciv-web/src/main/webapp/images/e/flag/man.png index 69efe2bf8..90f4b1173 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/man.png and b/freeciv-web/src/main/webapp/images/e/flag/man.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/marshall_islands.png b/freeciv-web/src/main/webapp/images/e/flag/marshall_islands.png new file mode 100644 index 000000000..553f44159 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/marshall_islands.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/moldova.png b/freeciv-web/src/main/webapp/images/e/flag/moldova.png index 877dd4eef..6095a77b0 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/moldova.png and b/freeciv-web/src/main/webapp/images/e/flag/moldova.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/moluccas.png b/freeciv-web/src/main/webapp/images/e/flag/moluccas.png index 4e7ecb54d..e36f1df16 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/moluccas.png and b/freeciv-web/src/main/webapp/images/e/flag/moluccas.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/monaco_alternative.png b/freeciv-web/src/main/webapp/images/e/flag/monaco_alternative.png new file mode 100644 index 000000000..b938aceca Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/monaco_alternative.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/monacoalternative.png b/freeciv-web/src/main/webapp/images/e/flag/monacoalternative.png index 42dbab89f..b938aceca 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/monacoalternative.png and b/freeciv-web/src/main/webapp/images/e/flag/monacoalternative.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/mongolia.png b/freeciv-web/src/main/webapp/images/e/flag/mongolia.png index aeff4f7b5..6b0d88c69 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/mongolia.png and b/freeciv-web/src/main/webapp/images/e/flag/mongolia.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/myanmar_old.png b/freeciv-web/src/main/webapp/images/e/flag/myanmar_old.png new file mode 100644 index 000000000..4503720e2 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/myanmar_old.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/nagorno_karabakh.png b/freeciv-web/src/main/webapp/images/e/flag/nagorno_karabakh.png new file mode 100644 index 000000000..b791eb4ac Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/nagorno_karabakh.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/netherlands_antilles.png b/freeciv-web/src/main/webapp/images/e/flag/netherlands_antilles.png new file mode 100644 index 000000000..0fc778bd5 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/netherlands_antilles.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/newzealand.png b/freeciv-web/src/main/webapp/images/e/flag/newzealand.png index 0220069b3..b6f7bd931 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/newzealand.png and b/freeciv-web/src/main/webapp/images/e/flag/newzealand.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/nez_perce.png b/freeciv-web/src/main/webapp/images/e/flag/nez_perce.png new file mode 100644 index 000000000..8e286cf34 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/nez_perce.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/nigeria.png b/freeciv-web/src/main/webapp/images/e/flag/nigeria.png index bfbaafb9b..96918a672 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/nigeria.png and b/freeciv-web/src/main/webapp/images/e/flag/nigeria.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/north_korea.png b/freeciv-web/src/main/webapp/images/e/flag/north_korea.png new file mode 100644 index 000000000..9ddb664f8 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/north_korea.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/northkorea.png b/freeciv-web/src/main/webapp/images/e/flag/northkorea.png index a3ea0c639..173bfc9cf 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/northkorea.png and b/freeciv-web/src/main/webapp/images/e/flag/northkorea.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/norway.png b/freeciv-web/src/main/webapp/images/e/flag/norway.png index a97003a74..c2f1d1d90 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/norway.png and b/freeciv-web/src/main/webapp/images/e/flag/norway.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/oldenburg.png b/freeciv-web/src/main/webapp/images/e/flag/oldenburg.png index 06db1addb..25e5b4d60 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/oldenburg.png and b/freeciv-web/src/main/webapp/images/e/flag/oldenburg.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/papuanewguinea (2).png b/freeciv-web/src/main/webapp/images/e/flag/papua_newguinea.png similarity index 100% rename from freeciv-web/src/main/webapp/images/e/flag/papuanewguinea (2).png rename to freeciv-web/src/main/webapp/images/e/flag/papua_newguinea.png diff --git a/freeciv-web/src/main/webapp/images/e/flag/philippines.png b/freeciv-web/src/main/webapp/images/e/flag/philippines.png index b2456fa43..784405b77 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/philippines.png and b/freeciv-web/src/main/webapp/images/e/flag/philippines.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/poland.png b/freeciv-web/src/main/webapp/images/e/flag/poland.png index bc47e891e..81d3d17b2 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/poland.png and b/freeciv-web/src/main/webapp/images/e/flag/poland.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/puerto_rico.png b/freeciv-web/src/main/webapp/images/e/flag/puerto_rico.png new file mode 100644 index 000000000..447576a01 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/puerto_rico.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/r_congo.png b/freeciv-web/src/main/webapp/images/e/flag/r_congo.png new file mode 100644 index 000000000..aac0105d6 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/r_congo.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/rapa_nui.png b/freeciv-web/src/main/webapp/images/e/flag/rapa_nui.png new file mode 100644 index 000000000..e35b1713a Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/rapa_nui.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/russia.png b/freeciv-web/src/main/webapp/images/e/flag/russia.png index 55058c7ad..15ddc9719 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/russia.png and b/freeciv-web/src/main/webapp/images/e/flag/russia.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/saint_kitts_and_nevis.png b/freeciv-web/src/main/webapp/images/e/flag/saint_kitts_and_nevis.png new file mode 100644 index 000000000..fae002057 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/saint_kitts_and_nevis.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/saint_lucia.png b/freeciv-web/src/main/webapp/images/e/flag/saint_lucia.png new file mode 100644 index 000000000..abc5f9085 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/saint_lucia.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/san_marino.png b/freeciv-web/src/main/webapp/images/e/flag/san_marino.png new file mode 100644 index 000000000..cfb502607 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/san_marino.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/sao_tome_and_principe.png b/freeciv-web/src/main/webapp/images/e/flag/sao_tome_and_principe.png new file mode 100644 index 000000000..cf7e31e97 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/sao_tome_and_principe.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/saudi_arabia.png b/freeciv-web/src/main/webapp/images/e/flag/saudi_arabia.png new file mode 100644 index 000000000..cd901fbfe Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/saudi_arabia.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/scotland.png b/freeciv-web/src/main/webapp/images/e/flag/scotland.png index 652744775..956b58345 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/scotland.png and b/freeciv-web/src/main/webapp/images/e/flag/scotland.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/seleucid.png b/freeciv-web/src/main/webapp/images/e/flag/seleucid.png index 206b6764e..6e02364cd 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/seleucid.png and b/freeciv-web/src/main/webapp/images/e/flag/seleucid.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/sierra_leone.png b/freeciv-web/src/main/webapp/images/e/flag/sierra_leone.png new file mode 100644 index 000000000..778470e30 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/sierra_leone.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/solomon_islands.png b/freeciv-web/src/main/webapp/images/e/flag/solomon_islands.png new file mode 100644 index 000000000..aefbc0eba Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/solomon_islands.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/south_africa.png b/freeciv-web/src/main/webapp/images/e/flag/south_africa.png new file mode 100644 index 000000000..a054144bf Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/south_africa.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/south_yemen.png b/freeciv-web/src/main/webapp/images/e/flag/south_yemen.png new file mode 100644 index 000000000..6ec7fb1f3 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/south_yemen.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/southern_cross.png b/freeciv-web/src/main/webapp/images/e/flag/southern_cross.png new file mode 100644 index 000000000..169f91d47 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/southern_cross.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/southern_sudan.png b/freeciv-web/src/main/webapp/images/e/flag/southern_sudan.png new file mode 100644 index 000000000..457e22146 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/southern_sudan.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/spartan.png b/freeciv-web/src/main/webapp/images/e/flag/spartan.png index f0a09a0b6..25c5d9d2a 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/spartan.png and b/freeciv-web/src/main/webapp/images/e/flag/spartan.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/sweden.png b/freeciv-web/src/main/webapp/images/e/flag/sweden.png index 6d37d5f7d..1746eae31 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/sweden.png and b/freeciv-web/src/main/webapp/images/e/flag/sweden.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/switzerland.png b/freeciv-web/src/main/webapp/images/e/flag/switzerland.png index 681974623..5029914d2 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/switzerland.png and b/freeciv-web/src/main/webapp/images/e/flag/switzerland.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/tannu_tuva.png b/freeciv-web/src/main/webapp/images/e/flag/tannu_tuva.png new file mode 100644 index 000000000..a45dc88d8 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/tannu_tuva.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/teutonic_order.png b/freeciv-web/src/main/webapp/images/e/flag/teutonic_order.png new file mode 100644 index 000000000..413959906 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/teutonic_order.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/trinidad_and_tobago.png b/freeciv-web/src/main/webapp/images/e/flag/trinidad_and_tobago.png new file mode 100644 index 000000000..e992911b2 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/trinidad_and_tobago.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/united_kingdom.png b/freeciv-web/src/main/webapp/images/e/flag/united_kingdom.png new file mode 100644 index 000000000..b0cdad596 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/united_kingdom.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/united_nations.png b/freeciv-web/src/main/webapp/images/e/flag/united_nations.png new file mode 100644 index 000000000..c1c6bc6ff Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/united_nations.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/unitedkingdom.png b/freeciv-web/src/main/webapp/images/e/flag/unitedkingdom.png index 339cc4697..b0cdad596 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/unitedkingdom.png and b/freeciv-web/src/main/webapp/images/e/flag/unitedkingdom.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/usa.png b/freeciv-web/src/main/webapp/images/e/flag/usa.png index c04eac5d1..2247a3252 100644 Binary files a/freeciv-web/src/main/webapp/images/e/flag/usa.png and b/freeciv-web/src/main/webapp/images/e/flag/usa.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/volga_bulgar.png b/freeciv-web/src/main/webapp/images/e/flag/volga_bulgar.png new file mode 100644 index 000000000..74d73c293 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/volga_bulgar.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/volga_german.png b/freeciv-web/src/main/webapp/images/e/flag/volga_german.png new file mode 100644 index 000000000..272cfee37 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/volga_german.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/west_indies_federation.png b/freeciv-web/src/main/webapp/images/e/flag/west_indies_federation.png new file mode 100644 index 000000000..fab35d29d Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/west_indies_federation.png differ diff --git a/freeciv-web/src/main/webapp/images/e/flag/west_papua.png b/freeciv-web/src/main/webapp/images/e/flag/west_papua.png new file mode 100644 index 000000000..c53aed34b Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/flag/west_papua.png differ diff --git a/freeciv-web/src/main/webapp/images/e/fuel.png b/freeciv-web/src/main/webapp/images/e/fuel.png index 65259dc09..718b1ccd5 100644 Binary files a/freeciv-web/src/main/webapp/images/e/fuel.png and b/freeciv-web/src/main/webapp/images/e/fuel.png differ diff --git a/freeciv-web/src/main/webapp/images/e/hourglass.png b/freeciv-web/src/main/webapp/images/e/hourglass.png index 6de0f8ea0..c5ca3aa45 100644 Binary files a/freeciv-web/src/main/webapp/images/e/hourglass.png and b/freeciv-web/src/main/webapp/images/e/hourglass.png differ diff --git a/freeciv-web/src/main/webapp/images/e/legion.png b/freeciv-web/src/main/webapp/images/e/legion.png index 6b1f07e82..1f7fbe8e7 100644 Binary files a/freeciv-web/src/main/webapp/images/e/legion.png and b/freeciv-web/src/main/webapp/images/e/legion.png differ diff --git a/freeciv-web/src/main/webapp/images/e/magnumturret.png b/freeciv-web/src/main/webapp/images/e/magnumturret.png new file mode 100644 index 000000000..5e1ff3046 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/magnumturret.png differ diff --git a/freeciv-web/src/main/webapp/images/e/mechinf..png b/freeciv-web/src/main/webapp/images/e/mechinf..png new file mode 100644 index 000000000..643c16aaa Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/mechinf..png differ diff --git a/freeciv-web/src/main/webapp/images/e/medal.png b/freeciv-web/src/main/webapp/images/e/medal.png new file mode 100644 index 000000000..39f13be70 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/medal.png differ diff --git a/freeciv-web/src/main/webapp/images/e/migrants.png b/freeciv-web/src/main/webapp/images/e/migrants.png index da9347c72..650d594d6 100644 Binary files a/freeciv-web/src/main/webapp/images/e/migrants.png and b/freeciv-web/src/main/webapp/images/e/migrants.png differ diff --git a/freeciv-web/src/main/webapp/images/e/militia.png b/freeciv-web/src/main/webapp/images/e/militia.png new file mode 100644 index 000000000..c73a5aaa1 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/militia.png differ diff --git a/freeciv-web/src/main/webapp/images/e/minus.png b/freeciv-web/src/main/webapp/images/e/minus.png new file mode 100644 index 000000000..4a584129e Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/minus.png differ diff --git a/freeciv-web/src/main/webapp/images/e/missilesubmarine.png b/freeciv-web/src/main/webapp/images/e/missilesubmarine.png new file mode 100644 index 000000000..19e6ddc20 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/missilesubmarine.png differ diff --git a/freeciv-web/src/main/webapp/images/e/multi-fighter.png b/freeciv-web/src/main/webapp/images/e/multi-fighter.png new file mode 100644 index 000000000..7b4887bcf Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/multi-fighter.png differ diff --git a/freeciv-web/src/main/webapp/images/e/partisan.png b/freeciv-web/src/main/webapp/images/e/partisan.png index e21536a78..a2842730c 100644 Binary files a/freeciv-web/src/main/webapp/images/e/partisan.png and b/freeciv-web/src/main/webapp/images/e/partisan.png differ diff --git a/freeciv-web/src/main/webapp/images/e/patriarch.png b/freeciv-web/src/main/webapp/images/e/patriarch.png new file mode 100644 index 000000000..9dfcca3f8 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/patriarch.png differ diff --git a/freeciv-web/src/main/webapp/images/e/plus.png b/freeciv-web/src/main/webapp/images/e/plus.png new file mode 100644 index 000000000..a9a727636 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/plus.png differ diff --git a/freeciv-web/src/main/webapp/images/e/propagandaministry.png b/freeciv-web/src/main/webapp/images/e/propagandaministry.png new file mode 100644 index 000000000..28e6f9b8c Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/propagandaministry.png differ diff --git a/freeciv-web/src/main/webapp/images/e/quavers.png b/freeciv-web/src/main/webapp/images/e/quavers.png new file mode 100644 index 000000000..61387bc8a Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/quavers.png differ diff --git a/freeciv-web/src/main/webapp/images/e/reddiamond.png b/freeciv-web/src/main/webapp/images/e/reddiamond.png new file mode 100644 index 000000000..fa7baf5ba Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/reddiamond.png differ diff --git a/freeciv-web/src/main/webapp/images/e/riflemen.png b/freeciv-web/src/main/webapp/images/e/riflemen.png index c6700e05a..1dd0cb1db 100644 Binary files a/freeciv-web/src/main/webapp/images/e/riflemen.png and b/freeciv-web/src/main/webapp/images/e/riflemen.png differ diff --git a/freeciv-web/src/main/webapp/images/e/running.png b/freeciv-web/src/main/webapp/images/e/running.png new file mode 100644 index 000000000..6260c542d Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/running.png differ diff --git a/freeciv-web/src/main/webapp/images/e/sail.png b/freeciv-web/src/main/webapp/images/e/sail.png new file mode 100644 index 000000000..f24b6a7b8 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/sail.png differ diff --git a/freeciv-web/src/main/webapp/images/e/scroll.png b/freeciv-web/src/main/webapp/images/e/scroll.png new file mode 100644 index 000000000..94ac08f74 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/scroll.png differ diff --git a/freeciv-web/src/main/webapp/images/e/skull.png b/freeciv-web/src/main/webapp/images/e/skull.png new file mode 100644 index 000000000..8b95886b1 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/skull.png differ diff --git a/freeciv-web/src/main/webapp/images/e/swords.png b/freeciv-web/src/main/webapp/images/e/swords.png new file mode 100644 index 000000000..574c9adcc Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/swords.png differ diff --git a/freeciv-web/src/main/webapp/images/e/techs/chemistry.png b/freeciv-web/src/main/webapp/images/e/techs/chemistry.png index 02c0732ef..aa4d2d921 100644 Binary files a/freeciv-web/src/main/webapp/images/e/techs/chemistry.png and b/freeciv-web/src/main/webapp/images/e/techs/chemistry.png differ diff --git a/freeciv-web/src/main/webapp/images/e/techs/literacy.png b/freeciv-web/src/main/webapp/images/e/techs/literacy.png index 7b29e17e9..36e76444c 100644 Binary files a/freeciv-web/src/main/webapp/images/e/techs/literacy.png and b/freeciv-web/src/main/webapp/images/e/techs/literacy.png differ diff --git a/freeciv-web/src/main/webapp/images/e/techs/mechanization.png b/freeciv-web/src/main/webapp/images/e/techs/mechanization.png new file mode 100644 index 000000000..43acceefa Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/techs/mechanization.png differ diff --git a/freeciv-web/src/main/webapp/images/e/techs/philosophy.png b/freeciv-web/src/main/webapp/images/e/techs/philosophy.png index 1eb38ff44..ee206c20c 100644 Binary files a/freeciv-web/src/main/webapp/images/e/techs/philosophy.png and b/freeciv-web/src/main/webapp/images/e/techs/philosophy.png differ diff --git a/freeciv-web/src/main/webapp/images/e/techs/railroad.png b/freeciv-web/src/main/webapp/images/e/techs/railroad.png index 518e89a00..9bd4adedb 100644 Binary files a/freeciv-web/src/main/webapp/images/e/techs/railroad.png and b/freeciv-web/src/main/webapp/images/e/techs/railroad.png differ diff --git a/freeciv-web/src/main/webapp/images/e/techs/steamengine.png b/freeciv-web/src/main/webapp/images/e/techs/steamengine.png index 2a0042f9d..a474a0b4c 100644 Binary files a/freeciv-web/src/main/webapp/images/e/techs/steamengine.png and b/freeciv-web/src/main/webapp/images/e/techs/steamengine.png differ diff --git a/freeciv-web/src/main/webapp/images/e/techs/university.png b/freeciv-web/src/main/webapp/images/e/techs/university.png index ec5410c04..551adfed7 100644 Binary files a/freeciv-web/src/main/webapp/images/e/techs/university.png and b/freeciv-web/src/main/webapp/images/e/techs/university.png differ diff --git a/freeciv-web/src/main/webapp/images/e/techs/unknown.png b/freeciv-web/src/main/webapp/images/e/techs/unknown.png new file mode 100644 index 000000000..cecf2f26e Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/techs/unknown.png differ diff --git a/freeciv-web/src/main/webapp/images/e/theolympics.png b/freeciv-web/src/main/webapp/images/e/theolympics.png index 86b251cb0..c4d18087c 100644 Binary files a/freeciv-web/src/main/webapp/images/e/theolympics.png and b/freeciv-web/src/main/webapp/images/e/theolympics.png differ diff --git a/freeciv-web/src/main/webapp/images/e/trawler.png b/freeciv-web/src/main/webapp/images/e/trawler.png new file mode 100644 index 000000000..52cddb41d Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/trawler.png differ diff --git a/freeciv-web/src/main/webapp/images/e/ts.png b/freeciv-web/src/main/webapp/images/e/ts.png new file mode 100644 index 000000000..f9bdba6c8 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/ts.png differ diff --git a/freeciv-web/src/main/webapp/images/e/village.png b/freeciv-web/src/main/webapp/images/e/village.png new file mode 100644 index 000000000..16d4e32da Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/village.png differ diff --git a/freeciv-web/src/main/webapp/images/e/warning.png b/freeciv-web/src/main/webapp/images/e/warning.png index c69fabc55..7ae2673de 100644 Binary files a/freeciv-web/src/main/webapp/images/e/warning.png and b/freeciv-web/src/main/webapp/images/e/warning.png differ diff --git a/freeciv-web/src/main/webapp/images/e/workersii.png b/freeciv-web/src/main/webapp/images/e/workersii.png new file mode 100644 index 000000000..fef336a70 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/e/workersii.png differ diff --git a/freeciv-web/src/main/webapp/images/filter.png b/freeciv-web/src/main/webapp/images/filter.png new file mode 100644 index 000000000..7c637a9cb Binary files /dev/null and b/freeciv-web/src/main/webapp/images/filter.png differ diff --git a/freeciv-web/src/main/webapp/images/filter1.png b/freeciv-web/src/main/webapp/images/filter1.png new file mode 100644 index 000000000..fdfee1b78 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/filter1.png differ diff --git a/freeciv-web/src/main/webapp/images/luxury2.png b/freeciv-web/src/main/webapp/images/luxury2.png index fd1691f15..c586145f6 100644 Binary files a/freeciv-web/src/main/webapp/images/luxury2.png and b/freeciv-web/src/main/webapp/images/luxury2.png differ diff --git a/freeciv-web/src/main/webapp/images/man/logistics_artillery_unload.png b/freeciv-web/src/main/webapp/images/man/logistics_artillery_unload.png index 2d962917b..ea7995ac5 100644 Binary files a/freeciv-web/src/main/webapp/images/man/logistics_artillery_unload.png and b/freeciv-web/src/main/webapp/images/man/logistics_artillery_unload.png differ diff --git a/freeciv-web/src/main/webapp/images/man/logistics_foot_load.png b/freeciv-web/src/main/webapp/images/man/logistics_foot_load.png index 4d782b8ad..079958dbe 100644 Binary files a/freeciv-web/src/main/webapp/images/man/logistics_foot_load.png and b/freeciv-web/src/main/webapp/images/man/logistics_foot_load.png differ diff --git a/freeciv-web/src/main/webapp/images/man/logistics_foot_unload.png b/freeciv-web/src/main/webapp/images/man/logistics_foot_unload.png index e2b7304b3..a15ee6124 100644 Binary files a/freeciv-web/src/main/webapp/images/man/logistics_foot_unload.png and b/freeciv-web/src/main/webapp/images/man/logistics_foot_unload.png differ diff --git a/freeciv-web/src/main/webapp/images/man/logistics_generic_unload.png b/freeciv-web/src/main/webapp/images/man/logistics_generic_unload.png index dfd73bb07..c576098a4 100644 Binary files a/freeciv-web/src/main/webapp/images/man/logistics_generic_unload.png and b/freeciv-web/src/main/webapp/images/man/logistics_generic_unload.png differ diff --git a/freeciv-web/src/main/webapp/images/man/logistics_landairsea_unload.png b/freeciv-web/src/main/webapp/images/man/logistics_landairsea_unload.png index e08e58095..34e0163c7 100644 Binary files a/freeciv-web/src/main/webapp/images/man/logistics_landairsea_unload.png and b/freeciv-web/src/main/webapp/images/man/logistics_landairsea_unload.png differ diff --git a/freeciv-web/src/main/webapp/images/man/logistics_mounted_unload.png b/freeciv-web/src/main/webapp/images/man/logistics_mounted_unload.png index 50b0eb133..116704e39 100644 Binary files a/freeciv-web/src/main/webapp/images/man/logistics_mounted_unload.png and b/freeciv-web/src/main/webapp/images/man/logistics_mounted_unload.png differ diff --git a/freeciv-web/src/main/webapp/images/man/vigil_mp2c.png b/freeciv-web/src/main/webapp/images/man/vigil_mp2c.png new file mode 100644 index 000000000..11c352a1b Binary files /dev/null and b/freeciv-web/src/main/webapp/images/man/vigil_mp2c.png differ diff --git a/freeciv-web/src/main/webapp/images/man/vigil_mp2d.png b/freeciv-web/src/main/webapp/images/man/vigil_mp2d.png new file mode 100644 index 000000000..2c00b2d4a Binary files /dev/null and b/freeciv-web/src/main/webapp/images/man/vigil_mp2d.png differ diff --git a/freeciv-web/src/main/webapp/images/orders/blank_button3.png b/freeciv-web/src/main/webapp/images/orders/blank_button3.png new file mode 100644 index 000000000..fda43856e Binary files /dev/null and b/freeciv-web/src/main/webapp/images/orders/blank_button3.png differ diff --git a/freeciv-web/src/main/webapp/images/orders/bunker.png b/freeciv-web/src/main/webapp/images/orders/bunker.png new file mode 100644 index 000000000..f6b5ba248 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/orders/bunker.png differ diff --git a/freeciv-web/src/main/webapp/images/orders/capture.png b/freeciv-web/src/main/webapp/images/orders/capture.png new file mode 100644 index 000000000..fc5694afc Binary files /dev/null and b/freeciv-web/src/main/webapp/images/orders/capture.png differ diff --git a/freeciv-web/src/main/webapp/images/orders/castle.png b/freeciv-web/src/main/webapp/images/orders/castle.png new file mode 100644 index 000000000..caf3fff9e Binary files /dev/null and b/freeciv-web/src/main/webapp/images/orders/castle.png differ diff --git a/freeciv-web/src/main/webapp/images/orders/deepdive.png b/freeciv-web/src/main/webapp/images/orders/deepdive.png new file mode 100644 index 000000000..8c50d0bb6 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/orders/deepdive.png differ diff --git a/freeciv-web/src/main/webapp/images/orders/expel.png b/freeciv-web/src/main/webapp/images/orders/expel.png new file mode 100644 index 000000000..c580b847b Binary files /dev/null and b/freeciv-web/src/main/webapp/images/orders/expel.png differ diff --git a/freeciv-web/src/main/webapp/images/orders/fishtrap.png b/freeciv-web/src/main/webapp/images/orders/fishtrap.png new file mode 100644 index 000000000..68bb36ed1 Binary files /dev/null and b/freeciv-web/src/main/webapp/images/orders/fishtrap.png differ diff --git a/freeciv-web/src/main/webapp/images/orders/fort.png b/freeciv-web/src/main/webapp/images/orders/fort.png new file mode 100644 index 000000000..16929814a Binary files /dev/null and b/freeciv-web/src/main/webapp/images/orders/fort.png differ diff --git a/freeciv-web/src/main/webapp/images/riverland.png b/freeciv-web/src/main/webapp/images/riverland.png new file mode 100644 index 000000000..601b0bf1f Binary files /dev/null and b/freeciv-web/src/main/webapp/images/riverland.png differ diff --git a/freeciv-web/src/main/webapp/images/terrain/desert1.png b/freeciv-web/src/main/webapp/images/terrain/desert1.png index 02dfe25be..d732c2d74 100644 Binary files a/freeciv-web/src/main/webapp/images/terrain/desert1.png and b/freeciv-web/src/main/webapp/images/terrain/desert1.png differ diff --git a/freeciv-web/src/main/webapp/images/terrain/forest3.png b/freeciv-web/src/main/webapp/images/terrain/forest3.png index 2d72e171b..5ece6836b 100644 Binary files a/freeciv-web/src/main/webapp/images/terrain/forest3.png and b/freeciv-web/src/main/webapp/images/terrain/forest3.png differ diff --git a/freeciv-web/src/main/webapp/images/terrain/grassland1.png b/freeciv-web/src/main/webapp/images/terrain/grassland1.png index dbdaf9e4a..63a066c9c 100644 Binary files a/freeciv-web/src/main/webapp/images/terrain/grassland1.png and b/freeciv-web/src/main/webapp/images/terrain/grassland1.png differ diff --git a/freeciv-web/src/main/webapp/images/terrain/hills2.png b/freeciv-web/src/main/webapp/images/terrain/hills2.png index 13f15a911..382c36613 100644 Binary files a/freeciv-web/src/main/webapp/images/terrain/hills2.png and b/freeciv-web/src/main/webapp/images/terrain/hills2.png differ diff --git a/freeciv-web/src/main/webapp/images/terrain/plains2.png b/freeciv-web/src/main/webapp/images/terrain/plains2.png index 903d2c303..8eb8d5361 100644 Binary files a/freeciv-web/src/main/webapp/images/terrain/plains2.png and b/freeciv-web/src/main/webapp/images/terrain/plains2.png differ diff --git a/freeciv-web/src/main/webapp/images/terrain/tundra2.png b/freeciv-web/src/main/webapp/images/terrain/tundra2.png index 958d96cd0..374101260 100644 Binary files a/freeciv-web/src/main/webapp/images/terrain/tundra2.png and b/freeciv-web/src/main/webapp/images/terrain/tundra2.png differ diff --git a/freeciv-web/src/main/webapp/images/unnamedbk-dk.jpg b/freeciv-web/src/main/webapp/images/unnamedbk-dk.jpg new file mode 100644 index 000000000..60cb2d26d Binary files /dev/null and b/freeciv-web/src/main/webapp/images/unnamedbk-dk.jpg differ diff --git a/freeciv-web/src/main/webapp/images/woodgrey-bg.jpg b/freeciv-web/src/main/webapp/images/woodgrey-bg.jpg new file mode 100644 index 000000000..92689104a Binary files /dev/null and b/freeciv-web/src/main/webapp/images/woodgrey-bg.jpg differ diff --git a/freeciv-web/src/main/webapp/javascript/2dcanvas/mapview.js b/freeciv-web/src/main/webapp/javascript/2dcanvas/mapview.js index ab661ae4a..8e3ef08f0 100644 --- a/freeciv-web/src/main/webapp/javascript/2dcanvas/mapview.js +++ b/freeciv-web/src/main/webapp/javascript/2dcanvas/mapview.js @@ -43,7 +43,7 @@ var loaded_images = 0; var sprites_init = false; -var canvas_text_font = "16px Helvetica, sans serif"; // with canvas text support +var canvas_text_font = "16px Candara, sans serif"; // with canvas text support var fullfog = []; @@ -211,7 +211,11 @@ function init_sprites() } } else { // already loaded - $.unblockUI(); + if (renderer == RENDERER_WEBGL) { + webgl_preload(); + } else { + $.unblockUI(); + } } } @@ -225,7 +229,11 @@ function preload_check() if (loaded_images == tileset_image_count) { init_cache_sprites(); - $.unblockUI(); + if (renderer == RENDERER_WEBGL) { + webgl_preload(); + } else { + $.unblockUI(); + } } } @@ -283,7 +291,7 @@ function mapview_window_resized () if (active_city != null || !resize_enabled) return; setup_window_size(); - update_map_canvas_full(); + if (renderer == RENDERER_2DCANVAS) update_map_canvas_full(); } /************************************************************************** @@ -479,7 +487,7 @@ function mapview_put_city_bar(pcanvas, city, canvas_x, canvas_y) { mood_text = celeb; break; } - if (happy_people >= city['size']*0.4999 && unhappy_angry_people==0 && city['size']>2) { + if (happy_people >= city['size']*0.4999 && unhappy_angry_people==0 && city['size']>=city_celebrate_size(city)) { // case handling: city is going to celebrate next turn. if (mood_text == peace) start_celeb = true; } @@ -545,36 +553,38 @@ function mapview_put_city_bar(pcanvas, city, canvas_x, canvas_y) { var txt_measure = pcanvas.measureText(text); var size_measure = pcanvas.measureText(size); - pcanvas.globalAlpha = 0.7; - pcanvas.fillStyle = "rgba(0, 0, 0, 0.55)"; + pcanvas.globalAlpha = 0.72; + pcanvas.fillStyle = "rgba(0, 0, 0, 0.40)"; pcanvas.fillRect (canvas_x - Math.floor(txt_measure.width / 2) - 14, canvas_y - 17, txt_measure.width + 20, 20); + pcanvas.fillStyle = color; - pcanvas.fillRect(canvas_x + Math.floor(txt_measure.width / 2) + 5, canvas_y - 19, - (prod_type != null) ? size_measure.width + 35 : size_measure.width + 8, 24); + pcanvas.fillRect(canvas_x + Math.floor(txt_measure.width / 2) + 5, canvas_y - 17, + (prod_type != null) ? size_measure.width + 35 : size_measure.width + 8, 20); var city_flag = get_city_flag_sprite(city); + pcanvas.globalAlpha = 0.77; pcanvas.drawImage(sprites[city_flag['key']], - canvas_x - Math.floor(txt_measure.width / 2) - 45, canvas_y - 17); + canvas_x - Math.floor(txt_measure.width / 2) - 44, canvas_y - 17); pcanvas.drawImage(sprites[get_city_occupied_sprite(city)], - canvas_x - Math.floor(txt_measure.width / 2) - 14, canvas_y - 16); - + canvas_x - Math.floor(txt_measure.width / 2) - 12, canvas_y - 16); +/* pcanvas.strokeStyle = color; - pcanvas.lineWidth = 1.5; + pcanvas.lineWidth = 1; pcanvas.beginPath(); - pcanvas.moveTo(canvas_x - Math.floor(txt_measure.width / 2) - 46, canvas_y - 18); - pcanvas.lineTo(canvas_x + Math.floor(txt_measure.width / 2) + size_measure.width + 13, + pcanvas.moveTo(canvas_x - Math.floor(txt_measure.width / 2) - 47, canvas_y - 18); + pcanvas.lineTo(canvas_x + Math.floor(txt_measure.width / 2) + size_measure.width + 14, canvas_y - 18); - pcanvas.moveTo(canvas_x + Math.floor(txt_measure.width / 2) + size_measure.width + 13, + pcanvas.moveTo(canvas_x + Math.floor(txt_measure.width / 2) + size_measure.width + 14, canvas_y + 4); - pcanvas.lineTo(canvas_x - Math.floor(txt_measure.width / 2) - 46, canvas_y + 4); - pcanvas.lineTo(canvas_x - Math.floor(txt_measure.width / 2) - 46, canvas_y - 18); + pcanvas.lineTo(canvas_x - Math.floor(txt_measure.width / 2) - 47, canvas_y + 4); + pcanvas.lineTo(canvas_x - Math.floor(txt_measure.width / 2) - 47, canvas_y - 18); pcanvas.moveTo(canvas_x - Math.floor(txt_measure.width / 2) - 15, canvas_y - 17); pcanvas.lineTo(canvas_x - Math.floor(txt_measure.width / 2) - 15, canvas_y + 3); pcanvas.stroke(); - +*/ pcanvas.globalAlpha = 1.0; if (prod_type != null) { @@ -583,7 +593,7 @@ function mapview_put_city_bar(pcanvas, city, canvas_x, canvas_y) { if (tag == null) return; pcanvas.drawImage(sprites[tag], canvas_x + Math.floor(txt_measure.width / 2) + size_measure.width + 13, - canvas_y - 19, 28, 24); + canvas_y - 17, 27, 20); } var shadow_offset_fix = (lose_celeb || city_map_display_mode) ? 1 : 0; //shadow offsets of 2 only look good under white @@ -621,7 +631,8 @@ function mapview_put_tile_label(pcanvas, tile, canvas_x, canvas_y) { /************************************************************************** Renders the national border lines onto the canvas. -**************************************************************************/ + DEPRECATED BECAUSE CPU LOAD WAS TOO HEAVY +*************************************************************************** function mapview_put_grid_line(pcanvas, dir, color, canvas_x, canvas_y) { var x = canvas_x + 47; var y = canvas_y + 3; @@ -648,6 +659,7 @@ function mapview_put_grid_line(pcanvas, dir, color, canvas_x, canvas_y) { pcanvas.closePath(); pcanvas.stroke(); } +*/ /************************************************************************** Renders the national border lines onto the canvas. @@ -910,9 +922,10 @@ function set_default_mapview_active() if (show_compass) $("#compass").show(); else $("#compass").hide(); - mapview_canvas_ctx = mapview_canvas.getContext("2d"); - mapview_canvas_ctx.font = canvas_text_font; - + if (renderer == RENDERER_2DCANVAS) { + mapview_canvas_ctx = mapview_canvas.getContext("2d"); + mapview_canvas_ctx.font = canvas_text_font; + } var active_tab = $('#tabs').tabs('option', 'active'); if (active_tab == TAB_CITIES) { // cities dialog is active diff --git a/freeciv-web/src/main/webapp/javascript/2dcanvas/mapview_common.bm b/freeciv-web/src/main/webapp/javascript/2dcanvas/mapview_common.bm index d706f0e04..94f46b398 100644 --- a/freeciv-web/src/main/webapp/javascript/2dcanvas/mapview_common.bm +++ b/freeciv-web/src/main/webapp/javascript/2dcanvas/mapview_common.bm @@ -597,11 +597,11 @@ function update_map_canvas_check() { if (mapview_active==false || freeze) return; // (freeze currently used for tax sliders) var time = new Date().getTime() - last_redraw_time; - if ((time > MAPVIEW_REFRESH_INTERVAL)) { + if ((time > MAPVIEW_REFRESH_INTERVAL) && renderer == RENDERER_2DCANVAS) { update_map_canvas_full(); } try { - if ( window.requestAnimationFrame != null) requestAnimationFrame(update_map_canvas_check); + if ( renderer == RENDERER_2DCANVAS && window.requestAnimationFrame != null) requestAnimationFrame(update_map_canvas_check); } catch (e) { if (e.name == 'NS_ERROR_NOT_AVAILABLE') { setTimeout(update_map_canvas_check, 100); diff --git a/freeciv-web/src/main/webapp/javascript/2dcanvas/mapview_common.js b/freeciv-web/src/main/webapp/javascript/2dcanvas/mapview_common.js index bf6906eb2..311820458 100644 --- a/freeciv-web/src/main/webapp/javascript/2dcanvas/mapview_common.js +++ b/freeciv-web/src/main/webapp/javascript/2dcanvas/mapview_common.js @@ -433,8 +433,9 @@ function update_map_canvas(canvas_x, canvas_y, width, height) for (city_id in cities) { if (cities[city_id]['traderoute_count']>0) { for (tr = 0; tr < cities[city_id]['traderoute_count']; tr++) { - if (city_trade_routes[city_id][tr]) { + if (city_trade_routes && city_trade_routes[city_id] && city_trade_routes[city_id][tr]) { var correct_x, src=city_id, dest=city_trade_routes[city_id][tr]['partner']; + if (!cities[src] || !cities[dest]) continue; src_x = tiles[cities[src]['tile']]['x']; src_y = tiles[cities[src]['tile']]['y']; dest_x = tiles[cities[dest]['tile']]['x']; @@ -463,7 +464,13 @@ function update_map_canvas(canvas_x, canvas_y, width, height) // console.log(to); // } mapview_canvas_ctx.lineWidth = 3; - mapview_canvas_ctx.strokeStyle = 'rgb(255,0,255)'; + if (!observing) { + if (cities[src].owner !=null && cities[src].owner != client.conn.playing.playerno + && cities[dest].owner != null && cities[dest].owner != client.conn.playing.playerno) { + mapview_canvas_ctx.strokeStyle = 'rgb(255,128,0)'; // Orange: others' traderoutes + } else mapview_canvas_ctx.strokeStyle = 'rgb(255,255,0)'; // Yellow: my traderoutes + } else mapview_canvas_ctx.strokeStyle = 'rgb(255,128,0)'; // Orange: observer (i.e. others') + mapview_canvas_ctx.beginPath(); mapview_canvas_ctx.moveTo(from['gui_dx']-mapview.gui_x0, from['gui_dy']-mapview.gui_y0); mapview_canvas_ctx.lineTo(to['gui_dx']-mapview.gui_x0, to['gui_dy']-mapview.gui_y0); @@ -559,8 +566,6 @@ function put_drawn_sprites(pcanvas, canvas_x, canvas_y, pdrawn, fog) mapview_put_city_bar(pcanvas, pdrawn[i]['city'], canvas_x + offset_x, canvas_y + offset_y); } else if (pdrawn[i]['key'] == "border" ) { mapview_put_border_line(pcanvas, pdrawn[i]['dir'], pdrawn[i]['color'], pdrawn[i]['color2'], pdrawn[i]['color3'], canvas_x, canvas_y); - } else if (pdrawn[i]['key'] == "mapgrid" ) { - mapview_put_grid_line(pcanvas, pdrawn[i]['dir'], pdrawn[i]['color'], canvas_x, canvas_y); } /* else if (pdrawn[i]['key'] == "territory" ) { mapview_territory_fill(pcanvas, pdrawn[i]['color'], canvas_x, canvas_y); } */ else if (pdrawn[i]['key'] == "goto_line" ) { @@ -663,11 +668,11 @@ function update_map_canvas_check() { if (/*mapview_active==false ||*/ freeze) return; // (freeze currently used for tax sliders) var time = new Date().getTime() - last_redraw_time; - if (time > MAPVIEW_REFRESH_INTERVAL) { + if (time > MAPVIEW_REFRESH_INTERVAL && renderer == RENDERER_2DCANVAS) { update_map_canvas_full(); } try { - if (window.requestAnimationFrame != null) requestAnimationFrame(update_map_canvas_check); + if (renderer == RENDERER_2DCANVAS && window.requestAnimationFrame != null) requestAnimationFrame(update_map_canvas_check); } catch (e) { if (e.name == 'NS_ERROR_NOT_AVAILABLE') { setTimeout(update_map_canvas_check, 100); diff --git a/freeciv-web/src/main/webapp/javascript/2dcanvas/tilespec.js b/freeciv-web/src/main/webapp/javascript/2dcanvas/tilespec.js index b7e328243..01bcc359c 100644 --- a/freeciv-web/src/main/webapp/javascript/2dcanvas/tilespec.js +++ b/freeciv-web/src/main/webapp/javascript/2dcanvas/tilespec.js @@ -47,7 +47,8 @@ var border_flag_offsets = { const CITY_WALLS = 1, CITY_COASTAL_DEFENSE = 2, CITY_FORTIFICATIONS = 4, - CITY_CITADEL = 8; + CITY_CITADEL = 8, + CITY_SAM = 16; var current_select_sprite = 0; var max_select_sprite = 4; @@ -284,7 +285,7 @@ function fill_sprite_array(layer, ptile, pedge, pcorner, punit, pcity, citymode) var pterrain = tile_terrain(ptile); sprite_array = sprite_array.concat(fill_terrain_sprite_layer(2, ptile, pterrain, tterrain_near)); - + if (draw_map_grid) sprite_array = sprite_array.concat({"key":"grid.map"}); sprite_array = sprite_array.concat(fill_irrigation_sprite_array(ptile, pcity)); } break; @@ -300,8 +301,7 @@ function fill_sprite_array(layer, ptile, pedge, pcorner, punit, pcity, citymode) if (ptile != null) { // TEST: borders moved from last sub-layer of LAYER_SPECIAL1 to here: // it was drawing on top of resources, and seemed better here: - if (draw_map_grid) sprite_array = sprite_array.concat(get_grid_line_sprites(ptile)); - sprite_array = sprite_array.concat(get_border_line_sprites(ptile)); + sprite_array = sprite_array.concat(get_border_line_sprites(ptile)); var spec_sprite = get_tile_specials_sprite(ptile); if (spec_sprite != null) sprite_array.push(spec_sprite); @@ -359,7 +359,9 @@ function fill_sprite_array(layer, ptile, pedge, pcorner, punit, pcity, citymode) if (layer_sprite) sprite_array.push(layer_sprite); layer_sprite = get_city_coastal_overlay_sprite(pcity); if (layer_sprite) sprite_array.push(layer_sprite); - + layer_sprite = get_city_sam_battery_overlay_sprite(pcity); + if (layer_sprite) sprite_array.push(layer_sprite); + if (polluted) sprite_array.push({"key" : "grid.pollute_icon"}); //pollution icon clearly over top // starving: show empty plate @@ -1153,31 +1155,6 @@ function get_border_line_sprites(ptile) return result; } -/********************************************************************** -...ADD_SPRITE_SIMPLE(t->sprites.grid.main[pedge->type] used in gtk client -***********************************************************************/ -function get_grid_line_sprites(ptile) -{ - var result = []; - - // first test run, just draw the player's border on every tile - - for (var i = 0; i < num_cardinal_tileset_dirs/2; i++) { - var dir = cardinal_tileset_dirs[i]; - var checktile = mapstep(ptile, dir); - - if (checktile != null) { - if (terrains[ptile['terrain']]['name'] == "Deep Ocean") - result.push({"key" : "mapgrid", "dir" : dir, "color": "rgba(66,57,47,1.0)" }); //stronger contrast on deep ocean - else - result.push({"key" : "mapgrid", "dir" : dir, "color": "rgba(0,0,0,0.35)" }); - } - } - - return result; -} - - /********************************************************************** ...returns the shield (not the flag) ***********************************************************************/ @@ -1636,7 +1613,13 @@ function get_unit_activity_sprite(punit) "offset_y" : - unit_activity_offset_y}; } } - + if (client_rules_flag[CRF_MP2_D]) { + if (tile_has_extra(tiles[punit['tile']], EXTRA_DEEPDIVE) && get_unit_class_name(punit) == "Submarine") { + return {"key" : "unit.hidden", + "offset_x" : unit_activity_offset_x, + "offset_y" : - unit_activity_offset_y}; + } + } return null; } function get_city_coastal_overlay_sprite(pcity) { @@ -1669,6 +1652,12 @@ function get_city_fortifications_underlay_sprite(pcity) { } return null; // no underlay. } +function get_city_sam_battery_overlay_sprite(pcity) { + if ((pcity['walls'] & CITY_SAM)) { + return {"key": "city.sam_overlay", "offset_x" : -16, "offset_y" : -24}; + } + return null; // no underlay. +} /* /**************************************************************************** @@ -2376,6 +2365,9 @@ function fill_layer2_sprite_array(ptile, pcity) result_sprites.push(get_base_flag_sprite(ptile)); result_sprites.push({"key" : "base.buoy_mg", "offset_y" : -normal_tile_height / 2}); + } else if (typeof EXTRA_FISHTRAP !== 'undefined' && tile_has_extra(ptile, EXTRA_FISHTRAP)) { + result_sprites.push({"key" : "ts.fishtrap", + "offset_y" : 0}); } if (typeof EXTRA_TILE_CLAIM !== 'undefined' && tile_has_extra(ptile, EXTRA_TILE_CLAIM)) { result_sprites.push({"key" : "base.tileclaim_mg", @@ -2665,7 +2657,7 @@ function create_unit_offset_arrays() vx += 9; vy += 4; break; case "Legion": - vx += 1; vy -= 7; + vx += 1; vy -= 8; break; case "Marines": dx += 2; dy += 2; @@ -2684,6 +2676,14 @@ function create_unit_offset_arrays() dx -= 3; dy -= 3; vx -= 12; vy += 11; break; + case "Missile Submarine": + dx -= 2; dy -= 6; + vx -= 12; vy += 5; + break; + case "Magnum Turret": + dx -= 16; dy -= 2; + vx += 8; vy -= 14; + break; case "Musketeers": dx += 1; dy -= 4; vx += 1; vy -= 19; @@ -2750,6 +2750,10 @@ function create_unit_offset_arrays() case "Transport Helicopter": vx -= 24; vy += 15; break; + case "Trawler": + dx -= 13; dy += 6; + mx -= 6; my += 7; + break; case "Trireme": vx += 2; vy += 1; break; diff --git a/freeciv-web/src/main/webapp/javascript/action_dialog.js b/freeciv-web/src/main/webapp/javascript/action_dialog.js index 2d7497250..e6c42181c 100644 --- a/freeciv-web/src/main/webapp/javascript/action_dialog.js +++ b/freeciv-web/src/main/webapp/javascript/action_dialog.js @@ -28,11 +28,16 @@ var did_not_decide = false; var action_images = { -// 2: "e/gold", // investigate city + 2: "e/eyes", // investigate city + 4: "e/snake", // poison city + 5: "e/snake", // poison city escape 20: "e/gold", // trade route 21: "e/marketplace", // enter marketplace - 22: "e/camel24", // build wonder + 22: "e/camel24", // build wonder 23: "corrupt", // bribe unit + 24: "e/bomb", // sabotage enemy units + 25: "e/bomb", // sabotage enemy units and escape + 26: "orders/capture", // capture unit 27: "orders/build_city_default", 28: "city_user_row", // join city 29: "e/earth", // steal maps @@ -43,7 +48,8 @@ var action_images = { 36: "e/nuclearexplosion", 37: "e/nuclearexplosion", 38: "e/nuclearexplosion", - 39: "orders/pillage", // destroy city + 39: "orders/pillage", // destroy city + 40: "orders/expel", // expel units 41: "orders/disband_recycle", 42: "orders/disband_default", 43: "orders/rehome_default", // home city @@ -51,7 +57,7 @@ var action_images = { 45: "orders/paradrop", 46: "orders/airlift", 47: "e/redexclamation", // Attack - 48: "e/cruisemissile", + 48: "e/boom", 51: "cities_tab_icon", // conquer city 54: "orders/transform_default", 55: "orders/forest_remove_default", @@ -78,10 +84,15 @@ var action_images = { "targetextra": "e/targetextra", "autoattack": "e/redexclamations", "Airbase": "orders/airbase", + "Canal, coastal": "orders/canal", + "Canal, inland": "orders/canal", "Canal": "orders/canal", "Waterway": "orders/canal", "Buoy": "orders/buoy", + "Hideout": "orders/hideout", + "Depth": "orders/deepdive", "": "orders/hideout", + "​": "orders/deepdive", // contains a zero width space to be different from hideout "Maglev": "orders/maglev", "Naval Base": "orders/navalbase", "Oil Well": "orders/oil_well", @@ -92,15 +103,18 @@ var action_images = { "Sea Bridge": "orders/seabridge", "River": "orders/well", "Tile Claim": "nation_tab_icon", - "Fort": "orders/fortress", + "Fort": "orders/fort", "Fortress": "orders/fortress", - "Castle": "orders/fortress", - "Bunker": "orders/fortress", + "Fishtrap": "orders/fishtrap", + "Castle": "orders/castle", + "Bunker": "orders/bunker", "Fallout": "orders/fallout", "Irrigation": "orders/irrigate_default", "Farmland": "orders/irrigation", "Mine": "orders/mine_default", "Pollution": "orders/pollution", + "Vigil": "orders/vigil", + "Sentry": "orders/sentry", "Walls": "e/greatwall" }; @@ -351,6 +365,14 @@ function act_sel_click_function(parent_id, }; send_request(JSON.stringify(packet)); is_more_user_input_needed = true; + /* Siege Rams do targeted sabotage but do NOT select their target: + Only City Walls are the only allowed target. We must set + is_more_user_input_needed = false to avoid the UI getting stuck */ + if (action_id == ACTION_SPY_TARGETED_SABOTAGE_CITY_ESC + && client_rules_flag[CRF_MP2_C] + && unit_type(units[actor_unit_id]).name == "Siege Ram") { + is_more_user_input_needed = false; + } remove_action_selection_dialog(parent_id, actor_unit_id, true); }; case ACTION_FOUND_CITY: @@ -404,9 +426,9 @@ function act_sel_click_function(parent_id, /************************************************************************** Puts an icon into a button image. **************************************************************************/ -function render_action_image_into_button(text, action_id, sub_tgt) +function render_action_image_into_button(text, action_id, sub_tgt, order, activity) { - //console.log("Render action %d:%s sub_tgt=%d",action_id,text,sub_tgt) + //console.log("Render action %d:%s sub_tgt=%s",action_id,text,sub_tgt) if (action_images[action_id]) { var key = action_id; //console.log(" Key starts at %s",key); @@ -417,13 +439,36 @@ function render_action_image_into_button(text, action_id, sub_tgt) //console.log(" sub_tgt not undefined etc."); if (action_id == ACTION_ROAD || action_id == ACTION_BASE) { //console.log(" action_id is ROAD or BASE"); - if (action_images[extras[sub_tgt]['name']]) { - key = extras[sub_tgt]['name']; + if (action_images[extras[sub_tgt]['rule_name']]) { + key = extras[sub_tgt]['rule_name']; //console.log(" Reassigned key:%s",key); + if (key == "Depth") text = "Dive Deep"; + else if (key=="Hideout") text = "Build Hideout"; } } }; + /* ACTION_COUNT could mean 1. NO ACTION, or, 2. a new ACTIVITY instead + of an ACTION performance: */ + if (key == ACTION_COUNT) { + if (order && order == ORDER_ACTIVITY && activity) { + switch (activity) { + case ACTIVITY_SENTRY: + key = "Sentry"; + break; + case ACTIVITY_FALLOUT: + key = "Fallout"; + break; + case ACTIVITY_POLLUTION: + key = "Pollution"; + break; + case ACTIVITY_VIGIL: + key = "Vigil"; + break; + } + } + } + text = " " + text; @@ -449,8 +494,10 @@ function create_act_sel_button(parent_id, // Fix inaccurate "Conquer City" to "Raze City" for size 1 city: if (button_text.includes("Conquer")) { var pcity = cities[tgt_id]; - if (pcity && pcity['size']==1) + if (pcity && pcity['size']==1 + && unit_has_class_flag(units[actor_unit_id], UCF_KILLCITIZEN)) { button_text = button_text.replace("Conquer", "Raze"); + } } if (action_id == ACTION_BASE && button_text.includes("Base")) { @@ -461,10 +508,14 @@ function create_act_sel_button(parent_id, //console.log("\nmaking target=%d subtarget=%d",tgt_id, sub_tgt_id); button_text = button_text.replace("Road", extras[sub_tgt_id]['name']) sub_target_override = sub_tgt_id; - } + } else if (action_id == ACTION_SPY_BRIBE_UNIT) { + if (unit_type(units[actor_unit_id])['name'] == "Patriarch") + button_text = button_text.replace("Bribe Enemy", "Convert"); + } if (action_images[action_id]) { button_text = render_action_image_into_button(button_text, action_id, sub_target_override); + button_text = button_text.replace("Build Dive Deep","Dive Deep"); } /* Create the initial button with this action */ var button = { @@ -614,19 +665,26 @@ function popup_action_selection(actor_unit, action_probabilities, } } if (action_id == ACTION_TRANSPORT_DEBOARD) { - if (!unit_can_do_unload(actor_unit)) + if (!unit_can_deboard(actor_unit)) continue; } if (action_id == ACTION_TRANSPORT_UNLOAD) { - if (!unit_can_do_unload(target_unit)) + if (!unit_can_deboard(target_unit)) continue; } // if (action_id == ACTION_TRANSPORT_LOAD) {} action not backported yet //------------------------------------------------------------------------------------ - buttons.push(create_act_sel_button(id, actor_unit['id'], - tgt_id, sub_tgt_id, action_id, - action_probabilities)); - if (action_id==ACTION_ATTACK) focus_button = "act_sel_"+ACTION_ATTACK+"_"+actor_unit['id']; + + if (action_id==ACTION_ATTACK || action_id==ACTION_CONQUER_CITY) { + // Attack and Conquer should always be first on menu to avoid + // regrettable misclick issues... + focus_button = "act_sel_"+action_id+"_"+actor_unit['id']; + buttons.unshift(create_act_sel_button(id, actor_unit['id'], + tgt_id, sub_tgt_id, action_id, action_probabilities)); + } else { + buttons.push(create_act_sel_button(id, actor_unit['id'], + tgt_id, sub_tgt_id, action_id, action_probabilities)); + } } } } @@ -774,7 +832,7 @@ function popup_action_selection(actor_unit, action_probabilities, + "units (up to 40%/turn): emulating damage reduction to the\n" + "Fortress defense bonus. HP healing of units (up to 40%/turn),\n" + "emulates resistance and repairing Fortress damage over the\n" - + "course of a long siege.\n" + + "course of a long siege." } else if (buttons[button_id].html.includes("Targeted Sabotage")) { buttons[button_id].html = "Attack City Walls ([25%, 50%])" @@ -786,6 +844,20 @@ function popup_action_selection(actor_unit, action_probabilities, + "of the City Walls or the loss of the Siege Ram." } } break; + case "Ballista": for (button_id in buttons) { + if (buttons[button_id].html.includes("Special Attack")) { + buttons[button_id].html = buttons[button_id].html.replace("Special Attack", utype_get_bombard_name(ptype)) + buttons[button_id].title = "Odds of survival: 100%\n" + + "Combat: 5 rounds\n" + + "Targets: 2 units\n" + + "Move cost: 2 moves\n" + + "Min. moves: hasn't moved\n" + + "Max. casualties: 2\n" + + "\nPoor accuracy but deadly firepower is represented by\n" + + "5 rounds at 5x firepower vs up to 2 units. Targets\n" + + "will either be missed, badly damaged, or killed." + } + } break; case "Phalanx": for (button_id in buttons) { if (buttons[button_id].html.includes("Special Attack")) { buttons[button_id].html = buttons[button_id].html.replace("Special Attack", utype_get_bombard_name(ptype)) @@ -797,7 +869,7 @@ function popup_action_selection(actor_unit, action_probabilities, + "Casualties: --\n" + "\nA 3 round rumble against one unit on the target tile\n" + "represents the Phalanx safely pushing from a held\n" - + "position vs. a weak defender who comes too close.\n" + + "position vs. a weak defender who comes too close." } } break; case "Archers": for (button_id in buttons) { @@ -864,7 +936,59 @@ function popup_action_selection(actor_unit, action_probabilities, + "Move cost: 1 5/9 moves\n" + "Max. casualties: 1\n" + "\nHardened Marines use agility/mobility over terrain features for hit-and-run\n" - + "ballistic attacks: 3 rounds of combat on up to 4 occupants of a tile.\n" + + "ballistic attacks: 3 rounds of combat on up to 4 occupants of a tile." + } + } break; + case "Catapult": for (button_id in buttons) { + if (buttons[button_id].html.includes("Special Attack")) { + buttons[button_id].html = buttons[button_id].html.replace("Special Attack", utype_get_bombard_name(ptype)) + buttons[button_id].title = "Odds of survival: 100%\n" + + "Combat: 4 rounds\n" + + "Targets: 1 unit\n" + + "Move cost: 2 moves\n" + + "Min. moves: hasn't moved\n" + + "Max. casualties: 1\n" + + "\nHurls rocks on 1 unit on the target tile for\n" + + "4 rounds. Can't be done to Fortress or City." + } + } break; + case "Cannon": for (button_id in buttons) { + if (buttons[button_id].html.includes("Special Attack")) { + buttons[button_id].html = buttons[button_id].html.replace("Special Attack", utype_get_bombard_name(ptype)) + buttons[button_id].title = "Odds of survival: 100%\n" + + "Combat: 5 rounds\n" + + "Targets: 2 units\n" + + "Move cost: 2 moves\n" + + "Min. moves: hasn't moved\n" + + "Max. casualties: 1\n" + + "\nBombards up to 2 units on the target tile for\n" + + "5 rounds. Can't be done to Fortress or City." + } + } break; + case "Artillery": for (button_id in buttons) { + if (buttons[button_id].html.includes("Special Attack")) { + buttons[button_id].html = buttons[button_id].html.replace("Special Attack", utype_get_bombard_name(ptype)) + buttons[button_id].title = "Odds of survival: 100%\n" + + "Combat: 6 rounds\n" + + "Targets: 3 units\n" + + "Move cost: 2 moves\n" + + "Min. moves: hasn't moved\n" + + "Max. casualties: 1\n" + + "\nBombards up to 3 units on the target tile for\n" + + "6 rounds. Can't be done to Fortress or City." + } + } break; + case "Howitzer": for (button_id in buttons) { + if (buttons[button_id].html.includes("Special Attack")) { + buttons[button_id].html = buttons[button_id].html.replace("Special Attack", utype_get_bombard_name(ptype)) + buttons[button_id].title = "Odds of survival: 100%\n" + + "Combat: 7 rounds\n" + + "Targets: 4 units\n" + + "Move cost: 4 moves\n" + + "Min. moves: hasn't moved\n" + + "Max. casualties: 1\n" + + "\nBombards up to 4 units on the target tile for\n" + + "7 rounds. Can't be done to Fortress or City." } } break; case "Battleship": for (button_id in buttons) { @@ -876,7 +1000,7 @@ function popup_action_selection(actor_unit, action_probabilities, + "Move cost: 5 moves\n" + "Max. casualties: 1\n" + "\nUses the range advantage of massive large guns to safely\n" - + "shell and degrade up to 4 distant targets on a tile or city.\n" + + "shell and degrade up to 4 distant targets on a tile or city." } } break; case "Zeppelin": for (button_id in buttons) { @@ -888,7 +1012,7 @@ function popup_action_selection(actor_unit, action_probabilities, + "Move cost: 2 moves\n" + "Max. casualties: 1\n" + "\nDrops shrapnel bombs in the vicinity of enemies,\n" - + "affecting up to 2 units and possibly killing one.\n" + + "affecting up to 2 units and possibly killing one." } } break; } @@ -926,10 +1050,12 @@ function popup_bribe_dialog(actor_unit, target_unit, cost, act_id) .appendTo("div#game_page"); dhtml += "Treasury contains " + unit_owner(actor_unit)['gold'] + " gold. "; - dhtml += "The price of bribing " - + nations[unit_owner(target_unit)['nation']]['adjective'] - + " " + unit_types[target_unit['type']]['name'] - + " is " + cost + ". "; + + dhtml += "The cost of " + + (unit_type(actor_unit)['name'] == "Patriarch" ? "converting " : "bribing ") + + nations[unit_owner(target_unit)['nation']]['adjective'] + + " " + unit_types[target_unit['type']]['name'] + + " is " + cost + ". "; bribe_possible = cost <= unit_owner(actor_unit)['gold']; @@ -1475,15 +1601,16 @@ function create_select_tgt_extra_button(parent_id, actor_unit_id, var text = ""; var button = {}; var target_tile = index_to_tile(target_tile_id); - var title = extras[target_extra_id]['name']; + var title = extras[target_extra_id]['rule_name']; if (title=="") title = "Hideout"; + else if (title=="​Depth") title = "Deep Depth"; var spacer = " " + (title == "Walls" ? "  " : ""); // UI Heuristic: buttons for stuff you can never do get rejected: if (title.includes("Quay") && title.length == 5) return null; //quay+"" 0-width char can't be made // - text += render_action_image_into_button(spacer+title, extras[target_extra_id]['name'], + text += render_action_image_into_button(spacer+title, extras[target_extra_id]['rule_name'], target_extra_id); if (tile_has_extra(target_tile, target_extra_id)) { @@ -1665,6 +1792,11 @@ function select_last_action() var id = "#sel_last_action_dialog"; var dhtml = ""; var buttons = []; + var ptype = current_focus.length ? unit_type(current_focus[0]) : null; + var uname = ptype ? ptype.name : null; + var can_vigil = ptype ? /*utype_has_flag(ptype, UTYF_NONPROVOKEVIGIL) || commented out because !moved_this_turn req*/ + uname.includes("Fighter") : true; + const msub = (uname == "Missile Submarine") /* "DIVE DEEP" fools utype_can_do_action /* Reset dialog page. */ remove_active_dialog(id); @@ -1680,9 +1812,7 @@ function select_last_action() /* TODO: ========================================================================================================= - make non-working //commented-out actions to work - expel and capture units trying to do to same tile instead of next one. - order_wants_direction() isn't working somehow? */ + make non-working //commented-out actions to work */ //function add_action_last_button(buttons, action_id, override_name, order, activity, target, subtarget) buttons = add_action_last_button(buttons, ACTION_ATTACK); @@ -1694,65 +1824,87 @@ function select_last_action() buttons = add_action_last_button(buttons, ACTION_TRANSPORT_BOARD, "Board"); */ buttons = add_action_last_button(buttons, ACTION_SPY_BRIBE_UNIT, "Bribe"); - if (tech_known('Radio')) + if (tech_known('Radio') && (!uname || uname =="Trawler")) + buttons = add_action_last_button(buttons, ACTION_BASE, "Build Buoy", ORDER_PERFORM_ACTION, null, null, EXTRA_BUOY); + if (tech_known('Radio') && uname !="Trawler" && !msub) buttons = add_action_last_button(buttons, ACTION_BASE, "Build Airbase", ORDER_PERFORM_ACTION, null, null, EXTRA_AIRBASE); buttons = add_action_last_button(buttons, ACTION_FOUND_CITY, "Build City"); - if (client_rules_flag[CRF_MASONRY_FORT] && tech_known('Masonry')) + if (client_rules_flag[CRF_MASONRY_FORT] && tech_known('Masonry') && uname !="Trawler" && !msub) buttons = add_action_last_button(buttons, ACTION_BASE, "Build Fort", ORDER_PERFORM_ACTION, null, null, EXTRA_FORT); - if (tech_known('Construction')) + if (tech_known('Construction') && uname != "Trawler" && !msub) buttons = add_action_last_button(buttons, ACTION_BASE, "Build Fortress", ORDER_PERFORM_ACTION, null, null, EXTRA_FORTRESS); - if (client_rules_flag[CRF_CANALS] && tech_known('Engineering')) { + if (client_rules_flag[CRF_EXTRA_HIDEOUT] && server_settings.hideouts.val && tech_known('Warrior Code') && (!ptype || utype_has_flag(ptype,UTYF_FOOTSOLDIER))) + buttons = add_action_last_button(buttons, ACTION_BASE, "Build Hideout", ORDER_PERFORM_ACTION, null, null, EXTRA_); + if (client_rules_flag[CRF_CANALS] && tech_known('Engineering') && !msub) { buttons = add_action_last_button(buttons, ACTION_ROAD, "Canal, coastal", ORDER_PERFORM_ACTION, null, null, EXTRA_CANAL); buttons = add_action_last_button(buttons, ACTION_ROAD, "Canal, inland", ORDER_PERFORM_ACTION, null, null, EXTRA_WATERWAY); } -// buttons = add_action_last_button(buttons, ACTION_CAPTURE_UNITS); // acts on wrong tile, as do the below: -// buttons = add_action_last_button(buttons, ACTION_CLEAN_POLLUTION, "Clean Pollution", ORDER_PERFORM_ACTION, ACTIVITY_CLEAN_POLLUTION, EXTRA_POLLUTION, EXTRA_POLLUTION); -// buttons = add_action_last_button(buttons, ACTION_CLEAN_FALLOUT, "Clean Fallout", ORDER_PERFORM_ACTION, null, null, EXTRA_FALLOUT); + buttons = add_action_last_button(buttons, ACTION_CAPTURE_UNITS, "Capture Unit"); + + if (!msub) { + buttons = add_action_last_button(buttons, ACTION_COUNT, "Clean Pollution", ORDER_ACTIVITY, ACTIVITY_POLLUTION, null, EXTRA_POLLUTION); + buttons = add_action_last_button(buttons, ACTION_COUNT, "Clean Fallout", ORDER_ACTIVITY, ACTIVITY_FALLOUT, null, EXTRA_FALLOUT); + } + buttons = add_action_last_button(buttons, ACTION_CONQUER_CITY); buttons = add_action_last_button(buttons, ACTION_CONVERT); - buttons = add_action_last_button(buttons, ACTION_CULTIVATE); + if (!msub) + buttons = add_action_last_button(buttons, ACTION_CULTIVATE); buttons = add_action_last_button(buttons, ACTION_SUICIDE_ATTACK, "Detonate Missile"); buttons = add_action_last_button(buttons, ACTION_NUKE, "Detonate Nuke"); + if (client_rules_flag[CRF_MP2_D] && (!uname || uname == "Missile Submarine")) + buttons = add_action_last_button(buttons, ACTION_BASE, "Dive Deep", ORDER_PERFORM_ACTION, null, null, EXTRA_DEEPDIVE); buttons = add_action_last_button(buttons, ACTION_TRANSPORT_EMBARK, "Embark"); buttons = add_action_last_button(buttons, ACTION_TRADE_ROUTE); + buttons = add_action_last_button(buttons, ACTION_EXPEL_UNIT); buttons = add_action_last_button(buttons, ACTION_FORTIFY); buttons = add_action_last_button(buttons, ACTION_HELP_WONDER); buttons = add_action_last_button(buttons, ACTION_HOME_CITY, "Home City"); - buttons = add_action_last_button(buttons, ACTION_IRRIGATE, "Irrigate"); // works on blank tiles but not farmland - if (tech_known('Refrigeration')) + if (uname != "Trawler" && !msub) + buttons = add_action_last_button(buttons, ACTION_IRRIGATE, "Irrigate"); // works on blank tiles but not farmland + if (tech_known('Refrigeration') && uname != "Trawler" && !msub) buttons = add_action_last_button(buttons, ACTION_IRRIGATE, "Irrigate Farmland", ORDER_PERFORM_ACTION, null, null, EXTRA_FARMLAND); buttons = add_action_last_button(buttons, ACTION_JOIN_CITY); //buttons = add_action_last_button(buttons, ACTION_TRANSPORT_LOAD); // GET FROM SVEINUNG WHO FINISHED THIS RECENTLY - if (client_rules_flag[CRF_MAGLEV] && tech_known('Superconductors')) + if (client_rules_flag[CRF_MAGLEV] && tech_known('Superconductors') && !msub) buttons = add_action_last_button(buttons, ACTION_ROAD, "MagLev", ORDER_PERFORM_ACTION, null, null, EXTRA_MAGLEV); + if (uname !="Trawler") { + if (!msub) { + buttons = add_action_last_button(buttons, ACTION_MINE, "Mine", ORDER_PERFORM_ACTION, null, null, EXTRA_MINE); + } + buttons = add_action_last_button(buttons, ACTION_PILLAGE, "Pillage Anything", ORDER_PERFORM_ACTION, null, null, -1); + } + + if (!msub) { + buttons = add_action_last_button(buttons, ACTION_PLANT, "Plant"); + buttons = add_action_last_button(buttons, ACTION_SPY_POISON_ESC, "Poison City"); - buttons = add_action_last_button(buttons, ACTION_MINE, "Mine", ORDER_PERFORM_ACTION, null, null, EXTRA_MINE); - buttons = add_action_last_button(buttons, ACTION_PILLAGE, "Pillage Anything", ORDER_PERFORM_ACTION, null, null, -1); - buttons = add_action_last_button(buttons, ACTION_PLANT, "Plant"); - buttons = add_action_last_button(buttons, ACTION_SPY_POISON_ESC, "Poison City"); - - if (tech_known('Railroad')) - buttons = add_action_last_button(buttons, ACTION_ROAD, "Railroad", ORDER_PERFORM_ACTION, null, null, EXTRA_RAILROAD); - buttons = add_action_last_button(buttons, ACTION_ROAD, "Road", ORDER_PERFORM_ACTION, null, null, EXTRA_ROAD); + if (tech_known('Railroad')) { + buttons = add_action_last_button(buttons, ACTION_ROAD, "Railroad", ORDER_PERFORM_ACTION, null, null, EXTRA_RAILROAD); + } + buttons = add_action_last_button(buttons, ACTION_ROAD, "Road", ORDER_PERFORM_ACTION, null, null, EXTRA_ROAD); + } buttons = add_action_last_button(buttons, ACTION_RECYCLE_UNIT); - buttons = add_action_last_button(buttons, ACTION_SPY_SABOTAGE_UNIT_ESC); + buttons = add_action_last_button(buttons, ACTION_SPY_SABOTAGE_UNIT_ESC, "Sabotage Unit"); + buttons = add_action_last_button(buttons, ACTION_COUNT, "Sentry", ORDER_ACTIVITY, ACTIVITY_SENTRY, null, -1); buttons = add_action_last_button(buttons, ACTION_SPY_ATTACK, "Spy vs. Spy"); - buttons = add_action_last_button(buttons, ACTION_STEAL_MAPS); - buttons = add_action_last_button(buttons, ACTION_STEAL_MAPS_ESC); + buttons = add_action_last_button(buttons, ACTION_STEAL_MAPS, "Steal Map"); + buttons = add_action_last_button(buttons, ACTION_STEAL_MAPS_ESC, "Steal Map Escape"); buttons = add_action_last_button(buttons, ACTION_TRANSFORM_TERRAIN); - // buttons = add_action_last_button(buttons, ACTION_EXPEL_UNIT); act on wrong tile /* Currently disallowed until actionenablers can guarantee this is legal at the server level. TODO: when ruleset has actionenablers regulating ACTION_TRANSPORT_UNLOAD legality, this button can return. buttons = add_action_last_button(buttons, ACTION_TRANSPORT_UNLOAD); */ buttons = add_action_last_button(buttons, ACTION_UPGRADE_UNIT); + if (can_vigil) + buttons = add_action_last_button(buttons, ACTION_COUNT, "Vigil", ORDER_ACTIVITY, ACTIVITY_VIGIL, null, -1); buttons = add_action_last_button(buttons, ACTION_COUNT, "NO ACTION", ORDER_LAST); var close_button = { - html: render_action_image_into_button("Cancel (𝗪)", "cancel"), + html: render_action_image_into_button("Cancel (𝗪)", "cancel"), click: function() { remove_active_dialog(id); deactivate_goto(false); @@ -1799,7 +1951,7 @@ function add_action_last_button(buttons, action_id, override_name, order, activi if (!override_name) override_name = actions[action_id]['ui_name'].replace("%s", "").replace("%s",""); var new_button = create_action_last_button(override_name, action_id, order, activity, target, subtarget); - new_button.html = render_action_image_into_button(new_button.html, action_id); + new_button.html = render_action_image_into_button(new_button.html, action_id, subtarget, order, activity); buttons.push(new_button); return buttons; diff --git a/freeciv-web/src/main/webapp/javascript/banlist.js b/freeciv-web/src/main/webapp/javascript/banlist.js index 1e060f30e..fb33e9f15 100644 --- a/freeciv-web/src/main/webapp/javascript/banlist.js +++ b/freeciv-web/src/main/webapp/javascript/banlist.js @@ -21,7 +21,7 @@ /* This is a list of banned users of Freeciv-web. Note that user accounts can also be disabled by setting activated=0 in the auth DB table. */ -var banned_users = ["Blank", "DMX", "Canik"]; +var banned_users = ["Blank", "KickedPlayer"]; /************************************************************************** Returns false if the text contains a banned user. diff --git a/freeciv-web/src/main/webapp/javascript/city.js b/freeciv-web/src/main/webapp/javascript/city.js index 9a35f25ec..c48ce9b68 100644 --- a/freeciv-web/src/main/webapp/javascript/city.js +++ b/freeciv-web/src/main/webapp/javascript/city.js @@ -153,6 +153,7 @@ function remove_city(pcity_id) var update = client.conn.playing.playerno && city_owner(pcity).playerno == client.conn.playing.playerno; var ptile = city_tile(cities[pcity_id]); delete cities[pcity_id]; + if (renderer == RENDERER_WEBGL) update_city_position(ptile); if (update) { city_screen_updater.update(); @@ -377,7 +378,7 @@ function show_city_dialog(pcity) } else { city_dialog_title += "
"; + +">
"; } } city_dialog_title += "
"; @@ -508,12 +509,17 @@ function show_city_dialog(pcity) $("#worklist_dialog_headline").unbind('click'); $("#worklist_dialog_headline").click(function(ev) { ev.stopImmediatePropagation(); city_remove_current_prod()} ); + var orig_renderer = renderer; + renderer = RENDERER_2DCANVAS; + set_citydlg_dimensions(pcity); set_city_mapview_active(); // Center map on area around city for when they leave the city + //save_map_return_position(city_tile(pcity)); //save tile locations for shift-spacebar return position function center_tile_mapcanvas(city_tile(pcity)); update_map_canvas(0, 0, mapview['store_width'], mapview['store_height']); + renderer = orig_renderer; var pop_string = is_small_screen() ? city_population(pcity)+"K" : numberWithCommas(city_population(pcity)*1000); var change_string = pcity['granary_turns'] < 0 ? "Starves in: " : "Growth in: "; @@ -656,7 +662,7 @@ function show_city_dialog(pcity) "
"; @@ -685,8 +691,15 @@ function show_city_dialog(pcity) var sunits = get_supported_units(pcity); if (sunits != null) { var supported_units_html = ""; + var upkeep_str = ""; + var fu=0,gu=0,su=0; // total upkeep counters for (var t = 0; t < sunits.length; t++) { punit = sunits[t]; + if (punit['upkeep'] != null) { + su += parseInt(punit['upkeep'][O_SHIELD],10); + fu += parseInt(punit['upkeep'][O_FOOD],10); + gu += parseInt(punit['upkeep'][O_GOLD],10); + } sprite = get_unit_image_sprite(punit); if (sprite == null) { console.log("Missing sprite for " + punit); @@ -705,6 +718,11 @@ function show_city_dialog(pcity) + get_html_hp_sprite(punit,false) + get_html_activity_sprite(punit); } + if (fu) upkeep_str += "" + fu + ""; + if (su) upkeep_str += "" + su + ""; + if (gu) upkeep_str += "" + gu + ""; + + $("#city_supported_units_title").html("Supported Units: "+upkeep_str+""); $("#city_supported_units_list").html(supported_units_html); // trick to compensate for removed scrollbar clipping the top: $("#city_supported_units_list").css({"margin-top":"-10px","padding-top":"20px"}); @@ -737,11 +755,11 @@ function show_city_dialog(pcity) var trade_txt2 = pcity['surplus'][O_TRADE]==pcity['prod'][O_TRADE] ? "" : "(" + pcity['prod'][O_TRADE] + ")"; if (pcity.traderoute_count) { trade_txt2 += - "" + "" + "" + "" + get_city_traderoute_revenue(pcity['id'])+""; } - + var gold_txt = ""; if (pcity['surplus'][O_GOLD] > 0) gold_txt += "+"; else gold_txt += ""; @@ -876,7 +894,7 @@ function show_city_dialog(pcity) var happy_people = pcity['ppl_happy'][FEELING_FINAL]; var unhappy_angry_people = pcity['ppl_unhappy'][FEELING_FINAL]+pcity['ppl_angry'][FEELING_FINAL]; // Color code for upcoming state under current configuration of tiles/luxury rate/improvements/deployed units: - if (happy_people >= pcity['size']*0.4999 && unhappy_angry_people==0 && pcity['size']>2) { + if (happy_people >= pcity['size']*0.4999 && unhappy_angry_people==0 && pcity['size']>=city_celebrate_size(pcity)) { next_state = "Celebrating"; $('#rapture_status').attr('title', "Celebration next turn"); if (!pissed) { rapture_status_class = "city_dialog_celeb"; @@ -895,15 +913,59 @@ function show_city_dialog(pcity) $('#rapture_status').attr('title', get_city_state_description(get_city_state(pcity),next_state)); $('#rapture_food').html(rapture_food_status_html); - - $('#rapture_status').html("
"+get_city_state(pcity)+"
"); + + var rapture_status_icon = ""; + /* 4-bit code. BIT values: + 1 = raptured this turn + 2 = raptures next turn. (pause this turn) + 4 = raptures in 2 turns. (pause next turn) + 8 = raptures in 3 turns. (pause 2 turns) + */ + const RLAST = 1, + RNOW = 2, + R2 = 4, + R3 = 8; + switch (pcity.rapture_status) { + case RLAST: + rapture_status_icon = "" + break; + /* all possibilities of bit 2 being on, i.e., can rapture this turn*/ + case RNOW: + case RNOW+RLAST: + case RNOW+R2: + case RNOW+RLAST+R2: + case RNOW+R3: + case RNOW+R3+RLAST: + case RNOW+R2+R3: + case RNOW+RLAST+R2+R3: + rapture_status_icon = "" + break; + /* bit 4, can rapture next turn BUT NOT this turn */ + case R2: + case R2+RLAST: + case R2+R3: + case R2+R3+RLAST: + rapture_status_icon = "" + break; + /* bit 8 can rapture in 2 turns BUT NOT this turn or next turn */ + case R3: + case R3+RLAST: + rapture_status_icon = "" + break; + } + $('#rapture_status').html("
"+ rapture_status_icon + "" + + get_city_state(pcity)+"
"); $('#rapture_status').tooltip({ tooltipClass: "wider-tooltip" , position: { my:"center bottom", at: "center top-3"}, show: { delay:200, effect:"none", duration: 0 }, hide: {delay:120, effect:"none", duration: 0} }); - if (pcity['size'] >= 27) $("#city_canvas_top_div").width(pcity['size']*15-30); // Fix the specialist panel overlapping with the citizen amounts panel for bigger cities - + /* Fix the citzen panel overlaps the "citizen amounts" panel for bigger cities with 5 city_radius_sq + * Those with larger city_radius_sq get a bigger canvas with more room */ + if (pcity.city_radius_sq<=5 && pcity['size'] >= 27) { + $("#city_canvas_top_div").width(pcity['size']*15-30); + } + $('#disbandable_city').off(); $('#disbandable_city').prop('checked', pcity['city_options'] != null && pcity['city_options'].isSet(CITYO_DISBAND)); @@ -989,6 +1051,21 @@ function city_change_tab(tab_num) { city_tab_index = tab_num; } +/************************************************************************** + The size at which a city can celebrate. +**************************************************************************/ +function city_celebrate_size(pcity) { + var csize = game_info.celebratesize; + + // TODO: evaluate effects[137] (EFT_CELEBRATE_SIZE_ADD) instead of hard-coded: + if (client_rules_flag[CRF_MP2_D]) { + if (player_has_wonder(players[pcity.owner].playerno, improvement_id_by_name(B_ANGKOR_WAT))) { + csize -= 1; + } + } + return csize; +} + /************************************************************************** Returns the name and sprite of the current city production. **************************************************************************/ @@ -1521,7 +1598,7 @@ function close_city_dialog() if (active_city) { // map will be centered on city that was being viewed center_tile_mapcanvas(city_tile(active_city)); active_city = null; - update_map_canvas_full(); + if (renderer == RENDERER_2DCANVAS) update_map_canvas_full(); } // Closing city dialog re-shows container for minimized windows: @@ -1534,31 +1611,36 @@ function close_city_dialog() **************************************************************************/ function do_city_map_click(ptile) { - // updated==if cityhand.c:handle_city_specialist() looks at - // the top 3 bits in city_id for the type of specialst to make: - var updated = true; - var packet = null; var city_id = active_city['id']; if (ptile['worked'] == city_id) { - // Server defaults to make tile-worker into an entertainer. - // Override it if user has a selected_specialist type: - if (updated) { // only run this feature on updated server - var s = selected_specialist; - if (s >= 4) {city_id += 32768; s-= 4;} - if (s >= 2) {city_id += 16384; s-= 2;} - if (s >= 1) {city_id += 8192; } - } + + // Disallow attempting specialist if clicking someone else's worked tile: + if (ptile.owner != client.conn.playing.playerno + && ptile.owner != UNCLAIMED_LAND) { + play_sound("click_illegal.ogg"); + return; + } + packet = {"pid" : packet_city_make_specialist, "city_id" : city_id, - "tile_id" : ptile['index'] + "tile_id" : ptile['index'], + "specialist_to": (selected_specialist ? selected_specialist : 0) }; } else { + // Disallow attempting to work a tile not in the city's workable map: + if (!city_map_includes_tile(ptile, active_city)) { + play_sound("click_illegal.ogg"); + return; + } + packet = {"pid" : packet_city_make_worker, "city_id" : city_id, "tile_id" : ptile['index']}; } + send_request(JSON.stringify(packet)); + //play_sound("click_legal.ogg"); } /************************************************************************** @@ -1931,6 +2013,33 @@ function get_city_tile_map_for_pos(x, y) return get_city_tile_map_for_pos(x, y); } +/************************************************************************** + Returns true if a tile is legally workable by a city +**************************************************************************/ +function city_map_includes_tile(ptile, pcity) +{ + if (!ptile || !pcity) return false; + + var radius = pcity.city_radius_sq; + var ctile = city_tile(pcity); + var dist = sq_map_distance(ptile, ctile); + + /* To be in the workable city map, a tile must be: + 1. ...in the city's workable city_radius_sq + 2. ...not owned by a player other than city's owner */ + if (dist > radius) { + return false; + } + else if (ptile.owner == UNCLAIMED_LAND) { + return true; + } + else if (ptile.owner != pcity.owner) { + return false; + } + + return true; +} + /************************************************************************** Toggles specialist control pane in city title bar. **************************************************************************/ @@ -2257,10 +2366,17 @@ function show_city_traderoutes() tcity = cities[tcity_id]; if (tcity == null) continue; - //msg += good['name'] + " trade with " + tcity['name']; - //msg += " gives +" + routes[i]['value'] + " base trade each turn." + "
"; - msg += "Trade Route to " + tcity['name'] +": "; - msg += "+" + routes[i]['value'] + " base trade each turn." + "
"; + var city_flag_tag = nations[players[tcity['owner']]['nation']]['graphic_str']; + var city_flag_url = "/images/flags/" + city_flag_tag + "-web" + get_tileset_file_extention(); + var city_flag = "
"; + var city_link = "" + tcity.name+""; + msg += city_flag + "
 Trade Route to the " + nations[players[tcity.owner].nation].adjective + + " city of " + city_link + ": "; + msg += "+" + routes[i]['value'] + " base trade each turn." + "
"; } if (msg == "") { @@ -2599,7 +2715,7 @@ function populate_worklist_production_choices(pcity) + "" + production_list[a]['text'] + ""; if (kind == VUT_UTYPE /*&& !small*/) { - production_html += "" + production_list[a]['unit_details'] + "" + "" + get_universal_discount_price(unit_types[value],pcity) + ""; @@ -2650,6 +2766,7 @@ function populate_worklist_production_choices(pcity) return; } send_city_worklist_add(pcity['id'], kind, value); + production_selection = []; }); } else { $(".kindvalue_item").click(function() { @@ -3467,7 +3584,7 @@ function update_city_screen() var citizen_types = ["unhappy","content","happy"] var sprite; var city_list_citizen_html = ""; - var updown_sort_arrows = ""; + var updown_sort_arrows = ""; // Used for generating micro-icon of current prooduction: var prod_sprite; var prod_img_html; @@ -3486,15 +3603,15 @@ function update_city_screen() city_list_html = "" + "" + ""+city_list_citizen_html - + "" - + "" - + "" - + "" - + "" + + "" + + "" + + "" + + "" + + "" // + "" - + "" - + "" - + "" + + "" + + "" + + "" + "" + "" + ""+city_list_citizen_html + "" - + "" - + "" - + "" + + "" + + "" + + "" + "" - + "" - + "" - + "" + + "" + + "" + + "" /*+ "" + ""+city_list_citizen_html + "" - + "" - + "" - + "" + + "" + + "" + + "" + "" - + "" - + "" - + "" + + "" + + "" + + "" + "" + "" @@ -3659,7 +3776,7 @@ function update_city_screen() let pissed = pcity['hangry'] || (server_settings.fulldisorder.val && pcity['anarchy']); // Color code for upcoming state under current configuration of tiles/luxury rate/improvements/deployed units: - if (happy_people >= pcity['size']*0.4999 && unhappy_angry_people==0 && pcity['size']>2) { + if (happy_people >= pcity['size']*0.4999 && unhappy_angry_people==0 && pcity['size']>=city_celebrate_size(pcity)) { next_state = "Celebrating"; if (!pissed) city_state_span = "id='city_state"+pcity.id+"' class='redux_centre mobile_centre hint_of_green' style='cursor:help; text-align:center;'>"+city_state; // half or more happy, no unhappy = city will (continue to) celebrate, green code. @@ -3713,7 +3830,7 @@ function update_city_screen() break; case CURV_POLLUTION: city_user = ""; + + "" + (pcity['pollution']<1 ? " " : pcity['pollution']) +"%" + ""; break; case CURV_TRADE_REVENUE: const rev = get_city_traderoute_revenue(pcity['id']); @@ -3730,9 +3847,15 @@ function update_city_screen() + "" + pcity['turn_founded'] +"" + ""; break; case CURV_FOREIGNERS: + /* Determine which position in the national populations array is the current owner */ + let owner_idx = 0; + for (let nat in pcity.nation_id) { + if (pcity.nation_id[nat] == pcity.owner) + owner_idx = parseInt(nat); + } city_user = ""); + (pcity['nationalities_count'] < 2 ? " " : (pcity['size'] - pcity['nation_citizens'][owner_idx]) +"" + ""); break; default: city_user = "" + empire_list_html += "" + "" @@ -244,9 +248,17 @@ function empire_unit_homecity_screen(wide_screen,narrow_screen,small_screen, } for (var unit_id in units) { // pre-sort units belonging to player, by type, into this array var sunit = units[unit_id]; + var stype = unit_types[sunit.type]; if (client.conn.playing != null && unit_owner(sunit).playerno == client.conn.playing.playerno) { // See if unit qualifies to be displayed based on upkeep types desired to be shown var show_unit = false; + var f1,g1,s1,z=false; + if (stype['upkeep'] != null) { + s1 = parseInt(stype['upkeep'][O_SHIELD],10); + f1 = parseInt(stype['upkeep'][O_FOOD],10); + g1 = parseInt(stype['upkeep'][O_GOLD],10); + if (f1+g1+s1 == 0) z = true; + } var f,g,s,l; if (sunit['upkeep'] != null) { s = parseInt(sunit['upkeep'][O_SHIELD],10); @@ -258,6 +270,8 @@ function empire_unit_homecity_screen(wide_screen,narrow_screen,small_screen, else if (empire_upkeep_show_gold && g>0) show_unit=true; else if (empire_upkeep_show_free && l==0) show_unit=true; } else if (empire_upkeep_show_free) show_unit=true; + if (!empire_upkeep_show_zero && z==true) show_unit=false; + else if (empire_upkeep_show_zero && z==true) show_unit=true; if (show_unit) { units_sorted_by_type[sunit['type']].push(sunit); } @@ -273,8 +287,14 @@ function empire_unit_homecity_screen(wide_screen,narrow_screen,small_screen, var ukg = new Array(cities.length); var uks = new Array(cities.length); - // Go through each city and pluck out units by type so they're arranged by type - for (var city_id in cities) { //rows (cities) +// Go through each city in the order sorted in the cities list, and pluck out units by type, so they're arranged by type: + if ($("#city_table_head").length == 0) update_city_screen(); // If cities list has never been created, create it. + var current_city_row = $("#city_table_head").next().children().first(); // Get first row of the sorted cities list. + // Iterate through all player cities in the order they're sorted in the sorted cities list: + while (current_city_row.length > 0) { + //for (var city_id in cities) { //rows (cities) + var city_id = current_city_row.attr('id').substr(12); + current_city_row = current_city_row.next(); // bump up to next city row for when we iterate the loop back up here var pcity = cities[city_id]; ukf[city_id] = 0; // set counters at 0 before adding it up @@ -288,8 +308,8 @@ function empire_unit_homecity_screen(wide_screen,narrow_screen,small_screen, //TO DO, we can only adjust height later after we add a unit_count tally then would have to do a $().css("height",rheight) var rheight = 28 * Math.ceil( (/*unit_count*/11*40) / ($(window).width()-140) ); - unit_row_html = ""; - unit_row_html += ""; + unit_row_html = ""; + unit_row_html += ""; unit_row_html += ""; unit_row_html += ""; unit_row_html += ""; @@ -524,8 +544,14 @@ function empire_unitcity_screen(wide_screen,narrow_screen,small_screen, var sumHPD = new Array(cities.length); - // Go through each city and pluck out units by type so they're arranged by type - for (var city_id in cities) { //rows (cities) +// Go through each city in the order sorted in the cities list, and pluck out units by type, so they're arranged by type: + if ($("#city_table_head").length == 0) update_city_screen(); // If cities list has never been created, create it. + var current_city_row = $("#city_table_head").next().children().first(); // Get first row of the sorted cities list. + // Iterate through all player cities in the order they're sorted in the sorted cities list: + while (current_city_row.length > 0) { + //for (var city_id in cities) { //rows (cities) + var city_id = current_city_row.attr('id').substr(12); + current_city_row = current_city_row.next(); // bump up to next city row for when we iterate the loop back up here var pcity = cities[city_id]; // Only process legal cities owned by player @@ -537,7 +563,7 @@ function empire_unitcity_screen(wide_screen,narrow_screen,small_screen, //TO DO, we can only adjust height later after we add a unit_count tally then would have to do a $().css("height",rheight) var rheight = 28 * Math.ceil( (/*unit_count*/11*40) / ($(window).width()-140) ); - unit_row_html = ""; + unit_row_html = ""; unit_row_html += ""; unit_row_html += ""; unit_row_html += ""; + improvements_html = ""; improvements_html += ""; improvements_html += ""; } // First row for total - empire_list_html += "" + empire_list_html += "" + "" @@ -984,8 +1016,14 @@ function empire_econ_upkeep_screen(wide_screen,narrow_screen,small_screen, var city_count = 0; // number of cities (total rows) let city_upkeep = new Array(cities.length); - // Go through each city - for (var city_id in cities) { + // Go through each city in the order sorted in the cities list, and pluck out units by type, so they're arranged by type: + if ($("#city_table_head").length == 0) update_city_screen(); // If cities list has never been created, create it. + var current_city_row = $("#city_table_head").next().children().first(); // Get first row of the sorted cities list. + // Iterate through all player cities in the order they're sorted in the sorted cities list: + while (current_city_row.length > 0) { + //for (var city_id in cities) { //rows (cities) + var city_id = current_city_row.attr('id').substr(12); + current_city_row = current_city_row.next(); // bump up to next city row for when we iterate the loop back up here var pcity = cities[city_id]; city_upkeep[city_id] = 0; // start counter // Only process legal cities owned by player @@ -995,11 +1033,11 @@ function empire_econ_upkeep_screen(wide_screen,narrow_screen,small_screen, //TO DO, we can only adjust height later after we add a unit_count tally then would have to do a $().css("height",rheight) var rheight = 28 * Math.ceil( (/*col_count*/22*40) / ($(window).width()-140) ); - improvements_html = ""; + improvements_html = ""; improvements_html += ""; improvements_html += "" - improvements_html += ""; + queue_html = ""; queue_html += ""; queue_html += ""; + unit_row_html = ""; unit_row_html += ""; unit_row_html += ""; unit_row_html += "
Name"+updown_sort_arrows+"Size"+updown_sort_arrows+"State State        Grows In"+updown_sort_arrows+"Granary" +updown_sort_arrows+"Producing"+updown_sort_arrows+"Turns"+updown_sort_arrows @@ -3510,13 +3627,13 @@ function update_city_screen() + "
Name"+"Pop"+"Mood     Grows"+"Grain"*/ + ( (!tiny_screen) ? ("Grows"+"Grain") : ("Grow"+"Food") ) @@ -3537,13 +3654,13 @@ function update_city_screen() + "
Name"+"Pop"+"Mood    Grow"+"Food" +"Build"+"in" - + "" + (pcity['pollution']<1 ? " " : pcity['pollution']) +"" + "" + "" + - (pcity['nationalities_count'] < 2 ? " " : (pcity['size'] - pcity['nation_citizens'][0/*0=current owner*/]) +"" + "" @@ -3879,7 +4002,10 @@ function update_city_screen() $("#city_table").html("You have no cities. Build new cities with the Settlers unit."); } - $('#cities_scroll').css("height", $(window).height() - 200); + /* old method : assume 200px above the element to safely fit it (works but doesn't use all real estate) + $('#cities_scroll').css("height", $(window).height() - 200); */ + // New method: Try to calculate height to use all vertical real estate on the screen: + $('#cities_scroll').css("height", $(window).height() - $("#cities_scroll").offset().top-3); $("#city_table").tablesorter({theme:"dark", sortList: sortList}); @@ -4056,7 +4182,8 @@ function cma_clipboard_macro(event, called_by_CMA) // Emulates clicking the city centre, causing auto-arrange tiles: var packet = {"pid" : packet_city_make_specialist, "city_id" : parseInt(city_id), - "tile_id" : city_tile(cities[city_id]).index + "tile_id" : city_tile(cities[city_id]).index, + "specialist_to": -1 }; send_request(JSON.stringify(packet)); city_checkbox_states[city_id] = true; @@ -4234,7 +4361,7 @@ function get_city_state(pcity) { if (pcity == null) return; - if (pcity['was_happy'] && pcity['size'] >= 3) { + if (pcity['was_happy'] && pcity['size'] >= city_celebrate_size(pcity)) { return "Celebrating"; } else if (pcity['hangry']) { return "Famine"; @@ -4468,7 +4595,7 @@ function city_get_foreign_pct(city_id) /************************************************************************** Returns the 3d model name for the given city. -************************************************************************** +**************************************************************************/ function city_to_3d_model_name(pcity) { var size = 0; @@ -4493,7 +4620,7 @@ function city_to_3d_model_name(pcity) } return "city_" + city_style_name + "_" + size; -}*/ +} /************************************************************************** Returns the city walls scale of for the given city. @@ -4531,6 +4658,7 @@ function set_citydlg_dimensions(pcity) case 8: case 9: citydlg_map_height += tileset_height; + citydlg_map_width += tileset_width; break; default: if (pcity.city_radius_sq > 17) { @@ -4542,6 +4670,7 @@ function set_citydlg_dimensions(pcity) //console.log("%d,%d",citydlg_map_width,citydlg_map_height) $("#city_canvas_div").css({"width":citydlg_map_width, "height":citydlg_map_height}); + $("#city_canvas_top_div").css({"width":citydlg_map_width, "height":citydlg_map_height}); //$("#city_canvas").css({"width":citydlg_map_width, "height":citydlg_map_height}); $("#city_canvas").attr('width', citydlg_map_width); $("#city_canvas").attr('height', citydlg_map_height); diff --git a/freeciv-web/src/main/webapp/javascript/civclient.js b/freeciv-web/src/main/webapp/javascript/civclient.js index d2caf1065..5f95f8b32 100644 --- a/freeciv-web/src/main/webapp/javascript/civclient.js +++ b/freeciv-web/src/main/webapp/javascript/civclient.js @@ -33,6 +33,10 @@ var fc_seedrandom = null; var game_type = ""; var link_game_type = ""; +var RENDERER_2DCANVAS = 1; // default HTML5 Canvas +var RENDERER_WEBGL = 2; // WebGL + Three.js +var renderer = RENDERER_2DCANVAS; // This variable specifies which map renderer to use, 2d Canvas or WebGL. + var last_turn_change_time = 0; var turn_change_elapsed = 0; var seconds_to_phasedone = 0; @@ -105,6 +109,12 @@ function civclient_init() return; } + if ($.getUrlVar('renderer') == "webgl") { + renderer = RENDERER_WEBGL; + } + if (renderer == RENDERER_2DCANVAS) init_mapview(); + if (renderer == RENDERER_WEBGL) init_webgl_renderer(); + init_mapview(); game_init(); @@ -118,7 +128,11 @@ function civclient_init() statusTimerId = setInterval(update_game_status_panel, 6000); if (overviewTimerId == -1) { - OVERVIEW_REFRESH = 6000; + if (renderer == RENDERER_WEBGL) { + OVERVIEW_REFRESH = 12000; + } else { + OVERVIEW_REFRESH = 6000; + } overviewTimerId = setInterval(redraw_overview, OVERVIEW_REFRESH); } @@ -280,6 +294,14 @@ function civclient_init() play_music = is_longturn(); // singleplayer defaults off for server bandwidth savings } + show_timestamps = simpleStorage.get('tstamps'); + if (show_timestamps == null) { + show_timestamps = is_longturn(); + } + if (!show_timestamps) { + changeCss(".ts", "display:none"); + } + audio_initialize(); //------------------------------------------------------------------------------------------------ @@ -423,7 +445,7 @@ function init_common_intro_dialog() { "NOTE: Rulesets named 'Multiplayer' are simply the more modern rulesets that work well with any number of players.
"+ "You can play Singleplayer with a Multiplayer ruleset if you wish to improve for multiplayer games with other humans.
"+ " • If you do this, try:   /set sciencebox 80   (or similar) to set a singleplayer research pace. /help sciencebox for more info.
" - : "WARNING: Default rules for Multiplayer are Multiplayer+.

" ) + + : "Default rules for multiplayer games are: Multiplayer II Evolution Avant-garde. (mp2-ag)

" ) + "Click Game button to select Game Version (ruleset).

"+ "Advanced: You can tune more settings with the command line.
"+ @@ -687,6 +709,10 @@ function show_debug_info() } console.log("Network PING average (client): " + (sum / debug_client_speed_list.length) + " ms. (Max: " + max +"ms.)"); + if (renderer == RENDERER_WEBGL) { + console.log(maprenderer.info); + } + } /************************************************************************** @@ -748,6 +774,24 @@ function is_supercow() { return (client.conn["access_level"] >= 5); } +/************************************************************************** + Gamemaster can temporarily toggle Supercow-Interaction-Lock mode with + with this console command. Allows GM to (/take player) to click on + cities, click to investigate unit stacks, and/or other investigative + or debugging measures. +**************************************************************************/ +function flip_supercow() +{ + client.conn.access_level = 5-client.conn.access_level; + observing = !observing; + client.conn['observer'] = observing; + if (observing) { + client.conn.playing = null; + } else { + client.conn.playing = {playerno: -1}; + } + add_client_message("Supercow Lock turned "+(observing?"ON":"OFF")); +} /************************************************************************** Is this an ongoing LongTurn game? @@ -767,3 +811,98 @@ function is_loaded_game() return chatbox_text !== null && chatbox_text.indexOf("Load complete") != -1; } +/**************************************************************************** + Change between 2D isometric and 3D WebGL renderer. +****************************************************************************/ +function switch_renderer() +{ + if (is_longturn()){ + var game_port = $.getUrlVar('civserverport') + var stored_username = simpleStorage.get("username", ""); + if (stored_username == null || stored_username == false) stored_username = "blank" + $.ajax({ + type: 'POST', + url: "/validate_twit?username="+stored_username+"&type=3d_webgl&port="+game_port, + }); + } + else { + + $("#canvas_div").unbind(); + if (renderer == RENDERER_WEBGL) { + //activate 2D isometric renderer + renderer = RENDERER_2DCANVAS; + $("#canvas_div").empty(); + init_mapview(); + set_default_mapview_active(); + requestAnimationFrame(update_map_canvas_check, mapview_canvas); + mapctrl_init_2d(); + + for (var tile_id in tiles) { + if (tile_get_known(tiles[tile_id]) == TILE_KNOWN_SEEN) { + center_tile_mapcanvas(tiles[tile_id]); + break; + } + } + + // reset 3D WebGL data + for (var tile_id in tiles) { + tiles[tile_id]['height'] = 0; + } + scene = null; + heightmap = {}; + unit_positions = {}; + city_positions = {}; + city_label_positions = {}; + city_walls_positions = {}; + unit_flag_positions = {}; + unit_label_positions = {}; + unit_activities_positions = {}; + unit_health_positions = {}; + unit_healthpercentage_positions = {}; + forest_positions = {}; + jungle_positions = {}; + tile_extra_positions = {}; + road_positions = {}; + rail_positions = {}; + river_positions = {}; + tiletype_palette = []; + meshes = {}; + load_count = 0; + + } else { + //activate 3D WebGL renderer + renderer = RENDERER_WEBGL; + load_count = 0; + mapview_model_width = Math.floor(MAPVIEW_ASPECT_FACTOR * map['xsize']); + mapview_model_height = Math.floor(MAPVIEW_ASPECT_FACTOR * map['ysize']); + + set_default_mapview_active(); + init_webgl_renderer(); + + } + + $.contextMenu({ + selector: (renderer == RENDERER_2DCANVAS) ? '#canvas' : '#canvas_div' , + zIndex: 5000, + autoHide: true, + callback: function(key, options) { + handle_context_menu_callback(key); + }, + build: function($trigger, e) { + if (!context_menu_active) { + context_menu_active = true; + return false; + } + var unit_actions = update_unit_order_commands(); + return { + callback: function(key, options) { + handle_context_menu_callback(key); + } , + items: unit_actions + }; + } + }); + + } +} + diff --git a/freeciv-web/src/main/webapp/javascript/client_main.js b/freeciv-web/src/main/webapp/javascript/client_main.js index 48e3f29c9..5c64e230c 100644 --- a/freeciv-web/src/main/webapp/javascript/client_main.js +++ b/freeciv-web/src/main/webapp/javascript/client_main.js @@ -58,6 +58,11 @@ function set_client_state(newstate) /* remove context menu from pregame. */ $(".context-menu-root").remove(); + if (renderer == RENDERER_WEBGL) { + init_webgl_mapview(); + + } + if (observing || $.getUrlVar('action') == "multi" || is_longturn() || game_loaded) { center_on_any_city(); advance_unit_focus(false); @@ -91,18 +96,20 @@ function setup_window_size () var new_mapview_width = winWidth - width_offset; var new_mapview_height = winHeight - height_offset; - mapview_canvas.width = new_mapview_width; - mapview_canvas.height = new_mapview_height; - buffer_canvas.width = Math.floor(new_mapview_width * 1.5); - buffer_canvas.height = Math.floor(new_mapview_height * 1.5); + if (renderer == RENDERER_2DCANVAS) { + mapview_canvas.width = new_mapview_width; + mapview_canvas.height = new_mapview_height; + buffer_canvas.width = Math.floor(new_mapview_width * 1.5); + buffer_canvas.height = Math.floor(new_mapview_height * 1.5); - mapview['width'] = new_mapview_width; - mapview['height'] = new_mapview_height; - mapview['store_width'] = new_mapview_width; - mapview['store_height'] = new_mapview_height; + mapview['width'] = new_mapview_width; + mapview['height'] = new_mapview_height; + mapview['store_width'] = new_mapview_width; + mapview['store_height'] = new_mapview_height; - mapview_canvas_ctx.font = canvas_text_font; - buffer_canvas_ctx.font = canvas_text_font; + mapview_canvas_ctx.font = canvas_text_font; + buffer_canvas_ctx.font = canvas_text_font; + } $("#pregame_message_area").height( new_mapview_height - 105 - $("#pregame_game_info").outerHeight()); @@ -146,7 +153,7 @@ function setup_window_size () $("#button_empire_upkeep").html("💰"); $("#button_empire_prod").html("🔨"); // Remove mini-map - $(".overview_dialog").hide(); overview_active = false; + // $(".overview_dialog").hide(); overview_active = false; // Remove orders buttons //if ($("#game_unit_orders_default").length > 0) $("#game_unit_orders_default").remove(); $(".not_mobile").remove(); // gets rid of all except goto,paradrop,airlift,nuke,and "hide buttons" @@ -166,6 +173,10 @@ function setup_window_size () $('#ui-id-12').parent().show(); // unhide messagebox title $(".ui-dialog-titlebar").css({"font-size":"70%", "margin-left":"-3px"}); $("#game_status_panel_bottom").css("font-size", "0.8em"); + + overview_current_state = "minimized"; + game_unit_panel_state = "minimized"; + } else { // handle case where small window is resized to large again $("#map_tab").children().html(" Map"); $("#empire_tab").children().html(" Empire"); @@ -394,7 +405,11 @@ function update_metamessage_on_gamestart() if ($.getUrlVar('action') == "new" || $.getUrlVar('action') == "earthload" || $.getUrlVar('scenario') == "true") { - $.post("/freeciv_time_played_stats?type=single2d").fail(function() {}); + if (renderer == RENDERER_2DCANVAS) { + $.post("/freeciv_time_played_stats?type=single2d").fail(function() {}); + } else { + $.post("/freeciv_time_played_stats?type=single3d").fail(function() {}); + } } if ($.getUrlVar('action') == "multi" && client.conn.playing != null && client.conn.playing['pid'] == players[0]['pid'] && !is_longturn()) { diff --git a/freeciv-web/src/main/webapp/javascript/clinet.js b/freeciv-web/src/main/webapp/javascript/clinet.js index 08a4ffb5d..d6c41400d 100644 --- a/freeciv-web/src/main/webapp/javascript/clinet.js +++ b/freeciv-web/src/main/webapp/javascript/clinet.js @@ -106,8 +106,20 @@ function websocket_init() ws.onmessage = function (event) { if (typeof client_handle_packet !== 'undefined') { client_handle_packet(JSON.parse(event.data)); - if (DEBUG_LOG_PACKETS) - console.log("*** INCOMING PACKET>>>>>"+event.data); + if (DEBUG_LOG_PACKETS) { + console.log("*** INCOMING PACKET>>>>>"+event.data); + } else if (DEBUG_SHORT_PACKETS) { + var pid = jQuery.parseJSON(event.data)[0]['pid'] + var ptitle = getKeyByValue(packet_names, pid); + // Only print infos from packet pids we defined in packhand.js:packet_names + if (pid>1 && ptitle) { + console.log("****** IN (%s): %s", pid, ptitle); + if (DEBUG_EXPAND_PACKETS && pid>1) { + var my_obj = JSON.parse(event.data); + console.log(my_obj); + } + } + } } else { console.error("Error, freeciv-web not compiled correctly. Please " @@ -164,6 +176,7 @@ function check_websocket_ready() sha_password = encodeURIComponent(shaObj.getHash("HEX")); } + /* LOCAL HOST ONLY: comment out this block to allow testing longturn without using google_auth */ if (is_longturn() && google_user_token == null) { swal("Login failed."); setSwalTheme(); @@ -249,13 +262,25 @@ function send_request(packet_payload) if (DEBUG_LOG_PACKETS || DEBUG_ACTION_PACKETS) console.log("OUTGOING PACKET>>>>>"+packet_payload); - + if (debug_active) { clinet_last_send = new Date().getTime(); } // User actions use send_request. Track user activity/inactivity here: // 2 types of outgoing messages are false positive for user action: var packet_type = jQuery.parseJSON("["+packet_payload+"]")[0]['pid']; + if (DEBUG_SHORT_PACKETS) { + var ptitle = getKeyByValue(packet_names, packet_type); + // Only print infos from packet pids we defined in packhand.js:packet_names + if (ptitle) { + console.log("***** OUT (%d): %s",packet_type, ptitle); + if (DEBUG_EXPAND_PACKETS && packet_type>1) { + var my_obj = jQuery.parseJSON("["+packet_payload+"]"); + console.log(my_obj); + } + } + } + // ping answer and update_metamessage_game_running_status(): if (packet_type==packet_conn_pong || packet_type==packet_chat_msg_req) return; diff --git a/freeciv-web/src/main/webapp/javascript/cma.js b/freeciv-web/src/main/webapp/javascript/cma.js index 2021eb33a..fd681450a 100644 --- a/freeciv-web/src/main/webapp/javascript/cma.js +++ b/freeciv-web/src/main/webapp/javascript/cma.js @@ -32,6 +32,7 @@ var cma_enabled = false; // current implementation allowed starving, with food min_surplus of 20, // even when positive food was available: var cma_max_growth = false; +var MIN_SURPLUS_MAX = 150; // How far up the min surplus sliders will go // Governor Clipboard for copy/paste: var _cma_val_sliders = [1,0,0,0,0,0]; @@ -159,9 +160,9 @@ function create_cma_sliders() { $("#cma-val-slider-"+name).slider({ value: cma_val_sliders[i], min:0, max:25 }); $("#cma-val-slider-"+name).slider("enable"); - $("#cma-min-slider-"+name).slider({ value: cma_min_sliders[i], min:-20, max:20 }); + $("#cma-min-slider-"+name).slider({ value: cma_min_sliders[i], min:-20, max:MIN_SURPLUS_MAX }); $("#cma-min-slider-"+name).slider("enable"); - $("#cma-val-slider-"+name).css("width", 160); + $("#cma-val-slider-"+name).css("width", 160); $("#cma-min-slider-"+name).css("width", 160); $("#cma-val-slider-"+name).slider({"slide": cma_user_slide, "change": cma_user_input}); diff --git a/freeciv-web/src/main/webapp/javascript/console_filters.js b/freeciv-web/src/main/webapp/javascript/console_filters.js new file mode 100644 index 000000000..b5761218b --- /dev/null +++ b/freeciv-web/src/main/webapp/javascript/console_filters.js @@ -0,0 +1,396 @@ +var console_filters = { +'combat': true, +'actions': true, +'sentry': true, +'governor': true, +'tech': true, +'diplomacy': true, +'cityprod': true, +'citywarn': true, +'chat': true, +'setting': true, +'pollution': true +}; + + +function console_filter_radio_clicked(which_btn) +{ + if (which_btn) + console_filters[which_btn] = !console_filters[which_btn]; + + if (console_filters['combat']) { + $("li.e_unit_win_att").show(); + $("li.e_unit_win_def").show(); + $("li.e_unit_lost_att").show(); + $("li.e_unit_lost_def").show(); + $("li.e_unit_escaped").show(); + $("li.e_unit_became_vet").show(); + } else { + $("li.e_unit_win_att").hide(); + $("li.e_unit_win_def").hide(); + $("li.e_unit_lost_att").hide(); + $("li.e_unit_lost_def").hide(); + $("li.e_unit_escaped").hide(); + $("li.e_unit_became_vet").hide(); + } + if (console_filters['sentry']) + $("li.e_unit_sentry_wake").show(); + else + $("li.e_unit_sentry_wake").hide(); + if (console_filters['actions']) { + $("li.e_bad_command").show(); + $("li.e_unit_action_actor_failure").show(); + $("li.e_unit_action_target_hostile").show(); + $("li.e_unit_relocated").show(); + $("li.e_unit_did_expel").show(); + $("li.e_unit_action_failed").show(); + $("li.e_my_unit_did_heal").show(); + $("li.e_my_unit_was_healed").show(); + $("li.e_unit_was_expelled").show(); + $("li.e_unit_orders").show(); + $("li.e_unit_upgraded").show(); + $("li.e_unit_illegal_action").show(); + $("li.e_unit_lost_misc").show(); + } else { + $("li.e_bad_command").hide(); + $("li.e_unit_relocated").hide(); + $("li.e_unit_action_actor_failure").hide(); + $("li.e_unit_action_target_hostile").hide(); + $("li.e_unit_did_expel").hide(); + $("li.e_unit_action_failed").hide(); + $("li.e_my_unit_did_heal").hide(); + $("li.e_my_unit_was_healed").hide(); + $("li.e_unit_was_expelled").hide(); + $("li.e_unit_orders").hide(); + $("li.e_unit_upgraded").hide(); + $("li.e_unit_illegal_action").hide(); + $("li.e_unit_lost_misc").hide(); + } + if (console_filters['governor']) { + $("li.e_city_cma_release").show(); + } else { + $("li.e_city_cma_release").hide(); + } + if (console_filters['diplomacy']) { + $("li.e_unit_action_target_other").show(); + $("li.e_revolt_done").show(); + $("li.e_revolt_start").show(); + $("li.e_spaceship").show(); + $("li.e_new_government").show(); + $("li.e_uprising").show(); + $("li.e_anarchy").show(); + $("li.e_embassy_was_expelled").show(); + $("li.e_embassy_did_expel").show(); + $("li.e_wonder_started").show(); + $("li.e_wonder_stopped").show(); + $("li.e_wonder_will_be_built").show(); + $("li.e_first_contact").show(); + $("li.e_diplomacy").show(); + $("li.e_enemy_diplomat_failed").show(); + $("li.e_my_diplomat_poison").show(); + $("li.e_my_spy_steal_map").show(); + $("li.e_my_diplomat_escape").show(); + $("li.e_my_diplomat_bribe").show(); + $("li.e_my_spy_steal_gold").show(); + $("li.e_my_diplomat_incite").show(); + $("li.e_my_diplomat_embassy").show(); + $("li.e_my_diplomat_sabotage").show(); + $("li.e_my_diplomat_theft").show(); + $("li.e_my_diplomat_failed").show(); + $("li.e_enemy_diplomat_poison").show(); + $("li.e_enemy_spy_nuke").show(); + $("li.e_enemy_diplomat_bribe").show(); + $("li.e_enemy_diplomat_embassy").show(); + $("li.e_enemy_diplomat_incite").show(); + $("li.e_enemy_diplomat_poison").show(); + $("li.e_enemy_diplomat_sabotage").show(); + $("li.e_enemy_diplomat_theft").show(); + $("li.e_enemy_spy_steal_map").show(); + $("li.e_treaty_shared_vision").show(); + $("li.e_treaty_alliance").show(); + $("li.e_treaty_peace").show(); + $("li.e_treaty_ceasefire").show(); + $("li.e_treaty_embassy").show(); + $("li.e_diplomatic_incident").show(); + $("li.e_treaty_broken").show(); + $("li.e_civil_war").show(); + $("li.e_city_transfer").show(); + } + else { + $("li.e_unit_action_target_other").hide(); + $("li.e_revolt_done").hide(); + $("li.e_revolt_start").hide(); + $("li.e_spaceship").hide(); + $("li.e_new_government").hide(); + $("li.e_uprising").hide(); + $("li.e_anarchy").hide(); + $("li.e_embassy_was_expelled").hide(); + $("li.e_embassy_did_expel").hide(); + $("li.e_wonder_started").hide(); + $("li.e_wonder_stopped").hide(); + $("li.e_wonder_will_be_built").hide(); + $("li.e_first_contact").hide(); + $("li.e_diplomacy").hide(); + $("li.e_enemy_diplomat_failed").hide(); + $("li.e_my_diplomat_poison").hide(); + $("li.e_my_spy_steal_map").hide(); + $("li.e_my_diplomat_escape").hide(); + $("li.e_my_diplomat_bribe").hide(); + $("li.e_my_spy_steal_gold").hide(); + $("li.e_my_diplomat_incite").hide(); + $("li.e_my_diplomat_embassy").hide(); + $("li.e_my_diplomat_sabotage").hide(); + $("li.e_my_diplomat_theft").hide(); + $("li.e_my_diplomat_failed").hide(); + $("li.e_enemy_diplomat_poison").hide(); + $("li.e_enemy_spy_nuke").hide(); + $("li.e_enemy_diplomat_bribe").hide(); + $("li.e_enemy_diplomat_embassy").hide(); + $("li.e_enemy_diplomat_incite").hide(); + $("li.e_enemy_diplomat_poison").hide(); + $("li.e_enemy_diplomat_sabotage").hide(); + $("li.e_enemy_diplomat_theft").hide(); + $("li.e_enemy_spy_steal_map").hide(); + $("li.e_treaty_shared_vision").hide(); + $("li.e_treaty_alliance").hide(); + $("li.e_treaty_peace").hide(); + $("li.e_treaty_ceasefire").hide(); + $("li.e_treaty_embassy").hide(); + $("li.e_diplomatic_incident").hide(); + $("li.e_treaty_broken").hide(); + $("li.e_civil_war").hide(); + $("li.e_city_transfer").hide(); + } + if (console_filters['cityprod']) { + $("li.e_worklist").show(); + $("li.e_imp_build").show(); + $("li.e_unit_built").show(); + $("li.e_imp_sold").show(); + $("li.e_imp_buy").show(); + $("li.e_unit_buy").show(); + $("li.e_unit_built_pop_cost").show(); + $("li.e_city_production_changed").show(); + } else { + $("li.e_worklist").hide(); + $("li.e_imp_build").hide(); + $("li.e_unit_built").hide(); + $("li.e_imp_sold").hide(); + $("li.e_imp_buy").hide(); + $("li.e_unit_buy").hide(); + $("li.e_unit_built_pop_cost").hide(); + $("li.e_city_production_changed").hide(); + } + if (console_filters['citywarn']) { + $("li.e_city_cantbuild").show(); + $("li.e_caravan_action").show(); + $("li.e_city_build").show(); + $("li.e_disaster").show(); + $("li.e_city_plague").show(); + $("li.e_city_lost").show(); + $("li.e_city_disorder").show(); + $("li.e_city_famine").show(); + $("li.e_city_famine_feared").show(); + $("li.e_city_love").show(); + $("li.e_city_growth").show(); + $("li.e_city_may_soon_grow").show(); + $("li.e_city_aqueduct").show(); + $("li.e_city_aq_building").show(); + $("li.e_city_normal").show(); + $("li.e_city_gran_throttle").show(); + } else { + $("li.e_city_cantbuild").hide(); + $("li.e_caravan_action").hide(); + $("li.e_city_build").hide(); + $("li.e_disaster").hide(); + $("li.e_city_plague").hide(); + $("li.e_city_lost").hide(); + $("li.e_city_disorder").hide(); + $("li.e_city_famine").hide(); + $("li.e_city_famine_feared").hide(); + $("li.e_city_love").hide(); + $("li.e_city_growth").hide(); + $("li.e_city_may_soon_grow").hide(); + $("li.e_city_aqueduct").hide(); + $("li.e_city_aq_building").hide(); + $("li.e_city_normal").hide(); + $("li.e_city_gran_throttle").hide(); + } + if (console_filters['tech']) { + $("li.e_hut_tech").show(); + $("li.e_tech_gain").show(); + $("li.e_tech_learned").show(); + $("li.e_tech_lost").show(); + $("li.e_tech_embassy").show(); + $("li.e_tech_goal").show(); + } else { + $("li.e_hut_tech").hide(); + $("li.e_tech_gain").hide(); + $("li.e_tech_learned").hide(); + $("li.e_tech_lost").hide(); + $("li.e_tech_embassy").hide(); + $("li.e_tech_goal").hide(); + } + if (console_filters['chat']) { + $("li.e_chat_error").show(); + $("li.e_chat_msg").show(); + $("li.e_chat_msg_public").show(); + $("li.e_chat_msg_private_sent").show(); + $("li.e_chat_msg_private_rcvd").show(); + $("li.e_chat_msg_ally").show(); + $("li.cht_prv_sndr").show(); + $("li.cht_ally_sndr").show(); + $("li.cht_you").show(); + } else { + $("li.e_chat_error").hide(); + $("li.e_chat_msg").hide(); + $("li.e_chat_msg_public").hide(); + $("li.e_chat_msg_private_sent").hide(); + $("li.e_chat_msg_private_rcvd").hide(); + $("li.e_chat_msg_ally").hide(); + $("li.cht_prv_sndr").hide(); + $("li.cht_ally_sndr").hide(); + $("li.cht_you").hide(); + } + if (console_filters['setting']) { + $("li.e_report").show(); + $("li.e_game_start").show(); + $("li.e_spontaneous_extra").hide(); + $("li.e_hut_barb").show(); + $("li.e_hut_gold").show(); + $("li.e_hut_map").show(); + $("li.e_hut_city").show(); + $("li.e_hut_merc").show(); + $("li.e_hut_settler").show(); + $("li.e_hut_tech").show(); + $("li.e_hut_barb_city_near").show(); + $("li.e_beginner_help").show(); + $("li.e_setting").show(); + $("li.e_connection").show(); + } else { + $("li.e_report").hide(); + $("li.e_game_start").hide(); + $("li.e_spontaneous_extra").hide(); + $("li.e_hut_barb").hide(); + $("li.e_hut_gold").hide(); + $("li.e_hut_map").hide(); + $("li.e_hut_city").hide(); + $("li.e_hut_merc").hide(); + $("li.e_hut_settler").hide(); + $("li.e_hut_tech").hide(); + $("li.e_hut_barb_city_near").hide(); + $("li.e_beginner_help").hide(); + $("li.e_setting").hide(); + $("li.e_connection").hide(); + } + if (console_filters['pollution']) { + $("li.e_pollution").show(); + $("li.e_global_eco").show(); + } else { + $("li.e_pollution").hide(); + $("li.e_global_eco").hide(); + } + chatbox_scroll_to_bottom(false); +} + + +function console_filters_set(action) +{ + if (action==='flip') { + for (key in console_filters) { + console_filters[key] = !console_filters[key] + } + } + else { + for (key in console_filters) { + console_filters[key] = action; + } + } + console_filter_radio_clicked(); + console_filter_dialog(); +} + + +function console_filter_dialog() +{ + var i; + + var rid = "console_filter_dialog"; + var id = "#" + rid; + var dhtml = ""; + + /* Reset dialog page. */ + remove_active_dialog(id); + $("
").appendTo("div#game_page"); + + //dhtml += "Filter existing messages by type:

"; + + dhtml += "" + + "
"; + + dhtml += "" + + "
"; + + dhtml += "" + + "
"; + + dhtml += "" + + "
"; + + dhtml += "" + + "
"; + + dhtml += "" + + "
"; + + dhtml += "" + + "
"; + + dhtml += "" + + "
"; + + dhtml += "" + + "
"; + + dhtml += "" + + "
"; + + dhtml += "" + + "
"; + + + + $(id).html(dhtml); + $("#f_combat").prop("checked", console_filters['combat']); + $("#f_actions").prop("checked", console_filters['actions']); + $("#f_sentry").prop("checked", console_filters['sentry']); + $("#f_tech").prop("checked", console_filters['tech']); + $("#f_governor").prop("checked", console_filters['governor']); + $("#f_diplomacy").prop("checked", console_filters['diplomacy']); + $("#f_cityprod").prop("checked", console_filters['cityprod']); + $("#f_citywarn").prop("checked", console_filters['citywarn']); + $("#f_chat").prop("checked", console_filters['chat']); + $("#f_setting").prop("checked", console_filters['setting']); + $("#f_pollution").prop("checked", console_filters['pollution']); + + var buttons = { 'Set All': function() {console_filters_set(true);}, + 'Clear': function() {console_filters_set(false);}, + 'Flip':function() {console_filters_set('flip');}, + 'Do it!': function() {console_filter_radio_clicked(); remove_active_dialog(id);} + }; + + $(id).dialog({ + title : "Filter console messages", + bgiframe : true, + modal : false, + width : (is_small_screen() ? "98%" : "360px"), + buttons : buttons }); + + $(id).dialog('open'); + $(id).parent().css("zIndex", 151); // force placement over other windows. + $(id).css("background","url(/images/bg-dark50.png)"); + $(id).next().css("text-align", "center"); + $(id).dialog('widget').position({my:"left top", at:"left center", of:window}) + + dialog_register(id); + $(id).dialog().next().children().children()[3].focus(); +} diff --git a/freeciv-web/src/main/webapp/javascript/control.js b/freeciv-web/src/main/webapp/javascript/control.js index 8d4be220b..c19a657fe 100644 --- a/freeciv-web/src/main/webapp/javascript/control.js +++ b/freeciv-web/src/main/webapp/javascript/control.js @@ -40,9 +40,6 @@ const GOTO_CLICK_COOLDOWN = 475; // Cooldown period before that tile can be clic var keyboard_input = true; var unitpanel_active = false; var allow_right_click = false; -var DEBUG_UNITS = false; // console log tools for debugging unit issues -var DEBUG_FOCUS = false; -var DEBUG_ACTION_PACKETS = false; // performance: is_touch_device() was being called many times per second var touch_device = null; // TO DO: replace all is_touch_device() function calls @@ -140,6 +137,10 @@ var end_turn_info_message_shown = false; var action_selection_in_progress_for = 0; /* before IDENTITY_NUMBER_ZERO */ var is_more_user_input_needed = false; +/* If a supercow leaves that mode with CTRL-ALT-SHIFT S, this var will + keep track of the fact that they were one, so they can toggle back */ +var was_supercow = false; + /**************************************************************************** ... ****************************************************************************/ @@ -148,7 +149,11 @@ function control_init() urgent_focus_queue = []; touch_device = is_touch_device(); - mapctrl_init_2d(); + if (renderer == RENDERER_2DCANVAS) { + mapctrl_init_2d(); + } else { + init_webgl_mapctrl(); + } $(document).keydown(global_keyboard_listener); $(window).resize(mapview_window_resized); @@ -227,7 +232,7 @@ function control_init() }, false); var context_options = { - selector: '#canvas', + selector: (renderer == RENDERER_2DCANVAS) ? '#canvas' : '#canvas_div' , zIndex: 5000, autoHide: true, callback: function(key, options) { @@ -251,9 +256,14 @@ function control_init() if (!touch_device) { context_options['position'] = function(opt, x, y){ if (touch_device) return; - //var new_top = mouse_y + $("#canvas_div").offset().top; - var new_top = mouse_y + $("#canvas").offset().top-52; - opt.$menu.css({top: new_top , left: mouse_x+16}); + //if (renderer == RENDERER_2DCANVAS) var new_top = mouse_y + $("#canvas_div").offset().top; + if (renderer == RENDERER_2DCANVAS) { + var new_top = mouse_y + $("#canvas").offset().top-52; + opt.$menu.css({top: new_top , left: mouse_x+16}); + } else { + var new_top = mouse_y + $("#canvas_div").offset().top-52; + opt.$menu.css({top: new_top , left: mouse_x+16}); + } }; } else { context_options['position'] = function(opt, x, y){ @@ -443,7 +453,7 @@ function mouse_moved_cb(e) mouse_y = e.clientY; } } - if (active_city == null && mapview_canvas != null + if (renderer == RENDERER_2DCANVAS && active_city == null && mapview_canvas != null && $("#canvas").length) { mouse_x = mouse_x - $("#canvas").offset().left; mouse_y = mouse_y - $("#canvas").offset().top; @@ -455,6 +465,22 @@ function mouse_moved_cb(e) mapview['gui_x0'] += diff_x; mapview['gui_y0'] += diff_y; + touch_start_x = mouse_x; + touch_start_y = mouse_y; + update_mouse_cursor(); + } + } else if (renderer == RENDERER_WEBGL && active_city == null && $("#canvas_div").length) { + mouse_x = mouse_x - $("#canvas_div").offset().left; + mouse_y = mouse_y - $("#canvas_div").offset().top; + + if (mapview_mouse_movement && !goto_active) { + // move the mapview using mouse movement. + var spos = webgl_canvas_pos_to_map_pos(touch_start_x, touch_start_y); + var epos = webgl_canvas_pos_to_map_pos(mouse_x, mouse_y); + if (spos != null && epos != null) { + camera_look_at(camera_current_x + spos['x'] - epos['x'], camera_current_y, camera_current_z + spos['y'] - epos['y']); + } + touch_start_x = mouse_x; touch_start_y = mouse_y; update_mouse_cursor(); @@ -493,7 +519,12 @@ function update_mouse_cursor() } //console.log("update_mouse_cursor() mmm:1 g_a:0, came_from_context_menu:"+came_from_context_menu); - var ptile = canvas_pos_to_tile(mouse_x, mouse_y); + var ptile; + if (renderer == RENDERER_2DCANVAS) { + ptile = canvas_pos_to_tile(mouse_x, mouse_y); + } else { + ptile = webgl_canvas_pos_to_tile(mouse_x, mouse_y); + } if (ptile == null) return; /* TO DO: this is the only way this function returns without forcing real_mouse_move_mode=false, presumably because @@ -803,15 +834,43 @@ function is_unprefixed_message(message) { ... ****************************************************************************/ function check_text_input(event,chatboxtextarea) { - if (event.keyCode == 13 && event.shiftKey == 0) { - send_text_input(chatboxtextarea); - } - // allows ctrl-E hotkey while inside text input area. - if (event.ctrlKey && String.fromCharCode(event.keyCode) == 'E') { - event.preventDefault(); // override possible browser shortcut - emoji_popup(); + if (event.keyCode == 13) { + if (event.shiftKey == 0) send_text_input(chatboxtextarea); + else if (C_S_RUNNING == client_state()) send_end_turn(); + } + if (event.ctrlKey) { + // allow ctrl-E hotkey to pop-up emoji selector, when inside chat text input: + if (!event.shiftKey && !event.altKey && String.fromCharCode(event.keyCode) == 'E') { + event.preventDefault(); + emoji_popup(); + } + // allow ctrl-shift-E hotkey for error logging, when inside chat text input: + else if (event.shiftKey && !event.altKey && String.fromCharCode(event.keyCode) == 'E') { + event.preventDefault(); + toggle_error_logging(); + } + // allow ctrl-S hotkey while inside text input area (prevents annoying page-save): + else if (!event.shiftKey && !event.altKey && String.fromCharCode(event.keyCode) == 'S') { + event.preventDefault(); + quicksave(); + } + } + else if (event.altKey) { + if (String.fromCharCode(event.keyCode) == 'F') { + event.preventDefault(); + console_filter_dialog(); + } } } +/**************************************************************************** + Toggles the visual display of the server's error log events: +****************************************************************************/ +function toggle_error_logging() +{ + $(".e_log_error").toggle(); + add_client_message("Error logging is now " + + ($(".e_log_error").is(":visible") ? "ON." : "OFF.") ); +} /**********************************************************************//** Attempts to send content of chatbox. See function above. **************************************************************************/ @@ -1176,7 +1235,7 @@ function update_unit_focus() } /************************************************************************** - This function may be called from packhand.c, via update_unit_focus(), + This function may be called from packhand.js, via update_unit_focus(), as a result of packets indicating change in activity for a unit. Also called when user press the "Wait" command. @@ -1356,6 +1415,7 @@ function advance_focus_inactive_units() current_focus = []; /* Reset focus units. */ unit_may_have_lost_focus(); waiting_units_list = []; /* Reset waiting units list */ + if (renderer == RENDERER_WEBGL) webgl_clear_unit_focus(); update_active_units_dialog(); $("#game_unit_orders_default").hide(); } @@ -1466,9 +1526,14 @@ function update_unit_order_commands() $("#order_quay").hide(); $("#order_canal").hide(); $("#order_well").hide(); + $("#order_fort").hide(); $("#order_fortress").hide(); + $("#order_castle").hide(); + $("#order_bunker").hide(); $("#order_buoy").hide(); + $("#order_fishtrap").hide(); $("#order_hideout").hide(); + $("#order_deepdive").hide(); $("#order_navalbase").hide(); $("#order_airbase").hide(); $("#order_radar").hide(); @@ -1544,7 +1609,7 @@ function update_unit_order_commands() ptype['name']=="Leader" || ptype['name']=="Queen" // Workers/Riflemen can convert between each other in Communism: || ((governments[client.conn.playing['government']]['name']=="Communism" - && ((ptype['name']=="Workers") || ptype['name']=="Riflemen")) + && (ptype['name'].startsWith("Workers") || ptype['name']=="Riflemen")) && tech_known('Communism')) // AAA can convert to Mobile SAM under qualifying conditions: || ( ptype['name']=="Anti-Aircraft Artillery" @@ -1573,6 +1638,7 @@ function update_unit_order_commands() var infra_type = false; if (ptype['name'] == "Workers" || ptype['name'] == "Migrants" || (ptype['name'] == "Tribesmen" && client_rules_flag[CRF_MP2_C]) + || (ptype['name'] == "Trawler") || (ptype['name'] =="Proletarians" && governments[client.conn.playing['government']]['name']=="Communism")) { worker_type = true; @@ -1605,8 +1671,10 @@ function update_unit_order_commands() const TILECLAIMS = (typeof EXTRA_TILE_CLAIM !== 'undefined'); const AIRBASES = (typeof EXTRA_AIRBASE !== 'undefined'); const BUOYS = (typeof EXTRA_BUOY !== 'undefined'); + const FISHTRAPS = (typeof EXTRA_FISHTRAP !== 'undefined'); const RADAR = (typeof EXTRA_RADAR !== 'undefined'); const QUAYS = (typeof EXTRA_QUAY !== 'undefined'); + const DEEPDIVE = (typeof EXTRA_DEEPDIVE !== 'undefined'); /* Whether player has tech for the Base. */ const HIDEOUT_TECH = tech_known("Warrior Code"); const FORT_TECH = tech_known("Construction") || (tech_known("Masonry") && client_rules_flag[CRF_MASONRY_FORT]); @@ -1616,6 +1684,7 @@ function update_unit_order_commands() const BUNKER_TECH = tech_known("Steel"); const AIRBASE_TECH = tech_known("Radio"); const BUOY_TECH = tech_known("Radio"); + const FISHTRAP_TECH = tech_known("Refrigeration"); const RADAR_TECH = tech_known("Radar"); /* Whether the tile has pre-existing bases, which may be reqs or blockers for other bases to be built. */ const TILE_HAS_HIDEOUT = HIDEOUTS && tile_has_extra(ptile,EXTRA_); @@ -1627,7 +1696,9 @@ function update_unit_order_commands() const TILE_HAS_CLAIM = TILECLAIMS && tile_has_extra(ptile,EXTRA_TILE_CLAIM); const TILE_HAS_AIRBASE = AIRBASES && tile_has_extra(ptile,EXTRA_AIRBASE); const TILE_HAS_BUOY = BUOYS && tile_has_extra(ptile,EXTRA_BUOY); + const TILE_HAS_FISHTRAP = FISHTRAPS && tile_has_extra(ptile,EXTRA_FISHTRAP); const TILE_HAS_RADAR = RADAR && tile_has_extra(ptile,EXTRA_RADAR); + const TILE_HAS_DEEPDIVE = DEEPDIVE && tile_has_extra(ptile,EXTRA_DEEPDIVE); //-- Misc reqs: const TILE_HAS_RIVER = tile_has_extra(ptile,EXTRA_RIVER); const NO_RIVER_BASE = client_rules_flag[CRF_NO_BASES_ON_RIVERS]; @@ -1647,25 +1718,31 @@ function update_unit_order_commands() //const CAN_TILE_CLAIM = !pcity && !oceanic && TILECLAIMS && !TILE_HAS_CLAIM && (client.conn.playing.playerno==tile_owner(ptile) || const CAN_TILE_AIRBASE = !pcity && !oceanic && AIRBASES && !TILE_HAS_AIRBASE && !(TILE_HAS_RIVER && NO_RIVER_BASE); const CAN_TILE_BUOY = !pcity && oceanic && BUOYS && !TILE_HAS_BUOY && !(TILE_HAS_RIVER && NO_RIVER_BASE); + const CAN_TILE_FISHTRAP = !pcity && oceanic && FISHTRAPS && !TILE_HAS_FISHTRAP // this is only a 'half true' qualifier for tile can do fishtrap: further checks done later below const CAN_TILE_RADAR = !pcity && !oceanic && RADAR && !TILE_HAS_RADAR && TILE_HAS_AIRBASE && !(TILE_HAS_RIVER && NO_RIVER_BASE); + const CAN_TILE_DEEPDIVE = terrain_name == "Deep Ocean" && !TILE_HAS_DEEPDIVE && !TILE_HAS_BUOY && !TILE_HAS_FISHTRAP; /* Currently iterating unit is able to build bases on this tile? */ const UNIT_CAN_HIDEOUT = CAN_TILE_HIDEOUT && HIDEOUT_TECH && utype_has_flag(ptype,UTYF_FOOTSOLDIER); - const UNIT_CAN_FORT = CAN_TILE_FORT && FORT_TECH && (worker_type || infra_type || (ptype['name'] == "Legion" && client_rules_flag[CRF_LEGION_WORK]) || (ptype['name'] == "Marines" && client_rules_flag[CRF_MARINE_BASES])); - const UNIT_CAN_FORTRESS = CAN_TILE_FORTRESS && FORTRESS_TECH && (worker_type || infra_type || (ptype['name'] == "Legion" && client_rules_flag[CRF_LEGION_WORK])); + const UNIT_CAN_FORT = CAN_TILE_FORT && FORT_TECH && (worker_type || infra_type || (ptype['name'] == "Legion" && client_rules_flag[CRF_LEGION_WORK]) || (ptype['name'] == "Marines" && client_rules_flag[CRF_MARINE_BASES])) && ptype['name'] != "Trawler"; + const UNIT_CAN_FORTRESS = CAN_TILE_FORTRESS && FORTRESS_TECH && (worker_type || infra_type || (ptype['name'] == "Legion" && client_rules_flag[CRF_LEGION_WORK])) && ptype['name'] != "Trawler"; const UNIT_CAN_NAVALBASE = CAN_TILE_NAVALBASE && NAVALBASE_TECH && (worker_type || infra_type || (ptype['name'] == "Legion" && client_rules_flag[CRF_LEGION_WORK])) && can_build_naval_base(punit,ptile); const UNIT_CAN_CASTLE = CAN_TILE_CASTLE && CASTLE_TECH && (worker_type || infra_type); const UNIT_CAN_BUNKER = CAN_TILE_BUNKER && BUNKER_TECH && (worker_type || infra_type); const UNIT_CAN_AIRBASE = CAN_TILE_AIRBASE && AIRBASE_TECH && (worker_type || infra_type || (ptype['name'] == "Marines" && client_rules_flag[CRF_MARINE_BASES])) && ptype['name'] != "Settlers"; const UNIT_CAN_BUOY = CAN_TILE_BUOY && BUOY_TECH && (worker_type || infra_type) && ptype['name'] != "Settlers"; + const UNIT_CAN_FISHTRAP = CAN_TILE_FISHTRAP && FISHTRAP_TECH && (worker_type || infra_type); const UNIT_CAN_RADAR = CAN_TILE_RADAR && RADAR_TECH && (worker_type || infra_type) && ptype['name'] != "Settlers"; + const UNIT_CAN_DEEPDIVE = CAN_TILE_DEEPDIVE && ptype['name'] == "Missile Submarine"; // ******************************************************************************************************************* *** if (UNIT_CAN_HIDEOUT) { unit_actions["hideout"] = {name: "Hideout (shift-H)"}; $("#order_hideout").show(); + } else if (UNIT_CAN_DEEPDIVE) { + unit_actions["Dive Deep"] = {name: "Dive Deep (ctrl-D)"}; $("#order_deepdive").show(); } //-- if (UNIT_CAN_FORT) { - unit_actions["fortress"] = {name: "Build Fort (shift-F)"}; $("#order_fortress").show(); - $("#order_fortress").prop("title", "Build Fort (shift-F)"); + unit_actions["fort"] = {name: "Build Fort (shift-F)"}; $("#order_fort").show(); + $("#order_fort").prop("title", "Build Fort (shift-F)"); } else if (UNIT_CAN_FORTRESS) { // Fortress over Bunker allowed, to remove it. (Bunkers are pillage-proof) if (TILE_HAS_BUNKER) { unit_actions["fortress"] = {name: "Remove Bunker (shift-F)"}; @@ -1676,15 +1753,22 @@ function update_unit_order_commands() } $("#order_fortress").show(); } else if (UNIT_CAN_CASTLE) { - unit_actions["fortress"] = {name: "Build Castle (shift-F)"}; $("#order_fortress").show(); - $("#order_fortress").prop("title", "Build Castle (shift-F)"); + unit_actions["castle"] = {name: "Build Castle (shift-F)"}; $("#order_castle").show(); + $("#order_castle").prop("title", "Build Castle (shift-F)"); } else if (UNIT_CAN_BUNKER) { - unit_actions["fortress"] = {name: "Build Bunker (shift-F)"}; $("#order_fortress").show(); - $("#order_fortress").prop("title", "Build Bunker (shift-F)"); + unit_actions["bunker"] = {name: "Build Bunker (shift-F)"}; $("#order_bunker").show(); + $("#order_bunker").prop("title", "Build Bunker (shift-F)"); } else if (UNIT_CAN_BUOY) { - unit_actions["fortress"] = {name: "Lay Buoy (shift-F)"}; $("#order_buoy").show(); + unit_actions["buoy"] = {name: "Lay Buoy (shift-F)"}; $("#order_buoy").show(); } //-- + if (UNIT_CAN_FISHTRAP) { // half-true prequalifier for ability to fishtrap... check the rest here: + if (!is_extra_adjacent(ptile, EXTRA_FISHTRAP, true /* true == cadjacent */)) { + if (is_extra_adjacent(ptile, EXTRA_FISH, false /* false == adjacent */)) { + unit_actions["fishtrap"] = {name: "Lay Fishtrap (I)"}; $("#order_fishtrap").show(); + } + } + } if (UNIT_CAN_NAVALBASE) { unit_actions["navalbase"] = {name: "Naval Base (shift-N)"}; $("#order_navalbase").show(); } @@ -1737,7 +1821,8 @@ function update_unit_order_commands() unit_actions["road"] = {name: "Road (R)"}; } else $("#order_road").hide(); } - } //--------------------------------------------------------------------------------------------------- + } + //--------------------------------------------------------------------------------------------------- // Figure out default of whether pillage is legal and show it, before applying special rules later @@ -1779,26 +1864,31 @@ function update_unit_order_commands() if (!tile_has_extra(ptile, EXTRA_ROAD)) { if ( !client_rules_flag[CRF_SEABRIDGE] || !tile_has_extra(ptile, EXTRA_SEABRIDGE)) { - $("#order_road").show(); - $("#order_railroad").hide(); + if (is_ocean_tile(ptile)) { // an ocean tile with no sea bridge extra or ruleset: can't build roads + $("#order_road").hide(); + $("#order_railroad").hide(); + } else { + $("#order_road").show(); + $("#order_railroad").hide(); + } if (!(tile_has_extra(ptile, EXTRA_RIVER) && !tech_known('Bridge Building'))) { unit_actions["road"] = {name: "Road (R)"}; } } - } else if (tech_known('Railroad') + } + if (tech_known('Railroad') && (tile_has_extra(ptile, EXTRA_ROAD) || (client_rules_flag[CRF_SEABRIDGE] && tile_has_extra(ptile, EXTRA_SEABRIDGE))) && !tile_has_extra(ptile, EXTRA_RAIL)) { $("#order_road").hide(); $("#order_railroad").show(); unit_actions['railroad'] = {name: "Railroad (R)"}; - } else if (can_build_maglev(punit, ptile)) { - $("#order_road").hide(); - $("#order_railroad").hide(); + } + if (can_build_maglev(punit, ptile)) { $("#order_maglev").show(); - unit_actions['maglev'] = {name: "MagLev (R)"}; - } else { - $("#order_road").hide(); - $("#order_railroad").hide(); + var maglev_hotkey = ""; + if ($("#order_road").is(":hidden") && $("#order_railroad").is(":hidden")) + maglev_hotkey = " (R)"; + unit_actions['maglev'] = {name: "MagLev"+maglev_hotkey}; } if (can_build_sea_bridge(punit, ptile)) { unit_actions["road"] = {name: "Sea Bridge (R)"}; @@ -1949,23 +2039,25 @@ function update_unit_order_commands() } if (pcity != null && city_has_building(pcity, improvement_id_by_name(B_AIRPORT_NAME))) { - if (pcity["airlift"]>0 && punit['movesleft']>0) { + const can_airlift = unit_can_do_action(punit, ACTION_AIRLIFT); + if (pcity["airlift"]>0 && punit['movesleft']>0 && can_airlift) { unit_actions["airlift"] = {name: "Airlift (shift-L)"}; $("#order_airlift").show(); - //$("#order_airlift_disabled").hide(); } else { - //$("#order_airlift").hide(); - $("#order_airlift_disabled").show(); + if (can_airlift) $("#order_airlift_disabled").show(); } } // Upgrade unit: 1. Check if possible, 2. Check if upgrade unit can itself be upgraded. 3. Calculate upgrade cost. 4. Display orders with cost included. - if (pcity != null && ptype != null - && unit_types[ptype['obsoleted_by']] - && (can_player_build_unit_direct(client.conn.playing, unit_types[ptype['obsoleted_by']]) - // handle the case of "can updade to type after next"; e.g., warriors to musketeers without having feudalism: - || can_player_build_unit_direct(client.conn.playing, unit_types[unit_types[ptype['obsoleted_by']]['obsoleted_by']])) - ) { + if (ptype != null && + ( // unit is in a city and player is allowed to build the type to which it obsoletes: this means the unit can upgrade: + (pcity != null && unit_types[ptype['obsoleted_by']] && can_player_build_unit_direct(client.conn.playing, unit_types[ptype['obsoleted_by']])) + || // the case where it "can upgrade to type after next"; e.g., warriors to musketeers without having feudalism: + (pcity != null && ptype.obsoleted_by < getLength(unit_types) && can_player_build_unit_direct(client.conn.playing, unit_types[unit_types[ptype['obsoleted_by']]['obsoleted_by']])) + || // MP2D Workers can upgrade to Workers II anywhere at all + (client_rules_flag[CRF_MP2_D] && ptype.name == "Workers" && can_player_build_unit_direct(client.conn.playing, unit_types[ptype['obsoleted_by']]) && !tech_known("Explosives")) + ) + ) { //console.log(ptype['name']+" is allowed AT LEAST ONE upgrade. Beginning loop to check for higher upgrades."); var upgrade_type = unit_types[ptype['obsoleted_by']]; @@ -2013,6 +2105,9 @@ function update_unit_order_commands() if (ptype.name == 'Alpine Troops' || ptype.name == 'Riflemen') { upgrade_cost = 4; } + else if (upgrade_name == "Workers II" || upgrade_name == "Diplomat") { + upgrade_cost = "free"; + } } /* *********************************************************************************************** */ @@ -2060,7 +2155,7 @@ function update_unit_order_commands() // Deboard transport ---------------------------------------- if (unit_can_do_action(punit, ACTION_TRANSPORT_DEBOARD)) { if (punit.transported_by) { - if (unit_can_do_unload(punit)) { + if (unit_can_deboard(punit)) { let ttitle = "Deboard from "+unit_type(units[punit.transported_by]).name + " (shift-T)"; unit_actions["unit_deboard"] = {name: ttitle}; @@ -2104,7 +2199,7 @@ function update_unit_order_commands() for (var r = 0; r < units_on_tile.length; r++) { let tunit = units_on_tile[r]; if (tunit['transported'] && tunit['transported_by'] == punit.id) { - if (unit_can_do_unload(tunit)) { + if (unit_can_deboard(tunit)) { unloadable ++; tcandidate = tunit.id; if (utype_has_flag(unit_types[tunit['type']], UTYF_MARINES)) show_cargo = true; @@ -2139,6 +2234,25 @@ function update_unit_order_commands() Auto-attack, UI modes, jump to last screen focus, etc. */ + /* FORCED EXCLUSION RULES */ + // TRAWLERS, they can't do lots of things that Workers can. + if ((client_rules_flag[CRF_MP2_D]) && ptype['name'] == "Trawler") { + $("#order_irrigate").hide(); delete unit_actions["irrigation"]; + $("#order_build_farmland").hide(); // "" + $("#order_mine").hide(); delete unit_actions["mine"]; + $("#order_oil_well").hide(); // "" + $("#order_plant_forest").hide(); // "" + $("#order_make_swamp").hide(); // "" + $("#order_forest_remove").hide(); delete unit_actions["forest"]; + $("#order_radar").hide(); delete unit_actions["airbase"]; + $("#order_airbase").hide() // " + if (unit_actions["fortress"] && unit_actions["fortress"]["name"] != "Lay Buoy (shift-F)") { + delete unit_actions["fortress"]; + $("#order_fortress").hide(); // "" + } + $("#order_navalbase").hide(); // "" + } + var num_tile_units = tile_units(ptile); if (num_tile_units != null) { if (num_tile_units.length >= 2 && !touch_device) { // Touch devices have no buttons or keys to issue multiple orders @@ -2399,6 +2513,7 @@ function set_unit_focus(punit) } else { current_focus[0] = punit; action_selection_next_in_focus(IDENTITY_NUMBER_ZERO); + if (renderer == RENDERER_WEBGL) update_unit_position(index_to_tile(punit['tile'])); } if (punit) warcalc_set_default_vals(punit); @@ -2426,6 +2541,10 @@ function click_unit_in_panel(e, punit) } } + // though doing the exact same thing as single-click, shift-click was losing the other units in the panel, so + // try to emulate everything else it does, as a test to get those units displayed in the panel even though + // not in focus: + if (renderer == RENDERER_WEBGL) update_unit_position ( index_to_tile(punit['tile'])); auto_center_on_focus_unit(); update_active_units_dialog(); //previously only doing this but it lost unselected units in the panel @@ -2451,11 +2570,13 @@ function set_unit_focus_and_redraw(punit) if (punit == null) { current_focus = []; unit_may_have_lost_focus(); + if (renderer == RENDERER_WEBGL) webgl_clear_unit_focus(); } else { current_focus[0] = punit; unit_may_have_lost_focus(); action_selection_next_in_focus(IDENTITY_NUMBER_ZERO); warcalc_set_default_vals(punit); // warcalc default vals as last clicked units + if (renderer == RENDERER_WEBGL) update_unit_position(index_to_tile(punit['tile'])); } //shift-spacebar to return to last location: @@ -2509,6 +2630,7 @@ function auto_center_on_focus_unit() if (ptile != null && auto_center_on_unit) { center_tile_mapcanvas(ptile); + update_unit_position(ptile); } } @@ -2637,6 +2759,10 @@ function order_wants_direction(order, act_id, ptile) { /* Always illegal to perform to a target on a neighbor tile. */ return false; } + // FIXME: The 2 cases below fell through cracks and returned false, so now we hack + // them in. (These actions would work sans hack, if they had min_distance == 1) + if (act_id = ACTION_EXPEL_UNIT) return true; + if (act_id = ACTION_CAPTURE_UNITS) return true; /* FIXME: allied units and cities shouldn't always make actions be * performed from the neighbor tile. */ @@ -2747,13 +2873,20 @@ function paste_tile_target_for_prod(canvas_x, canvas_y) **************************************************************************/ function worked_tile_click(ptile) { + if (observing) return; + var work_city_id = ptile['worked']; /* This is how selector_city gets set, when you click on a worked tile, * the city working it becomes the new selector_city: */ - if (work_city_id) selector_city = work_city_id; + if (work_city_id) { + // Abort if the city owning the tile is foreign: + if (cities[work_city_id].owner != client.conn.playing.playerno) return; + // Sets operative city when clicking any new tiles to work or unwork: + selector_city = work_city_id; + } - // Unworked tile and no selector_city = no action can be specified here. + // Unworked tile and no selector_city = no action can be specified here: if (!selector_city) return; draw_city_output = true; // failsafe insurance: this mode should be on @@ -2761,15 +2894,29 @@ function worked_tile_click(ptile) var packet = null; if (ptile['worked'] != 0) { + // Disallow attempting specialist if clicking someone else's worked tile: + if (ptile.owner != client.conn.playing.playerno + && ptile.owner != UNCLAIMED_LAND) { + play_sound("click_illegal.ogg"); + return; + } packet = {"pid" : packet_city_make_specialist, "city_id" : work_city_id, - "tile_id" : ptile['index']}; + "tile_id" : ptile['index'], + "specialist_to": -1 + }; } else { + // Disallow attempting to work a tile not in the city's workable map: + if (!city_map_includes_tile(ptile, cities[selector_city])) { + play_sound("click_illegal.ogg"); + return; + } packet = {"pid" : packet_city_make_worker, "city_id" : selector_city, "tile_id" : ptile['index']}; } send_request(JSON.stringify(packet)); + //play_sound("click_legal.ogg"); } /************************************************************************** @@ -2837,6 +2984,7 @@ function do_map_click(ptile, qtype, first_time_called) if (goto_active /*&& !touch_device*/) { //(allow clicking same tile when giving a Nuke order.) deactivate_goto(false); } + if (renderer == RENDERER_2DCANVAS) { if (!mouse_click_mod_key['shiftKey']) { // normal left-click /* CONDITIONS FOR SHOWING A CONTEXT MENU: 1.Automatic context menu when clicking unit, if 'unit_click_menu' user PREF is on. @@ -2861,6 +3009,7 @@ function do_map_click(ptile, qtype, first_time_called) came_from_context_menu = true; } } + } } else if (!mouse_click_mod_key['shiftKey'] && unit_click_menu && !should_ask_server_for_actions(current_focus[0])) { // 3D handling of above. TO DO: test/integrate same 2D functionality above for 3D if appropriate @@ -2964,10 +3113,12 @@ function do_map_click(ptile, qtype, first_time_called) if ( Math.abs(tile_dx)<=1 && Math.abs(tile_dy) <=1 // adjacent && goto_last_action == ACTION_COUNT // not an appended Go...And command && !connect_active // not in connect mode to make multiple roads/irrigation - && (true_goto_path_length <= 1) // don't override path>=2 which has better legal way to get to adjacent tile - ) // "illegal" adjacent goto attempts render goto_path.length == undefined (true_goto_path_length will then be 0) + && (true_goto_path_length <= 1) // don't override path>=2 which has better legal way to get to adjacent tile. "illegal" adjacent + // goto attemps render goto_path.length == undefined (true_goto_path_length will then be 0) + && !mouse_click_mod_key['shiftKey'] // shift gives player a way to circumvent override; this allows a delayed GOTO if there's UWT + ) { - console.log("GO TO overridden because adjacent tile.") + console.log("GOTO changed to MOVE because adjacent tile.\nShift-click tile to force GOTO instead of MOVE.") switch (tile_dy) { case 0: // neither north nor south: @@ -3170,10 +3321,12 @@ function do_map_click(ptile, qtype, first_time_called) } else if (!has_movesleft_warning_been_shown) { has_movesleft_warning_been_shown = true; var ptype = unit_type(punit); + var has = is_word_plural(ptype['name']) ? "have" : "has"; message_log.update({ event: E_BAD_COMMAND, - message: (is_longturn() ? ptype['name'] + " has no moves left." - : ptype['name'] + " has no moves left. Press turn done for the next turn.") + message: ( delayed_goto_active ? (ptype['name'] + " will move at turn change.") : + (is_longturn() ? ptype['name'] + " " + has + " no moves left." + : ptype['name'] + " " + has + " no moves left. Press turn done for the next turn.")) }); } @@ -3251,7 +3404,11 @@ function do_map_click(ptile, qtype, first_time_called) set_unit_focus_and_redraw(sunits[0]); if (city_click_goto_cooldown(ptile) && !should_ask_server_for_actions(sunits[0])) { // don't show contextmenu if in the cooldown period for a double tap GOTO - $("#canvas").contextMenu(); + if (renderer == RENDERER_2DCANVAS) { + $("#canvas").contextMenu(); + } else { //3D handling can potentially be made different later + $("#canvas_div").contextMenu(); + } } return; // move the commented-out return from below up here } else if (!goto_active) { //if GOTO active then the click is a move command, not a show city command @@ -3425,7 +3582,7 @@ function global_keyboard_listener(ev) } civclient_handle_key(keyboard_key, ev.keyCode, ev['ctrlKey'], ev['altKey'], ev['shiftKey'], ev); - $("#canvas").contextMenu('hide'); + if (renderer == RENDERER_2DCANVAS) $("#canvas").contextMenu('hide'); } /************************************************************************** @@ -3456,6 +3613,13 @@ function civclient_handle_key(keyboard_key, key_code, ctrl, alt, shift, the_even } break; + case 'F': + if (alt && !ctrl && !shift) { + the_event.preventDefault(); + console_filter_dialog(); + } + break; + case 'G': if (alt && !ctrl && !shift) { the_event.preventDefault(); // override possible browser shortcut @@ -3493,9 +3657,14 @@ function civclient_handle_key(keyboard_key, key_code, ctrl, alt, shift, the_even the_event.preventDefault(); // override possible browser shortcut quicksave(); } - else if (alt) { + else if (!ctrl && !shift && alt) { the_event.preventDefault(); // override possible browser shortcut show_fullscreen_window(); + } else if (ctrl && shift && alt) { + if (is_supercow() || was_supercow) { + flip_supercow(); + was_supercow = true; + } } break; @@ -3635,7 +3804,10 @@ map_handle_key(keyboard_key, key_code, ctrl, alt, shift, the_event) // CTRL-ALT-D user forced disconnect the_event.preventDefault(); // override possible browser shortcut clinet_disconnect_from_server(); - } else if (!(alt || ctrl)) { + } else if (ctrl && !shift && !alt) { + the_event.preventDefault(); // override possible browser shortcut + key_unit_dive(); + } else if (!(alt || ctrl || shift)) { key_unit_action_select(); } break; @@ -3644,10 +3816,10 @@ map_handle_key(keyboard_key, key_code, ctrl, alt, shift, the_event) if (shift && !ctrl && !alt) { key_unit_airbase(); } - else if (ctrl && shift) { + else if (ctrl && shift && !alt) { the_event.preventDefault(); // override possible browser shortcut // show/hide the dev/debug messages sent from server to supercow users - $(".e_log_error").toggle(); + toggle_error_logging(); } else if (ctrl && !shift && !alt) { the_event.preventDefault(); // override possible browser shortcut @@ -3662,9 +3834,13 @@ map_handle_key(keyboard_key, key_code, ctrl, alt, shift, the_event) add_client_message("Alt-Shift-F. Focus-lock set to "+(focuslock ? "ON." : "OFF.")); simpleStorage.set('focuslock', focuslock); } - else if (shift) { + else if (shift && !alt && !ctrl) { key_unit_fortress(); - } else { + } else if (alt && !ctrl && !shift) { + the_event.preventDefault(); + console_filter_dialog(); + } + else { key_unit_fortify(); } break; @@ -4032,7 +4208,11 @@ map_handle_key(keyboard_key, key_code, ctrl, alt, shift, the_event) came_from_context_menu = false; /* Abort any context menu blocking. */ context_menu_active = true; - $("#canvas").contextMenu(true); + if (renderer == RENDERER_2DCANVAS) { + $("#canvas").contextMenu(true); + } else { + $("#canvas_div").contextMenu(true); + } /* Abort target tile selection. */ paradrop_active = false; @@ -4043,15 +4223,17 @@ map_handle_key(keyboard_key, key_code, ctrl, alt, shift, the_event) // shift-space, return to previous map position // space, will clear selection and goto. case 32: - if (shift) auto_center_last_location(); - else if (ctrl && alt) { + if (shift &&!ctrl && !alt) auto_center_last_location(); + else if (ctrl && alt && !shift) { the_event.preventDefault(); key_paste_link_under_cursor(); - } else { + } + else { save_last_unit_focus(); current_focus = []; unit_may_have_lost_focus(); + if (renderer == RENDERER_WEBGL) webgl_clear_unit_focus(); clear_all_modes(); $("#canvas_div").css("cursor", "default"); goto_request_map = {}; @@ -4078,10 +4260,37 @@ map_handle_key(keyboard_key, key_code, ctrl, alt, shift, the_event) break; case 107: + //zoom in + if (renderer == RENDERER_WEBGL) { + let new_camera_dy = camera_dy - 60; + let new_camera_dx = camera_dx - 45; + let new_camera_dz = camera_dz - 45; + if (new_camera_dy < 350 || new_camera_dy > 1200) { + return; + } else { + camera_dx = new_camera_dx; + camera_dy = new_camera_dy; + camera_dz = new_camera_dz; + } + camera_look_at(camera_current_x, camera_current_y, camera_current_z); + } break; case 109: //zoom out + if (renderer == RENDERER_WEBGL) { + let new_camera_dy = camera_dy + 60; + let new_camera_dx = camera_dx + 45; + let new_camera_dz = camera_dz + 45; + if (new_camera_dy < 350 || new_camera_dy > 1200) { + return; + } else { + camera_dx = new_camera_dx; + camera_dy = new_camera_dy; + camera_dz = new_camera_dz; + } + camera_look_at(camera_current_x, camera_current_y, camera_current_z); + } break; } @@ -4148,7 +4357,7 @@ function handle_context_menu_callback(key) break; case "maglev": - key_unit_road(); + key_unit_maglev(); break; case "quay": @@ -4204,6 +4413,10 @@ function handle_context_menu_callback(key) key_unit_airbase(); break; + case "fishtrap": + key_unit_fishtrap(); + break; + case "transform": key_unit_transform(); break; @@ -4813,6 +5026,11 @@ function key_unit_load(scoop_units) boarded ++; boarded_list += " [`" + freemoji_name_from_universal(unit_type(punit).name) + "`] "; boarded_on[punit.id] = tunit.id; + /* This line and the and the one under the commented out line below seem to fix an edge + case that happens when giving a non-boardable cargo unit an order to board wherein + boarded_on[punit.id] is undefined; we keep track of the LAST transport that was + successfully boarded on by having reached this code. */ + var last_successful_transport = boarded_on[punit.id]; } } } @@ -4820,7 +5038,9 @@ function key_unit_load(scoop_units) add_client_message("Boarding " + pluralize("unit", boarded) + ". " + boarded_list + (tunit ? "→ [`" - + freemoji_name_from_universal(unit_type(units[boarded_on[punit.id]]).name) +"`] " : "") ); +// + freemoji_name_from_universal(unit_type(units[boarded_on[punit.id]]).name) +"`] " : "") ); + + freemoji_name_from_universal(unit_type(units[last_successful_transport]).name) +"`] " : "") ); + setTimeout(update_active_units_dialog, update_focus_delay); } // Don't advance focus if more than one dialog open, it would reset our focus units @@ -4835,26 +5055,51 @@ function key_unit_load(scoop_units) function key_unit_deboard() { var funits = get_units_in_focus(); - var unloaded = 0; + var deboarded = 0; + var deboarders_ready=0; + var untransported=0; + var unable_to_deboard=0; + var unable_list = ""; var deboard_list = ""; for (var i = 0; i < funits.length; i++) { var punit = funits[i]; - if (unit_can_do_unload(punit)) { + if (unit_can_deboard(punit)) { request_unit_do_action(ACTION_TRANSPORT_DEBOARD, punit['id'], punit['transported_by']); - unloaded++; + deboarded++; + deboarders_ready += punit.movesleft; deboard_list += " [`" + freemoji_name_from_universal(unit_type(punit).name) + "`]"; + } else if (punit.transported) { + unable_to_deboard++; + unable_list += " [`" + freemoji_name_from_universal(unit_type(punit).name) + "`]"; + } else { + untransported++; } } deactivate_goto(false); - if (unloaded) { - add_client_message("Deboarding "+unloaded+" unit"+ (unloaded>1 ? "s. " : ". ") + // Indicate units that we (strongly believe) the server will let us successfully deboard: + if (deboarded) { + add_client_message("Deboarding "+deboarded+" unit"+ (deboarded>1 ? "s: " : ": ") +deboard_list); - setTimeout(function() {advance_unit_focus(false)}, update_focus_delay); + } + // Indicate units that we know can't deboard (because we didn't ask the server): + if (unable_to_deboard) { + add_client_message("Unable to deboard "+unable_to_deboard+" unit"+ (unable_to_deboard>1 ? "s: " : ": ") + +unable_list, "e_unit_illegal_action"); + } + // Deboard command given to untransported unit AND no one else was transported/deboarding: + if (untransported && !deboarded && !unable_to_deboard) { + add_client_message("Only transported units can deboard.", "e_unit_illegal_action"); + } + /* If we deboarded units AND none have moves left AND no one was disallowed to deboard, + advance unit focus: */ + if (deboarded && deboarders_ready==0 && unable_to_deboard==0) { + setTimeout(function() {advance_unit_focus(false)}, update_focus_delay+250); } } + /******************************************************************************* V3: (1) If Transport is selected unit: try to "Unload cargo" (2) If Passenger is selected unit AND couldn't unload cargo, deboard it. @@ -4867,8 +5112,10 @@ function key_unit_deboard() *******************************************************************************/ function key_unit_unload() { - var unloaded =0; // counter for unloaded units - var deboarded=0; // counter for deboarded units + var unloaded =0; // counter for unloaded units + var deboarded=0; // counter for deboarded units + var unloaded_cargo_ready=0; // unloaded cargo that can move + var deboarders_ready=0; // deboarded cargo that can move var unload_list = ""; var deboard_list = ""; @@ -4894,16 +5141,17 @@ function key_unit_unload() let this_unit_unloaded = 0; // Selected Unit is: selected and has transport capacity. Therefore, check // each unit on tile to see if it's on this transporter, and unload it. - if (sunits[s] && stype.transport_capacity>0) { //console.log(" sunit[i] has a transport capacity. attempting unload cargo"); + if (sunits[s] && stype.transport_capacity>0) { //console.log(" sunits[i] has a transport capacity. attempting unload cargo"); for (var i = 0; i < units_on_tile.length; i++) { var punit = units_on_tile[i]; //console.log("punit["+i+"]"); // If iterated tile unit is being transported by selected unit, then UNLOAD it! if (punit['transported'] && punit['transported_by'] == sunits[s]['id']) { - if (unit_can_do_unload(punit)) { + if (unit_can_deboard(punit)) { request_unit_do_action(ACTION_TRANSPORT_UNLOAD, punit['transported_by'], punit['id']); unloaded++; // Total number of all unloadings from all selected units. this_unit_unloaded++; // Number of unloadings just from this transport. + unloaded_cargo_ready += punit.movesleft; unload_list += " [`" + freemoji_name_from_universal(unit_type(punit).name) + "`]" } } @@ -4914,9 +5162,10 @@ function key_unit_unload() // command, but we know what you wanted. So fine, we'll let you do it. if (sunits[s] && this_unit_unloaded==0 && sunits[s]['transported']) { //console.log(" sunit[i] is cargo)"); - if (unit_can_do_unload(sunits[s])) { + if (unit_can_deboard(sunits[s])) { request_unit_do_action(ACTION_TRANSPORT_DEBOARD, sunits[s]['id'], sunits[s]['transported_by']); deboarded++; + deboarders_ready += sunits[s].movesleft; deboard_list += " [`" + freemoji_name_from_universal(unit_type(sunits[s]).name) + "`] " } } @@ -4927,24 +5176,37 @@ function key_unit_unload() // Show # of units who successfully unloaded and/or deboarded: if (unloaded) { - add_client_message("Unloading "+unloaded+" unit"+ (unloaded>1 ? "s. " : ". ") + add_client_message("Unloading "+unloaded+" unit"+ (unloaded>1 ? "s: " : ": ") + unload_list); } if (deboarded) { - add_client_message("Deboarding "+deboarded+" unit"+ (deboarded>1 ? "s. " : ". ") + add_client_message("Deboarding "+deboarded+" unit"+ (deboarded>1 ? "s: " : ": ") + deboard_list ); } else if (!unloaded && !deboarded) { if (sunits.length == 1) { - add_client_message(unit_type(sunits[0]).rule_name+" couldn't unload cargo here.") + add_client_message(unit_type(sunits[0]).rule_name+" couldn't unload here.", "e_unit_illegal_action") } - else if (!deboarded) { - add_client_message("Can't unload cargo here."); + else { + add_client_message("Can't unload cargo here.", "e_unit_illegal_action"); } return; // avoid advancing unit focus after failed command. } - setTimeout(function() {advance_unit_focus(false)}, update_focus_delay); + /* OPTIONAL heuristics: + 1. Don't advance focus on an unloading transport that has moves + left if it's unloading cargo who doesn't have moves left: */ + if (unloaded && sunit.movesleft && !unloaded_cargo_ready) { + return; + } + /* 2. If we deboarded only (without an unloader-transport also + active), AND any deboarders had move left, don't advance focus: */ + if (deboarded && !unloaded && deboarders_ready) { + return; + } + /* 3. Give a little extra time for server to unsentry unloaded cargo so we + will advance focus to it */ + setTimeout(function() {advance_unit_focus(false)}, update_focus_delay+250); } /************************************************************************** @@ -5452,6 +5714,25 @@ function key_unit_hideout() setTimeout(update_unit_focus, update_focus_delay); } +/************************************************************************** + Tell the units in focus to dive deep (build a "deep depth" "base") +**************************************************************************/ +function key_unit_dive() +{ + const deepdive_rules = client_rules_flag[CRF_MP2_D]; + if (!deepdive_rules) return; + + var funits = get_units_in_focus(); + for (var i = 0; i < funits.length; i++) { + var punit = funits[i]; + request_new_unit_activity(punit, ACTIVITY_BASE, EXTRA_DEEPDIVE); + // Focused unit got orders, make sure not on waiting_list now: + remove_unit_id_from_waiting_list(punit['id']); + } + deactivate_goto(false); + setTimeout(update_unit_focus, update_focus_delay); +} + /************************************************************************** Tell the units in focus to build airbase (or Radar on top of it). **************************************************************************/ @@ -5493,8 +5774,16 @@ function key_unit_irrigate() var funits = get_units_in_focus(); for (var i = 0; i < funits.length; i++) { var punit = funits[i]; - /* EXTRA_NONE -> server decides */ - request_new_unit_activity(punit, ACTIVITY_IRRIGATE, EXTRA_NONE); + + /* MP2-D onward: "I" for irrigate, when done on ocean tiles, means, + to lay a Fishtrap: */ + if (client_rules_flag[CRF_MP2_D] && is_ocean_tile(unit_tile(punit))) { + const punit = funits[i]; + request_new_unit_activity(punit, ACTIVITY_BASE, EXTRA_FISHTRAP); + } else { // Normal irrigation of land; + /* EXTRA_NONE -> server decides */ + request_new_unit_activity(punit, ACTIVITY_IRRIGATE, EXTRA_NONE); + } // Focused unit got orders, make sure not on waiting_list now: remove_unit_id_from_waiting_list(punit['id']); } @@ -5890,15 +6179,29 @@ function unit_can_vigil(punit) { // Hard coded for now until we get action enablers var ptype = unit_type(punit); + var ptile = unit_tile(punit); var name = ptype['name']; var moves_used = (parseFloat(ptype['move_rate']) / parseFloat(SINGLE_MOVE)) - (parseFloat(punit['movesleft']) / parseFloat(SINGLE_MOVE)); + var fuel = punit['fuel']; // For now Vigil is only for these server settings: if (server_settings["autoattack"]["val"] != true) return false; if (server_settings["autoattack_style"]["val"] == 0) return false; switch (name) { + case "Catapult": + case "Ballista": + case "Cannon": + case "Artillery": + case "Magnum Turret": + case "Howitzer": + if (client_rules_flag[CRF_MP2_D]) { + if (moves_used <= 0 && (tile_city(ptile) || does_tile_have_base(ptile))) { + return true; + } + } + break; case "Fighter": if (moves_used <= 2) return true; @@ -5911,10 +6214,14 @@ function unit_can_vigil(punit) if (moves_used <= 3) return true; break; + case "Multi-Fighter": + if (fuel > 1) + return true; + break; case "Stealth Fighter": if (moves_used <= 4) return true; - break; + break; } return false; } @@ -5958,10 +6265,20 @@ function can_build_sea_bridge(punit, ptile) **************************************************************************/ function can_build_maglev(punit, ptile) { + const seabridge_rules = (typeof EXTRA_SEABRIDGE !== "undefined"); + return ((typeof EXTRA_MAGLEV !== "undefined") && (punit != null && ptile != null) && (!tile_has_extra(ptile, EXTRA_MAGLEV)) - && (tile_has_extra(ptile, EXTRA_RAIL)) + + && (!client_rules_flag[CRF_MP2_D] // MP2D on requires road or seabridge under it + || (tile_has_extra(ptile, EXTRA_ROAD) || tile_has_extra(ptile, EXTRA_SEABRIDGE)) + ) + + && (!is_ocean_tile(ptile) + || (seabridge_rules && tile_has_extra(ptile, EXTRA_SEABRIDGE)) + ) + && (unit_can_do_action(punit, ACTION_ROAD)) && tech_known('Superconductors') ); @@ -6015,8 +6332,11 @@ function can_build_canal(punit, ptile) // TODO: Deprecate all pre-MP2C logic to simplify to the superior solution if (typeof EXTRA_CANAL === "undefined") return 0; + if (typeof EXTRA_WATERWAY === "undefined") return 0; + if (tile_terrain(ptile) == null) return 0; - if (punit == null || ptile == null) return 0; + if (punit == null || ptile == null) return 0; + if (is_ocean_tile(ptile)) return 0; var is_lowland = (tile_terrain(ptile)['name'] != 'Hills' && tile_terrain(ptile)['name'] != 'Mountains'); @@ -6050,6 +6370,7 @@ function can_build_canal(punit, ptile) } if ( !tile_has_extra(ptile, EXTRA_CANAL) + && !tile_has_extra(ptile, EXTRA_WATERWAY) && unit_can_do_action(punit, ACTION_ROAD) && is_lowland && water_near @@ -6248,6 +6569,29 @@ function key_unit_naval_base() setTimeout(update_unit_focus, update_focus_delay); } +/************************************************************************** + Tell the units in focus to build naval base. NOTE: This is not called by + a key_unit keypress "I" like other key_unit commands. But it gets called + by a context menu click or orders button click. If the "I" key is pressed + then key_unit_irrigate does the same code as this if it is on an ocean + tile. +**************************************************************************/ +function key_unit_fishtrap() +{ + if (typeof EXTRA_FISHTRAP === "undefined") return; + + var funits = get_units_in_focus(); + + for (var i = 0; i < funits.length; i++) { + const punit = funits[i]; + request_new_unit_activity(punit, ACTIVITY_BASE, EXTRA_FISHTRAP); + remove_unit_id_from_waiting_list(punit['id']); + } + + deactivate_goto(false); + setTimeout(update_unit_focus, update_focus_delay); +} + /************************************************************************** Tell the units in focus to build road or railroad. **************************************************************************/ @@ -6291,7 +6635,32 @@ function key_unit_road() deactivate_goto(false); setTimeout(update_unit_focus, update_focus_delay); } +/************************************************************************** + Tell the units in focus to build maglev. Separated from key_unit_road + because it's possible to build MagLev without road/rail in some + rulesets. +**************************************************************************/ +function key_unit_maglev() +{ + var funits = get_units_in_focus(); + for (var i = 0; i < funits.length; i++) { + var punit = funits[i]; + var ptile = index_to_tile(punit['tile']); + // On ocean, MagLev requires a SeaBridge (if ruleset has seabridge.) + if (is_ocean_tile(ptile)) { + if (typeof EXTRA_SEABRIDGE !== "undefined" && !tile_has_extra(ptile, EXTRA_SEABRIDGE)) { + return; + } + } + if (can_build_maglev(punit, ptile)) { + request_new_unit_activity(punit, ACTIVITY_GEN_ROAD, extras['Maglev']['id']); + remove_unit_id_from_waiting_list(punit['id']); // Unit received orders, don't ask orders later + } + } + deactivate_goto(false); + setTimeout(update_unit_focus, update_focus_delay); +} /************************************************************************** Tell the units in focus to build a quay @@ -6326,7 +6695,7 @@ function key_unit_homecity() var pcity = tile_city(ptile); if (pcity != null) { - request_unit_do_action(ACTION_HOME_CITY, punit['id'], pcity['id']); + request_unit_do_action(ACTION_HOME_CITY, punit['id'], pcity['id'], -1); $("#order_change_homecity").hide(); } } @@ -6460,7 +6829,6 @@ function request_new_unit_activity(punit, activity, target) action_decision_clear_want(punit['id']); var packet = {"pid" : packet_unit_change_activity, "unit_id" : punit['id'], "activity" : activity, "target" : target }; - //if (DEBUG_LOG_PACKETS) console.log("Sending action request: "+JSON.stringify(packet)); send_request(JSON.stringify(packet)); } @@ -6914,11 +7282,15 @@ function check_request_goto_path() if (goto_active && current_focus.length > 0 && (prev_mouse_x != mouse_x || prev_mouse_y != mouse_y || prev_goto_tile<=LAST_FORCED_CHECK)) { - ptile = canvas_pos_to_tile(mouse_x, mouse_y); + if (renderer == RENDERER_2DCANVAS) { + ptile = canvas_pos_to_tile(mouse_x, mouse_y); + } else { + ptile = webgl_canvas_pos_to_tile(mouse_x, mouse_y); + } if (ptile != null) { if (ptile['tile'] != prev_goto_tile) { - clear_goto_tiles(); // TO DO: goto tiles should not be in tiles[tild_id][goto_dir] which takes forever to clear, but their own array instead + clear_goto_tiles(); // TODO: goto tiles should not be in tiles[tild_id][goto_dir] which takes forever to clear, but their own array instead /* Send request for goto_path to server. */ for (var i = 0; i < current_focus.length; i++) { request_goto_path(current_focus[i]['id'], ptile['x'], ptile['y']); @@ -6993,6 +7365,7 @@ function update_goto_path(goto_packet) // Don't bother checking goto for same tile unit is on if (ptile==goaltile) return; + if (renderer == RENDERER_2DCANVAS) { for (var i = 0; i < goto_packet['dir'].length; i++) { if (ptile == null) break; var dir = goto_packet['dir'][i]; @@ -7005,6 +7378,9 @@ function update_goto_path(goto_packet) ptile['goto_dir'] = dir; ptile = mapstep(ptile, dir); } + } else { + webgl_render_goto_line(ptile, goto_packet['dir']); + } current_goto_turns = goto_packet['turns']; @@ -7039,8 +7415,11 @@ function show_goto_path(goto_packet) **************************************************************************/ function center_tile_mapcanvas(ptile) { - - center_tile_mapcanvas_2d(ptile); + if (renderer == RENDERER_2DCANVAS) { + center_tile_mapcanvas_2d(ptile); + } else { + center_tile_mapcanvas_3d(ptile); + } } @@ -7049,7 +7428,13 @@ function center_tile_mapcanvas(ptile) **************************************************************************/ function popit() { - var ptile = canvas_pos_to_tile(mouse_x, mouse_y); + var ptile; + + if (renderer == RENDERER_2DCANVAS) { + ptile = canvas_pos_to_tile(mouse_x, mouse_y); + } else { + ptile = webgl_canvas_pos_to_tile(mouse_x, mouse_y); + } if (ptile == null) return; @@ -7081,11 +7466,18 @@ function popit_req(ptile, goto_only) if (ptile == null) return; + let GM_supercow = is_supercow() && observing; // copies tile string to clipboard for later pasting // %%% instead of %% puts it in a format that will send the message privately // to oneself - copy_string_to_clipboard("%%%"+"tile"+ptile['index']+"~%"); + if (GM_supercow) { + copy_string_to_clipboard("/label "+ptile.x+","+ptile.y+" "); + } else { + copy_string_to_clipboard("%%%"+"tile"+ptile['index']+"~%"); + } + +/* if (!goto_only && tile_get_known(ptile) == TILE_KNOWN_UNSEEN) { //TODO: The 2 lines below should be removed after next FCW server restart //comment made on 3 March 2020 @@ -7093,8 +7485,9 @@ function popit_req(ptile, goto_only) return; // Let server give us tile info. OPTIONAL TODO: reconstruct some more based on our // own last known knowledge of the tile. Server only sends Terrain and that's it. - } else if (!goto_only && tile_get_known(ptile) == TILE_UNKNOWN) { + } else*/ if (GM_supercow || (!goto_only && tile_get_known(ptile) == TILE_UNKNOWN)) { show_dialog_message("Tile info", "Location: x:" + ptile['x'] + " y:" + ptile['y']); + return; } @@ -7478,8 +7871,7 @@ function update_active_units_dialog() var fuel_left = (aunit['fuel']-1) + aunit['movesleft']/ptype['move_rate']; var fuel_color = ""; var size_adj = mobile_mode ? "font-size:100%" : "font-size:100%;"; - if (aunit['movesleft']==0) fuel_color = ""; // no moves left, fuel indicator is dimmed down - else if (fuel_left>2.001) fuel_color = ""; // more than 2 turns of fuel = blue skies ahead + if (fuel_left>2.001) fuel_color = ""; // more than 2 turns of fuel = blue skies ahead else if (fuel_left>1.001) fuel_color = ""; // more than 1 turn of fuel = blue skies ahead else if (fuel_left>0.85) fuel_color = ""; // full turn of fuel = green else if (fuel_left>0.67) fuel_color = ""; // most moves = green-yellow @@ -7489,13 +7881,12 @@ function update_active_units_dialog() else if (fuel_left>0.50) fuel_color = ""; else fuel_color = ""; - if (aunit['movesleft']==0 && fuel_left<1.0001) { fuel_left="";} // no moves and exactly 1 or less fuel are special cases like airlift/refueling/etc where we don't need to show fuel - else { - if (mobile_mode) { // mobile version of text - active_uinfo += " F:" + fuel_color + fuel_left.toFixed(fuel_left<1?2:1) + ""; - } else { // normal non-mobile text - active_uinfo += " Fuel:" + fuel_color + fuel_left.toFixed(fuel_left<1?2:1) + ""; - } + if (mobile_mode) { // mobile version of text + active_uinfo += " F:" + fuel_color + + fuel_left.toFixed((fuel_left>0 && fuel_left<1)?2:1) + ""; + } else { // normal non-mobile text + active_uinfo += " Fuel:" + fuel_color + + fuel_left.toFixed((fuel_left>0 && fuel_left<1)?2:1) + ""; } } active_uinfo += ""; @@ -7623,31 +8014,32 @@ function check_mouse_drag_unit(ptile) /************************************************************************** Pop-up at game start to enter fullscreen. We might use a browser but we are a full-screen game, damn it! + Removed. Needs a do not ask again opton. **************************************************************************/ -function popup_fullscreen_enter_game_dialog() -{ +//function popup_fullscreen_enter_game_dialog() +//{ // Don't show popup for small screen, we set enter it elsewhere. - if (is_small_screen()) return; +// if (is_small_screen()) return; - id = "#fullscreen_dialog"; - remove_active_dialog(id); /* Reset dialog page. */ - $("#fullscreen_dialog").css("white-space","pre-wrap"); // allow \n to work. - $("
").appendTo("div#game_page"); - - if (!is_small_screen()) - $(id).html("Enters Full Screen when you interact with game.

ALT-S toggles Full Screen.
ESC exits full screen."); - else - $(id).html("Play in Full Screen Mode."); - - var buttons = { 'Yes!': function() - { openFullscreen(); remove_active_dialog(id); }, - 'No': function() {remove_active_dialog(id);} }; - $(id).attr("title", "Full Immersion Mode"); - var dwidth = is_small_screen() ? "90%" : "480"; - $(id).dialog({bgiframe: true, modal: true, buttons: (buttons), height: "auto", width: dwidth}); - $(id).dialog('open'); $(id).dialog('widget').position({my:"center", at:"center", of:window}) - dialog_register(id); -} +// id = "#fullscreen_dialog"; +// remove_active_dialog(id); /* Reset dialog page. */ +// $("#fullscreen_dialog").css("white-space","pre-wrap"); // allow \n to work. +// $("
").appendTo("div#game_page"); + +// if (!is_small_screen()) +// $(id).html("Enters Full Screen when you interact with game.

ALT-S toggles Full Screen.
ESC exits full screen."); +// else +// $(id).html("Play in Full Screen Mode."); + +// var buttons = { 'Yes!': function() +// { openFullscreen(); remove_active_dialog(id); }, +// 'No': function() {remove_active_dialog(id);} }; +// $(id).attr("title", "Full Immersion Mode"); +// var dwidth = is_small_screen() ? "90%" : "480"; +// $(id).dialog({bgiframe: true, modal: true, buttons: (buttons), height: "auto", width: dwidth}); +// $(id).dialog('open'); $(id).dialog('widget').position({my:"center", at:"center", of:window}) +// dialog_register(id); +//} /**************************************************************************** This function opens full screen mode. ****************************************************************************/ diff --git a/freeciv-web/src/main/webapp/javascript/diplomacy.js b/freeciv-web/src/main/webapp/javascript/diplomacy.js index 999c5280f..0edb4793b 100644 --- a/freeciv-web/src/main/webapp/javascript/diplomacy.js +++ b/freeciv-web/src/main/webapp/javascript/diplomacy.js @@ -242,9 +242,41 @@ function client_diplomacy_clause_string(counterpart, giver, type, value) var pplayer = players[giver]; var nation = nations[pplayer['nation']]['adjective']; + /* FIXME: server sends out giver and counterpart as the same player when + it offers a dipl_state clause to the counterpart (i.e., to the + receiver/non-giver). This hack fixes it. TODO: fix the server @ + diplhand.c::handle_diplomacy_create_clause_req */ + if (counterpart == giver && value == 1) { + counterpart = client.conn.playing.playerno; + } + var cb1 = players[counterpart].diplstates[giver]['has_reason_to_cancel']; var cb2 = players[giver].diplstates[counterpart]['has_reason_to_cancel']; const casus_belli = cb1 || cb2; + const giver_state = players[giver].diplstates[counterpart].state; + const counterpart_state = players[counterpart].diplstates[giver].state; + /* giver and counterpart diplstate should always be the same but the info + for one or the other may not be known. OR'ing them together always + results in the correct dipl_state: */ + const dipl_state = giver_state | counterpart_state; + const new_clause_is_old_state = + (type == CLAUSE_CEASEFIRE && dipl_state == DS_CEASEFIRE) + || (type == CLAUSE_PEACE && dipl_state == DS_ARMISTICE) + || (type == CLAUSE_PEACE && dipl_state == DS_PEACE) + || (type == CLAUSE_ALLIANCE && dipl_state == DS_ALLIANCE); + const re_affirm = new_clause_is_old_state; + + /* DEBUG + console.log("--------DIPL LANGUAGE DEBUG----------") + console.log("cprt, giver, type, value = %d,%d,%d,%d",counterpart,giver,type,value); + console.log("giver_state "+giver_state); + console.log("counterpart_state "+counterpart_state); + console.log("dipl_state "+dipl_state); + console.log("new_clause_is_old "+new_clause_is_old_state); + console.log("casus_belli "+casus_belli); + console.log("re_affirm "+re_affirm); + console.log("--------------------------------------") + */ switch (type) { case CLAUSE_ADVANCE: @@ -271,11 +303,23 @@ function client_diplomacy_clause_string(counterpart, giver, type, value) case CLAUSE_SEAMAP: return "The " + nation + " give their seamap"; case CLAUSE_CEASEFIRE: - return casus_belli ? "The parties re-affirm cease-fire." : "The parties agree on a cease-fire"; + if (re_affirm && casus_belli) return "The parties re-affirm cease-fire and clear casus belli."; + // The case below occurs when cease-fire will expire in <3 turns and a renewal is offered: + if (re_affirm) return "The parties renew and extend the cease-fire."; + if (casus_belli) return "The parties agree on a cease-fire and clear casus belli."; + return "The parties agree on a cease-fire." case CLAUSE_PEACE: - return casus_belli ? "The parties re-affirm peace" : "The parties agree on a peace"; + if (re_affirm && casus_belli) return "The parties re-affirm peace and clear casus belli."; + // The case below shouldn't happen, but could happen when server gets limited duration peace pacts: + if (re_affirm) return "The parties renew and extend the peace."; + if (casus_belli) return "The parties agree on a peace and clear casus belli."; + return "The parties agree on a peace." case CLAUSE_ALLIANCE: - return casus_belli ? "The parties re-affirm the alliance" : "The parties create an alliance"; + if (re_affirm && casus_belli) return "The parties re-affirm the alliance and clear casus belli."; + // The case below shouldn't happen, but could happen when server gets limited duration alliances: + if (re_affirm) return "The parties renew and extend the alliance."; + if (casus_belli) return "The parties create an alliance and clear casus belli."; + return "The parties create an alliance."; case CLAUSE_VISION: return "The " + nation + " give shared vision"; case CLAUSE_EMBASSY: diff --git a/freeciv-web/src/main/webapp/javascript/effects.js b/freeciv-web/src/main/webapp/javascript/effects.js index a6e48a133..bb0907349 100644 --- a/freeciv-web/src/main/webapp/javascript/effects.js +++ b/freeciv-web/src/main/webapp/javascript/effects.js @@ -171,7 +171,16 @@ const EFT_IMPR_BUILD_COST_PM = 131; const EFT_ACTION_RESIST_PCT = 132; const EFT_OUTPUT_ADD_BONUS = 133; const EFT_TERRAIN_DEFEND_ADD_BONUS = 134; -const EFT_LAST = 135; +const EFT_RAPTURE_RATE_PM = 135 +const EFT_REHOME_PCT = 136 +const EFT_CELEBRATE_SIZE_ADD = 137 +const EFT_OUTPUT_WASTE_MIN_REDUCE = 138 +const EFT_OUTPUT_WASTE_REDUCE = 139 +const EFT_ACTOR_BRIBE_COST_PCT = 140 +const EFT_ACTOR_INCITE_COST_PCT = 141 +const EFT_TILE_NUKE_PROOF = 142 +const EFT_RAZE_BUILDING_PCT = 143; +const EFT_LAST = 144; */ diff --git a/freeciv-web/src/main/webapp/javascript/emoji_list.js b/freeciv-web/src/main/webapp/javascript/emoji_list.js index 6ef7eec20..d024a357c 100644 --- a/freeciv-web/src/main/webapp/javascript/emoji_list.js +++ b/freeciv-web/src/main/webapp/javascript/emoji_list.js @@ -25,6 +25,7 @@ var freemoji = [ 'concerned', 'confounded', 'confused', +"anger", 'cool', 'disappointed', 'dizzy', @@ -33,6 +34,7 @@ var freemoji = [ 'fedup', 'flushed', 'fuming', +'skull', 'ghost', 'goblin', 'angrydevil', @@ -97,9 +99,11 @@ var freemoji = [ //body parts and emotives 'ear', +'eye', 'eyes', 'lips', 'nose', +'running', 'zzz', 'cool2', 'shit', @@ -249,11 +253,16 @@ var freemoji = [ 'anchor', 'bath', 'bomb', +'boom', +'boot', +'briefcase', 'bulb', +'bullseye', 'camera', 'castle', 'check', 'cityscape', +'village', 'cloud', 'cookie', 'crown', @@ -278,6 +287,7 @@ var freemoji = [ 'megaphone', 'knife', 'lightning', +'medal', 'microscope', 'muscles', 'newspaper', @@ -293,6 +303,7 @@ var freemoji = [ 'ribbon', 'satellitedish', 'scissors', +'scroll', 'search', 'seashell', 'ski', @@ -301,6 +312,7 @@ var freemoji = [ 'snowman', 'sparkle', 'spiral', +'swords', 'telescope', 'toilet', 'trophy', @@ -352,9 +364,12 @@ var freemoji = [ '200', 'airlift', 'bluediamond', +'reddiamond', 'chat', 'clock', +'plus', 'equal', +'minus', 'hammer', 'headstone', 'hourglass', @@ -571,6 +586,7 @@ var freemoji = [ 'divebomber', 'escortfighter', 'jetfighter', +"multi-fighter", 'groundstrikefighter', 'stealthfighter', 'mediumbomber', diff --git a/freeciv-web/src/main/webapp/javascript/empire.js b/freeciv-web/src/main/webapp/javascript/empire.js index 73d01352b..1839d2424 100644 --- a/freeciv-web/src/main/webapp/javascript/empire.js +++ b/freeciv-web/src/main/webapp/javascript/empire.js @@ -55,6 +55,7 @@ var empire_upkeep_show_food = true; var empire_upkeep_show_gold = true; var empire_upkeep_show_shields = true; var empire_upkeep_show_free = true; +var empire_upkeep_show_zero = false; // Default to not show zero-upkeep units empire_screen_updater = new EventAggregator(update_empire_screen, 250, EventAggregator.DP_NONE, 250, 3, 250); @@ -159,14 +160,16 @@ function empire_unit_homecity_screen(wide_screen,narrow_screen,small_screen, panel_html += ""; panel_html += "     show upkeep:  " - + "" - + " " - + "" - + " " - + "" - + " "; - panel_html += "" - + ""; + + "" + + " " + + "" + + " " + + "" + + " "; + panel_html += "" + + " "; + panel_html += "" + + ""; $("#empire_mode_panel").html(panel_html); $("#show_hp").prop("checked", empire_show_hitpoints); @@ -175,6 +178,7 @@ function empire_unit_homecity_screen(wide_screen,narrow_screen,small_screen, $("#show_gold").prop("checked", empire_upkeep_show_gold); $("#show_shield").prop("checked", empire_upkeep_show_shields); $("#show_free").prop("checked", empire_upkeep_show_free); + $("#show_zero").prop("checked", empire_upkeep_show_zero); $('#empire_scroll').css({"height": $(window).height()-160, "overflow-y":"scroll", "overflow-x":"hidden" }); @@ -218,7 +222,7 @@ function empire_unit_homecity_screen(wide_screen,narrow_screen,small_screen, //console.log("MODE: Small Narrow") } // First row for totals - empire_list_html += "
" + "!" // tiny invisible ! will sort it to top of list + "TOTAL UPKEEP
"+pcity['name']+"
"+pcity['name']+"
"+pcity['name']+""; @@ -778,8 +804,14 @@ function empire_econ_improvements_screen(wide_screen,narrow_screen,small_screen, var improvements_html = ""; var city_count = 0; // number of cities (total rows) - // Go through each city - for (var city_id in cities) { +// Go through each city in the order sorted in the cities list, and pluck out units by type, so they're arranged by type: + if ($("#city_table_head").length == 0) update_city_screen(); // If cities list has never been created, create it. + var current_city_row = $("#city_table_head").next().children().first(); // Get first row of the sorted cities list. + // Iterate through all player cities in the order they're sorted in the sorted cities list: + while (current_city_row.length > 0) { + //for (var city_id in cities) { //rows (cities) + var city_id = current_city_row.attr('id').substr(12); + current_city_row = current_city_row.next(); // bump up to next city row for when we iterate the loop back up here var pcity = cities[city_id]; // Only process legal cities owned by player @@ -789,7 +821,7 @@ function empire_econ_improvements_screen(wide_screen,narrow_screen,small_screen, //TO DO, we can only adjust height later after we add a unit_count tally then would have to do a $().css("height",rheight) var rheight = 28 * Math.ceil( (/*col_count*/22*40) / ($(window).width()-140) ); - improvements_html = "
"+pcity['name']+""; @@ -970,7 +1002,7 @@ function empire_econ_upkeep_screen(wide_screen,narrow_screen,small_screen, + "
" + "!" // tiny invisible ! will sort it to top of list + "TOTAL UPKEEP
"+pcity['name']+" "; + improvements_html += ""; // Go through the improvements one at a time and determine whether to show it for (var z = 0; z < ruleset_control.num_impr_types-1 /*-1 don't show coinage*/; z ++) { @@ -1214,8 +1252,14 @@ function empire_econ_worklists_screen(wide_screen,narrow_screen,small_screen, var queue_html = ""; var city_count = 0; // number of cities (total rows) - // Go through each city - for (var city_id in cities) { +// Go through each city in the order sorted in the cities list, and pluck out units by type, so they're arranged by type: + if ($("#city_table_head").length == 0) update_city_screen(); // If cities list has never been created, create it. + var current_city_row = $("#city_table_head").next().children().first(); // Get first row of the sorted cities list. + // Iterate through all player cities in the order they're sorted in the sorted cities list: + while (current_city_row.length > 0) { + //for (var city_id in cities) { //rows (cities) + var city_id = current_city_row.attr('id').substr(12); + current_city_row = current_city_row.next(); // bump up to next city row for when we iterate the loop back up here var pcity = cities[city_id]; // Only process legal cities owned by player if (client.conn.playing == null || city_owner(pcity) == null || city_owner(pcity).playerno != client.conn.playing.playerno) { @@ -1229,7 +1273,7 @@ function empire_econ_worklists_screen(wide_screen,narrow_screen,small_screen, var empty_row_click = is_small_screen() ? " onclick='tap_empty_production_row(event, "+city_id+")'" : " title='CLICK: paste worklist\nCTRL-CLICK: clear worklist\nSHIFT-CLICK: copy worklist' onclick='tap_empty_production_row(event, "+city_id+")'"; - queue_html = "
"+pcity['name']+""; @@ -1633,6 +1677,10 @@ function toggle_empire_show_upkeep(upkeep_type) empire_upkeep_show_free = !empire_upkeep_show_free; $("#show_free").prop("checked", empire_upkeep_show_free); break; + case "zero": + empire_upkeep_show_zero = !empire_upkeep_show_zero; + $("#show_zero").prop("checked", empire_upkeep_show_zero); + break; } empire_sort_mode = SORT_NONE; update_empire_screen(); @@ -1889,7 +1937,7 @@ function empire_unittype_screen(wide_screen,narrow_screen,small_screen, count[unit_type_id] = 0; var rheight = 28 * Math.ceil( (units_sorted_by_type[unit_type_id].length*40) / ($(window).width()-140) ); - unit_row_html = "
"+unit_types[unit_type_id]['name']+""; diff --git a/freeciv-web/src/main/webapp/javascript/fc_types.js b/freeciv-web/src/main/webapp/javascript/fc_types.js index 79240885c..772165db1 100644 --- a/freeciv-web/src/main/webapp/javascript/fc_types.js +++ b/freeciv-web/src/main/webapp/javascript/fc_types.js @@ -77,6 +77,19 @@ var ASTK_EXTRA = 3; var ASTK_EXTRA_NOT_THERE = 4; var ASTK_COUNT = 5; +/* The unit_orders enum from unit.h */ +var ORDER_MOVE = 0; +var ORDER_ACTIVITY = 1; +var ORDER_FULL_MP = 2; +var ORDER_ACTION_MOVE = 3; +var ORDER_PERFORM_ACTION = 4; +var ORDER_LAST = 5; + +/* The unit_ss_data_type enum from unit.h */ +var USSDT_QUEUE = 0; +var USSDT_UNQUEUE = 1; +var USSDT_BATTLE_GROUP = 2; + /* Actions */ var ACTION_ESTABLISH_EMBASSY = 0; var ACTION_ESTABLISH_EMBASSY_STAY = 1; @@ -280,3 +293,6 @@ const GENUS_GREAT_WONDER = 0; const GENUS_SMALL_WONDER = 1; // genus <= GENUS_SMALL_WONDER means it's a wonder const GENUS_IMPROVEMENT = 2; const GENUS_COINAGE = 3; + +const TECH_USER_1 = 32; +const TECH_SPECIAL_TECH = 32; // reserved for cul-de-sac "specialization" techs which enhance what a parent tech can do diff --git a/freeciv-web/src/main/webapp/javascript/game.js b/freeciv-web/src/main/webapp/javascript/game.js index 68a5cc6c1..9c74ceb85 100644 --- a/freeciv-web/src/main/webapp/javascript/game.js +++ b/freeciv-web/src/main/webapp/javascript/game.js @@ -104,15 +104,18 @@ function city_size_sum(playerno) { ... **************************************************************************/ function update_game_status_panel() { - - if (C_S_RUNNING != client_state() ) return; + if (C_S_RUNNING != client_state() || was_supercow) { + // was_supercow makes a "fake player" to turn off observer interaction lock + return; + } var status_html = ""; var msg_title_prefix = unread_messages > 0 ? "Unread messages. Click = " : "" // unread message counter with toggle message window status_html = "" + + (current_message_dialog_state == "minimized" ? "Show" : "Hide") + + " message window'>" + " " + ((unread_messages>0) ? unread_messages : "") +"   "; @@ -128,7 +131,7 @@ function update_game_status_panel() { var net_income = pplayer['expected_income'].toString(); var income_str = (net_income.slice(-2) == ".5") ? (net_income.substring(0, net_income.length - 2) + "½") : net_income; - if (pplayer['expected_income'] > 0) { + if (pplayer['expected_income'] >= 0) { net_income = "+" + income_str; } else net_income = income_str; @@ -173,23 +176,28 @@ function update_game_status_panel() { if (!is_small_screen()) status_html += ""; // type 2 is demographics if (!is_small_screen()) status_html += "  "; if (!is_small_screen()) status_html += "" + city_size_sum(client.conn.playing.playerno) + "   "; - if (!is_small_screen()) status_html += " " + get_year_string() + "   "; - status_html += " "; + if (!is_small_screen()) status_html += " " + get_year_string() + "   "; + status_html += " "; var income_color = " 0) income_color += income_calculated_by_client - ? " style='color:#89c06a' title='Income'" : " style='color:#a2b095' title='Income'" // slight hint whether accurate client calc or from server. + else if (pplayer['expected_income'] > 0) { + income_color += income_calculated_by_client + ? " style='color:#89c06a; cursor:default' title='Income'" : " style='color:#a2b095; cursor:default' title='Income'"; + } + else { income_color += income_calculated_by_client + ? " style='color:#919191; cursor:default' title='No Income'" : " style='color:#a2a2a2; cursor:default' title='No Income'" + } status_html += ""+pplayer['gold'] + " "+income_color+" style='cursor:default;'>" + net_income + ""+"   "; - status_html += " " - + tax + "%  "; - status_html += " " + lux + "%  "; + status_html += " " + + tax + "%  "; + status_html += " " + lux + "%  "; const sci_title = "Science:\n"+(techs[client.conn.playing['researching']]===undefined ? "" : techs[client.conn.playing['researching']]['name']) +"\n" - + client.conn.playing['bulbs_researched'] + " / " + client.conn.playing['researching_cost'] +"\n" + bulb_output_text; - status_html += " " + sci + "%         "; + + client.conn.playing['bulbs_researched'] + " / " + client.conn.playing['researching_cost'] +" bulbs\n" + bulb_output_text; + status_html += " " + sci + "%         "; } else if (server_settings != null && server_settings['metamessage'] != null) { // Status message for gamemasters/admins/supercows: status_html += "Observing - Turn " + game_info['turn'] + " -"; diff --git a/freeciv-web/src/main/webapp/javascript/helpdata.js b/freeciv-web/src/main/webapp/javascript/helpdata.js index 80866efd7..2619fc402 100644 --- a/freeciv-web/src/main/webapp/javascript/helpdata.js +++ b/freeciv-web/src/main/webapp/javascript/helpdata.js @@ -123,6 +123,10 @@ function show_help_intro() { $.get( "/docs/help_intro.txt", function( data ) { $("#help_info_page").html(data); + var help_banner = "/static/images/fcw-front-page" + + Math.ceil(Math.random()*61) + ".png"; + + $("#help_banner").prop("src",help_banner); }); } @@ -429,6 +433,7 @@ function generate_help_text(key) num_resources = 1; if (client_rules_flag[CRF_MP2_B]) num_resources++; break; + case "Glacier": case "Arctic": num_resources = 2; if (client_rules_flag[CRF_MP2_B]) num_resources++; @@ -460,11 +465,32 @@ function generate_help_text(key) break; } if (num_resources) msg += "
Special resources:
"; - for (let r=1; r <= num_resources; r++) { - msg += "" + // MP2 rulesets. + if (client_rules_flag[CRF_MP2]) { + for (let r=1; r <= num_resources; r++) { + msg += "" + } + } + // General construction of terrain help for other rulesets: TODO: when we can extract an extra sprite and put into a + // element with position:absolute; left:r*96, then helptext_pane class gets property position:relative, we can + // put pretty images like the mp2 stuff above (and remove all hardcoding too) + else { + msg += "" + for (let r=0; r < terrain.resources.length; r++) { + msg += "" + } + msg += "
" + var extra_name = extras[terrain.resources[r]].name; + if (extra_name.startsWith("?")) extra_name = extra_name.split(":")[1]; // chops out first part of "?animals:Game" + msg += extra_name +":" + + " "+ (terrain.output[0] + resources[terrain.resources[r]].output[0]) + " " + + " "+ (terrain.output[1] + resources[terrain.resources[r]].output[1]) + " " + + " "+ (terrain.output[2] + resources[terrain.resources[r]].output[2]) + " " + msg += "
" } + msg += ""; } else if (key.indexOf("help_gen_improvements") != -1 || key.indexOf("help_gen_wonders") != -1) { var improvement = improvements[parseInt(key.replace("help_gen_wonders_", "").replace("help_gen_improvements_", ""))]; @@ -510,6 +536,9 @@ function generate_help_text(key) //var as = punit_type['attack_strength']; // Display base attack relative to v0 vet power which may be non-100: var as = fractionalize(utype_real_base_attack_strength(punit_type)); + if (pstats.max_attacks>0) { + as += " (max. "+pstats.max_attacks+" attack"+(pstats.max_attacks>1?"s":"")+" per turn)" + } msg += span1 + "Attack: " + span_end + span2 + as + div_end; // DEFENSE msg += ""; diff --git a/freeciv-web/src/main/webapp/javascript/improvement.js b/freeciv-web/src/main/webapp/javascript/improvement.js index 89dceb5e1..643f0f473 100644 --- a/freeciv-web/src/main/webapp/javascript/improvement.js +++ b/freeciv-web/src/main/webapp/javascript/improvement.js @@ -208,6 +208,13 @@ function get_universal_discount_price(ptype, pcity) return ptype['build_cost'] - 5; } } + if (client_rules_flag[CRF_MP2_D]) { + if (ptype['name'] == "Fortifications" + && (player_invention_state(players[playerno], tech_id_by_name('Metallurgy')) == TECH_KNOWN)) { + return ptype['build_cost'] + 10; + } + } + // MP2 discounts for having Colossus if (pcity && client_rules_flag[CRF_COLOSSUS_DISCOUNT] && player_invention_state(players[playerno], tech_id_by_name('Steam Engine')) != TECH_KNOWN diff --git a/freeciv-web/src/main/webapp/javascript/libs/.bower.json b/freeciv-web/src/main/webapp/javascript/libs/.bower.json new file mode 100644 index 000000000..68b062d3d --- /dev/null +++ b/freeciv-web/src/main/webapp/javascript/libs/.bower.json @@ -0,0 +1,46 @@ +{ + "name": "dragscroll", + "version": "0.0.8", + "homepage": "https://github.com/asvd/dragscroll", + "authors": [ + "Dmitry Prokashev " + ], + "description": "Tiny library for drag-n-drop scrolling style", + "main": "dragscroll.js", + "moduleType": [ + "amd", + "globals" + ], + "keywords": [ + "dragscroll", + "scroll", + "scrolling", + "mouse", + "hold", + "click-and-hold", + "drag-and-drop", + "drag-n-drop", + "click-n-hold", + "click-and-hold", + "drag", + "viewport" + ], + "license": "MIT", + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "test", + "tests" + ], + "_release": "0.0.8", + "_resolution": { + "type": "version", + "tag": "v0.0.8", + "commit": "bb4cd42f3f850bedf9f9fd99a388017a09e29b52" + }, + "_source": "https://github.com/asvd/dragscroll.git", + "_target": "^0.0.8", + "_originalSource": "dragscroll", + "_direct": true +} \ No newline at end of file diff --git a/freeciv-web/src/main/webapp/javascript/libs/LICENSE b/freeciv-web/src/main/webapp/javascript/libs/LICENSE new file mode 100644 index 000000000..88744e20a --- /dev/null +++ b/freeciv-web/src/main/webapp/javascript/libs/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 asvd + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/freeciv-web/src/main/webapp/javascript/libs/bower.json b/freeciv-web/src/main/webapp/javascript/libs/bower.json new file mode 100644 index 000000000..cc105f85e --- /dev/null +++ b/freeciv-web/src/main/webapp/javascript/libs/bower.json @@ -0,0 +1,36 @@ +{ + "name": "dragscroll", + "version": "0.0.8", + "homepage": "https://github.com/asvd/dragscroll", + "authors": [ + "Dmitry Prokashev " + ], + "description": "Tiny library for drag-n-drop scrolling style", + "main": "dragscroll.js", + "moduleType": [ + "amd", + "globals" + ], + "keywords": [ + "dragscroll", + "scroll", + "scrolling", + "mouse", + "hold", + "click-and-hold", + "drag-and-drop", + "drag-n-drop", + "click-n-hold", + "click-and-hold", + "drag", + "viewport" + ], + "license": "MIT", + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "test", + "tests" + ] +} diff --git a/freeciv-web/src/main/webapp/javascript/libs/dragscroll.js b/freeciv-web/src/main/webapp/javascript/libs/dragscroll.js new file mode 100644 index 000000000..fd1cf8ffd --- /dev/null +++ b/freeciv-web/src/main/webapp/javascript/libs/dragscroll.js @@ -0,0 +1,92 @@ +/** + * @fileoverview dragscroll - scroll area by dragging + * @version 0.0.8 + * + * @license MIT, see http://github.com/asvd/dragscroll + * @copyright 2015 asvd + */ + + +(function (root, factory) { + if (typeof define === 'function' && define.amd) { + define(['exports'], factory); + } else if (typeof exports !== 'undefined') { + factory(exports); + } else { + factory((root.dragscroll = {})); + } +}(this, function (exports) { + var _window = window; + var _document = document; + var mousemove = 'mousemove'; + var mouseup = 'mouseup'; + var mousedown = 'mousedown'; + var EventListener = 'EventListener'; + var addEventListener = 'add'+EventListener; + var removeEventListener = 'remove'+EventListener; + var newScrollX, newScrollY; + + var dragged = []; + var reset = function(i, el) { + for (i = 0; i < dragged.length;) { + el = dragged[i++]; + el = el.container || el; + el[removeEventListener](mousedown, el.md, 0); + _window[removeEventListener](mouseup, el.mu, 0); + _window[removeEventListener](mousemove, el.mm, 0); + } + + // cloning into array since HTMLCollection is updated dynamically + dragged = [].slice.call(_document.getElementsByClassName('dragscroll')); + for (i = 0; i < dragged.length;) { + (function(el, lastClientX, lastClientY, pushed, scroller, cont){ + (cont = el.container || el)[addEventListener]( + mousedown, + cont.md = function(e) { + if (!el.hasAttribute('nochilddrag') || + _document.elementFromPoint( + e.pageX, e.pageY + ) == cont + ) { + pushed = 1; + lastClientX = e.clientX; + lastClientY = e.clientY; + + e.preventDefault(); + } + }, 0 + ); + + _window[addEventListener]( + mouseup, cont.mu = function() {pushed = 0;}, 0 + ); + + _window[addEventListener]( + mousemove, + cont.mm = function(e) { + if (pushed) { + (scroller = el.scroller||el).scrollLeft -= + newScrollX = (- lastClientX + (lastClientX=e.clientX)); + scroller.scrollTop -= + newScrollY = (- lastClientY + (lastClientY=e.clientY)); + if (el == _document.body) { + (scroller = _document.documentElement).scrollLeft -= newScrollX; + scroller.scrollTop -= newScrollY; + } + } + }, 0 + ); + })(dragged[i++]); + } + } + + + if (_document.readyState == 'complete') { + reset(); + } else { + _window[addEventListener]('load', reset, 0); + } + + exports.reset = reset; +})); + diff --git a/freeciv-web/src/main/webapp/javascript/libs/package.json b/freeciv-web/src/main/webapp/javascript/libs/package.json new file mode 100644 index 000000000..3b15b3be7 --- /dev/null +++ b/freeciv-web/src/main/webapp/javascript/libs/package.json @@ -0,0 +1,35 @@ +{ + "author": "Dmitry Prokashev ", + "name": "dragscroll", + "description": "Tiny library for drag-n-drop scrolling style", + "version": "0.0.8", + "keywords": [ + "dragscroll", + "scroll", + "scrolling", + "mouse", + "hold", + "drag-n-drop", + "drag-and-drop", + "click-n-hold", + "click-and-hold", + "drag", + "viewport" + ], + "repository": { + "type": "git", + "url": "git://github.com/asvd/dragscroll.git" + }, + "browser": + { + "fs": false, + "child_process": false + }, + "main": "dragscroll.js", + "dependencies": {}, + "devDependencies": {}, + "optionalDependencies": {}, + "engines": { + "node": "*" + } +} diff --git a/freeciv-web/src/main/webapp/javascript/map.js b/freeciv-web/src/main/webapp/javascript/map.js index 3d25cba89..f5a3cb288 100644 --- a/freeciv-web/src/main/webapp/javascript/map.js +++ b/freeciv-web/src/main/webapp/javascript/map.js @@ -270,6 +270,19 @@ function MAP_TO_NATURAL_POS(map_x, map_y) return {'nat_y' : pnat_y, 'nat_x' : pnat_x}; } +/*******************************************************************//** + Return squared distance between two tiles. +***********************************************************************/ +function sq_map_distance(tile0, tile1) +{ + /* We assume map_distance_vector gives us the vector with the + minimum squared distance. Right now this is true. */ + var vector = map_distance_vector(tile0, tile1); + var dx = vector[0], dy = vector[1]; + + return map_vector_to_sq_distance(dx, dy); +} + /**************************************************************************** Return the squared distance for a map vector ****************************************************************************/ @@ -461,10 +474,18 @@ function dir_ccw(dir) **************************************************************************/ function clear_goto_tiles() { + if (renderer == RENDERER_2DCANVAS) { for (var x = 0; x < map['xsize']; x++) { for (var y = 0; y < map['ysize']; y++) { tiles[x + y * map['xsize']]['goto_dir'] = null; } } - + } else { + if (scene != null && goto_lines != null) { + for (var i = 0; i < goto_lines.length; i++) { + scene.remove(goto_lines[i]); + } + goto_lines = []; + } + } } diff --git a/freeciv-web/src/main/webapp/javascript/messages.js b/freeciv-web/src/main/webapp/javascript/messages.js index e1a81635d..5bdfc7ba3 100644 --- a/freeciv-web/src/main/webapp/javascript/messages.js +++ b/freeciv-web/src/main/webapp/javascript/messages.js @@ -277,10 +277,11 @@ function reclassify_chat_message(text) to produce messages independently of incoming packets (e.g., notifying of changes to prefs, etc.) **************************************************************************/ -function add_client_message(message) +function add_client_message(message, ev_class) { + var msg_event = ev_class ? ev_class : "e_client_msg"; if (message.includes("%%") || message.includes("[`")) message = decode_user_hyperlinks(message); - var fake_packet = {"message": ""+message+""}; + var fake_packet = {"message": ""+message+""}; fake_packet.event = E_CHAT_MSG; add_chatbox_text(fake_packet); } @@ -464,6 +465,8 @@ function wait_for_text(text, runnable) { var chatbox_text = get_chatbox_text(); if (chatbox_text != null && chatbox_text.indexOf(text) != -1) { + if (DEBUG_PICK_NATION) + console.log("wait_for_text("+text+") engaged."); runnable(); } else { setTimeout(function () { diff --git a/freeciv-web/src/main/webapp/javascript/music.js b/freeciv-web/src/main/webapp/javascript/music.js index 292c7c5f3..ec1c90335 100644 --- a/freeciv-web/src/main/webapp/javascript/music.js +++ b/freeciv-web/src/main/webapp/javascript/music.js @@ -75,7 +75,7 @@ function pick_next_track() { // based on YEAR, civilization style, turn #, etc., and use more special // "DJ tag logic" to pick a song. if (client_is_observer()) { - if (game_info.turn <= 12) category = "tribal" + if (game_info.turn <= 17) category = "tribal" else if (game_info.turn < 45) category = "ancient" else if (game_info.turn < 70) category = "middle" else if (game_info.turn < 85) category = "colonial" @@ -92,11 +92,12 @@ function pick_next_track() { track_name = music_list[category][Math.floor(Math.random() * music_list[category].length)]+ ".mp3"; dj_approved = true; } else { // Not a break track, pick a main selection at random - if (game_info.turn <= 12 && !tech_known("Alphabet")) category = "tribal"; - else if (!tech_known("Feudalism") && !tech_known("Monotheism")) category = "ancient"; + if (game_info.turn <= 17 && !tech_known("Alphabet")) category = "tribal"; + else if (!tech_known("Feudalism") && !tech_known("Navigation") // catch all paths to gunpowder || magnetism + && !tech_known("Philosophy") && !tech_known("Invention")) category = "ancient"; else if (!tech_known("Gunpowder") && !tech_known("Magnetism")) category = "middle"; else if (!tech_known("Industrialization") || !tech_known("Conscription")) category = "colonial"; // need both to leave colonial - else if (!tech_known("Rocketry") && !tech_known("Robotics")) category = "industrial"; + else if (!tech_known("Rocketry") && !tech_known("Robotics")) category = "industrial"; else category = "modern"; // Pick a random track with the approved qualities for the game context: diff --git a/freeciv-web/src/main/webapp/javascript/nation.js b/freeciv-web/src/main/webapp/javascript/nation.js index 63f3d8f9d..60367d356 100644 --- a/freeciv-web/src/main/webapp/javascript/nation.js +++ b/freeciv-web/src/main/webapp/javascript/nation.js @@ -132,8 +132,12 @@ function update_nation_screen() var their_cb = !observer ? players[player_id].diplstates[client.conn.playing['playerno']]['has_reason_to_cancel'] : 0; var contact_time=0; if (!observer && client.conn.playing != null && diplstates[player_id] != null && player_id != client.conn.playing['playerno']) { - contact_time = pplayer.diplstates[client.conn.playing.playerno].contact_turns_left; //set this here because it needs the same 'if' - + /* Former way: we checked the other player's contact turns with us instead of ours with them; yet we are not always privvy + to that and don't get real-time updates for that... + contact_time = pplayer.diplstates[client.conn.playing.playerno].contact_turns_left; */ + /* Current way: check our own contact turns with the player instead of theirs with us: */ + contact_time = players[client.conn.playing.playerno].diplstates[player_id].contact_turns_left; + var pact_time = !observer ? pplayer.diplstates[client.conn.playing.playerno].turns_left : 0; var dstate = get_diplstate_text(diplstates[player_id]); if (dstate == "None") dstate = "+" + dstate; // sorting hack diff --git a/freeciv-web/src/main/webapp/javascript/options.js b/freeciv-web/src/main/webapp/javascript/options.js index 0c4e69487..014ef0626 100644 --- a/freeciv-web/src/main/webapp/javascript/options.js +++ b/freeciv-web/src/main/webapp/javascript/options.js @@ -17,6 +17,9 @@ ***********************************************************************/ +// Server's Local Time relative to GMT. e.g., London 0, Paris 1, SF -8 +const SERVER_GMT_OFFSET = 1; // helps localize timestamps to client's time zone + /* The server will send information about its settings. It is stored here. * You can look up a setting by its name or by its id number. */ var server_settings = {}; @@ -101,6 +104,7 @@ var save_options_on_exit = true; var fullscreen_mode = false; var replace_capital_i = null; // option to fix bad capital I in some default sans fonts var play_music = true; +var show_timestamps = false; // show ec_info timestamps on critical events that occurred while not logged in (useful in longturn only) /** Local Options: **/ var scroll_narrow_x = false; // wider scrollable table rows for mobile to see more info @@ -426,6 +430,21 @@ function init_options_dialog() if (show_compass) $("#compass").show(); else $("#compass").hide(); }); + + $('#show_timestamps').prop('checked', show_timestamps); + $('#show_timestamps').change(function() { + show_timestamps = this.checked; + simpleStorage.set('tstamps', show_timestamps); + if (show_timestamps) { + $(".ts").show(); + $(".ts").css("display", "inline"); + } + else { + $(".ts").hide(); + $(".ts").css("display", "none"); + } + }); + // Graphic Theme graphic_theme_path = simpleStorage.get('grtheme'); if (!graphic_theme_path) graphic_theme_path = "themes/greek/"; @@ -440,6 +459,22 @@ function init_options_dialog() //----------------------------------------------------------------^^USER OPTIONS^^ $('#graphic_theme').change(); + if (!is_longturn()) { + if (renderer == RENDERER_WEBGL) { + $("#switch_renderer_button").html("Use 2D HTML5 graphics"); + $("#renderer_help").html("Switch to 2D isometric graphics.") + } else { + $("#switch_renderer_button").html("Use 3D WebGL graphics"); + $("#renderer_help").html("Use 3D WebGL graphics. Make sure your computer
supports 3D WebGL graphics.") + $("#update_model_button").hide(); + } + + if (!Detector.webgl) { + $("#switch_renderer_button").hide(); + $("#renderer_help").html("3D WebGL not supported.") + } + } + $("#title_setting_div").hide(); if (is_longturn()) { diff --git a/freeciv-web/src/main/webapp/javascript/overview.js b/freeciv-web/src/main/webapp/javascript/overview.js index a04af4ef4..07aa3d0b9 100644 --- a/freeciv-web/src/main/webapp/javascript/overview.js +++ b/freeciv-web/src/main/webapp/javascript/overview.js @@ -208,10 +208,18 @@ function generate_overview_hash(cols, rows) { } } - var r = base_canvas_to_map_pos(0, 0); - if (r != null) { - hash += r['map_x']; - hash += r['map_y']; + if (renderer == RENDERER_2DCANVAS) { + var r = base_canvas_to_map_pos(0, 0); + if (r != null) { + hash += r['map_x']; + hash += r['map_y']; + } + } else { + var ptile = webgl_canvas_pos_to_tile($(window).width() / 6, $(window).height() / 6); + if (ptile != null) { + hash += ptile['x']; + hash += ptile['y']; + } } return hash; @@ -226,6 +234,7 @@ function render_viewrect() var path = []; + if (renderer == RENDERER_2DCANVAS && mapview['gui_x0'] != 0 && mapview['gui_y0'] != 0) { var point = base_canvas_to_map_pos(0, 0); path.push([point.map_x, point.map_y]); point = base_canvas_to_map_pos(mapview['width'], 0); @@ -234,7 +243,24 @@ function render_viewrect() path.push([point.map_x, point.map_y]); point = base_canvas_to_map_pos(0, mapview['height']); path.push([point.map_x, point.map_y]); + } else { + var w = $(window).width(); + var h = $(window).height(); + + var ptile = webgl_canvas_pos_to_tile(w / 6, h / 6); + if (ptile == null) return; + path.push([ptile.x, ptile.y]); + var ptile = webgl_canvas_pos_to_tile(5 * w / 6, h / 6); + if (ptile == null) return; + path.push([ptile.x, ptile.y]); + var ptile = webgl_canvas_pos_to_tile(5 * w / 6, h - height_offset); + if (ptile == null) return; + path.push([ptile.x, ptile.y]); + var ptile = webgl_canvas_pos_to_tile(w / 6, h - height_offset); + if (ptile == null) return; + path.push([ptile.x, ptile.y]); + } var viewrect_canvas = document.getElementById('overview_viewrect'); if (viewrect_canvas == null) return; @@ -262,6 +288,23 @@ function render_viewrect() viewrect_ctx.restore(); } + if (topo_has_flag(TF_WRAPY)) { + viewrect_ctx.translate(0, map.ysize); + add_closed_path(viewrect_ctx, path); + viewrect_ctx.translate(0, -2 * map.ysize); + add_closed_path(viewrect_ctx, path); + if (topo_has_flag(TF_WRAPX)) { + viewrect_ctx.translate(-map.xsize, 0); + add_closed_path(viewrect_ctx, path); + viewrect_ctx.translate(0, 2 * map.ysize); + add_closed_path(viewrect_ctx, path); + viewrect_ctx.translate(2 * map.xsize, 0); + add_closed_path(viewrect_ctx, path); + viewrect_ctx.translate(0, -2 * map.ysize); + add_closed_path(viewrect_ctx, path); + } + } + viewrect_ctx.stroke(); } @@ -412,6 +455,7 @@ function overview_clicked (x, y) var ptile = map_pos_to_tile(x1, y1); if (ptile != null) { //reposition events save the position to return to with shift-spacebar + //save_map_return_position(ptile); center_tile_mapcanvas(ptile); } diff --git a/freeciv-web/src/main/webapp/javascript/packhand.js b/freeciv-web/src/main/webapp/javascript/packhand.js index b2230c296..d75efc5ee 100644 --- a/freeciv-web/src/main/webapp/javascript/packhand.js +++ b/freeciv-web/src/main/webapp/javascript/packhand.js @@ -16,6 +16,245 @@ along with this program. If not, see . ***********************************************************************/ +/* Many packets of same type may come sequentially, for which we don't + want to update the UI until they are all completed and + handle_processing_finished() is called. These global vars keep track + whether certain UI data will get a refresh on the next + handle_processing_finished() call which 'thaws' things for a UI update: */ +var ui_update_nations_info = false; // Nations tab and Empire tab (for now) +var ui_update_cities_info = false; // Cities tab +var ui_update_bulbs_info = false; // Bulb information +// +var DEBUG_LOG_PACKETS = false; // verbose packet logging +var DEBUG_SHORT_PACKETS = false; // show terse packet log +var DEBUG_EXPAND_PACKETS = true; // log expandable packet under terse packet +var DEBUG_ACTION_PACKETS = false; // for debugging outgoing actions only +// +var DEBUG_PICK_NATION = false; // for debugging longturn pick nation issues +var DEBUG_UNITS = false; // console log tools for debugging unit issues +var DEBUG_FOCUS = false; // for debugging advancing unit focus glitches +// +/* Prevent hard-coded checking of extras from failing in rulesets + which don't have those extras: */ +const EXTRA_NOT_EXIST = 65535; +// +/* Commenting out a key/value pair will result in packets of that type + not being logged in DEBUG_SHORT_PACKETS mode. That is, it's helpful + for screening your packet analysis during debugging. */ +const packet_names = { + "PROCESSING_STARTED": 0, + "PROCESSING_FINISHED": 1, + "SERVER_JOIN_REQ": 4, + "SERVER_JOIN_REPLY": 5, + "AUTHENTICATION_REQ": 6, + "AUTHENTICATION_REPLY": 7, + "SERVER_SHUTDOWN": 8, + "NATION_SELECT_REQ": 10, + "PLAYER_READY": 11, + "ENDGAME_REPORT": 12, + "ENDGAME_PLAYER": 223, + /* + "TILE_INFO": 15, + */ + "GAME_INFO": 16, + "CALENDAR_INFO": 255, + "TIMEOUT_INFO": 244, + "MAP_INFO": 17, + "NUKE_TILE_INFO": 18, + /* + "TEAM_NAME_INFO": 19, + */ + "ACHIEVEMENT_INFO": 238, + "CHAT_MSG": 25, + "EARLY_CHAT_MSG": 28, + "CHAT_MSG_REQ": 26, + "CONNECT_MSG": 27, + "SERVER_INFO": 29, + "CITY_REMOVE": 30, + "CITY_INFO": 31, + "CITY_SHORT_INFO": 32, + "TRADEROUTE_INFO": 249, + "CITY_SELL": 33, + "CITY_BUY": 34, + "CITY_CHANGE": 35, + "CITY_WORKLIST": 36, + "CITY_MAKE_SPECIALIST": 37, + "CITY_MAKE_WORKER": 38, + "CITY_CHANGE_SPECIALIST": 39, + "CITY_RENAME": 40, + "CITY_OPTIONS_REQ": 41, + "CITY_REFRESH": 42, + "CITY_NAME_SUGGESTION_REQ": 43, + "CITY_NAME_SUGGESTION_INFO": 44, + "CITY_SABOTAGE_LIST": 45, + "CITY_MANAGER": 139, + "CITY_RALLY_POINT": 138, + "WORKER_TASK": 241, + "PLAYER_REMOVE": 50, + "PLAYER_INFO": 51, + "PLAYER_PHASE_DONE": 52, + "PLAYER_RATES": 53, + "PLAYER_CHANGE_GOVERNMENT": 54, + "PLAYER_PLACE_INFRA": 61, + "PLAYER_ATTRIBUTE_BLOCK": 57, + "PLAYER_ATTRIBUTE_CHUNK": 58, + /* + "PLAYER_DIPLSTATE": 59, + */ + "PLAYER_MULTIPLIER": 242, + "RESEARCH_INFO": 60, + "PLAYER_TECH_GOAL": 56, + "UNIT_REMOVE": 62, + "UNIT_INFO": 63, + "UNIT_SHORT_INFO": 64, + "UNIT_COMBAT_INFO": 65, + "UNIT_SSCS_SET": 71, + "UNIT_ORDERS": 73, + "UNIT_AUTOSETTLERS": 74, + "UNIT_ACTION_QUERY": 82, + "UNIT_TYPE_UPGRADE": 83, + "UNIT_DO_ACTION": 84, + "UNIT_ACTION_ANSWER": 85, + "UNIT_GET_ACTIONS": 87, + "UNIT_ACTIONS": 90, + "UNIT_CHANGE_ACTIVITY": 222, + "DIPLOMACY_INIT_MEETING_REQ": 95, + "DIPLOMACY_INIT_MEETING": 96, + "DIPLOMACY_CANCEL_MEETING_REQ": 97, + "DIPLOMACY_CANCEL_MEETING": 98, + "DIPLOMACY_CREATE_CLAUSE_REQ": 99, + "DIPLOMACY_CREATE_CLAUSE": 100, + "DIPLOMACY_REMOVE_CLAUSE_REQ": 101, + "DIPLOMACY_REMOVE_CLAUSE": 102, + "DIPLOMACY_ACCEPT_TREATY_REQ": 103, + "DIPLOMACY_ACCEPT_TREATY": 104, + "DIPLOMACY_CANCEL_PACT": 105, + "PAGE_MSG": 110, + "PAGE_MSG_PART": 250, + "REPORT_REQ": 111, + "CONN_INFO": 115, + /* + "CONN_PING_INFO": 116, + "CONN_PING": 88, + "CONN_PONG": 89, + */ + "CLIENT_HEARTBEAT": 254, + "CLIENT_INFO": 119, + "END_PHASE": 125, + "START_PHASE": 126, + "NEW_YEAR": 127, + "BEGIN_TURN": 128, + "END_TURN": 129, + "FREEZE_CLIENT": 130, + "THAW_CLIENT": 131, + "SPACESHIP_LAUNCH": 135, + "SPACESHIP_PLACE": 136, + /* + "SPACESHIP_INFO": 137, + */ + /* commenting out packets lets us turn off reporting of them + "RULESET_UNIT": 140, + "RULESET_UNIT_BONUS": 228, + "RULESET_UNIT_FLAG": 229, + "RULESET_UNIT_CLASS_FLAG": 230, + "RULESET_GAME": 141, + "RULESET_SPECIALIST": 142, + "RULESET_GOVERNMENT_RULER_TITLE": 143, + "RULESET_TECH": 144, + "RULESET_TECH_CLASS": 9, + "RULESET_TECH_FLAG": 234, + "RULESET_GOVERNMENT": 145, + "RULESET_TERRAIN_CONTROL": 146, + "RULESETS_READY": 225, + "RULESET_NATION_SETS": 236, + "RULESET_NATION_GROUPS": 147, + "RULESET_NATION": 148, + "NATION_AVAILABILITY": 237, + "RULESET_STYLE": 239, + "RULESET_CITY": 149, + "RULESET_BUILDING": 150, + "RULESET_TERRAIN": 151, + "RULESET_TERRAIN_FLAG": 231, + "RULESET_UNIT_CLASS": 152, + "RULESET_EXTRA": 232, + "RULESET_EXTRA_FLAG": 226, + "RULESET_BASE": 153, + "RULESET_ROAD": 220, + "RULESET_GOODS": 248, + "RULESET_DISASTER": 224, + "RULESET_ACHIEVEMENT": 233, + "RULESET_TRADE": 227, + "RULESET_ACTION": 246, + "RULESET_ACTION_ENABLER": 235, + "RULESET_ACTION_AUTO": 252, + "RULESET_MUSIC": 240, + "RULESET_MULTIPLIER": 243, + "RULESET_EFFECT": 175, + "RULESET_RESOURCE": 177, + "RULESET_CLAUSE": 512,*/ + "RULESET_CONTROL": 155, + /* + "RULESET_SUMMARY": 251, + "RULESET_DESCRIPTION_PART": 247, + */ + "SINGLE_WANT_HACK_REQ": 160, + "SINGLE_WANT_HACK_REPLY": 161, + "RULESET_CHOICES": 162, + "GAME_LOAD": 163, + "SERVER_SETTING_CONTROL": 164, + /* + "SERVER_SETTING_CONST": 165, + "SERVER_SETTING_BOOL": 166, + "SERVER_SETTING_INT": 167, + "SERVER_SETTING_STR": 168, + "SERVER_SETTING_ENUM": 169, + "SERVER_SETTING_BITWISE": 170, + */ + "SET_TOPOLOGY": 253, + "SCENARIO_INFO": 180, + "SCENARIO_DESCRIPTION": 13, + "SAVE_SCENARIO": 181, + "VOTE_NEW": 185, + "VOTE_UPDATE": 186, + "VOTE_REMOVE": 187, + "VOTE_RESOLVE": 188, + "VOTE_SUBMIT": 189, + "EDIT_MODE": 190, + "EDIT_RECALCULATE_BORDERS": 197, + "EDIT_CHECK_TILES": 198, + "EDIT_TOGGLE_FOGOFWAR": 199, + "EDIT_TILE_TERRAIN": 200, + "EDIT_TILE_EXTRA": 202, + "EDIT_STARTPOS": 204, + "EDIT_STARTPOS_FULL": 205, + "EDIT_TILE": 206, + "EDIT_UNIT_CREATE": 207, + "EDIT_UNIT_REMOVE": 208, + "EDIT_UNIT_REMOVE_BY_ID": 209, + "EDIT_UNIT": 210, + "EDIT_CITY_CREATE": 211, + "EDIT_CITY_REMOVE": 212, + "EDIT_CITY": 213, + "EDIT_PLAYER_CREATE": 214, + "EDIT_PLAYER_REMOVE": 215, + "EDIT_PLAYER": 216, + "EDIT_PLAYER_VISION": 217, + "EDIT_GAME": 218, + "EDIT_SCENARIO_DESC": 14, + "EDIT_OBJECT_CREATED": 219, + "PLAY_MUSIC": 245, + "WEB_CITY_INFO_ADDITION": 256, + /* + "WEB_PLAYER_INFO_ADDITION": 257, + "WEB_RULESET_UNIT_ADDITION": 258, + */ + "GOTO_PATH_REQ": 287, + "GOTO_PATH": 288, + "INFO_TEXT_REQ": 289, + "INFO_TEXT_MESSAGE": 290, + "ONGOING_LONGTURN_NATION_SELECT_REQ": 291, + "RALLY_PATH_REQ": 292 + }; const auto_attack_actions = [ ACTION_ATTACK, ACTION_SUICIDE_ATTACK, @@ -33,9 +272,6 @@ var last_ground_attack_time = 0; This file contains the handling-code for packets from the civserver. */ -var DEBUG_LOG_PACKETS = false; - - function handle_processing_started(packet) { client_frozen = true; @@ -44,6 +280,28 @@ function handle_processing_started(packet) function handle_processing_finished(packet) { client_frozen = false; + update_ui_after_thaw(); +} + +/* Called after "thaw" or "processing_finished", to process queued UI + updates (prevents refreshing UI more times than needed.) */ +function update_ui_after_thaw() { + if (ui_update_nations_info) { + ui_update_nations_info = false; + /* Update relevant active tabs with altered players/nations info: */ + var active_tab = $("#tabs").tabs("option", "active"); + if (active_tab == TAB_EMPIRE) empire_screen_updater.update(); + else if (active_tab = TAB_NATIONS) update_nation_screen(); + } + if (ui_update_cities_info) { + ui_update_cities_info = false; + var active_tab = $("#tabs").tabs("option", "active"); + if (active_tab == TAB_CITIES) city_screen_updater.update(); + } + if (ui_update_bulbs_info) { + ui_update_bulbs_info = false; + bulbs_output_updater.update(); + } } function handle_freeze_hint(packet) @@ -54,6 +312,7 @@ function handle_freeze_hint(packet) function handle_thaw_hint(packet) { client_frozen = false; + update_ui_after_thaw(); } /* 100% */ @@ -98,6 +357,9 @@ function handle_server_join_reply(packet) } if (autostart) { + if (renderer == RENDERER_WEBGL) { + $.blockUI({ message: '

Generating terrain map model...

' }); + } if (loadTimerId == -1) { wait_for_text("You are logged in as", pregame_start_game); } else { @@ -180,6 +442,12 @@ function handle_tile_info(packet) if (tiles != null) { packet['extras'] = new BitVector(packet['extras']); + if (renderer == RENDERER_WEBGL) { + var old_tile = $.extend({}, tiles[packet['tile']]); + webgl_update_tile_known(tiles[packet['tile']], packet); + update_tile_extras($.extend(old_tile, packet)); + } + tiles[packet['tile']] = $.extend(tiles[packet['tile']], packet); } } @@ -195,22 +463,24 @@ function handle_iPillage_event(message, tile_id) // iPillage. var ptype; var delay = 0; - message=message.substring(8); // removes "💥 Your ", leaving, "Ground Strike Fighter destroyed the Roman Quay with a Ground Strike" - + //console.log("Intercepted an iPillage"); for (ptype_id in unit_types) { // Find out the unit_type who did this hostile deed ! ptype = unit_types[ptype_id]; - if (message.startsWith(ptype['name'])) { + //needed to prevent false positives + if (message.includes(ptype['name']) && utype_can_iPillage(ptype)) { // The alt sound is preferred for alternate attack types: var sskey = ptype['sound_fight_alt']; - if (!sskey) sskey = ptype['sound_fight']; //fallback - if (!soundset[sskey]) sskey = ptype['sound_fight']; //fallback - //console.log("calling playsound with sskey:"+sskey); + if (sskey) sskey = sskey.replace(/ /g, "_").toLowerCase(); + else sskey = ptype['sound_fight']; //fallback1 + if (!soundset[sskey]) sskey = "bomb"; //fallback2 play_hostile_event_sound(sskey, ptile, ptype); - break; - } + } } + //final fallback3 if we couldn't find a ptype for ipillage sound: + if (!ptype) play_hostile_event_sound("bomb", ptile, ptype); + // Activate explosion on the tile also. delay = 500; // synchronise explosion with sound effect // times for each unit are in the top of unit.js: @@ -248,7 +518,7 @@ function handle_city_governor_event(message) function handle_chat_msg(packet) { var message = packet['message']; - var event = packet['event']; + var event = packet['event']; var conn_id = packet['conn_id']; var tile_id = packet['tile']; @@ -261,8 +531,21 @@ function handle_chat_msg(packet) packet['event'] = E_UNDEFINED; } + /* Localize event timestamps */ + if (message.includes("class='ts'")) message = time_localize(message); + /* Event interceptions... used to trigger client processing */ switch (event) { + case E_CITY_LOST: + /* play_sound(soundset["e_conquer"] + */ + break; + case E_UNIT_WIN_ATT: + if (!suppress_event_sound()) { + if (message.includes("liberated")) play_sound(soundset["e_liberate"]); + else if (message.includes("looting")) play_sound(soundset["e_victor"]); + } + break; case E_UNIT_ACTION_TARGET_HOSTILE: handle_iPillage_event(message, tile_id); break; @@ -275,6 +558,27 @@ function handle_chat_msg(packet) case E_CHAT_MSG_PRIVATE_RCVD: if (!suppress_event_sound()) play_sound("iphone1.ogg"); break; + case E_ENEMY_DIPLOMAT_SABOTAGE: + play_sound("e_demolition.ogg"); + break; + case E_MY_DIPLOMAT_SABOTAGE: + if (!suppress_event_sound()) { + if (message.includes("destroyed the City Walls")) play_sound("e_destroy_walls.ogg"); + else play_sound("e_demolition.ogg"); + } + break; + case E_TECH_GAIN: + /* in MP2D, discovery of democracy upgrades all workers to workers II */ + if (client_rules_flag[CRF_MP2_D] && !client_is_observer() && message.includes("Democracy") + && tech_known('Democracy')) { + let upgrade_type = utype_id_by_name("Workers"); + let upgrade_packet = { + "pid" : packet_unit_type_upgrade, + "type" : upgrade_type + }; + setTimeout(send_request(JSON.stringify(upgrade_packet),1000)); + } + break; //case E_CHAT_MSG_PRIVATE_SENT: // break; } @@ -302,20 +606,8 @@ function handle_chat_msg(packet) packet['message'] = message; add_chatbox_text(packet); - - // Do sounds for special messages - //console.log("Event type = "+packet['event']); - // TODO: these can now go into event interceptor above by looking at event class instead of here. - if (packet['event']==1 || packet['event']==77) /* 1==E_CITY_LOST, 77==E_UNIT_WIN_ATT, there are in events.h and are the two - types of event that come back for cities being conquered by someone.*/ - { - if (message.includes(" your lootings accumulate to ")) play_sound(soundset["e_victor"]); - else if (message.includes("You have liberated ")) play_sound(soundset["e_liberate"]); - else if (message.includes(" gold from the city.")) play_sound(soundset["e_conquer"]); - } } - /************************************************************************** Recenter the map to a tile and mark it with an explosion TODO: replace with a flare or similar animation @@ -358,6 +650,7 @@ function decode_user_hyperlinks(message) var freemoji_name = message.substring(message.indexOf("[`") + 2, message.indexOf("`]")); var replace_me = "[`"+freemoji_name+"`]"; + freemoji_name = freemoji_name.replace("[","-").replace("]","-"); // replace [] with - in animal emoji names var element = html_emoji_from_universal(freemoji_name); message = message.replace( replace_me, (element) ); @@ -447,7 +740,7 @@ function handle_early_chat_msg(packet) /*************************************************************************** The city_info packet is used when the player has full information about a - city, including it's internals. + city, including its internals. It is followed by web_city_info_addition that gives additional information only needed by Freeciv-web. Its processing will therefore @@ -488,7 +781,7 @@ function handle_city_info(packet) The web_city_info_addition packet is a follow up packet to city_info packet. It gives some information the C clients calculates on their own. It is used when the player has full information about a city, - including it's internals. + including its internals. ***************************************************************************/ function handle_web_city_info_addition(packet) { @@ -518,13 +811,18 @@ function handle_web_city_info_addition(packet) if (worklist_dialog_active && active_city != null) { city_worklist_dialog(active_city); } + + if (renderer == RENDERER_WEBGL) { + update_city_position(index_to_tile(packet['tile'])); + } + /* Update active tabs affected by this info */ - bulbs_output_updater.update(); + ui_update_bulbs_info = true; var active_tab = $("#tabs").tabs("option", "active"); if (active_tab == TAB_CITIES) { - city_screen_updater.update(); + ui_update_cities_info = true; } else if (active_tab == TAB_EMPIRE) { - empire_screen_updater.update(); // TEST:is this the right way to update empire screen? + ui_update_nations_info = true; } income_needs_refresh = true; } @@ -545,13 +843,17 @@ function handle_city_short_info(packet) cities[packet['id']] = $.extend(cities[packet['id']], packet); } + if (renderer == RENDERER_WEBGL) { + update_city_position(index_to_tile(packet['tile'])); + } + /* Update active tabs affected by this info */ - bulbs_output_updater.update(); + ui_update_bulbs_info = true; var active_tab = $("#tabs").tabs("option", "active"); if (active_tab == TAB_CITIES) { - city_screen_updater.update(); + ui_update_cities_info = true; } else if (active_tab == TAB_EMPIRE) { - empire_screen_updater.update(); // TEST:is this the right way to update empire screen? + ui_update_nations_info = true; } income_needs_refresh = true; } @@ -594,11 +896,8 @@ function handle_player_info(packet) nations[pplayer['nation']]['color'] = pcolor; } } */ - - /* Update active tabs affected by this info */ - var active_tab = $("#tabs").tabs("option", "active"); - if (active_tab == TAB_EMPIRE) { - empire_screen_updater.update(); // TEST:is this the right way to update empire screen? + if (C_S_RUNNING == client_state()) { + ui_update_nations_info = true; } } @@ -614,6 +913,15 @@ function handle_web_player_info_addition(packet) if (client.conn.playing != null) { if (packet['playerno'] == client.conn.playing['playerno']) { client.conn.playing = players[packet['playerno']]; + + /* Force update of bulbs_researched which doesn't get server update + after LUA Player:give_bulbs(..). TODO: Remove after upstream fixes + this bug: */ + var cur_tech = client.conn.playing['researching']; + client.conn.playing['bulbs_researched'] = client.conn.playing.advance_saved_bulbs[cur_tech]; + + // TODO: should this be handled only once in handle_processing_finished() which is flagged + // to be processed there by setting ui_update_nations_info = true (similar to func above?) update_game_status_panel(); update_net_income(); income_needs_refresh = false; @@ -672,13 +980,26 @@ function handle_map_info(packet) mapdeco_init(); + if (renderer == RENDERER_WEBGL) { + mapview_model_width = Math.floor(MAPVIEW_ASPECT_FACTOR * map['xsize']); + mapview_model_height = Math.floor(MAPVIEW_ASPECT_FACTOR * map['ysize']); + } + } /* 100% complete */ function handle_game_info(packet) { game_info = packet; - if (is_ongoing_longturn() && C_S_PREPARING == client_state()) wait_for_text("You are logged in as", pick_nation_ongoing_longturn); + if (is_ongoing_longturn() && C_S_PREPARING == client_state()) { + if (DEBUG_PICK_NATION) { + console.log("handle_game_info is doing wait_for_text in order to pick nation"); + } + wait_for_text("You are logged in as", pick_nation_ongoing_longturn); + } else { + if (DEBUG_PICK_NATION) + console.log("handle_game_info won't pick nation: (is_ongoing_longturn() && C_S_PREPARING == client_state()) == false"); + } } /************************************************************************** @@ -728,7 +1049,6 @@ function handle_ruleset_control(packet) // Legacy rules block: switch (rules) { case "MP2": - case "Avant-garde 2": case "Avant-garde": client_rules_flag[CRF_MP2_A]=true; client_rules_flag[CRF_RADAR_TOWER]=true; @@ -839,31 +1159,26 @@ function handle_ruleset_control(packet) improvements_init(); - /* handle_ruleset_extra defines some variables dynamically */ + /* handle_ruleset_extra() defines some variables dynamically */ for (var extra in extras) { var ename = extras[extra]['name']; delete window["EXTRA_" + ename.toUpperCase()]; if (ename == "Railroad") delete window["EXTRA_RAIL"]; else if (ename == "Oil Well") delete window["EXTRA_OIL_WELL"]; else if (ename == "Minor Tribe Village") delete window["EXTRA_HUT"]; - else if (typeof EXTRA_SEABRIDGE !== 'undefined') { - if (ename == "Sea Bridge") delete window["EXTRA_SEABRIDGE"]; - } - else if (typeof EXTRA_FORT !== 'undefined') { //makes sure it's defined first - if (ename == "Fort") delete window["EXTRA_FORT"]; ///// - } else if (typeof EXTRA_NAVALBASE !== 'undefined') { - if (ename =="Naval Base") delete window["EXTRA_NAVALBASE"] - } else if (typeof EXTRA_CASTLE !== 'undefined') { - if (ename =="Castle") delete window["EXTRA_CASTLE"] - } else if (typeof EXTRA_BUNKER !== 'undefined') { - if (ename =="Bunker") delete window["EXTRA_BUNKER"] - } else if (typeof EXTRA_TILE_CLAIM !== 'undefined') { - if (ename =="Tile Claim") delete window["EXTRA_TILE_CLAIM"] - } else if (typeof EXTRA_WALLS !== 'undefined') { - if (ename =="Walls") delete window["EXTRA_WALLS"] + else if (typeof EXTRA_SEABRIDGE !== 'undefined' && ename == "Sea Bridge") delete window["EXTRA_SEABRIDGE"]; + else if (typeof EXTRA_FORT !== 'undefined' && ename == "Fort") delete window["EXTRA_FORT"]; + else if (typeof EXTRA_NAVALBASE !== 'undefined' && ename =="Naval Base") delete window["EXTRA_NAVALBASE"]; + else if (typeof EXTRA_CASTLE !== 'undefined' && ename =="Castle") delete window["EXTRA_CASTLE"]; + else if (typeof EXTRA_BUNKER !== 'undefined' && ename =="Bunker") delete window["EXTRA_BUNKER"]; + else if (typeof EXTRA_TILE_CLAIM !== 'undefined' && ename =="Tile Claim") delete window["EXTRA_TILE_CLAIM"]; + else if (typeof EXTRA_WALLS !== 'undefined' && ename =="Walls") delete window["EXTRA_WALLS"]; + else if (extras[extra].rule_name == "Depth") { + delete window["EXTRA_​"] } } extras = {}; + set_blank_extras(); /* Reset legal diplomatic clauses. */ clause_infos = {}; @@ -912,7 +1227,15 @@ function handle_non_integer_combat_scores(key) unit_types[key].attack_strength += 0.5; } else if (unit_types[key]['name']=="Fighter") { - unit_types[key].defense_strength += 0.5; // easier than *= 1.666forever + unit_types[key].defense_strength += 0.5; + } + else if (unit_types[key]['name']=="Crusaders") { + if (client_rules_flag[CRF_MP2_D]) + unit_types[key].defense_strength += 0.5; + } + else if (unit_types[key]['name']=="Dive Bomber") { + if (client_rules_flag[CRF_MP2_D]) + unit_types[key].attack_strength += 1.5; //represents the majority of its targets it has a 50% or +1.5 bonus on. } else { return; // skip message @@ -969,7 +1292,11 @@ function handle_nuke_tile_info(packet) { var ptile = index_to_tile(packet['tile']); - ptile['nuke'] = 60; + if (renderer == RENDERER_WEBGL) { + render_nuclear_explosion(ptile); + } else { + ptile['nuke'] = 60; + } play_sound('nuclear_distant.ogg'); @@ -1074,6 +1401,10 @@ function handle_unit_remove(packet) clear_tile_unit(punit); client_remove_unit(punit); + if (renderer == RENDERER_WEBGL) { + update_unit_position(index_to_tile(punit['tile'])); + } + } /* 100% complete */ @@ -1083,7 +1414,7 @@ function handle_unit_info(packet) /* Update active tabs affected by this info */ var active_tab = $("#tabs").tabs("option", "active"); if (active_tab == TAB_EMPIRE) { - empire_screen_updater.update(); // TEST:is this the right way to update empire screen? + ui_update_nations_info = true; } } @@ -1093,8 +1424,8 @@ function handle_unit_short_info(packet) handle_unit_packet_common(packet); /* Update active tabs affected by this info */ var active_tab = $("#tabs").tabs("option", "active"); - if (active_tab == TAB_EMPIRE) { - empire_screen_updater.update(); // TEST:is this the right way to update empire screen? + if (active_tab == TAB_EMPIRE) { + ui_update_nations_info = true; } } @@ -1253,6 +1584,11 @@ function handle_unit_packet_common(packet_unit) } } } + if (renderer == RENDERER_WEBGL) { + if (punit != null) update_unit_position(old_tile); + update_unit_position(index_to_tile(units[packet_unit['id']]['tile'])); + } + /* TODO: update various dialogs and mapview. */ } @@ -1265,7 +1601,11 @@ function handle_unit_combat_info(packet) var tile_x = tiles[attacker['tile']]['x']; var tile_y = tiles[attacker['tile']]['y']; - + if (renderer == RENDERER_WEBGL) { + if (attacker_hp == 0) animate_explosion_on_tile(attacker['tile'], 0, false); + if (defender_hp == 0) animate_explosion_on_tile(defender['tile'], 0, false); + // TO DO: WEBGL is missing out on all this below, which we should put in after it's final + } else { // Might be null/false if observer var pplayer = null; @@ -1376,6 +1716,7 @@ function handle_unit_combat_info(packet) //setTimeout(update_unit_focus, 700); // remove this if unit redraw still doesn't work // -------------------------------------------------------------------------------------------------------------------- } + } } /************************************************************************** @@ -1426,12 +1767,12 @@ function handle_unit_action_answer(packet) return; } } else if (action_type == ACTION_UPGRADE_UNIT) { - if (target_city == null) { + /*if (target_city == null) { // Target city no longer required. console.log("Bad target city (" + target_id + ") in unit action answer."); act_sel_queue_done(diplomat_id); return; - } else { + } else */ { popup_unit_upgrade_dlg(actor_unit, target_city, cost, action_type); return; } @@ -1688,6 +2029,7 @@ function handle_freeze_client(packet) function handle_thaw_client(packet) { client_frozen = false; + update_ui_after_thaw(); } function handle_spaceship_info(packet) @@ -2105,6 +2447,9 @@ function handle_player_diplstate(packet) contact_turns_left: packet['contact_turns_left'], has_reason_to_cancel: packet['has_reason_to_cancel'] }; + + // Update Nations tab with incoming changed state (if it's active) + ui_update_nations_info = true; } /************************************************************************** @@ -2146,6 +2491,31 @@ function handle_ruleset_extra(packet) if (packet['name'] == "Bunker") window["EXTRA_BUNKER"] = packet['id']; if (packet['name'] == "Tile Claim") window["EXTRA_TILE_CLAIM"] = packet['id']; if (packet['name'] == "Walls") window["EXTRA_WALLS"] = packet['id']; + if (packet['rule_name'] == "Depth") window["EXTRA_DEEPDIVE"] = packet['id']; +} + +/************************************************************************** + Much of FCW was hard-coded expecting certain rulesets which all share + specific extras. This made problems if rulesets lack those Extras. + This HACK is a bandage for bad hard-coding that fails because of + those hard-coded expectations. TODO: make this function do nothing, find + where those rulesets crash, then alter that hard-coding to not assume + those certain extras exist. +**************************************************************************/ +function set_blank_extras() +{ + window["EXTRA_FARMLAND"] = EXTRA_NOT_EXIST; + window["EXTRA_IRRIGATION"] = EXTRA_NOT_EXIST; + window["EXTRA_RIVER"] = EXTRA_NOT_EXIST; + window["EXTRA_FORTRESS"] = EXTRA_NOT_EXIST; + window["EXTRA_HUT"] = EXTRA_NOT_EXIST; + window["EXTRA_RAILROAD"] = EXTRA_NOT_EXIST; + window["EXTRA_RAIL"] = EXTRA_NOT_EXIST; + window["EXTRA_OIL_WELL"] = EXTRA_NOT_EXIST; + window["EXTRA_FALLOUT"] = EXTRA_NOT_EXIST; + window["EXTRA_AIRBASE"] = EXTRA_NOT_EXIST; + window["EXTRA_BUOY"] = EXTRA_NOT_EXIST; + window["EXTRA_RUINS"] = EXTRA_NOT_EXIST; } /************************************************************************** @@ -2271,7 +2641,7 @@ function handle_research_info(packet) } if (is_tech_tree_init && tech_dialog_active) update_tech_screen(); - bulbs_output_updater.update(); + ui_update_bulbs_info = true; } function handle_worker_task(packet) diff --git a/freeciv-web/src/main/webapp/javascript/pages.js b/freeciv-web/src/main/webapp/javascript/pages.js index 1c1d60b5d..22f8d1a79 100644 --- a/freeciv-web/src/main/webapp/javascript/pages.js +++ b/freeciv-web/src/main/webapp/javascript/pages.js @@ -67,6 +67,7 @@ function set_client_page(page) break; case PAGE_GAME: $("#game_page").show(); + if (renderer == RENDERER_WEBGL) webgl_start_renderer(); set_chat_direction(null); break; diff --git a/freeciv-web/src/main/webapp/javascript/player.js b/freeciv-web/src/main/webapp/javascript/player.js index e4649b2bb..334078473 100644 --- a/freeciv-web/src/main/webapp/javascript/player.js +++ b/freeciv-web/src/main/webapp/javascript/player.js @@ -321,15 +321,28 @@ function get_invalid_username_reason(username) else if (username.length >= 32) { return "too long"; } - username = username.toLowerCase(); - if (username == "pbem") { + if (username.toLowerCase() == "pbem" + || username.toLowerCase() == "kickedplayer" + || username.toLowerCase().startsWith("newavailableplayer") + ) { return "not available"; - } - /*else if (username.search(/^[a-z][a-z0-9]*$/g) != 0) { - return "invalid: only English letters and numbers are allowed, and must start with a letter"; - } */ + } + else if (username.includes(" ")) { + return "invalid: name cannot have spaces"; + } + else if (!is_alphabetic(username.charAt(0))) { + return "invalid: the first symbol must be an unaccented Latin letter"; + } + else if (username.includes("'") || username.includes('&') + || username.includes('@') || username.includes('!') + || username.includes('(') || username.includes(')') + || username.includes('+') || username.includes('*') + || username.includes('/') || username.includes(',') + || username.includes('#') || username.includes(';') ) { + return "disallowed. Illegal symbols: \" ' \\ & ^ % : $ ! ~ + / * = ? , etc." + } else if (username != alphanumeric_cleaner(username)) { - return "invalid: only alphabetic letters and numbers are allowed, and must start with a letter"; + return "invalid: only alphanumeric and hyphenation allowed"; } else if (!check_text_with_banlist_exact(username)) { return "banned"; diff --git a/freeciv-web/src/main/webapp/javascript/pregame.js b/freeciv-web/src/main/webapp/javascript/pregame.js index 33a389dcd..6b6543cae 100644 --- a/freeciv-web/src/main/webapp/javascript/pregame.js +++ b/freeciv-web/src/main/webapp/javascript/pregame.js @@ -35,6 +35,9 @@ var google_user_token = null; ****************************************************************************/ function pregame_start_game() { + if (DEBUG_PICK_NATION) { + console.log("pregame_start_game called by "+pregame_start_game.caller) + } // Successfully prevents the keyboard from popping up on Mobile; which also // force-exits from Fullscreen on Firefox Mobile and some other browsers: if (is_touch_device()) $("#game_text_input").hide(); @@ -103,7 +106,7 @@ function check_browser_compatibility() // Safari 3.0+ "[object HTMLElementConstructor]" var isSafari = /constructor/i.test(window.HTMLElement) || (function (p) { return p.toString() === "[object SafariRemoteNotification]"; })(!window['safari'] || (typeof safari !== 'undefined' && safari.pushNotification)); */ - var isIE = /*@cc_on!@*/false || !!document.documentMode; // Internet Explorer 6-11 + var isIE = /* @cc_on!@ || */ !!document.documentMode; // Internet Explorer 6-11 /* var isEdge = !isIE && !!window.StyleMedia; // Edge 20+ var isChrome = !!window.chrome && (!!window.chrome.webstore || !!window.chrome.runtime); // Chrome 1 - 71 @@ -230,7 +233,7 @@ function update_player_info_pregame_real() var nation_text = ""; if (player['nation'] in nations) { nation_text = " - " + nations[player['nation']]['adjective']; - var flag_html = $(""); + var flag_html = $(""); $("#pregame_plr_"+id).prepend(flag_html); var flag_canvas = document.getElementById('pregame_nation_flags_' + id); if (flag_canvas == null) continue; @@ -340,10 +343,30 @@ function pick_nation_ongoing_longturn() $("#pick_nation_button").hide(); if (!is_loaded_game()) { $("#start_game_button").hide(); + if (DEBUG_PICK_NATION) console.log("is_loaded_game()==false triggers player to pick nation") pick_nation(null); + } else { + if (DEBUG_PICK_NATION) console.log("is_loaded_game()==true disallows player to pick nation") } } +/**********************************************************************//** + Returns the # of turns idle a player has to be, at this point in the + game, to be taken over by a latejoiner player. Keep this code + identical with connecthand.c:can_take_idler_turns() ********* !!! +**************************************************************************/ +function can_take_idler_turns() +{ + // Keep this code identical with connecthand.c.:can_take_idler_turns() !!! + /* Turns 1-12: replace idle 3. T12+ increase idle cutoff until max cutoff of 10 */ + var threshold = 3; + if (game_info.turn > 12) threshold += (game_info.turn - 12); + if (threshold > 10) threshold = 10; + // + + return threshold; +} + /**************************************************************************** Shows the pick nation dialog. ****************************************************************************/ @@ -355,27 +378,37 @@ function pick_nation(player_id) var pplayer = players[player_id]; var player_nations = {}; - if (pplayer == null && !is_ongoing_longturn()) return; + if (pplayer == null && !is_ongoing_longturn()) { + if (DEBUG_PICK_NATION) console.log("Unable to pick nation because pplayer==null && !is_ongoing_longturn()"); + return; + } choosing_player = player_id; var player_name = !is_ongoing_longturn() ? pplayer['name'] : simpleStorage.get("username", ""); if (is_ongoing_longturn()) { - /* We only show the nations that are not already taken by human players */ + /* If player took an idler they can't change the nation of it: */ + var idle_cutoff = can_take_idler_turns(); + if (pplayer && pplayer['nturns_idle'] !== undefined && pplayer['nturns_idle'] >= idle_cutoff) { + if (DEBUG_PICK_NATION) console.log("Unable to pick nation it's assumed we took an idler."); + return; + } + /* We only show the nations that are not already taken by human players */ for (id in players) { if (players[id]['name'].indexOf("NewAvailablePlayer") == -1) { - // Keep this code identical with connecthand.c:can_take_idler_turns() ********* !!! - var idle_cutoff = 3; - if (game_info.turn > 12) idle_cutoff += (game.info.turn - 12); - if (idle_cutoff > 10) idle_cutoff = 10; - // - if (players[id]['nturns_idle'] >= idle_cutoff) return; /* The joining player would have taken over an idler, don't show the dialog */ - else player_nations[players[id]['nation']] = true; + /* 22Nov2021 We no longer can rely on the existence of an idler to mean that + the player was assigned an idler; we actually try to assign non-idlers + first .... + if (players[id]['nturns_idle'] >= idle_cutoff) return; + else + // The joining player would have taken over an idler, don't show the dialog + */ + player_nations[players[id]['nation']] = true; } } if (Object.keys(players).length == Object.keys(player_nations).length) { - add_client_message("Unable to join the game, it is full."); - return; + add_client_message("Unable to join the game, it is full ... Please ignore this message if you were the first to join."); + return; } } @@ -646,7 +679,7 @@ function ruledir_from_ruleset_name(ruleset_name, fall_back_dir) case "Multiplayer-Evolution ruleset": return "mp2"; case "Avant-garde": - return "ag"; + return "mp2-ag"; default: /* Prevent the need of hardcoding this client function for every new ruleset, by making a way for fall_back_dir to match the name of the ruleset automatically: @@ -685,7 +718,7 @@ function show_ruleset_description_full() { }, height : $("#pregame_settings").dialog("option", "height"), - width : "80%" + width : ($(window).width<900?"95%":856) }); $(id).css("color", default_dialog_text_color); } @@ -707,13 +740,16 @@ function pregame_settings() + "
" + "" + "" + "" + "" + @@ -774,7 +810,7 @@ function pregame_settings() "
" + "
Ruleset:
Game title:
" + "" + - "" + + "" + "" + "" + "" + @@ -1299,26 +1335,27 @@ function show_intro_dialog(title, message) { **************************************************************************/ function show_longturn_intro_dialog() { - var title = "Welcome to Freeciv-web: One Turn per Day!"; - - var message = "
This is a Freeciv-web: One Turn per Day game, which is a Freeciv multiplayer game "+ - "where the turns are 23 hours each, so players logs in once every day to do their turn. This format allows for more players to "+ - "play at once, more time to strategize, more time to coordinate with other players, and less rushing to get things done, which can "+ - "occur in a standard multi-player Freeciv game. It takes a lot longer to play a game, about 2 to 6 months, but you can play it just a "+ - "little bit every day.

"+ - "Please be polite to the other players and don't cheat. "+ - "You will get to play for turn immediately after signing up, and your next turn tomorrow. Please join the game only if you are interested in playing one turn every day. " + - "Players who are idle for more than 12 turns can be replaced by new players. This means that idle players will continually be replaced by new players.

" + - "Joining this game requires signing in with a player name and validated Google Account."+ + var title = "Welcome to Freeciv-web Longturn!"; + + var message = "This is a Freeciv-Web Longturn game. "+ + "Turns are 23 hours:  one turn per day.
There are more players, "+ + "and more time for strategy and cooperation.
"+ + "Games last 3-4 months. You play a little bit every day.

"+ + "Please join only if you are interested in playing one turn every day.
" + + "Players who are idle can be replaced by new players.

Important:
" + + "1. A Google Gmail account is needed to sign in.
2. You must access this page with \"www.\" in the address bar.
"+ + "3. Disable your ad-blocker so Google can do a sign-in pop-up.
" + "


Font on map:
Enable speech audio messages
Player name:
" + "


" + - "



(Please disable adblockers, then reload the page, for Google login button to work)"; + "



(Please disable adblockers, then reload the page using www. address, for Google login to work)"; if (is_small_screen()) { - message = "Welcome to this Freeciv-web: One Turn per Day game! Enter your player name:"+ + title = "Freeciv-Web Longturn Game" + message = "This is a Freeciv-Web Longturn game. Turns are 23 hours, with more players and time for strategy. "+ + "To sign in, use a gmail account, disable ad-block, and put www. in the url."+ "

Player name:
" + "



" + - "

"; + "

"; } // reset dialog page. @@ -1376,14 +1413,33 @@ function show_longturn_intro_dialog() { blur_input_on_touchdevice(); google_user_token = null; - gapi.signin2.render('fc-signin2', { - 'scope': 'profile email', - 'width': 240, - 'height': 50, - 'onsuccess': google_signin_on_success, - 'onfailure': google_signin_on_failure - }); + resolveClientKey() + + // initialize singin api + google.accounts.id.initialize({ + client_id: simpleStorage.get('clientKey'), + callback: handleCredentialResponse, + autoselect: true, + prompt_parent_id: 'fc-signin2', + allowed_parent_origin: 'https://www.tacticsandtriumph.com/', + state_cookie_domain: 'tacticsandtriumph.com' + }); + + //Renders the login button. + google.accounts.id.renderButton($("#fc-signin2")[0], { + theme: 'outline', + size: 'large', + width: 240, + click_listener: google_login_button_handler + }); + +} +/*********************************************** + * Loads starts the google login process when clicking the google button. + ***********************************************/ +function google_login_button_handler() { + console.log("Login button pressed") } /************************************************************************** @@ -1834,12 +1890,15 @@ function forgot_pbem_password() } -/************************************************************************** - User signed in with Google account. -**************************************************************************/ -function google_signin_on_success(googleUser) -{ - var id_token = googleUser.getAuthResponse().id_token; +/**************************************************************** + * Handler to process sign in and call the backend tokenSignin Servlet. + * + * @param credentialResponse The credential response object Ref: https://developers.google.com/identity/gsi/web/reference/js-reference#CredentialResponse + * +******************************************************************/ +function handleCredentialResponse(credentialResponse) { + var id_token = credentialResponse.credential; + username = $("#username_req").val().trim().toLowerCase(); if (!validate_username()) { return; @@ -1862,18 +1921,14 @@ function google_signin_on_success(googleUser) } }; xhr.send('idtoken=' + id_token + "&username=" + username); - } - -/************************************************************************** - Handle Google signin problems. -**************************************************************************/ -function google_signin_on_failure(error) -{ - if (error['error'] == "popup_closed_by_user") return; - swal("Unable to sign in with Google: " + JSON.stringify(error)); - setSwalTheme(); - console.error("Unable to sign in with Google: " + JSON.stringify(error)); - +function resolveClientKey() { + var xhr = new XMLHttpRequest(); + xhr.open('POST', '/client_key'); + xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); + xhr.onload = function() { + simpleStorage.set('clientKey', xhr.responseText) + }; + xhr.send() } diff --git a/freeciv-web/src/main/webapp/javascript/rates.js b/freeciv-web/src/main/webapp/javascript/rates.js index 359ee0f8f..9a747c74b 100644 --- a/freeciv-web/src/main/webapp/javascript/rates.js +++ b/freeciv-web/src/main/webapp/javascript/rates.js @@ -161,9 +161,7 @@ function tax_rate_key_listener(ev) switch (keyboard_key) { case 'W': ev.stopPropagation(); - clearInterval(rate_updater_interval); - rate_output_update=null; - $("#rates_dialog").dialog('close'); + close_rates_dialog(); $("#rates_dialog").remove(); break; case 'R': diff --git a/freeciv-web/src/main/webapp/javascript/reqtree.js b/freeciv-web/src/main/webapp/javascript/reqtree.js index 4a27dcffe..1e04c51f8 100644 --- a/freeciv-web/src/main/webapp/javascript/reqtree.js +++ b/freeciv-web/src/main/webapp/javascript/reqtree.js @@ -111,9 +111,7 @@ var reqtree = { "77": {"x":4479, "y":378}, // Superconductors "31": {"x":4680, "y":381}, // Fusion Power "74": {"x":4680, "y":481} // Stealth -}; - - +}; // multiplayer ruleset var reqtree_multiplayer = { @@ -208,7 +206,6 @@ var reqtree_multiplayer = { }; - // civ2civ3 ruleset var reqtree_civ2civ3 = { @@ -301,9 +298,77 @@ var reqtree_civ2civ3 = { "31": {"x":4757, "y":404} // Fusion Power }; +var reqtree_civ1 = { + "2": {"x":0, "y":0}, // Alphabet + "9": {"x":0, "y":174}, // Ceremonial Burial + "50": {"x":0, "y":248}, // Pottery + "37": {"x":0, "y":347}, // Masonry + "29": {"x":0, "y":604}, // Horseback Riding + "8": {"x":0, "y":706}, // Bronze Working + "67": {"x":416, "y":0}, // Writing + "12": {"x":416, "y":82}, // Code of Laws + "39": {"x":416, "y":258}, // Mathematics + "43": {"x":416, "y":145}, // Mysticism + "36": {"x":416, "y":347}, // Map Making + "63": {"x":416, "y":524}, // The Wheel + "18": {"x":416, "y":604}, // Currency + "32": {"x":416, "y":706}, // Iron Working + "34": {"x":667, "y":1}, // Literacy + "65": {"x":667, "y":106}, // Trade + "42": {"x":667, "y":197}, // Monarchy + "3": {"x":667, "y":299}, // Astronomy + "17": {"x":667, "y":539}, // Construction + "62": {"x":918, "y":1}, // The Republic + "47": {"x":918, "y":145}, // Philosophy + "44": {"x":918, "y":350}, // Navigation + "22": {"x":918, "y":461}, // Engineering + "24": {"x":918, "y":553}, // Feudalism + "7": {"x":918, "y":693}, // Bridge Building (changed manually) + "6": {"x":1169, "y":14}, // Banking + "40": {"x":1169, "y":86}, // Medicine + "66": {"x":1169, "y":195}, // University + "48": {"x":1169, "y":418}, // Physics (fixed manually) + "31": {"x":1169, "y":319}, // Invention + "11": {"x":1169, "y":696}, // Chivalry + "10": {"x":1420, "y":108}, // Chemistry + "19": {"x":1420, "y":176}, // Democracy + "64": {"x":1420, "y":239}, // Theory of Gravity + "58": {"x":1420, "y":342}, // Steam Engine + "35": {"x":1420, "y":596}, // Magnetism + "28": {"x":1420, "y":500}, // Gunpowder + "4": {"x":1753, "y":75}, // Atomic Theory (fixed manually) + "23": {"x":1753, "y":282}, // Explosives + "51": {"x":1753, "y":484}, // Railroad + "41": {"x":1753, "y":389}, // Metallurgy + "54": {"x":1169, "y":604}, // Religion + "30": {"x":1958, "y":335}, // Industrialization + "20": {"x":1958, "y":416}, // Electricity + "16": {"x":1958, "y":526}, // Conscription + "61": {"x":2271, "y":35}, // The Corporation + "14": {"x":2271, "y":145}, // Communism + "59": {"x":2271, "y":325}, // Steel + "27": {"x":2543, "y":1}, // Genetic Engineering + "53": {"x":2543, "y":113}, // Refining + "21": {"x":2543, "y":344}, // Electronics + "13": {"x":2794, "y":188}, // Combustion + "5": {"x":3000, "y":249}, // Automobile + "25": {"x":3000, "y":336}, // Flight + "38": {"x":3228, "y":181}, // Mass Production + "52": {"x":3479, "y":1}, // Recycling + "45": {"x":3479, "y":89}, // Nuclear Fission + "33": {"x":3479, "y":319}, // Labor Union + "15": {"x":3479, "y":398}, // Computers + "1": {"x":3479, "y":589}, // Advanced Flight + "46": {"x":3812, "y":208}, // Nuclear Power + "55": {"x":4479, "y":319}, // Robotics + "56": {"x":3812, "y":525}, // Rocketry + "57": {"x":4020, "y":234}, // Space Flight + "49": {"x":4228, "y":425}, // Plastics + "60": {"x":4479, "y":526}, // Superconductors + "26": {"x":4680, "y":410}, // Fusion Power + }; - -// Mp plus and Mp-evo (mp2) ruleset. +// Mp+ and Mp-evo (mp2) ruleset. var reqtree_mpplus = { "2": {"x":0, "y":0}, // Alphabet "10": {"x":0, "y":174}, // Ceremonial Burial @@ -314,8 +379,8 @@ var reqtree_mpplus = { "87": {"x":0, "y":708}, // Warrior Code "88": {"x":416, "y":0}, // Writing "13": {"x":416, "y":82}, // Code of Laws - "56": {"x":416, "y":145}, // Mysticism "49": {"x":416, "y":258}, // Mathematics + "56": {"x":416, "y":145}, // Mysticism "46": {"x":416, "y":347}, // Map Making "63": {"x":416, "y":426}, // Polytheism "82": {"x":416, "y":524}, // The Wheel @@ -487,192 +552,97 @@ var reqtree_avantgarde = { "33": {"x":4856, "y":340}, // Fusion Power "77": {"x":4856, "y":456}, // Stealth }; -/* - var reqtree_mp2c = { - "2": {"x":0, "y":0}, // Alphabet - "11": {"x":0, "y":174}, // Ceremonial Burial - "65": {"x":0, "y":248}, // Pottery - "48": {"x":0, "y":347}, // Masonry - "37": {"x":0, "y":446}, // Horseback Riding - "10": {"x":0, "y":582}, // Bronze Working - "89": {"x":0, "y":708}, // Warrior Code - "90": {"x":416, "y":0}, // Writing - "14": {"x":416, "y":82}, // Code of Laws - "57": {"x":416, "y":145}, // Mysticism - "50": {"x":416, "y":258}, // Mathematics - "47": {"x":416, "y":347}, // Map Making - "64": {"x":416, "y":426}, // Polytheism - "84": {"x":416, "y":524}, // The Wheel - "21": {"x":416, "y":604}, // Currency - "40": {"x":416, "y":706}, // Iron Working - "44": {"x":667, "y":1}, // Literacy - "87": {"x":667, "y":106}, // Trade - "55": {"x":667, "y":197}, // Monarchy - "4": {"x":667, "y":299}, // Astronomy - "75": {"x":667, "y":388}, // Seafaring - "20": {"x":667, "y":539}, // Construction - "83": {"x":918, "y":1}, // The Republic - "61": {"x":918, "y":145}, // Philosophy - "58": {"x":918, "y":350}, // Navigation - "26": {"x":918, "y":461}, // Engineering - "30": {"x":918, "y":553}, // Feudalism - "9": {"x":918, "y":693}, // Bridge Building - "8": {"x":1169, "y":14}, // Banking - "51": {"x":1169, "y":86}, // Medicine - "88": {"x":1169, "y":195}, // University - "39": {"x":1169, "y":319}, // Invention - "62": {"x":1169, "y":418}, // Physics - "56": {"x":1169, "y":526}, // Monotheism - "13": {"x":1169, "y":696}, // Chivalry - "23": {"x":1502, "y":1}, // Economics - "12": {"x":1502, "y":108}, // Chemistry - "22": {"x":1502, "y":176}, // Democracy - "86": {"x":1502, "y":239}, // Theory of Gravity - "78": {"x":1502, "y":342}, // Steam Engine - "74": {"x":1502, "y":412}, // Sanitation - "36": {"x":1502, "y":500}, // Gunpowder - "46": {"x":1502, "y":596}, // Magnetism - "85": {"x":1502, "y":658}, // Theology - "5": {"x":1835, "y":75}, // Atomic Theory - "29": {"x":1835, "y":282}, // Explosives - "52": {"x":1835, "y":392}, // Metallurgy - "68": {"x":1835, "y":484}, // Railroad - "43": {"x":1835, "y":698}, // Leadership - "32": {"x":1835, "y":597}, // Theocracy - "38": {"x":2096, "y":327}, // Industrialization - "24": {"x":2096, "y":392}, // Electricity - "19": {"x":2096, "y":526}, // Conscription - "82": {"x":2374, "y":37}, // The Corporation - "17": {"x":2374, "y":146}, // Communism - "79": {"x":2374, "y":327}, // Steel - "71": {"x":2374, "y":475}, // Refrigeration - "81": {"x":2374, "y":699}, // Tactics - "34": {"x":2646, "y":1}, // Genetic Engineering - "70": {"x":2646, "y":116}, // Refining - "28": {"x":2646, "y":245}, // Espionage - "25": {"x":2646, "y":349}, // Electronics - "35": {"x":2646, "y":512}, // Guerilla Warfare - "45": {"x":2646, "y":594}, // Machine Tools - "3": {"x":2646, "y":699}, // Amphibious Warfare - "16": {"x":2904, "y":188}, // Combustion - "53": {"x":2904, "y":523}, // Miniaturization - "6": {"x":3116, "y":249}, // Automobile - "31": {"x":3116, "y":341}, // Flight - "49": {"x":3367, "y":181}, // Mass Production - "54": {"x":3367, "y":486}, // Mobile Warfare - "67": {"x":3367, "y":640}, // Radio - "69": {"x":3618, "y":1}, // Recycling - "59": {"x":3618, "y":89}, // Nuclear Fission - "41": {"x":3618, "y":312}, // Labor Union - "18": {"x":3618, "y":395}, // Computers - "66": {"x":3870, "y":708}, // Radar - "1": {"x":3618, "y":569}, // Advanced Flight - "60": {"x":3870, "y":208}, // Nuclear Power - "72": {"x":4116, "y":390}, // Robotics - "73": {"x":4116, "y":529}, // Rocketry - "15": {"x":3870, "y":483}, // Combined Arms - "7": {"x":4366, "y":507}, // Avionics - "76": {"x":4366, "y":241}, // Space Flight - "42": {"x":4366, "y":398}, // Laser - "63": {"x":4618, "y":286}, // Plastics - "27": {"x":4618, "y":181}, // Environmentalism - "80": {"x":4618, "y":395}, // Superconductors - "33": {"x":4856, "y":340}, // Fusion Power - "77": {"x":4856, "y":456}, // Stealth - "91": {"x":2646, "y":429}, // Nationalism - }; -*/ var reqtree_mp2c = { 1: {x: 4202, y: 569, col:7}, // Advanced Flight - 2: {x: 0, y: 0}, // Alphabet - 3: {x: 3230, y: 706}, // Amphibious Warfare + 2: {x: 0, y: 0, col:1}, // Alphabet + 3: {x: 3230, y: 706, col:9}, // Amphibious Warfare 4: {x: 667, y: 296, col:8}, // Astronomy 5: {x: 2419, y: 75, col:4}, // Atomic Theory 6: {x: 3700, y: 249, col:8}, // Automobile - 7: {x: 4950, y: 507}, // Avionics - 8: {x: 1420, y: 1}, // Banking + 7: {x: 4950, y: 507, col:7}, // Avionics + 8: {x: 1420, y: 1, col:3}, // Banking 9: {x: 918, y: 361, col:6}, // Bridge Building - 10: {x: 0, y: 582}, // Bronze Working - 11: {x: 0, y: 174}, // Ceremonial Burial + 10: {x: 0, y: 582, col:3}, // Bronze Working + 11: {x: 0, y: 174, col:2}, // Ceremonial Burial 12: {x: 2086, y: 108, col:4},// Chemistry - 13: {x: 1169, y: 706},// Chivalry + 13: {x: 1169, y: 706, col:0},// Chivalry 14: {x: 416, y: 87, col:7}, // Code of Laws 15: {x: 4454, y: 483},// Combined Arms - 16: {x: 3488, y: 188},// Combustion + 16: {x: 3488, y: 188, col:7},// Combustion 17: {x: 2958, y: 146, col:5},// Communism - 18: {x: 4202, y: 395},// Computers + 18: {x: 4202, y: 395, col:1},// Computers 19: {x: 2680, y: 526, col:5},// Conscription 20: {x: 667, y: 539, col:6}, // Construction 21: {x: 416, y: 605, col:3}, // Currency 22: {x: 2086, y: 239, col:2},// Democracy - 23: {x: 2086, y: 1}, // Economics - 24: {x: 2680, y: 392},// Electricity - 25: {x: 3230, y: 349},// Electronics + 23: {x: 2086, y: 1, col:3}, // Economics + 24: {x: 2680, y: 392, col:7},// Electricity + 25: {x: 3230, y: 349, col:3},// Electronics 26: {x: 918, y: 706, col:4}, // Engineering 27: {x: 5202, y: 181},// Environmentalism 28: {x: 3230, y: 245},// Espionage 29: {x: 2419, y: 282, col:1},// Explosives 30: {x: 918, y: 583, col:5}, // Feudalism - 31: {x: 3700, y: 341},// Flight - 32: {x: 2086, y: 666},// Theocracy - 33: {x: 5440, y: 340},// Fusion Power - 34: {x: 3230, y: 1}, // Microbiology - 35: {x: 3230, y: 512, col:5},// Guerilla Warfare - 36: {x: 1753, y: 500, col:5},// Gunpowder - 37: {x: 0, y: 446}, // Horseback Riding - 38: {x: 2680, y: 327},// Industrialization - 39: {x: 1420, y: 434, col:9},// Invention - 40: {x: 416, y: 706, col:6}, // Iron Working - 41: {x: 4202, y: 312},// Labor Union - 42: {x: 4950, y: 398, col:1},// Laser - 43: {x: 2419, y: 703, col:0},// Leadership - 44: {x: 667, y: 1}, // Literacy - 45: {x: 3230, y: 594, col:9},// Machine Tools - 46: {x: 1753, y: 596, col:8},// Magnetism - 47: {x: 416, y: 347, col:8}, // Map Making - 48: {x: 0, y: 347}, // Masonry - 49: {x: 3951, y: 181},// Mass Production - 50: {x: 416, y: 258, col:7}, // Mathematics - 51: {x: 1420, y: 86, col:6}, // Medicine - 52: {x: 2419, y: 392},// Metallurgy - 53: {x: 3488, y: 523, col:4},// Miniaturization - 54: {x: 3951, y: 486, col:0},// Mobile Warfare - 55: {x: 667, y: 197, col:2}, // Monarchy - 56: {x: 1420, y: 586, col:2},// Monotheism - 57: {x: 416, y: 151, col:4}, // Mysticism - 58: {x: 1169, y: 461, col:7}, // Navigation - 59: {x: 4202, y: 89, col:4}, // Nuclear Fission - 60: {x: 4454, y: 208, col:4},// Nuclear Power - 61: {x: 1169, y: 145, col:9}, // Philosophy - 62: {x: 1420, y: 354, col:7},// Physics - 63: {x: 5202, y: 286},// Plastics - 64: {x: 416, y: 426}, // Polytheism - 65: {x: 0, y: 248}, // Pottery - 66: {x: 4454, y: 706},// Radar - 67: {x: 3951, y: 640, col:7},// Radio - 68: {x: 2419, y: 484, col:6},// Railroad - 69: {x: 4202, y: 1, col:6}, // Recycling - 70: {x: 3230, y: 116},// Refining - 71: {x: 2958, y: 475},// Refrigeration - 72: {x: 4700, y: 390, col:0},// Robotics - 73: {x: 4700, y: 529, col:8},// Rocketry - 74: {x: 1753, y: 386, col:6},// Sanitation - 75: {x: 667, y: 408, col:7}, // Seafaring - 76: {x: 4950, y: 241, col:4},// Space Flight - 77: {x: 5440, y: 456},// Stealth - 78: {x: 2086, y: 333, col:8},// Steam Engine - 79: {x: 2958, y: 327, col:8},// Steel - 80: {x: 5202, y: 395},// Superconductors - 81: {x: 2958, y: 706, col:0},// Tactics - 82: {x: 2958, y: 37, col:3}, // The Corporation - 83: {x: 918, y: 1, col:0}, // The Republic - 84: {x: 416, y: 524}, // The Wheel + 31: {x: 3700, y: 341, col:7},// Flight + 32: {x: 5440, y: 340},// Fusion Power + 33: {x: 3230, y: 1}, // Microbiology + 34: {x: 3230, y: 512, col:5},// Guerilla Warfare + 35: {x: 1753, y: 500, col:5},// Gunpowder + 36: {x: 0, y: 446, col:0}, // Horseback Riding + 37: {x: 2680, y: 327, col:6},// Industrialization + 38: {x: 1420, y: 434, col:9},// Invention + 39: {x: 416, y: 706, col:6}, // Iron Working + 40: {x: 4202, y: 312, col:5},// Labor Union + 41: {x: 4950, y: 398, col:1},// Laser + 42: {x: 2419, y: 703, col:0},// Leadership + 43: {x: 667, y: 1, col:1}, // Literacy + 44: {x: 3230, y: 594, col:9},// Machine Tools + 45: {x: 1753, y: 596, col:8},// Magnetism + 46: {x: 416, y: 347, col:8}, // Map Making + 47: {x: 0, y: 347, col:7}, // Masonry + 48: {x: 3951, y: 181, col:1},// Mass Production + 49: {x: 416, y: 258, col:7}, // Mathematics + 50: {x: 1420, y: 86, col:6}, // Medicine + 51: {x: 2419, y: 595, col:0},// Metallurgy + 52: {x: 3488, y: 523, col:4},// Miniaturization + 53: {x: 3951, y: 486, col:0},// Mobile Warfare + 54: {x: 667, y: 197, col:2}, // Monarchy + 55: {x: 1420, y: 586, col:2},// Monotheism + 56: {x: 416, y: 151, col:4}, // Mysticism + 57: {x: 1169, y: 461, col:7}, // Navigation + 58: {x: 4202, y: 89, col:4}, // Nuclear Fission + 59: {x: 4454, y: 208, col:4},// Nuclear Power + 60: {x: 1169, y: 145, col:9}, // Philosophy + 61: {x: 1420, y: 354, col:7},// Physics + 62: {x: 5202, y: 286},// Plastics + 63: {x: 416, y: 426, col:2}, // Polytheism + 64: {x: 0, y: 248, col:6}, // Pottery + 65: {x: 4454, y: 706, col:7},// Radar + 66: {x: 3951, y: 640, col:7},// Radio + 67: {x: 2419, y: 484, col:6},// Railroad + 68: {x: 4202, y: 1, col:6}, // Recycling + 69: {x: 3230, y: 116, col:8},// Refining + 70: {x: 2958, y: 475},// Refrigeration + 71: {x: 4700, y: 390, col:0},// Robotics + 72: {x: 4700, y: 529, col:8},// Rocketry + 73: {x: 1753, y: 386, col:6},// Sanitation + 74: {x: 667, y: 408, col:7}, // Seafaring + 75: {x: 4950, y: 241, col:4},// Space Flight + 76: {x: 5440, y: 456},// Stealth + 77: {x: 2086, y: 333, col:8},// Steam Engine + 78: {x: 2958, y: 327, col:8},// Steel + 79: {x: 5202, y: 395, col:3},// Superconductors + 80: {x: 2958, y: 706, col:0},// Tactics + 81: {x: 2958, y: 37, col:3}, // The Corporation + 82: {x: 918, y: 1, col:0}, // The Republic + 83: {x: 416, y: 524, col:6}, // The Wheel + 84: {x: 2086, y: 666},// Theocracy 85: {x: 1753, y: 666, col:9},// Theology - 86: {x: 2086, y: 176},// Theory of Gravity - 87: {x: 667, y: 106}, // Trade + 86: {x: 2086, y: 176, col:7},// Theory of Gravity + 87: {x: 667, y: 106, col:3}, // Trade 88: {x: 1420, y: 192, col:1},// University - 89: {x: 0, y: 708}, // Warrior Code + 89: {x: 0, y: 708, col:5}, // Warrior Code 90: {x: 416, y: 0, col:1}, // Writing 91: {x: 3230, y: 429} // Nationalism }; @@ -682,7 +652,7 @@ var reqtree_mp2c = { 8 egyptian blue 7 medium teal-blue 6 olive / ochre -5 wine +5 wine / red 4 bright sky 3 bronze sea spray (strong green-cyan) 2 periwinkle @@ -693,97 +663,101 @@ var reqtree_mp2c = { // x+=251 normal // x+=333 big gap var reqtree_mp2d = { - 1: {x: 4202, y: 569, col:7}, // Advanced Flight - 2: {x: 0, y: 0}, // Alphabet - 3: {x: 3230, y: 706}, // Amphibious Warfare + 1: {x: 4202, y: 708, col:7}, // Advanced Flight + 2: {x: 0, y: 0, col:1}, // Alphabet + 3: {x: 3230, y: 590, col:9}, // Amphibious Warfare 4: {x: 667, y: 296, col:8}, // Astronomy 5: {x: 2419, y: 75, col:4}, // Atomic Theory 6: {x: 3700, y: 249, col:8}, // Automobile - 7: {x: 4950, y: 507}, // Avionics - 8: {x: 1420, y: 1}, // Banking + 7: {x: 4950, y: 523, col:7}, // Avionics + 8: {x: 1420, y: 1, col:3}, // Banking 9: {x: 918, y: 361, col:6}, // Bridge Building - 10: {x: 0, y: 582}, // Bronze Working - 11: {x: 0, y: 174}, // Ceremonial Burial + 10: {x: 0, y: 582, col:3}, // Bronze Working + 11: {x: 0, y: 174, col:2}, // Ceremonial Burial 12: {x: 2086, y: 108, col:4},// Chemistry - 13: {x: 1169, y: 706},// Chivalry + 13: {x: 1169, y: 708, col:0},// Chivalry 14: {x: 416, y: 87, col:7}, // Code of Laws - 15: {x: 4454, y: 483},// Combined Arms - 16: {x: 3488, y: 188},// Combustion + 15: {x: 4700, y: 523},// Combined Arms + 16: {x: 3488, y: 188, col:7},// Combustion 17: {x: 2958, y: 146, col:5},// Communism - 18: {x: 4202, y: 395},// Computers + 18: {x: 4454, y: 395, col:1},// Computers 19: {x: 2680, y: 526, col:5},// Conscription 20: {x: 667, y: 539, col:6}, // Construction 21: {x: 416, y: 605, col:3}, // Currency 22: {x: 2086, y: 239, col:2},// Democracy - 23: {x: 2086, y: 1}, // Economics - 24: {x: 2680, y: 392},// Electricity - 25: {x: 3230, y: 349},// Electronics - 26: {x: 918, y: 706, col:4}, // Engineering - 27: {x: 5202, y: 181},// Environmentalism + 23: {x: 2086, y: 1, col:3}, // Economics + 24: {x: 2680, y: 392, col:7},// Electricity + 25: {x: 3230, y: 345}, col:3,// Electronics + 26: {x: 918, y: 708, col:4}, // Engineering + 27: {x: 5202, y: 101},// Environmentalism 28: {x: 3230, y: 245},// Espionage 29: {x: 2419, y: 282, col:1},// Explosives 30: {x: 918, y: 583, col:5}, // Feudalism - 31: {x: 3700, y: 341},// Flight - 32: {x: 2086, y: 666},// Theocracy - 33: {x: 5440, y: 340},// Fusion Power - 34: {x: 3230, y: 1}, // Microbiology - 35: {x: 3230, y: 512, col:5},// Guerilla Warfare - 36: {x: 1753, y: 500, col:5},// Gunpowder - 37: {x: 0, y: 446}, // Horseback Riding - 38: {x: 2680, y: 327},// Industrialization - 39: {x: 1420, y: 434, col:9},// Invention - 40: {x: 416, y: 706, col:6}, // Iron Working - 41: {x: 4202, y: 312},// Labor Union - 42: {x: 4950, y: 398, col:1},// Laser - 43: {x: 2419, y: 703, col:0},// Leadership - 44: {x: 667, y: 1}, // Literacy - 45: {x: 3230, y: 594, col:9},// Machine Tools - 46: {x: 1753, y: 596, col:8},// Magnetism - 47: {x: 416, y: 347, col:8}, // Map Making - 48: {x: 0, y: 347}, // Masonry - 49: {x: 3951, y: 181},// Mass Production - 50: {x: 416, y: 258, col:7}, // Mathematics - 51: {x: 1420, y: 86, col:6}, // Medicine - 52: {x: 2419, y: 392},// Metallurgy - 53: {x: 3488, y: 523, col:4},// Miniaturization - 54: {x: 3951, y: 486, col:0},// Mobile Warfare - 55: {x: 667, y: 197, col:2}, // Monarchy - 56: {x: 1420, y: 586, col:2},// Monotheism - 57: {x: 416, y: 151, col:4}, // Mysticism + 31: {x: 3700, y: 351, col:7},// Flight + 32: {x: 5440, y: 340},// Fusion Power + 33: {x: 3230, y: 508, col:5},// Guerilla Warfare + 34: {x: 1753, y: 530, col:5},// Gunpowder + 35: {x: 0, y: 446, col:0}, // Horseback Riding + 36: {x: 2680, y: 327, col:6},// Industrialization + 37: {x: 1420, y: 434, col:9},// Invention + 38: {x: 416, y: 708, col:5}, // Iron Working + 39: {x: 4950, y: 395, col:1},// Laser + 40: {x: 2419, y: 703, col:0},// Leadership + 41: {x: 667, y: 1, col:1}, // Literacy + 42: {x: 3230, y: 708, col:9},// Machine Tools + 43: {x: 1753, y: 596, col:8},// Magnetism + 44: {x: 416, y: 347, col:8}, // Map Making + 45: {x: 0, y: 347, col:7}, // Masonry + 46: {x: 3951, y: 181, col:1},// Mass Production + 47: {x: 416, y: 258, col:7}, // Mathematics + 48: {x: 4202, y: 181, col:5},// Mechanization + 49: {x: 1420, y: 86, col:6}, // Medicine + 50: {x: 2419, y: 595, col:0},// Metallurgy + 51: {x: 3230, y: 1}, // Microbiology + 52: {x: 3488, y: 429, col:4},// Miniaturization + 53: {x: 3951, y: 478, col:0},// Mobile Warfare + 54: {x: 667, y: 197, col:2}, // Monarchy + 55: {x: 1420, y: 586, col:2},// Monotheism + 56: {x: 416, y: 151, col:4}, // Mysticism + 57: {x: 3230, y: 425}, // Nationalism 58: {x: 1169, y: 461, col:7}, // Navigation 59: {x: 4202, y: 89, col:4}, // Nuclear Fission - 60: {x: 4454, y: 208, col:4},// Nuclear Power + 60: {x: 4454, y: 248, col:4},// Nuclear Power 61: {x: 1169, y: 145, col:9}, // Philosophy 62: {x: 1420, y: 354, col:7},// Physics - 63: {x: 5202, y: 286},// Plastics - 64: {x: 416, y: 426}, // Polytheism - 65: {x: 0, y: 248}, // Pottery - 66: {x: 4454, y: 706},// Radar - 67: {x: 3951, y: 640, col:7},// Radio + 63: {x: 5202, y: 248},// Plastics + 64: {x: 416, y: 426, col:2}, // Polytheism + 65: {x: 0, y: 248, col:6}, // Pottery + 66: {x: 4454, y: 708, col:7},// Radar + 67: {x: 3951, y: 594, col:7},// Radio 68: {x: 2419, y: 484, col:6},// Railroad 69: {x: 4202, y: 1, col:6}, // Recycling - 70: {x: 3230, y: 116},// Refining + 70: {x: 3230, y: 116, col:8},// Refining 71: {x: 2958, y: 475},// Refrigeration - 72: {x: 4700, y: 390, col:0},// Robotics - 73: {x: 4700, y: 529, col:8},// Rocketry + 72: {x: 4700, y: 1, col:0},// Robotics + 73: {x: 4700, y: 673, col:8},// Rocketry 74: {x: 1753, y: 386, col:6},// Sanitation 75: {x: 667, y: 408, col:7}, // Seafaring - 76: {x: 4950, y: 241, col:4},// Space Flight + 76: {x: 4950, y: 248, col:4},// Space Flight 77: {x: 5440, y: 456},// Stealth 78: {x: 2086, y: 333, col:8},// Steam Engine 79: {x: 2958, y: 327, col:8},// Steel - 80: {x: 5202, y: 395},// Superconductors - 81: {x: 2958, y: 706, col:0},// Tactics + 80: {x: 5202, y: 395, col:3},// Superconductors + 81: {x: 2958, y: 708, col:0},// Tactics 82: {x: 2958, y: 37, col:3}, // The Corporation 83: {x: 918, y: 1, col:0}, // The Republic - 84: {x: 416, y: 524}, // The Wheel - 85: {x: 1753, y: 666, col:9},// Theology - 86: {x: 2086, y: 176},// Theory of Gravity - 87: {x: 667, y: 106}, // Trade - 88: {x: 1420, y: 192, col:1},// University - 89: {x: 0, y: 708}, // Warrior Code - 90: {x: 416, y: 0, col:1}, // Writing - 91: {x: 3230, y: 429} // Nationalism + 84: {x: 416, y: 524, col:6}, // The Wheel + 85: {x: 2086, y: 666},// Theocracy + 86: {x: 1753, y: 666, col:2},// Theology + 87: {x: 2086, y: 176, col:7},// Theory of Gravity + 88: {x: 667, y: 106, col:3}, // Trade + 89: {x: 1420, y: 192, col:1},// University + 90: {x: 0, y: 708, col:5}, // Warrior Code + 91: {x: 416, y: 0, col:1}, // Writing + /* Begin "Specialization Add-On techs". Use this as a model + * exemplar of how to position relative to parent tech */ + 92: {x: (3700+44), y: (351+49)}, //Flight.2 + 93: {x: (3951+44), y: (594+49)} //Radio.2 }; /* diff --git a/freeciv-web/src/main/webapp/javascript/savegame.js b/freeciv-web/src/main/webapp/javascript/savegame.js index 1186db2f7..6529e0892 100644 --- a/freeciv-web/src/main/webapp/javascript/savegame.js +++ b/freeciv-web/src/main/webapp/javascript/savegame.js @@ -34,6 +34,7 @@ var scenarios = [ {"img":"/images/italy.png", "description":"Italy (100x100)", "savegame":"italy"}, {"img":"/images/japan.png", "description":"Japan (88x100)", "savegame":"japan"}, {"img":"/images/america.png", "description":"North America (116x100)", "savegame":"north_america"}, + {"img":"/images/riverland.png", "description":"Riverlands LT for 20 players (90x60)", "savegame":"riverland"}, ]; var scenario_info = null; diff --git a/freeciv-web/src/main/webapp/javascript/sounds.js b/freeciv-web/src/main/webapp/javascript/sounds.js index c01e00e33..20fc13c36 100644 --- a/freeciv-web/src/main/webapp/javascript/sounds.js +++ b/freeciv-web/src/main/webapp/javascript/sounds.js @@ -179,7 +179,7 @@ function play_combat_sound(unit) { if (!sounds_enabled) return; if (unit == null) return; - if (!is_unit_visible(unit)) + if (!is_unit_visible(unit) && renderer != RENDERER_WEBGL) { //console.error("skipped playing a sound because unit not visible or RENDERER_WEBGL"); return; diff --git a/freeciv-web/src/main/webapp/javascript/tech.js b/freeciv-web/src/main/webapp/javascript/tech.js index 5f78ab441..46ee63c17 100644 --- a/freeciv-web/src/main/webapp/javascript/tech.js +++ b/freeciv-web/src/main/webapp/javascript/tech.js @@ -23,9 +23,13 @@ var techcoststyle1 = {}; var bulb_output_text = ""; -var tech_canvas_text_font = "18px Arial"; -var tech_canvas_text_font_redux = "17px Arial"; // smaller for bold long tech names -var tech_canvas_text_font_alt = "18px Arial"; // smaller for !bold long names +var tech_canvas_text_font = "17px Arial"; +var tech_canvas_text_font_redux = "16.5px Arial"; +var tech_canvas_text_font_alt = "16.5px Arial"; +// Specialty add-on sub-techs in little boxes: +var tech_canvas_text_font_special = "13px Arial"; +var tech_canvas_text_font_special_redux = "11px Arial"; +var tech_canvas_text_font_special_alt = "13px Arial"; var is_tech_tree_init = false; var tech_dialog_active = false; @@ -85,7 +89,7 @@ var A_NEVER = null; var tech_canvas = null; var tech_canvas_ctx = null; -var tech_item_width = 222; +var tech_item_width = 207; var tech_item_height = 52; var maxleft = 0; var clicked_tech_id = null; @@ -161,6 +165,8 @@ function init_tech_screen() if (ruleset_control['name'] == "Multiplayer-Evolution ruleset") reqtree = reqtree_mpplus; if (ruleset_control['name'].startsWith("Avant-garde")) reqtree = reqtree_avantgarde; if (ruleset_control['name'].startsWith("MP2")) reqtree = reqtree_avantgarde; // from MP2 Brava onward all MP2 rules start with "MP2" + if (ruleset_control['name'] == "Civ I ruleset" + || ruleset_control['name'] == "Civ1 ruleset") reqtree = reqtree_civ1; // include legacy name just in case if (client_rules_flag[CRF_MP2_C]) reqtree = reqtree_mp2c; if (client_rules_flag[CRF_MP2_D]) reqtree = reqtree_mp2d; @@ -189,6 +195,22 @@ function init_tech_screen() tech_canvas.width = (max_width + tech_item_width) * tech_xscale; tech_canvas.height = max_height + tech_item_height; + if ($("#technologies").height()-15>tech_canvas.height) { + tech_canvas.height = $("#technologies").height()-15; // now sizes to max available vert.space. + } + + // Vertically rescale tech tree to use available screen space. + const scalar = (tech_canvas.height) / (max_height + tech_item_height); + if (scalar>1) { + for (r in reqtree) { + var j = reqtree[r].y; + reqtree[r].y = Math.floor(reqtree[r].y * scalar); + } + } + + /* A blank space tech_result_text will not render a blank line in html, then when the text appears, + * will cause the layout to vertically re-adjust which causes jitter-jank. Therefore, force a blank line: */ + $("#tech_result_text").html(" "); if (is_small_screen()) { tech_canvas.width = Math.floor(tech_canvas.width * 0.6); @@ -202,7 +224,7 @@ function init_tech_screen() } if (!is_small_screen()) { - $("#mouse_info_box").html("
"); + $("#mouse_info_box").html("
"); $("#mouse_info_box").css('cursor', "help"); $("#mouse_info_box").tooltip({ show: { delay:0, effect:"none", duration: 0 }, hide: {delay:120, effect:"none", duration: 0} @@ -210,6 +232,10 @@ function init_tech_screen() } is_tech_tree_init = true; clicked_tech_id = null; + + //Make tech tree draggable to scroll it. + $("#technologies").addClass("dragscroll"); + dragscroll.reset(); } /************************************************************************** ... @@ -218,8 +244,6 @@ function update_tech_tree() { if (freeze) return; var hy = 24; - var hx = 48 + 160; - hx = tech_item_width; tech_canvas_ctx.clearRect(0, 0, 5824, 726); @@ -237,6 +261,7 @@ function update_tech_tree() var dx = Math.floor(reqtree[rid+'']['x'] * tech_xscale); //scale in X direction. var dy = reqtree[rid+'']['y']; + var hx = get_tech_item_width(techs[ptech['req'][i]]); // Alternating line colour sequence, each tech gets a different line colour to differentiate. var sequence = 1+Math.round(dy/55)+Math.round(dx/45); // Create a "seed" that bumps up as we span the canvas vertically and horizontally @@ -250,16 +275,16 @@ function update_tech_tree() } else { // else differentiate line colours to make tracing them easier if (sequence == 9) tech_canvas_ctx.strokeStyle = 'rgba(144, 134, 134, 0.95)'; // grey - else if (sequence == 8) tech_canvas_ctx.strokeStyle = 'rgba(55, 83, 204, 0.83)'; // egyptian blue - else if (sequence == 7) tech_canvas_ctx.strokeStyle = 'rgba(81, 146, 187, 0.8)'; // medium teal-blue + else if (sequence == 8) tech_canvas_ctx.strokeStyle = 'rgba(55, 83, 204, 0.89)'; // egyptian blue + else if (sequence == 7) tech_canvas_ctx.strokeStyle = 'rgba(81, 146, 187, 0.88)'; // medium teal-blue else if (sequence == 6) tech_canvas_ctx.strokeStyle = 'rgba(121, 127, 82, 0.88)'; // olive / ochre - else if (sequence == 5) tech_canvas_ctx.strokeStyle = 'rgba(138, 36, 78, 0.8)'; // wine + else if (sequence == 5) tech_canvas_ctx.strokeStyle = 'rgba(152, 40, 85, 0.88)'; // wine else if (sequence == 4) tech_canvas_ctx.strokeStyle = 'rgba(161, 227, 243, 0.8)'; // bright sky else if (sequence == 3) tech_canvas_ctx.strokeStyle = 'rgba(60, 187, 146, 0.8)'; // bronze sea spray (strong green-cyan) else if (sequence == 2) tech_canvas_ctx.strokeStyle = 'rgba(124, 108, 167, 0.95)'; // periwinkle else if (sequence == 1) tech_canvas_ctx.strokeStyle = 'rgba(223, 223, 223, 0.8)'; // white else tech_canvas_ctx.strokeStyle = 'rgba(189, 91, 79, 0.85)'; // coral / salmon - tech_canvas_ctx.lineWidth = 3; + tech_canvas_ctx.lineWidth = 2; } var node_offset = 3; @@ -291,6 +316,13 @@ function update_tech_tree() for (var tech_id in techs) { var ptech = techs[tech_id]; + const is_special = (ptech.flags[0] == TECH_SPECIAL_TECH); // specialty add-on tech + var twidth = get_tech_item_width(ptech); + var theight = get_tech_item_height(ptech); + var tfont = get_tech_item_font(ptech); + const thoriz = !is_special ? 51 : 1; + const tvert = !is_special ? 15 : 11; + if (!(tech_id+'' in reqtree) || reqtree[tech_id+''] == null) continue; var x = Math.floor(reqtree[tech_id+'']['x'] * tech_xscale)+2; //scale in X direction. @@ -298,18 +330,18 @@ function update_tech_tree() /* KNOWN TECHNOLOGY */ if (player_invention_state(client.conn.playing, ptech['id']) == TECH_KNOWN) { - - var tag = tileset_tech_graphic_tag(ptech); tech_canvas_ctx.fillStyle = KNOWN_TECH_FILL; - tech_canvas_ctx.fillRect(x-2, y-2, tech_item_width, tech_item_height); + tech_canvas_ctx.fillRect(x-2, y-2, twidth, theight); tech_canvas_ctx.strokeStyle = KNOWN_TECH_FRAME; - tech_canvas_ctx.strokeRect(x-2, y-2, tech_item_width, tech_item_height); - mapview_put_tile(tech_canvas_ctx, tag, x+1, y) + tech_canvas_ctx.strokeRect(x-2, y-2, twidth, theight); + if (!is_special) { + var tag = tileset_tech_graphic_tag(ptech); + mapview_put_tile(tech_canvas_ctx, tag, x+1, y) + } // tech names >17 overflow their boxes on mobile, so use redux font for those - if (ptech['name'].length>17) tech_canvas_ctx.font = tech_canvas_text_font_alt; - else tech_canvas_ctx.font = tech_canvas_text_font; + tech_canvas_ctx.font = tfont; tech_canvas_ctx.fillStyle = "rgba(0, 0, 0, 1)"; - tech_canvas_ctx.fillText(ptech['name'], x + 50, y + 15); + tech_canvas_ctx.fillText(ptech['name'], x + thoriz, y + tvert); if (x > maxleft) maxleft = x; @@ -321,13 +353,13 @@ function update_tech_tree() tech_canvas_ctx.lineWidth=6; tech_canvas_ctx.strokeStyle = CUR_TECH_FRAME; } else if (client.conn.playing['tech_goal'] == ptech['id']) { - tech_canvas_ctx.lineWidth=6; + tech_canvas_ctx.lineWidth=5; bgcolor = POSSIBLE_AND_FUTURE_FILL; // show as future goal but differentiate to also show tech is possible now tech_canvas_ctx.strokeStyle = FUTURE_TECH_FRAME; tech_canvas_ctx.fillStyle = 'rgb(0, 0, 0)'; } var bp = player_has_blueprints(client.conn.playing, ptech['id']); - var tag = tileset_tech_graphic_tag(ptech); + if (!is_special) var tag = tileset_tech_graphic_tag(ptech); if (bp) { tag = "a.blueprints"; if (client.conn.playing['researching'] != ptech['id']) { // No bright blue box for current research @@ -335,61 +367,59 @@ function update_tech_tree() } } tech_canvas_ctx.fillStyle = bgcolor; - tech_canvas_ctx.fillRect(x-2, y-2, tech_item_width, tech_item_height); - if (tech_canvas_ctx.lineWidth<6) { // don't override current research frame colour + tech_canvas_ctx.fillRect(x-2, y-2, twidth, theight); + if (tech_canvas_ctx.lineWidth<5) { // don't override current research frame colour tech_canvas_ctx.lineWidth=2; tech_canvas_ctx.strokeStyle = bp ? BLUEPRINT_TECH_FRAME : POSSIBLE_TECH_FRAME; } - tech_canvas_ctx.strokeRect(x-2, y-2, tech_item_width, tech_item_height); + tech_canvas_ctx.strokeRect(x-2, y-2, twidth, theight); tech_canvas_ctx.lineWidth=1; - mapview_put_tile(tech_canvas_ctx, tag, x+1, y) - + if (!is_special) { + mapview_put_tile(tech_canvas_ctx, tag, x+1, y) + } if (client.conn.playing['researching'] == ptech['id']) { tech_canvas_ctx.fillStyle = 'rgb(0, 0, 0)'; // tech names >17 overflow their boxes when bold, so use redux font for those - if (ptech['name'].length>17) tech_canvas_ctx.font = "Bold "+tech_canvas_text_font_redux; - else tech_canvas_ctx.font = "Bold " + tech_canvas_text_font; + tech_canvas_ctx.font = "Bold " + tfont; } else { // tech names >17 overflow their boxes on mobile, so use redux font for those - if (ptech['name'].length>17) tech_canvas_ctx.font = tech_canvas_text_font_alt; - else tech_canvas_ctx.font = tech_canvas_text_font; + tech_canvas_ctx.font = tfont; tech_canvas_ctx.fillStyle = 'rgb(255, 255, 255)'; } - tech_canvas_ctx.fillText(ptech['name'], x + 51, y + 16); + tech_canvas_ctx.fillText(ptech['name'], x + thoriz, y + tvert); /* UNKNOWN TECHNOLOGY. */ } else if (player_invention_state(client.conn.playing, ptech['id']) == TECH_UNKNOWN) { var bgcolor = (client.conn.playing != null && is_tech_req_for_goal(ptech['id'], client.conn.playing['tech_goal'])) ? "rgb(133, 167, 212)" : "rgb(61, 95, 130)"; if (client.conn.playing['tech_goal'] == ptech['id']) { - tech_canvas_ctx.lineWidth=6; + tech_canvas_ctx.lineWidth=5; tech_canvas_ctx.strokeStyle = FUTURE_TECH_FRAME; } - var tag = tileset_tech_graphic_tag(ptech); + if (!is_special) var tag = tileset_tech_graphic_tag(ptech); if (player_has_blueprints(client.conn.playing, ptech['id'])) { bgcolor = BLUEPRINT_TECH_FILL; tag = "a.blueprints"; } tech_canvas_ctx.fillStyle = bgcolor; - tech_canvas_ctx.fillRect(x-2, y-2, tech_item_width, tech_item_height); - if (tech_canvas_ctx.lineWidth<6) // don't override current research frame colour + tech_canvas_ctx.fillRect(x-2, y-2, twidth, theight); + if (tech_canvas_ctx.lineWidth<5) // don't override current research frame colour tech_canvas_ctx.strokeStyle = UNKNOWN_TECH_FRAME; - tech_canvas_ctx.strokeRect(x-2, y-2, tech_item_width, tech_item_height); + tech_canvas_ctx.strokeRect(x-2, y-2, twidth, theight); tech_canvas_ctx.lineWidth=1; - mapview_put_tile(tech_canvas_ctx, tag, x+1, y) - + if (!is_special) { + mapview_put_tile(tech_canvas_ctx, tag, x+1, y) + } if (client.conn.playing['tech_goal'] == ptech['id']) { tech_canvas_ctx.fillStyle = 'rgb(0, 0, 0)'; // tech names >17 overflow their boxes when bold, so use redux font for those - if (ptech['name'].length>17) tech_canvas_ctx.font = "Bold "+tech_canvas_text_font_redux; - else tech_canvas_ctx.font = "Bold " + tech_canvas_text_font; + tech_canvas_ctx.font = "Bold " + tfont; } else { tech_canvas_ctx.fillStyle = 'rgb(255, 255, 255)'; // tech names >17 overflow their boxes on mobile, so use redux font for those - if (ptech['name'].length>17) tech_canvas_ctx.font = tech_canvas_text_font_alt; - else tech_canvas_ctx.font = tech_canvas_text_font; + tech_canvas_ctx.font = tfont; } - tech_canvas_ctx.fillText(ptech['name'], x + 51, y + 16); + tech_canvas_ctx.fillText(ptech['name'], x + thoriz, y + tvert); } var tech_things = 0; @@ -408,7 +438,7 @@ function update_tech_tree() var sprite = sprites[tileset_unit_type_graphic_tag(ptype)]; if (sprite != null) { - tech_canvas_ctx.drawImage(sprite, x + 50 + ((tech_things++) * 30), y + 23, 28, 24); + tech_canvas_ctx.drawImage(sprite, x + thoriz + ((tech_things++) * 30), y + tvert+7, 28, 24); } } @@ -430,12 +460,61 @@ function update_tech_tree() var sprite = sprites[tileset_building_graphic_tag(pimpr)]; if (sprite != null) { - tech_canvas_ctx.drawImage(sprite, x + 50 + ((tech_things++) * 30), y + 23, 28, 24); + tech_canvas_ctx.drawImage(sprite, x + thoriz + ((tech_things++) * 30), y + tvert+7, 28, 24); } } } } +/************************************************************************** + Get dynamic heights, widths, font, for tech boxes. +**************************************************************************/ +function get_tech_item_width(ptech) { + + if (!ptech.boxwidth) { + const is_special = (ptech.flags[0] == TECH_SPECIAL_TECH); // "child" techs + var twidth = !is_special ? tech_item_width : tech_item_width/2; + /* If we don't know how many things this tech enables, set it */ + if (!techs[ptech.id].things) { + techs[ptech.id].things = get_improvements_from_tech(ptech.id).length; + techs[ptech.id].things += get_utypes_from_tech(ptech.id).length; + } + /* Minimize box size to needed for text and enabled prod items. */ + if (!is_special) { + var tw1 = twidth - 7 * (18-ptech.name.length); // 7px = width char + var tw2 = twidth - 28 * (5-techs[ptech.id].things); // 28px = size of an image + if (is_small_screen()) { + tw1 = twidth - 7 * (15-ptech.name.length); // 7px = width char + tw1 = tw1 < tw2 ? tw2 : tw1 // set tw1 as the greater of the two + twidth = twidth < tw1 ? tw1: twidth; // pick greater of twidth or tw1 + } else { + var twidth = tw1 < tw2 ? tw2 : tw1; // pick the greater of the 2 + } + } else { // special child tech: + var tw1 = twidth - 6 * (16-ptech.name.length); // 5px = width char + var tw2 = twidth - 28 * (3-techs[ptech.id].things); // 28px = size of an image + var twidth = tw1 < tw2 ? tw2 : tw1; // pick the greater of the 2 + } + techs[ptech.id].boxwidth = twidth; + } + + return techs[ptech.id].boxwidth; +} +function get_tech_item_height(ptech) { + const is_special = (ptech.flags[0] == TECH_SPECIAL_TECH); // special add-on specialty sub-techs are smaller + var theight = !is_special ? tech_item_height : tech_item_height * .80; // height of tech box + return theight; +} +function get_tech_item_font(ptech) { + const is_special = (ptech.flags[0] == TECH_SPECIAL_TECH); // special add-on specialty sub-techs are smaller + tfont = !is_special ? tech_canvas_text_font : tech_canvas_text_font_special;// font size of tech box (special add_on techs are smaller) + if (ptech['name'].length>17) { // possible redux for long tech names + if (!is_special) tfont = tech_canvas_text_font_redux; + else tfont = tech_canvas_text_font_special_redux; + } + return tfont; +} + /************************************************************************** Determines if the technology 'check_tech_id' is a requirement for reaching the technology 'goal_tech_id'. @@ -491,6 +570,8 @@ function update_tech_screen() { if (client_is_observer() || client.conn.playing == null) { + $("#technologies").width($(window).width() - 20); + $("#technologies").height($(window).height() - $("#technologies").offset().top - 15); show_observer_tech_dialog(); return; } @@ -538,7 +619,7 @@ function update_tech_screen() if (touch_device) $("#tech_results").css("margin-left","-22px"); $("#tech_result_text").html("" + get_advances_text(clicked_tech_id) - +" "+(is_wide_screen ? "" /*tech_help_text*/ : "") + ""); + +" "+(is_wide_screen ? "" /*tech_help_text*/ : "") + ""); $("#tech_advance_helptext").tooltip({ disabled: false, show: { delay:350, effect:"none", duration: 0 }, hide: {delay:220, effect:"none", duration: 220} @@ -557,7 +638,7 @@ function update_tech_screen() var research_help_text = html_safe(cleaned_text(techs[client.conn.playing['researching']].helptext)); $("#tech_result_text").html("" + get_advances_text(client.conn.playing['researching']) - +" "+(is_wide_screen ? "" /*research_help_text*/ : "") +""); + +" "+(is_wide_screen ? "" /*research_help_text*/ : "") +""); $("#tech_advance_helptext").tooltip({ disabled: false, show: { delay:350, effect:"none", duration: 0 }, hide: {delay:220, effect:"none", duration: 220} @@ -697,13 +778,14 @@ function tech_mapview_mouse_click(e) var x = Math.floor(reqtree[tech_id+'']['x'] * tech_xscale)+2; //scale in X direction. var y = reqtree[tech_id+'']['y']+2; + var twidth = get_tech_item_width(ptech); if (is_small_screen()) { x = x * 0.6; y = y * 0.6; } - if (tech_mouse_x > x && tech_mouse_x < x + tech_item_width + if (tech_mouse_x > x && tech_mouse_x < x + twidth && tech_mouse_y > y && tech_mouse_y < y + tech_item_height) { if (mouse_button == 2 || (mouse_button == 3 && e.altKey)) send_player_tech_goal(ptech['id']); else if (player_invention_state(client.conn.playing, ptech['id']) == TECH_PREREQS_KNOWN) { @@ -1040,7 +1122,7 @@ function update_tech_dialog_cursor() } // We caught the cursor hovering inside a tech! - if (tech_mouse_x > x && tech_mouse_x < x + tech_item_width + if (tech_mouse_x > x && tech_mouse_x < x + get_tech_item_width(ptech) && tech_mouse_y > y && tech_mouse_y < y + tech_item_height) { if (player_invention_state(client.conn.playing, ptech['id']) == TECH_PREREQS_KNOWN) { tech_canvas.style.cursor = "pointer"; @@ -1095,17 +1177,63 @@ function show_observer_tech_dialog() { $("#tech_info_box").hide(); $("#tech_canvas").hide(); - var msg = "

Research

"; + var msg = "

Global Technology Report

"; + msg += "" for (var player_id in players) { - var pplayer = players[player_id]; - var pname = pplayer['name']; - var pr = research_get(pplayer); - if (pr == null) continue; - - var researching = pr['researching']; - if (techs[researching] != null) { - msg += pname + ": " + techs[researching]['name'] + "
"; + let pplayer = players[player_id]; + if (!pplayer.is_alive) continue; + let bulb_sum = 0; + // Start Player row + msg += ""; + // Name + msg += ""; + // Nation + msg += ""; + + // Most advanced tech + let highest_tech_name = null; + let highest_tech_cost = 0; + for (var tech_id in techs) { + if (player_invention_state(pplayer, tech_id) == TECH_KNOWN) { + if (techs[tech_id].cost > highest_tech_cost) { + highest_tech_name = techs[tech_id].name; + highest_tech_cost = techs[tech_id].cost; + } + if (techs[tech_id].cost > 0) bulb_sum += techs[tech_id].cost; + } + } + if (highest_tech_name) { + msg += ""; + } else { + msg += "" + } + + // Current research + let researching = pplayer.researching; + if (!techs[researching]) { + if (techs[pplayer['tech_goal']] && techs[pplayer['tech_goal']].name) { // No current research but has a real future goal + msg += "" + } else { + msg += "" + } + } else { + if (techs[researching].name) { // A legitimate tech + msg += "" + } else { + msg += "" + } } + + // Bulb sum + if (pplayer.bulbs_researched) bulb_sum += pplayer.bulbs_researched; + msg += "" + // End Player row + msg += ""; } $("#technologies").html(msg); $("#technologies").css("color", "#dcb"); diff --git a/freeciv-web/src/main/webapp/javascript/tile.js b/freeciv-web/src/main/webapp/javascript/tile.js index abe6f0e3f..0a92b8c0e 100644 --- a/freeciv-web/src/main/webapp/javascript/tile.js +++ b/freeciv-web/src/main/webapp/javascript/tile.js @@ -65,6 +65,34 @@ function tile_resource(tile) return null; } +/************************************************************************** + Returns true iff the specified tile has an adjacent tile which contains + the specified extra. The 'cardinal' parameter tells us to only look + for CAdjacent tiles. +**************************************************************************/ +function is_extra_adjacent(ptile, extra, cardinal) +{ + if (ptile == null || extra == null) return false; + + for (dir = 0; dir < 8; dir++) { + + if (cardinal && !is_cardinal_dir(dir)) { + continue; + } + + let tile1 = mapstep(ptile, dir); + + if (tile1 != null && tile_get_known(tile1) != TILE_UNKNOWN) { + if (tile_has_extra(tile1, extra)) { + return true; + } + } + + } + + return false; +} + /************************************************************************//** Check if tile contains an extra type that claim territory ****************************************************************************/ @@ -197,19 +225,19 @@ function improve_tile_info_dialog(message) added_text += "Irrigate:" + Math.ceil(ttype['irrigation_time']/wt)+"" if (ttype['irrigation_food_incr']) added_text+= " (+"+ttype['irrigation_food_incr']+")"; } - if (ttype['irrigation_result'] && ttype['irrigation_result'] != tindex && ttype['irrigation_result'] != tinvalid) + if (ttype['irrigation_result'] != null && ttype['irrigation_result'] != tindex && ttype['irrigation_result'] != tinvalid) added_text+="➡"+terrains[ttype['irrigation_result']]['name'] if (ttype['mining_time']) { added_text += "   Mine:" + Math.ceil(ttype['mining_time']/wt)+""; if (ttype['mining_shield_incr']) added_text+= " (+"+ttype['mining_shield_incr']+")"; } - if (ttype['mining_result'] && ttype['mining_result'] != tindex && ttype['mining_result'] != tinvalid) + if (ttype['mining_result'] != null && ttype['mining_result'] != tindex && ttype['mining_result'] != tinvalid) added_text+="➡"+terrains[ttype['mining_result']]['name'] if (ttype['transform_time']) added_text += "   Transform:" + Math.ceil(ttype['transform_time']/wt)+""; - if (ttype['transform_result'] && ttype['transform_result'] != tindex && ttype['transform_result'] != tinvalid) + if (ttype['transform_result'] != null && ttype['transform_result'] != tindex && ttype['transform_result'] != tinvalid) added_text+="➡"+terrains[ttype['transform_result']]['name'] if (ttype['road_time']) diff --git a/freeciv-web/src/main/webapp/javascript/tracklist.js b/freeciv-web/src/main/webapp/javascript/tracklist.js index 1e65f8a36..ff68cd867 100644 --- a/freeciv-web/src/main/webapp/javascript/tracklist.js +++ b/freeciv-web/src/main/webapp/javascript/tracklist.js @@ -89,7 +89,9 @@ from the project and be non-essential to the function of the Instance. "breaks/BoysEye", "breaks/30secondbreak", "breaks/30secondbreak", - "breaks/ColdWindBreak" + "breaks/ColdWindBreak", + "breaks/StreetOfDeviants", + "breaks/DeeperSilence45s" ], "brk_style2": // classical * [ @@ -115,7 +117,9 @@ from the project and be non-essential to the function of the Instance. "breaks/BoysEye", "breaks/30secondbreak", "breaks/30secondbreak", - "breaks/ColdWindBreak" + "breaks/ColdWindBreak", + "breaks/StreetOfDeviants", + "breaks/DeeperSilence45s" ], "brk_style3": // tropical * [ @@ -138,7 +142,9 @@ from the project and be non-essential to the function of the Instance. "breaks/BoysEye", "breaks/30secondbreak", "breaks/30secondbreak", - "breaks/ColdWindBreak" + "breaks/ColdWindBreak", + "breaks/StreetOfDeviants", + "breaks/DeeperSilence45s" ], "brk_style4": // asian * [ @@ -164,7 +170,9 @@ from the project and be non-essential to the function of the Instance. "breaks/BoysEye", "breaks/30secondbreak", "breaks/30secondbreak", - "breaks/ColdWindBreak" + "breaks/ColdWindBreak", + "breaks/StreetOfDeviants", + "breaks/DeeperSilence45s" ], "brk_style5": // babylonian * [ @@ -188,7 +196,10 @@ from the project and be non-essential to the function of the Instance. "breaks/30secondbreak", "breaks/30secondbreak", "breaks/ColdWindBreak", - "middle/AlKadir" + "middle/AlKadir", + "breaks/StreetOfDeviants", + "breaks/DeeperSilence45s", + "breaks/Homayoun" ], "brk_style6": // celtic * [ @@ -210,7 +221,9 @@ from the project and be non-essential to the function of the Instance. "breaks/BoysEye", "breaks/30secondbreak", "breaks/30secondbreak", - "breaks/ColdWindBreak" + "breaks/ColdWindBreak", + "breaks/StreetOfDeviants", + "breaks/DeeperSilence45s" ], "tribal": [ @@ -263,11 +276,36 @@ from the project and be non-essential to the function of the Instance. "tribal/Humani", "tribal/Origins", "tribal/Echolalia", - "tribal/MotherTongue" + "tribal/MotherTongue", + "tribal/MossCarpetSkyBlanket", + "tribal/ProfligateEarth", + "tribal/Raku", + "tribal/VoiceOfRust", + "tribal/SoftRainsFall", + "tribal/Transpiration", + "tribal/CorvidCollections", + "tribal/AerialOnWarmSeas", + "tribal/NeverHunger", + "tribal/WhatWeLeftBehind", + "tribal/SeekingEden", + "tribal/TheGateIsOpen", + "tribal/UndulatingTerrain", + "tribal/Artifacts", + "tribal/ClayWoodBoneDirt", + "tribal/InTheEyesOfTheSpirit", + "tribal/TheFaceInTheFire", + "tribal/Hunter", + "tribal/ErodingColumns", + "tribal/FlowStone", + "tribal/SuonoIpogeo", + "tribal/UnderwaterFields", + "tribal/EtherealAbyss", + "tribal/TowerOfSet1", + "tribal/FromPastToPresent", + "tribal/Hunter2" ], "ancient": [ - "tribal/anvildrumintro", "tribal/Foreigner", "ancient/Intro1", "ancient/Intro3", @@ -300,7 +338,6 @@ from the project and be non-essential to the function of the Instance. "ancient/xMusic15", "ancient/xwon", "ancient/xwon2", - "ancient/scrolls", "ancient/SeaDragon", "ancient/xwon3", "ancient/WarDrums_Early", @@ -308,7 +345,6 @@ from the project and be non-essential to the function of the Instance. "ancient/AncientSoundtrack1", "ancient/AncientSoundtrack3", "ancient/AncientSoundtrack4", - "ancient/TowerOfSet", "ancient/Hovern", "ancient/Walrus", "ancient/Attila", @@ -336,13 +372,72 @@ from the project and be non-essential to the function of the Instance. "ancient/HouseHur", "ancient/EnterJerusalem", "ancient/ArriusParty", + "tribal/anvildrumintro", + "ancient/scrolls", "ancient/Orgy", + "ancient/TowerOfSet", + "ancient/AnvilOfCrom", // + "ancient/AtlanteanSword", + "ancient/BattleOfTheMounds1", + "ancient/BattleOfTheMounds2", + "ancient/Byzantium", + "ancient/Capture", + "ancient/Cleopatra", + "ancient/ColumnOfSadnessWheelOfPain", + "ancient/Defilers", + "ancient/DisciplineOfSteelFreedomCouncil", + "ancient/EchoesOfRomanRuins", + "ancient/FuneralPyre", + "ancient/GiftOfFury1", + "ancient/HallOfKingOsric", + "ancient/Indulgence", + "ancient/Kitchen1", + "ancient/MountainOfPowerProcession", + "ancient/Orgy1", + "ancient/PitFights", + "ancient/RiddleOfSteelRidersOfDoom", + "ancient/TheologyCivilization", + "ancient/TowerOfSet2", + "ancient/WarmWelcome", + "ancient/TowerOfSetSnakeAttack", + "ancient/WelcomeToKostantiniyye", + "ancient/WolfWitch", + "ancient/RohanSuite", "ancient/Hector", "ancient/Sakura", "ancient/TombHorus", "ancient/TombOsiris", "ancient/TombIsis", - "ancient/TombAnubis" + "ancient/TombAnubis", + "ancient/SongOfSophia", + "ancient/RebirthsPortalUnveiled", + "ancient/Saraghaz", + "ancient/BeamOfSunlight", + "ancient/IntroDiAde", + "ancient/EnteringIntimateFragranceOfBeatitude", + "ancient/Bija", + "ancient/Bija2", + "ancient/RoadToWirikuta", + "ancient/SpiritSword", + "ancient/DoYouRemember", + "ancient/Cantiga384AlfonsoX", + "ancient/CantigasDeSantaMaria1", + "ancient/CantigasDeSantaMaria4", + "ancient/ChachanehTsaghadzoreh", + "ancient/Ecstasy", + "ancient/FoliadaAlfonsoX", + "ancient/Ghamangiz", + "ancient/Jamedaran", + "ancient/Kord-E-Bayat", + "ancient/LamentoDiTristano", + "ancient/SoloUd", + "ancient/LyreOfMegiddo", + "ancient/VasnMeroPerkutian", + "ancient/PansisAncientGreekLyreRuiFuBendir", + "ancient/Illyricum", + "ancient/CarthageIntroRomeTW_OST", + "ancient/AetasRomana", + "ancient/EasternIntroRomeTW_OST" ], "middle": [ @@ -420,6 +515,21 @@ from the project and be non-essential to the function of the Instance. "middle/OldTree", "middle/Summertide", "middle/TimberTown", + "middle/RaptureRecall", + "middle/Promentory", + "middle/SpanishDance2", + "middle/TearsOfMuses", + "middle/Tavern", + "middle/Tavern2", + "middle/SilverSword", + "middle/CantigasDeSantaMaria2", + "middle/CantigasDeSantaMaria3", + "middle/FoliasGalegasMurcia", + "middle/PraetoriusDancesTerpsichore", + "middle/MiguelRinconViseeKapsberger", + "middle/OmwoldonSamhain", + "middle/PlayfordDance", + "middle/RaghseChoupani" ], "colonial": [ @@ -475,10 +585,26 @@ from the project and be non-essential to the function of the Instance. "industrial/Coronation", "industrial/Esther", "industrial/Judea", - "industrial/Eventide" + "industrial/Eventide", + "colonial/LaCatedral2", + "colonial/HesAPirate", + "colonial/HighlandSpirit", + "colonial/HiddenFalls", + "colonial/SongOfTimeAndStore", + "colonial/Wilderness", + "colonial/Brothers", + "colonial/YradierLaPaloma", + "colonial/ChoroDaSaudade", + "colonial/LegendaryGuardian", + "colonial/lArpeggiata", + "colonial/Elegie", + "colonial/TheLeavingTheSearch", + "colonial/CanariosKapsberger", + "colonial/DreamQuest" ], "industrial": [ + "ancient/FuneralPyre", "colonial/SerenadeVW", "colonial/DarkeFantasy", "industrial/into_the_shadows", // GPL in AGPL @@ -524,7 +650,17 @@ from the project and be non-essential to the function of the Instance. "industrial/Nightfall", "industrial/SolentVW", "industrial/Tallis1VW", - "industrial/Tallis2VW" + "industrial/Tallis2VW", + "industrial/GenerosityOfSolitude1", + "industrial/NorthCountrySketchesWinter", + "industrial/NorthCountrySketches3", + "industrial/NorthCountrySketches1", + "industrial/HeadChop", + "industrial/OrphansOfDoomAwakening", + "industrial/TheSnakeInfidels", + "industrial/TreeOfWoeRecovery", + "industrial/Wifeing", + "industrial/DuelingWizards" ], "modern": [ @@ -539,6 +675,7 @@ from the project and be non-essential to the function of the Instance. "tribal/CeremonyStrata", "tribal/Mammoth", "tribal/LunaStrata", + "tribal/UnderwaterFields", "ancient/SeaDragon", "modern/Stellar", "modern/Chevaliers", @@ -645,7 +782,18 @@ from the project and be non-essential to the function of the Instance. "modern/HeartOffense", "modern/Mauvais", "modern/ScaredDark", - "modern/TwoRun" + "modern/TwoRun", + "modern/Rhizome", + "modern/AfterUs", + "modern/MeetingFaceToFace", + "modern/GlassMishimaQuartet", + "modern/MemoriesOfWandering2", + "modern/MemoriesOfHome", + "modern/Erinacea", + "modern/Flatlands", + "modern/OutOfSource", + "modern/DistantTraveler", + "modern/BattleOfTheMounds3", + "modern/BattleOfTheMounds3Original" ] }; - \ No newline at end of file diff --git a/freeciv-web/src/main/webapp/javascript/unit.js b/freeciv-web/src/main/webapp/javascript/unit.js index 281642150..bc1d938b4 100644 --- a/freeciv-web/src/main/webapp/javascript/unit.js +++ b/freeciv-web/src/main/webapp/javascript/unit.js @@ -17,6 +17,7 @@ ***********************************************************************/ +const ACTIVITY_FACTOR = 100; var units = {}; @@ -26,21 +27,28 @@ var units = {}; var unit_pillage_sound_delay_times = { "Dive Bomber": 3000, "Ground Strike Fighter": 300, + "Stealth Bomber": 300, "Jet Bomber": 300, "Armor": 400, "Armor II": 400 }; var unit_bombard_attack_names = { - "Phalanx": "Rumble Attack", - "Archers": "Volley Attack", - "Legion": "Pilum Assult", - "Siege Ram": "Ram Fortress", - "Fanatics": "Skirmish Assault", - "Zealots": "Skirmish Assault", - "Marines": "Bazooka Attack", - "Zeppelin": "Bomb", - "Battleship": "Bombard" + "Phalanx": "Rumble Attack", + "Archers": "Volley Attack", + "Legion": "Pilum Assult", + "Siege Ram": "Ram Fortress", + "Fanatics": "Skirmish Assault", + "Zealots": "Skirmish Assault", + "Marines": "Bazooka Attack", + "Zeppelin": "Bomb", + "Battleship": "Bombard", + "Ballista": "Ranged Attack", + "Catapult": "Bombard", + "Cannon": "Bombard", + "Artillery": "Bombard", + "Howitzer": "Bombard", + "Magnum Turret": "Bombard" }; // Determines if victory by this unit shows crossed swords or gunpowder explosion. @@ -55,7 +63,9 @@ var units_pregunpowder = [ "Elephants", "Knights", "Crusaders", -"Catapult", +//"Catapult", // explosion looks better since it's non-melee +//"Ballista", +"Scout", "Explorer", "Tribesmen", "Well-Digger", @@ -78,19 +88,6 @@ var ANIM_STEPS = 8; var anim_units_max = 30; var anim_units_count = 0; -/* The unit_orders enum from unit.h */ -var ORDER_MOVE = 0; -var ORDER_ACTIVITY = 1; -var ORDER_FULL_MP = 2; -var ORDER_ACTION_MOVE = 3; -var ORDER_PERFORM_ACTION = 4; -var ORDER_LAST = 5; - -/* The unit_ss_data_type enum from unit.h */ -var USSDT_QUEUE = 0; -var USSDT_UNQUEUE = 1; -var USSDT_BATTLE_GROUP = 2; - /**************************************************************************** ... ****************************************************************************/ @@ -117,6 +114,7 @@ function client_remove_unit(punit) if (unit_is_in_focus(punit)) { current_focus = []; + if (renderer == RENDERER_WEBGL) webgl_clear_unit_focus(); } delete units[punit['id']]; @@ -270,8 +268,7 @@ function unit_has_cargo_room(punit) { } /************************************************************************** - * Return true if this unit can DEBOARD. TODO: needs renaming since - * "unload" now means "transporter ejecting its cargo" + * Return true if this unit can DEBOARD. * * This function is currently hard-coded as a placeholder for proper * ruleset actionenablers, but has dual use as logic of when to show @@ -279,7 +276,7 @@ function unit_has_cargo_room(punit) { * are in all rulesets AND 2) client can somehow test the actionenabler * legality itself. **************************************************************************/ -function unit_can_do_unload(punit) +function unit_can_deboard(punit) { if (!punit) return false; var rules = ruleset_control['name']; @@ -305,7 +302,16 @@ function unit_can_do_unload(punit) //****************************************************************** */ // COMMON if (pcity) return true; - if (utype_has_flag(ptype, UTYF_MARINES) && !is_ocean_tile(ptile)) return true; + /* UTYF_MARINES flag is a mishmash intersection of old capabilities of Marines programmed first as a hard-coded server flag, + * next migrated over to a custom ruleset flag, and now is a confused holdover for backward compatibility to older rulesets. + * The whole thing is getting deprecated so it can be split into several flags handling distinctly DIFFERENT behaviours instead + * of all together. Therefore the line below is commented out and we'll have to see what breaks or needs changing as we + * extricate ourselves from that legacy mess. The line below that is the new handling. May change behaviour specifically for AAA + * in MP2A-C, though not necessarily in a bad way (since AAA acting like full Marines when it comes to transports is a bad thing.) + //if (utype_has_flag(ptype, UTYF_MARINES) && !is_ocean_tile(ptile)) return true; + */ + if (ptype.rule_name == "Marines" && !is_ocean_tile(ptile)) return true; + if ((typeof EXTRA_NAVALBASE !== "undefined") && tile_has_extra(ptile, EXTRA_NAVALBASE)) return true; if (pclass == "Air") return true; if (pclass == "AirProtect") return true; @@ -315,6 +321,10 @@ function unit_can_do_unload(punit) if (pclass == "Helicopter") return true; if (pclass == "Missile") return true; + if (pclass.startsWith("Land")) { + if (is_ocean_tile(ptile)) return false; + } + // currently decided it can unload in airbase also, below. //if (pclass == "Bomb") return false; // only allowed in city, handled above. @@ -333,14 +343,14 @@ function unit_can_do_unload(punit) } // Brava onward: if (tclass.rule_name == "LandRail" - || tclass.rule_name == "LandRoad") { // Foot soldiers can unload from Train/Truck on any Base or Quay. + || tclass.rule_name == "LandRoad") { // Foot soldiers can deboard from Train/Truck on any Base or Quay. if (tile_has_extra(ptile, EXTRA_AIRBASE)) return true; if (quay_rules && tile_has_extra(ptile, EXTRA_QUAY)) return true; if (typeof EXTRA_FORT !== 'undefined' && tile_has_extra(ptile, EXTRA_FORT)) return true; if (tile_has_extra(ptile, EXTRA_FORTRESS)) return true; if ((typeof EXTRA_CASTLE !== "undefined") && tile_has_extra(ptile, EXTRA_CASTLE)) return true; if ((typeof EXTRA_BUNKER !== "undefined") && tile_has_extra(ptile, EXTRA_BUNKER)) return true; - return false; // City already unloaded; Marines, Balloons, and AAA already got off higher above. + return false; // City already unloaded; Marines and Balloons already got off higher above. } if (tile_has_extra(ptile, EXTRA_QUAY)) return true; if (tile_has_extra(ptile, EXTRA_RIVER)) return false; @@ -354,7 +364,7 @@ function unit_can_do_unload(punit) The server won't tell us for sure. Knowing the unit CAN'T load is a pragmatic way to prevent long GUI lists of invalid transport candidates to load onto. It generalises what's true for the mainstream rulesets. - It shouldn't ever be called for non-mainstream rulesets. + It should be circumvented/ignored in non-mainstream rulesets. **************************************************************************/ function unit_could_possibly_load(punit, ptype, ttype, tclass) { @@ -362,13 +372,38 @@ function unit_could_possibly_load(punit, ptype, ttype, tclass) if (!punit || !ptype || !ttype || !tclass) return false; var pclass = get_unit_class_name(punit); + var ptile = tiles[punit['tile']]; + var can_load = false; + //console.log(" pclass=="+pclass); + // In MP2D, only special classes can board/load without moves left: + if (client_rules_flag[CRF_MP2_D]) { + if (punit.movesleft <= 0) { + if ( ptype.rule_name == "Marines" + || pclass == "Air" + || pclass == "AirProtect" + || pclass == "Air_High_Altitude" + || pclass == "Missile" + || pclass == "Cargo" + || pclass == "Balloon" + || pclass == "Zeppelin" + || pclass == "Helicopter") { + + // These classes may proceed to see if they may board + } else { + return false; // No other classes can board with 0 moves left. + } + } + // Can't get on a Trawler if you moved this turn: + if (pclass == "Sea" || pclass == "Submarine") { + if (unit_has_moved(punit)) return false; + } + } + // Transported units can't swap transports except under some conditions: // TO DO: when actionenabler_load is in server, we can put all this in game.ruleset actionenablers. if ( (pclass.startsWith("Land") || pclass=="Cargo") && punit['transported']) { - var ptile = tiles[punit['tile']]; - var can_load = false; var from_unit = units[punit['transported_by']]; // unit currently transporting the cargo who wants to swap transports var from_class = get_unit_class(from_unit); // unit_class of the transport currently transporting the cargo @@ -376,7 +411,7 @@ function unit_could_possibly_load(punit, ptype, ttype, tclass) // Can "transport swap" where 1) unloading then loading again is legal anyway (cities, naval bases, quays) ... if (tile_city(ptile)) can_load = true; - else if (unit_can_do_unload(punit)) can_load = true; // Whenever unloading is already legal, don't force micro-managing an extra step to unload. + else if (unit_can_deboard(punit)) can_load = true; // When deboarding is legal, don't force micro-managing an extra step to unload. //commented out: e.g., Riflemen can't necessarily get off a Heli on a Quay. //else if (typeof EXTRA_NAVALBASE !== undefined && tile_has_extra(EXTRA_NAVALBASE)) can_load = true; //else if (client_rules_flag[CRF_EXTRA_QUAY] && tile_has_extra(EXTRA_QUAY)) can_load=true; @@ -410,14 +445,23 @@ function unit_could_possibly_load(punit, ptype, ttype, tclass) } //////////// End of handling for already-transported units doing a transport-swap /////////////////////// + //console.log("2, can_load == "+can_load); + // Disqualify all units who can never be cargo. if (pclass == "Sea" || + pclass == "LandImmobile" || pclass == "RiverShip" || pclass == "Submarine" || pclass == "Trireme" || pclass == "LandRail" || pclass == "Space") { - return false; + // Trawler is exception who can "rescue tug" sea units. + if (ttype.name == "Trawler") { + if (pclass != "LandRail" && pclass != "Space") { + return true; + } + } + return false; } // Disqualify all units who can never be transports @@ -451,14 +495,25 @@ function unit_could_possibly_load(punit, ptype, ttype, tclass) if (!ttype.name.includes("Bomber") && tclass.rule_name != "LandRail" && tclass.rule_name != "LandRoad" ) return false; - if (ttype.cargo[0]==0) return false; // Dive-Bomber or Bomber who can't carry bombs. + if (ttype.cargo[0]==0) return false; // any "Bomber" who can't carry bombs. } else if (pclass == "Missile") { if (ttype.name=="Missile Destroyer" || ttype.name=="AEGIS Cruiser" || - ttype.name=="Submarine" || + (tclass.rule_name=="Submarine" && !client_rules_flag[CRF_MP2_D]) || + ttype.name=="Missile Submarine" || ttype.name=="Mobile SAM" || - ttype.name=="Carrier") return true; + ttype.name=="Carrier") { + //starting in MP2D missiles must load in a city or be a transport swap + if (client_rules_flag[CRF_MP2_D]) { + if (tile_city(ptile)) return true; + else if (can_load) return true; + else return false; + } + //pre-MP2D: missiles can board on the qualifying transport types above + return true; + } + //the transport type is one who can't carry missiles: return false; } else if (pclass.startsWith("Land")) { // Land, LandNoKill, LandAirSea, LandRail, LandRoad @@ -466,7 +521,7 @@ function unit_could_possibly_load(punit, ptype, ttype, tclass) if (tclass.rule_name == "Land") return false; // can't load on Caravans, the only Land class with cargo capacity. if (tclass.rule_name == "Submarine") return false; if (tclass.rule_name == "LandRail" || tclass.rule_name == "LandRoad") { - if (utype_real_base_move_rate(ptype) >= 3 * SINGLE_MOVE) return false; // Rail equality: units with <3 moves can use trains + if (utype_real_base_move_rate(ptype) >= 3 * SINGLE_MOVE) return false; // Equality: units with <3 moves can use wagon/train/truck //if (!unit_has_type_flag(punit, UTYF_FOOTSOLDIER)) return false; //used to be foot only, now it's line above } if (tclass.rule_name == "Air") { @@ -549,18 +604,19 @@ function move_points_text(moves, make_fraction) // change 3/6 to 1/2, 3/9 to 1/3, etc: numerator = Math.floor(moves % SINGLE_MOVE); denominator = SINGLE_MOVE; - + var simplified_fraction = fraction_reduce(numerator, denominator); numerator = simplified_fraction.numerator; denominator = simplified_fraction.denominator; - - if (Math.floor(moves / SINGLE_MOVE) > 0) { + if (Math.floor(moves / SINGLE_MOVE) > 0 && numerator>0) { result = "" + Math.floor(moves / SINGLE_MOVE) + spacer + numerator + div_symbol + denominator; - } else { + } else if (numerator>0) { result = "" + numerator + div_symbol + denominator; + } else { + result = Math.floor(moves / SINGLE_MOVE); } } else { result = Math.floor(moves / SINGLE_MOVE); @@ -602,7 +658,7 @@ function update_unit_anim_list(old_unit, new_unit) if (anim_units_count > anim_units_max) return; - if (!is_unit_visible(new_unit)) return; + if (renderer == RENDERER_2DCANVAS && !is_unit_visible(new_unit)) return; if (old_unit['anim_list'] == null) old_unit['anim_list'] = []; @@ -648,6 +704,12 @@ function get_unit_anim_offset(punit) { var offset = {}; + if (renderer == RENDERER_WEBGL) { + offset['x'] = 0; + offset['y'] = 0; + return offset; + } + if (punit['anim_list'] != null && punit['anim_list'].length >= 2) { var anim_tuple_src = punit['anim_list'][0]; var anim_tuple_dst = punit['anim_list'][1]; @@ -743,6 +805,7 @@ function get_unit_homecity_name(punit) function is_unit_visible(punit) { if (punit == null || punit['tile'] == null) return false; + if (renderer == RENDERER_WEBGL) return false; // not supported by 3D version. var u_tile = index_to_tile(punit['tile']); var r = map_to_gui_pos(u_tile['x'], u_tile['y']); @@ -891,6 +954,9 @@ function get_unit_city_info(punit, plaintext) case ACTIVITY_FORTIFIED: result += "\nActivity: FORTIFIED"; break; + case ACTIVITY_VIGIL: + result += "\nActivity: VIGIL"; + break; case ACTIVITY_FORTIFYING: result += "\nActivity: FORTIFYING"; break; @@ -933,6 +999,15 @@ function get_unit_city_info(punit, plaintext) } } + if (punit['activity_count']) { + const is_2x_rules = unit_types[0].move_rate / SINGLE_MOVE; // in 2x rules, 1 Worker-Turn = 2 work-units + var work = punit.activity_count / is_2x_rules; + var plural = (work / ACTIVITY_FACTOR) > (1+1/SINGLE_MOVE) ? "s" : "" + result += "\nWork Done: " + + move_points_text(work * SINGLE_MOVE / ACTIVITY_FACTOR, true) + + " unit"+plural; + } + result += "\n"; // Space for separating key stats //VETERAN LEVEL @@ -991,7 +1066,8 @@ function get_what_can_unit_pillage_from(punit, ptile) if (ptype['name'] != "Ground Strike Fighter" && ptype['name'] != "Dive Bomber" && ptype['name'] != "Jet Bomber" - && ptype['name'] != "Strategic Bomber" + && ptype['name'] != "Strategic Bomber" + && ptype['name'] != "Stealth Bomber" ) { return targets; } @@ -1300,7 +1376,9 @@ function utype_get_extra_stats(ptype) { pstats.iPillage_random_targets = (BB & 0b11000000000) >> 9; // Bit 11-15: # of rounds of Bombard retaliation pstats.bombard_retaliate_rounds = - (BB & 0b11111100000000000) >> 11; + (BB & 0b1111100000000000) >> 11; + // Bit 16-18: # of max attacks per turn + pstats.max_attacks = (BB & 0b1110000000000000000) >> 16; /* Adjustments of the raw encoded values to match their purpose: */ diff --git a/freeciv-web/src/main/webapp/javascript/unittype.js b/freeciv-web/src/main/webapp/javascript/unittype.js index 3dcd0c4eb..4961cefa8 100644 --- a/freeciv-web/src/main/webapp/javascript/unittype.js +++ b/freeciv-web/src/main/webapp/javascript/unittype.js @@ -51,9 +51,13 @@ const UCF_USER_FLAG_10 = 21; const UCF_USER_FLAG_11 = 22; const UCF_USER_FLAG_12 = 23; // Custom unit class flags (MP2 sequence/order; TO DO: universalize/uniform order in other rules) -const UCF_AIRLIFTABLE = UCF_USER_FLAG_1; -const UCF_BORDERPOLICE = UCF_USER_FLAG_2; -const UCF_ATTACK_FROM_NON_NATIVE = UCF_USER_FLAG_3; +const UCF_ATTACK_FROM_NON_NATIVE = UCF_USER_FLAG_1; +const UCF_MISSILE = UCF_USER_FLAG_2; +const UCF_CANPILLAGE = UCF_USER_FLAG_3 +const UCF_AIRLIFTABLE = UCF_USER_FLAG_4; +const UCF_BORDERPOLICE = UCF_USER_FLAG_5; +const UCF_CARGO_RESTRAINED = UCF_USER_FLAG_6; +const UCF_WATER_VESSEL = UCF_USER_FLAG_7; // Unit flags const UTYF_CANT_FORTIFY = 0; /* Unable to Fortify */ @@ -90,45 +94,62 @@ const UTYF_NEWCITY_GAMES_ONLY = 29; /* Unit can't be built in scenarios wh const UTYF_CANESCAPE = 30; /* 50% chance to escape when killstack occours if more moves remaining than attacker */ const UTYF_CANKILLESCAPING = 31; /* Can kill escaping units */ const UTYF_NEVER_BLOCKED = 32; /* Overrides unreachable_protects server setting for attacker */ - /* some of these USER_FLAG may be mis-aligned, some of these may have hard-coded behaviour*/ -const UTYF_USER_FLAG_1 = 33; /* Reserved for replacing Shield2Gold as flag for using multiple city_build_slots */ -const UTYF_USER_FLAG_2 = 34; /* Can make hideouts */ -const UTYF_USER_FLAG_3 = 35; /* Will never autoattack */ -const UTYF_USER_FLAG_4 = 36; /* Transport Defender: will defend stack as cargo even on non-native tiles FLAG=34 on server */ -const UTYF_USER_FLAG_5 = 37; /* Non-Mil Attack - as NonMil can enter Peace tiles, but if not at Peace, can attack e.g., Trireme */ -const UTYF_USER_FLAG_6 = 38; -const UTYF_USER_FLAG_7 = 39; -const UTYF_USER_FLAG_8 = 40; -const UTYF_USER_FLAG_9 = 41; -const UTYF_USER_FLAG_10 = 42; -const UTYF_USER_FLAG_11 = 43; -const UTYF_USER_FLAG_12 = 44; -const UTYF_USER_FLAG_13 = 45; -const UTYF_USER_FLAG_14 = 46; -const UTYF_USER_FLAG_15 = 47; -const UTYF_USER_FLAG_16 = 48; -const UTYF_USER_FLAG_17 = 49; -const UTYF_USER_FLAG_18 = 50; -const UTYF_USER_FLAG_19 = 51; -const UTYF_USER_FLAG_20 = 52; -const UTYF_USER_FLAG_21 = 53; -const UTYF_USER_FLAG_22 = 54; -const UTYF_USER_FLAG_23 = 55; -const UTYF_USER_FLAG_24 = 56; -const UTYF_USER_FLAG_25 = 57; -const UTYF_USER_FLAG_26 = 58; -const UTYF_USER_FLAG_27 = 59; -const UTYF_USER_FLAG_28 = 60; -const UTYF_USER_FLAG_29 = 61; -const UTYF_USER_FLAG_30 = 62; -const UTYF_USER_FLAG_31 = 63; -const UTYF_USER_FLAG_32 = 64; -const UTYF_USER_FLAG_33 = 65; -const UTYF_USER_FLAG_34 = 66; -const UTYF_USER_FLAG_35 = 67; -const UTYF_USER_FLAG_36 = 68; -const UTYF_USER_FLAG_37 = 69; -const UTYF_USER_FLAG_38 = 70; +const UTYF_MULTISLOT = 33; /* if server setting slot_control is ON, unit types with this flag can use extra city_build_slots*/ +const UTYF_TRANSPORTDEFENDER = 34; /* Unit can always defend while transported, even on non-native terrain */ +const UTYF_SENTRYALWAYS = 35; /* These units always behave as sentry (e.g. fortified snipers, air reconnaissance units who + can't sentry because !refuel tile, etc.) */ +const UTYF_NONPROVOKEVIGIL = 36; /* will attack non-provoking units on vigil */ +const UTYF_RESERVED1 = 36; +const UTYF_RESERVED2 = 37; /* RESERVED for future use */ +const UTYF_RESERVED3 = 38; + + +const UTYF_USER_FLAG_1 = 39; // Airbase: can build airbases +const UTYF_USER_FLAG_2 = 40; // Transform: can transform terrain +const UTYF_USER_FLAG_3 = 41; // CanRoad: Able to build roads +const UTYF_USER_FLAG_4 = 42; // CanFortress: can build forts/fortresses +const UTYF_USER_FLAG_5 = 43; // Bombarder (SUA) +const UTYF_USER_FLAG_6 = 44; // AirAttacker +const UTYF_USER_FLAG_7 = 45; // Horse +const UTYF_USER_FLAG_8 = 46; // FootSoldier +const UTYF_USER_FLAG_9 = 47; // Helicopter +const UTYF_USER_FLAG_10 = 48; // Submarine +const UTYF_USER_FLAG_11 = 49; // Unbribable +const UTYF_USER_FLAG_12 = 50; // Traderoute +const UTYF_USER_FLAG_13 = 51; // HelpWonder +const UTYF_USER_FLAG_14 = 52; // Capturer +const UTYF_USER_FLAG_15 = 53; // Capturable +const UTYF_USER_FLAG_16 = 54; // Cities - can found cities +const UTYF_USER_FLAG_17 = 55; // AddToCity - can add pop to city +const UTYF_USER_FLAG_18 = 56; // Nuclear +const UTYF_USER_FLAG_19 = 57; // Missile +const UTYF_USER_FLAG_20 = 58; // Well-Digger +const UTYF_USER_FLAG_21 = 59; // Infra +const UTYF_USER_FLAG_22 = 60; // Proletarian +const UTYF_USER_FLAG_23 = 61; // Paratroopers +const UTYF_USER_FLAG_24 = 62; // Marines (thru MP2C), "AttackNonNative" (MP2D onward) +const UTYF_USER_FLAG_25 = 63; // Expellable +const UTYF_USER_FLAG_26 = 64; // AirProtector - unreachable and can protect its tile from units unable to reach it +const UTYF_USER_FLAG_27 = 65; // CantReachAir - unable to attack air units +const UTYF_USER_FLAG_28 = 66; // FortBuster - defending forts get no bonus, 33% attack bonus vs. Fortress +const UTYF_USER_FLAG_29 = 67; // FortressBuster - defending fortresses get no bonus +const UTYF_USER_FLAG_30 = 68; // AntiAir - Anti-Air bonus vs air, less effective vs Stealth +const UTYF_USER_FLAG_31 = 69; // CanHide - can make Hideouts +const UTYF_USER_FLAG_32 = 70; // WillNever +const UTYF_USER_FLAG_33 = 71; // NonMilAttack - has military capacity but can enter territories with whom you're at peace +const UTYF_USER_FLAG_34 = 72; // Cant_Pillage +const UTYF_USER_FLAG_35 = 73; // CanClaim - can make a Tile Claim +const UTYF_USER_FLAG_36 = 74; // CantAttack - can't do conventional attacks (usually means bombard only) +const UTYF_USER_FLAG_37 = 75; // Workers - lets ruleset target Workers and Workers II with a single effect or actionenabler +const UTYF_USER_FLAG_38 = 76; +const UTYF_USER_FLAG_39 = 77; +const UTYF_USER_FLAG_40 = 78; // unused , reserved for future use ..... +const UTYF_USER_FLAG_41 = 79; +const UTYF_USER_FLAG_42 = 80; +const UTYF_USER_FLAG_43 = 81; +const UTYF_USER_FLAG_44 = 82; +const UTYF_USER_FLAG_45 = 83; + // ^^ ...these can be continued up to const UTYF_USER_FLAG_44 = 76; // Custom unit flags (MP2 sequence/order; TO DO: universalize/uniform order in other rules) @@ -155,17 +176,21 @@ const UTYF_WELLDIGGER = UTYF_USER_FLAG_20 // Can dig a well and irrigate til const UTYF_INFRA = UTYF_USER_FLAG_21 // Can build infrastructure const UTYF_PROLETARIAN = UTYF_USER_FLAG_22 // Controllable only by communist governments const UTYF_PARATROOPERS = UTYF_USER_FLAG_23 // Can be paradropped from a friendly city or suitable base. -const UTYF_MARINES = UTYF_USER_FLAG_24 // Can launch attack from non-native tiles +const UTYF_MARINES = UTYF_USER_FLAG_24 // Can launch attack from non-native tiles (thru MP2C) +const UTYF_NONNATIVEATTACK = UTYF_USER_FLAG_24// Can attack non-native tiles (MP2D onward) (same flag position #24 as above). const UTYF_EXPELLABLE = UTYF_USER_FLAG_25 // Can be peacefully expelled from foreign tiles. const UTYF_AIRPROTECTOR = UTYF_USER_FLAG_26 // Is Unreachable AND can protect its tile form units unable to attack this unit const UTYF_CANT_REACH_AIR = UTYF_USER_FLAG_27 // Unable to attack air units. const UTYF_FORTBUSTER = UTYF_USER_FLAG_28 // Defending Forts get no bonus. Has (33%) attack bonus vs. Fortresses const UTYF_FORTRESSBUSTER = UTYF_USER_FLAG_29 // Defending Fortresses get no bonus. const UTYF_ANTIAIR = UTYF_USER_FLAG_30; // Anti-Air unit. e.g., AEGIS, AAA, Mobile SAM -const UTYF_MULTISLOT = UTYF_USER_FLAG_31; /* Reserved for replacing Shield2Gold as flag for using multiple city_build_slots */ -const UTYF_CANHIDE = UTYF_USER_FLAG_32; /* Can make hideouts */ -const UTYF_WILLNEVER = UTYF_USER_FLAG_33; // Doesn't auto-attack. -const UTYF_TRANSPORTDEFENDER = UTYF_USER_FLAG_34 // Can defend while transported on non-native tiles // +const UTYF_CANHIDE = UTYF_USER_FLAG_31; /* Can make hideouts */ +const UTYF_WILLNEVER = UTYF_USER_FLAG_32; // Doesn't auto-attack. +const UTYF_NONMILATTACK = UTYF_USER_FLAG_33; // NonMilAttack - can attack and enter peace waters/territory +const UTYF_CANT_PILLAGE = UTYF_USER_FLAG_34; // CantPillage - unable to pillage tiles +const UTYF_CAN_CLAIM = UTYF_USER_FLAG_35; // CanClaim - able to make Tile Claims +const UTYF_CANT_ATTACK = UTYF_USER_FLAG_36; // CantAttack - unable to do conventional attacks (usually bombard only) +const UTYF_WORKERS = UTYF_USER_FLAG_37; // Workers - allows manipulating Workers and Workers II with single effect or actionenabler /**********************************************************************//** Return true iff units of the given type can do the specified generalized (ruleset defined) action enabler controlled action. @@ -213,6 +238,20 @@ function utype_build_shield_cost(pcity, punittype) return MAX(base * game.info.shieldbox / 100, 1); }*/ + +/************************************************************************** +Fetch the unit type id by the matching name. Returns NULL if doesn't exist +**************************************************************************/ +function utype_id_by_name(name) +{ + var utype = Object.entries(unit_types).filter(abc => { + return abc[1].name == name + }) + if (utype.length == 1) { /* found it */ + return parseInt(utype[0][0]); + } + return null; +} /************************************************************************** Whether player can build given unit somewhere, ignoring whether unit is obsolete and assuming the diff --git a/freeciv-web/src/main/webapp/javascript/utility.js b/freeciv-web/src/main/webapp/javascript/utility.js index c75a691ff..5e2adb6dc 100644 --- a/freeciv-web/src/main/webapp/javascript/utility.js +++ b/freeciv-web/src/main/webapp/javascript/utility.js @@ -241,6 +241,82 @@ function copy_string_to_clipboard (str) { document.body.removeChild(el); } +/************************************************************************** + Allows changing the properties of a css class itself, instead of just + changing properties of existing elements with that class. This is useful + when you want the class itself to have the new property, so that it will + universally affect all instances of that class which appear in the future, + instead of changing only currently existing elements with that class. +**************************************************************************/ +function changeCss(className, classValue) { + // we need invisible container to store additional css definitions + var cssMainContainer = $('#css-modifier-container'); + if (cssMainContainer.length == 0) { + var cssMainContainer = $('
'); + cssMainContainer.hide(); + cssMainContainer.appendTo($('body')); + } + + // and we need one div for each class + classContainer = cssMainContainer.find('div[data-class="' + className + '"]'); + if (classContainer.length == 0) { + classContainer = $('
'); + classContainer.appendTo(cssMainContainer); + } + + // append additional style + classContainer.html(''); +} + +/************************************************************************** + Finds a time string in a message that has a class .ts timestamp and then + localizes the time from GMT to the browser's local time zone, and returns + the original message with local time in it instead of GMT. +**************************************************************************/ +function time_localize(message) { + const t_start = message.indexOf("class='ts'") + 11; + const t_end = message.indexOf("class='ts'") + 16; + + const GMT = message.substring(t_start, t_end); + const GMT_hour = parseInt(GMT.substring(0,2)); + const GMT_minute = GMT.substring(3,5); + + const date = new Date() + const minutes_offset = date.getTimezoneOffset(); + const hours_offset = minutes_offset / 60; + + var local_hour = GMT_hour - hours_offset - SERVER_GMT_OFFSET; + + if (local_hour < 0) { + local_hour = 24 + local_hour; + } + else if (local_hour >= 24) { + local_hour -= 24; + } + + const local_hour_string = "" + (local_hour < 10 ? "0" : "") + local_hour.toString(); + var zone = date.toLocaleTimeString(undefined,{timeZoneName:'short'}).split(' ')[2]; + if (!zone || zone=="undefined") zone = ""; + const local_time = local_hour_string + ":" + GMT_minute + " " + zone; + + return message.replace(GMT, local_time); +} + +/************************************************************************** + Comes back false (null) if it is not an unaccented lower or upper case + character in the Latin alphabet. +**************************************************************************/ +function is_alphabetic(text) +{ + var regex = /([\u0041-\u005A\u0061-\u007A]+)/g; + var result = text.match(regex); + + // If there are illegal characters, they become separators and result comes back as an array + if (result == null || result.length>1) return null; + + return result; +} + /************************************************************************** Returns original string iff it is composed of legal alphanumeric characters and/or basic ASCII spaces and punctuation. Otherwise returns null. @@ -344,6 +420,13 @@ function getHash(input){ return Math.abs(hash).toString(); } +/************************************************************************** + Reverse lookup: get an object key by its value +**************************************************************************/ +function getKeyByValue(object, value) { + return Object.keys(object).find(key => object[key] === value); +} + /************************************************************************** Force execution to delay by x milliseconds. **************************************************************************/ @@ -444,14 +527,16 @@ function is_word_plural(word) var len = word.length; if (len<3) return false; if (word.endsWith("ss")) return false; // -ss are singular + if (word.endsWith("s II")) return true; // Workers II, Barracks II if (word.endsWith("men")) return true; // Pikemen, Riflemen, etc. + if (word.endsWith("nfantry")) return true; // Mechanized Infantry + if (word.endsWith("rtillery")) return true; /* Exceptions I */ if (word.endsWith("AWACS")) return false; // names end in small 's' if (word.endsWith("JTIDS")) return false; // names end in small 's' if (word.endsWith("United Nations")) return false; // debatable ;)*/ /* Exceptions II, currently not needed / unimportant. - if (word.endsWith("s II")) return true; // Barracks II, et similia if (word.endsWith("s III")) return true; // Barracks III, et similia if (word.endsWith("solos")) return false; // Mausoleum of Mausolos if (word.endsWith("temis")) return false; // Temple of Artemis diff --git a/freeciv-web/src/main/webapp/javascript/warcalc.js b/freeciv-web/src/main/webapp/javascript/warcalc.js index f5b97940d..8fa98d48e 100644 --- a/freeciv-web/src/main/webapp/javascript/warcalc.js +++ b/freeciv-web/src/main/webapp/javascript/warcalc.js @@ -75,14 +75,14 @@ function warcalc_update_titles() $("#wcamsg").prop("title", "Your "+unit_types[units[my_uid]['type']]['name']+" is set as attacker.\n\nOnly Veteran bonus is auto-calculated"); $("#wcamsg").html("A:⭐"+unit_types[units[my_uid]['type']]['name']); - $("#wcdmsg").prop("title", "Foreign "+unit_types[units[their_uid]['type']]['name']+" is set as defender.\n\nVeteran, Terrain, and Fortify bonuses are included.\n\nNot included:\n Base, Unit-type bonus, City modifiers"); + $("#wcdmsg").prop("title", "Foreign "+unit_types[units[their_uid]['type']]['name']+" is set as defender.\n\nOnly Veteran, Terrain, and Fortify bonuses are included."); $("#wcdmsg").html("D:"+unit_types[units[their_uid]['type']]['name']); } else if (warcalc_role_mode == WARCALC_DEFENDING) {// swapped role $("#wcamsg").prop("title", "Foreign "+unit_types[units[their_uid]['type']]['name']+" is set as attacker.\n\nOnly Veteran bonus is auto-calculated"); $("#wcamsg").html("A:"+unit_types[units[their_uid]['type']]['name']); - $("#wcdmsg").prop("title", "Your "+unit_types[units[my_uid]['type']]['name']+" is set as defender.\n\nVeteran, Terrain, and Fortify bonuses are included.\n\nNot included:\n Base, Unit-type bonus, City modifiers"); + $("#wcdmsg").prop("title", "Your "+unit_types[units[my_uid]['type']]['name']+" is set as defender.\n\nOnly Veteran, Terrain, and Fortify bonuses are included."); $("#wcdmsg").html("D:⭐"+unit_types[units[my_uid]['type']]['name']); } } @@ -433,27 +433,27 @@ function warcalc_set_tooltips() } // DEFEND BUTTONS $("#wc500").hide(); // no 5x bonus in MP2/AG - $("#wc125").prop("title", bl+"In city with SAM Battery vs. Stealth Aircraft"); - $("#wc133").prop("title", bl+"River"+nbl+"Swamp"+nbl+"Forest"+nbl+"Land/Heli in Fort vs. Land/Sea/Missile (not Armor)"+nbl+"Fighter over Fort/Fortress vs. Land/Sea/Missile (not Armor)"+nbl+"Sea unit in Naval base"); + $("#wc125").prop("title", bl+"In city with SAM Battery dvs Stealth Aircraft"); + $("#wc133").prop("title", bl+"River"+nbl+"Swamp"+nbl+"Forest"+nbl+"Land/Heli in Fort dvs Land/Sea/Missile (not Armor)"+nbl+"Fighter over Fort/Fortress dvs Land/Sea/Missile (not Armor)"+nbl+"Sea unit in Naval base"); $("#wc150").prop("title", bl+"Veteran-1 ('Veteran')"+nbl+"Jungle"+nbl+"Land unit Fortified OR inside city"); - $("#wc167").prop("title", bl+"Land/Heli in Fortress vs Armor/Aircraft"+nbl+"Land/Heli in Naval Base vs Armor/Aircraft"); + $("#wc167").prop("title", bl+"Land/Heli in Fortress dvs Armor/Aircraft"+nbl+"Land/Heli in Naval Base dvs Armor/Aircraft"); $("#wc175").prop("title", bl+"Veteran-2 ('Hardened')"); - $("#wc200").prop("title", bl+"Veteran-3 ('Elite')"+nbl+"Hills"+nbl+"Land/Heli in Fortress vs. Land/Sea/Missile"+nbl+"In city with Coastal Defense vs. Sea"+nbl - + "In city with SAM Battery vs. Air (not Stealth)"+nbl+"In city with SDI vs. Missile"+nbl+"Pikemen vs Horse (not Cavalry)"+nbl+"Knight vs. Foot soldier"+nbl - + "Cruiser,Battleship,M.Destroyer,AEGIS vs Submarine"+nbl+"Sea unit vs. Marines"+nbl+"AAA/Mobile SAM vs. Aircraft"+nbl+"Missile Destroyer vs. Air/Missile"+nbl+"Armor II vs. Missile"); + $("#wc200").prop("title", bl+"Veteran-3 ('Elite')"+nbl+"Hills"+nbl+"Land/Heli in Fortress dvs Land/Sea/Missile"+nbl+"In city with Coastal Defense dvs Sea"+nbl + + "In city with SAM Battery dvs Air (not Stealth)"+nbl+"In city with SDI dvs Missile"+nbl+"Pikemen dvs Horse (not Cavalry)"+nbl+"Knight dvs Foot soldier"+nbl + + "Cruiser,Battleship,M.Destroyer,AEGIS dvs Submarine"+nbl+"Sea unit dvs Marines"+nbl+"AAA/Mobile SAM dvs Aircraft"+nbl+"Missile Destroyer dvs Air/Missile"+nbl+"Armor II dvs Missile"); $("#wc210").prop("title", bl+"Veteran-4 ('Crack')"); $("#wc220").prop("title", bl+"Veteran-5 ('Master')"); $("#wc230").prop("title", bl+"Veteran-6 ('Champion')"); - $("#wc300").prop("title", bl+"Mountains"+nbl+"In city with City Walls vs Land (not Howitzer)"+nbl+"Knight vs. Horse (not Cavalry)"+nbl+"AEGIS vs. Air/Missile"); - $("#wc400").prop("title", bl+"Destroyer vs. Submarine"); + $("#wc300").prop("title", bl+"Mountains"+nbl+"In city with City Walls dvs Land (not Howitzer)"+nbl+"Knight dvs Horse (not Cavalry)"+nbl+"AEGIS dvs Air/Missile"); + $("#wc400").prop("title", bl+"Destroyer dvs Submarine"); // ATTACK BUTTONS $("#wca133").hide(); // unused except for table alignment $("#wca167").hide(); // " " " " " - $("#wca125").prop("title", bl+"Stealth Aircraft vs. AAA/Mobile SAM/AEGIS Cruiser"); + $("#wca125").prop("title", bl+"Stealth Aircraft avs AAA/Mobile SAM/AEGIS Cruiser"); $("#wca150").prop("title", bl+"Veteran-1 ('Veteran')"+nbl+"Phalanx/Pikemen + Agoge of Sparta"); $("#wca175").prop("title", bl+"Veteran-2 ('Hardened')"); - $("#wca200").prop("title", bl+"Veteran-3 ('Elite')"+nbl+"AAA/Mobile SAM vs. Aircraft"+nbl+"Fighter vs Heli (also: Heli FP=1)")+nbl+"Any unit vs Ship in a city: Defend FP1, Attack FP x2"; + $("#wca200").prop("title", bl+"Veteran-3 ('Elite')"+nbl+"AAA/Mobile SAM avs Aircraft"+nbl+"Fighter dvs Heli (also: Heli FP=1)")+nbl+"Any unit avs Ship in a city: Defend FP1, Attack FP x2"; $("#wca210").prop("title", bl+"Veteran-4 ('Crack')"); $("#wca220").prop("title", bl+"Veteran-5 ('Master')"); $("#wca230").prop("title", bl+"Veteran-6 ('Champion')"); @@ -466,28 +466,44 @@ function warcalc_set_tooltips() if (ruleset_control['name'].startsWith("Avant-garde") || ruleset_control['name'].startsWith("MP2")) //MP2 Brava onward starts with "MP2" - { // AG distinctions - $("#wc133").prop("title", bl+"River"+nbl+"Swamp"+nbl+"Forest"+nbl+"Land/Heli in Fort vs. Land/Sea/Missile (not Armor)"+nbl+"Fighter over Fort/Fortress vs. Land/Sea/Missile (not Armor)" - +nbl+"Dive Bomber, Ground Strike Fighter vs. Anti-Air"); + { + $("#wc133").prop("title", bl+"River"+nbl+"Swamp"+nbl+"Forest"+nbl+"Land/Heli in Fort dvs Land/Sea/Missile (not Armor)"+nbl+"Fighter over Fort/Fortress dvs Land/Sea/Missile (not Armor)" + +nbl+"Dive Bomber, Ground Strike Fighter dvs Anti-Air"); $("#wc150").prop("title", bl+"Veteran-1 ('Veteran')"+nbl+"Jungle"+nbl+"Land unit Fortified OR inside city" - +nbl+"Helicopter vs. Foot or Mounted units"); - $("#wc167").prop("title", bl+"Land/Heli in Fortress vs Armor/Aircraft"+nbl+"Land/Heli/Sea in Naval Base vs Armor/Aircraft"); - $("#wc200").prop("title", bl+"Veteran-3 ('Elite')"+nbl+"Hills"+nbl+"Land/Heli in Fortress vs. Land/Sea/Missile"+nbl+"Land/Heli/Sea in Naval Base vs. Land/Sea/Missile"+nbl+"In city with Coastal Defense vs. Sea"+nbl - + "In city with SAM Battery vs. Air/Heli (not Stealth)"+nbl+"In city with SDI vs. Missile"+nbl+"Pikemen vs Horse (not Cavalry)"+nbl+"Knight vs. Foot soldier"+nbl - + "Cruiser,Battleship,M.Destroyer,AEGIS vs Submarine"+nbl+"Sea unit vs. Marines"+nbl+"AAA/Mobile SAM vs. Aircraft"+nbl+"Missile Destroyer vs. Air/Missile"+nbl+"Armor II vs. Missile"); - - $("#wca150").prop("title", bl+"Veteran-1 ('Veteran')"+nbl+"Phalanx/Pikemen + Agoge of Sparta"+nbl+"Dive Bomber vs. Land or Sea"); - $("#wca200").prop("title", bl+"Veteran-3 ('Elite')"+nbl+"AAA/Mobile SAM vs. Aircraft"); + +nbl+"Helicopter dvs Foot or Mounted units"); + $("#wc167").prop("title", bl+"Land/Heli in Fortress dvs Armor/Aircraft"+nbl+"Land/Heli/Sea in Naval Base dvs Armor/Aircraft"); + $("#wc200").prop("title", bl+"Veteran-3 ('Elite')"+nbl+"Hills"+nbl+"Land/Heli in Fortress dvs Land/Sea/Missile"+nbl+"Land/Heli/Sea in Naval Base dvs Land/Sea/Missile"+nbl+"In city with Coastal Defense dvs Sea"+nbl + + "In city with SAM Battery dvs Air/Heli (not Stealth)"+nbl+"In city with SDI dvs Missile"+nbl+"Pikemen dvs Horse (not Cavalry)"+nbl+"Knight dvs Foot soldier"+nbl + + "Cruiser,Battleship,M.Destroyer,AEGIS dvs Submarine"+nbl+"Sea unit dvs Marines"+nbl+"AAA/Mobile SAM dvs Aircraft"+nbl+"Missile Destroyer dvs Air/Missile"+nbl+"Armor II dvs Missile"); + + $("#wca150").prop("title", bl+"Veteran-1 ('Veteran')"+nbl+"Phalanx/Pikemen + Agoge of Sparta"+nbl+"Dive Bomber avs Land or Sea"); + $("#wca200").prop("title", bl+"Veteran-3 ('Elite')"+nbl+"AAA/Mobile SAM avs Aircraft"); } if (client_rules_flag[CRF_MP2_C]) { + $("#wc133").prop("title", bl+"Swamp"+nbl+"Forest"+nbl+"Land/Heli in Fort dvs Land/Sea/Missile (not Armor)"+nbl+"Fighter over Fort/Fortress dvs Land/Sea/Missile (not Armor)" + +nbl+"Dive Bomber, Ground Strike Fighter dvs Anti-Air"); $("#wc175").prop("title", bl+"Veteran-2 ('Hardened')"); $("#wc150").prop("title", bl+"Veteran-1 ('Veteran')"+nbl+"Jungle"+nbl+"Land unit Fortified OR inside city" - +nbl+"Helicopter vs. Foot or Mounted units"+nbl+"In city with Fortifications vs Land (not Ballistic)"); - $("#wc167").prop("title", bl+"Land/Heli in Fortress vs Armor/Aircraft"+nbl+"Land/Heli/Sea in Naval Base vs Armor/Aircraft"+nbl+"Jungle in city with Fortifications"); - $("#wc125").prop("title", bl+"In city with Fortifications vs Catapult"+nbl+"In city with SAM Battery vs. Stealth Aircraft"); - $("#wca125").prop("title", bl+"Stealth Aircraft vs. AAA/Mobile SAM/AEGIS Cruiser"); - $("#wca150").prop("title", bl+"Veteran-1 ('Veteran')"+nbl+"Phalanx/Pikemen + Agoge of Sparta"+nbl+"Dive Bomber vs. Land or Sea"); - $("#wca175").prop("title", bl+"Veteran-2 ('Hardened')"+nbl+"Artillery vs City Walls"); + +nbl+"Helicopter dvs Foot or Mounted units"+nbl+"In city with Fortifications dvs Land (not Ballistic)"); + $("#wc167").prop("title", bl+"Land/Heli in Fortress dvs Armor/Aircraft"+nbl+"Land/Heli/Sea in Naval Base dvs Armor/Aircraft"+nbl+"Jungle in city with Fortifications"); + $("#wc125").prop("title", bl+"In city with Fortifications dvs Catapult"+nbl+"In city with SAM Battery dvs Stealth Aircraft"); + $("#wca125").prop("title", bl+"Stealth Aircraft avs AAA/Mobile SAM/AEGIS Cruiser"); + $("#wca150").prop("title", bl+"Veteran-1 ('Veteran')"+nbl+"Phalanx/Pikemen + Agoge of Sparta"+nbl+"Dive Bomber avs Land or Sea"); + $("#wca175").prop("title", bl+"Veteran-2 ('Hardened')"); + } + if (client_rules_flag[CRF_MP2_D]) { + $("#wca133").show(); + $("#wca133").prop("title", bl+"FP2 ships attacking land (Firepower is reduced to 1)"); + $("#wc125").prop("title", bl+"In city with City Walls dvs Artillery"+nbl+"In city with SAM Battery dvs Stealth Aircraft"); + $("#wc150").prop("title", bl+"Veteran-1 ('Veteran')"+nbl+"Jungle"+nbl+"Flatland terrain in city with Fortifications"+nbl+"Land unit Fortified OR inside city"+nbl+"In city with City Walls dvs Cannon" + +nbl+"Helicopter dvs Foot or Mounted units"+nbl+"Armor II dvs Missile" ); + $("#wc167").prop("title", bl+"Swamp in city with Fortifications"+nbl+"Forest in city with Fortifications"+nbl+"Land/Heli in Fortress dvs Armor/Aircraft"+nbl+"Land/Heli/Sea in Naval Base dvs Armor/Aircraft"); + $("#wc175").prop("title", bl+"Veteran-2 ('Hardened')"+nbl+"In city with City Walls dvs Catapult"); + $("#wc300").prop("title", bl+"Mountains"+nbl+"Knight dvs Horse (not Cavalry)"+nbl+"AEGIS dvs Air/Missile"); + $("#wc200").prop("title", bl+"Veteran-3 ('Elite')"+nbl+"Hills"+nbl+"In city with City Walls dvs Land (not Ballistic class)"+nbl+"In city with Coastal Defense dvs Sea" + +nbl+"In city with SAM Battery dvs Air/Heli (not Stealth)"+nbl+"In city with SDI dvs Missile"+nbl+"Land/Heli in Fortress dvs Land/Sea/Missile"+nbl+"Land/Heli/Sea in Naval Base dvs Land/Sea/Missile" + +nbl+"Pikemen dvs Horse (not Cavalry)"+nbl+"Knight dvs Foot soldier" + +nbl+"Cruiser,Battleship,M.Destroyer,AEGIS dvs Submarine"+nbl+"Sea unit dvs Marines"+nbl+"AAA/Mobile SAM dvs Aircraft"+nbl+"Mobile SAM dvs Missile"+nbl+"Missile Destroyer dvs Air/Missile"); } return; } @@ -505,13 +521,13 @@ function warcalc_set_tooltips() $("#wc150").prop("title", bl+"Veteran-1 ('Veteran')"+nbl+"River"+nbl+"Swamp"+nbl+"Forest"+nbl+"Jungle"+nbl+"Land unit Fortified OR inside city"); $("#wc175").prop("title", bl+"Veteran-2 ('Hardened')"); - $("#wc200").prop("title", bl+"Veteran-3 ('Elite')"+nbl+"Hills"+nbl+"Land/Heli in Fortress vs. Land/Sea units"+nbl+"Pikemen vs. Horse (not Cavalry)"+nbl+"In city with Coastal Defense vs. Sea"+nbl+"In city with SAM Battery vs. Aircraft"+nbl+"In city with SDI vs. Missile"); - $("#wc300").prop("title", bl+"Mountains"+nbl+"In city with City Walls vs Land/Heli (not Howitzer)"); - $("#wc500").prop("title", bl+"AEGIS vs. Air/Missile"); + $("#wc200").prop("title", bl+"Veteran-3 ('Elite')"+nbl+"Hills"+nbl+"Land/Heli in Fortress dvs Land/Sea units"+nbl+"Pikemen dvs Horse (not Cavalry)"+nbl+"In city with Coastal Defense dvs Sea"+nbl+"In city with SAM Battery dvs Aircraft"+nbl+"In city with SDI dvs Missile"); + $("#wc300").prop("title", bl+"Mountains"+nbl+"In city with City Walls dvs Land/Heli (not Howitzer)"); + $("#wc500").prop("title", bl+"AEGIS dvs Air/Missile"); // ATTACK BUTTONS $("#wca150").prop("title", bl+"Veteran-1 ('Veteran')"); $("#wca175").prop("title", bl+"Veteran-2 ('Hardened')"); - $("#wca200").prop("title", bl+"Veteran-3 ('Elite')"+nbl+"Fighter vs Heli (also: Heli FP=1)"); + $("#wca200").prop("title", bl+"Veteran-3 ('Elite')"+nbl+"Fighter avs Heli (also: Heli FP=1)"); // TOOLTIPS NEEDING MORE SPACE $("#wc200").tooltip({open: function (event, ui) {ui.tooltip.css("max-width", "400px");}}); $("#wc300").tooltip({open: function (event, ui) {ui.tooltip.css("max-width", "400px");}}); @@ -522,13 +538,13 @@ function warcalc_set_tooltips() // DEFEND BUTTONS $("#wc300").hide(); // unused $("#wc125").prop("title", bl+"River"+nbl+"Swamp"+nbl+"Forest"+nbl+"Jungle"); - $("#wc150").prop("title", bl+"Veteran-1 ('Veteran')"+nbl+"Hills"+nbl+"Land unit Fortified OR inside city"+nbl+"Sea unit inside city"+nbl+"Land unit in Fort vs. Land/Sea"+nbl - + "On Airstrip vs. Aircraft"+nbl+"In Airbase vs. Land/Sea"+nbl+"In city and Nation has Great Wall"); + $("#wc150").prop("title", bl+"Veteran-1 ('Veteran')"+nbl+"Hills"+nbl+"Land unit Fortified OR inside city"+nbl+"Sea unit inside city"+nbl+"Land unit in Fort dvs Land/Sea"+nbl + + "On Airstrip dvs Aircraft"+nbl+"In Airbase dvs Land/Sea"+nbl+"In city and Nation has Great Wall"); $("#wc175").prop("title", bl+"Veteran-2 ('Hardened')"); - $("#wc200").prop("title", bl+"Veteran-3 ('Elite')"+nbl+"Mountains"+nbl+"Destroyer vs. Submarine"+nbl+"" - + "Land unit in Fortress vs. Land/Sea"+nbl+"In Airbase vs. Aircraft"+nbl+"In city with City Walls vs Land unit"+nbl+"In city with Coastal Defense vs. Sea"+nbl - + "In city with SAM Battery vs. Air/Heli"+nbl+"In city with SDI vs. Missile" ); - $("#wc500").prop("title", bl+"AEGIS vs. Air/Missile"); + $("#wc200").prop("title", bl+"Veteran-3 ('Elite')"+nbl+"Mountains"+nbl+"Destroyer dvs Submarine"+nbl+"" + + "Land unit in Fortress dvs Land/Sea"+nbl+"In Airbase dvs Aircraft"+nbl+"In city with City Walls dvs Land unit"+nbl+"In city with Coastal Defense dvs Sea"+nbl + + "In city with SAM Battery dvs Air/Heli"+nbl+"In city with SDI dvs Missile" ); + $("#wc500").prop("title", bl+"AEGIS dvs Air/Missile"); // ATTACK BUTTONS $("#wca150").prop("title", bl+"Veteran-1 ('Veteran')"); $("#wca175").prop("title", bl+"Veteran-2 ('Hardened')"); diff --git a/freeciv-web/src/main/webapp/javascript/webgl/README.md b/freeciv-web/src/main/webapp/javascript/webgl/README.md new file mode 100644 index 000000000..8a45da204 --- /dev/null +++ b/freeciv-web/src/main/webapp/javascript/webgl/README.md @@ -0,0 +1,30 @@ +WebGL renderer for Freeciv-web +============================== + +This is the WebGL + Three.js renderer for Freeciv-web. + +[Three.js](https://threejs.org/) is the 3D engine used in Freeciv-web. + +Custom GLSL Fragment and Vertex shaders can be found in the shaders subdirectory. + +![Freeciv-web](https://raw.githubusercontent.com/freeciv/freeciv-web/develop/freeciv-web/src/main/webapp/javascript/webgl/freeciv-webgl.png "Freeciv-web WebGL screenshot") + +The Blender 3D models can be found here: https://github.com/freeciv/freeciv-web/tree/develop/blender + +TODO for 3D WebGL client +--------------------- +- The 3D WebGL client currently needs webgl_vision_cheat_temporary.patch in order to get terrain heights correctly. +- Separate Java Webapp for gltf 3d models and textures for improved build performance. +- Update Three.js version to latest version. + + + +Building and testing +-------------------- +Build Freeciv-web as normal with Vagrant as described in the main README file. +You can then test it in your instance. + +You may use the WebGL interface live at: +- [moving borders](https://fcw.movingborders.es) + +Developer: Andreas Rosdal [@andreasrosdal](http://www.github.com/andreasrosdal) diff --git a/freeciv-web/src/main/webapp/javascript/webgl/animation.js b/freeciv-web/src/main/webapp/javascript/webgl/animation.js new file mode 100644 index 000000000..44eb51968 --- /dev/null +++ b/freeciv-web/src/main/webapp/javascript/webgl/animation.js @@ -0,0 +1,160 @@ +/********************************************************************** + Freeciv-web - the web version of Freeciv. http://play.freeciv.org/ + Copyright (C) 2009-2017 The Freeciv-web project + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +***********************************************************************/ + + +var anim_objs = {}; + +/**************************************************************************** + Updates unit movement animation. +****************************************************************************/ +function update_animated_objects() +{ + for (var unit_id in anim_objs) { + + var punit = units[anim_objs[unit_id]['unit']]; + var mesh = anim_objs[unit_id]['mesh']; + var flag = anim_objs[unit_id]['flag']; + + if (punit == null || mesh == null) { + delete anim_objs[unit_id]; + continue; + } + var anim_list = punit['anim_list']; + if (anim_list[0] == null || anim_list[1] == null) { + delete anim_objs[unit_id]; + continue; + } + + var tile_start = tiles[anim_list[0]['tile']]; + var tile_end = tiles[anim_list[1]['tile']]; + var pos_start = map_to_scene_coords(tile_start['x'], tile_start['y']); + var pos_end = map_to_scene_coords(tile_end['x'], tile_end['y']); + var delta_x = (pos_end['x'] - pos_start['x']) / ANIM_STEPS; + var delta_y = (pos_end['y'] - pos_start['y']) / ANIM_STEPS; + var delta_z = ((tile_end['height'] - tile_start['height']) * 100) / ANIM_STEPS; + + mesh.rotateOnAxis(new THREE.Vector3(0,1,0).normalize(), -1 * (convert_unit_rotation(punit['facing']) * Math.PI * 2 / 8)); + mesh.translateOnAxis(new THREE.Vector3(1,0,0).normalize(), delta_x); + mesh.translateOnAxis(new THREE.Vector3(0,1,0).normalize(), delta_z); + mesh.translateOnAxis(new THREE.Vector3(0,0,1).normalize(), delta_y); + mesh.rotateOnAxis(new THREE.Vector3(0,1,0).normalize(), (convert_unit_rotation(punit['facing']) * Math.PI * 2 / 8)); + mesh.updateMatrix(); + + if (flag != null) { + flag.rotateOnAxis(new THREE.Vector3(0,1,0).normalize(), -1 * Math.PI / 4); + flag.translateOnAxis(new THREE.Vector3(1,0,0).normalize(), delta_x); + flag.translateOnAxis(new THREE.Vector3(0,1,0).normalize(), delta_z); + flag.translateOnAxis(new THREE.Vector3(0,0,1).normalize(), delta_y); + flag.rotateOnAxis(new THREE.Vector3(0,1,0).normalize(), Math.PI / 4); + flag.updateMatrix(); + } + + anim_list[0]['i'] = anim_list[0]['i'] - 1; + if (anim_list[0]['i'] == 0) { + punit['anim_list'].splice(0, 1); + if (punit['anim_list'].length == 1) { + punit['anim_list'].splice(0, 1); + } + } + if (anim_list.length <= 1) { + punit['anim_list'] = []; + delete anim_objs[unit_id]; + update_unit_position(tile_end); + anim_units_count--; + } + + } + + +} + + +/**************************************************************************** + Renders an explosion animation on the given tile. +****************************************************************************/ +function animate_explosion_on_tile(tile_id, animation_frame) +{ + if (scene == null) return; + + var ptile = tiles[tile_id]; + if (ptile == null) return; + + var height = 5 + ptile['height'] * 100; + + if (ptile['explosion_mesh'] != null) { + scene.remove(ptile['explosion_mesh']); + ptile['explosion_mesh'] = null; + } + if (animation_frame == 5) { + scene.remove(ptile['explosion_mesh']); + ptile['explosion_mesh'] = null; + return; + } + + var explosion_mesh = get_unit_explosion_mesh(animation_frame); + var pos = map_to_scene_coords(ptile['x'], ptile['y']); + explosion_mesh.matrixAutoUpdate = false; + explosion_mesh.translateOnAxis(new THREE.Vector3(1,0,0).normalize(), pos['x'] - 6); + explosion_mesh.translateOnAxis(new THREE.Vector3(0,1,0).normalize(), height + 2); + explosion_mesh.translateOnAxis(new THREE.Vector3(0,0,1).normalize(), pos['y'] - 6); + explosion_mesh.rotation.y = Math.PI / 4; + explosion_mesh.updateMatrix(); + if (scene != null && explosion_mesh != null) { + ptile['explosion_mesh'] = explosion_mesh; + scene.add(explosion_mesh); + } + + if (animation_frame <= 4) setTimeout("animate_explosion_on_tile(" + tile_id + "," + (animation_frame + 1) + ")", 350); + +} + +/**************************************************************************** + Renders a nuclear explosion animation on the given tile. +****************************************************************************/ +function render_nuclear_explosion(ptile) +{ + if (ptile == null) return; + var height = 5 + ptile['height'] * 100; + + var explosion_mesh = get_nuke_explosion_mesh(); + var pos = map_to_scene_coords(ptile['x'], ptile['y']); + explosion_mesh.matrixAutoUpdate = false; + explosion_mesh.translateOnAxis(new THREE.Vector3(1,0,0).normalize(), pos['x'] + 30); + explosion_mesh.translateOnAxis(new THREE.Vector3(0,1,0).normalize(), height + 50); + explosion_mesh.translateOnAxis(new THREE.Vector3(0,0,1).normalize(), pos['y'] + 30); + explosion_mesh.rotation.y = Math.PI / 4; + explosion_mesh.updateMatrix(); + + if (scene != null && explosion_mesh != null) { + scene.add(explosion_mesh); + ptile['nuclear_mesh'] = explosion_mesh; + } + + setTimeout("remove_nuclear_explosion(" + ptile['index'] + ")", 3000); + +} + +/**************************************************************************** +... +****************************************************************************/ +function remove_nuclear_explosion(tile_id) +{ + var ptile = tiles[tile_id]; + scene.remove(ptile['nuclear_mesh']); +} diff --git a/freeciv-web/src/main/webapp/javascript/webgl/benchmark.js b/freeciv-web/src/main/webapp/javascript/webgl/benchmark.js new file mode 100644 index 000000000..410cd3df4 --- /dev/null +++ b/freeciv-web/src/main/webapp/javascript/webgl/benchmark.js @@ -0,0 +1,170 @@ +/********************************************************************** + Freeciv-web - the web version of Freeciv. http://play.freeciv.org/ + Copyright (C) 2009-2017 The Freeciv-web project + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +***********************************************************************/ + +var benchmark_start; +var benchmark_enabled = false; +var benchmark_frames_count = 0; +var initial_benchmark_enabled = true; + +/**************************************************************************** + Runs a benchmark of the WebGL version +****************************************************************************/ +function webgl_benchmark_run() +{ + benchmark_enabled = true; + $("#dialog").dialog('close'); + $("#pregame_settings").dialog('close'); + send_message("/set mapseed 420"); + send_message("/set gameseed 420"); + send_message("/start"); + setTimeout(benchmark_check, 1000); +} + + +/**************************************************************************** +... +****************************************************************************/ +function benchmark_check() +{ + try { + $("#dialog").dialog('close'); + } catch (err) {} + try { + $(".diplomacy_dialog").dialog('close'); + } catch (err) {} + try { + $("#tech_dialog").dialog('close'); + } catch (err) {} + + if (game_info != null && game_info['turn'] >= 30) { + var time_elapsed = (new Date().getTime() - benchmark_start) / 1000; + var fps = Math.floor(benchmark_frames_count / time_elapsed); + + $("#benchmark_dialog").remove(); + $("
").appendTo("div#game_page"); + + $("#benchmark_dialog").html("Total time: " + time_elapsed + " seconds.
" + + "Frames per second: " + fps); + $("#benchmark_dialog").attr("title", "Benchmark results:"); + $("#benchmark_dialog").dialog({ + bgiframe: true, + modal: true, + width: "50%", + buttons: { + Ok: function() { + $("#benchmark_dialog").dialog('close'); + } + } + }); + + $("#benchmark_dialog").dialog('open'); + + benchmark_enabled = false; + return; + } + if (game_info != null && game_info['turn'] == 1 && units[101] != null) { + request_unit_do_action(ACTION_FOUND_CITY, + 101, units[101]['tile'], 0, "Hello world"); + } + + key_unit_auto_explore(); + if (game_info != null) send_end_turn(); + + setTimeout(benchmark_check, 1000); +} + +/**************************************************************************** + Measure the fps for the first 10 seconds of the game, and show an error + if the fps is too low to play. +****************************************************************************/ +function initial_benchmark_check() +{ + var time_elapsed = (new Date().getTime() - benchmark_start) / 1000; + var fps = Math.floor(benchmark_frames_count / time_elapsed); + initial_benchmark_enabled = false; + if (fps < 4) { + var renderer_name = "-"; + var gl = document.createElement('canvas').getContext('webgl'); + if (gl != null) { + var extension = gl.getExtension('WEBGL_debug_renderer_info'); + if (extension != undefined) { + renderer_name = gl.getParameter(extension.UNMASKED_RENDERER_WEBGL); + } + } + + var quality_string = ""; + if (graphics_quality == QUALITY_MEDIUM) quality_string = "Medium quality"; + if (graphics_quality == QUALITY_HIGH) quality_string = "High quality"; + + var message = "The game is running too slowly! Please check if the drivers for your graphics driver needs to be updated and that you have a graphics card which supports WebGL 3D. " + + "3D WebGL rendering requires updated drivers and a good 3D graphics card with 3D hardware acceleration. The current WebGL renderer is: " + renderer_name + ".
"; + if (renderer_name == "Google SwiftShader") message += "
Warning: Google SwiftShader is a software renderer which has very poor performance and will not work with this game. "; + message += "
You can try playing the 2D version instead, or configure lower graphics quality.

"; + message += "Current graphics level: " + quality_string; + + show_slow_game_warning_message("3D game is running very slowly!", message); + + console.error("WebGL 3D is running slowly. FPS: " + fps + ", Quality:" + quality_string + ", Renderer: " + renderer_name); + + } + +} + + +/************************************************************************** + Shows a generic message dialog. +**************************************************************************/ +function show_slow_game_warning_message(title, message) { + + // reset dialog page. + $("#generic_dialog").remove(); + $("
").appendTo("div#game_page"); + + speak(title); + speak(message); + + $("#generic_dialog").html(message); + $("#generic_dialog").attr("title", title); + $("#generic_dialog").dialog({ + bgiframe: true, + modal: true, + width: is_small_screen() ? "90%" : "50%", + close: closing_dialog_message, + buttons: { + "Play 2D version - Restart!" : function() { + window.location.href = '/'; + }, + "Configure graphics settings" : function() { + $("#generic_dialog").remove(); + $("
").appendTo("div#game_page"); + $("
").appendTo("div#pregame_page"); + pregame_settings(); + $("#pregame_settings_tabs").tabs({ active: 1 }); + }, + "Play anyway": close_dialog_message + + } + }); + + $("#generic_dialog").dialog('open'); + $("#game_text_input").blur(); + + $('#generic_dialog').css("max-height", "450px"); + +} diff --git a/freeciv-web/src/main/webapp/javascript/webgl/borders.js b/freeciv-web/src/main/webapp/javascript/webgl/borders.js new file mode 100644 index 000000000..86b35deeb --- /dev/null +++ b/freeciv-web/src/main/webapp/javascript/webgl/borders.js @@ -0,0 +1,172 @@ +/********************************************************************** + Freeciv-web - the web version of Freeciv. http://play.freeciv.org/ + Copyright (C) 2009-2017 The Freeciv-web project + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +***********************************************************************/ + +var border_image_resolution = 512; +var borders_palette = []; +var borders_texture; +var borders_hash = -1; + +/**************************************************************************** + Initialize borders image. +****************************************************************************/ +function init_borders_image() +{ + borders_palette = []; + borders_palette.push([142, 0, 0]); + for (var player_id in players) { + var pplayer = players[player_id]; + var nation_colors; + if (nations[pplayer['nation']].color != null) { + nation_colors = nations[pplayer['nation']].color.replace("rgb(", "").replace(")", "").split(","); + if (nation_colors[0] < nation_colors[1] - 10 && nation_colors[2] < nation_colors[1] - 10) nation_colors = [0, 20, 0]; //darken green + } else { + nation_colors = [0, 0, 0]; + } + borders_palette.push([parseInt(nation_colors[0]) * 0.65, parseInt(nation_colors[2]) * 0.65, parseInt(nation_colors[1]) * 0.65]); + } + + bmp_lib.render('borders_image', + generate_borders_image(), + borders_palette); + borders_texture = new THREE.Texture(); + borders_texture.magFilter = THREE.NearestFilter; + borders_texture.minFilter = THREE.NearestFilter; + borders_texture.image = document.getElementById("borders_image"); + borders_texture.image.onload = function () { + borders_texture.needsUpdate = true; + }; + + if (graphics_quality == QUALITY_MEDIUM) setInterval(update_borders_image, 15000); + if (graphics_quality == QUALITY_HIGH) setInterval(update_borders_image, 4000); +} + +/**************************************************************************** + Returns a texture containing one pixel for each map tile, where the color of each pixel + contains the border color. +****************************************************************************/ +function update_borders_image() +{ + var hash = generate_borders_image_hash(); + + if (hash != borders_hash) { + borders_palette = []; + borders_palette.push([142, 0, 0]); + for (var player_id in players) { + var pplayer = players[player_id]; + var nation_colors; + if (nations[pplayer['nation']].color != null) { + nation_colors = nations[pplayer['nation']].color.replace("rgb(", "").replace(")", "").split(","); + if (nation_colors[0] < nation_colors[1] - 10 && nation_colors[2] < nation_colors[1] - 10) nation_colors = [0, 20, 0]; //darken green + } else { + nation_colors = [0,0,0]; + } + + borders_palette.push([parseInt(nation_colors[0]) * 0.65, parseInt(nation_colors[2]) * 0.65, parseInt(nation_colors[1]) * 0.65]); + } + + bmp_lib.render('borders_image', + generate_borders_image(), + borders_palette); + borders_texture.image = document.getElementById("borders_image"); + borders_texture.image.onload = function () { + borders_texture.needsUpdate = true; + }; + borders_hash = hash; + + return borders_texture; + } +} + +/**************************************************************************** + +****************************************************************************/ +function generate_borders_image() { + + var row; + // The grid of points that make up the image. + var grid = Array(border_image_resolution); + for (row = 0; row < border_image_resolution ; row++) { + grid[row] = Array(border_image_resolution); + } + + for (var x = 0; x < border_image_resolution ; x++) { + for (var y = 0; y < border_image_resolution; y++) { + var gx = Math.floor(map.ysize * x / border_image_resolution); + var gy = Math.floor(map.xsize * y / border_image_resolution); + grid[x][y] = border_image_color(gy, gx); + } + } + + var result = Array(border_image_resolution); + for (row = 0; row < border_image_resolution ; row++) { + result[row] = Array(border_image_resolution); + } + + for (var x = 0; x < border_image_resolution ; x++) { + for (var y = 0; y < border_image_resolution; y++) { + if (x == 0 || y == 0 || x >= border_image_resolution - 1 || y >= border_image_resolution - 1) { + result[x][y] = grid[x][y]; + } else { + var is_border = (grid[x][y] > 0 + && (grid[x-1][y-1] != grid[x][y] || grid[x-1][y] != grid[x][y] || grid[x][y-1] != grid[x][y] || grid[x+1][y] != grid[x][y] + || grid[x][y+1] != grid[x][y] || grid[x+1][y+1] != grid[x][y] || grid[x-1][y+1] != grid[x][y] || grid[x+1][y-1] != grid[x][y])); + if (is_border) { + result[x][y] = grid[x][y]; + } else { + result[x][y] = 0; + } + } + } + } + + return result; +} + + +/**************************************************************************** + Creates a hash of the map borders. +****************************************************************************/ +function generate_borders_image_hash() { + var hash = 0; + + for (var x = 0; x < border_image_resolution ; x++) { + for (var y = 0; y < border_image_resolution; y++) { + var gx = Math.floor(map.ysize * x / border_image_resolution); + var gy = Math.floor(map.xsize * y / border_image_resolution); + hash += border_image_color(gy, gx); + } + } + + return hash; +} + + +/**************************************************************************** + Returns the color of the tile at the given map position. +****************************************************************************/ +function border_image_color(map_x, map_y) +{ + var ptile = map_pos_to_tile(map_x, map_y); + + if (ptile != null && ptile['owner'] != null && ptile['owner'] < 255) { + return 1 + ptile['owner']; + } + + return 0; +} diff --git a/freeciv-web/src/main/webapp/javascript/webgl/camera.js b/freeciv-web/src/main/webapp/javascript/webgl/camera.js new file mode 100644 index 000000000..bd30b1176 --- /dev/null +++ b/freeciv-web/src/main/webapp/javascript/webgl/camera.js @@ -0,0 +1,97 @@ +/********************************************************************** + Freeciv-web - the web version of Freeciv. http://play.freeciv.org/ + Copyright (C) 2009-2017 The Freeciv-web project + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +***********************************************************************/ + +var camera; + +var camera_dx = 300; +var camera_dy = 490; +var camera_dz = 300; +var camera_current_x = 0; +var camera_current_y = 0; +var camera_current_z = 0; + + +/**************************************************************************** + Point the camera to look at point x, y, z in Three.js coordinates. +****************************************************************************/ +function camera_look_at(x, y, z) +{ + camera_current_x = x; + camera_current_y = y; + camera_current_z = z; + + if (camera != null) { + camera.position.set( x + camera_dx, y + camera_dy, z + camera_dz); + camera.lookAt( new THREE.Vector3(x, 0, z)); + } + + if (directionalLight != null) directionalLight.position.set( x + camera_dx, y + camera_dy, z + camera_dz ).normalize(); + +} + +/************************************************************************** + Centers the mapview around the given tile.. +**************************************************************************/ +function center_tile_mapcanvas_3d(ptile) +{ + if (ptile != null) { + var pos = map_to_scene_coords(ptile['x'], ptile['y']); + camera_look_at(pos['x'], 0, pos['y']); + } + +} + +/************************************************************************** + Enabled silding of the mapview to the given tile. +**************************************************************************/ +function enable_mapview_slide_3d(ptile) +{ + var pos_dest = map_to_scene_coords(ptile['x'], ptile['y']); + + mapview_slide['dx'] = camera_current_x - pos_dest['x']; + mapview_slide['dy'] = camera_current_z - pos_dest['y']; + mapview_slide['i'] = mapview_slide['max']; + mapview_slide['prev'] = mapview_slide['i']; + mapview_slide['start'] = new Date().getTime(); + mapview_slide['active'] = true; + +} + +/************************************************************************** + Updates mapview slide, called once per frame. +**************************************************************************/ +function update_map_slide_3d() +{ + var elapsed = 1 + new Date().getTime() - mapview_slide['start']; + mapview_slide['i'] = Math.floor(mapview_slide['max'] + * (mapview_slide['slide_time'] + - elapsed) / mapview_slide['slide_time']); + + if (mapview_slide['i'] <= 0) { + mapview_slide['active'] = false; + return; + } + + var dx = Math.floor(mapview_slide['dx'] * (mapview_slide['i'] - mapview_slide['prev']) / mapview_slide['max']); + var dy = Math.floor(mapview_slide['dy'] * (mapview_slide['i'] - mapview_slide['prev']) / mapview_slide['max']); + + camera_look_at(camera_current_x + dx, 0, camera_current_z + dy); + mapview_slide['prev'] = mapview_slide['i']; + +} \ No newline at end of file diff --git a/freeciv-web/src/main/webapp/javascript/webgl/freeciv-webgl.png b/freeciv-web/src/main/webapp/javascript/webgl/freeciv-webgl.png new file mode 100644 index 000000000..40cf02fa6 Binary files /dev/null and b/freeciv-web/src/main/webapp/javascript/webgl/freeciv-webgl.png differ diff --git a/freeciv-web/src/main/webapp/javascript/webgl/goto.js b/freeciv-web/src/main/webapp/javascript/webgl/goto.js new file mode 100644 index 000000000..fbe707a01 --- /dev/null +++ b/freeciv-web/src/main/webapp/javascript/webgl/goto.js @@ -0,0 +1,77 @@ +/********************************************************************** + Freeciv-web - the web version of Freeciv. http://play.freeciv.org/ + Copyright (C) 2009-2016 The Freeciv-web project + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +***********************************************************************/ + +var goto_lines = []; + +/**************************************************************************** + Renders a goto line by creating many planes along the goto path. +****************************************************************************/ +function webgl_render_goto_line(start_tile, goto_packet_dir) +{ + clear_goto_tiles(); + var ptile = start_tile; + + var material = new THREE.MeshBasicMaterial( { color: 0x055dff, side:THREE.DoubleSide} ); + var goto_width = 3; + + for (var i = 0; i < goto_packet_dir.length; i++) { + if (ptile == null) break; + var dir = goto_packet_dir[i]; + + if (dir == -1) { + /* Assume that this means refuel. */ + continue; + } + + var nexttile = mapstep(ptile, dir); + if (nexttile != null) { + var currpos = map_to_scene_coords(ptile['x'], ptile['y']); + var nextpos = map_to_scene_coords(nexttile['x'], nexttile['y']); + var height = 5 + ptile['height'] * 100; + if (ptile['x'] == 0 || ptile['x'] >= map['xsize'] - 1 || nexttile['x'] == 0 || nexttile['x'] >= map['xsize'] - 1) continue; + + var gotoLineGemetry = new THREE.PlaneGeometry(60, 5); + gotoLineGemetry.dynamic = true; + var delta = 0; + if (dir == 1 || dir == 6) delta = 3; + gotoLineGemetry.vertices[0].x = 0.0; + gotoLineGemetry.vertices[0].y = 0.0; + gotoLineGemetry.vertices[0].z = 0.0; + gotoLineGemetry.vertices[1].x = nextpos['x'] - currpos['x']; + gotoLineGemetry.vertices[1].y = (nexttile['height'] - ptile['height']) * 100 - delta; + gotoLineGemetry.vertices[1].z = nextpos['y'] - currpos['y']; + gotoLineGemetry.vertices[2].x = 0.0; + gotoLineGemetry.vertices[2].y = delta; + gotoLineGemetry.vertices[2].z = goto_width; + gotoLineGemetry.vertices[3].x = nextpos['x'] - currpos['x']; + gotoLineGemetry.vertices[3].y = (nexttile['height'] - ptile['height']) * 100 + delta; + gotoLineGemetry.vertices[3].z = nextpos['y'] - currpos['y'] + goto_width; + gotoLineGemetry.verticesNeedUpdate = true; + var gotoline = new THREE.Mesh(gotoLineGemetry, material); + + gotoline.translateOnAxis(new THREE.Vector3(1,0,0).normalize(), currpos['x'] + 10); + gotoline.translateOnAxis(new THREE.Vector3(0,1,0).normalize(), height + 25); + gotoline.translateOnAxis(new THREE.Vector3(0,0,1).normalize(), currpos['y'] + 10); + scene.add(gotoline); + goto_lines.push(gotoline); + } + + ptile = mapstep(ptile, dir); + } +} diff --git a/freeciv-web/src/main/webapp/javascript/webgl/heightmap.js b/freeciv-web/src/main/webapp/javascript/webgl/heightmap.js new file mode 100644 index 000000000..6952ec807 --- /dev/null +++ b/freeciv-web/src/main/webapp/javascript/webgl/heightmap.js @@ -0,0 +1,203 @@ +/********************************************************************** + Freeciv-web - the web version of Freeciv. http://play.freeciv.org/ + Copyright (C) 2009-2016 The Freeciv-web project + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +***********************************************************************/ + + +var heightmap = null; + +/**************************************************************************** + Create heightmap, a 2d array with the height. +****************************************************************************/ +function create_heightmap() +{ + var start_heightmap = new Date().getTime(); + var heightmap_resolution_x = map.xsize * 4 + 1; // FIXME: in some special-cases, map.xsize is null (not set yet). + var heightmap_resolution_y = map.ysize * 4 + 1; + + var heightmap_tiles = new Array(map.xsize); + var distance_from_coast_map = new Array(map.xsize); + for (var x = 0; x < map.xsize; x++) { + heightmap_tiles[x] = new Array(map.ysize); + distance_from_coast_map[x] = new Array(map.ysize); + } + + /* Here we look at every tile and determine its distance from the sea or river. */ + /* First of all we set non-sea tiles' distance to be very big. */ + for (var x = 0; x < map.xsize ; x++) { + for (var y = 0; y < map.ysize; y++) { + var ptile = map_pos_to_tile(x, y); + if (ptile != null && tile_terrain(ptile) != null && !is_ocean_tile(ptile) && !tile_has_extra(ptile, EXTRA_RIVER)) { + distance_from_coast_map[x][y] = 100000; + } else { + distance_from_coast_map[x][y] = 0; + } + } + } + /* Then, for each sea or river tile, we propagate the distance information to the inner + * land. */ + for (var x = 0; x < map.xsize; x++) { + for (var y = 0; y < map.ysize; y++) { + var ptile = map_pos_to_tile(x, y); + if (ptile != null && tile_terrain(ptile) != null && (is_ocean_tile(ptile) || tile_has_extra(ptile, EXTRA_RIVER))) { + propagate_distance_from_coast(distance_from_coast_map, x, y, 0); + } + } + } + + for (var x = 0; x < map.xsize; x++) { + for (var y = 0; y < map.ysize; y++) { + var ptile = map_pos_to_tile(x, y); + if (ptile != null) { + heightmap_tiles[x][y] = 0.5 + 0.4 * map_tile_height(ptile) + 0.09 * distance_from_coast_map[x][y]; + if (heightmap_tiles[x][y] > ptile['height']) { + ptile['height'] = heightmap_tiles[x][y]; + } + } + } + } + + heightmap = new Array(heightmap_resolution_x); + for (var hx = 0; hx < heightmap_resolution_x; hx++) { + heightmap[hx] = new Array(heightmap_resolution_y); + } + + /* smooth */ + for (var x = 0; x < heightmap_resolution_x; x++) { + for (var y = 0; y < heightmap_resolution_y; y++) { + var gx = x / 4 - 0.5; + var gy = y / 4 - 0.5; + + if (Math.round(gx) == gx && Math.round(gy) == gy) { + /* On tile center */ + heightmap[x][y] = heightmap_tiles[gx][gy]; + } else { + /* Interpolate between neighbouring tiles, with each tile having weight: + * 1 / (distance to the tile)^2. + */ + var neighbours = [ + { "x": Math.floor(gx), "y": Math.floor(gy) }, + { "x": Math.floor(gx), "y": Math.ceil(gy) }, + { "x": Math.ceil(gx), "y": Math.floor(gy) }, + { "x": Math.ceil(gx), "y": Math.ceil(gy) }]; + + var norm = 0; + var sum = 0; + for (var i = 0; i < 4; i++) { + var coords = neighbours[i]; + if (coords.x < 0 || coords.x >= map.xsize || + coords.y < 0 || coords.y >= map.ysize) { + /* Outside of map, don't use in the sum */ + continue; + } + var dx = gx - coords.x; + var dy = gy - coords.y; + var distance = Math.sqrt(dx*dx + dy*dy); + sum += heightmap_tiles[coords.x][coords.y] / distance / distance; + norm += 1. / distance / distance; + } + // set final heightmap value, and add some random noise. + heightmap[x][y] = (sum / norm); + } + } + } + + for (var x = 0; x < heightmap_resolution_x; x++) { + for (var y = 0; y < heightmap_resolution_y; y++) { + if (heightmap[x][y] > 100) { + heightmap[x][y] = 0.5 + 0.4 * ((Math.random() - 0.5) / 60) + 0.2; + } + } + } + + console.log("create_heightmap took: " + (new Date().getTime() - start_heightmap) + " ms."); + +} + +/**************************************************************************** + ... +****************************************************************************/ +function propagate_distance_from_coast(distance_from_coast_map, x, y, level) +{ + var current_distance = distance_from_coast_map[x][y]; + + // limit distance from coast to 2. this is a quick-fix for inland tiles + // incorrectly assigned as mountains by the fragment shader. + if (current_distance >= 2) current_distance = 2; + + for (var dir = 0; dir < DIR8_LAST; dir++) { + var dir_x = x + DIR_DX[dir]; + var dir_y = y + DIR_DY[dir]; + if (dir_x < 0 || dir_x >= map.xsize || dir_y < 0 || dir_y >= map.ysize) { + /* Outside of the map */ + continue; + } + if (distance_from_coast_map[dir_x][dir_y] > current_distance + 1) { + distance_from_coast_map[dir_x][dir_y] = current_distance + 1; + if (level < (map.xsize * 2)) propagate_distance_from_coast(distance_from_coast_map, dir_x, dir_y, level + 1); + } + } +} + +/**************************************************************************** + Returns the tile height from -1.0 to 1.0 +****************************************************************************/ +function map_tile_height(ptile) +{ + if (ptile != null && tile_terrain(ptile) != null) { + if (tile_has_extra(ptile, EXTRA_RIVER)) return -0.01; + if (is_ocean_tile(ptile)) return -0.13 + ((Math.random() - 0.5) / 80); + if (tile_terrain(ptile)['name'] == "Hills") return 0.25; + if (tile_terrain(ptile)['name'] == "Mountains") return 0.65 + ((Math.random() - 0.5) / 10); + } + + return 0.0 + ((Math.random() - 0.5) / 60); +} + +/**************************************************************************** + Returns height offset for units. This will make units higher above cities. +****************************************************************************/ +function get_unit_height_offset(punit) +{ + if (punit == null) return 0; + var ptile = index_to_tile(punit['tile']); + if (ptile == null) return 0; + var pcity = tile_city(ptile); + + if (pcity != null) return 10; + + return 0; + +} + +/**************************************************************************** + Returns height offset for cities. +****************************************************************************/ +function get_city_height_offset(pcity) +{ + if (pcity == null) return 0; + var ptile = index_to_tile(pcity['tile']); + if (ptile == null) return 0; + + if (tile_terrain(ptile) != null) { + if (tile_terrain(ptile)['name'] == "Hills") return -6; + if (tile_terrain(ptile)['name'] == "Mountains") return -10; + } + + return 2; + +} diff --git a/freeciv-web/src/main/webapp/javascript/webgl/libs/AnaglyphEffect.js b/freeciv-web/src/main/webapp/javascript/webgl/libs/AnaglyphEffect.js new file mode 100644 index 000000000..69e398e24 --- /dev/null +++ b/freeciv-web/src/main/webapp/javascript/webgl/libs/AnaglyphEffect.js @@ -0,0 +1,151 @@ +THREE.AnaglyphEffect = function ( renderer, width, height ) { + + // Dubois matrices from https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.7.6968&rep=rep1&type=pdf#page=4 + + this.colorMatrixLeft = new THREE.Matrix3().fromArray( [ + 0.456100, - 0.0400822, - 0.0152161, + 0.500484, - 0.0378246, - 0.0205971, + 0.176381, - 0.0157589, - 0.00546856 + ] ); + + this.colorMatrixRight = new THREE.Matrix3().fromArray( [ + - 0.0434706, 0.378476, - 0.0721527, + - 0.0879388, 0.73364, - 0.112961, + - 0.00155529, - 0.0184503, 1.2264 + ] ); + + var _camera = new THREE.OrthographicCamera( - 1, 1, 1, - 1, 0, 1 ); + + var _scene = new THREE.Scene(); + + var _stereo = new THREE.StereoCamera(); + + var _params = { minFilter: THREE.LinearFilter, magFilter: THREE.NearestFilter, format: THREE.RGBAFormat }; + + if ( width === undefined ) width = 512; + if ( height === undefined ) height = 512; + + var _renderTargetL = new THREE.WebGLRenderTarget( width, height, _params ); + var _renderTargetR = new THREE.WebGLRenderTarget( width, height, _params ); + + var _material = new THREE.ShaderMaterial( { + + uniforms: { + + 'mapLeft': { value: _renderTargetL.texture }, + 'mapRight': { value: _renderTargetR.texture }, + + 'colorMatrixLeft': { value: this.colorMatrixLeft }, + 'colorMatrixRight': { value: this.colorMatrixRight } + + }, + + vertexShader: [ + + 'varying vec2 vUv;', + + 'void main() {', + + ' vUv = vec2( uv.x, uv.y );', + ' gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );', + + '}' + + ].join( '\n' ), + + fragmentShader: [ + + 'uniform sampler2D mapLeft;', + 'uniform sampler2D mapRight;', + 'varying vec2 vUv;', + + 'uniform mat3 colorMatrixLeft;', + 'uniform mat3 colorMatrixRight;', + + // These functions implement sRGB linearization and gamma correction + + 'float lin( float c ) {', + ' return c <= 0.04045 ? c * 0.0773993808 :', + ' pow( c * 0.9478672986 + 0.0521327014, 2.4 );', + '}', + + 'vec4 lin( vec4 c ) {', + ' return vec4( lin( c.r ), lin( c.g ), lin( c.b ), c.a );', + '}', + + 'float dev( float c ) {', + ' return c <= 0.0031308 ? c * 12.92', + ' : pow( c, 0.41666 ) * 1.055 - 0.055;', + '}', + + + 'void main() {', + + ' vec2 uv = vUv;', + + ' vec4 colorL = lin( texture2D( mapLeft, uv ) );', + ' vec4 colorR = lin( texture2D( mapRight, uv ) );', + + ' vec3 color = clamp(', + ' colorMatrixLeft * colorL.rgb +', + ' colorMatrixRight * colorR.rgb, 0., 1. );', + + ' gl_FragColor = vec4(', + ' dev( color.r ), dev( color.g ), dev( color.b ),', + ' max( colorL.a, colorR.a ) );', + + '}' + + ].join( '\n' ) + + } ); + + var _mesh = new THREE.Mesh( new THREE.PlaneGeometry( 2, 2 ), _material ); + _scene.add( _mesh ); + + this.setSize = function ( width, height ) { + + renderer.setSize( width, height ); + + var pixelRatio = renderer.getPixelRatio(); + + _renderTargetL.setSize( width * pixelRatio, height * pixelRatio ); + _renderTargetR.setSize( width * pixelRatio, height * pixelRatio ); + + }; + + this.render = function ( scene, camera ) { + + var currentRenderTarget = renderer.getRenderTarget(); + + scene.updateMatrixWorld(); + + if ( camera.parent === null ) camera.updateMatrixWorld(); + + _stereo.update( camera ); + + renderer.setRenderTarget( _renderTargetL ); + renderer.clear(); + renderer.render( scene, _stereo.cameraL ); + + renderer.setRenderTarget( _renderTargetR ); + renderer.clear(); + renderer.render( scene, _stereo.cameraR ); + + renderer.setRenderTarget( null ); + renderer.render( _scene, _camera ); + + renderer.setRenderTarget( currentRenderTarget ); + + }; + + this.dispose = function () { + + if ( _renderTargetL ) _renderTargetL.dispose(); + if ( _renderTargetR ) _renderTargetR.dispose(); + if ( _mesh ) _mesh.geometry.dispose(); + if ( _material ) _material.dispose(); + + }; + +}; diff --git a/freeciv-web/src/main/webapp/javascript/webgl/libs/GLTFLoader.js b/freeciv-web/src/main/webapp/javascript/webgl/libs/GLTFLoader.js new file mode 100644 index 000000000..f2369ee8d --- /dev/null +++ b/freeciv-web/src/main/webapp/javascript/webgl/libs/GLTFLoader.js @@ -0,0 +1,3872 @@ +THREE.GLTFLoader = ( function () { + + function GLTFLoader( manager ) { + + THREE.Loader.call( this, manager ); + + this.dracoLoader = null; + this.ddsLoader = null; + this.ktx2Loader = null; + this.meshoptDecoder = null; + + this.pluginCallbacks = []; + + this.register( function ( parser ) { + + return new GLTFMaterialsClearcoatExtension( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFTextureBasisUExtension( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFTextureWebPExtension( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFMaterialsTransmissionExtension( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFLightsExtension( parser ); + + } ); + + this.register( function ( parser ) { + + return new GLTFMeshoptCompression( parser ); + + } ); + + } + + GLTFLoader.prototype = Object.assign( Object.create( THREE.Loader.prototype ), { + + constructor: GLTFLoader, + + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var resourcePath; + + if ( this.resourcePath !== '' ) { + + resourcePath = this.resourcePath; + + } else if ( this.path !== '' ) { + + resourcePath = this.path; + + } else { + + resourcePath = THREE.LoaderUtils.extractUrlBase( url ); + + } + + // Tells the LoadingManager to track an extra item, which resolves after + // the model is fully loaded. This means the count of items loaded will + // be incorrect, but ensures manager.onLoad() does not fire early. + this.manager.itemStart( url ); + + var _onError = function ( e ) { + + if ( onError ) { + + onError( e ); + + } else { + + console.error( e ); + + } + + scope.manager.itemError( url ); + scope.manager.itemEnd( url ); + + }; + + var loader = new THREE.FileLoader( this.manager ); + + loader.setPath( this.path ); + loader.setResponseType( 'arraybuffer' ); + loader.setRequestHeader( this.requestHeader ); + loader.setWithCredentials( this.withCredentials ); + + loader.load( url, function ( data ) { + + try { + + scope.parse( data, resourcePath, function ( gltf ) { + + onLoad( gltf ); + + scope.manager.itemEnd( url ); + + }, _onError ); + + } catch ( e ) { + + _onError( e ); + + } + + }, onProgress, _onError ); + + }, + + setDRACOLoader: function ( dracoLoader ) { + + this.dracoLoader = dracoLoader; + return this; + + }, + + setDDSLoader: function ( ddsLoader ) { + + this.ddsLoader = ddsLoader; + return this; + + }, + + setKTX2Loader: function ( ktx2Loader ) { + + this.ktx2Loader = ktx2Loader; + return this; + + }, + + setMeshoptDecoder: function ( meshoptDecoder ) { + + this.meshoptDecoder = meshoptDecoder; + return this; + + }, + + register: function ( callback ) { + + if ( this.pluginCallbacks.indexOf( callback ) === - 1 ) { + + this.pluginCallbacks.push( callback ); + + } + + return this; + + }, + + unregister: function ( callback ) { + + if ( this.pluginCallbacks.indexOf( callback ) !== - 1 ) { + + this.pluginCallbacks.splice( this.pluginCallbacks.indexOf( callback ), 1 ); + + } + + return this; + + }, + + parse: function ( data, path, onLoad, onError ) { + + var content; + var extensions = {}; + var plugins = {}; + + if ( typeof data === 'string' ) { + + content = data; + + } else { + + var magic = THREE.LoaderUtils.decodeText( new Uint8Array( data, 0, 4 ) ); + + if ( magic === BINARY_EXTENSION_HEADER_MAGIC ) { + + try { + + extensions[ EXTENSIONS.KHR_BINARY_GLTF ] = new GLTFBinaryExtension( data ); + + } catch ( error ) { + + if ( onError ) onError( error ); + return; + + } + + content = extensions[ EXTENSIONS.KHR_BINARY_GLTF ].content; + + } else { + + content = THREE.LoaderUtils.decodeText( new Uint8Array( data ) ); + + } + + } + + var json = JSON.parse( content ); + + if ( json.asset === undefined || json.asset.version[ 0 ] < 2 ) { + + if ( onError ) onError( new Error( 'THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.' ) ); + return; + + } + + var parser = new GLTFParser( json, { + + path: path || this.resourcePath || '', + crossOrigin: this.crossOrigin, + manager: this.manager, + ktx2Loader: this.ktx2Loader, + meshoptDecoder: this.meshoptDecoder + + } ); + + parser.fileLoader.setRequestHeader( this.requestHeader ); + + for ( var i = 0; i < this.pluginCallbacks.length; i ++ ) { + + var plugin = this.pluginCallbacks[ i ]( parser ); + plugins[ plugin.name ] = plugin; + + // Workaround to avoid determining as unknown extension + // in addUnknownExtensionsToUserData(). + // Remove this workaround if we move all the existing + // extension handlers to plugin system + extensions[ plugin.name ] = true; + + } + + if ( json.extensionsUsed ) { + + for ( var i = 0; i < json.extensionsUsed.length; ++ i ) { + + var extensionName = json.extensionsUsed[ i ]; + var extensionsRequired = json.extensionsRequired || []; + + switch ( extensionName ) { + + case EXTENSIONS.KHR_MATERIALS_UNLIT: + extensions[ extensionName ] = new GLTFMaterialsUnlitExtension(); + break; + + case EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS: + extensions[ extensionName ] = new GLTFMaterialsPbrSpecularGlossinessExtension(); + break; + + case EXTENSIONS.KHR_DRACO_MESH_COMPRESSION: + extensions[ extensionName ] = new GLTFDracoMeshCompressionExtension( json, this.dracoLoader ); + break; + + case EXTENSIONS.MSFT_TEXTURE_DDS: + extensions[ extensionName ] = new GLTFTextureDDSExtension( this.ddsLoader ); + break; + + case EXTENSIONS.KHR_TEXTURE_TRANSFORM: + extensions[ extensionName ] = new GLTFTextureTransformExtension(); + break; + + case EXTENSIONS.KHR_MESH_QUANTIZATION: + extensions[ extensionName ] = new GLTFMeshQuantizationExtension(); + break; + + default: + + if ( extensionsRequired.indexOf( extensionName ) >= 0 && plugins[ extensionName ] === undefined ) { + + console.warn( 'THREE.GLTFLoader: Unknown extension "' + extensionName + '".' ); + + } + + } + + } + + } + + parser.setExtensions( extensions ); + parser.setPlugins( plugins ); + parser.parse( onLoad, onError ); + + } + + } ); + + /* GLTFREGISTRY */ + + function GLTFRegistry() { + + var objects = {}; + + return { + + get: function ( key ) { + + return objects[ key ]; + + }, + + add: function ( key, object ) { + + objects[ key ] = object; + + }, + + remove: function ( key ) { + + delete objects[ key ]; + + }, + + removeAll: function () { + + objects = {}; + + } + + }; + + } + + /*********************************/ + /********** EXTENSIONS ***********/ + /*********************************/ + + var EXTENSIONS = { + KHR_BINARY_GLTF: 'KHR_binary_glTF', + KHR_DRACO_MESH_COMPRESSION: 'KHR_draco_mesh_compression', + KHR_LIGHTS_PUNCTUAL: 'KHR_lights_punctual', + KHR_MATERIALS_CLEARCOAT: 'KHR_materials_clearcoat', + KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS: 'KHR_materials_pbrSpecularGlossiness', + KHR_MATERIALS_TRANSMISSION: 'KHR_materials_transmission', + KHR_MATERIALS_UNLIT: 'KHR_materials_unlit', + KHR_TEXTURE_BASISU: 'KHR_texture_basisu', + KHR_TEXTURE_TRANSFORM: 'KHR_texture_transform', + KHR_MESH_QUANTIZATION: 'KHR_mesh_quantization', + EXT_TEXTURE_WEBP: 'EXT_texture_webp', + EXT_MESHOPT_COMPRESSION: 'EXT_meshopt_compression', + MSFT_TEXTURE_DDS: 'MSFT_texture_dds' + }; + + /** + * DDS Texture Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/MSFT_texture_dds + * + */ + function GLTFTextureDDSExtension( ddsLoader ) { + + if ( ! ddsLoader ) { + + throw new Error( 'THREE.GLTFLoader: Attempting to load .dds texture without importing THREE.DDSLoader' ); + + } + + this.name = EXTENSIONS.MSFT_TEXTURE_DDS; + this.ddsLoader = ddsLoader; + + } + + /** + * Punctual Lights Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual + */ + function GLTFLightsExtension( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_LIGHTS_PUNCTUAL; + + // Object3D instance caches + this.cache = { refs: {}, uses: {} }; + + } + + GLTFLightsExtension.prototype._markDefs = function () { + + var parser = this.parser; + var nodeDefs = this.parser.json.nodes || []; + + for ( var nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) { + + var nodeDef = nodeDefs[ nodeIndex ]; + + if ( nodeDef.extensions + && nodeDef.extensions[ this.name ] + && nodeDef.extensions[ this.name ].light !== undefined ) { + + parser._addNodeRef( this.cache, nodeDef.extensions[ this.name ].light ); + + } + + } + + }; + + GLTFLightsExtension.prototype._loadLight = function ( lightIndex ) { + + var parser = this.parser; + var cacheKey = 'light:' + lightIndex; + var dependency = parser.cache.get( cacheKey ); + + if ( dependency ) return dependency; + + var json = parser.json; + var extensions = ( json.extensions && json.extensions[ this.name ] ) || {}; + var lightDefs = extensions.lights || []; + var lightDef = lightDefs[ lightIndex ]; + var lightNode; + + var color = new THREE.Color( 0xffffff ); + + if ( lightDef.color !== undefined ) color.fromArray( lightDef.color ); + + var range = lightDef.range !== undefined ? lightDef.range : 0; + + switch ( lightDef.type ) { + + case 'directional': + lightNode = new THREE.DirectionalLight( color ); + lightNode.target.position.set( 0, 0, - 1 ); + lightNode.add( lightNode.target ); + break; + + case 'point': + lightNode = new THREE.PointLight( color ); + lightNode.distance = range; + break; + + case 'spot': + lightNode = new THREE.SpotLight( color ); + lightNode.distance = range; + // Handle spotlight properties. + lightDef.spot = lightDef.spot || {}; + lightDef.spot.innerConeAngle = lightDef.spot.innerConeAngle !== undefined ? lightDef.spot.innerConeAngle : 0; + lightDef.spot.outerConeAngle = lightDef.spot.outerConeAngle !== undefined ? lightDef.spot.outerConeAngle : Math.PI / 4.0; + lightNode.angle = lightDef.spot.outerConeAngle; + lightNode.penumbra = 1.0 - lightDef.spot.innerConeAngle / lightDef.spot.outerConeAngle; + lightNode.target.position.set( 0, 0, - 1 ); + lightNode.add( lightNode.target ); + break; + + default: + throw new Error( 'THREE.GLTFLoader: Unexpected light type: ' + lightDef.type ); + + } + + // Some lights (e.g. spot) default to a position other than the origin. Reset the position + // here, because node-level parsing will only override position if explicitly specified. + lightNode.position.set( 0, 0, 0 ); + + lightNode.decay = 2; + + if ( lightDef.intensity !== undefined ) lightNode.intensity = lightDef.intensity; + + lightNode.name = parser.createUniqueName( lightDef.name || ( 'light_' + lightIndex ) ); + + dependency = Promise.resolve( lightNode ); + + parser.cache.add( cacheKey, dependency ); + + return dependency; + + }; + + GLTFLightsExtension.prototype.createNodeAttachment = function ( nodeIndex ) { + + var self = this; + var parser = this.parser; + var json = parser.json; + var nodeDef = json.nodes[ nodeIndex ]; + var lightDef = ( nodeDef.extensions && nodeDef.extensions[ this.name ] ) || {}; + var lightIndex = lightDef.light; + + if ( lightIndex === undefined ) return null; + + return this._loadLight( lightIndex ).then( function ( light ) { + + return parser._getNodeRef( self.cache, lightIndex, light ); + + } ); + + }; + + /** + * Unlit Materials Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit + */ + function GLTFMaterialsUnlitExtension() { + + this.name = EXTENSIONS.KHR_MATERIALS_UNLIT; + + } + + GLTFMaterialsUnlitExtension.prototype.getMaterialType = function () { + + return THREE.MeshBasicMaterial; + + }; + + GLTFMaterialsUnlitExtension.prototype.extendParams = function ( materialParams, materialDef, parser ) { + + var pending = []; + + materialParams.color = new THREE.Color( 1.0, 1.0, 1.0 ); + materialParams.opacity = 1.0; + + var metallicRoughness = materialDef.pbrMetallicRoughness; + + if ( metallicRoughness ) { + + if ( Array.isArray( metallicRoughness.baseColorFactor ) ) { + + var array = metallicRoughness.baseColorFactor; + + materialParams.color.fromArray( array ); + materialParams.opacity = array[ 3 ]; + + } + + if ( metallicRoughness.baseColorTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture ) ); + + } + + } + + return Promise.all( pending ); + + }; + + /** + * Clearcoat Materials Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat + */ + function GLTFMaterialsClearcoatExtension( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_CLEARCOAT; + + } + + GLTFMaterialsClearcoatExtension.prototype.getMaterialType = function ( materialIndex ) { + + var parser = this.parser; + var materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; + + return THREE.MeshPhysicalMaterial; + + }; + + GLTFMaterialsClearcoatExtension.prototype.extendMaterialParams = function ( materialIndex, materialParams ) { + + var parser = this.parser; + var materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { + + return Promise.resolve(); + + } + + var pending = []; + + var extension = materialDef.extensions[ this.name ]; + + if ( extension.clearcoatFactor !== undefined ) { + + materialParams.clearcoat = extension.clearcoatFactor; + + } + + if ( extension.clearcoatTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'clearcoatMap', extension.clearcoatTexture ) ); + + } + + if ( extension.clearcoatRoughnessFactor !== undefined ) { + + materialParams.clearcoatRoughness = extension.clearcoatRoughnessFactor; + + } + + if ( extension.clearcoatRoughnessTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'clearcoatRoughnessMap', extension.clearcoatRoughnessTexture ) ); + + } + + if ( extension.clearcoatNormalTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'clearcoatNormalMap', extension.clearcoatNormalTexture ) ); + + if ( extension.clearcoatNormalTexture.scale !== undefined ) { + + var scale = extension.clearcoatNormalTexture.scale; + + materialParams.clearcoatNormalScale = new THREE.Vector2( scale, scale ); + + } + + } + + return Promise.all( pending ); + + }; + + /** + * Transmission Materials Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission + * Draft: https://github.com/KhronosGroup/glTF/pull/1698 + */ + function GLTFMaterialsTransmissionExtension( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_MATERIALS_TRANSMISSION; + + } + + GLTFMaterialsTransmissionExtension.prototype.getMaterialType = function ( materialIndex ) { + + var parser = this.parser; + var materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null; + + return THREE.MeshPhysicalMaterial; + + }; + + GLTFMaterialsTransmissionExtension.prototype.extendMaterialParams = function ( materialIndex, materialParams ) { + + var parser = this.parser; + var materialDef = parser.json.materials[ materialIndex ]; + + if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) { + + return Promise.resolve(); + + } + + var pending = []; + + var extension = materialDef.extensions[ this.name ]; + + if ( extension.transmissionFactor !== undefined ) { + + materialParams.transmission = extension.transmissionFactor; + + } + + if ( extension.transmissionTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'transmissionMap', extension.transmissionTexture ) ); + + } + + return Promise.all( pending ); + + }; + + /** + * BasisU Texture Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_basisu + */ + function GLTFTextureBasisUExtension( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.KHR_TEXTURE_BASISU; + + } + + GLTFTextureBasisUExtension.prototype.loadTexture = function ( textureIndex ) { + + var parser = this.parser; + var json = parser.json; + + var textureDef = json.textures[ textureIndex ]; + + if ( ! textureDef.extensions || ! textureDef.extensions[ this.name ] ) { + + return null; + + } + + var extension = textureDef.extensions[ this.name ]; + var source = json.images[ extension.source ]; + var loader = parser.options.ktx2Loader; + + if ( ! loader ) { + + if ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) { + + throw new Error( 'THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures' ); + + } else { + + // Assumes that the extension is optional and that a fallback texture is present + return null; + + } + + } + + return parser.loadTextureImage( textureIndex, source, loader ); + + }; + + /** + * WebP Texture Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_webp + */ + function GLTFTextureWebPExtension( parser ) { + + this.parser = parser; + this.name = EXTENSIONS.EXT_TEXTURE_WEBP; + this.isSupported = null; + + } + + GLTFTextureWebPExtension.prototype.loadTexture = function ( textureIndex ) { + + var name = this.name; + var parser = this.parser; + var json = parser.json; + + var textureDef = json.textures[ textureIndex ]; + + if ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) { + + return null; + + } + + var extension = textureDef.extensions[ name ]; + var source = json.images[ extension.source ]; + var loader = source.uri ? parser.options.manager.getHandler( source.uri ) : parser.textureLoader; + + return this.detectSupport().then( function ( isSupported ) { + + if ( isSupported ) return parser.loadTextureImage( textureIndex, source, loader ); + + if ( json.extensionsRequired && json.extensionsRequired.indexOf( name ) >= 0 ) { + + throw new Error( 'THREE.GLTFLoader: WebP required by asset but unsupported.' ); + + } + + // Fall back to PNG or JPEG. + return parser.loadTexture( textureIndex ); + + } ); + + }; + + GLTFTextureWebPExtension.prototype.detectSupport = function () { + + if ( ! this.isSupported ) { + + this.isSupported = new Promise( function ( resolve ) { + + var image = new Image(); + + // Lossy test image. Support for lossy images doesn't guarantee support for all + // WebP images, unfortunately. + image.src = 'data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA'; + + image.onload = image.onerror = function () { + + resolve( image.height === 1 ); + + }; + + } ); + + } + + return this.isSupported; + + }; + + /** + * meshopt BufferView Compression Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_meshopt_compression + */ + function GLTFMeshoptCompression( parser ) { + + this.name = EXTENSIONS.EXT_MESHOPT_COMPRESSION; + this.parser = parser; + + } + + GLTFMeshoptCompression.prototype.loadBufferView = function ( index ) { + + var json = this.parser.json; + var bufferView = json.bufferViews[ index ]; + + if ( bufferView.extensions && bufferView.extensions[ this.name ] ) { + + var extensionDef = bufferView.extensions[ this.name ]; + + var buffer = this.parser.getDependency( 'buffer', extensionDef.buffer ); + var decoder = this.parser.options.meshoptDecoder; + + if ( ! decoder || ! decoder.supported ) { + + if ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) { + + throw new Error( 'THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files' ); + + } else { + + // Assumes that the extension is optional and that fallback buffer data is present + return null; + + } + + } + + return Promise.all( [ buffer, decoder.ready ] ).then( function ( res ) { + + var byteOffset = extensionDef.byteOffset || 0; + var byteLength = extensionDef.byteLength || 0; + + var count = extensionDef.count; + var stride = extensionDef.byteStride; + + var result = new ArrayBuffer( count * stride ); + var source = new Uint8Array( res[ 0 ], byteOffset, byteLength ); + + decoder.decodeGltfBuffer( new Uint8Array( result ), count, stride, source, extensionDef.mode, extensionDef.filter ); + return result; + + } ); + + } else { + + return null; + + } + + }; + + /* BINARY EXTENSION */ + var BINARY_EXTENSION_HEADER_MAGIC = 'glTF'; + var BINARY_EXTENSION_HEADER_LENGTH = 12; + var BINARY_EXTENSION_CHUNK_TYPES = { JSON: 0x4E4F534A, BIN: 0x004E4942 }; + + function GLTFBinaryExtension( data ) { + + this.name = EXTENSIONS.KHR_BINARY_GLTF; + this.content = null; + this.body = null; + + var headerView = new DataView( data, 0, BINARY_EXTENSION_HEADER_LENGTH ); + + this.header = { + magic: THREE.LoaderUtils.decodeText( new Uint8Array( data.slice( 0, 4 ) ) ), + version: headerView.getUint32( 4, true ), + length: headerView.getUint32( 8, true ) + }; + + if ( this.header.magic !== BINARY_EXTENSION_HEADER_MAGIC ) { + + throw new Error( 'THREE.GLTFLoader: Unsupported glTF-Binary header.' ); + + } else if ( this.header.version < 2.0 ) { + + throw new Error( 'THREE.GLTFLoader: Legacy binary file detected.' ); + + } + + var chunkView = new DataView( data, BINARY_EXTENSION_HEADER_LENGTH ); + var chunkIndex = 0; + + while ( chunkIndex < chunkView.byteLength ) { + + var chunkLength = chunkView.getUint32( chunkIndex, true ); + chunkIndex += 4; + + var chunkType = chunkView.getUint32( chunkIndex, true ); + chunkIndex += 4; + + if ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON ) { + + var contentArray = new Uint8Array( data, BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength ); + this.content = THREE.LoaderUtils.decodeText( contentArray ); + + } else if ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN ) { + + var byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex; + this.body = data.slice( byteOffset, byteOffset + chunkLength ); + + } + + // Clients must ignore chunks with unknown types. + + chunkIndex += chunkLength; + + } + + if ( this.content === null ) { + + throw new Error( 'THREE.GLTFLoader: JSON content not found.' ); + + } + + } + + /** + * DRACO Mesh Compression Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression + */ + function GLTFDracoMeshCompressionExtension( json, dracoLoader ) { + + if ( ! dracoLoader ) { + + throw new Error( 'THREE.GLTFLoader: No DRACOLoader instance provided.' ); + + } + + this.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION; + this.json = json; + this.dracoLoader = dracoLoader; + this.dracoLoader.preload(); + + } + + GLTFDracoMeshCompressionExtension.prototype.decodePrimitive = function ( primitive, parser ) { + + var json = this.json; + var dracoLoader = this.dracoLoader; + var bufferViewIndex = primitive.extensions[ this.name ].bufferView; + var gltfAttributeMap = primitive.extensions[ this.name ].attributes; + var threeAttributeMap = {}; + var attributeNormalizedMap = {}; + var attributeTypeMap = {}; + + for ( var attributeName in gltfAttributeMap ) { + + var threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase(); + + threeAttributeMap[ threeAttributeName ] = gltfAttributeMap[ attributeName ]; + + } + + for ( attributeName in primitive.attributes ) { + + var threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase(); + + if ( gltfAttributeMap[ attributeName ] !== undefined ) { + + var accessorDef = json.accessors[ primitive.attributes[ attributeName ] ]; + var componentType = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ]; + + attributeTypeMap[ threeAttributeName ] = componentType; + attributeNormalizedMap[ threeAttributeName ] = accessorDef.normalized === true; + + } + + } + + return parser.getDependency( 'bufferView', bufferViewIndex ).then( function ( bufferView ) { + + return new Promise( function ( resolve ) { + + dracoLoader.decodeDracoFile( bufferView, function ( geometry ) { + + for ( var attributeName in geometry.attributes ) { + + var attribute = geometry.attributes[ attributeName ]; + var normalized = attributeNormalizedMap[ attributeName ]; + + if ( normalized !== undefined ) attribute.normalized = normalized; + + } + + resolve( geometry ); + + }, threeAttributeMap, attributeTypeMap ); + + } ); + + } ); + + }; + + /** + * Texture Transform Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_transform + */ + function GLTFTextureTransformExtension() { + + this.name = EXTENSIONS.KHR_TEXTURE_TRANSFORM; + + } + + GLTFTextureTransformExtension.prototype.extendTexture = function ( texture, transform ) { + + texture = texture.clone(); + + if ( transform.offset !== undefined ) { + + texture.offset.fromArray( transform.offset ); + + } + + if ( transform.rotation !== undefined ) { + + texture.rotation = transform.rotation; + + } + + if ( transform.scale !== undefined ) { + + texture.repeat.fromArray( transform.scale ); + + } + + if ( transform.texCoord !== undefined ) { + + console.warn( 'THREE.GLTFLoader: Custom UV sets in "' + this.name + '" extension not yet supported.' ); + + } + + texture.needsUpdate = true; + + return texture; + + }; + + /** + * Specular-Glossiness Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_pbrSpecularGlossiness + */ + + /** + * A sub class of THREE.StandardMaterial with some of the functionality + * changed via the `onBeforeCompile` callback + * @pailhead + */ + + function GLTFMeshStandardSGMaterial( params ) { + + THREE.MeshStandardMaterial.call( this ); + + this.isGLTFSpecularGlossinessMaterial = true; + + //various chunks that need replacing + var specularMapParsFragmentChunk = [ + '#ifdef USE_SPECULARMAP', + ' uniform sampler2D specularMap;', + '#endif' + ].join( '\n' ); + + var glossinessMapParsFragmentChunk = [ + '#ifdef USE_GLOSSINESSMAP', + ' uniform sampler2D glossinessMap;', + '#endif' + ].join( '\n' ); + + var specularMapFragmentChunk = [ + 'vec3 specularFactor = specular;', + '#ifdef USE_SPECULARMAP', + ' vec4 texelSpecular = texture2D( specularMap, vUv );', + ' texelSpecular = sRGBToLinear( texelSpecular );', + ' // reads channel RGB, compatible with a glTF Specular-Glossiness (RGBA) texture', + ' specularFactor *= texelSpecular.rgb;', + '#endif' + ].join( '\n' ); + + var glossinessMapFragmentChunk = [ + 'float glossinessFactor = glossiness;', + '#ifdef USE_GLOSSINESSMAP', + ' vec4 texelGlossiness = texture2D( glossinessMap, vUv );', + ' // reads channel A, compatible with a glTF Specular-Glossiness (RGBA) texture', + ' glossinessFactor *= texelGlossiness.a;', + '#endif' + ].join( '\n' ); + + var lightPhysicalFragmentChunk = [ + 'PhysicalMaterial material;', + 'material.diffuseColor = diffuseColor.rgb * ( 1. - max( specularFactor.r, max( specularFactor.g, specularFactor.b ) ) );', + 'vec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );', + 'float geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );', + 'material.specularRoughness = max( 1.0 - glossinessFactor, 0.0525 ); // 0.0525 corresponds to the base mip of a 256 cubemap.', + 'material.specularRoughness += geometryRoughness;', + 'material.specularRoughness = min( material.specularRoughness, 1.0 );', + 'material.specularColor = specularFactor;', + ].join( '\n' ); + + var uniforms = { + specular: { value: new THREE.Color().setHex( 0xffffff ) }, + glossiness: { value: 1 }, + specularMap: { value: null }, + glossinessMap: { value: null } + }; + + this._extraUniforms = uniforms; + + this.onBeforeCompile = function ( shader ) { + + for ( var uniformName in uniforms ) { + + shader.uniforms[ uniformName ] = uniforms[ uniformName ]; + + } + + shader.fragmentShader = shader.fragmentShader + .replace( 'uniform float roughness;', 'uniform vec3 specular;' ) + .replace( 'uniform float metalness;', 'uniform float glossiness;' ) + .replace( '#include ', specularMapParsFragmentChunk ) + .replace( '#include ', glossinessMapParsFragmentChunk ) + .replace( '#include ', specularMapFragmentChunk ) + .replace( '#include ', glossinessMapFragmentChunk ) + .replace( '#include ', lightPhysicalFragmentChunk ); + + }; + + Object.defineProperties( this, { + + specular: { + get: function () { + + return uniforms.specular.value; + + }, + set: function ( v ) { + + uniforms.specular.value = v; + + } + }, + + specularMap: { + get: function () { + + return uniforms.specularMap.value; + + }, + set: function ( v ) { + + uniforms.specularMap.value = v; + + if ( v ) { + + this.defines.USE_SPECULARMAP = ''; // USE_UV is set by the renderer for specular maps + + } else { + + delete this.defines.USE_SPECULARMAP; + + } + + } + }, + + glossiness: { + get: function () { + + return uniforms.glossiness.value; + + }, + set: function ( v ) { + + uniforms.glossiness.value = v; + + } + }, + + glossinessMap: { + get: function () { + + return uniforms.glossinessMap.value; + + }, + set: function ( v ) { + + uniforms.glossinessMap.value = v; + + if ( v ) { + + this.defines.USE_GLOSSINESSMAP = ''; + this.defines.USE_UV = ''; + + } else { + + delete this.defines.USE_GLOSSINESSMAP; + delete this.defines.USE_UV; + + } + + } + } + + } ); + + delete this.metalness; + delete this.roughness; + delete this.metalnessMap; + delete this.roughnessMap; + + this.setValues( params ); + + } + + GLTFMeshStandardSGMaterial.prototype = Object.create( THREE.MeshStandardMaterial.prototype ); + GLTFMeshStandardSGMaterial.prototype.constructor = GLTFMeshStandardSGMaterial; + + GLTFMeshStandardSGMaterial.prototype.copy = function ( source ) { + + THREE.MeshStandardMaterial.prototype.copy.call( this, source ); + this.specularMap = source.specularMap; + this.specular.copy( source.specular ); + this.glossinessMap = source.glossinessMap; + this.glossiness = source.glossiness; + delete this.metalness; + delete this.roughness; + delete this.metalnessMap; + delete this.roughnessMap; + return this; + + }; + + function GLTFMaterialsPbrSpecularGlossinessExtension() { + + return { + + name: EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS, + + specularGlossinessParams: [ + 'color', + 'map', + 'lightMap', + 'lightMapIntensity', + 'aoMap', + 'aoMapIntensity', + 'emissive', + 'emissiveIntensity', + 'emissiveMap', + 'bumpMap', + 'bumpScale', + 'normalMap', + 'normalMapType', + 'displacementMap', + 'displacementScale', + 'displacementBias', + 'specularMap', + 'specular', + 'glossinessMap', + 'glossiness', + 'alphaMap', + 'envMap', + 'envMapIntensity', + 'refractionRatio', + ], + + getMaterialType: function () { + + return GLTFMeshStandardSGMaterial; + + }, + + extendParams: function ( materialParams, materialDef, parser ) { + + var pbrSpecularGlossiness = materialDef.extensions[ this.name ]; + + materialParams.color = new THREE.Color( 1.0, 1.0, 1.0 ); + materialParams.opacity = 1.0; + + var pending = []; + + if ( Array.isArray( pbrSpecularGlossiness.diffuseFactor ) ) { + + var array = pbrSpecularGlossiness.diffuseFactor; + + materialParams.color.fromArray( array ); + materialParams.opacity = array[ 3 ]; + + } + + if ( pbrSpecularGlossiness.diffuseTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'map', pbrSpecularGlossiness.diffuseTexture ) ); + + } + + materialParams.emissive = new THREE.Color( 0.0, 0.0, 0.0 ); + materialParams.glossiness = pbrSpecularGlossiness.glossinessFactor !== undefined ? pbrSpecularGlossiness.glossinessFactor : 1.0; + materialParams.specular = new THREE.Color( 1.0, 1.0, 1.0 ); + + if ( Array.isArray( pbrSpecularGlossiness.specularFactor ) ) { + + materialParams.specular.fromArray( pbrSpecularGlossiness.specularFactor ); + + } + + if ( pbrSpecularGlossiness.specularGlossinessTexture !== undefined ) { + + var specGlossMapDef = pbrSpecularGlossiness.specularGlossinessTexture; + pending.push( parser.assignTexture( materialParams, 'glossinessMap', specGlossMapDef ) ); + pending.push( parser.assignTexture( materialParams, 'specularMap', specGlossMapDef ) ); + + } + + return Promise.all( pending ); + + }, + + createMaterial: function ( materialParams ) { + + var material = new GLTFMeshStandardSGMaterial( materialParams ); + material.fog = true; + + material.color = materialParams.color; + + material.map = materialParams.map === undefined ? null : materialParams.map; + + material.lightMap = null; + material.lightMapIntensity = 1.0; + + material.aoMap = materialParams.aoMap === undefined ? null : materialParams.aoMap; + material.aoMapIntensity = 1.0; + + material.emissive = materialParams.emissive; + material.emissiveIntensity = 1.0; + material.emissiveMap = materialParams.emissiveMap === undefined ? null : materialParams.emissiveMap; + + material.bumpMap = materialParams.bumpMap === undefined ? null : materialParams.bumpMap; + material.bumpScale = 1; + + material.normalMap = materialParams.normalMap === undefined ? null : materialParams.normalMap; + material.normalMapType = THREE.TangentSpaceNormalMap; + + if ( materialParams.normalScale ) material.normalScale = materialParams.normalScale; + + material.displacementMap = null; + material.displacementScale = 1; + material.displacementBias = 0; + + material.specularMap = materialParams.specularMap === undefined ? null : materialParams.specularMap; + material.specular = materialParams.specular; + + material.glossinessMap = materialParams.glossinessMap === undefined ? null : materialParams.glossinessMap; + material.glossiness = materialParams.glossiness; + + material.alphaMap = null; + + material.envMap = materialParams.envMap === undefined ? null : materialParams.envMap; + material.envMapIntensity = 1.0; + + material.refractionRatio = 0.98; + + return material; + + }, + + }; + + } + + /** + * Mesh Quantization Extension + * + * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization + */ + function GLTFMeshQuantizationExtension() { + + this.name = EXTENSIONS.KHR_MESH_QUANTIZATION; + + } + + /*********************************/ + /********** INTERPOLATION ********/ + /*********************************/ + + // Spline Interpolation + // Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#appendix-c-spline-interpolation + function GLTFCubicSplineInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) { + + THREE.Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); + + } + + GLTFCubicSplineInterpolant.prototype = Object.create( THREE.Interpolant.prototype ); + GLTFCubicSplineInterpolant.prototype.constructor = GLTFCubicSplineInterpolant; + + GLTFCubicSplineInterpolant.prototype.copySampleValue_ = function ( index ) { + + // Copies a sample value to the result buffer. See description of glTF + // CUBICSPLINE values layout in interpolate_() function below. + + var result = this.resultBuffer, + values = this.sampleValues, + valueSize = this.valueSize, + offset = index * valueSize * 3 + valueSize; + + for ( var i = 0; i !== valueSize; i ++ ) { + + result[ i ] = values[ offset + i ]; + + } + + return result; + + }; + + GLTFCubicSplineInterpolant.prototype.beforeStart_ = GLTFCubicSplineInterpolant.prototype.copySampleValue_; + + GLTFCubicSplineInterpolant.prototype.afterEnd_ = GLTFCubicSplineInterpolant.prototype.copySampleValue_; + + GLTFCubicSplineInterpolant.prototype.interpolate_ = function ( i1, t0, t, t1 ) { + + var result = this.resultBuffer; + var values = this.sampleValues; + var stride = this.valueSize; + + var stride2 = stride * 2; + var stride3 = stride * 3; + + var td = t1 - t0; + + var p = ( t - t0 ) / td; + var pp = p * p; + var ppp = pp * p; + + var offset1 = i1 * stride3; + var offset0 = offset1 - stride3; + + var s2 = - 2 * ppp + 3 * pp; + var s3 = ppp - pp; + var s0 = 1 - s2; + var s1 = s3 - pp + p; + + // Layout of keyframe output values for CUBICSPLINE animations: + // [ inTangent_1, splineVertex_1, outTangent_1, inTangent_2, splineVertex_2, ... ] + for ( var i = 0; i !== stride; i ++ ) { + + var p0 = values[ offset0 + i + stride ]; // splineVertex_k + var m0 = values[ offset0 + i + stride2 ] * td; // outTangent_k * (t_k+1 - t_k) + var p1 = values[ offset1 + i + stride ]; // splineVertex_k+1 + var m1 = values[ offset1 + i ] * td; // inTangent_k+1 * (t_k+1 - t_k) + + result[ i ] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1; + + } + + return result; + + }; + + /*********************************/ + /********** INTERNALS ************/ + /*********************************/ + + /* CONSTANTS */ + + var WEBGL_CONSTANTS = { + FLOAT: 5126, + //FLOAT_MAT2: 35674, + FLOAT_MAT3: 35675, + FLOAT_MAT4: 35676, + FLOAT_VEC2: 35664, + FLOAT_VEC3: 35665, + FLOAT_VEC4: 35666, + LINEAR: 9729, + REPEAT: 10497, + SAMPLER_2D: 35678, + POINTS: 0, + LINES: 1, + LINE_LOOP: 2, + LINE_STRIP: 3, + TRIANGLES: 4, + TRIANGLE_STRIP: 5, + TRIANGLE_FAN: 6, + UNSIGNED_BYTE: 5121, + UNSIGNED_SHORT: 5123 + }; + + var WEBGL_COMPONENT_TYPES = { + 5120: Int8Array, + 5121: Uint8Array, + 5122: Int16Array, + 5123: Uint16Array, + 5125: Uint32Array, + 5126: Float32Array + }; + + var WEBGL_FILTERS = { + 9728: THREE.NearestFilter, + 9729: THREE.LinearFilter, + 9984: THREE.NearestMipmapNearestFilter, + 9985: THREE.LinearMipmapNearestFilter, + 9986: THREE.NearestMipmapLinearFilter, + 9987: THREE.LinearMipmapLinearFilter + }; + + var WEBGL_WRAPPINGS = { + 33071: THREE.ClampToEdgeWrapping, + 33648: THREE.MirroredRepeatWrapping, + 10497: THREE.RepeatWrapping + }; + + var WEBGL_TYPE_SIZES = { + 'SCALAR': 1, + 'VEC2': 2, + 'VEC3': 3, + 'VEC4': 4, + 'MAT2': 4, + 'MAT3': 9, + 'MAT4': 16 + }; + + var ATTRIBUTES = { + POSITION: 'position', + NORMAL: 'normal', + TANGENT: 'tangent', + TEXCOORD_0: 'uv', + TEXCOORD_1: 'uv2', + COLOR_0: 'color', + WEIGHTS_0: 'skinWeight', + JOINTS_0: 'skinIndex', + }; + + var PATH_PROPERTIES = { + scale: 'scale', + translation: 'position', + rotation: 'quaternion', + weights: 'morphTargetInfluences' + }; + + var INTERPOLATION = { + CUBICSPLINE: undefined, // We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each + // keyframe track will be initialized with a default interpolation type, then modified. + LINEAR: THREE.InterpolateLinear, + STEP: THREE.InterpolateDiscrete + }; + + var ALPHA_MODES = { + OPAQUE: 'OPAQUE', + MASK: 'MASK', + BLEND: 'BLEND' + }; + + /* UTILITY FUNCTIONS */ + + function resolveURL( url, path ) { + + // Invalid URL + if ( typeof url !== 'string' || url === '' ) return ''; + + // Host Relative URL + if ( /^https?:\/\//i.test( path ) && /^\//.test( url ) ) { + + path = path.replace( /(^https?:\/\/[^\/]+).*/i, '$1' ); + + } + + // Absolute URL http://,https://,// + if ( /^(https?:)?\/\//i.test( url ) ) return url; + + // Data URI + if ( /^data:.*,.*$/i.test( url ) ) return url; + + // Blob URL + if ( /^blob:.*$/i.test( url ) ) return url; + + // Relative URL + return path + url; + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#default-material + */ + function createDefaultMaterial( cache ) { + + if ( cache[ 'DefaultMaterial' ] === undefined ) { + + cache[ 'DefaultMaterial' ] = new THREE.MeshStandardMaterial( { + color: 0xFFFFFF, + emissive: 0x000000, + metalness: 1, + roughness: 1, + transparent: false, + depthTest: true, + side: THREE.FrontSide + } ); + + } + + return cache[ 'DefaultMaterial' ]; + + } + + function addUnknownExtensionsToUserData( knownExtensions, object, objectDef ) { + + // Add unknown glTF extensions to an object's userData. + + for ( var name in objectDef.extensions ) { + + if ( knownExtensions[ name ] === undefined ) { + + object.userData.gltfExtensions = object.userData.gltfExtensions || {}; + object.userData.gltfExtensions[ name ] = objectDef.extensions[ name ]; + + } + + } + + } + + /** + * @param {THREE.Object3D|THREE.Material|THREE.BufferGeometry} object + * @param {GLTF.definition} gltfDef + */ + function assignExtrasToUserData( object, gltfDef ) { + + if ( gltfDef.extras !== undefined ) { + + if ( typeof gltfDef.extras === 'object' ) { + + Object.assign( object.userData, gltfDef.extras ); + + } else { + + console.warn( 'THREE.GLTFLoader: Ignoring primitive type .extras, ' + gltfDef.extras ); + + } + + } + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#morph-targets + * + * @param {THREE.BufferGeometry} geometry + * @param {Array} targets + * @param {GLTFParser} parser + * @return {Promise} + */ + function addMorphTargets( geometry, targets, parser ) { + + var hasMorphPosition = false; + var hasMorphNormal = false; + + for ( var i = 0, il = targets.length; i < il; i ++ ) { + + var target = targets[ i ]; + + if ( target.POSITION !== undefined ) hasMorphPosition = true; + if ( target.NORMAL !== undefined ) hasMorphNormal = true; + + if ( hasMorphPosition && hasMorphNormal ) break; + + } + + if ( ! hasMorphPosition && ! hasMorphNormal ) return Promise.resolve( geometry ); + + var pendingPositionAccessors = []; + var pendingNormalAccessors = []; + + for ( var i = 0, il = targets.length; i < il; i ++ ) { + + var target = targets[ i ]; + + if ( hasMorphPosition ) { + + var pendingAccessor = target.POSITION !== undefined + ? parser.getDependency( 'accessor', target.POSITION ) + : geometry.attributes.position; + + pendingPositionAccessors.push( pendingAccessor ); + + } + + if ( hasMorphNormal ) { + + var pendingAccessor = target.NORMAL !== undefined + ? parser.getDependency( 'accessor', target.NORMAL ) + : geometry.attributes.normal; + + pendingNormalAccessors.push( pendingAccessor ); + + } + + } + + return Promise.all( [ + Promise.all( pendingPositionAccessors ), + Promise.all( pendingNormalAccessors ) + ] ).then( function ( accessors ) { + + var morphPositions = accessors[ 0 ]; + var morphNormals = accessors[ 1 ]; + + if ( hasMorphPosition ) geometry.morphAttributes.position = morphPositions; + if ( hasMorphNormal ) geometry.morphAttributes.normal = morphNormals; + geometry.morphTargetsRelative = true; + + return geometry; + + } ); + + } + + /** + * @param {THREE.Mesh} mesh + * @param {GLTF.Mesh} meshDef + */ + function updateMorphTargets( mesh, meshDef ) { + + mesh.updateMorphTargets(); + + if ( meshDef.weights !== undefined ) { + + for ( var i = 0, il = meshDef.weights.length; i < il; i ++ ) { + + mesh.morphTargetInfluences[ i ] = meshDef.weights[ i ]; + + } + + } + + // .extras has user-defined data, so check that .extras.targetNames is an array. + if ( meshDef.extras && Array.isArray( meshDef.extras.targetNames ) ) { + + var targetNames = meshDef.extras.targetNames; + + if ( mesh.morphTargetInfluences.length === targetNames.length ) { + + mesh.morphTargetDictionary = {}; + + for ( var i = 0, il = targetNames.length; i < il; i ++ ) { + + mesh.morphTargetDictionary[ targetNames[ i ] ] = i; + + } + + } else { + + console.warn( 'THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.' ); + + } + + } + + } + + function createPrimitiveKey( primitiveDef ) { + + var dracoExtension = primitiveDef.extensions && primitiveDef.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ]; + var geometryKey; + + if ( dracoExtension ) { + + geometryKey = 'draco:' + dracoExtension.bufferView + + ':' + dracoExtension.indices + + ':' + createAttributesKey( dracoExtension.attributes ); + + } else { + + geometryKey = primitiveDef.indices + ':' + createAttributesKey( primitiveDef.attributes ) + ':' + primitiveDef.mode; + + } + + return geometryKey; + + } + + function createAttributesKey( attributes ) { + + var attributesKey = ''; + + var keys = Object.keys( attributes ).sort(); + + for ( var i = 0, il = keys.length; i < il; i ++ ) { + + attributesKey += keys[ i ] + ':' + attributes[ keys[ i ] ] + ';'; + + } + + return attributesKey; + + } + + /* GLTF PARSER */ + + function GLTFParser( json, options ) { + + this.json = json || {}; + this.extensions = {}; + this.plugins = {}; + this.options = options || {}; + + // loader object cache + this.cache = new GLTFRegistry(); + + // associations between Three.js objects and glTF elements + this.associations = new Map(); + + // BufferGeometry caching + this.primitiveCache = {}; + + // Object3D instance caches + this.meshCache = { refs: {}, uses: {} }; + this.cameraCache = { refs: {}, uses: {} }; + this.lightCache = { refs: {}, uses: {} }; + + // Track node names, to ensure no duplicates + this.nodeNamesUsed = {}; + + // Use an ImageBitmapLoader if imageBitmaps are supported. Moves much of the + // expensive work of uploading a texture to the GPU off the main thread. + if ( typeof createImageBitmap !== 'undefined' && /Firefox/.test( navigator.userAgent ) === false ) { + + this.textureLoader = new THREE.ImageBitmapLoader( this.options.manager ); + + } else { + + this.textureLoader = new THREE.TextureLoader( this.options.manager ); + + } + + this.textureLoader.setCrossOrigin( this.options.crossOrigin ); + + this.fileLoader = new THREE.FileLoader( this.options.manager ); + this.fileLoader.setResponseType( 'arraybuffer' ); + + if ( this.options.crossOrigin === 'use-credentials' ) { + + this.fileLoader.setWithCredentials( true ); + + } + + } + + GLTFParser.prototype.setExtensions = function ( extensions ) { + + this.extensions = extensions; + + }; + + GLTFParser.prototype.setPlugins = function ( plugins ) { + + this.plugins = plugins; + + }; + + GLTFParser.prototype.parse = function ( onLoad, onError ) { + + var parser = this; + var json = this.json; + var extensions = this.extensions; + + // Clear the loader cache + this.cache.removeAll(); + + // Mark the special nodes/meshes in json for efficient parse + this._invokeAll( function ( ext ) { + + return ext._markDefs && ext._markDefs(); + + } ); + + Promise.all( [ + + this.getDependencies( 'scene' ), + this.getDependencies( 'animation' ), + this.getDependencies( 'camera' ), + + ] ).then( function ( dependencies ) { + + var result = { + scene: dependencies[ 0 ][ json.scene || 0 ], + scenes: dependencies[ 0 ], + animations: dependencies[ 1 ], + cameras: dependencies[ 2 ], + asset: json.asset, + parser: parser, + userData: {} + }; + + addUnknownExtensionsToUserData( extensions, result, json ); + + assignExtrasToUserData( result, json ); + + onLoad( result ); + + } ).catch( onError ); + + }; + + /** + * Marks the special nodes/meshes in json for efficient parse. + */ + GLTFParser.prototype._markDefs = function () { + + var nodeDefs = this.json.nodes || []; + var skinDefs = this.json.skins || []; + var meshDefs = this.json.meshes || []; + + // Nothing in the node definition indicates whether it is a Bone or an + // Object3D. Use the skins' joint references to mark bones. + for ( var skinIndex = 0, skinLength = skinDefs.length; skinIndex < skinLength; skinIndex ++ ) { + + var joints = skinDefs[ skinIndex ].joints; + + for ( var i = 0, il = joints.length; i < il; i ++ ) { + + nodeDefs[ joints[ i ] ].isBone = true; + + } + + } + + // Iterate over all nodes, marking references to shared resources, + // as well as skeleton joints. + for ( var nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) { + + var nodeDef = nodeDefs[ nodeIndex ]; + + if ( nodeDef.mesh !== undefined ) { + + this._addNodeRef( this.meshCache, nodeDef.mesh ); + + // Nothing in the mesh definition indicates whether it is + // a SkinnedMesh or Mesh. Use the node's mesh reference + // to mark SkinnedMesh if node has skin. + if ( nodeDef.skin !== undefined ) { + + meshDefs[ nodeDef.mesh ].isSkinnedMesh = true; + + } + + } + + if ( nodeDef.camera !== undefined ) { + + this._addNodeRef( this.cameraCache, nodeDef.camera ); + + } + + } + + }; + + /** + * Counts references to shared node / Object3D resources. These resources + * can be reused, or "instantiated", at multiple nodes in the scene + * hierarchy. Mesh, Camera, and Light instances are instantiated and must + * be marked. Non-scenegraph resources (like Materials, Geometries, and + * Textures) can be reused directly and are not marked here. + * + * Example: CesiumMilkTruck sample model reuses "Wheel" meshes. + */ + GLTFParser.prototype._addNodeRef = function ( cache, index ) { + + if ( index === undefined ) return; + + if ( cache.refs[ index ] === undefined ) { + + cache.refs[ index ] = cache.uses[ index ] = 0; + + } + + cache.refs[ index ] ++; + + }; + + /** Returns a reference to a shared resource, cloning it if necessary. */ + GLTFParser.prototype._getNodeRef = function ( cache, index, object ) { + + if ( cache.refs[ index ] <= 1 ) return object; + + var ref = object.clone(); + + ref.name += '_instance_' + ( cache.uses[ index ] ++ ); + + return ref; + + }; + + GLTFParser.prototype._invokeOne = function ( func ) { + + var extensions = Object.values( this.plugins ); + extensions.push( this ); + + for ( var i = 0; i < extensions.length; i ++ ) { + + var result = func( extensions[ i ] ); + + if ( result ) return result; + + } + + }; + + GLTFParser.prototype._invokeAll = function ( func ) { + + var extensions = Object.values( this.plugins ); + extensions.unshift( this ); + + var pending = []; + + for ( var i = 0; i < extensions.length; i ++ ) { + + var result = func( extensions[ i ] ); + + if ( result ) pending.push( result ); + + } + + return pending; + + }; + + /** + * Requests the specified dependency asynchronously, with caching. + * @param {string} type + * @param {number} index + * @return {Promise} + */ + GLTFParser.prototype.getDependency = function ( type, index ) { + + var cacheKey = type + ':' + index; + var dependency = this.cache.get( cacheKey ); + + if ( ! dependency ) { + + switch ( type ) { + + case 'scene': + dependency = this.loadScene( index ); + break; + + case 'node': + dependency = this.loadNode( index ); + break; + + case 'mesh': + dependency = this._invokeOne( function ( ext ) { + + return ext.loadMesh && ext.loadMesh( index ); + + } ); + break; + + case 'accessor': + dependency = this.loadAccessor( index ); + break; + + case 'bufferView': + dependency = this._invokeOne( function ( ext ) { + + return ext.loadBufferView && ext.loadBufferView( index ); + + } ); + break; + + case 'buffer': + dependency = this.loadBuffer( index ); + break; + + case 'material': + dependency = this._invokeOne( function ( ext ) { + + return ext.loadMaterial && ext.loadMaterial( index ); + + } ); + break; + + case 'texture': + dependency = this._invokeOne( function ( ext ) { + + return ext.loadTexture && ext.loadTexture( index ); + + } ); + break; + + case 'skin': + dependency = this.loadSkin( index ); + break; + + case 'animation': + dependency = this.loadAnimation( index ); + break; + + case 'camera': + dependency = this.loadCamera( index ); + break; + + default: + throw new Error( 'Unknown type: ' + type ); + + } + + this.cache.add( cacheKey, dependency ); + + } + + return dependency; + + }; + + /** + * Requests all dependencies of the specified type asynchronously, with caching. + * @param {string} type + * @return {Promise>} + */ + GLTFParser.prototype.getDependencies = function ( type ) { + + var dependencies = this.cache.get( type ); + + if ( ! dependencies ) { + + var parser = this; + var defs = this.json[ type + ( type === 'mesh' ? 'es' : 's' ) ] || []; + + dependencies = Promise.all( defs.map( function ( def, index ) { + + return parser.getDependency( type, index ); + + } ) ); + + this.cache.add( type, dependencies ); + + } + + return dependencies; + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views + * @param {number} bufferIndex + * @return {Promise} + */ + GLTFParser.prototype.loadBuffer = function ( bufferIndex ) { + + var bufferDef = this.json.buffers[ bufferIndex ]; + var loader = this.fileLoader; + + if ( bufferDef.type && bufferDef.type !== 'arraybuffer' ) { + + throw new Error( 'THREE.GLTFLoader: ' + bufferDef.type + ' buffer type is not supported.' ); + + } + + // If present, GLB container is required to be the first buffer. + if ( bufferDef.uri === undefined && bufferIndex === 0 ) { + + return Promise.resolve( this.extensions[ EXTENSIONS.KHR_BINARY_GLTF ].body ); + + } + + var options = this.options; + + return new Promise( function ( resolve, reject ) { + + loader.load( resolveURL( bufferDef.uri, options.path ), resolve, undefined, function () { + + reject( new Error( 'THREE.GLTFLoader: Failed to load buffer "' + bufferDef.uri + '".' ) ); + + } ); + + } ); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views + * @param {number} bufferViewIndex + * @return {Promise} + */ + GLTFParser.prototype.loadBufferView = function ( bufferViewIndex ) { + + var bufferViewDef = this.json.bufferViews[ bufferViewIndex ]; + + return this.getDependency( 'buffer', bufferViewDef.buffer ).then( function ( buffer ) { + + var byteLength = bufferViewDef.byteLength || 0; + var byteOffset = bufferViewDef.byteOffset || 0; + return buffer.slice( byteOffset, byteOffset + byteLength ); + + } ); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors + * @param {number} accessorIndex + * @return {Promise} + */ + GLTFParser.prototype.loadAccessor = function ( accessorIndex ) { + + var parser = this; + var json = this.json; + + var accessorDef = this.json.accessors[ accessorIndex ]; + + if ( accessorDef.bufferView === undefined && accessorDef.sparse === undefined ) { + + // Ignore empty accessors, which may be used to declare runtime + // information about attributes coming from another source (e.g. Draco + // compression extension). + return Promise.resolve( null ); + + } + + var pendingBufferViews = []; + + if ( accessorDef.bufferView !== undefined ) { + + pendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.bufferView ) ); + + } else { + + pendingBufferViews.push( null ); + + } + + if ( accessorDef.sparse !== undefined ) { + + pendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.indices.bufferView ) ); + pendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.values.bufferView ) ); + + } + + return Promise.all( pendingBufferViews ).then( function ( bufferViews ) { + + var bufferView = bufferViews[ 0 ]; + + var itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ]; + var TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ]; + + // For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12. + var elementBytes = TypedArray.BYTES_PER_ELEMENT; + var itemBytes = elementBytes * itemSize; + var byteOffset = accessorDef.byteOffset || 0; + var byteStride = accessorDef.bufferView !== undefined ? json.bufferViews[ accessorDef.bufferView ].byteStride : undefined; + var normalized = accessorDef.normalized === true; + var array, bufferAttribute; + + // The buffer is not interleaved if the stride is the item size in bytes. + if ( byteStride && byteStride !== itemBytes ) { + + // Each "slice" of the buffer, as defined by 'count' elements of 'byteStride' bytes, gets its own InterleavedBuffer + // This makes sure that IBA.count reflects accessor.count properly + var ibSlice = Math.floor( byteOffset / byteStride ); + var ibCacheKey = 'InterleavedBuffer:' + accessorDef.bufferView + ':' + accessorDef.componentType + ':' + ibSlice + ':' + accessorDef.count; + var ib = parser.cache.get( ibCacheKey ); + + if ( ! ib ) { + + array = new TypedArray( bufferView, ibSlice * byteStride, accessorDef.count * byteStride / elementBytes ); + + // Integer parameters to IB/IBA are in array elements, not bytes. + ib = new THREE.InterleavedBuffer( array, byteStride / elementBytes ); + + parser.cache.add( ibCacheKey, ib ); + + } + + bufferAttribute = new THREE.InterleavedBufferAttribute( ib, itemSize, ( byteOffset % byteStride ) / elementBytes, normalized ); + + } else { + + if ( bufferView === null ) { + + array = new TypedArray( accessorDef.count * itemSize ); + + } else { + + array = new TypedArray( bufferView, byteOffset, accessorDef.count * itemSize ); + + } + + bufferAttribute = new THREE.BufferAttribute( array, itemSize, normalized ); + + } + + // https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#sparse-accessors + if ( accessorDef.sparse !== undefined ) { + + var itemSizeIndices = WEBGL_TYPE_SIZES.SCALAR; + var TypedArrayIndices = WEBGL_COMPONENT_TYPES[ accessorDef.sparse.indices.componentType ]; + + var byteOffsetIndices = accessorDef.sparse.indices.byteOffset || 0; + var byteOffsetValues = accessorDef.sparse.values.byteOffset || 0; + + var sparseIndices = new TypedArrayIndices( bufferViews[ 1 ], byteOffsetIndices, accessorDef.sparse.count * itemSizeIndices ); + var sparseValues = new TypedArray( bufferViews[ 2 ], byteOffsetValues, accessorDef.sparse.count * itemSize ); + + if ( bufferView !== null ) { + + // Avoid modifying the original ArrayBuffer, if the bufferView wasn't initialized with zeroes. + bufferAttribute = new THREE.BufferAttribute( bufferAttribute.array.slice(), bufferAttribute.itemSize, bufferAttribute.normalized ); + + } + + for ( var i = 0, il = sparseIndices.length; i < il; i ++ ) { + + var index = sparseIndices[ i ]; + + bufferAttribute.setX( index, sparseValues[ i * itemSize ] ); + if ( itemSize >= 2 ) bufferAttribute.setY( index, sparseValues[ i * itemSize + 1 ] ); + if ( itemSize >= 3 ) bufferAttribute.setZ( index, sparseValues[ i * itemSize + 2 ] ); + if ( itemSize >= 4 ) bufferAttribute.setW( index, sparseValues[ i * itemSize + 3 ] ); + if ( itemSize >= 5 ) throw new Error( 'THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.' ); + + } + + } + + return bufferAttribute; + + } ); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures + * @param {number} textureIndex + * @return {Promise} + */ + GLTFParser.prototype.loadTexture = function ( textureIndex ) { + + var parser = this; + var json = this.json; + var options = this.options; + + var textureDef = json.textures[ textureIndex ]; + + var textureExtensions = textureDef.extensions || {}; + + var source; + + if ( textureExtensions[ EXTENSIONS.MSFT_TEXTURE_DDS ] ) { + + source = json.images[ textureExtensions[ EXTENSIONS.MSFT_TEXTURE_DDS ].source ]; + + } else { + + source = json.images[ textureDef.source ]; + + } + + var loader; + + if ( source.uri ) { + + loader = options.manager.getHandler( source.uri ); + + } + + if ( ! loader ) { + + loader = textureExtensions[ EXTENSIONS.MSFT_TEXTURE_DDS ] + ? parser.extensions[ EXTENSIONS.MSFT_TEXTURE_DDS ].ddsLoader + : this.textureLoader; + + } + + return this.loadTextureImage( textureIndex, source, loader ); + + }; + + GLTFParser.prototype.loadTextureImage = function ( textureIndex, source, loader ) { + + var parser = this; + var json = this.json; + var options = this.options; + + var textureDef = json.textures[ textureIndex ]; + + var URL = self.URL || self.webkitURL; + + var sourceURI = source.uri; + var isObjectURL = false; + var hasAlpha = true; + + if ( source.mimeType === 'image/jpeg' ) hasAlpha = false; + + if ( source.bufferView !== undefined ) { + + // Load binary image data from bufferView, if provided. + + sourceURI = parser.getDependency( 'bufferView', source.bufferView ).then( function ( bufferView ) { + + if ( source.mimeType === 'image/png' ) { + + // Inspect the PNG 'IHDR' chunk to determine whether the image could have an + // alpha channel. This check is conservative — the image could have an alpha + // channel with all values == 1, and the indexed type (colorType == 3) only + // sometimes contains alpha. + // + // https://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header + var colorType = new DataView( bufferView, 25, 1 ).getUint8( 0, false ); + hasAlpha = colorType === 6 || colorType === 4 || colorType === 3; + + } + + isObjectURL = true; + var blob = new Blob( [ bufferView ], { type: source.mimeType } ); + sourceURI = URL.createObjectURL( blob ); + return sourceURI; + + } ); + + } + + return Promise.resolve( sourceURI ).then( function ( sourceURI ) { + + return new Promise( function ( resolve, reject ) { + + var onLoad = resolve; + + if ( loader.isImageBitmapLoader === true ) { + + onLoad = function ( imageBitmap ) { + + resolve( new THREE.CanvasTexture( imageBitmap ) ); + + }; + + } + + loader.load( resolveURL( sourceURI, options.path ), onLoad, undefined, reject ); + + } ); + + } ).then( function ( texture ) { + + // Clean up resources and configure Texture. + + if ( isObjectURL === true ) { + + URL.revokeObjectURL( sourceURI ); + + } + + texture.flipY = false; + + if ( textureDef.name ) texture.name = textureDef.name; + + // When there is definitely no alpha channel in the texture, set RGBFormat to save space. + if ( ! hasAlpha ) texture.format = THREE.RGBFormat; + + var samplers = json.samplers || {}; + var sampler = samplers[ textureDef.sampler ] || {}; + + texture.magFilter = WEBGL_FILTERS[ sampler.magFilter ] || THREE.LinearFilter; + texture.minFilter = WEBGL_FILTERS[ sampler.minFilter ] || THREE.LinearMipmapLinearFilter; + texture.wrapS = WEBGL_WRAPPINGS[ sampler.wrapS ] || THREE.RepeatWrapping; + texture.wrapT = WEBGL_WRAPPINGS[ sampler.wrapT ] || THREE.RepeatWrapping; + + parser.associations.set( texture, { + type: 'textures', + index: textureIndex + } ); + + return texture; + + } ); + + }; + + /** + * Asynchronously assigns a texture to the given material parameters. + * @param {Object} materialParams + * @param {string} mapName + * @param {Object} mapDef + * @return {Promise} + */ + GLTFParser.prototype.assignTexture = function ( materialParams, mapName, mapDef ) { + + var parser = this; + + return this.getDependency( 'texture', mapDef.index ).then( function ( texture ) { + + // Materials sample aoMap from UV set 1 and other maps from UV set 0 - this can't be configured + // However, we will copy UV set 0 to UV set 1 on demand for aoMap + if ( mapDef.texCoord !== undefined && mapDef.texCoord != 0 && ! ( mapName === 'aoMap' && mapDef.texCoord == 1 ) ) { + + console.warn( 'THREE.GLTFLoader: Custom UV set ' + mapDef.texCoord + ' for texture ' + mapName + ' not yet supported.' ); + + } + + if ( parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] ) { + + var transform = mapDef.extensions !== undefined ? mapDef.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] : undefined; + + if ( transform ) { + + var gltfReference = parser.associations.get( texture ); + texture = parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ].extendTexture( texture, transform ); + parser.associations.set( texture, gltfReference ); + + } + + } + + materialParams[ mapName ] = texture; + + } ); + + }; + + /** + * Assigns final material to a Mesh, Line, or Points instance. The instance + * already has a material (generated from the glTF material options alone) + * but reuse of the same glTF material may require multiple threejs materials + * to accomodate different primitive types, defines, etc. New materials will + * be created if necessary, and reused from a cache. + * @param {THREE.Object3D} mesh Mesh, Line, or Points instance. + */ + GLTFParser.prototype.assignFinalMaterial = function ( mesh ) { + + var geometry = mesh.geometry; + var material = mesh.material; + + var useVertexTangents = geometry.attributes.tangent !== undefined; + var useVertexColors = geometry.attributes.color !== undefined; + var useFlatShading = geometry.attributes.normal === undefined; + var useSkinning = mesh.isSkinnedMesh === true; + var useMorphTargets = Object.keys( geometry.morphAttributes ).length > 0; + var useMorphNormals = useMorphTargets && geometry.morphAttributes.normal !== undefined; + + if ( mesh.isPoints ) { + + var cacheKey = 'PointsMaterial:' + material.uuid; + + var pointsMaterial = this.cache.get( cacheKey ); + + if ( ! pointsMaterial ) { + + pointsMaterial = new THREE.PointsMaterial(); + THREE.Material.prototype.copy.call( pointsMaterial, material ); + pointsMaterial.color.copy( material.color ); + pointsMaterial.map = material.map; + pointsMaterial.sizeAttenuation = false; // glTF spec says points should be 1px + + this.cache.add( cacheKey, pointsMaterial ); + + } + + material = pointsMaterial; + + } else if ( mesh.isLine ) { + + var cacheKey = 'LineBasicMaterial:' + material.uuid; + + var lineMaterial = this.cache.get( cacheKey ); + + if ( ! lineMaterial ) { + + lineMaterial = new THREE.LineBasicMaterial(); + THREE.Material.prototype.copy.call( lineMaterial, material ); + lineMaterial.color.copy( material.color ); + + this.cache.add( cacheKey, lineMaterial ); + + } + + material = lineMaterial; + + } + + // Clone the material if it will be modified + if ( useVertexTangents || useVertexColors || useFlatShading || useSkinning || useMorphTargets ) { + + var cacheKey = 'ClonedMaterial:' + material.uuid + ':'; + + if ( material.isGLTFSpecularGlossinessMaterial ) cacheKey += 'specular-glossiness:'; + if ( useSkinning ) cacheKey += 'skinning:'; + if ( useVertexTangents ) cacheKey += 'vertex-tangents:'; + if ( useVertexColors ) cacheKey += 'vertex-colors:'; + if ( useFlatShading ) cacheKey += 'flat-shading:'; + if ( useMorphTargets ) cacheKey += 'morph-targets:'; + if ( useMorphNormals ) cacheKey += 'morph-normals:'; + + var cachedMaterial = this.cache.get( cacheKey ); + + if ( ! cachedMaterial ) { + + cachedMaterial = material.clone(); + + if ( useSkinning ) cachedMaterial.skinning = true; + if ( useVertexTangents ) cachedMaterial.vertexTangents = true; + if ( useVertexColors ) cachedMaterial.vertexColors = true; + if ( useFlatShading ) cachedMaterial.flatShading = true; + if ( useMorphTargets ) cachedMaterial.morphTargets = true; + if ( useMorphNormals ) cachedMaterial.morphNormals = true; + + this.cache.add( cacheKey, cachedMaterial ); + + this.associations.set( cachedMaterial, this.associations.get( material ) ); + + } + + material = cachedMaterial; + + } + + // workarounds for mesh and geometry + + if ( material.aoMap && geometry.attributes.uv2 === undefined && geometry.attributes.uv !== undefined ) { + + geometry.setAttribute( 'uv2', geometry.attributes.uv ); + + } + + // https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995 + if ( material.normalScale && ! useVertexTangents ) { + + material.normalScale.y = - material.normalScale.y; + + } + + if ( material.clearcoatNormalScale && ! useVertexTangents ) { + + material.clearcoatNormalScale.y = - material.clearcoatNormalScale.y; + + } + + mesh.material = material; + + }; + + GLTFParser.prototype.getMaterialType = function ( /* materialIndex */ ) { + + return THREE.MeshStandardMaterial; + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials + * @param {number} materialIndex + * @return {Promise} + */ + GLTFParser.prototype.loadMaterial = function ( materialIndex ) { + + var parser = this; + var json = this.json; + var extensions = this.extensions; + var materialDef = json.materials[ materialIndex ]; + + var materialType; + var materialParams = {}; + var materialExtensions = materialDef.extensions || {}; + + var pending = []; + + if ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ] ) { + + var sgExtension = extensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ]; + materialType = sgExtension.getMaterialType(); + pending.push( sgExtension.extendParams( materialParams, materialDef, parser ) ); + + } else if ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ] ) { + + var kmuExtension = extensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ]; + materialType = kmuExtension.getMaterialType(); + pending.push( kmuExtension.extendParams( materialParams, materialDef, parser ) ); + + } else { + + // Specification: + // https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#metallic-roughness-material + + var metallicRoughness = materialDef.pbrMetallicRoughness || {}; + + materialParams.color = new THREE.Color( 1.0, 1.0, 1.0 ); + materialParams.opacity = 1.0; + + if ( Array.isArray( metallicRoughness.baseColorFactor ) ) { + + var array = metallicRoughness.baseColorFactor; + + materialParams.color.fromArray( array ); + materialParams.opacity = array[ 3 ]; + + } + + if ( metallicRoughness.baseColorTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture ) ); + + } + + materialParams.metalness = metallicRoughness.metallicFactor !== undefined ? metallicRoughness.metallicFactor : 1.0; + materialParams.roughness = metallicRoughness.roughnessFactor !== undefined ? metallicRoughness.roughnessFactor : 1.0; + + if ( metallicRoughness.metallicRoughnessTexture !== undefined ) { + + pending.push( parser.assignTexture( materialParams, 'metalnessMap', metallicRoughness.metallicRoughnessTexture ) ); + pending.push( parser.assignTexture( materialParams, 'roughnessMap', metallicRoughness.metallicRoughnessTexture ) ); + + } + + materialType = this._invokeOne( function ( ext ) { + + return ext.getMaterialType && ext.getMaterialType( materialIndex ); + + } ); + + pending.push( Promise.all( this._invokeAll( function ( ext ) { + + return ext.extendMaterialParams && ext.extendMaterialParams( materialIndex, materialParams ); + + } ) ) ); + + } + + if ( materialDef.doubleSided === true ) { + + materialParams.side = THREE.DoubleSide; + + } + + var alphaMode = materialDef.alphaMode || ALPHA_MODES.OPAQUE; + + if ( alphaMode === ALPHA_MODES.BLEND ) { + + materialParams.transparent = true; + + // See: https://github.com/mrdoob/three.js/issues/17706 + materialParams.depthWrite = false; + + } else { + + materialParams.transparent = false; + + if ( alphaMode === ALPHA_MODES.MASK ) { + + materialParams.alphaTest = materialDef.alphaCutoff !== undefined ? materialDef.alphaCutoff : 0.5; + + } + + } + + if ( materialDef.normalTexture !== undefined && materialType !== THREE.MeshBasicMaterial ) { + + pending.push( parser.assignTexture( materialParams, 'normalMap', materialDef.normalTexture ) ); + + materialParams.normalScale = new THREE.Vector2( 1, 1 ); + + if ( materialDef.normalTexture.scale !== undefined ) { + + materialParams.normalScale.set( materialDef.normalTexture.scale, materialDef.normalTexture.scale ); + + } + + } + + if ( materialDef.occlusionTexture !== undefined && materialType !== THREE.MeshBasicMaterial ) { + + pending.push( parser.assignTexture( materialParams, 'aoMap', materialDef.occlusionTexture ) ); + + if ( materialDef.occlusionTexture.strength !== undefined ) { + + materialParams.aoMapIntensity = materialDef.occlusionTexture.strength; + + } + + } + + if ( materialDef.emissiveFactor !== undefined && materialType !== THREE.MeshBasicMaterial ) { + + materialParams.emissive = new THREE.Color().fromArray( materialDef.emissiveFactor ); + + } + + if ( materialDef.emissiveTexture !== undefined && materialType !== THREE.MeshBasicMaterial ) { + + pending.push( parser.assignTexture( materialParams, 'emissiveMap', materialDef.emissiveTexture ) ); + + } + + return Promise.all( pending ).then( function () { + + var material; + + if ( materialType === GLTFMeshStandardSGMaterial ) { + + material = extensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ].createMaterial( materialParams ); + + } else { + + material = new materialType( materialParams ); + + } + + if ( materialDef.name ) material.name = materialDef.name; + + // baseColorTexture, emissiveTexture, and specularGlossinessTexture use sRGB encoding. + if ( material.map ) material.map.encoding = THREE.sRGBEncoding; + if ( material.emissiveMap ) material.emissiveMap.encoding = THREE.sRGBEncoding; + + assignExtrasToUserData( material, materialDef ); + + parser.associations.set( material, { type: 'materials', index: materialIndex } ); + + if ( materialDef.extensions ) addUnknownExtensionsToUserData( extensions, material, materialDef ); + + return material; + + } ); + + }; + + /** When Object3D instances are targeted by animation, they need unique names. */ + GLTFParser.prototype.createUniqueName = function ( originalName ) { + + var sanitizedName = THREE.PropertyBinding.sanitizeNodeName( originalName || '' ); + + var name = sanitizedName; + + for ( var i = 1; this.nodeNamesUsed[ name ]; ++ i ) { + + name = sanitizedName + '_' + i; + + } + + this.nodeNamesUsed[ name ] = true; + + return name; + + }; + + /** + * @param {THREE.BufferGeometry} geometry + * @param {GLTF.Primitive} primitiveDef + * @param {GLTFParser} parser + */ + function computeBounds( geometry, primitiveDef, parser ) { + + var attributes = primitiveDef.attributes; + + var box = new THREE.Box3(); + + if ( attributes.POSITION !== undefined ) { + + var accessor = parser.json.accessors[ attributes.POSITION ]; + + var min = accessor.min; + var max = accessor.max; + + // glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement. + + if ( min !== undefined && max !== undefined ) { + + box.set( + new THREE.Vector3( min[ 0 ], min[ 1 ], min[ 2 ] ), + new THREE.Vector3( max[ 0 ], max[ 1 ], max[ 2 ] ) ); + + } else { + + console.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' ); + + return; + + } + + } else { + + return; + + } + + var targets = primitiveDef.targets; + + if ( targets !== undefined ) { + + var maxDisplacement = new THREE.Vector3(); + var vector = new THREE.Vector3(); + + for ( var i = 0, il = targets.length; i < il; i ++ ) { + + var target = targets[ i ]; + + if ( target.POSITION !== undefined ) { + + var accessor = parser.json.accessors[ target.POSITION ]; + var min = accessor.min; + var max = accessor.max; + + // glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement. + + if ( min !== undefined && max !== undefined ) { + + // we need to get max of absolute components because target weight is [-1,1] + vector.setX( Math.max( Math.abs( min[ 0 ] ), Math.abs( max[ 0 ] ) ) ); + vector.setY( Math.max( Math.abs( min[ 1 ] ), Math.abs( max[ 1 ] ) ) ); + vector.setZ( Math.max( Math.abs( min[ 2 ] ), Math.abs( max[ 2 ] ) ) ); + + // Note: this assumes that the sum of all weights is at most 1. This isn't quite correct - it's more conservative + // to assume that each target can have a max weight of 1. However, for some use cases - notably, when morph targets + // are used to implement key-frame animations and as such only two are active at a time - this results in very large + // boxes. So for now we make a box that's sometimes a touch too small but is hopefully mostly of reasonable size. + maxDisplacement.max( vector ); + + } else { + + console.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' ); + + } + + } + + } + + // As per comment above this box isn't conservative, but has a reasonable size for a very large number of morph targets. + box.expandByVector( maxDisplacement ); + + } + + geometry.boundingBox = box; + + var sphere = new THREE.Sphere(); + + box.getCenter( sphere.center ); + sphere.radius = box.min.distanceTo( box.max ) / 2; + + geometry.boundingSphere = sphere; + + } + + /** + * @param {THREE.BufferGeometry} geometry + * @param {GLTF.Primitive} primitiveDef + * @param {GLTFParser} parser + * @return {Promise} + */ + function addPrimitiveAttributes( geometry, primitiveDef, parser ) { + + var attributes = primitiveDef.attributes; + + var pending = []; + + function assignAttributeAccessor( accessorIndex, attributeName ) { + + return parser.getDependency( 'accessor', accessorIndex ) + .then( function ( accessor ) { + + geometry.setAttribute( attributeName, accessor ); + + } ); + + } + + for ( var gltfAttributeName in attributes ) { + + var threeAttributeName = ATTRIBUTES[ gltfAttributeName ] || gltfAttributeName.toLowerCase(); + + // Skip attributes already provided by e.g. Draco extension. + if ( threeAttributeName in geometry.attributes ) continue; + + pending.push( assignAttributeAccessor( attributes[ gltfAttributeName ], threeAttributeName ) ); + + } + + if ( primitiveDef.indices !== undefined && ! geometry.index ) { + + var accessor = parser.getDependency( 'accessor', primitiveDef.indices ).then( function ( accessor ) { + + geometry.setIndex( accessor ); + + } ); + + pending.push( accessor ); + + } + + assignExtrasToUserData( geometry, primitiveDef ); + + computeBounds( geometry, primitiveDef, parser ); + + return Promise.all( pending ).then( function () { + + return primitiveDef.targets !== undefined + ? addMorphTargets( geometry, primitiveDef.targets, parser ) + : geometry; + + } ); + + } + + /** + * @param {THREE.BufferGeometry} geometry + * @param {Number} drawMode + * @return {THREE.BufferGeometry} + */ + function toTrianglesDrawMode( geometry, drawMode ) { + + var index = geometry.getIndex(); + + // generate index if not present + + if ( index === null ) { + + var indices = []; + + var position = geometry.getAttribute( 'position' ); + + if ( position !== undefined ) { + + for ( var i = 0; i < position.count; i ++ ) { + + indices.push( i ); + + } + + geometry.setIndex( indices ); + index = geometry.getIndex(); + + } else { + + console.error( 'THREE.GLTFLoader.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.' ); + return geometry; + + } + + } + + // + + var numberOfTriangles = index.count - 2; + var newIndices = []; + + if ( drawMode === THREE.TriangleFanDrawMode ) { + + // gl.TRIANGLE_FAN + + for ( var i = 1; i <= numberOfTriangles; i ++ ) { + + newIndices.push( index.getX( 0 ) ); + newIndices.push( index.getX( i ) ); + newIndices.push( index.getX( i + 1 ) ); + + } + + } else { + + // gl.TRIANGLE_STRIP + + for ( var i = 0; i < numberOfTriangles; i ++ ) { + + if ( i % 2 === 0 ) { + + newIndices.push( index.getX( i ) ); + newIndices.push( index.getX( i + 1 ) ); + newIndices.push( index.getX( i + 2 ) ); + + + } else { + + newIndices.push( index.getX( i + 2 ) ); + newIndices.push( index.getX( i + 1 ) ); + newIndices.push( index.getX( i ) ); + + } + + } + + } + + if ( ( newIndices.length / 3 ) !== numberOfTriangles ) { + + console.error( 'THREE.GLTFLoader.toTrianglesDrawMode(): Unable to generate correct amount of triangles.' ); + + } + + // build final geometry + + var newGeometry = geometry.clone(); + newGeometry.setIndex( newIndices ); + + return newGeometry; + + } + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry + * + * Creates BufferGeometries from primitives. + * + * @param {Array} primitives + * @return {Promise>} + */ + GLTFParser.prototype.loadGeometries = function ( primitives ) { + + var parser = this; + var extensions = this.extensions; + var cache = this.primitiveCache; + + function createDracoPrimitive( primitive ) { + + return extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] + .decodePrimitive( primitive, parser ) + .then( function ( geometry ) { + + return addPrimitiveAttributes( geometry, primitive, parser ); + + } ); + + } + + var pending = []; + + for ( var i = 0, il = primitives.length; i < il; i ++ ) { + + var primitive = primitives[ i ]; + var cacheKey = createPrimitiveKey( primitive ); + + // See if we've already created this geometry + var cached = cache[ cacheKey ]; + + if ( cached ) { + + // Use the cached geometry if it exists + pending.push( cached.promise ); + + } else { + + var geometryPromise; + + if ( primitive.extensions && primitive.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] ) { + + // Use DRACO geometry if available + geometryPromise = createDracoPrimitive( primitive ); + + } else { + + // Otherwise create a new geometry + geometryPromise = addPrimitiveAttributes( new THREE.BufferGeometry(), primitive, parser ); + + } + + // Cache this geometry + cache[ cacheKey ] = { primitive: primitive, promise: geometryPromise }; + + pending.push( geometryPromise ); + + } + + } + + return Promise.all( pending ); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes + * @param {number} meshIndex + * @return {Promise} + */ + GLTFParser.prototype.loadMesh = function ( meshIndex ) { + + var parser = this; + var json = this.json; + var extensions = this.extensions; + + var meshDef = json.meshes[ meshIndex ]; + var primitives = meshDef.primitives; + + var pending = []; + + for ( var i = 0, il = primitives.length; i < il; i ++ ) { + + var material = primitives[ i ].material === undefined + ? createDefaultMaterial( this.cache ) + : this.getDependency( 'material', primitives[ i ].material ); + + pending.push( material ); + + } + + pending.push( parser.loadGeometries( primitives ) ); + + return Promise.all( pending ).then( function ( results ) { + + var materials = results.slice( 0, results.length - 1 ); + var geometries = results[ results.length - 1 ]; + + var meshes = []; + + for ( var i = 0, il = geometries.length; i < il; i ++ ) { + + var geometry = geometries[ i ]; + var primitive = primitives[ i ]; + + // 1. create Mesh + + var mesh; + + var material = materials[ i ]; + + if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLES || + primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP || + primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN || + primitive.mode === undefined ) { + + // .isSkinnedMesh isn't in glTF spec. See ._markDefs() + mesh = meshDef.isSkinnedMesh === true + ? new THREE.SkinnedMesh( geometry, material ) + : new THREE.Mesh( geometry, material ); + + if ( mesh.isSkinnedMesh === true && ! mesh.geometry.attributes.skinWeight.normalized ) { + + // we normalize floating point skin weight array to fix malformed assets (see #15319) + // it's important to skip this for non-float32 data since normalizeSkinWeights assumes non-normalized inputs + mesh.normalizeSkinWeights(); + + } + + if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ) { + + mesh.geometry = toTrianglesDrawMode( mesh.geometry, THREE.TriangleStripDrawMode ); + + } else if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ) { + + mesh.geometry = toTrianglesDrawMode( mesh.geometry, THREE.TriangleFanDrawMode ); + + } + + } else if ( primitive.mode === WEBGL_CONSTANTS.LINES ) { + + mesh = new THREE.LineSegments( geometry, material ); + + } else if ( primitive.mode === WEBGL_CONSTANTS.LINE_STRIP ) { + + mesh = new THREE.Line( geometry, material ); + + } else if ( primitive.mode === WEBGL_CONSTANTS.LINE_LOOP ) { + + mesh = new THREE.LineLoop( geometry, material ); + + } else if ( primitive.mode === WEBGL_CONSTANTS.POINTS ) { + + mesh = new THREE.Points( geometry, material ); + + } else { + + throw new Error( 'THREE.GLTFLoader: Primitive mode unsupported: ' + primitive.mode ); + + } + + if ( Object.keys( mesh.geometry.morphAttributes ).length > 0 ) { + + updateMorphTargets( mesh, meshDef ); + + } + + mesh.name = parser.createUniqueName( meshDef.name || ( 'mesh_' + meshIndex ) ); + + assignExtrasToUserData( mesh, meshDef ); + + if ( primitive.extensions ) addUnknownExtensionsToUserData( extensions, mesh, primitive ); + + parser.assignFinalMaterial( mesh ); + + meshes.push( mesh ); + + } + + if ( meshes.length === 1 ) { + + return meshes[ 0 ]; + + } + + var group = new THREE.Group(); + + for ( var i = 0, il = meshes.length; i < il; i ++ ) { + + group.add( meshes[ i ] ); + + } + + return group; + + } ); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras + * @param {number} cameraIndex + * @return {Promise} + */ + GLTFParser.prototype.loadCamera = function ( cameraIndex ) { + + var camera; + var cameraDef = this.json.cameras[ cameraIndex ]; + var params = cameraDef[ cameraDef.type ]; + + if ( ! params ) { + + console.warn( 'THREE.GLTFLoader: Missing camera parameters.' ); + return; + + } + + if ( cameraDef.type === 'perspective' ) { + + camera = new THREE.PerspectiveCamera( THREE.MathUtils.radToDeg( params.yfov ), params.aspectRatio || 1, params.znear || 1, params.zfar || 2e6 ); + + } else if ( cameraDef.type === 'orthographic' ) { + + camera = new THREE.OrthographicCamera( - params.xmag, params.xmag, params.ymag, - params.ymag, params.znear, params.zfar ); + + } + + if ( cameraDef.name ) camera.name = this.createUniqueName( cameraDef.name ); + + assignExtrasToUserData( camera, cameraDef ); + + return Promise.resolve( camera ); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins + * @param {number} skinIndex + * @return {Promise} + */ + GLTFParser.prototype.loadSkin = function ( skinIndex ) { + + var skinDef = this.json.skins[ skinIndex ]; + + var skinEntry = { joints: skinDef.joints }; + + if ( skinDef.inverseBindMatrices === undefined ) { + + return Promise.resolve( skinEntry ); + + } + + return this.getDependency( 'accessor', skinDef.inverseBindMatrices ).then( function ( accessor ) { + + skinEntry.inverseBindMatrices = accessor; + + return skinEntry; + + } ); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations + * @param {number} animationIndex + * @return {Promise} + */ + GLTFParser.prototype.loadAnimation = function ( animationIndex ) { + + var json = this.json; + + var animationDef = json.animations[ animationIndex ]; + + var pendingNodes = []; + var pendingInputAccessors = []; + var pendingOutputAccessors = []; + var pendingSamplers = []; + var pendingTargets = []; + + for ( var i = 0, il = animationDef.channels.length; i < il; i ++ ) { + + var channel = animationDef.channels[ i ]; + var sampler = animationDef.samplers[ channel.sampler ]; + var target = channel.target; + var name = target.node !== undefined ? target.node : target.id; // NOTE: target.id is deprecated. + var input = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.input ] : sampler.input; + var output = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.output ] : sampler.output; + + pendingNodes.push( this.getDependency( 'node', name ) ); + pendingInputAccessors.push( this.getDependency( 'accessor', input ) ); + pendingOutputAccessors.push( this.getDependency( 'accessor', output ) ); + pendingSamplers.push( sampler ); + pendingTargets.push( target ); + + } + + return Promise.all( [ + + Promise.all( pendingNodes ), + Promise.all( pendingInputAccessors ), + Promise.all( pendingOutputAccessors ), + Promise.all( pendingSamplers ), + Promise.all( pendingTargets ) + + ] ).then( function ( dependencies ) { + + var nodes = dependencies[ 0 ]; + var inputAccessors = dependencies[ 1 ]; + var outputAccessors = dependencies[ 2 ]; + var samplers = dependencies[ 3 ]; + var targets = dependencies[ 4 ]; + + var tracks = []; + + for ( var i = 0, il = nodes.length; i < il; i ++ ) { + + var node = nodes[ i ]; + var inputAccessor = inputAccessors[ i ]; + var outputAccessor = outputAccessors[ i ]; + var sampler = samplers[ i ]; + var target = targets[ i ]; + + if ( node === undefined ) continue; + + node.updateMatrix(); + node.matrixAutoUpdate = true; + + var TypedKeyframeTrack; + + switch ( PATH_PROPERTIES[ target.path ] ) { + + case PATH_PROPERTIES.weights: + + TypedKeyframeTrack = THREE.NumberKeyframeTrack; + break; + + case PATH_PROPERTIES.rotation: + + TypedKeyframeTrack = THREE.QuaternionKeyframeTrack; + break; + + case PATH_PROPERTIES.position: + case PATH_PROPERTIES.scale: + default: + + TypedKeyframeTrack = THREE.VectorKeyframeTrack; + break; + + } + + var targetName = node.name ? node.name : node.uuid; + + var interpolation = sampler.interpolation !== undefined ? INTERPOLATION[ sampler.interpolation ] : THREE.InterpolateLinear; + + var targetNames = []; + + if ( PATH_PROPERTIES[ target.path ] === PATH_PROPERTIES.weights ) { + + // Node may be a THREE.Group (glTF mesh with several primitives) or a THREE.Mesh. + node.traverse( function ( object ) { + + if ( object.isMesh === true && object.morphTargetInfluences ) { + + targetNames.push( object.name ? object.name : object.uuid ); + + } + + } ); + + } else { + + targetNames.push( targetName ); + + } + + var outputArray = outputAccessor.array; + + if ( outputAccessor.normalized ) { + + var scale; + + if ( outputArray.constructor === Int8Array ) { + + scale = 1 / 127; + + } else if ( outputArray.constructor === Uint8Array ) { + + scale = 1 / 255; + + } else if ( outputArray.constructor == Int16Array ) { + + scale = 1 / 32767; + + } else if ( outputArray.constructor === Uint16Array ) { + + scale = 1 / 65535; + + } else { + + throw new Error( 'THREE.GLTFLoader: Unsupported output accessor component type.' ); + + } + + var scaled = new Float32Array( outputArray.length ); + + for ( var j = 0, jl = outputArray.length; j < jl; j ++ ) { + + scaled[ j ] = outputArray[ j ] * scale; + + } + + outputArray = scaled; + + } + + for ( var j = 0, jl = targetNames.length; j < jl; j ++ ) { + + var track = new TypedKeyframeTrack( + targetNames[ j ] + '.' + PATH_PROPERTIES[ target.path ], + inputAccessor.array, + outputArray, + interpolation + ); + + // Override interpolation with custom factory method. + if ( sampler.interpolation === 'CUBICSPLINE' ) { + + track.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline( result ) { + + // A CUBICSPLINE keyframe in glTF has three output values for each input value, + // representing inTangent, splineVertex, and outTangent. As a result, track.getValueSize() + // must be divided by three to get the interpolant's sampleSize argument. + + return new GLTFCubicSplineInterpolant( this.times, this.values, this.getValueSize() / 3, result ); + + }; + + // Mark as CUBICSPLINE. `track.getInterpolation()` doesn't support custom interpolants. + track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true; + + } + + tracks.push( track ); + + } + + } + + var name = animationDef.name ? animationDef.name : 'animation_' + animationIndex; + + return new THREE.AnimationClip( name, undefined, tracks ); + + } ); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy + * @param {number} nodeIndex + * @return {Promise} + */ + GLTFParser.prototype.loadNode = function ( nodeIndex ) { + + var json = this.json; + var extensions = this.extensions; + var parser = this; + + var nodeDef = json.nodes[ nodeIndex ]; + + // reserve node's name before its dependencies, so the root has the intended name. + var nodeName = nodeDef.name ? parser.createUniqueName( nodeDef.name ) : ''; + + return ( function () { + + var pending = []; + + if ( nodeDef.mesh !== undefined ) { + + pending.push( parser.getDependency( 'mesh', nodeDef.mesh ).then( function ( mesh ) { + + var node = parser._getNodeRef( parser.meshCache, nodeDef.mesh, mesh ); + + // if weights are provided on the node, override weights on the mesh. + if ( nodeDef.weights !== undefined ) { + + node.traverse( function ( o ) { + + if ( ! o.isMesh ) return; + + for ( var i = 0, il = nodeDef.weights.length; i < il; i ++ ) { + + o.morphTargetInfluences[ i ] = nodeDef.weights[ i ]; + + } + + } ); + + } + + return node; + + } ) ); + + } + + if ( nodeDef.camera !== undefined ) { + + pending.push( parser.getDependency( 'camera', nodeDef.camera ).then( function ( camera ) { + + return parser._getNodeRef( parser.cameraCache, nodeDef.camera, camera ); + + } ) ); + + } + + parser._invokeAll( function ( ext ) { + + return ext.createNodeAttachment && ext.createNodeAttachment( nodeIndex ); + + } ).forEach( function ( promise ) { + + pending.push( promise ); + + } ); + + return Promise.all( pending ); + + }() ).then( function ( objects ) { + + var node; + + // .isBone isn't in glTF spec. See ._markDefs + if ( nodeDef.isBone === true ) { + + node = new THREE.Bone(); + + } else if ( objects.length > 1 ) { + + node = new THREE.Group(); + + } else if ( objects.length === 1 ) { + + node = objects[ 0 ]; + + } else { + + node = new THREE.Object3D(); + + } + + if ( node !== objects[ 0 ] ) { + + for ( var i = 0, il = objects.length; i < il; i ++ ) { + + node.add( objects[ i ] ); + + } + + } + + if ( nodeDef.name ) { + + node.userData.name = nodeDef.name; + node.name = nodeName; + + } + + assignExtrasToUserData( node, nodeDef ); + + if ( nodeDef.extensions ) addUnknownExtensionsToUserData( extensions, node, nodeDef ); + + if ( nodeDef.matrix !== undefined ) { + + var matrix = new THREE.Matrix4(); + matrix.fromArray( nodeDef.matrix ); + node.applyMatrix4( matrix ); + + } else { + + if ( nodeDef.translation !== undefined ) { + + node.position.fromArray( nodeDef.translation ); + + } + + if ( nodeDef.rotation !== undefined ) { + + node.quaternion.fromArray( nodeDef.rotation ); + + } + + if ( nodeDef.scale !== undefined ) { + + node.scale.fromArray( nodeDef.scale ); + + } + + } + + parser.associations.set( node, { type: 'nodes', index: nodeIndex } ); + + return node; + + } ); + + }; + + /** + * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes + * @param {number} sceneIndex + * @return {Promise} + */ + GLTFParser.prototype.loadScene = function () { + + // scene node hierachy builder + + function buildNodeHierachy( nodeId, parentObject, json, parser ) { + + var nodeDef = json.nodes[ nodeId ]; + + return parser.getDependency( 'node', nodeId ).then( function ( node ) { + + if ( nodeDef.skin === undefined ) return node; + + // build skeleton here as well + + var skinEntry; + + return parser.getDependency( 'skin', nodeDef.skin ).then( function ( skin ) { + + skinEntry = skin; + + var pendingJoints = []; + + for ( var i = 0, il = skinEntry.joints.length; i < il; i ++ ) { + + pendingJoints.push( parser.getDependency( 'node', skinEntry.joints[ i ] ) ); + + } + + return Promise.all( pendingJoints ); + + } ).then( function ( jointNodes ) { + + node.traverse( function ( mesh ) { + + if ( ! mesh.isMesh ) return; + + var bones = []; + var boneInverses = []; + + for ( var j = 0, jl = jointNodes.length; j < jl; j ++ ) { + + var jointNode = jointNodes[ j ]; + + if ( jointNode ) { + + bones.push( jointNode ); + + var mat = new THREE.Matrix4(); + + if ( skinEntry.inverseBindMatrices !== undefined ) { + + mat.fromArray( skinEntry.inverseBindMatrices.array, j * 16 ); + + } + + boneInverses.push( mat ); + + } else { + + console.warn( 'THREE.GLTFLoader: Joint "%s" could not be found.', skinEntry.joints[ j ] ); + + } + + } + + mesh.bind( new THREE.Skeleton( bones, boneInverses ), mesh.matrixWorld ); + + } ); + + return node; + + } ); + + } ).then( function ( node ) { + + // build node hierachy + + parentObject.add( node ); + + var pending = []; + + if ( nodeDef.children ) { + + var children = nodeDef.children; + + for ( var i = 0, il = children.length; i < il; i ++ ) { + + var child = children[ i ]; + pending.push( buildNodeHierachy( child, node, json, parser ) ); + + } + + } + + return Promise.all( pending ); + + } ); + + } + + return function loadScene( sceneIndex ) { + + var json = this.json; + var extensions = this.extensions; + var sceneDef = this.json.scenes[ sceneIndex ]; + var parser = this; + + // Loader returns Group, not Scene. + // See: https://github.com/mrdoob/three.js/issues/18342#issuecomment-578981172 + var scene = new THREE.Group(); + if ( sceneDef.name ) scene.name = parser.createUniqueName( sceneDef.name ); + + assignExtrasToUserData( scene, sceneDef ); + + if ( sceneDef.extensions ) addUnknownExtensionsToUserData( extensions, scene, sceneDef ); + + var nodeIds = sceneDef.nodes || []; + + var pending = []; + + for ( var i = 0, il = nodeIds.length; i < il; i ++ ) { + + pending.push( buildNodeHierachy( nodeIds[ i ], scene, json, parser ) ); + + } + + return Promise.all( pending ).then( function () { + + return scene; + + } ); + + }; + + }(); + + return GLTFLoader; + +} )(); diff --git a/freeciv-web/src/main/webapp/javascript/webgl/libs/Reflector.js b/freeciv-web/src/main/webapp/javascript/webgl/libs/Reflector.js new file mode 100644 index 000000000..fc04f94aa --- /dev/null +++ b/freeciv-web/src/main/webapp/javascript/webgl/libs/Reflector.js @@ -0,0 +1,240 @@ +THREE.Reflector = function ( geometry, options ) { + + THREE.Mesh.call( this, geometry ); + + this.type = 'Reflector'; + + var scope = this; + + options = options || {}; + + var color = ( options.color !== undefined ) ? new THREE.Color( options.color ) : new THREE.Color( 0x7F7F7F ); + var textureWidth = options.textureWidth || 512; + var textureHeight = options.textureHeight || 512; + var clipBias = options.clipBias || 0; + var shader = options.shader || THREE.Reflector.ReflectorShader; + + // + + var reflectorPlane = new THREE.Plane(); + var normal = new THREE.Vector3(); + var reflectorWorldPosition = new THREE.Vector3(); + var cameraWorldPosition = new THREE.Vector3(); + var rotationMatrix = new THREE.Matrix4(); + var lookAtPosition = new THREE.Vector3( 0, 0, - 1 ); + var clipPlane = new THREE.Vector4(); + + var view = new THREE.Vector3(); + var target = new THREE.Vector3(); + var q = new THREE.Vector4(); + + var textureMatrix = new THREE.Matrix4(); + var virtualCamera = new THREE.PerspectiveCamera(); + + var parameters = { + minFilter: THREE.LinearFilter, + magFilter: THREE.LinearFilter, + format: THREE.RGBFormat + }; + + var renderTarget = new THREE.WebGLRenderTarget( textureWidth, textureHeight, parameters ); + + if ( ! THREE.MathUtils.isPowerOfTwo( textureWidth ) || ! THREE.MathUtils.isPowerOfTwo( textureHeight ) ) { + + renderTarget.texture.generateMipmaps = false; + + } + + var material = new THREE.ShaderMaterial( { + uniforms: THREE.UniformsUtils.clone( shader.uniforms ), + fragmentShader: shader.fragmentShader, + vertexShader: shader.vertexShader + } ); + + material.uniforms[ 'tDiffuse' ].value = renderTarget.texture; + material.uniforms[ 'color' ].value = color; + material.uniforms[ 'textureMatrix' ].value = textureMatrix; + + this.material = material; + + this.onBeforeRender = function ( renderer, scene, camera ) { + + reflectorWorldPosition.setFromMatrixPosition( scope.matrixWorld ); + cameraWorldPosition.setFromMatrixPosition( camera.matrixWorld ); + + rotationMatrix.extractRotation( scope.matrixWorld ); + + normal.set( 0, 0, 1 ); + normal.applyMatrix4( rotationMatrix ); + + view.subVectors( reflectorWorldPosition, cameraWorldPosition ); + + // Avoid rendering when reflector is facing away + + if ( view.dot( normal ) > 0 ) return; + + view.reflect( normal ).negate(); + view.add( reflectorWorldPosition ); + + rotationMatrix.extractRotation( camera.matrixWorld ); + + lookAtPosition.set( 0, 0, - 1 ); + lookAtPosition.applyMatrix4( rotationMatrix ); + lookAtPosition.add( cameraWorldPosition ); + + target.subVectors( reflectorWorldPosition, lookAtPosition ); + target.reflect( normal ).negate(); + target.add( reflectorWorldPosition ); + + virtualCamera.position.copy( view ); + virtualCamera.up.set( 0, 1, 0 ); + virtualCamera.up.applyMatrix4( rotationMatrix ); + virtualCamera.up.reflect( normal ); + virtualCamera.lookAt( target ); + + virtualCamera.far = camera.far; // Used in WebGLBackground + + virtualCamera.updateMatrixWorld(); + virtualCamera.projectionMatrix.copy( camera.projectionMatrix ); + + // Update the texture matrix + textureMatrix.set( + 0.5, 0.0, 0.0, 0.5, + 0.0, 0.5, 0.0, 0.5, + 0.0, 0.0, 0.5, 0.5, + 0.0, 0.0, 0.0, 1.0 + ); + textureMatrix.multiply( virtualCamera.projectionMatrix ); + textureMatrix.multiply( virtualCamera.matrixWorldInverse ); + textureMatrix.multiply( scope.matrixWorld ); + + // Now update projection matrix with new clip plane, implementing code from: http://www.terathon.com/code/oblique.html + // Paper explaining this technique: http://www.terathon.com/lengyel/Lengyel-Oblique.pdf + reflectorPlane.setFromNormalAndCoplanarPoint( normal, reflectorWorldPosition ); + reflectorPlane.applyMatrix4( virtualCamera.matrixWorldInverse ); + + clipPlane.set( reflectorPlane.normal.x, reflectorPlane.normal.y, reflectorPlane.normal.z, reflectorPlane.constant ); + + var projectionMatrix = virtualCamera.projectionMatrix; + + q.x = ( Math.sign( clipPlane.x ) + projectionMatrix.elements[ 8 ] ) / projectionMatrix.elements[ 0 ]; + q.y = ( Math.sign( clipPlane.y ) + projectionMatrix.elements[ 9 ] ) / projectionMatrix.elements[ 5 ]; + q.z = - 1.0; + q.w = ( 1.0 + projectionMatrix.elements[ 10 ] ) / projectionMatrix.elements[ 14 ]; + + // Calculate the scaled plane vector + clipPlane.multiplyScalar( 2.0 / clipPlane.dot( q ) ); + + // Replacing the third row of the projection matrix + projectionMatrix.elements[ 2 ] = clipPlane.x; + projectionMatrix.elements[ 6 ] = clipPlane.y; + projectionMatrix.elements[ 10 ] = clipPlane.z + 1.0 - clipBias; + projectionMatrix.elements[ 14 ] = clipPlane.w; + + // Render + + renderTarget.texture.encoding = renderer.outputEncoding; + + scope.visible = false; + + var currentRenderTarget = renderer.getRenderTarget(); + + var currentXrEnabled = renderer.xr.enabled; + var currentShadowAutoUpdate = renderer.shadowMap.autoUpdate; + + renderer.xr.enabled = false; // Avoid camera modification + renderer.shadowMap.autoUpdate = false; // Avoid re-computing shadows + + renderer.setRenderTarget( renderTarget ); + + renderer.state.buffers.depth.setMask( true ); // make sure the depth buffer is writable so it can be properly cleared, see #18897 + + if ( renderer.autoClear === false ) renderer.clear(); + renderer.render( scene, virtualCamera ); + + renderer.xr.enabled = currentXrEnabled; + renderer.shadowMap.autoUpdate = currentShadowAutoUpdate; + + renderer.setRenderTarget( currentRenderTarget ); + + // Restore viewport + + var viewport = camera.viewport; + + if ( viewport !== undefined ) { + + renderer.state.viewport( viewport ); + + } + + scope.visible = true; + + }; + + this.getRenderTarget = function () { + + return renderTarget; + + }; + +}; + +THREE.Reflector.prototype = Object.create( THREE.Mesh.prototype ); +THREE.Reflector.prototype.constructor = THREE.Reflector; + +THREE.Reflector.ReflectorShader = { + + uniforms: { + + 'color': { + value: null + }, + + 'tDiffuse': { + value: null + }, + + 'textureMatrix': { + value: null + } + + }, + + vertexShader: [ + 'uniform mat4 textureMatrix;', + 'varying vec4 vUv;', + + 'void main() {', + + ' vUv = textureMatrix * vec4( position, 1.0 );', + + ' gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );', + + '}' + ].join( '\n' ), + + fragmentShader: [ + 'uniform vec3 color;', + 'uniform sampler2D tDiffuse;', + 'varying vec4 vUv;', + + 'float blendOverlay( float base, float blend ) {', + + ' return( base < 0.5 ? ( 2.0 * base * blend ) : ( 1.0 - 2.0 * ( 1.0 - base ) * ( 1.0 - blend ) ) );', + + '}', + + 'vec3 blendOverlay( vec3 base, vec3 blend ) {', + + ' return vec3( blendOverlay( base.r, blend.r ), blendOverlay( base.g, blend.g ), blendOverlay( base.b, blend.b ) );', + + '}', + + 'void main() {', + + ' vec4 base = texture2DProj( tDiffuse, vUv );', + ' gl_FragColor = vec4( blendOverlay( base.rgb, color ), 1.0 );', + + '}' + ].join( '\n' ) +}; diff --git a/freeciv-web/src/main/webapp/javascript/webgl/libs/Refractor.js b/freeciv-web/src/main/webapp/javascript/webgl/libs/Refractor.js new file mode 100644 index 000000000..227659050 --- /dev/null +++ b/freeciv-web/src/main/webapp/javascript/webgl/libs/Refractor.js @@ -0,0 +1,315 @@ +THREE.Refractor = function ( geometry, options ) { + + THREE.Mesh.call( this, geometry ); + + this.type = 'Refractor'; + + var scope = this; + + options = options || {}; + + var color = ( options.color !== undefined ) ? new THREE.Color( options.color ) : new THREE.Color( 0x7F7F7F ); + var textureWidth = options.textureWidth || 512; + var textureHeight = options.textureHeight || 512; + var clipBias = options.clipBias || 0; + var shader = options.shader || THREE.Refractor.RefractorShader; + + // + + var virtualCamera = new THREE.PerspectiveCamera(); + virtualCamera.matrixAutoUpdate = false; + virtualCamera.userData.refractor = true; + + // + + var refractorPlane = new THREE.Plane(); + var textureMatrix = new THREE.Matrix4(); + + // render target + + var parameters = { + minFilter: THREE.LinearFilter, + magFilter: THREE.LinearFilter, + format: THREE.RGBFormat + }; + + var renderTarget = new THREE.WebGLRenderTarget( textureWidth, textureHeight, parameters ); + + if ( ! THREE.MathUtils.isPowerOfTwo( textureWidth ) || ! THREE.MathUtils.isPowerOfTwo( textureHeight ) ) { + + renderTarget.texture.generateMipmaps = false; + + } + + // material + + this.material = new THREE.ShaderMaterial( { + uniforms: THREE.UniformsUtils.clone( shader.uniforms ), + vertexShader: shader.vertexShader, + fragmentShader: shader.fragmentShader, + transparent: true // ensures, refractors are drawn from farthest to closest + } ); + + this.material.uniforms[ 'color' ].value = color; + this.material.uniforms[ 'tDiffuse' ].value = renderTarget.texture; + this.material.uniforms[ 'textureMatrix' ].value = textureMatrix; + + // functions + + var visible = ( function () { + + var refractorWorldPosition = new THREE.Vector3(); + var cameraWorldPosition = new THREE.Vector3(); + var rotationMatrix = new THREE.Matrix4(); + + var view = new THREE.Vector3(); + var normal = new THREE.Vector3(); + + return function visible( camera ) { + + refractorWorldPosition.setFromMatrixPosition( scope.matrixWorld ); + cameraWorldPosition.setFromMatrixPosition( camera.matrixWorld ); + + view.subVectors( refractorWorldPosition, cameraWorldPosition ); + + rotationMatrix.extractRotation( scope.matrixWorld ); + + normal.set( 0, 0, 1 ); + normal.applyMatrix4( rotationMatrix ); + + return view.dot( normal ) < 0; + + }; + + } )(); + + var updateRefractorPlane = ( function () { + + var normal = new THREE.Vector3(); + var position = new THREE.Vector3(); + var quaternion = new THREE.Quaternion(); + var scale = new THREE.Vector3(); + + return function updateRefractorPlane() { + + scope.matrixWorld.decompose( position, quaternion, scale ); + normal.set( 0, 0, 1 ).applyQuaternion( quaternion ).normalize(); + + // flip the normal because we want to cull everything above the plane + + normal.negate(); + + refractorPlane.setFromNormalAndCoplanarPoint( normal, position ); + + }; + + } )(); + + var updateVirtualCamera = ( function () { + + var clipPlane = new THREE.Plane(); + var clipVector = new THREE.Vector4(); + var q = new THREE.Vector4(); + + return function updateVirtualCamera( camera ) { + + virtualCamera.matrixWorld.copy( camera.matrixWorld ); + virtualCamera.matrixWorldInverse.copy( virtualCamera.matrixWorld ).invert(); + virtualCamera.projectionMatrix.copy( camera.projectionMatrix ); + virtualCamera.far = camera.far; // used in WebGLBackground + + // The following code creates an oblique view frustum for clipping. + // see: Lengyel, Eric. “Oblique View Frustum Depth Projection and Clipping”. + // Journal of Game Development, Vol. 1, No. 2 (2005), Charles River Media, pp. 5–16 + + clipPlane.copy( refractorPlane ); + clipPlane.applyMatrix4( virtualCamera.matrixWorldInverse ); + + clipVector.set( clipPlane.normal.x, clipPlane.normal.y, clipPlane.normal.z, clipPlane.constant ); + + // calculate the clip-space corner point opposite the clipping plane and + // transform it into camera space by multiplying it by the inverse of the projection matrix + + var projectionMatrix = virtualCamera.projectionMatrix; + + q.x = ( Math.sign( clipVector.x ) + projectionMatrix.elements[ 8 ] ) / projectionMatrix.elements[ 0 ]; + q.y = ( Math.sign( clipVector.y ) + projectionMatrix.elements[ 9 ] ) / projectionMatrix.elements[ 5 ]; + q.z = - 1.0; + q.w = ( 1.0 + projectionMatrix.elements[ 10 ] ) / projectionMatrix.elements[ 14 ]; + + // calculate the scaled plane vector + + clipVector.multiplyScalar( 2.0 / clipVector.dot( q ) ); + + // replacing the third row of the projection matrix + + projectionMatrix.elements[ 2 ] = clipVector.x; + projectionMatrix.elements[ 6 ] = clipVector.y; + projectionMatrix.elements[ 10 ] = clipVector.z + 1.0 - clipBias; + projectionMatrix.elements[ 14 ] = clipVector.w; + + }; + + } )(); + + // This will update the texture matrix that is used for projective texture mapping in the shader. + // see: http://developer.download.nvidia.com/assets/gamedev/docs/projective_texture_mapping.pdf + + function updateTextureMatrix( camera ) { + + // this matrix does range mapping to [ 0, 1 ] + + textureMatrix.set( + 0.5, 0.0, 0.0, 0.5, + 0.0, 0.5, 0.0, 0.5, + 0.0, 0.0, 0.5, 0.5, + 0.0, 0.0, 0.0, 1.0 + ); + + // we use "Object Linear Texgen", so we need to multiply the texture matrix T + // (matrix above) with the projection and view matrix of the virtual camera + // and the model matrix of the refractor + + textureMatrix.multiply( camera.projectionMatrix ); + textureMatrix.multiply( camera.matrixWorldInverse ); + textureMatrix.multiply( scope.matrixWorld ); + + } + + // + + function render( renderer, scene, camera ) { + + scope.visible = false; + + var currentRenderTarget = renderer.getRenderTarget(); + var currentXrEnabled = renderer.xr.enabled; + var currentShadowAutoUpdate = renderer.shadowMap.autoUpdate; + + renderer.xr.enabled = false; // avoid camera modification + renderer.shadowMap.autoUpdate = false; // avoid re-computing shadows + + renderer.setRenderTarget( renderTarget ); + if ( renderer.autoClear === false ) renderer.clear(); + renderer.render( scene, virtualCamera ); + + renderer.xr.enabled = currentXrEnabled; + renderer.shadowMap.autoUpdate = currentShadowAutoUpdate; + renderer.setRenderTarget( currentRenderTarget ); + + // restore viewport + + var viewport = camera.viewport; + + if ( viewport !== undefined ) { + + renderer.state.viewport( viewport ); + + } + + scope.visible = true; + + } + + // + + this.onBeforeRender = function ( renderer, scene, camera ) { + + // Render + + renderTarget.texture.encoding = renderer.outputEncoding; + + // ensure refractors are rendered only once per frame + + if ( camera.userData.refractor === true ) return; + + // avoid rendering when the refractor is viewed from behind + + if ( ! visible( camera ) === true ) return; + + // update + + updateRefractorPlane(); + + updateTextureMatrix( camera ); + + updateVirtualCamera( camera ); + + render( renderer, scene, camera ); + + }; + + this.getRenderTarget = function () { + + return renderTarget; + + }; + +}; + +THREE.Refractor.prototype = Object.create( THREE.Mesh.prototype ); +THREE.Refractor.prototype.constructor = THREE.Refractor; + +THREE.Refractor.RefractorShader = { + + uniforms: { + + 'color': { + value: null + }, + + 'tDiffuse': { + value: null + }, + + 'textureMatrix': { + value: null + } + + }, + + vertexShader: [ + + 'uniform mat4 textureMatrix;', + + 'varying vec4 vUv;', + + 'void main() {', + + ' vUv = textureMatrix * vec4( position, 1.0 );', + + ' gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );', + + '}' + + ].join( '\n' ), + + fragmentShader: [ + + 'uniform vec3 color;', + 'uniform sampler2D tDiffuse;', + + 'varying vec4 vUv;', + + 'float blendOverlay( float base, float blend ) {', + + ' return( base < 0.5 ? ( 2.0 * base * blend ) : ( 1.0 - 2.0 * ( 1.0 - base ) * ( 1.0 - blend ) ) );', + + '}', + + 'vec3 blendOverlay( vec3 base, vec3 blend ) {', + + ' return vec3( blendOverlay( base.r, blend.r ), blendOverlay( base.g, blend.g ), blendOverlay( base.b, blend.b ) );', + + '}', + + 'void main() {', + + ' vec4 base = texture2DProj( tDiffuse, vUv );', + + ' gl_FragColor = vec4( blendOverlay( base.rgb, color ), 1.0 );', + + '}' + + ].join( '\n' ) +}; diff --git a/freeciv-web/src/main/webapp/javascript/webgl/libs/Water2.js b/freeciv-web/src/main/webapp/javascript/webgl/libs/Water2.js new file mode 100644 index 000000000..ddf3696fc --- /dev/null +++ b/freeciv-web/src/main/webapp/javascript/webgl/libs/Water2.js @@ -0,0 +1,345 @@ +/** + * References: + * http://www.valvesoftware.com/publications/2010/siggraph2010_vlachos_waterflow.pdf + * http://graphicsrunner.blogspot.de/2010/08/water-using-flow-maps.html + * + */ + +THREE.Water = function ( geometry, options ) { + + THREE.Mesh.call( this, geometry ); + + this.type = 'Water'; + + var scope = this; + + options = options || {}; + + var color = ( options.color !== undefined ) ? new THREE.Color( options.color ) : new THREE.Color( 0xFFFFFF ); + var textureWidth = options.textureWidth || 512; + var textureHeight = options.textureHeight || 512; + var clipBias = options.clipBias || 0; + var flowDirection = options.flowDirection || new THREE.Vector2( 1, 0 ); + var flowSpeed = options.flowSpeed || 0.03; + var reflectivity = options.reflectivity || 0.02; + var scale = options.scale || 1; + var shader = options.shader || THREE.Water.WaterShader; + var encoding = options.encoding !== undefined ? options.encoding : THREE.LinearEncoding; + + var textureLoader = new THREE.TextureLoader(); + + var flowMap = options.flowMap || undefined; + var normalMap0 = options.normalMap0 || textureLoader.load( 'textures/water/Water_1_M_Normal.jpg' ); + var normalMap1 = options.normalMap1 || textureLoader.load( 'textures/water/Water_2_M_Normal.jpg' ); + + var cycle = 0.15; // a cycle of a flow map phase + var halfCycle = cycle * 0.5; + var textureMatrix = new THREE.Matrix4(); + var clock = new THREE.Clock(); + + // internal components + + if ( THREE.Reflector === undefined ) { + + console.error( 'THREE.Water: Required component THREE.Reflector not found.' ); + return; + + } + + if ( THREE.Refractor === undefined ) { + + console.error( 'THREE.Water: Required component THREE.Refractor not found.' ); + return; + + } + + var reflector = new THREE.Reflector( geometry, { + textureWidth: textureWidth, + textureHeight: textureHeight, + clipBias: clipBias, + encoding: encoding + } ); + + var refractor = new THREE.Refractor( geometry, { + textureWidth: textureWidth, + textureHeight: textureHeight, + clipBias: clipBias, + encoding: encoding + } ); + + reflector.matrixAutoUpdate = false; + refractor.matrixAutoUpdate = false; + + // material + + this.material = new THREE.ShaderMaterial( { + uniforms: THREE.UniformsUtils.merge( [ + THREE.UniformsLib[ 'fog' ], + shader.uniforms + ] ), + vertexShader: shader.vertexShader, + fragmentShader: shader.fragmentShader, + transparent: true, + fog: true + } ); + + if ( flowMap !== undefined ) { + + this.material.defines.USE_FLOWMAP = ''; + this.material.uniforms[ 'tFlowMap' ] = { + type: 't', + value: flowMap + }; + + } else { + + this.material.uniforms[ 'flowDirection' ] = { + type: 'v2', + value: flowDirection + }; + + } + + // maps + + normalMap0.wrapS = normalMap0.wrapT = THREE.RepeatWrapping; + normalMap1.wrapS = normalMap1.wrapT = THREE.RepeatWrapping; + + this.material.uniforms[ 'tReflectionMap' ].value = reflector.getRenderTarget().texture; + this.material.uniforms[ 'tRefractionMap' ].value = refractor.getRenderTarget().texture; + this.material.uniforms[ 'tNormalMap0' ].value = normalMap0; + this.material.uniforms[ 'tNormalMap1' ].value = normalMap1; + + // water + + this.material.uniforms[ 'color' ].value = color; + this.material.uniforms[ 'reflectivity' ].value = reflectivity; + this.material.uniforms[ 'textureMatrix' ].value = textureMatrix; + + // inital values + + this.material.uniforms[ 'config' ].value.x = 0; // flowMapOffset0 + this.material.uniforms[ 'config' ].value.y = halfCycle; // flowMapOffset1 + this.material.uniforms[ 'config' ].value.z = halfCycle; // halfCycle + this.material.uniforms[ 'config' ].value.w = scale; // scale + + // functions + + function updateTextureMatrix( camera ) { + + textureMatrix.set( + 0.5, 0.0, 0.0, 0.5, + 0.0, 0.5, 0.0, 0.5, + 0.0, 0.0, 0.5, 0.5, + 0.0, 0.0, 0.0, 1.0 + ); + + textureMatrix.multiply( camera.projectionMatrix ); + textureMatrix.multiply( camera.matrixWorldInverse ); + textureMatrix.multiply( scope.matrixWorld ); + + } + + function updateFlow() { + + var delta = clock.getDelta(); + var config = scope.material.uniforms[ 'config' ]; + + config.value.x += flowSpeed * delta; // flowMapOffset0 + config.value.y = config.value.x + halfCycle; // flowMapOffset1 + + // Important: The distance between offsets should be always the value of "halfCycle". + // Moreover, both offsets should be in the range of [ 0, cycle ]. + // This approach ensures a smooth water flow and avoids "reset" effects. + + if ( config.value.x >= cycle ) { + + config.value.x = 0; + config.value.y = halfCycle; + + } else if ( config.value.y >= cycle ) { + + config.value.y = config.value.y - cycle; + + } + + } + + // + + this.onBeforeRender = function ( renderer, scene, camera ) { + + updateTextureMatrix( camera ); + updateFlow(); + + scope.visible = false; + + reflector.matrixWorld.copy( scope.matrixWorld ); + refractor.matrixWorld.copy( scope.matrixWorld ); + + reflector.onBeforeRender( renderer, scene, camera ); + refractor.onBeforeRender( renderer, scene, camera ); + + scope.visible = true; + + }; + +}; + +THREE.Water.prototype = Object.create( THREE.Mesh.prototype ); +THREE.Water.prototype.constructor = THREE.Water; + +THREE.Water.WaterShader = { + + uniforms: { + + 'color': { + type: 'c', + value: null + }, + + 'reflectivity': { + type: 'f', + value: 0 + }, + + 'tReflectionMap': { + type: 't', + value: null + }, + + 'tRefractionMap': { + type: 't', + value: null + }, + + 'tNormalMap0': { + type: 't', + value: null + }, + + 'tNormalMap1': { + type: 't', + value: null + }, + + 'textureMatrix': { + type: 'm4', + value: null + }, + + 'config': { + type: 'v4', + value: new THREE.Vector4() + } + + }, + + vertexShader: [ + + '#include ', + '#include ', + '#include ', + + 'uniform mat4 textureMatrix;', + + 'varying vec4 vCoord;', + 'varying vec2 vUv;', + 'varying vec3 vToEye;', + + 'void main() {', + + ' vUv = uv;', + ' vCoord = textureMatrix * vec4( position, 1.0 );', + + ' vec4 worldPosition = modelMatrix * vec4( position, 1.0 );', + ' vToEye = cameraPosition - worldPosition.xyz;', + + ' vec4 mvPosition = viewMatrix * worldPosition;', // used in fog_vertex + ' gl_Position = projectionMatrix * mvPosition;', + + ' #include ', + ' #include ', + + '}' + + ].join( '\n' ), + + fragmentShader: [ + + '#include ', + '#include ', + '#include ', + + 'uniform sampler2D tReflectionMap;', + 'uniform sampler2D tRefractionMap;', + 'uniform sampler2D tNormalMap0;', + 'uniform sampler2D tNormalMap1;', + + '#ifdef USE_FLOWMAP', + ' uniform sampler2D tFlowMap;', + '#else', + ' uniform vec2 flowDirection;', + '#endif', + + 'uniform vec3 color;', + 'uniform float reflectivity;', + 'uniform vec4 config;', + + 'varying vec4 vCoord;', + 'varying vec2 vUv;', + 'varying vec3 vToEye;', + + 'void main() {', + + ' #include ', + + ' float flowMapOffset0 = config.x;', + ' float flowMapOffset1 = config.y;', + ' float halfCycle = config.z;', + ' float scale = config.w;', + + ' vec3 toEye = normalize( vToEye );', + + // determine flow direction + ' vec2 flow;', + ' #ifdef USE_FLOWMAP', + ' flow = texture2D( tFlowMap, vUv ).rg * 2.0 - 1.0;', + ' #else', + ' flow = flowDirection;', + ' #endif', + ' flow.x *= - 1.0;', + + // sample normal maps (distort uvs with flowdata) + ' vec4 normalColor0 = texture2D( tNormalMap0, ( vUv * scale ) + flow * flowMapOffset0 );', + ' vec4 normalColor1 = texture2D( tNormalMap1, ( vUv * scale ) + flow * flowMapOffset1 );', + + // linear interpolate to get the final normal color + ' float flowLerp = abs( halfCycle - flowMapOffset0 ) / halfCycle;', + ' vec4 normalColor = mix( normalColor0, normalColor1, flowLerp );', + + // calculate normal vector + ' vec3 normal = normalize( vec3( normalColor.r * 2.0 - 1.0, normalColor.b, normalColor.g * 2.0 - 1.0 ) );', + + // calculate the fresnel term to blend reflection and refraction maps + ' float theta = max( dot( toEye, normal ), 0.0 );', + ' float reflectance = reflectivity + ( 1.0 - reflectivity ) * pow( ( 1.0 - theta ), 5.0 );', + + // calculate final uv coords + ' vec3 coord = vCoord.xyz / vCoord.w;', + ' vec2 uv = coord.xy + coord.z * normal.xz * 0.05;', + + ' vec4 reflectColor = texture2D( tReflectionMap, vec2( 1.0 - uv.x, uv.y ) );', + ' vec4 refractColor = texture2D( tRefractionMap, uv );', + + // multiply water color with the mix of both textures + ' gl_FragColor = vec4( color, 1.0 ) * mix( refractColor, reflectColor, reflectance );', + + ' #include ', + ' #include ', + ' #include ', + + '}' + + ].join( '\n' ) +}; diff --git a/freeciv-web/src/main/webapp/javascript/webgl/libs/stats.min.js b/freeciv-web/src/main/webapp/javascript/webgl/libs/stats.min.js new file mode 100644 index 000000000..61757f3c0 --- /dev/null +++ b/freeciv-web/src/main/webapp/javascript/webgl/libs/stats.min.js @@ -0,0 +1,5 @@ +// stats.js - http://github.com/mrdoob/stats.js +(function(f,e){"object"===typeof exports&&"undefined"!==typeof module?module.exports=e():"function"===typeof define&&define.amd?define(e):f.Stats=e()})(this,function(){var f=function(){function e(a){c.appendChild(a.dom);return a}function u(a){for(var d=0;dg+1E3&&(r.update(1E3*a/(c-g),100),g=c,a=0,t)){var d=performance.memory;t.update(d.usedJSHeapSize/ +1048576,d.jsHeapSizeLimit/1048576)}return c},update:function(){k=this.end()},domElement:c,setMode:u}};f.Panel=function(e,f,l){var c=Infinity,k=0,g=Math.round,a=g(window.devicePixelRatio||1),r=80*a,h=48*a,t=3*a,v=2*a,d=3*a,m=15*a,n=74*a,p=30*a,q=document.createElement("canvas");q.width=r;q.height=h;q.style.cssText="width:80px;height:48px";var b=q.getContext("2d");b.font="bold "+9*a+"px Helvetica,Arial,sans-serif";b.textBaseline="top";b.fillStyle=l;b.fillRect(0,0,r,h);b.fillStyle=f;b.fillText(e,t,v); +b.fillRect(d,m,n,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d,m,n,p);return{dom:q,update:function(h,w){c=Math.min(c,h);k=Math.max(k,h);b.fillStyle=l;b.globalAlpha=1;b.fillRect(0,0,r,m);b.fillStyle=f;b.fillText(g(h)+" "+e+" ("+g(c)+"-"+g(k)+")",t,v);b.drawImage(q,d+a,m,n-a,p,d,m,n-a,p);b.fillRect(d+n-a,m,a,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d+n-a,m,a,g((1-h/w)*p))}}};return f}); diff --git a/freeciv-web/src/main/webapp/javascript/webgl/libs/three.min.js b/freeciv-web/src/main/webapp/javascript/webgl/libs/three.min.js new file mode 100644 index 000000000..35cbab834 --- /dev/null +++ b/freeciv-web/src/main/webapp/javascript/webgl/libs/three.min.js @@ -0,0 +1,2 @@ +// threejs.org/license +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).THREE={})}(this,(function(t){"use strict";void 0===Number.EPSILON&&(Number.EPSILON=Math.pow(2,-52)),void 0===Number.isInteger&&(Number.isInteger=function(t){return"number"==typeof t&&isFinite(t)&&Math.floor(t)===t}),void 0===Math.sign&&(Math.sign=function(t){return t<0?-1:t>0?1:+t}),"name"in Function.prototype==!1&&Object.defineProperty(Function.prototype,"name",{get:function(){return this.toString().match(/^\s*function\s*([^\(\s]*)/)[1]}}),void 0===Object.assign&&(Object.assign=function(t){if(null==t)throw new TypeError("Cannot convert undefined or null to object");for(var e=Object(t),n=1;n>8&255]+it[t>>16&255]+it[t>>24&255]+"-"+it[255&e]+it[e>>8&255]+"-"+it[e>>16&15|64]+it[e>>24&255]+"-"+it[63&n|128]+it[n>>8&255]+"-"+it[n>>16&255]+it[n>>24&255]+it[255&r]+it[r>>8&255]+it[r>>16&255]+it[r>>24&255]).toUpperCase()},clamp:function(t,e,n){return Math.max(e,Math.min(n,t))},euclideanModulo:function(t,e){return(t%e+e)%e},mapLinear:function(t,e,n,r,i){return r+(t-e)*(i-r)/(n-e)},lerp:function(t,e,n){return(1-n)*t+n*e},smoothstep:function(t,e,n){return t<=e?0:t>=n?1:(t=(t-e)/(n-e))*t*(3-2*t)},smootherstep:function(t,e,n){return t<=e?0:t>=n?1:(t=(t-e)/(n-e))*t*t*(t*(6*t-15)+10)},randInt:function(t,e){return t+Math.floor(Math.random()*(e-t+1))},randFloat:function(t,e){return t+Math.random()*(e-t)},randFloatSpread:function(t){return t*(.5-Math.random())},seededRandom:function(t){return void 0!==t&&(ot=t%2147483647),((ot=16807*ot%2147483647)-1)/2147483646},degToRad:function(t){return t*st.DEG2RAD},radToDeg:function(t){return t*st.RAD2DEG},isPowerOfTwo:function(t){return 0==(t&t-1)&&0!==t},ceilPowerOfTwo:function(t){return Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))},floorPowerOfTwo:function(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))},setQuaternionFromProperEuler:function(t,e,n,r,i){var a=Math.cos,o=Math.sin,s=a(n/2),c=o(n/2),l=a((e+r)/2),u=o((e+r)/2),h=a((e-r)/2),d=o((e-r)/2),p=a((r-e)/2),f=o((r-e)/2);switch(i){case"XYX":t.set(s*u,c*h,c*d,s*l);break;case"YZY":t.set(c*d,s*u,c*h,s*l);break;case"ZXZ":t.set(c*h,c*d,s*u,s*l);break;case"XZX":t.set(s*u,c*f,c*p,s*l);break;case"YXY":t.set(c*p,s*u,c*f,s*l);break;case"ZYZ":t.set(c*f,c*p,s*u,s*l);break;default:console.warn("THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+i)}}};function ct(t,e){for(var n=0;n0&&console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")}var e=t.prototype;return e.set=function(t,e,n,r,i,a,o,s,c){var l=this.elements;return l[0]=t,l[1]=r,l[2]=o,l[3]=e,l[4]=i,l[5]=s,l[6]=n,l[7]=a,l[8]=c,this},e.identity=function(){return this.set(1,0,0,0,1,0,0,0,1),this},e.clone=function(){return(new this.constructor).fromArray(this.elements)},e.copy=function(t){var e=this.elements,n=t.elements;return e[0]=n[0],e[1]=n[1],e[2]=n[2],e[3]=n[3],e[4]=n[4],e[5]=n[5],e[6]=n[6],e[7]=n[7],e[8]=n[8],this},e.extractBasis=function(t,e,n){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),n.setFromMatrix3Column(this,2),this},e.setFromMatrix4=function(t){var e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this},e.multiply=function(t){return this.multiplyMatrices(this,t)},e.premultiply=function(t){return this.multiplyMatrices(t,this)},e.multiplyMatrices=function(t,e){var n=t.elements,r=e.elements,i=this.elements,a=n[0],o=n[3],s=n[6],c=n[1],l=n[4],u=n[7],h=n[2],d=n[5],p=n[8],f=r[0],m=r[3],v=r[6],g=r[1],y=r[4],x=r[7],_=r[2],b=r[5],w=r[8];return i[0]=a*f+o*g+s*_,i[3]=a*m+o*y+s*b,i[6]=a*v+o*x+s*w,i[1]=c*f+l*g+u*_,i[4]=c*m+l*y+u*b,i[7]=c*v+l*x+u*w,i[2]=h*f+d*g+p*_,i[5]=h*m+d*y+p*b,i[8]=h*v+d*x+p*w,this},e.multiplyScalar=function(t){var e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this},e.determinant=function(){var t=this.elements,e=t[0],n=t[1],r=t[2],i=t[3],a=t[4],o=t[5],s=t[6],c=t[7],l=t[8];return e*a*l-e*o*c-n*i*l+n*o*s+r*i*c-r*a*s},e.invert=function(){var t=this.elements,e=t[0],n=t[1],r=t[2],i=t[3],a=t[4],o=t[5],s=t[6],c=t[7],l=t[8],u=l*a-o*c,h=o*s-l*i,d=c*i-a*s,p=e*u+n*h+r*d;if(0===p)return this.set(0,0,0,0,0,0,0,0,0);var f=1/p;return t[0]=u*f,t[1]=(r*c-l*n)*f,t[2]=(o*n-r*a)*f,t[3]=h*f,t[4]=(l*e-r*s)*f,t[5]=(r*i-o*e)*f,t[6]=d*f,t[7]=(n*s-c*e)*f,t[8]=(a*e-n*i)*f,this},e.transpose=function(){var t,e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this},e.getNormalMatrix=function(t){return this.setFromMatrix4(t).copy(this).invert().transpose()},e.transposeIntoArray=function(t){var e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this},e.setUvTransform=function(t,e,n,r,i,a,o){var s=Math.cos(i),c=Math.sin(i);return this.set(n*s,n*c,-n*(s*a+c*o)+a+t,-r*c,r*s,-r*(-c*a+s*o)+o+e,0,0,1),this},e.scale=function(t,e){var n=this.elements;return n[0]*=t,n[3]*=t,n[6]*=t,n[1]*=e,n[4]*=e,n[7]*=e,this},e.rotate=function(t){var e=Math.cos(t),n=Math.sin(t),r=this.elements,i=r[0],a=r[3],o=r[6],s=r[1],c=r[4],l=r[7];return r[0]=e*i+n*s,r[3]=e*a+n*c,r[6]=e*o+n*l,r[1]=-n*i+e*s,r[4]=-n*a+e*c,r[7]=-n*o+e*l,this},e.translate=function(t,e){var n=this.elements;return n[0]+=t*n[2],n[3]+=t*n[5],n[6]+=t*n[8],n[1]+=e*n[2],n[4]+=e*n[5],n[7]+=e*n[8],this},e.equals=function(t){for(var e=this.elements,n=t.elements,r=0;r<9;r++)if(e[r]!==n[r])return!1;return!0},e.fromArray=function(t,e){void 0===e&&(e=0);for(var n=0;n<9;n++)this.elements[n]=t[n+e];return this},e.toArray=function(t,e){void 0===t&&(t=[]),void 0===e&&(e=0);var n=this.elements;return t[e]=n[0],t[e+1]=n[1],t[e+2]=n[2],t[e+3]=n[3],t[e+4]=n[4],t[e+5]=n[5],t[e+6]=n[6],t[e+7]=n[7],t[e+8]=n[8],t},t}(),mt={getDataURL:function(t){if(/^data:/i.test(t.src))return t.src;if("undefined"==typeof HTMLCanvasElement)return t.src;var e;if(t instanceof HTMLCanvasElement)e=t;else{void 0===dt&&(dt=document.createElementNS("http://www.w3.org/1999/xhtml","canvas")),dt.width=t.width,dt.height=t.height;var n=dt.getContext("2d");t instanceof ImageData?n.putImageData(t,0,0):n.drawImage(t,0,0,t.width,t.height),e=dt}return e.width>2048||e.height>2048?e.toDataURL("image/jpeg",.6):e.toDataURL("image/png")}},vt=0;function gt(t,e,n,r,i,a,o,s,c,l){void 0===t&&(t=gt.DEFAULT_IMAGE),void 0===e&&(e=gt.DEFAULT_MAPPING),void 0===n&&(n=u),void 0===r&&(r=u),void 0===i&&(i=m),void 0===a&&(a=g),void 0===o&&(o=T),void 0===s&&(s=y),void 0===c&&(c=1),void 0===l&&(l=q),Object.defineProperty(this,"id",{value:vt++}),this.uuid=st.generateUUID(),this.name="",this.image=t,this.mipmaps=[],this.mapping=e,this.wrapS=n,this.wrapT=r,this.magFilter=i,this.minFilter=a,this.anisotropy=c,this.format=o,this.internalFormat=null,this.type=s,this.offset=new pt(0,0),this.repeat=new pt(1,1),this.center=new pt(0,0),this.rotation=0,this.matrixAutoUpdate=!0,this.matrix=new ft,this.generateMipmaps=!0,this.premultiplyAlpha=!1,this.flipY=!0,this.unpackAlignment=4,this.encoding=l,this.version=0,this.onUpdate=null}function yt(t){return"undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap?mt.getDataURL(t):t.data?{data:Array.prototype.slice.call(t.data),width:t.width,height:t.height,type:t.data.constructor.name}:(console.warn("THREE.Texture: Unable to serialize Texture."),{})}gt.DEFAULT_IMAGE=void 0,gt.DEFAULT_MAPPING=n,gt.prototype=Object.assign(Object.create(rt.prototype),{constructor:gt,isTexture:!0,updateMatrix:function(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)},clone:function(){return(new this.constructor).copy(this)},copy:function(t){return this.name=t.name,this.image=t.image,this.mipmaps=t.mipmaps.slice(0),this.mapping=t.mapping,this.wrapS=t.wrapS,this.wrapT=t.wrapT,this.magFilter=t.magFilter,this.minFilter=t.minFilter,this.anisotropy=t.anisotropy,this.format=t.format,this.internalFormat=t.internalFormat,this.type=t.type,this.offset.copy(t.offset),this.repeat.copy(t.repeat),this.center.copy(t.center),this.rotation=t.rotation,this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrix.copy(t.matrix),this.generateMipmaps=t.generateMipmaps,this.premultiplyAlpha=t.premultiplyAlpha,this.flipY=t.flipY,this.unpackAlignment=t.unpackAlignment,this.encoding=t.encoding,this},toJSON:function(t){var e=void 0===t||"string"==typeof t;if(!e&&void 0!==t.textures[this.uuid])return t.textures[this.uuid];var n={metadata:{version:4.5,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,type:this.type,encoding:this.encoding,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};if(void 0!==this.image){var r=this.image;if(void 0===r.uuid&&(r.uuid=st.generateUUID()),!e&&void 0===t.images[r.uuid]){var i;if(Array.isArray(r)){i=[];for(var a=0,o=r.length;a1)switch(this.wrapS){case l:t.x=t.x-Math.floor(t.x);break;case u:t.x=t.x<0?0:1;break;case h:1===Math.abs(Math.floor(t.x)%2)?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x)}if(t.y<0||t.y>1)switch(this.wrapT){case l:t.y=t.y-Math.floor(t.y);break;case u:t.y=t.y<0?0:1;break;case h:1===Math.abs(Math.floor(t.y)%2)?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y)}return this.flipY&&(t.y=1-t.y),t}}),Object.defineProperty(gt.prototype,"needsUpdate",{set:function(t){!0===t&&this.version++}});var xt=function(){function t(t,e,n,r){void 0===t&&(t=0),void 0===e&&(e=0),void 0===n&&(n=0),void 0===r&&(r=1),Object.defineProperty(this,"isVector4",{value:!0}),this.x=t,this.y=e,this.z=n,this.w=r}var e=t.prototype;return e.set=function(t,e,n,r){return this.x=t,this.y=e,this.z=n,this.w=r,this},e.setScalar=function(t){return this.x=t,this.y=t,this.z=t,this.w=t,this},e.setX=function(t){return this.x=t,this},e.setY=function(t){return this.y=t,this},e.setZ=function(t){return this.z=t,this},e.setW=function(t){return this.w=t,this},e.setComponent=function(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error("index is out of range: "+t)}return this},e.getComponent=function(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+t)}},e.clone=function(){return new this.constructor(this.x,this.y,this.z,this.w)},e.copy=function(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=void 0!==t.w?t.w:1,this},e.add=function(t,e){return void 0!==e?(console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(t,e)):(this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this)},e.addScalar=function(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this},e.addVectors=function(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this},e.addScaledVector=function(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this},e.sub=function(t,e){return void 0!==e?(console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(t,e)):(this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this)},e.subScalar=function(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this},e.subVectors=function(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this},e.multiplyScalar=function(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this},e.applyMatrix4=function(t){var e=this.x,n=this.y,r=this.z,i=this.w,a=t.elements;return this.x=a[0]*e+a[4]*n+a[8]*r+a[12]*i,this.y=a[1]*e+a[5]*n+a[9]*r+a[13]*i,this.z=a[2]*e+a[6]*n+a[10]*r+a[14]*i,this.w=a[3]*e+a[7]*n+a[11]*r+a[15]*i,this},e.divideScalar=function(t){return this.multiplyScalar(1/t)},e.setAxisAngleFromQuaternion=function(t){this.w=2*Math.acos(t.w);var e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this},e.setAxisAngleFromRotationMatrix=function(t){var e,n,r,i,a=.01,o=.1,s=t.elements,c=s[0],l=s[4],u=s[8],h=s[1],d=s[5],p=s[9],f=s[2],m=s[6],v=s[10];if(Math.abs(l-h)y&&g>x?gx?y=0?1:-1,y=1-v*v;if(y>Number.EPSILON){var x=Math.sqrt(y),_=Math.atan2(x,v*g);m=Math.sin(m*_)/x,o=Math.sin(o*_)/x}var b=o*g;if(s=s*m+h*b,c=c*m+d*b,l=l*m+p*b,u=u*m+f*b,m===1-o){var w=1/Math.sqrt(s*s+c*c+l*l+u*u);s*=w,c*=w,l*=w,u*=w}}t[e]=s,t[e+1]=c,t[e+2]=l,t[e+3]=u},t.multiplyQuaternionsFlat=function(t,e,n,r,i,a){var o=n[r],s=n[r+1],c=n[r+2],l=n[r+3],u=i[a],h=i[a+1],d=i[a+2],p=i[a+3];return t[e]=o*p+l*u+s*d-c*h,t[e+1]=s*p+l*h+c*u-o*d,t[e+2]=c*p+l*d+o*h-s*u,t[e+3]=l*p-o*u-s*h-c*d,t};var e=t.prototype;return e.set=function(t,e,n,r){return this._x=t,this._y=e,this._z=n,this._w=r,this._onChangeCallback(),this},e.clone=function(){return new this.constructor(this._x,this._y,this._z,this._w)},e.copy=function(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this},e.setFromEuler=function(t,e){if(!t||!t.isEuler)throw new Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");var n=t._x,r=t._y,i=t._z,a=t._order,o=Math.cos,s=Math.sin,c=o(n/2),l=o(r/2),u=o(i/2),h=s(n/2),d=s(r/2),p=s(i/2);switch(a){case"XYZ":this._x=h*l*u+c*d*p,this._y=c*d*u-h*l*p,this._z=c*l*p+h*d*u,this._w=c*l*u-h*d*p;break;case"YXZ":this._x=h*l*u+c*d*p,this._y=c*d*u-h*l*p,this._z=c*l*p-h*d*u,this._w=c*l*u+h*d*p;break;case"ZXY":this._x=h*l*u-c*d*p,this._y=c*d*u+h*l*p,this._z=c*l*p+h*d*u,this._w=c*l*u-h*d*p;break;case"ZYX":this._x=h*l*u-c*d*p,this._y=c*d*u+h*l*p,this._z=c*l*p-h*d*u,this._w=c*l*u+h*d*p;break;case"YZX":this._x=h*l*u+c*d*p,this._y=c*d*u+h*l*p,this._z=c*l*p-h*d*u,this._w=c*l*u-h*d*p;break;case"XZY":this._x=h*l*u-c*d*p,this._y=c*d*u-h*l*p,this._z=c*l*p+h*d*u,this._w=c*l*u+h*d*p;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+a)}return!1!==e&&this._onChangeCallback(),this},e.setFromAxisAngle=function(t,e){var n=e/2,r=Math.sin(n);return this._x=t.x*r,this._y=t.y*r,this._z=t.z*r,this._w=Math.cos(n),this._onChangeCallback(),this},e.setFromRotationMatrix=function(t){var e=t.elements,n=e[0],r=e[4],i=e[8],a=e[1],o=e[5],s=e[9],c=e[2],l=e[6],u=e[10],h=n+o+u;if(h>0){var d=.5/Math.sqrt(h+1);this._w=.25/d,this._x=(l-s)*d,this._y=(i-c)*d,this._z=(a-r)*d}else if(n>o&&n>u){var p=2*Math.sqrt(1+n-o-u);this._w=(l-s)/p,this._x=.25*p,this._y=(r+a)/p,this._z=(i+c)/p}else if(o>u){var f=2*Math.sqrt(1+o-n-u);this._w=(i-c)/f,this._x=(r+a)/f,this._y=.25*f,this._z=(s+l)/f}else{var m=2*Math.sqrt(1+u-n-o);this._w=(a-r)/m,this._x=(i+c)/m,this._y=(s+l)/m,this._z=.25*m}return this._onChangeCallback(),this},e.setFromUnitVectors=function(t,e){var n=t.dot(e)+1;return n<1e-6?(n=0,Math.abs(t.x)>Math.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=n):(this._x=0,this._y=-t.z,this._z=t.y,this._w=n)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=n),this.normalize()},e.angleTo=function(t){return 2*Math.acos(Math.abs(st.clamp(this.dot(t),-1,1)))},e.rotateTowards=function(t,e){var n=this.angleTo(t);if(0===n)return this;var r=Math.min(1,e/n);return this.slerp(t,r),this},e.identity=function(){return this.set(0,0,0,1)},e.invert=function(){return this.conjugate()},e.conjugate=function(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this},e.dot=function(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w},e.lengthSq=function(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w},e.length=function(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)},e.normalize=function(){var t=this.length();return 0===t?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this},e.multiply=function(t,e){return void 0!==e?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(t,e)):this.multiplyQuaternions(this,t)},e.premultiply=function(t){return this.multiplyQuaternions(t,this)},e.multiplyQuaternions=function(t,e){var n=t._x,r=t._y,i=t._z,a=t._w,o=e._x,s=e._y,c=e._z,l=e._w;return this._x=n*l+a*o+r*c-i*s,this._y=r*l+a*s+i*o-n*c,this._z=i*l+a*c+n*s-r*o,this._w=a*l-n*o-r*s-i*c,this._onChangeCallback(),this},e.slerp=function(t,e){if(0===e)return this;if(1===e)return this.copy(t);var n=this._x,r=this._y,i=this._z,a=this._w,o=a*t._w+n*t._x+r*t._y+i*t._z;if(o<0?(this._w=-t._w,this._x=-t._x,this._y=-t._y,this._z=-t._z,o=-o):this.copy(t),o>=1)return this._w=a,this._x=n,this._y=r,this._z=i,this;var s=1-o*o;if(s<=Number.EPSILON){var c=1-e;return this._w=c*a+e*this._w,this._x=c*n+e*this._x,this._y=c*r+e*this._y,this._z=c*i+e*this._z,this.normalize(),this._onChangeCallback(),this}var l=Math.sqrt(s),u=Math.atan2(l,o),h=Math.sin((1-e)*u)/l,d=Math.sin(e*u)/l;return this._w=a*h+this._w*d,this._x=n*h+this._x*d,this._y=r*h+this._y*d,this._z=i*h+this._z*d,this._onChangeCallback(),this},e.equals=function(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w},e.fromArray=function(t,e){return void 0===e&&(e=0),this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this},e.toArray=function(t,e){return void 0===t&&(t=[]),void 0===e&&(e=0),t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t},e.fromBufferAttribute=function(t,e){return this._x=t.getX(e),this._y=t.getY(e),this._z=t.getZ(e),this._w=t.getW(e),this},e._onChange=function(t){return this._onChangeCallback=t,this},e._onChangeCallback=function(){},lt(t,[{key:"x",get:function(){return this._x},set:function(t){this._x=t,this._onChangeCallback()}},{key:"y",get:function(){return this._y},set:function(t){this._y=t,this._onChangeCallback()}},{key:"z",get:function(){return this._z},set:function(t){this._z=t,this._onChangeCallback()}},{key:"w",get:function(){return this._w},set:function(t){this._w=t,this._onChangeCallback()}}]),t}(),Mt=function(){function t(t,e,n){void 0===t&&(t=0),void 0===e&&(e=0),void 0===n&&(n=0),Object.defineProperty(this,"isVector3",{value:!0}),this.x=t,this.y=e,this.z=n}var e=t.prototype;return e.set=function(t,e,n){return void 0===n&&(n=this.z),this.x=t,this.y=e,this.z=n,this},e.setScalar=function(t){return this.x=t,this.y=t,this.z=t,this},e.setX=function(t){return this.x=t,this},e.setY=function(t){return this.y=t,this},e.setZ=function(t){return this.z=t,this},e.setComponent=function(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}return this},e.getComponent=function(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}},e.clone=function(){return new this.constructor(this.x,this.y,this.z)},e.copy=function(t){return this.x=t.x,this.y=t.y,this.z=t.z,this},e.add=function(t,e){return void 0!==e?(console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(t,e)):(this.x+=t.x,this.y+=t.y,this.z+=t.z,this)},e.addScalar=function(t){return this.x+=t,this.y+=t,this.z+=t,this},e.addVectors=function(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this},e.addScaledVector=function(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this},e.sub=function(t,e){return void 0!==e?(console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(t,e)):(this.x-=t.x,this.y-=t.y,this.z-=t.z,this)},e.subScalar=function(t){return this.x-=t,this.y-=t,this.z-=t,this},e.subVectors=function(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this},e.multiply=function(t,e){return void 0!==e?(console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(t,e)):(this.x*=t.x,this.y*=t.y,this.z*=t.z,this)},e.multiplyScalar=function(t){return this.x*=t,this.y*=t,this.z*=t,this},e.multiplyVectors=function(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this},e.applyEuler=function(t){return t&&t.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order."),this.applyQuaternion(Tt.setFromEuler(t))},e.applyAxisAngle=function(t,e){return this.applyQuaternion(Tt.setFromAxisAngle(t,e))},e.applyMatrix3=function(t){var e=this.x,n=this.y,r=this.z,i=t.elements;return this.x=i[0]*e+i[3]*n+i[6]*r,this.y=i[1]*e+i[4]*n+i[7]*r,this.z=i[2]*e+i[5]*n+i[8]*r,this},e.applyNormalMatrix=function(t){return this.applyMatrix3(t).normalize()},e.applyMatrix4=function(t){var e=this.x,n=this.y,r=this.z,i=t.elements,a=1/(i[3]*e+i[7]*n+i[11]*r+i[15]);return this.x=(i[0]*e+i[4]*n+i[8]*r+i[12])*a,this.y=(i[1]*e+i[5]*n+i[9]*r+i[13])*a,this.z=(i[2]*e+i[6]*n+i[10]*r+i[14])*a,this},e.applyQuaternion=function(t){var e=this.x,n=this.y,r=this.z,i=t.x,a=t.y,o=t.z,s=t.w,c=s*e+a*r-o*n,l=s*n+o*e-i*r,u=s*r+i*n-a*e,h=-i*e-a*n-o*r;return this.x=c*s+h*-i+l*-o-u*-a,this.y=l*s+h*-a+u*-i-c*-o,this.z=u*s+h*-o+c*-a-l*-i,this},e.project=function(t){return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix)},e.unproject=function(t){return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld)},e.transformDirection=function(t){var e=this.x,n=this.y,r=this.z,i=t.elements;return this.x=i[0]*e+i[4]*n+i[8]*r,this.y=i[1]*e+i[5]*n+i[9]*r,this.z=i[2]*e+i[6]*n+i[10]*r,this.normalize()},e.divide=function(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this},e.divideScalar=function(t){return this.multiplyScalar(1/t)},e.min=function(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this},e.max=function(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this},e.clamp=function(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this.z=Math.max(t.z,Math.min(e.z,this.z)),this},e.clampScalar=function(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this.z=Math.max(t,Math.min(e,this.z)),this},e.clampLength=function(t,e){var n=this.length();return this.divideScalar(n||1).multiplyScalar(Math.max(t,Math.min(e,n)))},e.floor=function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this},e.ceil=function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this},e.round=function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this},e.roundToZero=function(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this},e.negate=function(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this},e.dot=function(t){return this.x*t.x+this.y*t.y+this.z*t.z},e.lengthSq=function(){return this.x*this.x+this.y*this.y+this.z*this.z},e.length=function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},e.manhattanLength=function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},e.normalize=function(){return this.divideScalar(this.length()||1)},e.setLength=function(t){return this.normalize().multiplyScalar(t)},e.lerp=function(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this},e.lerpVectors=function(t,e,n){return this.x=t.x+(e.x-t.x)*n,this.y=t.y+(e.y-t.y)*n,this.z=t.z+(e.z-t.z)*n,this},e.cross=function(t,e){return void 0!==e?(console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(t,e)):this.crossVectors(this,t)},e.crossVectors=function(t,e){var n=t.x,r=t.y,i=t.z,a=e.x,o=e.y,s=e.z;return this.x=r*s-i*o,this.y=i*a-n*s,this.z=n*o-r*a,this},e.projectOnVector=function(t){var e=t.lengthSq();if(0===e)return this.set(0,0,0);var n=t.dot(this)/e;return this.copy(t).multiplyScalar(n)},e.projectOnPlane=function(t){return St.copy(this).projectOnVector(t),this.sub(St)},e.reflect=function(t){return this.sub(St.copy(t).multiplyScalar(2*this.dot(t)))},e.angleTo=function(t){var e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;var n=this.dot(t)/e;return Math.acos(st.clamp(n,-1,1))},e.distanceTo=function(t){return Math.sqrt(this.distanceToSquared(t))},e.distanceToSquared=function(t){var e=this.x-t.x,n=this.y-t.y,r=this.z-t.z;return e*e+n*n+r*r},e.manhattanDistanceTo=function(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)},e.setFromSpherical=function(t){return this.setFromSphericalCoords(t.radius,t.phi,t.theta)},e.setFromSphericalCoords=function(t,e,n){var r=Math.sin(e)*t;return this.x=r*Math.sin(n),this.y=Math.cos(e)*t,this.z=r*Math.cos(n),this},e.setFromCylindrical=function(t){return this.setFromCylindricalCoords(t.radius,t.theta,t.y)},e.setFromCylindricalCoords=function(t,e,n){return this.x=t*Math.sin(e),this.y=n,this.z=t*Math.cos(e),this},e.setFromMatrixPosition=function(t){var e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this},e.setFromMatrixScale=function(t){var e=this.setFromMatrixColumn(t,0).length(),n=this.setFromMatrixColumn(t,1).length(),r=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=n,this.z=r,this},e.setFromMatrixColumn=function(t,e){return this.fromArray(t.elements,4*e)},e.setFromMatrix3Column=function(t,e){return this.fromArray(t.elements,3*e)},e.equals=function(t){return t.x===this.x&&t.y===this.y&&t.z===this.z},e.fromArray=function(t,e){return void 0===e&&(e=0),this.x=t[e],this.y=t[e+1],this.z=t[e+2],this},e.toArray=function(t,e){return void 0===t&&(t=[]),void 0===e&&(e=0),t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t},e.fromBufferAttribute=function(t,e,n){return void 0!==n&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute()."),this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this},e.random=function(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this},t}(),St=new Mt,Tt=new wt,Et=function(){function t(t,e){Object.defineProperty(this,"isBox3",{value:!0}),this.min=void 0!==t?t:new Mt(1/0,1/0,1/0),this.max=void 0!==e?e:new Mt(-1/0,-1/0,-1/0)}var e=t.prototype;return e.set=function(t,e){return this.min.copy(t),this.max.copy(e),this},e.setFromArray=function(t){for(var e=1/0,n=1/0,r=1/0,i=-1/0,a=-1/0,o=-1/0,s=0,c=t.length;si&&(i=l),u>a&&(a=u),h>o&&(o=h)}return this.min.set(e,n,r),this.max.set(i,a,o),this},e.setFromBufferAttribute=function(t){for(var e=1/0,n=1/0,r=1/0,i=-1/0,a=-1/0,o=-1/0,s=0,c=t.count;si&&(i=l),u>a&&(a=u),h>o&&(o=h)}return this.min.set(e,n,r),this.max.set(i,a,o),this},e.setFromPoints=function(t){this.makeEmpty();for(var e=0,n=t.length;ethis.max.x||t.ythis.max.y||t.zthis.max.z)},e.containsBox=function(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z},e.getParameter=function(t,e){return void 0===e&&(console.warn("THREE.Box3: .getParameter() target is now required"),e=new Mt),e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))},e.intersectsBox=function(t){return!(t.max.xthis.max.x||t.max.ythis.max.y||t.max.zthis.max.z)},e.intersectsSphere=function(t){return this.clampPoint(t.center,Rt),Rt.distanceToSquared(t.center)<=t.radius*t.radius},e.intersectsPlane=function(t){var e,n;return t.normal.x>0?(e=t.normal.x*this.min.x,n=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,n=t.normal.x*this.min.x),t.normal.y>0?(e+=t.normal.y*this.min.y,n+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,n+=t.normal.y*this.min.y),t.normal.z>0?(e+=t.normal.z*this.min.z,n+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,n+=t.normal.z*this.min.z),e<=-t.constant&&n>=-t.constant},e.intersectsTriangle=function(t){if(this.isEmpty())return!1;this.getCenter(zt),Ft.subVectors(this.max,zt),Pt.subVectors(t.a,zt),It.subVectors(t.b,zt),Nt.subVectors(t.c,zt),Dt.subVectors(It,Pt),Ot.subVectors(Nt,It),Bt.subVectors(Pt,Nt);var e=[0,-Dt.z,Dt.y,0,-Ot.z,Ot.y,0,-Bt.z,Bt.y,Dt.z,0,-Dt.x,Ot.z,0,-Ot.x,Bt.z,0,-Bt.x,-Dt.y,Dt.x,0,-Ot.y,Ot.x,0,-Bt.y,Bt.x,0];return!!At(e,Pt,It,Nt,Ft)&&(!!At(e=[1,0,0,0,1,0,0,0,1],Pt,It,Nt,Ft)&&(Gt.crossVectors(Dt,Ot),At(e=[Gt.x,Gt.y,Gt.z],Pt,It,Nt,Ft)))},e.clampPoint=function(t,e){return void 0===e&&(console.warn("THREE.Box3: .clampPoint() target is now required"),e=new Mt),e.copy(t).clamp(this.min,this.max)},e.distanceToPoint=function(t){return Rt.copy(t).clamp(this.min,this.max).sub(t).length()},e.getBoundingSphere=function(t){return void 0===t&&console.error("THREE.Box3: .getBoundingSphere() target is now required"),this.getCenter(t.center),t.radius=.5*this.getSize(Rt).length(),t},e.intersect=function(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this},e.union=function(t){return this.min.min(t.min),this.max.max(t.max),this},e.applyMatrix4=function(t){return this.isEmpty()||(Lt[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),Lt[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),Lt[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),Lt[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),Lt[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),Lt[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),Lt[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),Lt[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(Lt)),this},e.translate=function(t){return this.min.add(t),this.max.add(t),this},e.equals=function(t){return t.min.equals(this.min)&&t.max.equals(this.max)},t}();function At(t,e,n,r,i){for(var a=0,o=t.length-3;a<=o;a+=3){Ut.fromArray(t,a);var s=i.x*Math.abs(Ut.x)+i.y*Math.abs(Ut.y)+i.z*Math.abs(Ut.z),c=e.dot(Ut),l=n.dot(Ut),u=r.dot(Ut);if(Math.max(-Math.max(c,l,u),Math.min(c,l,u))>s)return!1}return!0}var Lt=[new Mt,new Mt,new Mt,new Mt,new Mt,new Mt,new Mt,new Mt],Rt=new Mt,Ct=new Et,Pt=new Mt,It=new Mt,Nt=new Mt,Dt=new Mt,Ot=new Mt,Bt=new Mt,zt=new Mt,Ft=new Mt,Gt=new Mt,Ut=new Mt,Ht=new Et,kt=function(){function t(t,e){this.center=void 0!==t?t:new Mt,this.radius=void 0!==e?e:-1}var e=t.prototype;return e.set=function(t,e){return this.center.copy(t),this.radius=e,this},e.setFromPoints=function(t,e){var n=this.center;void 0!==e?n.copy(e):Ht.setFromPoints(t).getCenter(n);for(var r=0,i=0,a=t.length;ithis.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e},e.getBoundingBox=function(t){return void 0===t&&(console.warn("THREE.Sphere: .getBoundingBox() target is now required"),t=new Et),this.isEmpty()?(t.makeEmpty(),t):(t.set(this.center,this.center),t.expandByScalar(this.radius),t)},e.applyMatrix4=function(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this},e.translate=function(t){return this.center.add(t),this},e.equals=function(t){return t.center.equals(this.center)&&t.radius===this.radius},t}(),Vt=new Mt,Wt=new Mt,jt=new Mt,qt=new Mt,Xt=new Mt,Yt=new Mt,Zt=new Mt,Jt=function(){function t(t,e){this.origin=void 0!==t?t:new Mt,this.direction=void 0!==e?e:new Mt(0,0,-1)}var e=t.prototype;return e.set=function(t,e){return this.origin.copy(t),this.direction.copy(e),this},e.clone=function(){return(new this.constructor).copy(this)},e.copy=function(t){return this.origin.copy(t.origin),this.direction.copy(t.direction),this},e.at=function(t,e){return void 0===e&&(console.warn("THREE.Ray: .at() target is now required"),e=new Mt),e.copy(this.direction).multiplyScalar(t).add(this.origin)},e.lookAt=function(t){return this.direction.copy(t).sub(this.origin).normalize(),this},e.recast=function(t){return this.origin.copy(this.at(t,Vt)),this},e.closestPointToPoint=function(t,e){void 0===e&&(console.warn("THREE.Ray: .closestPointToPoint() target is now required"),e=new Mt),e.subVectors(t,this.origin);var n=e.dot(this.direction);return n<0?e.copy(this.origin):e.copy(this.direction).multiplyScalar(n).add(this.origin)},e.distanceToPoint=function(t){return Math.sqrt(this.distanceSqToPoint(t))},e.distanceSqToPoint=function(t){var e=Vt.subVectors(t,this.origin).dot(this.direction);return e<0?this.origin.distanceToSquared(t):(Vt.copy(this.direction).multiplyScalar(e).add(this.origin),Vt.distanceToSquared(t))},e.distanceSqToSegment=function(t,e,n,r){Wt.copy(t).add(e).multiplyScalar(.5),jt.copy(e).sub(t).normalize(),qt.copy(this.origin).sub(Wt);var i,a,o,s,c=.5*t.distanceTo(e),l=-this.direction.dot(jt),u=qt.dot(this.direction),h=-qt.dot(jt),d=qt.lengthSq(),p=Math.abs(1-l*l);if(p>0)if(a=l*u-h,s=c*p,(i=l*h-u)>=0)if(a>=-s)if(a<=s){var f=1/p;o=(i*=f)*(i+l*(a*=f)+2*u)+a*(l*i+a+2*h)+d}else a=c,o=-(i=Math.max(0,-(l*a+u)))*i+a*(a+2*h)+d;else a=-c,o=-(i=Math.max(0,-(l*a+u)))*i+a*(a+2*h)+d;else a<=-s?o=-(i=Math.max(0,-(-l*c+u)))*i+(a=i>0?-c:Math.min(Math.max(-c,-h),c))*(a+2*h)+d:a<=s?(i=0,o=(a=Math.min(Math.max(-c,-h),c))*(a+2*h)+d):o=-(i=Math.max(0,-(l*c+u)))*i+(a=i>0?c:Math.min(Math.max(-c,-h),c))*(a+2*h)+d;else a=l>0?-c:c,o=-(i=Math.max(0,-(l*a+u)))*i+a*(a+2*h)+d;return n&&n.copy(this.direction).multiplyScalar(i).add(this.origin),r&&r.copy(jt).multiplyScalar(a).add(Wt),o},e.intersectSphere=function(t,e){Vt.subVectors(t.center,this.origin);var n=Vt.dot(this.direction),r=Vt.dot(Vt)-n*n,i=t.radius*t.radius;if(r>i)return null;var a=Math.sqrt(i-r),o=n-a,s=n+a;return o<0&&s<0?null:o<0?this.at(s,e):this.at(o,e)},e.intersectsSphere=function(t){return this.distanceSqToPoint(t.center)<=t.radius*t.radius},e.distanceToPlane=function(t){var e=t.normal.dot(this.direction);if(0===e)return 0===t.distanceToPoint(this.origin)?0:null;var n=-(this.origin.dot(t.normal)+t.constant)/e;return n>=0?n:null},e.intersectPlane=function(t,e){var n=this.distanceToPlane(t);return null===n?null:this.at(n,e)},e.intersectsPlane=function(t){var e=t.distanceToPoint(this.origin);return 0===e||t.normal.dot(this.direction)*e<0},e.intersectBox=function(t,e){var n,r,i,a,o,s,c=1/this.direction.x,l=1/this.direction.y,u=1/this.direction.z,h=this.origin;return c>=0?(n=(t.min.x-h.x)*c,r=(t.max.x-h.x)*c):(n=(t.max.x-h.x)*c,r=(t.min.x-h.x)*c),l>=0?(i=(t.min.y-h.y)*l,a=(t.max.y-h.y)*l):(i=(t.max.y-h.y)*l,a=(t.min.y-h.y)*l),n>a||i>r?null:((i>n||n!=n)&&(n=i),(a=0?(o=(t.min.z-h.z)*u,s=(t.max.z-h.z)*u):(o=(t.max.z-h.z)*u,s=(t.min.z-h.z)*u),n>s||o>r?null:((o>n||n!=n)&&(n=o),(s=0?n:r,e)))},e.intersectsBox=function(t){return null!==this.intersectBox(t,Vt)},e.intersectTriangle=function(t,e,n,r,i){Xt.subVectors(e,t),Yt.subVectors(n,t),Zt.crossVectors(Xt,Yt);var a,o=this.direction.dot(Zt);if(o>0){if(r)return null;a=1}else{if(!(o<0))return null;a=-1,o=-o}qt.subVectors(this.origin,t);var s=a*this.direction.dot(Yt.crossVectors(qt,Yt));if(s<0)return null;var c=a*this.direction.dot(Xt.cross(qt));if(c<0)return null;if(s+c>o)return null;var l=-a*qt.dot(Zt);return l<0?null:this.at(l/o,i)},e.applyMatrix4=function(t){return this.origin.applyMatrix4(t),this.direction.transformDirection(t),this},e.equals=function(t){return t.origin.equals(this.origin)&&t.direction.equals(this.direction)},t}(),Qt=function(){function t(){Object.defineProperty(this,"isMatrix4",{value:!0}),this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],arguments.length>0&&console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")}var e=t.prototype;return e.set=function(t,e,n,r,i,a,o,s,c,l,u,h,d,p,f,m){var v=this.elements;return v[0]=t,v[4]=e,v[8]=n,v[12]=r,v[1]=i,v[5]=a,v[9]=o,v[13]=s,v[2]=c,v[6]=l,v[10]=u,v[14]=h,v[3]=d,v[7]=p,v[11]=f,v[15]=m,this},e.identity=function(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this},e.clone=function(){return(new t).fromArray(this.elements)},e.copy=function(t){var e=this.elements,n=t.elements;return e[0]=n[0],e[1]=n[1],e[2]=n[2],e[3]=n[3],e[4]=n[4],e[5]=n[5],e[6]=n[6],e[7]=n[7],e[8]=n[8],e[9]=n[9],e[10]=n[10],e[11]=n[11],e[12]=n[12],e[13]=n[13],e[14]=n[14],e[15]=n[15],this},e.copyPosition=function(t){var e=this.elements,n=t.elements;return e[12]=n[12],e[13]=n[13],e[14]=n[14],this},e.extractBasis=function(t,e,n){return t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),n.setFromMatrixColumn(this,2),this},e.makeBasis=function(t,e,n){return this.set(t.x,e.x,n.x,0,t.y,e.y,n.y,0,t.z,e.z,n.z,0,0,0,0,1),this},e.extractRotation=function(t){var e=this.elements,n=t.elements,r=1/Kt.setFromMatrixColumn(t,0).length(),i=1/Kt.setFromMatrixColumn(t,1).length(),a=1/Kt.setFromMatrixColumn(t,2).length();return e[0]=n[0]*r,e[1]=n[1]*r,e[2]=n[2]*r,e[3]=0,e[4]=n[4]*i,e[5]=n[5]*i,e[6]=n[6]*i,e[7]=0,e[8]=n[8]*a,e[9]=n[9]*a,e[10]=n[10]*a,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this},e.makeRotationFromEuler=function(t){t&&t.isEuler||console.error("THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");var e=this.elements,n=t.x,r=t.y,i=t.z,a=Math.cos(n),o=Math.sin(n),s=Math.cos(r),c=Math.sin(r),l=Math.cos(i),u=Math.sin(i);if("XYZ"===t.order){var h=a*l,d=a*u,p=o*l,f=o*u;e[0]=s*l,e[4]=-s*u,e[8]=c,e[1]=d+p*c,e[5]=h-f*c,e[9]=-o*s,e[2]=f-h*c,e[6]=p+d*c,e[10]=a*s}else if("YXZ"===t.order){var m=s*l,v=s*u,g=c*l,y=c*u;e[0]=m+y*o,e[4]=g*o-v,e[8]=a*c,e[1]=a*u,e[5]=a*l,e[9]=-o,e[2]=v*o-g,e[6]=y+m*o,e[10]=a*s}else if("ZXY"===t.order){var x=s*l,_=s*u,b=c*l,w=c*u;e[0]=x-w*o,e[4]=-a*u,e[8]=b+_*o,e[1]=_+b*o,e[5]=a*l,e[9]=w-x*o,e[2]=-a*c,e[6]=o,e[10]=a*s}else if("ZYX"===t.order){var M=a*l,S=a*u,T=o*l,E=o*u;e[0]=s*l,e[4]=T*c-S,e[8]=M*c+E,e[1]=s*u,e[5]=E*c+M,e[9]=S*c-T,e[2]=-c,e[6]=o*s,e[10]=a*s}else if("YZX"===t.order){var A=a*s,L=a*c,R=o*s,C=o*c;e[0]=s*l,e[4]=C-A*u,e[8]=R*u+L,e[1]=u,e[5]=a*l,e[9]=-o*l,e[2]=-c*l,e[6]=L*u+R,e[10]=A-C*u}else if("XZY"===t.order){var P=a*s,I=a*c,N=o*s,D=o*c;e[0]=s*l,e[4]=-u,e[8]=c*l,e[1]=P*u+D,e[5]=a*l,e[9]=I*u-N,e[2]=N*u-I,e[6]=o*l,e[10]=D*u+P}return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this},e.makeRotationFromQuaternion=function(t){return this.compose(te,t,ee)},e.lookAt=function(t,e,n){var r=this.elements;return ie.subVectors(t,e),0===ie.lengthSq()&&(ie.z=1),ie.normalize(),ne.crossVectors(n,ie),0===ne.lengthSq()&&(1===Math.abs(n.z)?ie.x+=1e-4:ie.z+=1e-4,ie.normalize(),ne.crossVectors(n,ie)),ne.normalize(),re.crossVectors(ie,ne),r[0]=ne.x,r[4]=re.x,r[8]=ie.x,r[1]=ne.y,r[5]=re.y,r[9]=ie.y,r[2]=ne.z,r[6]=re.z,r[10]=ie.z,this},e.multiply=function(t,e){return void 0!==e?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(t,e)):this.multiplyMatrices(this,t)},e.premultiply=function(t){return this.multiplyMatrices(t,this)},e.multiplyMatrices=function(t,e){var n=t.elements,r=e.elements,i=this.elements,a=n[0],o=n[4],s=n[8],c=n[12],l=n[1],u=n[5],h=n[9],d=n[13],p=n[2],f=n[6],m=n[10],v=n[14],g=n[3],y=n[7],x=n[11],_=n[15],b=r[0],w=r[4],M=r[8],S=r[12],T=r[1],E=r[5],A=r[9],L=r[13],R=r[2],C=r[6],P=r[10],I=r[14],N=r[3],D=r[7],O=r[11],B=r[15];return i[0]=a*b+o*T+s*R+c*N,i[4]=a*w+o*E+s*C+c*D,i[8]=a*M+o*A+s*P+c*O,i[12]=a*S+o*L+s*I+c*B,i[1]=l*b+u*T+h*R+d*N,i[5]=l*w+u*E+h*C+d*D,i[9]=l*M+u*A+h*P+d*O,i[13]=l*S+u*L+h*I+d*B,i[2]=p*b+f*T+m*R+v*N,i[6]=p*w+f*E+m*C+v*D,i[10]=p*M+f*A+m*P+v*O,i[14]=p*S+f*L+m*I+v*B,i[3]=g*b+y*T+x*R+_*N,i[7]=g*w+y*E+x*C+_*D,i[11]=g*M+y*A+x*P+_*O,i[15]=g*S+y*L+x*I+_*B,this},e.multiplyScalar=function(t){var e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this},e.determinant=function(){var t=this.elements,e=t[0],n=t[4],r=t[8],i=t[12],a=t[1],o=t[5],s=t[9],c=t[13],l=t[2],u=t[6],h=t[10],d=t[14];return t[3]*(+i*s*u-r*c*u-i*o*h+n*c*h+r*o*d-n*s*d)+t[7]*(+e*s*d-e*c*h+i*a*h-r*a*d+r*c*l-i*s*l)+t[11]*(+e*c*u-e*o*d-i*a*u+n*a*d+i*o*l-n*c*l)+t[15]*(-r*o*l-e*s*u+e*o*h+r*a*u-n*a*h+n*s*l)},e.transpose=function(){var t,e=this.elements;return t=e[1],e[1]=e[4],e[4]=t,t=e[2],e[2]=e[8],e[8]=t,t=e[6],e[6]=e[9],e[9]=t,t=e[3],e[3]=e[12],e[12]=t,t=e[7],e[7]=e[13],e[13]=t,t=e[11],e[11]=e[14],e[14]=t,this},e.setPosition=function(t,e,n){var r=this.elements;return t.isVector3?(r[12]=t.x,r[13]=t.y,r[14]=t.z):(r[12]=t,r[13]=e,r[14]=n),this},e.invert=function(){var t=this.elements,e=t[0],n=t[1],r=t[2],i=t[3],a=t[4],o=t[5],s=t[6],c=t[7],l=t[8],u=t[9],h=t[10],d=t[11],p=t[12],f=t[13],m=t[14],v=t[15],g=u*m*c-f*h*c+f*s*d-o*m*d-u*s*v+o*h*v,y=p*h*c-l*m*c-p*s*d+a*m*d+l*s*v-a*h*v,x=l*f*c-p*u*c+p*o*d-a*f*d-l*o*v+a*u*v,_=p*u*s-l*f*s-p*o*h+a*f*h+l*o*m-a*u*m,b=e*g+n*y+r*x+i*_;if(0===b)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);var w=1/b;return t[0]=g*w,t[1]=(f*h*i-u*m*i-f*r*d+n*m*d+u*r*v-n*h*v)*w,t[2]=(o*m*i-f*s*i+f*r*c-n*m*c-o*r*v+n*s*v)*w,t[3]=(u*s*i-o*h*i-u*r*c+n*h*c+o*r*d-n*s*d)*w,t[4]=y*w,t[5]=(l*m*i-p*h*i+p*r*d-e*m*d-l*r*v+e*h*v)*w,t[6]=(p*s*i-a*m*i-p*r*c+e*m*c+a*r*v-e*s*v)*w,t[7]=(a*h*i-l*s*i+l*r*c-e*h*c-a*r*d+e*s*d)*w,t[8]=x*w,t[9]=(p*u*i-l*f*i-p*n*d+e*f*d+l*n*v-e*u*v)*w,t[10]=(a*f*i-p*o*i+p*n*c-e*f*c-a*n*v+e*o*v)*w,t[11]=(l*o*i-a*u*i-l*n*c+e*u*c+a*n*d-e*o*d)*w,t[12]=_*w,t[13]=(l*f*r-p*u*r+p*n*h-e*f*h-l*n*m+e*u*m)*w,t[14]=(p*o*r-a*f*r-p*n*s+e*f*s+a*n*m-e*o*m)*w,t[15]=(a*u*r-l*o*r+l*n*s-e*u*s-a*n*h+e*o*h)*w,this},e.scale=function(t){var e=this.elements,n=t.x,r=t.y,i=t.z;return e[0]*=n,e[4]*=r,e[8]*=i,e[1]*=n,e[5]*=r,e[9]*=i,e[2]*=n,e[6]*=r,e[10]*=i,e[3]*=n,e[7]*=r,e[11]*=i,this},e.getMaxScaleOnAxis=function(){var t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],n=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],r=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,n,r))},e.makeTranslation=function(t,e,n){return this.set(1,0,0,t,0,1,0,e,0,0,1,n,0,0,0,1),this},e.makeRotationX=function(t){var e=Math.cos(t),n=Math.sin(t);return this.set(1,0,0,0,0,e,-n,0,0,n,e,0,0,0,0,1),this},e.makeRotationY=function(t){var e=Math.cos(t),n=Math.sin(t);return this.set(e,0,n,0,0,1,0,0,-n,0,e,0,0,0,0,1),this},e.makeRotationZ=function(t){var e=Math.cos(t),n=Math.sin(t);return this.set(e,-n,0,0,n,e,0,0,0,0,1,0,0,0,0,1),this},e.makeRotationAxis=function(t,e){var n=Math.cos(e),r=Math.sin(e),i=1-n,a=t.x,o=t.y,s=t.z,c=i*a,l=i*o;return this.set(c*a+n,c*o-r*s,c*s+r*o,0,c*o+r*s,l*o+n,l*s-r*a,0,c*s-r*o,l*s+r*a,i*s*s+n,0,0,0,0,1),this},e.makeScale=function(t,e,n){return this.set(t,0,0,0,0,e,0,0,0,0,n,0,0,0,0,1),this},e.makeShear=function(t,e,n){return this.set(1,e,n,0,t,1,n,0,t,e,1,0,0,0,0,1),this},e.compose=function(t,e,n){var r=this.elements,i=e._x,a=e._y,o=e._z,s=e._w,c=i+i,l=a+a,u=o+o,h=i*c,d=i*l,p=i*u,f=a*l,m=a*u,v=o*u,g=s*c,y=s*l,x=s*u,_=n.x,b=n.y,w=n.z;return r[0]=(1-(f+v))*_,r[1]=(d+x)*_,r[2]=(p-y)*_,r[3]=0,r[4]=(d-x)*b,r[5]=(1-(h+v))*b,r[6]=(m+g)*b,r[7]=0,r[8]=(p+y)*w,r[9]=(m-g)*w,r[10]=(1-(h+f))*w,r[11]=0,r[12]=t.x,r[13]=t.y,r[14]=t.z,r[15]=1,this},e.decompose=function(t,e,n){var r=this.elements,i=Kt.set(r[0],r[1],r[2]).length(),a=Kt.set(r[4],r[5],r[6]).length(),o=Kt.set(r[8],r[9],r[10]).length();this.determinant()<0&&(i=-i),t.x=r[12],t.y=r[13],t.z=r[14],$t.copy(this);var s=1/i,c=1/a,l=1/o;return $t.elements[0]*=s,$t.elements[1]*=s,$t.elements[2]*=s,$t.elements[4]*=c,$t.elements[5]*=c,$t.elements[6]*=c,$t.elements[8]*=l,$t.elements[9]*=l,$t.elements[10]*=l,e.setFromRotationMatrix($t),n.x=i,n.y=a,n.z=o,this},e.makePerspective=function(t,e,n,r,i,a){void 0===a&&console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.");var o=this.elements,s=2*i/(e-t),c=2*i/(n-r),l=(e+t)/(e-t),u=(n+r)/(n-r),h=-(a+i)/(a-i),d=-2*a*i/(a-i);return o[0]=s,o[4]=0,o[8]=l,o[12]=0,o[1]=0,o[5]=c,o[9]=u,o[13]=0,o[2]=0,o[6]=0,o[10]=h,o[14]=d,o[3]=0,o[7]=0,o[11]=-1,o[15]=0,this},e.makeOrthographic=function(t,e,n,r,i,a){var o=this.elements,s=1/(e-t),c=1/(n-r),l=1/(a-i),u=(e+t)*s,h=(n+r)*c,d=(a+i)*l;return o[0]=2*s,o[4]=0,o[8]=0,o[12]=-u,o[1]=0,o[5]=2*c,o[9]=0,o[13]=-h,o[2]=0,o[6]=0,o[10]=-2*l,o[14]=-d,o[3]=0,o[7]=0,o[11]=0,o[15]=1,this},e.equals=function(t){for(var e=this.elements,n=t.elements,r=0;r<16;r++)if(e[r]!==n[r])return!1;return!0},e.fromArray=function(t,e){void 0===e&&(e=0);for(var n=0;n<16;n++)this.elements[n]=t[n+e];return this},e.toArray=function(t,e){void 0===t&&(t=[]),void 0===e&&(e=0);var n=this.elements;return t[e]=n[0],t[e+1]=n[1],t[e+2]=n[2],t[e+3]=n[3],t[e+4]=n[4],t[e+5]=n[5],t[e+6]=n[6],t[e+7]=n[7],t[e+8]=n[8],t[e+9]=n[9],t[e+10]=n[10],t[e+11]=n[11],t[e+12]=n[12],t[e+13]=n[13],t[e+14]=n[14],t[e+15]=n[15],t},t}(),Kt=new Mt,$t=new Qt,te=new Mt(0,0,0),ee=new Mt(1,1,1),ne=new Mt,re=new Mt,ie=new Mt,ae=function(){function t(e,n,r,i){void 0===e&&(e=0),void 0===n&&(n=0),void 0===r&&(r=0),void 0===i&&(i=t.DefaultOrder),Object.defineProperty(this,"isEuler",{value:!0}),this._x=e,this._y=n,this._z=r,this._order=i}var e=t.prototype;return e.set=function(t,e,n,r){return this._x=t,this._y=e,this._z=n,this._order=r||this._order,this._onChangeCallback(),this},e.clone=function(){return new this.constructor(this._x,this._y,this._z,this._order)},e.copy=function(t){return this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order,this._onChangeCallback(),this},e.setFromRotationMatrix=function(t,e,n){var r=st.clamp,i=t.elements,a=i[0],o=i[4],s=i[8],c=i[1],l=i[5],u=i[9],h=i[2],d=i[6],p=i[10];switch(e=e||this._order){case"XYZ":this._y=Math.asin(r(s,-1,1)),Math.abs(s)<.9999999?(this._x=Math.atan2(-u,p),this._z=Math.atan2(-o,a)):(this._x=Math.atan2(d,l),this._z=0);break;case"YXZ":this._x=Math.asin(-r(u,-1,1)),Math.abs(u)<.9999999?(this._y=Math.atan2(s,p),this._z=Math.atan2(c,l)):(this._y=Math.atan2(-h,a),this._z=0);break;case"ZXY":this._x=Math.asin(r(d,-1,1)),Math.abs(d)<.9999999?(this._y=Math.atan2(-h,p),this._z=Math.atan2(-o,l)):(this._y=0,this._z=Math.atan2(c,a));break;case"ZYX":this._y=Math.asin(-r(h,-1,1)),Math.abs(h)<.9999999?(this._x=Math.atan2(d,p),this._z=Math.atan2(c,a)):(this._x=0,this._z=Math.atan2(-o,l));break;case"YZX":this._z=Math.asin(r(c,-1,1)),Math.abs(c)<.9999999?(this._x=Math.atan2(-u,l),this._y=Math.atan2(-h,a)):(this._x=0,this._y=Math.atan2(s,p));break;case"XZY":this._z=Math.asin(-r(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(d,l),this._y=Math.atan2(s,a)):(this._x=Math.atan2(-u,p),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+e)}return this._order=e,!1!==n&&this._onChangeCallback(),this},e.setFromQuaternion=function(t,e,n){return oe.makeRotationFromQuaternion(t),this.setFromRotationMatrix(oe,e,n)},e.setFromVector3=function(t,e){return this.set(t.x,t.y,t.z,e||this._order)},e.reorder=function(t){return se.setFromEuler(this),this.setFromQuaternion(se,t)},e.equals=function(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order},e.fromArray=function(t){return this._x=t[0],this._y=t[1],this._z=t[2],void 0!==t[3]&&(this._order=t[3]),this._onChangeCallback(),this},e.toArray=function(t,e){return void 0===t&&(t=[]),void 0===e&&(e=0),t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._order,t},e.toVector3=function(t){return t?t.set(this._x,this._y,this._z):new Mt(this._x,this._y,this._z)},e._onChange=function(t){return this._onChangeCallback=t,this},e._onChangeCallback=function(){},lt(t,[{key:"x",get:function(){return this._x},set:function(t){this._x=t,this._onChangeCallback()}},{key:"y",get:function(){return this._y},set:function(t){this._y=t,this._onChangeCallback()}},{key:"z",get:function(){return this._z},set:function(t){this._z=t,this._onChangeCallback()}},{key:"order",get:function(){return this._order},set:function(t){this._order=t,this._onChangeCallback()}}]),t}();ae.DefaultOrder="XYZ",ae.RotationOrders=["XYZ","YZX","ZXY","XZY","YXZ","ZYX"];var oe=new Qt,se=new wt,ce=function(){function t(){this.mask=1}var e=t.prototype;return e.set=function(t){this.mask=1<1){for(var e=0;e1){for(var e=0;e0){r.children=[];for(var p=0;p0){r.animations=[];for(var f=0;f0&&(n.geometries=v),g.length>0&&(n.materials=g),y.length>0&&(n.textures=y),x.length>0&&(n.images=x),_.length>0&&(n.shapes=_),b.length>0&&(n.skeletons=b),w.length>0&&(n.animations=w)}return n.object=r,n;function M(t){var e=[];for(var n in t){var r=t[n];delete r.metadata,e.push(r)}return e}},clone:function(t){return(new this.constructor).copy(this,t)},copy:function(t,e){if(void 0===e&&(e=!0),this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.rotation.order=t.rotation.order,this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.userData=JSON.parse(JSON.stringify(t.userData)),!0===e)for(var n=0;n1?void 0:e.copy(n).multiplyScalar(i).add(t.start)},e.intersectsLine=function(t){var e=this.distanceToPoint(t.start),n=this.distanceToPoint(t.end);return e<0&&n>0||n<0&&e>0},e.intersectsBox=function(t){return t.intersectsPlane(this)},e.intersectsSphere=function(t){return t.intersectsPlane(this)},e.coplanarPoint=function(t){return void 0===t&&(console.warn("THREE.Plane: .coplanarPoint() target is now required"),t=new Mt),t.copy(this.normal).multiplyScalar(-this.constant)},e.applyMatrix4=function(t,e){var n=e||Te.getNormalMatrix(t),r=this.coplanarPoint(Me).applyMatrix4(t),i=this.normal.applyMatrix3(n).normalize();return this.constant=-r.dot(i),this},e.translate=function(t){return this.constant-=t.dot(this.normal),this},e.equals=function(t){return t.normal.equals(this.normal)&&t.constant===this.constant},t}(),Ae=new Mt,Le=new Mt,Re=new Mt,Ce=new Mt,Pe=new Mt,Ie=new Mt,Ne=new Mt,De=new Mt,Oe=new Mt,Be=new Mt,ze=function(){function t(t,e,n){this.a=void 0!==t?t:new Mt,this.b=void 0!==e?e:new Mt,this.c=void 0!==n?n:new Mt}t.getNormal=function(t,e,n,r){void 0===r&&(console.warn("THREE.Triangle: .getNormal() target is now required"),r=new Mt),r.subVectors(n,e),Ae.subVectors(t,e),r.cross(Ae);var i=r.lengthSq();return i>0?r.multiplyScalar(1/Math.sqrt(i)):r.set(0,0,0)},t.getBarycoord=function(t,e,n,r,i){Ae.subVectors(r,e),Le.subVectors(n,e),Re.subVectors(t,e);var a=Ae.dot(Ae),o=Ae.dot(Le),s=Ae.dot(Re),c=Le.dot(Le),l=Le.dot(Re),u=a*c-o*o;if(void 0===i&&(console.warn("THREE.Triangle: .getBarycoord() target is now required"),i=new Mt),0===u)return i.set(-2,-1,-1);var h=1/u,d=(c*s-o*l)*h,p=(a*l-o*s)*h;return i.set(1-d-p,p,d)},t.containsPoint=function(t,e,n,r){return this.getBarycoord(t,e,n,r,Ce),Ce.x>=0&&Ce.y>=0&&Ce.x+Ce.y<=1},t.getUV=function(t,e,n,r,i,a,o,s){return this.getBarycoord(t,e,n,r,Ce),s.set(0,0),s.addScaledVector(i,Ce.x),s.addScaledVector(a,Ce.y),s.addScaledVector(o,Ce.z),s},t.isFrontFacing=function(t,e,n,r){return Ae.subVectors(n,e),Le.subVectors(t,e),Ae.cross(Le).dot(r)<0};var e=t.prototype;return e.set=function(t,e,n){return this.a.copy(t),this.b.copy(e),this.c.copy(n),this},e.setFromPointsAndIndices=function(t,e,n,r){return this.a.copy(t[e]),this.b.copy(t[n]),this.c.copy(t[r]),this},e.clone=function(){return(new this.constructor).copy(this)},e.copy=function(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this},e.getArea=function(){return Ae.subVectors(this.c,this.b),Le.subVectors(this.a,this.b),.5*Ae.cross(Le).length()},e.getMidpoint=function(t){return void 0===t&&(console.warn("THREE.Triangle: .getMidpoint() target is now required"),t=new Mt),t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},e.getNormal=function(e){return t.getNormal(this.a,this.b,this.c,e)},e.getPlane=function(t){return void 0===t&&(console.warn("THREE.Triangle: .getPlane() target is now required"),t=new Ee),t.setFromCoplanarPoints(this.a,this.b,this.c)},e.getBarycoord=function(e,n){return t.getBarycoord(e,this.a,this.b,this.c,n)},e.getUV=function(e,n,r,i,a){return t.getUV(e,this.a,this.b,this.c,n,r,i,a)},e.containsPoint=function(e){return t.containsPoint(e,this.a,this.b,this.c)},e.isFrontFacing=function(e){return t.isFrontFacing(this.a,this.b,this.c,e)},e.intersectsBox=function(t){return t.intersectsTriangle(this)},e.closestPointToPoint=function(t,e){void 0===e&&(console.warn("THREE.Triangle: .closestPointToPoint() target is now required"),e=new Mt);var n,r,i=this.a,a=this.b,o=this.c;Pe.subVectors(a,i),Ie.subVectors(o,i),De.subVectors(t,i);var s=Pe.dot(De),c=Ie.dot(De);if(s<=0&&c<=0)return e.copy(i);Oe.subVectors(t,a);var l=Pe.dot(Oe),u=Ie.dot(Oe);if(l>=0&&u<=l)return e.copy(a);var h=s*u-l*c;if(h<=0&&s>=0&&l<=0)return n=s/(s-l),e.copy(i).addScaledVector(Pe,n);Be.subVectors(t,o);var d=Pe.dot(Be),p=Ie.dot(Be);if(p>=0&&d<=p)return e.copy(o);var f=d*c-s*p;if(f<=0&&c>=0&&p<=0)return r=c/(c-p),e.copy(i).addScaledVector(Ie,r);var m=l*p-d*u;if(m<=0&&u-l>=0&&d-p>=0)return Ne.subVectors(o,a),r=(u-l)/(u-l+(d-p)),e.copy(a).addScaledVector(Ne,r);var v=1/(m+f+h);return n=f*v,r=h*v,e.copy(i).addScaledVector(Pe,n).addScaledVector(Ie,r)},e.equals=function(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)},t}(),Fe={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Ge={h:0,s:0,l:0},Ue={h:0,s:0,l:0};function He(t,e,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?t+6*(e-t)*n:n<.5?e:n<2/3?t+6*(e-t)*(2/3-n):t}function ke(t){return t<.04045?.0773993808*t:Math.pow(.9478672986*t+.0521327014,2.4)}function Ve(t){return t<.0031308?12.92*t:1.055*Math.pow(t,.41666)-.055}var We=function(){function t(t,e,n){return Object.defineProperty(this,"isColor",{value:!0}),void 0===e&&void 0===n?this.set(t):this.setRGB(t,e,n)}var e=t.prototype;return e.set=function(t){return t&&t.isColor?this.copy(t):"number"==typeof t?this.setHex(t):"string"==typeof t&&this.setStyle(t),this},e.setScalar=function(t){return this.r=t,this.g=t,this.b=t,this},e.setHex=function(t){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(255&t)/255,this},e.setRGB=function(t,e,n){return this.r=t,this.g=e,this.b=n,this},e.setHSL=function(t,e,n){if(t=st.euclideanModulo(t,1),e=st.clamp(e,0,1),n=st.clamp(n,0,1),0===e)this.r=this.g=this.b=n;else{var r=n<=.5?n*(1+e):n+e-n*e,i=2*n-r;this.r=He(i,r,t+1/3),this.g=He(i,r,t),this.b=He(i,r,t-1/3)}return this},e.setStyle=function(t){function e(e){void 0!==e&&parseFloat(e)<1&&console.warn("THREE.Color: Alpha component of "+t+" will be ignored.")}var n;if(n=/^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(t)){var r,i=n[1],a=n[2];switch(i){case"rgb":case"rgba":if(r=/^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return this.r=Math.min(255,parseInt(r[1],10))/255,this.g=Math.min(255,parseInt(r[2],10))/255,this.b=Math.min(255,parseInt(r[3],10))/255,e(r[4]),this;if(r=/^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return this.r=Math.min(100,parseInt(r[1],10))/100,this.g=Math.min(100,parseInt(r[2],10))/100,this.b=Math.min(100,parseInt(r[3],10))/100,e(r[4]),this;break;case"hsl":case"hsla":if(r=/^(\d*\.?\d+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a)){var o=parseFloat(r[1])/360,s=parseInt(r[2],10)/100,c=parseInt(r[3],10)/100;return e(r[4]),this.setHSL(o,s,c)}}}else if(n=/^\#([A-Fa-f\d]+)$/.exec(t)){var l=n[1],u=l.length;if(3===u)return this.r=parseInt(l.charAt(0)+l.charAt(0),16)/255,this.g=parseInt(l.charAt(1)+l.charAt(1),16)/255,this.b=parseInt(l.charAt(2)+l.charAt(2),16)/255,this;if(6===u)return this.r=parseInt(l.charAt(0)+l.charAt(1),16)/255,this.g=parseInt(l.charAt(2)+l.charAt(3),16)/255,this.b=parseInt(l.charAt(4)+l.charAt(5),16)/255,this}return t&&t.length>0?this.setColorName(t):this},e.setColorName=function(t){var e=Fe[t];return void 0!==e?this.setHex(e):console.warn("THREE.Color: Unknown color "+t),this},e.clone=function(){return new this.constructor(this.r,this.g,this.b)},e.copy=function(t){return this.r=t.r,this.g=t.g,this.b=t.b,this},e.copyGammaToLinear=function(t,e){return void 0===e&&(e=2),this.r=Math.pow(t.r,e),this.g=Math.pow(t.g,e),this.b=Math.pow(t.b,e),this},e.copyLinearToGamma=function(t,e){void 0===e&&(e=2);var n=e>0?1/e:1;return this.r=Math.pow(t.r,n),this.g=Math.pow(t.g,n),this.b=Math.pow(t.b,n),this},e.convertGammaToLinear=function(t){return this.copyGammaToLinear(this,t),this},e.convertLinearToGamma=function(t){return this.copyLinearToGamma(this,t),this},e.copySRGBToLinear=function(t){return this.r=ke(t.r),this.g=ke(t.g),this.b=ke(t.b),this},e.copyLinearToSRGB=function(t){return this.r=Ve(t.r),this.g=Ve(t.g),this.b=Ve(t.b),this},e.convertSRGBToLinear=function(){return this.copySRGBToLinear(this),this},e.convertLinearToSRGB=function(){return this.copyLinearToSRGB(this),this},e.getHex=function(){return 255*this.r<<16^255*this.g<<8^255*this.b<<0},e.getHexString=function(){return("000000"+this.getHex().toString(16)).slice(-6)},e.getHSL=function(t){void 0===t&&(console.warn("THREE.Color: .getHSL() target is now required"),t={h:0,s:0,l:0});var e,n,r=this.r,i=this.g,a=this.b,o=Math.max(r,i,a),s=Math.min(r,i,a),c=(s+o)/2;if(s===o)e=0,n=0;else{var l=o-s;switch(n=c<=.5?l/(o+s):l/(2-o-s),o){case r:e=(i-a)/l+(i0&&(n.alphaTest=this.alphaTest),!0===this.premultipliedAlpha&&(n.premultipliedAlpha=this.premultipliedAlpha),!0===this.wireframe&&(n.wireframe=this.wireframe),this.wireframeLinewidth>1&&(n.wireframeLinewidth=this.wireframeLinewidth),"round"!==this.wireframeLinecap&&(n.wireframeLinecap=this.wireframeLinecap),"round"!==this.wireframeLinejoin&&(n.wireframeLinejoin=this.wireframeLinejoin),!0===this.morphTargets&&(n.morphTargets=!0),!0===this.morphNormals&&(n.morphNormals=!0),!0===this.skinning&&(n.skinning=!0),!1===this.visible&&(n.visible=!1),!1===this.toneMapped&&(n.toneMapped=!1),"{}"!==JSON.stringify(this.userData)&&(n.userData=this.userData),e){var i=r(t.textures),a=r(t.images);i.length>0&&(n.textures=i),a.length>0&&(n.images=a)}return n},clone:function(){return(new this.constructor).copy(this)},copy:function(t){this.name=t.name,this.fog=t.fog,this.blending=t.blending,this.side=t.side,this.flatShading=t.flatShading,this.vertexColors=t.vertexColors,this.opacity=t.opacity,this.transparent=t.transparent,this.blendSrc=t.blendSrc,this.blendDst=t.blendDst,this.blendEquation=t.blendEquation,this.blendSrcAlpha=t.blendSrcAlpha,this.blendDstAlpha=t.blendDstAlpha,this.blendEquationAlpha=t.blendEquationAlpha,this.depthFunc=t.depthFunc,this.depthTest=t.depthTest,this.depthWrite=t.depthWrite,this.stencilWriteMask=t.stencilWriteMask,this.stencilFunc=t.stencilFunc,this.stencilRef=t.stencilRef,this.stencilFuncMask=t.stencilFuncMask,this.stencilFail=t.stencilFail,this.stencilZFail=t.stencilZFail,this.stencilZPass=t.stencilZPass,this.stencilWrite=t.stencilWrite;var e=t.clippingPlanes,n=null;if(null!==e){var r=e.length;n=new Array(r);for(var i=0;i!==r;++i)n[i]=e[i].clone()}return this.clippingPlanes=n,this.clipIntersection=t.clipIntersection,this.clipShadows=t.clipShadows,this.shadowSide=t.shadowSide,this.colorWrite=t.colorWrite,this.precision=t.precision,this.polygonOffset=t.polygonOffset,this.polygonOffsetFactor=t.polygonOffsetFactor,this.polygonOffsetUnits=t.polygonOffsetUnits,this.dithering=t.dithering,this.alphaTest=t.alphaTest,this.premultipliedAlpha=t.premultipliedAlpha,this.visible=t.visible,this.toneMapped=t.toneMapped,this.userData=JSON.parse(JSON.stringify(t.userData)),this},dispose:function(){this.dispatchEvent({type:"dispose"})}}),Object.defineProperty(Xe.prototype,"needsUpdate",{set:function(t){!0===t&&this.version++}}),Ye.prototype=Object.create(Xe.prototype),Ye.prototype.constructor=Ye,Ye.prototype.isMeshBasicMaterial=!0,Ye.prototype.copy=function(t){return Xe.prototype.copy.call(this,t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this};var Ze=new Mt,Je=new pt;function Qe(t,e,n){if(Array.isArray(t))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.name="",this.array=t,this.itemSize=e,this.count=void 0!==t?t.length/e:0,this.normalized=!0===n,this.usage=tt,this.updateRange={offset:0,count:-1},this.version=0}function Ke(t,e,n){Qe.call(this,new Int8Array(t),e,n)}function $e(t,e,n){Qe.call(this,new Uint8Array(t),e,n)}function tn(t,e,n){Qe.call(this,new Uint8ClampedArray(t),e,n)}function en(t,e,n){Qe.call(this,new Int16Array(t),e,n)}function nn(t,e,n){Qe.call(this,new Uint16Array(t),e,n)}function rn(t,e,n){Qe.call(this,new Int32Array(t),e,n)}function an(t,e,n){Qe.call(this,new Uint32Array(t),e,n)}function on(t,e,n){Qe.call(this,new Uint16Array(t),e,n)}function sn(t,e,n){Qe.call(this,new Float32Array(t),e,n)}function cn(t,e,n){Qe.call(this,new Float64Array(t),e,n)}Object.defineProperty(Qe.prototype,"needsUpdate",{set:function(t){!0===t&&this.version++}}),Object.assign(Qe.prototype,{isBufferAttribute:!0,onUploadCallback:function(){},setUsage:function(t){return this.usage=t,this},copy:function(t){return this.name=t.name,this.array=new t.array.constructor(t.array),this.itemSize=t.itemSize,this.count=t.count,this.normalized=t.normalized,this.usage=t.usage,this},copyAt:function(t,e,n){t*=this.itemSize,n*=e.itemSize;for(var r=0,i=this.itemSize;r0,o=i[1]&&i[1].length>0,s=t.morphTargets,c=s.length;if(c>0){e=[];for(var l=0;l0){u=[];for(var p=0;p0&&0===n.length&&console.error("THREE.DirectGeometry: Faceless geometries are not supported.");for(var y=0;ye&&(e=t[n]);return e}var hn={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:"undefined"!=typeof Uint8ClampedArray?Uint8ClampedArray:Uint8Array,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};function dn(t,e){return new hn[t](e)}var pn=1,fn=new Qt,mn=new we,vn=new Mt,gn=new Et,yn=new Et,xn=new Mt;function _n(){Object.defineProperty(this,"id",{value:pn+=2}),this.uuid=st.generateUUID(),this.name="",this.type="BufferGeometry",this.index=null,this.attributes={},this.morphAttributes={},this.morphTargetsRelative=!1,this.groups=[],this.boundingBox=null,this.boundingSphere=null,this.drawRange={start:0,count:1/0},this.userData={}}_n.prototype=Object.assign(Object.create(rt.prototype),{constructor:_n,isBufferGeometry:!0,getIndex:function(){return this.index},setIndex:function(t){return Array.isArray(t)?this.index=new(un(t)>65535?an:nn)(t,1):this.index=t,this},getAttribute:function(t){return this.attributes[t]},setAttribute:function(t,e){return this.attributes[t]=e,this},deleteAttribute:function(t){return delete this.attributes[t],this},hasAttribute:function(t){return void 0!==this.attributes[t]},addGroup:function(t,e,n){void 0===n&&(n=0),this.groups.push({start:t,count:e,materialIndex:n})},clearGroups:function(){this.groups=[]},setDrawRange:function(t,e){this.drawRange.start=t,this.drawRange.count=e},applyMatrix4:function(t){var e=this.attributes.position;void 0!==e&&(e.applyMatrix4(t),e.needsUpdate=!0);var n=this.attributes.normal;if(void 0!==n){var r=(new ft).getNormalMatrix(t);n.applyNormalMatrix(r),n.needsUpdate=!0}var i=this.attributes.tangent;return void 0!==i&&(i.transformDirection(t),i.needsUpdate=!0),null!==this.boundingBox&&this.computeBoundingBox(),null!==this.boundingSphere&&this.computeBoundingSphere(),this},rotateX:function(t){return fn.makeRotationX(t),this.applyMatrix4(fn),this},rotateY:function(t){return fn.makeRotationY(t),this.applyMatrix4(fn),this},rotateZ:function(t){return fn.makeRotationZ(t),this.applyMatrix4(fn),this},translate:function(t,e,n){return fn.makeTranslation(t,e,n),this.applyMatrix4(fn),this},scale:function(t,e,n){return fn.makeScale(t,e,n),this.applyMatrix4(fn),this},lookAt:function(t){return mn.lookAt(t),mn.updateMatrix(),this.applyMatrix4(mn.matrix),this},center:function(){return this.computeBoundingBox(),this.boundingBox.getCenter(vn).negate(),this.translate(vn.x,vn.y,vn.z),this},setFromObject:function(t){var e=t.geometry;if(t.isPoints||t.isLine){var n=new sn(3*e.vertices.length,3),r=new sn(3*e.colors.length,3);if(this.setAttribute("position",n.copyVector3sArray(e.vertices)),this.setAttribute("color",r.copyColorsArray(e.colors)),e.lineDistances&&e.lineDistances.length===e.vertices.length){var i=new sn(e.lineDistances.length,1);this.setAttribute("lineDistance",i.copyArray(e.lineDistances))}null!==e.boundingSphere&&(this.boundingSphere=e.boundingSphere.clone()),null!==e.boundingBox&&(this.boundingBox=e.boundingBox.clone())}else t.isMesh&&e&&e.isGeometry&&this.fromGeometry(e);return this},setFromPoints:function(t){for(var e=[],n=0,r=t.length;n0){var n=new Float32Array(3*t.normals.length);this.setAttribute("normal",new Qe(n,3).copyVector3sArray(t.normals))}if(t.colors.length>0){var r=new Float32Array(3*t.colors.length);this.setAttribute("color",new Qe(r,3).copyColorsArray(t.colors))}if(t.uvs.length>0){var i=new Float32Array(2*t.uvs.length);this.setAttribute("uv",new Qe(i,2).copyVector2sArray(t.uvs))}if(t.uvs2.length>0){var a=new Float32Array(2*t.uvs2.length);this.setAttribute("uv2",new Qe(a,2).copyVector2sArray(t.uvs2))}for(var o in this.groups=t.groups,t.morphTargets){for(var s=[],c=t.morphTargets[o],l=0,u=c.length;l0){var p=new sn(4*t.skinIndices.length,4);this.setAttribute("skinIndex",p.copyVector4sArray(t.skinIndices))}if(t.skinWeights.length>0){var f=new sn(4*t.skinWeights.length,4);this.setAttribute("skinWeight",f.copyVector4sArray(t.skinWeights))}return null!==t.boundingSphere&&(this.boundingSphere=t.boundingSphere.clone()),null!==t.boundingBox&&(this.boundingBox=t.boundingBox.clone()),this},computeBoundingBox:function(){null===this.boundingBox&&(this.boundingBox=new Et);var t=this.attributes.position,e=this.morphAttributes.position;if(t&&t.isGLBufferAttribute)return console.error('THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box. Alternatively set "mesh.frustumCulled" to "false".',this),void this.boundingBox.set(new Mt(-1/0,-1/0,-1/0),new Mt(1/0,1/0,1/0));if(void 0!==t){if(this.boundingBox.setFromBufferAttribute(t),e)for(var n=0,r=e.length;n0&&(t.userData=this.userData),void 0!==this.parameters){var e=this.parameters;for(var n in e)void 0!==e[n]&&(t[n]=e[n]);return t}t.data={attributes:{}};var r=this.index;null!==r&&(t.data.index={type:r.array.constructor.name,array:Array.prototype.slice.call(r.array)});var i=this.attributes;for(var a in i){var o=i[a],s=o.toJSON(t.data);""!==o.name&&(s.name=o.name),t.data.attributes[a]=s}var c={},l=!1;for(var u in this.morphAttributes){for(var h=this.morphAttributes[u],d=[],p=0,f=h.length;p0&&(c[u]=d,l=!0)}l&&(t.data.morphAttributes=c,t.data.morphTargetsRelative=this.morphTargetsRelative);var g=this.groups;g.length>0&&(t.data.groups=JSON.parse(JSON.stringify(g)));var y=this.boundingSphere;return null!==y&&(t.data.boundingSphere={center:y.center.toArray(),radius:y.radius}),t},clone:function(){return(new _n).copy(this)},copy:function(t){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;var e={};this.name=t.name;var n=t.index;null!==n&&this.setIndex(n.clone(e));var r=t.attributes;for(var i in r){var a=r[i];this.setAttribute(i,a.clone(e))}var o=t.morphAttributes;for(var s in o){for(var c=[],l=o[s],u=0,h=l.length;un.far?null:{distance:c,point:zn.clone(),object:t}}function Un(t,e,n,r,i,a,o,s,c,l,u,h){Sn.fromBufferAttribute(i,l),Tn.fromBufferAttribute(i,u),En.fromBufferAttribute(i,h);var d=t.morphTargetInfluences;if(e.morphTargets&&a&&d){Cn.set(0,0,0),Pn.set(0,0,0),In.set(0,0,0);for(var p=0,f=a.length;p0){var r=e[n[0]];if(void 0!==r){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(var i=0,a=r.length;i0&&console.error("THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")}},raycast:function(t,e){var n,r=this.geometry,i=this.material,a=this.matrixWorld;if(void 0!==i&&(null===r.boundingSphere&&r.computeBoundingSphere(),Mn.copy(r.boundingSphere),Mn.applyMatrix4(a),!1!==t.ray.intersectsSphere(Mn)&&(bn.copy(a).invert(),wn.copy(t.ray).applyMatrix4(bn),null===r.boundingBox||!1!==wn.intersectsBox(r.boundingBox))))if(r.isBufferGeometry){var o=r.index,s=r.attributes.position,c=r.morphAttributes.position,l=r.morphTargetsRelative,u=r.attributes.uv,h=r.attributes.uv2,d=r.groups,p=r.drawRange;if(null!==o)if(Array.isArray(i))for(var f=0,m=d.length;f0&&(B=U);for(var H=0,k=G.length;H0?1:-1,h.push(A.x,A.y,A.z),d.push(C/m),d.push(1-L/v),T+=1}for(var I=0;I0&&(e.defines=this.defines),e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader;var i={};for(var a in this.extensions)!0===this.extensions[a]&&(i[a]=!0);return Object.keys(i).length>0&&(e.extensions=i),e},qn.prototype=Object.assign(Object.create(we.prototype),{constructor:qn,isCamera:!0,copy:function(t,e){return we.prototype.copy.call(this,t,e),this.matrixWorldInverse.copy(t.matrixWorldInverse),this.projectionMatrix.copy(t.projectionMatrix),this.projectionMatrixInverse.copy(t.projectionMatrixInverse),this},getWorldDirection:function(t){void 0===t&&(console.warn("THREE.Camera: .getWorldDirection() target is now required"),t=new Mt),this.updateWorldMatrix(!0,!1);var e=this.matrixWorld.elements;return t.set(-e[8],-e[9],-e[10]).normalize()},updateMatrixWorld:function(t){we.prototype.updateMatrixWorld.call(this,t),this.matrixWorldInverse.copy(this.matrixWorld).invert()},updateWorldMatrix:function(t,e){we.prototype.updateWorldMatrix.call(this,t,e),this.matrixWorldInverse.copy(this.matrixWorld).invert()},clone:function(){return(new this.constructor).copy(this)}}),Xn.prototype=Object.assign(Object.create(qn.prototype),{constructor:Xn,isPerspectiveCamera:!0,copy:function(t,e){return qn.prototype.copy.call(this,t,e),this.fov=t.fov,this.zoom=t.zoom,this.near=t.near,this.far=t.far,this.focus=t.focus,this.aspect=t.aspect,this.view=null===t.view?null:Object.assign({},t.view),this.filmGauge=t.filmGauge,this.filmOffset=t.filmOffset,this},setFocalLength:function(t){var e=.5*this.getFilmHeight()/t;this.fov=2*st.RAD2DEG*Math.atan(e),this.updateProjectionMatrix()},getFocalLength:function(){var t=Math.tan(.5*st.DEG2RAD*this.fov);return.5*this.getFilmHeight()/t},getEffectiveFOV:function(){return 2*st.RAD2DEG*Math.atan(Math.tan(.5*st.DEG2RAD*this.fov)/this.zoom)},getFilmWidth:function(){return this.filmGauge*Math.min(this.aspect,1)},getFilmHeight:function(){return this.filmGauge/Math.max(this.aspect,1)},setViewOffset:function(t,e,n,r,i,a){this.aspect=t/e,null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=n,this.view.offsetY=r,this.view.width=i,this.view.height=a,this.updateProjectionMatrix()},clearViewOffset:function(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()},updateProjectionMatrix:function(){var t=this.near,e=t*Math.tan(.5*st.DEG2RAD*this.fov)/this.zoom,n=2*e,r=this.aspect*n,i=-.5*r,a=this.view;if(null!==this.view&&this.view.enabled){var o=a.fullWidth,s=a.fullHeight;i+=a.offsetX*r/o,e-=a.offsetY*n/s,r*=a.width/o,n*=a.height/s}var c=this.filmOffset;0!==c&&(i+=t*c/this.getFilmWidth()),this.projectionMatrix.makePerspective(i,i+r,e,e-n,t,this.far),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()},toJSON:function(t){var e=we.prototype.toJSON.call(this,t);return e.object.fov=this.fov,e.object.zoom=this.zoom,e.object.near=this.near,e.object.far=this.far,e.object.focus=this.focus,e.object.aspect=this.aspect,null!==this.view&&(e.object.view=Object.assign({},this.view)),e.object.filmGauge=this.filmGauge,e.object.filmOffset=this.filmOffset,e}});var Yn=90;function Zn(t,e,n){if(we.call(this),this.type="CubeCamera",!0===n.isWebGLCubeRenderTarget){this.renderTarget=n;var r=new Xn(Yn,1,t,e);r.layers=this.layers,r.up.set(0,-1,0),r.lookAt(new Mt(1,0,0)),this.add(r);var i=new Xn(Yn,1,t,e);i.layers=this.layers,i.up.set(0,-1,0),i.lookAt(new Mt(-1,0,0)),this.add(i);var a=new Xn(Yn,1,t,e);a.layers=this.layers,a.up.set(0,0,1),a.lookAt(new Mt(0,1,0)),this.add(a);var o=new Xn(Yn,1,t,e);o.layers=this.layers,o.up.set(0,0,-1),o.lookAt(new Mt(0,-1,0)),this.add(o);var s=new Xn(Yn,1,t,e);s.layers=this.layers,s.up.set(0,-1,0),s.lookAt(new Mt(0,0,1)),this.add(s);var c=new Xn(Yn,1,t,e);c.layers=this.layers,c.up.set(0,-1,0),c.lookAt(new Mt(0,0,-1)),this.add(c),this.update=function(t,e){null===this.parent&&this.updateMatrixWorld();var l=t.xr.enabled,u=t.getRenderTarget();t.xr.enabled=!1;var h=n.texture.generateMipmaps;n.texture.generateMipmaps=!1,t.setRenderTarget(n,0),t.render(e,r),t.setRenderTarget(n,1),t.render(e,i),t.setRenderTarget(n,2),t.render(e,a),t.setRenderTarget(n,3),t.render(e,o),t.setRenderTarget(n,4),t.render(e,s),n.texture.generateMipmaps=h,t.setRenderTarget(n,5),t.render(e,c),t.setRenderTarget(u),t.xr.enabled=l}}else console.error("THREE.CubeCamera: The constructor now expects an instance of WebGLCubeRenderTarget as third parameter.")}function Jn(t,e,n,i,a,o,s,c,l,u){t=void 0!==t?t:[],e=void 0!==e?e:r,s=void 0!==s?s:S,gt.call(this,t,e,n,i,a,o,s,c,l,u),this.flipY=!1,this._needsFlipEnvMap=!0}function Qn(t,e,n){Number.isInteger(e)&&(console.warn("THREE.WebGLCubeRenderTarget: constructor signature is now WebGLCubeRenderTarget( size, options )"),e=n),_t.call(this,t,t,e),e=e||{},this.texture=new Jn(void 0,e.mapping,e.wrapS,e.wrapT,e.magFilter,e.minFilter,e.format,e.type,e.anisotropy,e.encoding),this.texture._needsFlipEnvMap=!1}function Kn(t,e,n,r,i,a,o,s,c,l,u,h){gt.call(this,null,a,o,s,c,l,r,i,u,h),this.image={data:t||null,width:e||1,height:n||1},this.magFilter=void 0!==c?c:d,this.minFilter=void 0!==l?l:d,this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1,this.needsUpdate=!0}Zn.prototype=Object.create(we.prototype),Zn.prototype.constructor=Zn,Jn.prototype=Object.create(gt.prototype),Jn.prototype.constructor=Jn,Jn.prototype.isCubeTexture=!0,Object.defineProperty(Jn.prototype,"images",{get:function(){return this.image},set:function(t){this.image=t}}),Qn.prototype=Object.create(_t.prototype),Qn.prototype.constructor=Qn,Qn.prototype.isWebGLCubeRenderTarget=!0,Qn.prototype.fromEquirectangularTexture=function(t,e){this.texture.type=e.type,this.texture.format=T,this.texture.encoding=e.encoding,this.texture.generateMipmaps=e.generateMipmaps,this.texture.minFilter=e.minFilter,this.texture.magFilter=e.magFilter;var n={tEquirect:{value:null}},r="\n\n\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t#include \n\t\t\t\t#include \n\n\t\t\t}\n\t\t",i="\n\n\t\t\tuniform sampler2D tEquirect;\n\n\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t}\n\t\t",a=new Hn(5,5,5),o=new jn({name:"CubemapFromEquirect",uniforms:kn(n),vertexShader:r,fragmentShader:i,side:1,blending:0});o.uniforms.tEquirect.value=e;var s=new Fn(a,o),c=e.minFilter;return e.minFilter===g&&(e.minFilter=m),new Zn(1,10,this).update(t,s),e.minFilter=c,s.geometry.dispose(),s.material.dispose(),this},Qn.prototype.clear=function(t,e,n,r){for(var i=t.getRenderTarget(),a=0;a<6;a++)t.setRenderTarget(this,a),t.clear(e,n,r);t.setRenderTarget(i)},Kn.prototype=Object.create(gt.prototype),Kn.prototype.constructor=Kn,Kn.prototype.isDataTexture=!0;var $n=new kt,tr=new Mt,er=function(){function t(t,e,n,r,i,a){this.planes=[void 0!==t?t:new Ee,void 0!==e?e:new Ee,void 0!==n?n:new Ee,void 0!==r?r:new Ee,void 0!==i?i:new Ee,void 0!==a?a:new Ee]}var e=t.prototype;return e.set=function(t,e,n,r,i,a){var o=this.planes;return o[0].copy(t),o[1].copy(e),o[2].copy(n),o[3].copy(r),o[4].copy(i),o[5].copy(a),this},e.clone=function(){return(new this.constructor).copy(this)},e.copy=function(t){for(var e=this.planes,n=0;n<6;n++)e[n].copy(t.planes[n]);return this},e.setFromProjectionMatrix=function(t){var e=this.planes,n=t.elements,r=n[0],i=n[1],a=n[2],o=n[3],s=n[4],c=n[5],l=n[6],u=n[7],h=n[8],d=n[9],p=n[10],f=n[11],m=n[12],v=n[13],g=n[14],y=n[15];return e[0].setComponents(o-r,u-s,f-h,y-m).normalize(),e[1].setComponents(o+r,u+s,f+h,y+m).normalize(),e[2].setComponents(o+i,u+c,f+d,y+v).normalize(),e[3].setComponents(o-i,u-c,f-d,y-v).normalize(),e[4].setComponents(o-a,u-l,f-p,y-g).normalize(),e[5].setComponents(o+a,u+l,f+p,y+g).normalize(),this},e.intersectsObject=function(t){var e=t.geometry;return null===e.boundingSphere&&e.computeBoundingSphere(),$n.copy(e.boundingSphere).applyMatrix4(t.matrixWorld),this.intersectsSphere($n)},e.intersectsSprite=function(t){return $n.center.set(0,0,0),$n.radius=.7071067811865476,$n.applyMatrix4(t.matrixWorld),this.intersectsSphere($n)},e.intersectsSphere=function(t){for(var e=this.planes,n=t.center,r=-t.radius,i=0;i<6;i++){if(e[i].distanceToPoint(n)0?t.max.x:t.min.x,tr.y=r.normal.y>0?t.max.y:t.min.y,tr.z=r.normal.z>0?t.max.z:t.min.z,r.distanceToPoint(tr)<0)return!1}return!0},e.containsPoint=function(t){for(var e=this.planes,n=0;n<6;n++)if(e[n].distanceToPoint(t)<0)return!1;return!0},t}();function nr(){var t=null,e=!1,n=null,r=null;function i(e,a){n(e,a),r=t.requestAnimationFrame(i)}return{start:function(){!0!==e&&null!==n&&(r=t.requestAnimationFrame(i),e=!0)},stop:function(){t.cancelAnimationFrame(r),e=!1},setAnimationLoop:function(t){n=t},setContext:function(e){t=e}}}function rr(t,e){var n=e.isWebGL2,r=new WeakMap;return{get:function(t){return t.isInterleavedBufferAttribute&&(t=t.data),r.get(t)},remove:function(e){e.isInterleavedBufferAttribute&&(e=e.data);var n=r.get(e);n&&(t.deleteBuffer(n.buffer),r.delete(e))},update:function(e,i){if(e.isGLBufferAttribute){var a=r.get(e);(!a||a.version 0.0 ) {\n\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t}\n\treturn distanceFalloff;\n#else\n\tif( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\t}\n\treturn 1.0;\n#endif\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nvec3 F_Schlick_RoughnessDependent( const in vec3 F0, const in float dotNV, const in float roughness ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotNV - 6.98316 ) * dotNV );\n\tvec3 Fr = max( vec3( 1.0 - roughness ), F0 ) - F0;\n\treturn Fr * fresnel + F0;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + viewDir );\n\tfloat dotNL = saturate( dot( normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nvec3 BRDF_Specular_GGX_Environment( const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\treturn specularColor * brdf.x + brdf.y;\n}\nvoid BRDF_Specular_Multiscattering_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tvec3 F = F_Schlick_RoughnessDependent( specularColor, dotNV, roughness );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\tvec3 FssEss = F * brdf.x + brdf.y;\n\tfloat Ess = brdf.x + brdf.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = specularColor + ( 1.0 - specularColor ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie(float roughness, float NoH) {\n\tfloat invAlpha = 1.0 / roughness;\n\tfloat cos2h = NoH * NoH;\n\tfloat sin2h = max(1.0 - cos2h, 0.0078125);\treturn (2.0 + invAlpha) * pow(sin2h, invAlpha * 0.5) / (2.0 * PI);\n}\nfloat V_Neubelt(float NoV, float NoL) {\n\treturn saturate(1.0 / (4.0 * (NoL + NoV - NoL * NoV)));\n}\nvec3 BRDF_Specular_Sheen( const in float roughness, const in vec3 L, const in GeometricContext geometry, vec3 specularColor ) {\n\tvec3 N = geometry.normal;\n\tvec3 V = geometry.viewDir;\n\tvec3 H = normalize( V + L );\n\tfloat dotNH = saturate( dot( N, H ) );\n\treturn specularColor * D_Charlie( roughness, dotNH ) * V_Neubelt( dot(N, V), dot(N, L) );\n}\n#endif",bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tfDet *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif",clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#pragma unroll_loop_end\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\tif ( clipped ) discard;\n\t#endif\n#endif",clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif",color_fragment:"#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif",color_pars_vertex:"#if defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvarying vec3 vColor;\n#endif",color_vertex:"#if defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor.xyz *= color.xyz;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif",common:"#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat max3( vec3 v ) { return max( max( v.x, v.y ), v.z ); }\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}",cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_maxMipLevel 8.0\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_maxTileSize 256.0\n\t#define cubeUV_minTileSize 16.0\n\tfloat getFace( vec3 direction ) {\n\t\tvec3 absDirection = abs( direction );\n\t\tfloat face = - 1.0;\n\t\tif ( absDirection.x > absDirection.z ) {\n\t\t\tif ( absDirection.x > absDirection.y )\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t} else {\n\t\t\tif ( absDirection.z > absDirection.y )\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t}\n\t\treturn face;\n\t}\n\tvec2 getUV( vec3 direction, float face ) {\n\t\tvec2 uv;\n\t\tif ( face == 0.0 ) {\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 1.0 ) {\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n\t\t} else if ( face == 2.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\n\t\t} else if ( face == 3.0 ) {\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 4.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\n\t\t} else {\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\n\t\t}\n\t\treturn 0.5 * ( uv + 1.0 );\n\t}\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\t\tfloat face = getFace( direction );\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\t\tfloat faceSize = exp2( mipInt );\n\t\tfloat texelSize = 1.0 / ( 3.0 * cubeUV_maxTileSize );\n\t\tvec2 uv = getUV( direction, face ) * ( faceSize - 1.0 );\n\t\tvec2 f = fract( uv );\n\t\tuv += 0.5 - f;\n\t\tif ( face > 2.0 ) {\n\t\t\tuv.y += faceSize;\n\t\t\tface -= 3.0;\n\t\t}\n\t\tuv.x += face * faceSize;\n\t\tif ( mipInt < cubeUV_maxMipLevel ) {\n\t\t\tuv.y += 2.0 * cubeUV_maxTileSize;\n\t\t}\n\t\tuv.y += filterInt * 2.0 * cubeUV_minTileSize;\n\t\tuv.x += 3.0 * max( 0.0, cubeUV_maxTileSize - 2.0 * faceSize );\n\t\tuv *= texelSize;\n\t\tvec3 tl = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.x += texelSize;\n\t\tvec3 tr = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.y += texelSize;\n\t\tvec3 br = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.x -= texelSize;\n\t\tvec3 bl = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tvec3 tm = mix( tl, tr, f.x );\n\t\tvec3 bm = mix( bl, br, f.x );\n\t\treturn mix( tm, bm, f.y );\n\t}\n\t#define r0 1.0\n\t#define v0 0.339\n\t#define m0 - 2.0\n\t#define r1 0.8\n\t#define v1 0.276\n\t#define m1 - 1.0\n\t#define r4 0.4\n\t#define v4 0.046\n\t#define m4 2.0\n\t#define r5 0.305\n\t#define v5 0.016\n\t#define m5 3.0\n\t#define r6 0.21\n\t#define v6 0.0038\n\t#define m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= r1 ) {\n\t\t\tmip = ( r0 - roughness ) * ( m1 - m0 ) / ( r0 - r1 ) + m0;\n\t\t} else if ( roughness >= r4 ) {\n\t\t\tmip = ( r1 - roughness ) * ( m4 - m1 ) / ( r1 - r4 ) + m1;\n\t\t} else if ( roughness >= r5 ) {\n\t\t\tmip = ( r4 - roughness ) * ( m5 - m4 ) / ( r4 - r5 ) + m4;\n\t\t} else if ( roughness >= r6 ) {\n\t\t\tmip = ( r5 - roughness ) * ( m6 - m5 ) / ( r5 - r6 ) + m5;\n\t\t} else {\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness );\t\t}\n\t\treturn mip;\n\t}\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\t\tfloat mip = clamp( roughnessToMip( roughness ), m0, cubeUV_maxMipLevel );\n\t\tfloat mipF = fract( mip );\n\t\tfloat mipInt = floor( mip );\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\t\tif ( mipF == 0.0 ) {\n\t\t\treturn vec4( color0, 1.0 );\n\t\t} else {\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\t\t}\n\t}\n#endif",defaultnormal_vertex:"vec3 transformedNormal = objectNormal;\n#ifdef USE_INSTANCING\n\tmat3 m = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\n\ttransformedNormal = m * transformedNormal;\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\n#endif",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",encodings_fragment:"gl_FragColor = linearToOutputTexel( gl_FragColor );",encodings_pars_fragment:"\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( gammaFactor ) ), value.a );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( 1.0 / gammaFactor ) ), value.a );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * value.a * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = clamp( floor( D ) / 255.0, 0.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = cLogLuvM * value.rgb;\n\tXp_Y_XYZp = max( Xp_Y_XYZp, vec3( 1e-6, 1e-6, 1e-6 ) );\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract( Le );\n\tvResult.z = ( Le - ( floor( vResult.w * 255.0 ) ) / 255.0 ) / 255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2( ( Le - 127.0 ) / 2.0 );\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = cLogLuvInverseM * Xp_Y_XYZp.rgb;\n\treturn vec4( max( vRGB, 0.0 ), 1.0 );\n}",envmap_fragment:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 envColor = textureCubeUV( envMap, reflectVec, 0.0 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifndef ENVMAP_TYPE_CUBE_UV\n\t\tenvColor = envMapTexelToLinear( envColor );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif",envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform int maxMipLevel;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif",envmap_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif",envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) ||defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif",envmap_physical_pars_fragment:"#if defined( USE_ENVMAP )\n\t#ifdef ENVMAP_MODE_REFRACTION\n\t\tuniform float refractionRatio;\n\t#endif\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float roughness, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat sigma = PI * roughness * roughness / ( 1.0 + roughness );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar + log2( sigma );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -viewDir, normal );\n\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -viewDir, normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( roughness, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif",envmap_vertex:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif",fog_vertex:"#ifdef USE_FOG\n\tfogDepth = - mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float fogDepth;\n#endif",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * fogDepth * fogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif",gradientmap_pars_fragment:"#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn texture2D( gradientMap, coord ).rgb;\n\t#else\n\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t#endif\n}",lightmap_fragment:"#ifdef USE_LIGHTMAP\n\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\treflectedLight.indirectDiffuse += PI * lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n#endif",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_vertex:"vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\nvIndirectFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n\tvIndirectBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\nvIndirectFront += getAmbientLightIrradiance( ambientLightColor );\nvIndirectFront += getLightProbeIrradiance( lightProbe, geometry );\n#ifdef DOUBLE_SIDED\n\tvIndirectBack += getAmbientLightIrradiance( ambientLightColor );\n\tvIndirectBack += getLightProbeIrradiance( lightProbe, backGeometry );\n#endif\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif",lights_pars_begin:"uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\nuniform vec3 lightProbe[ 9 ];\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in GeometricContext geometry ) {\n\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif",lights_toon_fragment:"ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;",lights_toon_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon\n#define Material_LightProbeLOD( material )\t(0)",lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_phong_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)",lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.specularRoughness = max( roughnessFactor, 0.0525 );material.specularRoughness += geometryRoughness;\nmaterial.specularRoughness = min( material.specularRoughness, 1.0 );\n#ifdef REFLECTIVITY\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#endif\n#ifdef CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheen;\n#endif",lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat specularRoughness;\n\tvec3 specularColor;\n#ifdef CLEARCOAT\n\tfloat clearcoat;\n\tfloat clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tvec3 sheenColor;\n#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearcoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3(\t\t0, 1,\t\t0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifdef CLEARCOAT\n\t\tfloat ccDotNL = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = ccDotNL * directLight.color;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tccIrradiance *= PI;\n\t\t#endif\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t\treflectedLight.directSpecular += ccIrradiance * material.clearcoat * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_Sheen(\n\t\t\tmaterial.specularRoughness,\n\t\t\tdirectLight.direction,\n\t\t\tgeometry,\n\t\t\tmaterial.sheenColor\n\t\t);\n\t#else\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.normal, material.specularColor, material.specularRoughness);\n\t#endif\n\treflectedLight.directDiffuse += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef CLEARCOAT\n\t\tfloat ccDotNV = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular += clearcoatRadiance * material.clearcoat * BRDF_Specular_GGX_Environment( geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t\tfloat ccDotNL = ccDotNV;\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\tfloat clearcoatInv = 1.0 - clearcoatDHR;\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\tBRDF_Specular_Multiscattering_Environment( geometry, material.specularColor, material.specularRoughness, singleScattering, multiScattering );\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );\n\treflectedLight.indirectSpecular += clearcoatInv * radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}",lights_fragment_begin:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n#ifdef CLEARCOAT\n\tgeometry.clearcoatNormal = clearcoatNormal;\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\tirradiance += getLightProbeIrradiance( lightProbe, geometry );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif",lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\tvec3 lightMapIrradiance = lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.normal, material.specularRoughness, maxMipLevel );\n\t#ifdef CLEARCOAT\n\t\tclearcoatRadiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness, maxMipLevel );\n\t#endif\n#endif",lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\n#endif",logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t#endif\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n\t#else\n\t\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\t\tgl_Position.z *= gl_Position.w;\n\t\t}\n\t#endif\n#endif",map_fragment:"#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif",map_particle_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n#endif\n#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif",map_particle_pars_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tuniform mat3 uvTransform;\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\tuniform float morphTargetBaseInfluence;\n\t#ifndef USE_MORPHNORMALS\n\t\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\t\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\t\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\n\t\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\n\t\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\n\t\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\t#endif\n#endif",normal_fragment_begin:"#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n\t#ifdef USE_TANGENT\n\t\tvec3 tangent = normalize( vTangent );\n\t\tvec3 bitangent = normalize( vBitangent );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\ttangent = tangent * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t\tbitangent = bitangent * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t#endif\n\t\t#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tmat3 vTBN = mat3( tangent, bitangent, normal );\n\t\t#endif\n\t#endif\n#endif\nvec3 geometryNormal = normal;",normal_fragment_maps:"#ifdef OBJECTSPACE_NORMALMAP\n\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( TANGENTSPACE_NORMALMAP )\n\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\t#ifdef USE_TANGENT\n\t\tnormal = normalize( vTBN * mapN );\n\t#else\n\t\tnormal = perturbNormal2Arb( -vViewPosition, normal, mapN );\n\t#endif\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif",normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tfloat scale = sign( st1.t * st0.s - st0.t * st1.s );\n\t\tvec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale );\n\t\tvec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale );\n\t\tvec3 N = normalize( surf_norm );\n\t\tmat3 tsn = mat3( S, T, N );\n\t\tmapN.xy *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif",clearcoat_normal_fragment_begin:"#ifdef CLEARCOAT\n\tvec3 clearcoatNormal = geometryNormal;\n#endif",clearcoat_normal_fragment_maps:"#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\t#ifdef USE_TANGENT\n\t\tclearcoatNormal = normalize( vTBN * clearcoatMapN );\n\t#else\n\t\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN );\n\t#endif\n#endif",clearcoat_pars_fragment:"#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif",packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nvec4 pack2HalfToRGBA( vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ));\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w);\n}\nvec2 unpackRGBATo2Half( vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}",premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif",project_vertex:"vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;",dithering_fragment:"#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif",dithering_pars_fragment:"#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif",roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t\tf.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ), \n\t\t\t\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t\tf.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif",shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif",shadowmap_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0 || NUM_SPOT_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0\n\t\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\tvec4 shadowWorldPosition;\n\t#endif\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n#endif",shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}",skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform highp sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif",skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif",specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif",tonemapping_pars_fragment:"#ifndef saturate\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ),\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3(\t1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108,\t1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605,\t1.07602 )\n\t);\n\tcolor *= toneMappingExposure / 0.6;\n\tcolor = ACESInputMat * color;\n\tcolor = RRTAndODTFit( color );\n\tcolor = ACESOutputMat * color;\n\treturn saturate( color );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }",transmissionmap_fragment:"#ifdef USE_TRANSMISSIONMAP\n\ttotalTransmission *= texture2D( transmissionMap, vUv ).r;\n#endif",transmissionmap_pars_fragment:"#ifdef USE_TRANSMISSIONMAP\n\tuniform sampler2D transmissionMap;\n#endif",uv_pars_fragment:"#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#ifdef USE_UV\n\t#ifdef UVS_VERTEX_ONLY\n\t\tvec2 vUv;\n\t#else\n\t\tvarying vec2 vUv;\n\t#endif\n\tuniform mat3 uvTransform;\n#endif",uv_vertex:"#ifdef USE_UV\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif",uv2_pars_fragment:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",uv2_pars_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n\tuniform mat3 uv2Transform;\n#endif",uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif",background_frag:"uniform sampler2D t2D;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include \n\t#include \n}",background_vert:"varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}",cube_frag:"#include \nuniform float opacity;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 vReflect = vWorldDirection;\n\t#include \n\tgl_FragColor = envColor;\n\tgl_FragColor.a *= opacity;\n\t#include \n\t#include \n}",cube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#endif\n}",depth_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvHighPrecisionZW = gl_Position.zw;\n}",distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}",distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}",equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tvec4 texColor = texture2D( tEquirect, sampleUV );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include \n\t#include \n}",equirect_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}",linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}",linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\treflectedLight.indirectDiffuse += lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_ENVMAP\n\t#include \n\t#include \n\t#include \n\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_frag:"uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;\n\t#else\n\t\treflectedLight.indirectDiffuse += vIndirectFront;\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_vert:"#define LAMBERT\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshmatcap_frag:"#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t\tmatcapColor = matcapTexelToLinear( matcapColor );\n\t#else\n\t\tvec4 matcapColor = vec4( 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshmatcap_vert:"#define MATCAP\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifndef FLAT_SHADED\n\t\tvNormal = normalize( transformedNormal );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n}",meshtoon_frag:"#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshtoon_vert:"#define TOON\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}",meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n\t#define REFLECTIVITY\n\t#define CLEARCOAT\n\t#define TRANSMISSION\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef TRANSMISSION\n\tuniform float transmission;\n#endif\n#ifdef REFLECTIVITY\n\tuniform float reflectivity;\n#endif\n#ifdef CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheen;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#ifdef TRANSMISSION\n\t\tfloat totalTransmission = transmission;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#ifdef TRANSMISSION\n\t\tdiffuseColor.a *= mix( saturate( 1. - totalTransmission + linearToRelativeLuminance( reflectedLight.directSpecular + reflectedLight.indirectSpecular ) ), 1.0, metalness );\n\t#endif\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphysical_vert:"#define STANDARD\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}",normal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}",normal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}",points_vert:"uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n\t#include \n\t#include \n}",shadow_vert:"#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n}",sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}"},or={common:{diffuse:{value:new We(15658734)},opacity:{value:1},map:{value:null},uvTransform:{value:new ft},uv2Transform:{value:new ft},alphaMap:{value:null}},specularmap:{specularMap:{value:null}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},refractionRatio:{value:.98},maxMipLevel:{value:0}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1}},emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalScale:{value:new pt(1,1)}},displacementmap:{displacementMap:{value:null},displacementScale:{value:1},displacementBias:{value:0}},roughnessmap:{roughnessMap:{value:null}},metalnessmap:{metalnessMap:{value:null}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new We(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotShadowMap:{value:[]},spotShadowMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new We(15658734)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},uvTransform:{value:new ft}},sprite:{diffuse:{value:new We(15658734)},opacity:{value:1},center:{value:new pt(.5,.5)},rotation:{value:0},map:{value:null},alphaMap:{value:null},uvTransform:{value:new ft}}},sr={basic:{uniforms:Vn([or.common,or.specularmap,or.envmap,or.aomap,or.lightmap,or.fog]),vertexShader:ar.meshbasic_vert,fragmentShader:ar.meshbasic_frag},lambert:{uniforms:Vn([or.common,or.specularmap,or.envmap,or.aomap,or.lightmap,or.emissivemap,or.fog,or.lights,{emissive:{value:new We(0)}}]),vertexShader:ar.meshlambert_vert,fragmentShader:ar.meshlambert_frag},phong:{uniforms:Vn([or.common,or.specularmap,or.envmap,or.aomap,or.lightmap,or.emissivemap,or.bumpmap,or.normalmap,or.displacementmap,or.fog,or.lights,{emissive:{value:new We(0)},specular:{value:new We(1118481)},shininess:{value:30}}]),vertexShader:ar.meshphong_vert,fragmentShader:ar.meshphong_frag},standard:{uniforms:Vn([or.common,or.envmap,or.aomap,or.lightmap,or.emissivemap,or.bumpmap,or.normalmap,or.displacementmap,or.roughnessmap,or.metalnessmap,or.fog,or.lights,{emissive:{value:new We(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:ar.meshphysical_vert,fragmentShader:ar.meshphysical_frag},toon:{uniforms:Vn([or.common,or.aomap,or.lightmap,or.emissivemap,or.bumpmap,or.normalmap,or.displacementmap,or.gradientmap,or.fog,or.lights,{emissive:{value:new We(0)}}]),vertexShader:ar.meshtoon_vert,fragmentShader:ar.meshtoon_frag},matcap:{uniforms:Vn([or.common,or.bumpmap,or.normalmap,or.displacementmap,or.fog,{matcap:{value:null}}]),vertexShader:ar.meshmatcap_vert,fragmentShader:ar.meshmatcap_frag},points:{uniforms:Vn([or.points,or.fog]),vertexShader:ar.points_vert,fragmentShader:ar.points_frag},dashed:{uniforms:Vn([or.common,or.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:ar.linedashed_vert,fragmentShader:ar.linedashed_frag},depth:{uniforms:Vn([or.common,or.displacementmap]),vertexShader:ar.depth_vert,fragmentShader:ar.depth_frag},normal:{uniforms:Vn([or.common,or.bumpmap,or.normalmap,or.displacementmap,{opacity:{value:1}}]),vertexShader:ar.normal_vert,fragmentShader:ar.normal_frag},sprite:{uniforms:Vn([or.sprite,or.fog]),vertexShader:ar.sprite_vert,fragmentShader:ar.sprite_frag},background:{uniforms:{uvTransform:{value:new ft},t2D:{value:null}},vertexShader:ar.background_vert,fragmentShader:ar.background_frag},cube:{uniforms:Vn([or.envmap,{opacity:{value:1}}]),vertexShader:ar.cube_vert,fragmentShader:ar.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:ar.equirect_vert,fragmentShader:ar.equirect_frag},distanceRGBA:{uniforms:Vn([or.common,or.displacementmap,{referencePosition:{value:new Mt},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:ar.distanceRGBA_vert,fragmentShader:ar.distanceRGBA_frag},shadow:{uniforms:Vn([or.lights,or.fog,{color:{value:new We(0)},opacity:{value:1}}]),vertexShader:ar.shadow_vert,fragmentShader:ar.shadow_frag}};function cr(t,e,n,r,i){var a,o,c=new We(0),l=0,u=null,h=0,d=null;function p(t,e){n.buffers.color.setClear(t.r,t.g,t.b,e,i)}return{getClearColor:function(){return c},setClearColor:function(t,e){void 0===e&&(e=1),c.set(t),p(c,l=e)},getClearAlpha:function(){return l},setClearAlpha:function(t){p(c,l=t)},render:function(n,i,f,m){var v=!0===i.isScene?i.background:null;v&&v.isTexture&&(v=e.get(v));var g=t.xr,y=g.getSession&&g.getSession();y&&"additive"===y.environmentBlendMode&&(v=null),null===v?p(c,l):v&&v.isColor&&(p(v,1),m=!0),(t.autoClear||m)&&t.clear(t.autoClearColor,t.autoClearDepth,t.autoClearStencil),v&&(v.isCubeTexture||v.isWebGLCubeRenderTarget||v.mapping===s)?(void 0===o&&((o=new Fn(new Hn(1,1,1),new jn({name:"BackgroundCubeMaterial",uniforms:kn(sr.cube.uniforms),vertexShader:sr.cube.vertexShader,fragmentShader:sr.cube.fragmentShader,side:1,depthTest:!1,depthWrite:!1,fog:!1}))).geometry.deleteAttribute("normal"),o.geometry.deleteAttribute("uv"),o.onBeforeRender=function(t,e,n){this.matrixWorld.copyPosition(n.matrixWorld)},Object.defineProperty(o.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),r.update(o)),v.isWebGLCubeRenderTarget&&(v=v.texture),o.material.uniforms.envMap.value=v,o.material.uniforms.flipEnvMap.value=v.isCubeTexture&&v._needsFlipEnvMap?-1:1,u===v&&h===v.version&&d===t.toneMapping||(o.material.needsUpdate=!0,u=v,h=v.version,d=t.toneMapping),n.unshift(o,o.geometry,o.material,0,0,null)):v&&v.isTexture&&(void 0===a&&((a=new Fn(new ir(2,2),new jn({name:"BackgroundMaterial",uniforms:kn(sr.background.uniforms),vertexShader:sr.background.vertexShader,fragmentShader:sr.background.fragmentShader,side:0,depthTest:!1,depthWrite:!1,fog:!1}))).geometry.deleteAttribute("normal"),Object.defineProperty(a.material,"map",{get:function(){return this.uniforms.t2D.value}}),r.update(a)),a.material.uniforms.t2D.value=v,!0===v.matrixAutoUpdate&&v.updateMatrix(),a.material.uniforms.uvTransform.value.copy(v.matrix),u===v&&h===v.version&&d===t.toneMapping||(a.material.needsUpdate=!0,u=v,h=v.version,d=t.toneMapping),n.unshift(a,a.geometry,a.material,0,0,null))}}}function lr(t,e,n,r){var i=t.getParameter(34921),a=r.isWebGL2?null:e.get("OES_vertex_array_object"),o=r.isWebGL2||null!==a,s={},c=d(null),l=c;function u(e){return r.isWebGL2?t.bindVertexArray(e):a.bindVertexArrayOES(e)}function h(e){return r.isWebGL2?t.deleteVertexArray(e):a.deleteVertexArrayOES(e)}function d(t){for(var e=[],n=[],r=[],a=0;a=0){var y=c[h];if(void 0!==y){var x=y.normalized,_=y.itemSize,b=n.get(y);if(void 0===b)continue;var w=b.buffer,M=b.type,S=b.bytesPerElement;if(y.isInterleavedBufferAttribute){var T=y.data,E=T.stride,A=y.offset;T&&T.isInstancedInterleavedBuffer?(m(d,T.meshPerAttribute),void 0===s._maxInstanceCount&&(s._maxInstanceCount=T.meshPerAttribute*T.count)):f(d),t.bindBuffer(34962,w),g(d,_,M,x,E*S,A*S)}else y.isInstancedBufferAttribute?(m(d,y.meshPerAttribute),void 0===s._maxInstanceCount&&(s._maxInstanceCount=y.meshPerAttribute*y.count)):f(d),t.bindBuffer(34962,w),g(d,_,M,x,0,0)}else if("instanceMatrix"===h){var L=n.get(i.instanceMatrix);if(void 0===L)continue;var R=L.buffer,C=L.type;m(d+0,1),m(d+1,1),m(d+2,1),m(d+3,1),t.bindBuffer(34962,R),t.vertexAttribPointer(d+0,4,C,!1,64,0),t.vertexAttribPointer(d+1,4,C,!1,64,16),t.vertexAttribPointer(d+2,4,C,!1,64,32),t.vertexAttribPointer(d+3,4,C,!1,64,48)}else if("instanceColor"===h){var P=n.get(i.instanceColor);if(void 0===P)continue;var I=P.buffer,N=P.type;m(d,1),t.bindBuffer(34962,I),t.vertexAttribPointer(d,3,N,!1,12,0)}else if(void 0!==u){var D=u[h];if(void 0!==D)switch(D.length){case 2:t.vertexAttrib2fv(d,D);break;case 3:t.vertexAttrib3fv(d,D);break;case 4:t.vertexAttrib4fv(d,D);break;default:t.vertexAttrib1fv(d,D)}}}}v()}(i,c,h,y),null!==x&&t.bindBuffer(34963,n.get(x).buffer))},reset:y,resetDefaultState:x,dispose:function(){for(var t in y(),s){var e=s[t];for(var n in e){var r=e[n];for(var i in r)h(r[i].object),delete r[i];delete e[n]}delete s[t]}},releaseStatesOfGeometry:function(t){if(void 0!==s[t.id]){var e=s[t.id];for(var n in e){var r=e[n];for(var i in r)h(r[i].object),delete r[i];delete e[n]}delete s[t.id]}},releaseStatesOfProgram:function(t){for(var e in s){var n=s[e];if(void 0!==n[t.id]){var r=n[t.id];for(var i in r)h(r[i].object),delete r[i];delete n[t.id]}}},initAttributes:p,enableAttribute:f,disableUnusedAttributes:v}}function ur(t,e,n,r){var i,a=r.isWebGL2;this.setMode=function(t){i=t},this.render=function(e,r){t.drawArrays(i,e,r),n.update(r,i,1)},this.renderInstances=function(r,o,s){if(0!==s){var c,l;if(a)c=t,l="drawArraysInstanced";else if(l="drawArraysInstancedANGLE",null===(c=e.get("ANGLE_instanced_arrays")))return void console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");c[l](i,r,o,s),n.update(o,i,s)}}}function hr(t,e,n){var r;function i(e){if("highp"===e){if(t.getShaderPrecisionFormat(35633,36338).precision>0&&t.getShaderPrecisionFormat(35632,36338).precision>0)return"highp";e="mediump"}return"mediump"===e&&t.getShaderPrecisionFormat(35633,36337).precision>0&&t.getShaderPrecisionFormat(35632,36337).precision>0?"mediump":"lowp"}var a="undefined"!=typeof WebGL2RenderingContext&&t instanceof WebGL2RenderingContext||"undefined"!=typeof WebGL2ComputeRenderingContext&&t instanceof WebGL2ComputeRenderingContext,o=void 0!==n.precision?n.precision:"highp",s=i(o);s!==o&&(console.warn("THREE.WebGLRenderer:",o,"not supported, using",s,"instead."),o=s);var c=!0===n.logarithmicDepthBuffer,l=t.getParameter(34930),u=t.getParameter(35660),h=t.getParameter(3379),d=t.getParameter(34076),p=t.getParameter(34921),f=t.getParameter(36347),m=t.getParameter(36348),v=t.getParameter(36349),g=u>0,y=a||!!e.get("OES_texture_float");return{isWebGL2:a,getMaxAnisotropy:function(){if(void 0!==r)return r;var n=e.get("EXT_texture_filter_anisotropic");return r=null!==n?t.getParameter(n.MAX_TEXTURE_MAX_ANISOTROPY_EXT):0},getMaxPrecision:i,precision:o,logarithmicDepthBuffer:c,maxTextures:l,maxVertexTextures:u,maxTextureSize:h,maxCubemapSize:d,maxAttributes:p,maxVertexUniforms:f,maxVaryings:m,maxFragmentUniforms:v,vertexTextures:g,floatFragmentTextures:y,floatVertexTextures:g&&y,maxSamples:a?t.getParameter(36183):0}}function dr(t){var e=this,n=null,r=0,i=!1,a=!1,o=new Ee,s=new ft,c={value:null,needsUpdate:!1};function l(){c.value!==n&&(c.value=n,c.needsUpdate=r>0),e.numPlanes=r,e.numIntersection=0}function u(t,n,r,i){var a=null!==t?t.length:0,l=null;if(0!==a){if(l=c.value,!0!==i||null===l){var u=r+4*a,h=n.matrixWorldInverse;s.getNormalMatrix(h),(null===l||l.length0){var l=t.getRenderList(),u=t.getRenderTarget(),h=new Qn(c.height/2);return h.fromEquirectangularTexture(t,r),e.set(r,h),t.setRenderTarget(u),t.setRenderList(l),r.addEventListener("dispose",s),n(h.texture,r.mapping)}return null}}return r},dispose:function(){e=new WeakMap}}}function fr(t){var e={};return{has:function(n){if(void 0!==e[n])return null!==e[n];var r;switch(n){case"WEBGL_depth_texture":r=t.getExtension("WEBGL_depth_texture")||t.getExtension("MOZ_WEBGL_depth_texture")||t.getExtension("WEBKIT_WEBGL_depth_texture");break;case"EXT_texture_filter_anisotropic":r=t.getExtension("EXT_texture_filter_anisotropic")||t.getExtension("MOZ_EXT_texture_filter_anisotropic")||t.getExtension("WEBKIT_EXT_texture_filter_anisotropic");break;case"WEBGL_compressed_texture_s3tc":r=t.getExtension("WEBGL_compressed_texture_s3tc")||t.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||t.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");break;case"WEBGL_compressed_texture_pvrtc":r=t.getExtension("WEBGL_compressed_texture_pvrtc")||t.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");break;default:r=t.getExtension(n)}return e[n]=r,null!==r},get:function(t){return this.has(t)||console.warn("THREE.WebGLRenderer: "+t+" extension not supported."),e[t]}}}function mr(t,e,n,r){var i=new WeakMap,a=new WeakMap;function o(t){var s=t.target,c=i.get(s);for(var l in null!==c.index&&e.remove(c.index),c.attributes)e.remove(c.attributes[l]);s.removeEventListener("dispose",o),i.delete(s);var u=a.get(c);u&&(e.remove(u),a.delete(c)),r.releaseStatesOfGeometry(c),!0===s.isInstancedBufferGeometry&&delete s._maxInstanceCount,n.memory.geometries--}function s(t){var n=[],r=t.index,i=t.attributes.position,o=0;if(null!==r){var s=r.array;o=r.version;for(var c=0,l=s.length;c65535?an:nn)(n,1);x.version=o;var _=a.get(t);_&&e.remove(_),a.set(t,x)}return{get:function(t,e){var r=i.get(e);return r||(e.addEventListener("dispose",o),e.isBufferGeometry?r=e:e.isGeometry&&(void 0===e._bufferGeometry&&(e._bufferGeometry=(new _n).setFromObject(t)),r=e._bufferGeometry),i.set(e,r),n.memory.geometries++,r)},update:function(t){var n=t.attributes;for(var r in n)e.update(n[r],34962);var i=t.morphAttributes;for(var a in i)for(var o=i[a],s=0,c=o.length;s0)return t;var i=e*n,a=Lr[i];if(void 0===a&&(a=new Float32Array(i),Lr[i]=a),0!==e){r.toArray(a,0);for(var o=1,s=0;o!==e;++o)s+=n,t[o].toArray(a,s)}return a}function Dr(t,e){if(t.length!==e.length)return!1;for(var n=0,r=t.length;n/gm;function Ri(t){return t.replace(Li,Ci)}function Ci(t,e){var n=ar[e];if(void 0===n)throw new Error("Can not resolve #include <"+e+">");return Ri(n)}var Pi=/#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g,Ii=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function Ni(t){return t.replace(Ii,Oi).replace(Pi,Di)}function Di(t,e,n,r){return console.warn("WebGLProgram: #pragma unroll_loop shader syntax is deprecated. Please use #pragma unroll_loop_start syntax instead."),Oi(t,e,n,r)}function Oi(t,e,n,r){for(var i="",a=parseInt(e);a0?t.gammaFactor:1,w=n.isWebGL2?"":function(t){return[t.extensionDerivatives||t.envMapCubeUV||t.bumpMap||t.tangentSpaceNormalMap||t.clearcoatNormalMap||t.flatShading||"physical"===t.shaderID?"#extension GL_OES_standard_derivatives : enable":"",(t.extensionFragDepth||t.logarithmicDepthBuffer)&&t.rendererExtensionFragDepth?"#extension GL_EXT_frag_depth : enable":"",t.extensionDrawBuffers&&t.rendererExtensionDrawBuffers?"#extension GL_EXT_draw_buffers : require":"",(t.extensionShaderTextureLOD||t.envMap)&&t.rendererExtensionShaderTextureLod?"#extension GL_EXT_shader_texture_lod : enable":""].filter(Ti).join("\n")}(n),M=function(t){var e=[];for(var n in t){var r=t[n];!1!==r&&e.push("#define "+n+" "+r)}return e.join("\n")}(f),S=p.createProgram(),T=n.glslVersion?"#version "+n.glslVersion+"\n":"";n.isRawShaderMaterial?((o=[M].filter(Ti).join("\n")).length>0&&(o+="\n"),(l=[w,M].filter(Ti).join("\n")).length>0&&(l+="\n")):(o=[Bi(n),"#define SHADER_NAME "+n.shaderName,M,n.instancing?"#define USE_INSTANCING":"",n.instancingColor?"#define USE_INSTANCING_COLOR":"",n.supportsVertexTextures?"#define VERTEX_TEXTURES":"","#define GAMMA_FACTOR "+b,"#define MAX_BONES "+n.maxBones,n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.map?"#define USE_MAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+x:"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMap&&n.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",n.normalMap&&n.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.displacementMap&&n.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.vertexTangents?"#define USE_TANGENT":"",n.vertexColors?"#define USE_COLOR":"",n.vertexUvs?"#define USE_UV":"",n.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",n.flatShading?"#define FLAT_SHADED":"",n.skinning?"#define USE_SKINNING":"",n.useVertexTexture?"#define BONE_TEXTURE":"",n.morphTargets?"#define USE_MORPHTARGETS":"",n.morphNormals&&!1===n.flatShading?"#define USE_MORPHNORMALS":"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+g:"",n.sizeAttenuation?"#define USE_SIZEATTENUATION":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.logarithmicDepthBuffer&&n.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING","\tattribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR","\tattribute vec3 instanceColor;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_TANGENT","\tattribute vec4 tangent;","#endif","#ifdef USE_COLOR","\tattribute vec3 color;","#endif","#ifdef USE_MORPHTARGETS","\tattribute vec3 morphTarget0;","\tattribute vec3 morphTarget1;","\tattribute vec3 morphTarget2;","\tattribute vec3 morphTarget3;","\t#ifdef USE_MORPHNORMALS","\t\tattribute vec3 morphNormal0;","\t\tattribute vec3 morphNormal1;","\t\tattribute vec3 morphNormal2;","\t\tattribute vec3 morphNormal3;","\t#else","\t\tattribute vec3 morphTarget4;","\t\tattribute vec3 morphTarget5;","\t\tattribute vec3 morphTarget6;","\t\tattribute vec3 morphTarget7;","\t#endif","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(Ti).join("\n"),l=[w,Bi(n),"#define SHADER_NAME "+n.shaderName,M,n.alphaTest?"#define ALPHATEST "+n.alphaTest+(n.alphaTest%1?"":".0"):"","#define GAMMA_FACTOR "+b,n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.map?"#define USE_MAP":"",n.matcap?"#define USE_MATCAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+y:"",n.envMap?"#define "+x:"",n.envMap?"#define "+_:"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMap&&n.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",n.normalMap&&n.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.sheen?"#define USE_SHEEN":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.vertexTangents?"#define USE_TANGENT":"",n.vertexColors||n.instancingColor?"#define USE_COLOR":"",n.vertexUvs?"#define USE_UV":"",n.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",n.gradientMap?"#define USE_GRADIENTMAP":"",n.flatShading?"#define FLAT_SHADED":"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+g:"",n.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",n.physicallyCorrectLights?"#define PHYSICALLY_CORRECT_LIGHTS":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.logarithmicDepthBuffer&&n.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"",(n.extensionShaderTextureLOD||n.envMap)&&n.rendererExtensionShaderTextureLod?"#define TEXTURE_LOD_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",0!==n.toneMapping?"#define TONE_MAPPING":"",0!==n.toneMapping?ar.tonemapping_pars_fragment:"",0!==n.toneMapping?Si("toneMapping",n.toneMapping):"",n.dithering?"#define DITHERING":"",ar.encodings_pars_fragment,n.map?Mi("mapTexelToLinear",n.mapEncoding):"",n.matcap?Mi("matcapTexelToLinear",n.matcapEncoding):"",n.envMap?Mi("envMapTexelToLinear",n.envMapEncoding):"",n.emissiveMap?Mi("emissiveMapTexelToLinear",n.emissiveMapEncoding):"",n.lightMap?Mi("lightMapTexelToLinear",n.lightMapEncoding):"",(u="linearToOutputTexel",h=n.outputEncoding,d=bi(h),"vec4 "+u+"( vec4 value ) { return LinearTo"+d[0]+d[1]+"; }"),n.depthPacking?"#define DEPTH_PACKING "+n.depthPacking:"","\n"].filter(Ti).join("\n")),m=Ai(m=Ei(m=Ri(m),n),n),v=Ai(v=Ei(v=Ri(v),n),n),m=Ni(m),v=Ni(v),n.isWebGL2&&!0!==n.isRawShaderMaterial&&(T="#version 300 es\n",o=["#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+o,l=["#define varying in",n.glslVersion===nt?"":"out highp vec4 pc_fragColor;",n.glslVersion===nt?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join("\n")+"\n"+l);var E,A,L=T+l+v,R=xi(p,35633,T+o+m),C=xi(p,35632,L);if(p.attachShader(S,R),p.attachShader(S,C),void 0!==n.index0AttributeName?p.bindAttribLocation(S,0,n.index0AttributeName):!0===n.morphTargets&&p.bindAttribLocation(S,0,"position"),p.linkProgram(S),t.debug.checkShaderErrors){var P=p.getProgramInfoLog(S).trim(),I=p.getShaderInfoLog(R).trim(),N=p.getShaderInfoLog(C).trim(),D=!0,O=!0;if(!1===p.getProgramParameter(S,35714)){D=!1;var B=wi(p,R,"vertex"),z=wi(p,C,"fragment");console.error("THREE.WebGLProgram: shader error: ",p.getError(),"35715",p.getProgramParameter(S,35715),"gl.getProgramInfoLog",P,B,z)}else""!==P?console.warn("THREE.WebGLProgram: gl.getProgramInfoLog()",P):""!==I&&""!==N||(O=!1);O&&(this.diagnostics={runnable:D,programLog:P,vertexShader:{log:I,prefix:o},fragmentShader:{log:N,prefix:l}})}return p.deleteShader(R),p.deleteShader(C),this.getUniforms=function(){return void 0===E&&(E=new yi(p,S)),E},this.getAttributes=function(){return void 0===A&&(A=function(t,e){for(var n={},r=t.getProgramParameter(e,35721),i=0;i0,maxBones:E,useVertexTexture:h,morphTargets:i.morphTargets,morphNormals:i.morphNormals,maxMorphTargets:t.maxMorphTargets,maxMorphNormals:t.maxMorphNormals,numDirLights:o.directional.length,numPointLights:o.point.length,numSpotLights:o.spot.length,numRectAreaLights:o.rectArea.length,numHemiLights:o.hemi.length,numDirLightShadows:o.directionalShadowMap.length,numPointLightShadows:o.pointShadowMap.length,numSpotLightShadows:o.spotShadowMap.length,numClippingPlanes:a.numPlanes,numClipIntersection:a.numIntersection,dithering:i.dithering,shadowMapEnabled:t.shadowMap.enabled&&v.length>0,shadowMapType:t.shadowMap.type,toneMapping:i.toneMapped?t.toneMapping:0,physicallyCorrectLights:t.physicallyCorrectLights,premultipliedAlpha:i.premultipliedAlpha,alphaTest:i.alphaTest,doubleSided:2===i.side,flipSided:1===i.side,depthPacking:void 0!==i.depthPacking&&i.depthPacking,index0AttributeName:i.index0AttributeName,extensionDerivatives:i.extensions&&i.extensions.derivatives,extensionFragDepth:i.extensions&&i.extensions.fragDepth,extensionDrawBuffers:i.extensions&&i.extensions.drawBuffers,extensionShaderTextureLOD:i.extensions&&i.extensions.shaderTextureLOD,rendererExtensionFragDepth:l||n.has("EXT_frag_depth"),rendererExtensionDrawBuffers:l||n.has("WEBGL_draw_buffers"),rendererExtensionShaderTextureLod:l||n.has("EXT_shader_texture_lod"),customProgramCacheKey:i.customProgramCacheKey()}},getProgramCacheKey:function(e){var n=[];if(e.shaderID?n.push(e.shaderID):(n.push(e.fragmentShader),n.push(e.vertexShader)),void 0!==e.defines)for(var r in e.defines)n.push(r),n.push(e.defines[r]);if(!1===e.isRawShaderMaterial){for(var i=0;i1&&r.sort(t||Ui),i.length>1&&i.sort(e||Hi)}}}function Vi(t){var e=new WeakMap;return{get:function(n,r){var i,a=e.get(n);return void 0===a?(i=new ki(t),e.set(n,new WeakMap),e.get(n).set(r,i)):void 0===(i=a.get(r))&&(i=new ki(t),a.set(r,i)),i},dispose:function(){e=new WeakMap}}}function Wi(){var t={};return{get:function(e){if(void 0!==t[e.id])return t[e.id];var n;switch(e.type){case"DirectionalLight":n={direction:new Mt,color:new We};break;case"SpotLight":n={position:new Mt,direction:new Mt,color:new We,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":n={position:new Mt,color:new We,distance:0,decay:0};break;case"HemisphereLight":n={direction:new Mt,skyColor:new We,groundColor:new We};break;case"RectAreaLight":n={color:new We,position:new Mt,halfWidth:new Mt,halfHeight:new Mt}}return t[e.id]=n,n}}}var ji=0;function qi(t,e){return(e.castShadow?1:0)-(t.castShadow?1:0)}function Xi(t,e){for(var n,r=new Wi,i=(n={},{get:function(t){if(void 0!==n[t.id])return n[t.id];var e;switch(t.type){case"DirectionalLight":case"SpotLight":e={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new pt};break;case"PointLight":e={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new pt,shadowCameraNear:1,shadowCameraFar:1e3}}return n[t.id]=e,e}}),a={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotShadow:[],spotShadowMap:[],spotShadowMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[]},o=0;o<9;o++)a.probe.push(new Mt);var s=new Mt,c=new Qt,l=new Qt;return{setup:function(n){for(var o=0,s=0,c=0,l=0;l<9;l++)a.probe[l].set(0,0,0);var u=0,h=0,d=0,p=0,f=0,m=0,v=0,g=0;n.sort(qi);for(var y=0,x=n.length;y0&&(e.isWebGL2||!0===t.has("OES_texture_float_linear")?(a.rectAreaLTC1=or.LTC_FLOAT_1,a.rectAreaLTC2=or.LTC_FLOAT_2):!0===t.has("OES_texture_half_float_linear")?(a.rectAreaLTC1=or.LTC_HALF_1,a.rectAreaLTC2=or.LTC_HALF_2):console.error("THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.")),a.ambient[0]=o,a.ambient[1]=s,a.ambient[2]=c;var z=a.hash;z.directionalLength===u&&z.pointLength===h&&z.spotLength===d&&z.rectAreaLength===p&&z.hemiLength===f&&z.numDirectionalShadows===m&&z.numPointShadows===v&&z.numSpotShadows===g||(a.directional.length=u,a.spot.length=d,a.rectArea.length=p,a.point.length=h,a.hemi.length=f,a.directionalShadow.length=m,a.directionalShadowMap.length=m,a.pointShadow.length=v,a.pointShadowMap.length=v,a.spotShadow.length=g,a.spotShadowMap.length=g,a.directionalShadowMatrix.length=m,a.pointShadowMatrix.length=v,a.spotShadowMatrix.length=g,z.directionalLength=u,z.pointLength=h,z.spotLength=d,z.rectAreaLength=p,z.hemiLength=f,z.numDirectionalShadows=m,z.numPointShadows=v,z.numSpotShadows=g,a.version=ji++)},setupView:function(t,e){for(var n=0,r=0,i=0,o=0,u=0,h=e.matrixWorldInverse,d=0,p=t.length;d=n.get(r).length?(a=new Yi(t,e),n.get(r).push(a)):a=n.get(r)[i],a},dispose:function(){n=new WeakMap}}}function Ji(t){Xe.call(this),this.type="MeshDepthMaterial",this.depthPacking=3200,this.skinning=!1,this.morphTargets=!1,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.setValues(t)}function Qi(t){Xe.call(this),this.type="MeshDistanceMaterial",this.referencePosition=new Mt,this.nearDistance=1,this.farDistance=1e3,this.skinning=!1,this.morphTargets=!1,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.fog=!1,this.setValues(t)}Ji.prototype=Object.create(Xe.prototype),Ji.prototype.constructor=Ji,Ji.prototype.isMeshDepthMaterial=!0,Ji.prototype.copy=function(t){return Xe.prototype.copy.call(this,t),this.depthPacking=t.depthPacking,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this},Qi.prototype=Object.create(Xe.prototype),Qi.prototype.constructor=Qi,Qi.prototype.isMeshDistanceMaterial=!0,Qi.prototype.copy=function(t){return Xe.prototype.copy.call(this,t),this.referencePosition.copy(t.referencePosition),this.nearDistance=t.nearDistance,this.farDistance=t.farDistance,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this};function Ki(t,e,n){var r=new er,i=new pt,a=new pt,o=new xt,s=[],c=[],l={},u={0:1,1:0,2:2},h=new jn({defines:{SAMPLE_RATE:2/8,HALF_SAMPLE_RATE:1/8},uniforms:{shadow_pass:{value:null},resolution:{value:new pt},radius:{value:4}},vertexShader:"void main() {\n\tgl_Position = vec4( position, 1.0 );\n}",fragmentShader:"uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n#include \nvoid main() {\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy ) / resolution ) );\n\tfor ( float i = -1.0; i < 1.0 ; i += SAMPLE_RATE) {\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( i, 0.0 ) * radius ) / resolution ) );\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, i ) * radius ) / resolution ) );\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean * HALF_SAMPLE_RATE;\n\tsquared_mean = squared_mean * HALF_SAMPLE_RATE;\n\tfloat std_dev = sqrt( squared_mean - mean * mean );\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}"}),p=h.clone();p.defines.HORIZONTAL_PASS=1;var f=new _n;f.setAttribute("position",new Qe(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));var v=new Fn(f,h),g=this;function y(n,r){var i=e.update(v);h.uniforms.shadow_pass.value=n.map.texture,h.uniforms.resolution.value=n.mapSize,h.uniforms.radius.value=n.radius,t.setRenderTarget(n.mapPass),t.clear(),t.renderBufferDirect(r,null,i,h,v,null),p.uniforms.shadow_pass.value=n.mapPass.texture,p.uniforms.resolution.value=n.mapSize,p.uniforms.radius.value=n.radius,t.setRenderTarget(n.map),t.clear(),t.renderBufferDirect(r,null,i,p,v,null)}function x(t,e,n){var r=t<<0|e<<1|n<<2,i=s[r];return void 0===i&&(i=new Ji({depthPacking:3201,morphTargets:t,skinning:e}),s[r]=i),i}function _(t,e,n){var r=t<<0|e<<1|n<<2,i=c[r];return void 0===i&&(i=new Qi({morphTargets:t,skinning:e}),c[r]=i),i}function b(e,n,r,i,a,o,s){var c=null,h=x,d=e.customDepthMaterial;if(!0===i.isPointLight&&(h=_,d=e.customDistanceMaterial),void 0===d){var p=!1;!0===r.morphTargets&&(p=n.morphAttributes&&n.morphAttributes.position&&n.morphAttributes.position.length>0);var f=!1;!0===e.isSkinnedMesh&&(!0===r.skinning?f=!0:console.warn("THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:",e)),c=h(p,f,!0===e.isInstancedMesh)}else c=d;if(t.localClippingEnabled&&!0===r.clipShadows&&0!==r.clippingPlanes.length){var m=c.uuid,v=r.uuid,g=l[m];void 0===g&&(g={},l[m]=g);var y=g[v];void 0===y&&(y=c.clone(),g[v]=y),c=y}return c.visible=r.visible,c.wireframe=r.wireframe,c.side=3===s?null!==r.shadowSide?r.shadowSide:r.side:null!==r.shadowSide?r.shadowSide:u[r.side],c.clipShadows=r.clipShadows,c.clippingPlanes=r.clippingPlanes,c.clipIntersection=r.clipIntersection,c.wireframeLinewidth=r.wireframeLinewidth,c.linewidth=r.linewidth,!0===i.isPointLight&&!0===c.isMeshDistanceMaterial&&(c.referencePosition.setFromMatrixPosition(i.matrixWorld),c.nearDistance=a,c.farDistance=o),c}function w(n,i,a,o,s){if(!1!==n.visible){if(n.layers.test(i.layers)&&(n.isMesh||n.isLine||n.isPoints)&&(n.castShadow||n.receiveShadow&&3===s)&&(!n.frustumCulled||r.intersectsObject(n))){n.modelViewMatrix.multiplyMatrices(a.matrixWorldInverse,n.matrixWorld);var c=e.update(n),l=n.material;if(Array.isArray(l))for(var u=c.groups,h=0,d=u.length;hn||i.y>n)&&(i.x>n&&(a.x=Math.floor(n/b.x),i.x=a.x*b.x,_.mapSize.x=a.x),i.y>n&&(a.y=Math.floor(n/b.y),i.y=a.y*b.y,_.mapSize.y=a.y)),null===_.map&&!_.isPointLightShadow&&3===this.type){var M={minFilter:m,magFilter:m,format:T};_.map=new _t(i.x,i.y,M),_.map.texture.name=x.name+".shadowMap",_.mapPass=new _t(i.x,i.y,M),_.camera.updateProjectionMatrix()}if(null===_.map){var S={minFilter:d,magFilter:d,format:T};_.map=new _t(i.x,i.y,S),_.map.texture.name=x.name+".shadowMap",_.camera.updateProjectionMatrix()}t.setRenderTarget(_.map),t.clear();for(var E=_.getViewportCount(),A=0;A=1):-1!==R.indexOf("OpenGL ES")&&(L=parseFloat(/^OpenGL ES (\d)/.exec(R)[1]),A=L>=2);var C=null,P={},I=new xt,N=new xt;function D(e,n,r){var i=new Uint8Array(4),a=t.createTexture();t.bindTexture(e,a),t.texParameteri(e,10241,9728),t.texParameteri(e,10240,9728);for(var o=0;or||t.height>r)&&(i=r/Math.max(t.width,t.height)),i<1||!0===e){if("undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap){var a=e?st.floorPowerOfTwo:Math.floor,o=a(i*t.width),s=a(i*t.height);void 0===l&&(l=P(o,s));var c=n?P(o,s):l;return c.width=o,c.height=s,c.getContext("2d").drawImage(t,0,0,o,s),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+t.width+"x"+t.height+") to ("+o+"x"+s+")."),c}return"data"in t&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+t.width+"x"+t.height+")."),t}return t}function N(t){return st.isPowerOfTwo(t.width)&&st.isPowerOfTwo(t.height)}function D(t,e){return t.generateMipmaps&&e&&t.minFilter!==d&&t.minFilter!==m}function O(e,n,i,a){t.generateMipmap(e),r.get(n).__maxMipLevel=Math.log(Math.max(i,a))*Math.LOG2E}function B(n,r,i){if(!1===h)return r;if(null!==n){if(void 0!==t[n])return t[n];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+n+"'")}var a=r;return 6403===r&&(5126===i&&(a=33326),5131===i&&(a=33325),5121===i&&(a=33321)),6407===r&&(5126===i&&(a=34837),5131===i&&(a=34843),5121===i&&(a=32849)),6408===r&&(5126===i&&(a=34836),5131===i&&(a=34842),5121===i&&(a=32856)),33325!==a&&33326!==a&&34842!==a&&34836!==a||e.get("EXT_color_buffer_float"),a}function z(t){return t===d||t===p||t===f?9728:9729}function F(e){var n=e.target;n.removeEventListener("dispose",F),function(e){var n=r.get(e);if(void 0===n.__webglInit)return;t.deleteTexture(n.__webglTexture),r.remove(e)}(n),n.isVideoTexture&&R.delete(n),o.memory.textures--}function G(e){var n=e.target;n.removeEventListener("dispose",G),function(e){var n=r.get(e),i=r.get(e.texture);if(!e)return;void 0!==i.__webglTexture&&t.deleteTexture(i.__webglTexture);e.depthTexture&&e.depthTexture.dispose();if(e.isWebGLCubeRenderTarget)for(var a=0;a<6;a++)t.deleteFramebuffer(n.__webglFramebuffer[a]),n.__webglDepthbuffer&&t.deleteRenderbuffer(n.__webglDepthbuffer[a]);else t.deleteFramebuffer(n.__webglFramebuffer),n.__webglDepthbuffer&&t.deleteRenderbuffer(n.__webglDepthbuffer),n.__webglMultisampledFramebuffer&&t.deleteFramebuffer(n.__webglMultisampledFramebuffer),n.__webglColorRenderbuffer&&t.deleteRenderbuffer(n.__webglColorRenderbuffer),n.__webglDepthRenderbuffer&&t.deleteRenderbuffer(n.__webglDepthRenderbuffer);r.remove(e.texture),r.remove(e)}(n),o.memory.textures--}var U=0;function H(t,e){var i=r.get(t);if(t.isVideoTexture&&function(t){var e=o.render.frame;R.get(t)!==e&&(R.set(t,e),t.update())}(t),t.version>0&&i.__version!==t.version){var a=t.image;if(void 0===a)console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined");else{if(!1!==a.complete)return void X(i,t,e);console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete")}}n.activeTexture(33984+e),n.bindTexture(3553,i.__webglTexture)}function k(e,i){var o=r.get(e);e.version>0&&o.__version!==e.version?function(e,r,i){if(6!==r.image.length)return;q(e,r),n.activeTexture(33984+i),n.bindTexture(34067,e.__webglTexture),t.pixelStorei(37440,r.flipY);for(var o=r&&(r.isCompressedTexture||r.image[0].isCompressedTexture),s=r.image[0]&&r.image[0].isDataTexture,c=[],l=0;l<6;l++)c[l]=o||s?s?r.image[l].image:r.image[l]:I(r.image[l],!1,!0,g);var u,d=c[0],p=N(d)||h,f=a.convert(r.format),m=a.convert(r.type),v=B(r.internalFormat,f,m);if(j(34067,r,p),o){for(var y=0;y<6;y++){u=c[y].mipmaps;for(var x=0;x1||r.get(a).__currentAnisotropy)&&(t.texParameterf(n,s.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(a.anisotropy,i.getMaxAnisotropy())),r.get(a).__currentAnisotropy=a.anisotropy)}}function q(e,n){void 0===e.__webglInit&&(e.__webglInit=!0,n.addEventListener("dispose",F),e.__webglTexture=t.createTexture(),o.memory.textures++)}function X(e,r,i){var o=3553;r.isDataTexture2DArray&&(o=35866),r.isDataTexture3D&&(o=32879),q(e,r),n.activeTexture(33984+i),n.bindTexture(o,e.__webglTexture),t.pixelStorei(37440,r.flipY),t.pixelStorei(37441,r.premultiplyAlpha),t.pixelStorei(3317,r.unpackAlignment);var s,c=function(t){return!h&&(t.wrapS!==u||t.wrapT!==u||t.minFilter!==d&&t.minFilter!==m)}(r)&&!1===N(r.image),l=I(r.image,c,!1,y),p=N(l)||h,f=a.convert(r.format),v=a.convert(r.type),g=B(r.internalFormat,f,v);j(o,r,p);var w=r.mipmaps;if(r.isDepthTexture)g=6402,h?g=r.type===b?36012:r.type===_?33190:r.type===M?35056:33189:r.type===b&&console.error("WebGLRenderer: Floating point depth texture requires WebGL2."),r.format===E&&6402===g&&r.type!==x&&r.type!==_&&(console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."),r.type=x,v=a.convert(r.type)),r.format===A&&6402===g&&(g=34041,r.type!==M&&(console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."),r.type=M,v=a.convert(r.type))),n.texImage2D(3553,0,g,l.width,l.height,0,f,v,null);else if(r.isDataTexture)if(w.length>0&&p){for(var L=0,R=w.length;L0&&p){for(var z=0,F=w.length;z=v&&console.warn("THREE.WebGLTextures: Trying to use "+t+" texture units while this GPU supports only "+v),U+=1,t},this.resetTextureUnits=function(){U=0},this.setTexture2D=H,this.setTexture2DArray=function(t,e){var i=r.get(t);t.version>0&&i.__version!==t.version?X(i,t,e):(n.activeTexture(33984+e),n.bindTexture(35866,i.__webglTexture))},this.setTexture3D=function(t,e){var i=r.get(t);t.version>0&&i.__version!==t.version?X(i,t,e):(n.activeTexture(33984+e),n.bindTexture(32879,i.__webglTexture))},this.setTextureCube=k,this.setupRenderTarget=function(e){var i=r.get(e),s=r.get(e.texture);e.addEventListener("dispose",G),s.__webglTexture=t.createTexture(),o.memory.textures++;var c=!0===e.isWebGLCubeRenderTarget,l=!0===e.isWebGLMultisampleRenderTarget,u=N(e)||h;if(!h||e.texture.format!==S||e.texture.type!==b&&e.texture.type!==w||(e.texture.format=T,console.warn("THREE.WebGLRenderer: Rendering to textures with RGB format is not supported. Using RGBA format instead.")),c){i.__webglFramebuffer=[];for(var d=0;d<6;d++)i.__webglFramebuffer[d]=t.createFramebuffer()}else if(i.__webglFramebuffer=t.createFramebuffer(),l)if(h){i.__webglMultisampledFramebuffer=t.createFramebuffer(),i.__webglColorRenderbuffer=t.createRenderbuffer(),t.bindRenderbuffer(36161,i.__webglColorRenderbuffer);var p=a.convert(e.texture.format),f=a.convert(e.texture.type),m=B(e.texture.internalFormat,p,f),v=Q(e);t.renderbufferStorageMultisample(36161,v,m,e.width,e.height),t.bindFramebuffer(36160,i.__webglMultisampledFramebuffer),t.framebufferRenderbuffer(36160,36064,36161,i.__webglColorRenderbuffer),t.bindRenderbuffer(36161,null),e.depthBuffer&&(i.__webglDepthRenderbuffer=t.createRenderbuffer(),Z(i.__webglDepthRenderbuffer,e,!0)),t.bindFramebuffer(36160,null)}else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.");if(c){n.bindTexture(34067,s.__webglTexture),j(34067,e.texture,u);for(var g=0;g<6;g++)Y(i.__webglFramebuffer[g],e,36064,34069+g);D(e.texture,u)&&O(34067,e.texture,e.width,e.height),n.bindTexture(34067,null)}else n.bindTexture(3553,s.__webglTexture),j(3553,e.texture,u),Y(i.__webglFramebuffer,e,36064,3553),D(e.texture,u)&&O(3553,e.texture,e.width,e.height),n.bindTexture(3553,null);e.depthBuffer&&J(e)},this.updateRenderTargetMipmap=function(t){var e=t.texture;if(D(e,N(t)||h)){var i=t.isWebGLCubeRenderTarget?34067:3553,a=r.get(e).__webglTexture;n.bindTexture(i,a),O(i,e,t.width,t.height),n.bindTexture(i,null)}},this.updateMultisampleRenderTarget=function(e){if(e.isWebGLMultisampleRenderTarget)if(h){var n=r.get(e);t.bindFramebuffer(36008,n.__webglMultisampledFramebuffer),t.bindFramebuffer(36009,n.__webglFramebuffer);var i=e.width,a=e.height,o=16384;e.depthBuffer&&(o|=256),e.stencilBuffer&&(o|=1024),t.blitFramebuffer(0,0,i,a,0,0,i,a,o,9728),t.bindFramebuffer(36160,n.__webglMultisampledFramebuffer)}else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.")},this.safeSetTexture2D=function(t,e){t&&t.isWebGLRenderTarget&&(!1===K&&(console.warn("THREE.WebGLTextures.safeSetTexture2D: don't use render targets as textures. Use their .texture property instead."),K=!0),t=t.texture),H(t,e)},this.safeSetTextureCube=function(t,e){t&&t.isWebGLCubeRenderTarget&&(!1===$&&(console.warn("THREE.WebGLTextures.safeSetTextureCube: don't use cube render targets as textures. Use their .texture property instead."),$=!0),t=t.texture),k(t,e)}}function ea(t,e,n){var r=n.isWebGL2;return{convert:function(t){var n;if(t===y)return 5121;if(1017===t)return 32819;if(1018===t)return 32820;if(1019===t)return 33635;if(1010===t)return 5120;if(1011===t)return 5122;if(t===x)return 5123;if(1013===t)return 5124;if(t===_)return 5125;if(t===b)return 5126;if(t===w)return r?5131:null!==(n=e.get("OES_texture_half_float"))?n.HALF_FLOAT_OES:null;if(1021===t)return 6406;if(t===S)return 6407;if(t===T)return 6408;if(1024===t)return 6409;if(1025===t)return 6410;if(t===E)return 6402;if(t===A)return 34041;if(1028===t)return 6403;if(1029===t)return 36244;if(1030===t)return 33319;if(1031===t)return 33320;if(1032===t)return 36248;if(1033===t)return 36249;if(t===L||t===R||t===C||t===P){if(null===(n=e.get("WEBGL_compressed_texture_s3tc")))return null;if(t===L)return n.COMPRESSED_RGB_S3TC_DXT1_EXT;if(t===R)return n.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(t===C)return n.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(t===P)return n.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(t===I||t===N||t===D||t===O){if(null===(n=e.get("WEBGL_compressed_texture_pvrtc")))return null;if(t===I)return n.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(t===N)return n.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(t===D)return n.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(t===O)return n.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(36196===t)return null!==(n=e.get("WEBGL_compressed_texture_etc1"))?n.COMPRESSED_RGB_ETC1_WEBGL:null;if((t===B||t===z)&&null!==(n=e.get("WEBGL_compressed_texture_etc"))){if(t===B)return n.COMPRESSED_RGB8_ETC2;if(t===z)return n.COMPRESSED_RGBA8_ETC2_EAC}return 37808===t||37809===t||37810===t||37811===t||37812===t||37813===t||37814===t||37815===t||37816===t||37817===t||37818===t||37819===t||37820===t||37821===t||37840===t||37841===t||37842===t||37843===t||37844===t||37845===t||37846===t||37847===t||37848===t||37849===t||37850===t||37851===t||37852===t||37853===t?null!==(n=e.get("WEBGL_compressed_texture_astc"))?t:null:36492===t?null!==(n=e.get("EXT_texture_compression_bptc"))?t:null:t===M?r?34042:null!==(n=e.get("WEBGL_depth_texture"))?n.UNSIGNED_INT_24_8_WEBGL:null:void 0}}}function na(t){void 0===t&&(t=[]),Xn.call(this),this.cameras=t}function ra(){we.call(this),this.type="Group"}function ia(){this._targetRay=null,this._grip=null,this._hand=null}function aa(t,e){var n=this,r=null,i=1,a=null,o="local-floor",s=null,c=[],l=new Map,u=new Xn;u.layers.enable(1),u.viewport=new xt;var h=new Xn;h.layers.enable(2),h.viewport=new xt;var d=[u,h],p=new na;p.layers.enable(1),p.layers.enable(2);var f=null,m=null;function v(t){var e=l.get(t.inputSource);e&&e.dispatchEvent({type:t.type,data:t.inputSource})}function g(){l.forEach((function(t,e){t.disconnect(e)})),l.clear(),t.setFramebuffer(null),t.setRenderTarget(t.getRenderTarget()),S.stop(),n.isPresenting=!1,n.dispatchEvent({type:"sessionend"})}function y(t){a=t,S.setContext(r),S.start(),n.isPresenting=!0,n.dispatchEvent({type:"sessionstart"})}function x(t){for(var e=r.inputSources,n=0;n0&&It(a,t,e),o.length>0&&It(o,t,e),!0===t.isScene&&t.onAfterRender(m,t,e),null!==M&&(K.updateRenderTargetMipmap(M),K.updateMultisampleRenderTarget(M)),Z.buffers.depth.setTest(!0),Z.buffers.depth.setMask(!0),Z.buffers.color.setMask(!0),Z.setPolygonOffset(!1),f.pop(),p=f.length>0?f[f.length-1]:null,d=null}}else console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.")},this.setFramebuffer=function(t){g!==t&&null===M&&vt.bindFramebuffer(36160,t),g=t},this.getActiveCubeFace=function(){return x},this.getActiveMipmapLevel=function(){return _},this.getRenderList=function(){return d},this.setRenderList=function(t){d=t},this.getRenderTarget=function(){return M},this.setRenderTarget=function(t,e,n){void 0===e&&(e=0),void 0===n&&(n=0),M=t,x=e,_=n,t&&void 0===Q.get(t).__webglFramebuffer&&K.setupRenderTarget(t);var r=g,i=!1;if(t){var a=Q.get(t).__webglFramebuffer;t.isWebGLCubeRenderTarget?(r=a[e],i=!0):r=t.isWebGLMultisampleRenderTarget?Q.get(t).__webglMultisampledFramebuffer:a,L.copy(t.viewport),R.copy(t.scissor),C=t.scissorTest}else L.copy(B).multiplyScalar(N).floor(),R.copy(z).multiplyScalar(N).floor(),C=F;if(S!==r&&(vt.bindFramebuffer(36160,r),S=r),Z.viewport(L),Z.scissor(R),Z.setScissorTest(C),i){var o=Q.get(t.texture);vt.framebufferTexture2D(36160,36064,34069+e,o.__webglTexture,n)}},this.readRenderTargetPixels=function(t,e,n,r,i,a,o){if(t&&t.isWebGLRenderTarget){var s=Q.get(t).__webglFramebuffer;if(t.isWebGLCubeRenderTarget&&void 0!==o&&(s=s[o]),s){var c=!1;s!==S&&(vt.bindFramebuffer(36160,s),c=!0);try{var l=t.texture,u=l.format,h=l.type;if(u!==T&&ft.convert(u)!==vt.getParameter(35739))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");if(!(h===y||ft.convert(h)===vt.getParameter(35738)||h===b&&(Y.isWebGL2||X.get("OES_texture_float")||X.get("WEBGL_color_buffer_float"))||h===w&&(Y.isWebGL2?X.get("EXT_color_buffer_float"):X.get("EXT_color_buffer_half_float"))))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");36053===vt.checkFramebufferStatus(36160)?e>=0&&e<=t.width-r&&n>=0&&n<=t.height-i&&vt.readPixels(e,n,r,i,ft.convert(u),ft.convert(h),a):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.")}finally{c&&vt.bindFramebuffer(36160,S)}}}else console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.")},this.copyFramebufferToTexture=function(t,e,n){void 0===n&&(n=0);var r=Math.pow(2,-n),i=Math.floor(e.image.width*r),a=Math.floor(e.image.height*r),o=ft.convert(e.format);K.setTexture2D(e,0),vt.copyTexImage2D(3553,n,o,t.x,t.y,i,a,0),Z.unbindTexture()},this.copyTextureToTexture=function(t,e,n,r){void 0===r&&(r=0);var i=e.image.width,a=e.image.height,o=ft.convert(n.format),s=ft.convert(n.type);K.setTexture2D(n,0),vt.pixelStorei(37440,n.flipY),vt.pixelStorei(37441,n.premultiplyAlpha),vt.pixelStorei(3317,n.unpackAlignment),e.isDataTexture?vt.texSubImage2D(3553,r,t.x,t.y,i,a,o,s,e.image.data):e.isCompressedTexture?vt.compressedTexSubImage2D(3553,r,t.x,t.y,e.mipmaps[0].width,e.mipmaps[0].height,o,e.mipmaps[0].data):vt.texSubImage2D(3553,r,t.x,t.y,o,s,e.image),0===r&&n.generateMipmaps&&vt.generateMipmap(3553),Z.unbindTexture()},this.initTexture=function(t){K.setTexture2D(t,0),Z.unbindTexture()},this.resetState=function(){Z.reset(),mt.reset()},"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}function ca(t){sa.call(this,t)}na.prototype=Object.assign(Object.create(Xn.prototype),{constructor:na,isArrayCamera:!0}),ra.prototype=Object.assign(Object.create(we.prototype),{constructor:ra,isGroup:!0}),Object.assign(ia.prototype,{constructor:ia,getHandSpace:function(){if(null===this._hand&&(this._hand=new ra,this._hand.matrixAutoUpdate=!1,this._hand.visible=!1,this._hand.joints=[],this._hand.inputState={pinching:!1},window.XRHand))for(var t=0;t<=window.XRHand.LITTLE_PHALANX_TIP;t++){var e=new ra;e.matrixAutoUpdate=!1,e.visible=!1,this._hand.joints.push(e),this._hand.add(e)}return this._hand},getTargetRaySpace:function(){return null===this._targetRay&&(this._targetRay=new ra,this._targetRay.matrixAutoUpdate=!1,this._targetRay.visible=!1),this._targetRay},getGripSpace:function(){return null===this._grip&&(this._grip=new ra,this._grip.matrixAutoUpdate=!1,this._grip.visible=!1),this._grip},dispatchEvent:function(t){return null!==this._targetRay&&this._targetRay.dispatchEvent(t),null!==this._grip&&this._grip.dispatchEvent(t),null!==this._hand&&this._hand.dispatchEvent(t),this},disconnect:function(t){return this.dispatchEvent({type:"disconnected",data:t}),null!==this._targetRay&&(this._targetRay.visible=!1),null!==this._grip&&(this._grip.visible=!1),null!==this._hand&&(this._hand.visible=!1),this},update:function(t,e,n){var r=null,i=null,a=null,o=this._targetRay,s=this._grip,c=this._hand;if(t&&"visible-blurred"!==e.session.visibilityState)if(c&&t.hand){a=!0;for(var l=0;l<=window.XRHand.LITTLE_PHALANX_TIP;l++)if(t.hand[l]){var u=e.getJointPose(t.hand[l],n),h=c.joints[l];null!==u&&(h.matrix.fromArray(u.transform.matrix),h.matrix.decompose(h.position,h.rotation,h.scale),h.jointRadius=u.radius),h.visible=null!==u;var d=c.joints[window.XRHand.INDEX_PHALANX_TIP],p=c.joints[window.XRHand.THUMB_PHALANX_TIP],f=d.position.distanceTo(p.position);c.inputState.pinching&&f>.025?(c.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:t.handedness,target:this})):!c.inputState.pinching&&f<=.015&&(c.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:t.handedness,target:this}))}}else null!==o&&null!==(r=e.getPose(t.targetRaySpace,n))&&(o.matrix.fromArray(r.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale)),null!==s&&t.gripSpace&&null!==(i=e.getPose(t.gripSpace,n))&&(s.matrix.fromArray(i.transform.matrix),s.matrix.decompose(s.position,s.rotation,s.scale));return null!==o&&(o.visible=null!==r),null!==s&&(s.visible=null!==i),null!==c&&(c.visible=null!==a),this}}),Object.assign(aa.prototype,rt.prototype),ca.prototype=Object.assign(Object.create(sa.prototype),{constructor:ca,isWebGL1Renderer:!0});var la=function(){function t(t,e){Object.defineProperty(this,"isFogExp2",{value:!0}),this.name="",this.color=new We(t),this.density=void 0!==e?e:25e-5}var e=t.prototype;return e.clone=function(){return new t(this.color,this.density)},e.toJSON=function(){return{type:"FogExp2",color:this.color.getHex(),density:this.density}},t}(),ua=function(){function t(t,e,n){Object.defineProperty(this,"isFog",{value:!0}),this.name="",this.color=new We(t),this.near=void 0!==e?e:1,this.far=void 0!==n?n:1e3}var e=t.prototype;return e.clone=function(){return new t(this.color,this.near,this.far)},e.toJSON=function(){return{type:"Fog",color:this.color.getHex(),near:this.near,far:this.far}},t}(),ha=function(t){function e(){var e;return e=t.call(this)||this,Object.defineProperty(ht(e),"isScene",{value:!0}),e.type="Scene",e.background=null,e.environment=null,e.fog=null,e.overrideMaterial=null,e.autoUpdate=!0,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:ht(e)})),e}ut(e,t);var n=e.prototype;return n.copy=function(e,n){return t.prototype.copy.call(this,e,n),null!==e.background&&(this.background=e.background.clone()),null!==e.environment&&(this.environment=e.environment.clone()),null!==e.fog&&(this.fog=e.fog.clone()),null!==e.overrideMaterial&&(this.overrideMaterial=e.overrideMaterial.clone()),this.autoUpdate=e.autoUpdate,this.matrixAutoUpdate=e.matrixAutoUpdate,this},n.toJSON=function(e){var n=t.prototype.toJSON.call(this,e);return null!==this.background&&(n.object.background=this.background.toJSON(e)),null!==this.environment&&(n.object.environment=this.environment.toJSON(e)),null!==this.fog&&(n.object.fog=this.fog.toJSON()),n},e}(we);function da(t,e){this.array=t,this.stride=e,this.count=void 0!==t?t.length/e:0,this.usage=tt,this.updateRange={offset:0,count:-1},this.version=0,this.uuid=st.generateUUID()}Object.defineProperty(da.prototype,"needsUpdate",{set:function(t){!0===t&&this.version++}}),Object.assign(da.prototype,{isInterleavedBuffer:!0,onUploadCallback:function(){},setUsage:function(t){return this.usage=t,this},copy:function(t){return this.array=new t.array.constructor(t.array),this.count=t.count,this.stride=t.stride,this.usage=t.usage,this},copyAt:function(t,e,n){t*=this.stride,n*=e.stride;for(var r=0,i=this.stride;rt.far||e.push({distance:s,point:ga.clone(),uv:ze.getUV(ga,Ma,Sa,Ta,Ea,Aa,La,new pt),face:null,object:this})}},copy:function(t){return we.prototype.copy.call(this,t),void 0!==t.center&&this.center.copy(t.center),this.material=t.material,this}});var Pa=new Mt,Ia=new Mt;function Na(){we.call(this),this._currentLevel=0,this.type="LOD",Object.defineProperties(this,{levels:{enumerable:!0,value:[]}}),this.autoUpdate=!0}Na.prototype=Object.assign(Object.create(we.prototype),{constructor:Na,isLOD:!0,copy:function(t){we.prototype.copy.call(this,t,!1);for(var e=t.levels,n=0,r=e.length;n0){var n,r;for(n=1,r=e.length;n0){Pa.setFromMatrixPosition(this.matrixWorld);var n=t.ray.origin.distanceTo(Pa);this.getObjectForDistance(n).raycast(t,e)}},update:function(t){var e=this.levels;if(e.length>1){Pa.setFromMatrixPosition(t.matrixWorld),Ia.setFromMatrixPosition(this.matrixWorld);var n,r,i=Pa.distanceTo(Ia)/t.zoom;for(e[0].object.visible=!0,n=1,r=e.length;n=e[n].distance;n++)e[n-1].object.visible=!1,e[n].object.visible=!0;for(this._currentLevel=n-1;no)){u.applyMatrix4(this.matrixWorld);var x=t.ray.origin.distanceTo(u);xt.far||e.push({distance:x,point:l.clone().applyMatrix4(this.matrixWorld),index:m,face:null,faceIndex:null,object:this})}}else for(var _=0,b=p.count-1;_o)){u.applyMatrix4(this.matrixWorld);var w=t.ray.origin.distanceTo(u);wt.far||e.push({distance:w,point:l.clone().applyMatrix4(this.matrixWorld),index:_,face:null,faceIndex:null,object:this})}}}else if(n.isGeometry)for(var M=n.vertices,S=M.length,T=0;To)){u.applyMatrix4(this.matrixWorld);var E=t.ray.origin.distanceTo(u);Et.far||e.push({distance:E,point:l.clone().applyMatrix4(this.matrixWorld),index:T,face:null,faceIndex:null,object:this})}}}},updateMorphTargets:function(){var t=this.geometry;if(t.isBufferGeometry){var e=t.morphAttributes,n=Object.keys(e);if(n.length>0){var r=e[n[0]];if(void 0!==r){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(var i=0,a=r.length;i0&&console.error("THREE.Line.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.")}}});var no=new Mt,ro=new Mt;function io(t,e){eo.call(this,t,e),this.type="LineSegments"}function ao(t,e){eo.call(this,t,e),this.type="LineLoop"}function oo(t){Xe.call(this),this.type="PointsMaterial",this.color=new We(16777215),this.map=null,this.alphaMap=null,this.size=1,this.sizeAttenuation=!0,this.morphTargets=!1,this.setValues(t)}io.prototype=Object.assign(Object.create(eo.prototype),{constructor:io,isLineSegments:!0,computeLineDistances:function(){var t=this.geometry;if(t.isBufferGeometry)if(null===t.index){for(var e=t.attributes.position,n=[],r=0,i=e.count;ri.far)return;a.push({distance:l,distanceToRay:Math.sqrt(s),point:c,index:e,face:null,object:o})}}function fo(t,e,n,r,i,a,o,s,c){gt.call(this,t,e,n,r,i,a,o,s,c),this.format=void 0!==o?o:S,this.minFilter=void 0!==a?a:m,this.magFilter=void 0!==i?i:m,this.generateMipmaps=!1;var l=this;"requestVideoFrameCallback"in t&&t.requestVideoFrameCallback((function e(){l.needsUpdate=!0,t.requestVideoFrameCallback(e)}))}function mo(t,e,n,r,i,a,o,s,c,l,u,h){gt.call(this,null,a,o,s,c,l,r,i,u,h),this.image={width:e,height:n},this.mipmaps=t,this.flipY=!1,this.generateMipmaps=!1}function vo(t,e,n,r,i,a,o,s,c){gt.call(this,t,e,n,r,i,a,o,s,c),this.needsUpdate=!0}function go(t,e,n,r,i,a,o,s,c,l){if((l=void 0!==l?l:E)!==E&&l!==A)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===n&&l===E&&(n=x),void 0===n&&l===A&&(n=M),gt.call(this,null,r,i,a,o,s,l,n,c),this.image={width:t,height:e},this.magFilter=void 0!==o?o:d,this.minFilter=void 0!==s?s:d,this.flipY=!1,this.generateMipmaps=!1}ho.prototype=Object.assign(Object.create(we.prototype),{constructor:ho,isPoints:!0,copy:function(t){return we.prototype.copy.call(this,t),this.material=t.material,this.geometry=t.geometry,this},raycast:function(t,e){var n=this.geometry,r=this.matrixWorld,i=t.params.Points.threshold;if(null===n.boundingSphere&&n.computeBoundingSphere(),lo.copy(n.boundingSphere),lo.applyMatrix4(r),lo.radius+=i,!1!==t.ray.intersectsSphere(lo)){so.copy(r).invert(),co.copy(t.ray).applyMatrix4(so);var a=i/((this.scale.x+this.scale.y+this.scale.z)/3),o=a*a;if(n.isBufferGeometry){var s=n.index,c=n.attributes.position;if(null!==s)for(var l=s.array,u=0,h=l.length;u0){var r=e[n[0]];if(void 0!==r){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(var i=0,a=r.length;i0&&console.error("THREE.Points.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.")}}}),fo.prototype=Object.assign(Object.create(gt.prototype),{constructor:fo,clone:function(){return new this.constructor(this.image).copy(this)},isVideoTexture:!0,update:function(){var t=this.image;!1==="requestVideoFrameCallback"in t&&t.readyState>=t.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}}),mo.prototype=Object.create(gt.prototype),mo.prototype.constructor=mo,mo.prototype.isCompressedTexture=!0,vo.prototype=Object.create(gt.prototype),vo.prototype.constructor=vo,vo.prototype.isCanvasTexture=!0,go.prototype=Object.create(gt.prototype),go.prototype.constructor=go,go.prototype.isDepthTexture=!0;var yo=0,xo=new Qt,_o=new we,bo=new Mt;function wo(){Object.defineProperty(this,"id",{value:yo+=2}),this.uuid=st.generateUUID(),this.name="",this.type="Geometry",this.vertices=[],this.colors=[],this.faces=[],this.faceVertexUvs=[[]],this.morphTargets=[],this.morphNormals=[],this.skinWeights=[],this.skinIndices=[],this.lineDistances=[],this.boundingBox=null,this.boundingSphere=null,this.elementsNeedUpdate=!1,this.verticesNeedUpdate=!1,this.uvsNeedUpdate=!1,this.normalsNeedUpdate=!1,this.colorsNeedUpdate=!1,this.lineDistancesNeedUpdate=!1,this.groupsNeedUpdate=!1}wo.prototype=Object.assign(Object.create(rt.prototype),{constructor:wo,isGeometry:!0,applyMatrix4:function(t){for(var e=(new ft).getNormalMatrix(t),n=0,r=this.vertices.length;n0)for(var d=0;d0&&(this.normalsNeedUpdate=!0)},computeFlatVertexNormals:function(){this.computeFaceNormals();for(var t=0,e=this.faces.length;t0&&(this.normalsNeedUpdate=!0)},computeMorphNormals:function(){for(var t=0,e=this.faces.length;t=0;m--){var v=l[m];this.faces.splice(v,1);for(var g=0,y=this.faceVertexUvs.length;g0,g=f.vertexNormals.length>0,y=1!==f.color.r||1!==f.color.g||1!==f.color.b,x=f.vertexColors.length>0,_=0;if(_=S(_,0,0),_=S(_,1,!0),_=S(_,2,!1),_=S(_,3,m),_=S(_,4,v),_=S(_,5,g),_=S(_,6,y),_=S(_,7,x),o.push(_),o.push(f.a,f.b,f.c),o.push(f.materialIndex),m){var b=this.faceVertexUvs[0][p];o.push(A(b[0]),A(b[1]),A(b[2]))}if(v&&o.push(T(f.normal)),g){var w=f.vertexNormals;o.push(T(w[0]),T(w[1]),T(w[2]))}if(y&&o.push(E(f.color)),x){var M=f.vertexColors;o.push(E(M[0]),E(M[1]),E(M[2]))}}function S(t,e,n){return n?t|1<0&&(t.data.colors=l),h.length>0&&(t.data.uvs=[h]),t.data.faces=o,t},clone:function(){return(new wo).copy(this)},copy:function(t){this.vertices=[],this.colors=[],this.faces=[],this.faceVertexUvs=[[]],this.morphTargets=[],this.morphNormals=[],this.skinWeights=[],this.skinIndices=[],this.lineDistances=[],this.boundingBox=null,this.boundingSphere=null,this.name=t.name;for(var e=t.vertices,n=0,r=e.length;n0&&x(!0),n>0&&x(!1)),l.setIndex(h),l.setAttribute("position",new sn(d,3)),l.setAttribute("normal",new sn(p,3)),l.setAttribute("uv",new sn(f,2)),l}return ut(e,t),e}(_n),Ao=function(t){function e(e,n,r,i,a,o,s,c){var l;return(l=t.call(this)||this).type="CylinderGeometry",l.parameters={radiusTop:e,radiusBottom:n,height:r,radialSegments:i,heightSegments:a,openEnded:o,thetaStart:s,thetaLength:c},l.fromBufferGeometry(new Eo(e,n,r,i,a,o,s,c)),l.mergeVertices(),l}return ut(e,t),e}(wo),Lo=function(t){function e(e,n,r,i,a,o,s){var c;return(c=t.call(this,0,e,n,r,i,a,o,s)||this).type="ConeGeometry",c.parameters={radius:e,height:n,radialSegments:r,heightSegments:i,openEnded:a,thetaStart:o,thetaLength:s},c}return ut(e,t),e}(Ao),Ro=function(t){function e(e,n,r,i,a,o,s){var c;return void 0===e&&(e=1),void 0===n&&(n=1),void 0===r&&(r=8),void 0===i&&(i=1),void 0===a&&(a=!1),void 0===o&&(o=0),void 0===s&&(s=2*Math.PI),(c=t.call(this,0,e,n,r,i,a,o,s)||this).type="ConeBufferGeometry",c.parameters={radius:e,height:n,radialSegments:r,heightSegments:i,openEnded:a,thetaStart:o,thetaLength:s},c}return ut(e,t),e}(Eo),Co=function(t){function e(e,n,r,i){var a;void 0===r&&(r=1),void 0===i&&(i=0),(a=t.call(this)||this).type="PolyhedronBufferGeometry",a.parameters={vertices:e,indices:n,radius:r,detail:i};var o=[],s=[];function c(t,e,n,r){for(var i=r+1,a=[],o=0;o<=i;o++){a[o]=[];for(var s=t.clone().lerp(n,o/i),c=e.clone().lerp(n,o/i),u=i-o,h=0;h<=u;h++)a[o][h]=0===h&&o===i?s:s.clone().lerp(c,h/u)}for(var d=0;d.9&&a<.1&&(e<.2&&(s[t+0]+=1),n<.2&&(s[t+2]+=1),r<.2&&(s[t+4]+=1))}}()}(),a.setAttribute("position",new sn(o,3)),a.setAttribute("normal",new sn(o.slice(),3)),a.setAttribute("uv",new sn(s,2)),0===i?a.computeVertexNormals():a.normalizeNormals(),a}return ut(e,t),e}(_n),Po=function(t){function e(e,n){var r;void 0===e&&(e=1),void 0===n&&(n=0);var i=(1+Math.sqrt(5))/2,a=1/i,o=[-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-a,-i,0,-a,i,0,a,-i,0,a,i,-a,-i,0,-a,i,0,a,-i,0,a,i,0,-i,0,-a,i,0,-a,-i,0,a,i,0,a];return(r=t.call(this,o,[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],e,n)||this).type="DodecahedronBufferGeometry",r.parameters={radius:e,detail:n},r}return ut(e,t),e}(Co),Io=function(t){function e(e,n){var r;return(r=t.call(this)||this).type="DodecahedronGeometry",r.parameters={radius:e,detail:n},r.fromBufferGeometry(new Po(e,n)),r.mergeVertices(),r}return ut(e,t),e}(wo),No=new Mt,Do=new Mt,Oo=new Mt,Bo=new ze,zo=function(t){function e(e,n){var r;(r=t.call(this)||this).type="EdgesGeometry",r.parameters={thresholdAngle:n},n=void 0!==n?n:1,e.isGeometry&&(e=(new _n).fromGeometry(e));for(var i=Math.pow(10,4),a=Math.cos(st.DEG2RAD*n),o=e.getIndex(),s=e.getAttribute("position"),c=o?o.count:s.count,l=[0,0,0],u=["a","b","c"],h=new Array(3),d={},p=[],f=0;f80*n){r=a=t[0],i=o=t[1];for(var f=n;fa&&(a=s),c>o&&(o=c);l=0!==(l=Math.max(a-r,o-i))?1/l:0}return Ho(d,p,n,r,i,l),p};function Go(t,e,n,r,i){var a,o;if(i===function(t,e,n,r){for(var i=0,a=e,o=n-r;a0)for(a=e;a=e;a-=r)o=os(a,t[a],t[a+1],o);return o&&ts(o,o.next)&&(ss(o),o=o.next),o}function Uo(t,e){if(!t)return t;e||(e=t);var n,r=t;do{if(n=!1,r.steiner||!ts(r,r.next)&&0!==$o(r.prev,r,r.next))r=r.next;else{if(ss(r),(r=e=r.prev)===r.next)break;n=!0}}while(n||r!==e);return e}function Ho(t,e,n,r,i,a,o){if(t){!o&&a&&function(t,e,n,r){var i=t;do{null===i.z&&(i.z=Zo(i.x,i.y,e,n,r)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next}while(i!==t);i.prevZ.nextZ=null,i.prevZ=null,function(t){var e,n,r,i,a,o,s,c,l=1;do{for(n=t,t=null,a=null,o=0;n;){for(o++,r=n,s=0,e=0;e0||c>0&&r;)0!==s&&(0===c||!r||n.z<=r.z)?(i=n,n=n.nextZ,s--):(i=r,r=r.nextZ,c--),a?a.nextZ=i:t=i,i.prevZ=a,a=i;n=r}a.nextZ=null,l*=2}while(o>1)}(i)}(t,r,i,a);for(var s,c,l=t;t.prev!==t.next;)if(s=t.prev,c=t.next,a?Vo(t,r,i,a):ko(t))e.push(s.i/n),e.push(t.i/n),e.push(c.i/n),ss(t),t=c.next,l=c.next;else if((t=c)===l){o?1===o?Ho(t=Wo(Uo(t),e,n),e,n,r,i,a,2):2===o&&jo(t,e,n,r,i,a):Ho(Uo(t),e,n,r,i,a,1);break}}}function ko(t){var e=t.prev,n=t,r=t.next;if($o(e,n,r)>=0)return!1;for(var i=t.next.next;i!==t.prev;){if(Qo(e.x,e.y,n.x,n.y,r.x,r.y,i.x,i.y)&&$o(i.prev,i,i.next)>=0)return!1;i=i.next}return!0}function Vo(t,e,n,r){var i=t.prev,a=t,o=t.next;if($o(i,a,o)>=0)return!1;for(var s=i.xa.x?i.x>o.x?i.x:o.x:a.x>o.x?a.x:o.x,u=i.y>a.y?i.y>o.y?i.y:o.y:a.y>o.y?a.y:o.y,h=Zo(s,c,e,n,r),d=Zo(l,u,e,n,r),p=t.prevZ,f=t.nextZ;p&&p.z>=h&&f&&f.z<=d;){if(p!==t.prev&&p!==t.next&&Qo(i.x,i.y,a.x,a.y,o.x,o.y,p.x,p.y)&&$o(p.prev,p,p.next)>=0)return!1;if(p=p.prevZ,f!==t.prev&&f!==t.next&&Qo(i.x,i.y,a.x,a.y,o.x,o.y,f.x,f.y)&&$o(f.prev,f,f.next)>=0)return!1;f=f.nextZ}for(;p&&p.z>=h;){if(p!==t.prev&&p!==t.next&&Qo(i.x,i.y,a.x,a.y,o.x,o.y,p.x,p.y)&&$o(p.prev,p,p.next)>=0)return!1;p=p.prevZ}for(;f&&f.z<=d;){if(f!==t.prev&&f!==t.next&&Qo(i.x,i.y,a.x,a.y,o.x,o.y,f.x,f.y)&&$o(f.prev,f,f.next)>=0)return!1;f=f.nextZ}return!0}function Wo(t,e,n){var r=t;do{var i=r.prev,a=r.next.next;!ts(i,a)&&es(i,r,r.next,a)&&is(i,a)&&is(a,i)&&(e.push(i.i/n),e.push(r.i/n),e.push(a.i/n),ss(r),ss(r.next),r=t=a),r=r.next}while(r!==t);return Uo(r)}function jo(t,e,n,r,i,a){var o=t;do{for(var s=o.next.next;s!==o.prev;){if(o.i!==s.i&&Ko(o,s)){var c=as(o,s);return o=Uo(o,o.next),c=Uo(c,c.next),Ho(o,e,n,r,i,a),void Ho(c,e,n,r,i,a)}s=s.next}o=o.next}while(o!==t)}function qo(t,e){return t.x-e.x}function Xo(t,e){if(e=function(t,e){var n,r=e,i=t.x,a=t.y,o=-1/0;do{if(a<=r.y&&a>=r.next.y&&r.next.y!==r.y){var s=r.x+(a-r.y)*(r.next.x-r.x)/(r.next.y-r.y);if(s<=i&&s>o){if(o=s,s===i){if(a===r.y)return r;if(a===r.next.y)return r.next}n=r.x=r.x&&r.x>=u&&i!==r.x&&Qo(an.x||r.x===n.x&&Yo(n,r)))&&(n=r,d=c)),r=r.next}while(r!==l);return n}(t,e)){var n=as(e,t);Uo(e,e.next),Uo(n,n.next)}}function Yo(t,e){return $o(t.prev,t,e.prev)<0&&$o(e.next,t,t.next)<0}function Zo(t,e,n,r,i){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-n)*i)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-r)*i)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function Jo(t){var e=t,n=t;do{(e.x=0&&(t-o)*(r-s)-(n-o)*(e-s)>=0&&(n-o)*(a-s)-(i-o)*(r-s)>=0}function Ko(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){var n=t;do{if(n.i!==t.i&&n.next.i!==t.i&&n.i!==e.i&&n.next.i!==e.i&&es(n,n.next,t,e))return!0;n=n.next}while(n!==t);return!1}(t,e)&&(is(t,e)&&is(e,t)&&function(t,e){var n=t,r=!1,i=(t.x+e.x)/2,a=(t.y+e.y)/2;do{n.y>a!=n.next.y>a&&n.next.y!==n.y&&i<(n.next.x-n.x)*(a-n.y)/(n.next.y-n.y)+n.x&&(r=!r),n=n.next}while(n!==t);return r}(t,e)&&($o(t.prev,t,e.prev)||$o(t,e.prev,e))||ts(t,e)&&$o(t.prev,t,t.next)>0&&$o(e.prev,e,e.next)>0)}function $o(t,e,n){return(e.y-t.y)*(n.x-e.x)-(e.x-t.x)*(n.y-e.y)}function ts(t,e){return t.x===e.x&&t.y===e.y}function es(t,e,n,r){var i=rs($o(t,e,n)),a=rs($o(t,e,r)),o=rs($o(n,r,t)),s=rs($o(n,r,e));return i!==a&&o!==s||(!(0!==i||!ns(t,n,e))||(!(0!==a||!ns(t,r,e))||(!(0!==o||!ns(n,t,r))||!(0!==s||!ns(n,e,r)))))}function ns(t,e,n){return e.x<=Math.max(t.x,n.x)&&e.x>=Math.min(t.x,n.x)&&e.y<=Math.max(t.y,n.y)&&e.y>=Math.min(t.y,n.y)}function rs(t){return t>0?1:t<0?-1:0}function is(t,e){return $o(t.prev,t,t.next)<0?$o(t,e,t.next)>=0&&$o(t,t.prev,e)>=0:$o(t,e,t.prev)<0||$o(t,t.next,e)<0}function as(t,e){var n=new cs(t.i,t.x,t.y),r=new cs(e.i,e.x,e.y),i=t.next,a=e.prev;return t.next=e,e.prev=t,n.next=i,i.prev=n,r.next=n,n.prev=r,a.next=r,r.prev=a,r}function os(t,e,n,r){var i=new cs(t,e,n);return r?(i.next=r.next,i.prev=r,r.next.prev=i,r.next=i):(i.prev=i,i.next=i),i}function ss(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function cs(t,e,n){this.i=t,this.x=e,this.y=n,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}var ls={area:function(t){for(var e=t.length,n=0,r=e-1,i=0;i2&&t[e-1].equals(t[0])&&t.pop()}function hs(t,e){for(var n=0;nNumber.EPSILON){var d=Math.sqrt(u),p=Math.sqrt(c*c+l*l),f=e.x-s/d,m=e.y+o/d,v=((n.x-l/p-f)*l-(n.y+c/p-m)*c)/(o*l-s*c),g=(r=f+o*v-t.x)*r+(i=m+s*v-t.y)*i;if(g<=2)return new pt(r,i);a=Math.sqrt(g/2)}else{var y=!1;o>Number.EPSILON?c>Number.EPSILON&&(y=!0):o<-Number.EPSILON?c<-Number.EPSILON&&(y=!0):Math.sign(s)===Math.sign(l)&&(y=!0),y?(r=-s,i=o,a=Math.sqrt(u)):(r=o,i=s,a=Math.sqrt(u/2))}return new pt(r/a,i/a)}for(var z=[],F=0,G=R.length,U=G-1,H=F+1;F=0;yt--){for(var xt=yt/p,_t=u*Math.cos(xt*Math.PI/2),bt=h*Math.sin(xt*Math.PI/2)+d,wt=0,St=R.length;wt=0;){var r=n,i=n-1;i<0&&(i=t.length-1);for(var a=0,o=s+2*p;a=0?(t(g-s,m,u),h.subVectors(l,u)):(t(g+s,m,u),h.subVectors(u,l)),m-s>=0?(t(g,m-s,u),d.subVectors(l,u)):(t(g,m+s,u),d.subVectors(u,l)),c.crossVectors(h,d).normalize(),a.push(c.x,c.y,c.z),o.push(g,m)}for(var y=0;y0)&&f.push(E,A,R),(S!==r-1||l=r)){u.push(c.times[d]);for(var f=0;fa.tracks[v].times[0]&&(m=a.tracks[v].times[0]);for(var g=0;g=r.times[h]){var m=h*c+s,v=m+c-s;d=tc.arraySlice(r.values,m,v)}else{var g=r.createInterpolant(),y=s,x=c-s;g.evaluate(a),d=tc.arraySlice(g.resultBuffer,y,x)}"quaternion"===i&&(new wt).fromArray(d).normalize().conjugate().toArray(d);for(var _=o.times.length,b=0;b<_;++b){var w=b*u+l;if("quaternion"===i)wt.multiplyQuaternionsFlat(o.values,w,d,0,o.values,w);else for(var M=u-2*l,S=0;S=i)break t;var s=e[1];t=(i=e[--n-1]))break e}a=n,n=0}for(;n>>1;te;)--a;if(++a,0!==i||a!==r){i>=a&&(i=(a=Math.max(a,1))-1);var o=this.getValueSize();this.times=tc.arraySlice(n,i,a),this.values=tc.arraySlice(this.values,i*o,a*o)}return this},validate:function(){var t=!0,e=this.getValueSize();e-Math.floor(e)!=0&&(console.error("THREE.KeyframeTrack: Invalid value size in track.",this),t=!1);var n=this.times,r=this.values,i=n.length;0===i&&(console.error("THREE.KeyframeTrack: Track is empty.",this),t=!1);for(var a=null,o=0;o!==i;o++){var s=n[o];if("number"==typeof s&&isNaN(s)){console.error("THREE.KeyframeTrack: Time is not a valid number.",this,o,s),t=!1;break}if(null!==a&&a>s){console.error("THREE.KeyframeTrack: Out of order keys.",this,o,s,a),t=!1;break}a=s}if(void 0!==r&&tc.isTypedArray(r))for(var c=0,l=r.length;c!==l;++c){var u=r[c];if(isNaN(u)){console.error("THREE.KeyframeTrack: Value is not a valid number.",this,c,u),t=!1;break}}return t},optimize:function(){for(var t=tc.arraySlice(this.times),e=tc.arraySlice(this.values),n=this.getValueSize(),r=this.getInterpolation()===U,i=t.length-1,a=1,o=1;o0){t[a]=t[i];for(var g=i*n,y=a*n,x=0;x!==n;++x)e[y+x]=e[g+x];++a}return a!==t.length?(this.times=tc.arraySlice(t,0,a),this.values=tc.arraySlice(e,0,a*n)):(this.times=t,this.values=e),this},clone:function(){var t=tc.arraySlice(this.times,0),e=tc.arraySlice(this.values,0),n=new(0,this.constructor)(this.name,t,e);return n.createInterpolant=this.createInterpolant,n}}),oc.prototype=Object.assign(Object.create(ac.prototype),{constructor:oc,ValueTypeName:"bool",ValueBufferType:Array,DefaultInterpolation:F,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0}),sc.prototype=Object.assign(Object.create(ac.prototype),{constructor:sc,ValueTypeName:"color"}),cc.prototype=Object.assign(Object.create(ac.prototype),{constructor:cc,ValueTypeName:"number"}),lc.prototype=Object.assign(Object.create(ec.prototype),{constructor:lc,interpolate_:function(t,e,n,r){for(var i=this.resultBuffer,a=this.sampleValues,o=this.valueSize,s=(n-e)/(r-e),c=t*o,l=c+o;c!==l;c+=4)wt.slerpFlat(i,0,a,c-o,a,c,s);return i}}),uc.prototype=Object.assign(Object.create(ac.prototype),{constructor:uc,ValueTypeName:"quaternion",DefaultInterpolation:G,InterpolantFactoryMethodLinear:function(t){return new lc(this.times,this.values,this.getValueSize(),t)},InterpolantFactoryMethodSmooth:void 0}),hc.prototype=Object.assign(Object.create(ac.prototype),{constructor:hc,ValueTypeName:"string",ValueBufferType:Array,DefaultInterpolation:F,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0}),dc.prototype=Object.assign(Object.create(ac.prototype),{constructor:dc,ValueTypeName:"vector"}),Object.assign(pc,{parse:function(t){for(var e=[],n=t.tracks,r=1/(t.fps||1),i=0,a=n.length;i!==a;++i)e.push(fc(n[i]).scale(r));var o=new pc(t.name,t.duration,e,t.blendMode);return o.uuid=t.uuid,o},toJSON:function(t){for(var e=[],n=t.tracks,r={name:t.name,duration:t.duration,tracks:e,uuid:t.uuid,blendMode:t.blendMode},i=0,a=n.length;i!==a;++i)e.push(ac.toJSON(n[i]));return r},CreateFromMorphTargetSequence:function(t,e,n,r){for(var i=e.length,a=[],o=0;o1){var l=c[1],u=r[l];u||(r[l]=u=[]),u.push(s)}}var h=[];for(var d in r)h.push(pc.CreateFromMorphTargetSequence(d,r[d],e,n));return h},parseAnimation:function(t,e){if(!t)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;for(var n=function(t,e,n,r,i){if(0!==n.length){var a=[],o=[];tc.flattenJSON(n,a,o,r),0!==a.length&&i.push(new t(e,a,o))}},r=[],i=t.name||"default",a=t.fps||30,o=t.blendMode,s=t.length||-1,c=t.hierarchy||[],l=0;l0||0===t.search(/^data\:image\/jpeg/);i.format=r?S:T,i.needsUpdate=!0,void 0!==e&&e(i)}),n,r),i}}),Object.assign(Ac.prototype,{getPoint:function(){return console.warn("THREE.Curve: .getPoint() not implemented."),null},getPointAt:function(t,e){var n=this.getUtoTmapping(t);return this.getPoint(n,e)},getPoints:function(t){void 0===t&&(t=5);for(var e=[],n=0;n<=t;n++)e.push(this.getPoint(n/t));return e},getSpacedPoints:function(t){void 0===t&&(t=5);for(var e=[],n=0;n<=t;n++)e.push(this.getPointAt(n/t));return e},getLength:function(){var t=this.getLengths();return t[t.length-1]},getLengths:function(t){if(void 0===t&&(t=this.arcLengthDivisions),this.cacheArcLengths&&this.cacheArcLengths.length===t+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;var e,n=[],r=this.getPoint(0),i=0;n.push(0);for(var a=1;a<=t;a++)i+=(e=this.getPoint(a/t)).distanceTo(r),n.push(i),r=e;return this.cacheArcLengths=n,n},updateArcLengths:function(){this.needsUpdate=!0,this.getLengths()},getUtoTmapping:function(t,e){var n,r=this.getLengths(),i=0,a=r.length;n=e||t*r[a-1];for(var o,s=0,c=a-1;s<=c;)if((o=r[i=Math.floor(s+(c-s)/2)]-n)<0)s=i+1;else{if(!(o>0)){c=i;break}c=i-1}if(r[i=c]===n)return i/(a-1);var l=r[i];return(i+(n-l)/(r[i+1]-l))/(a-1)},getTangent:function(t,e){var n=1e-4,r=t-n,i=t+n;r<0&&(r=0),i>1&&(i=1);var a=this.getPoint(r),o=this.getPoint(i),s=e||(a.isVector2?new pt:new Mt);return s.copy(o).sub(a).normalize(),s},getTangentAt:function(t,e){var n=this.getUtoTmapping(t);return this.getTangent(n,e)},computeFrenetFrames:function(t,e){for(var n=new Mt,r=[],i=[],a=[],o=new Mt,s=new Qt,c=0;c<=t;c++){var l=c/t;r[c]=this.getTangentAt(l,new Mt),r[c].normalize()}i[0]=new Mt,a[0]=new Mt;var u=Number.MAX_VALUE,h=Math.abs(r[0].x),d=Math.abs(r[0].y),p=Math.abs(r[0].z);h<=u&&(u=h,n.set(1,0,0)),d<=u&&(u=d,n.set(0,1,0)),p<=u&&n.set(0,0,1),o.crossVectors(r[0],n).normalize(),i[0].crossVectors(r[0],o),a[0].crossVectors(r[0],i[0]);for(var f=1;f<=t;f++){if(i[f]=i[f-1].clone(),a[f]=a[f-1].clone(),o.crossVectors(r[f-1],r[f]),o.length()>Number.EPSILON){o.normalize();var m=Math.acos(st.clamp(r[f-1].dot(r[f]),-1,1));i[f].applyMatrix4(s.makeRotationAxis(o,m))}a[f].crossVectors(r[f],i[f])}if(!0===e){var v=Math.acos(st.clamp(i[0].dot(i[t]),-1,1));v/=t,r[0].dot(o.crossVectors(i[0],i[t]))>0&&(v=-v);for(var g=1;g<=t;g++)i[g].applyMatrix4(s.makeRotationAxis(r[g],v*g)),a[g].crossVectors(r[g],i[g])}return{tangents:r,normals:i,binormals:a}},clone:function(){return(new this.constructor).copy(this)},copy:function(t){return this.arcLengthDivisions=t.arcLengthDivisions,this},toJSON:function(){var t={metadata:{version:4.5,type:"Curve",generator:"Curve.toJSON"}};return t.arcLengthDivisions=this.arcLengthDivisions,t.type=this.type,t},fromJSON:function(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}}),Lc.prototype=Object.create(Ac.prototype),Lc.prototype.constructor=Lc,Lc.prototype.isEllipseCurve=!0,Lc.prototype.getPoint=function(t,e){for(var n=e||new pt,r=2*Math.PI,i=this.aEndAngle-this.aStartAngle,a=Math.abs(i)r;)i-=r;i0?0:(Math.floor(Math.abs(c)/o)+1)*o:0===l&&c===o-1&&(c=o-2,l=1),this.closed||c>0?n=a[(c-1)%o]:(Pc.subVectors(a[0],a[1]).add(a[0]),n=Pc);var u=a[c%o],h=a[(c+1)%o];if(this.closed||c+2r.length-2?r.length-1:a+1],u=r[a>r.length-3?r.length-1:a+2];return n.set(Bc(o,s.x,c.x,l.x,u.x),Bc(o,s.y,c.y,l.y,u.y)),n},jc.prototype.copy=function(t){Ac.prototype.copy.call(this,t),this.points=[];for(var e=0,n=t.points.length;e=e){var i=n[r]-e,a=this.curves[r],o=a.getLength(),s=0===o?0:1-i/o;return a.getPointAt(s)}r++}return null},getLength:function(){var t=this.getCurveLengths();return t[t.length-1]},updateArcLengths:function(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()},getCurveLengths:function(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;for(var t=[],e=0,n=0,r=this.curves.length;n1&&!n[n.length-1].equals(n[0])&&n.push(n[0]),n},copy:function(t){Ac.prototype.copy.call(this,t),this.curves=[];for(var e=0,n=t.curves.length;e0){var l=c.getPoint(0);l.equals(this.currentPoint)||this.lineTo(l.x,l.y)}this.curves.push(c);var u=c.getPoint(1);return this.currentPoint.copy(u),this},copy:function(t){return Xc.prototype.copy.call(this,t),this.currentPoint.copy(t.currentPoint),this},toJSON:function(){var t=Xc.prototype.toJSON.call(this);return t.currentPoint=this.currentPoint.toArray(),t},fromJSON:function(t){return Xc.prototype.fromJSON.call(this,t),this.currentPoint.fromArray(t.currentPoint),this}}),Zc.prototype=Object.assign(Object.create(Yc.prototype),{constructor:Zc,getPointsHoles:function(t){for(var e=[],n=0,r=this.holes.length;n0:r.vertexColors=t.vertexColors),void 0!==t.uniforms)for(var i in t.uniforms){var a=t.uniforms[i];switch(r.uniforms[i]={},a.type){case"t":r.uniforms[i].value=n(a.value);break;case"c":r.uniforms[i].value=(new We).setHex(a.value);break;case"v2":r.uniforms[i].value=(new pt).fromArray(a.value);break;case"v3":r.uniforms[i].value=(new Mt).fromArray(a.value);break;case"v4":r.uniforms[i].value=(new xt).fromArray(a.value);break;case"m3":r.uniforms[i].value=(new ft).fromArray(a.value);break;case"m4":r.uniforms[i].value=(new Qt).fromArray(a.value);break;default:r.uniforms[i].value=a.value}}if(void 0!==t.defines&&(r.defines=t.defines),void 0!==t.vertexShader&&(r.vertexShader=t.vertexShader),void 0!==t.fragmentShader&&(r.fragmentShader=t.fragmentShader),void 0!==t.extensions)for(var o in t.extensions)r.extensions[o]=t.extensions[o];if(void 0!==t.shading&&(r.flatShading=1===t.shading),void 0!==t.size&&(r.size=t.size),void 0!==t.sizeAttenuation&&(r.sizeAttenuation=t.sizeAttenuation),void 0!==t.map&&(r.map=n(t.map)),void 0!==t.matcap&&(r.matcap=n(t.matcap)),void 0!==t.alphaMap&&(r.alphaMap=n(t.alphaMap)),void 0!==t.bumpMap&&(r.bumpMap=n(t.bumpMap)),void 0!==t.bumpScale&&(r.bumpScale=t.bumpScale),void 0!==t.normalMap&&(r.normalMap=n(t.normalMap)),void 0!==t.normalMapType&&(r.normalMapType=t.normalMapType),void 0!==t.normalScale){var s=t.normalScale;!1===Array.isArray(s)&&(s=[s,s]),r.normalScale=(new pt).fromArray(s)}return void 0!==t.displacementMap&&(r.displacementMap=n(t.displacementMap)),void 0!==t.displacementScale&&(r.displacementScale=t.displacementScale),void 0!==t.displacementBias&&(r.displacementBias=t.displacementBias),void 0!==t.roughnessMap&&(r.roughnessMap=n(t.roughnessMap)),void 0!==t.metalnessMap&&(r.metalnessMap=n(t.metalnessMap)),void 0!==t.emissiveMap&&(r.emissiveMap=n(t.emissiveMap)),void 0!==t.emissiveIntensity&&(r.emissiveIntensity=t.emissiveIntensity),void 0!==t.specularMap&&(r.specularMap=n(t.specularMap)),void 0!==t.envMap&&(r.envMap=n(t.envMap)),void 0!==t.envMapIntensity&&(r.envMapIntensity=t.envMapIntensity),void 0!==t.reflectivity&&(r.reflectivity=t.reflectivity),void 0!==t.refractionRatio&&(r.refractionRatio=t.refractionRatio),void 0!==t.lightMap&&(r.lightMap=n(t.lightMap)),void 0!==t.lightMapIntensity&&(r.lightMapIntensity=t.lightMapIntensity),void 0!==t.aoMap&&(r.aoMap=n(t.aoMap)),void 0!==t.aoMapIntensity&&(r.aoMapIntensity=t.aoMapIntensity),void 0!==t.gradientMap&&(r.gradientMap=n(t.gradientMap)),void 0!==t.clearcoatMap&&(r.clearcoatMap=n(t.clearcoatMap)),void 0!==t.clearcoatRoughnessMap&&(r.clearcoatRoughnessMap=n(t.clearcoatRoughnessMap)),void 0!==t.clearcoatNormalMap&&(r.clearcoatNormalMap=n(t.clearcoatNormalMap)),void 0!==t.clearcoatNormalScale&&(r.clearcoatNormalScale=(new pt).fromArray(t.clearcoatNormalScale)),void 0!==t.transmission&&(r.transmission=t.transmission),void 0!==t.transmissionMap&&(r.transmissionMap=n(t.transmissionMap)),r},setTextures:function(t){return this.textures=t,this}});var hl={decodeText:function(t){if("undefined"!=typeof TextDecoder)return(new TextDecoder).decode(t);for(var e="",n=0,r=t.length;n0){var o=new vc(e);(n=new Mc(o)).setCrossOrigin(this.crossOrigin);for(var s=0,c=t.length;sNumber.EPSILON){if(l<0&&(o=e[a],c=-c,s=e[i],l=-l),t.ys.y)continue;if(t.y===o.y){if(t.x===o.x)return!0}else{var u=l*(t.x-o.x)-c*(t.y-o.y);if(0===u)return!0;if(u<0)continue;r=!r}}else{if(t.y!==o.y)continue;if(s.x<=t.x&&t.x<=o.x||o.x<=t.x&&t.x<=s.x)return!0}}return r}var i,a,o,s=ls.isClockWise,c=this.subPaths;if(0===c.length)return[];if(!0===e)return n(c);var l=[];if(1===c.length)return a=c[0],(o=new Zc).curves=a.curves,l.push(o),l;var u=!s(c[0].getPoints());u=t?!u:u;var h,d,p=[],f=[],m=[],v=0;f[v]=void 0,m[v]=[];for(var g=0,y=c.length;g1){for(var x=!1,_=[],b=0,w=f.length;b0&&(x||(m=p))}for(var C=0,P=f.length;C0){this.source.connect(this.filters[0]);for(var t=1,e=this.filters.length;t0){this.source.disconnect(this.filters[0]);for(var t=1,e=this.filters.length;t0&&this._mixBufferRegionAdditive(n,r,this._addIndex*e,1,e);for(var c=e,l=e+e;c!==l;++c)if(n[c]!==n[c+e]){o.setValue(n,r);break}},saveOriginalState:function(){var t=this.binding,e=this.buffer,n=this.valueSize,r=n*this._origIndex;t.getValue(e,r);for(var i=n,a=r;i!==a;++i)e[i]=e[r+i%n];this._setIdentity(),this.cumulativeWeight=0,this.cumulativeWeightAdditive=0},restoreOriginalState:function(){var t=3*this.valueSize;this.binding.setValue(this.buffer,t)},_setAdditiveIdentityNumeric:function(){for(var t=this._addIndex*this.valueSize,e=t+this.valueSize,n=t;n=.5)for(var a=0;a!==i;++a)t[e+a]=t[n+a]},_slerp:function(t,e,n,r){wt.slerpFlat(t,e,t,e,t,n,r)},_slerpAdditive:function(t,e,n,r,i){var a=this._workIndex*i;wt.multiplyQuaternionsFlat(t,a,t,e,t,n),wt.slerpFlat(t,e,t,e,t,a,r)},_lerp:function(t,e,n,r,i){for(var a=1-r,o=0;o!==i;++o){var s=e+o;t[s]=t[s]*a+t[n+o]*r}},_lerpAdditive:function(t,e,n,r,i){for(var a=0;a!==i;++a){var o=e+a;t[o]=t[o]+t[n+a]*r}}});var Xl="\\[\\]\\.:\\/",Yl=new RegExp("[\\[\\]\\.:\\/]","g"),Zl="[^\\[\\]\\.:\\/]",Jl="[^"+Xl.replace("\\.","")+"]",Ql=/((?:WC+[\/:])*)/.source.replace("WC",Zl),Kl=/(WCOD+)?/.source.replace("WCOD",Jl),$l=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",Zl),tu=/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",Zl),eu=new RegExp("^"+Ql+Kl+$l+tu+"$"),nu=["material","materials","bones"];function ru(t,e,n){var r=n||iu.parseTrackName(e);this._targetGroup=t,this._bindings=t.subscribe_(e,r)}function iu(t,e,n){this.path=e,this.parsedPath=n||iu.parseTrackName(e),this.node=iu.findNode(t,this.parsedPath.nodeName)||t,this.rootNode=t}function au(){this.uuid=st.generateUUID(),this._objects=Array.prototype.slice.call(arguments),this.nCachedObjects_=0;var t={};this._indicesByUUID=t;for(var e=0,n=arguments.length;e!==n;++e)t[arguments[e].uuid]=e;this._paths=[],this._parsedPaths=[],this._bindings=[],this._bindingsIndicesByPath={};var r=this;this.stats={objects:{get total(){return r._objects.length},get inUse(){return this.total-r.nCachedObjects_}},get bindingsPerObject(){return r._bindings.length}}}Object.assign(ru.prototype,{getValue:function(t,e){this.bind();var n=this._targetGroup.nCachedObjects_,r=this._bindings[n];void 0!==r&&r.getValue(t,e)},setValue:function(t,e){for(var n=this._bindings,r=this._targetGroup.nCachedObjects_,i=n.length;r!==i;++r)n[r].setValue(t,e)},bind:function(){for(var t=this._bindings,e=this._targetGroup.nCachedObjects_,n=t.length;e!==n;++e)t[e].bind()},unbind:function(){for(var t=this._bindings,e=this._targetGroup.nCachedObjects_,n=t.length;e!==n;++e)t[e].unbind()}}),Object.assign(iu,{Composite:ru,create:function(t,e,n){return t&&t.isAnimationObjectGroup?new iu.Composite(t,e,n):new iu(t,e,n)},sanitizeNodeName:function(t){return t.replace(/\s/g,"_").replace(Yl,"")},parseTrackName:function(t){var e=eu.exec(t);if(!e)throw new Error("PropertyBinding: Cannot parse trackName: "+t);var n={nodeName:e[2],objectName:e[3],objectIndex:e[4],propertyName:e[5],propertyIndex:e[6]},r=n.nodeName&&n.nodeName.lastIndexOf(".");if(void 0!==r&&-1!==r){var i=n.nodeName.substring(r+1);-1!==nu.indexOf(i)&&(n.nodeName=n.nodeName.substring(0,r),n.objectName=i)}if(null===n.propertyName||0===n.propertyName.length)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+t);return n},findNode:function(t,e){if(!e||""===e||"."===e||-1===e||e===t.name||e===t.uuid)return t;if(t.skeleton){var n=t.skeleton.getBoneByName(e);if(void 0!==n)return n}if(t.children){var r=function t(n){for(var r=0;r=i){var u=i++,h=t[u];e[h.uuid]=l,t[l]=h,e[c]=u,t[u]=s;for(var d=0,p=r;d!==p;++d){var f=n[d],m=f[u],v=f[l];f[l]=m,f[u]=v}}}this.nCachedObjects_=i},uncache:function(){for(var t=this._objects,e=this._indicesByUUID,n=this._bindings,r=n.length,i=this.nCachedObjects_,a=t.length,o=0,s=arguments.length;o!==s;++o){var c=arguments[o],l=c.uuid,u=e[l];if(void 0!==u)if(delete e[l],u0&&(e[b.uuid]=u),t[u]=b,t.pop();for(var w=0,M=r;w!==M;++w){var S=n[w];S[u]=S[_],S.pop()}}}this.nCachedObjects_=i},subscribe_:function(t,e){var n=this._bindingsIndicesByPath,r=n[t],i=this._bindings;if(void 0!==r)return i[r];var a=this._paths,o=this._parsedPaths,s=this._objects,c=s.length,l=this.nCachedObjects_,u=new Array(c);r=i.length,n[t]=r,a.push(t),o.push(e),i.push(u);for(var h=l,d=s.length;h!==d;++h){var p=s[h];u[h]=new iu(p,t,e)}return u},unsubscribe_:function(t){var e=this._bindingsIndicesByPath,n=e[t];if(void 0!==n){var r=this._paths,i=this._parsedPaths,a=this._bindings,o=a.length-1,s=a[o];e[t[o]]=n,a[n]=s,a.pop(),i[n]=i[o],i.pop(),r[n]=r[o],r.pop()}}});var ou=function(){function t(t,e,n,r){void 0===n&&(n=null),void 0===r&&(r=e.blendMode),this._mixer=t,this._clip=e,this._localRoot=n,this.blendMode=r;for(var i=e.tracks,a=i.length,o=new Array(a),s={endingStart:H,endingEnd:H},c=0;c!==a;++c){var l=i[c].createInterpolant(null);o[c]=l,l.settings=s}this._interpolantSettings=s,this._interpolants=o,this._propertyBindings=new Array(a),this._cacheIndex=null,this._byClipCacheIndex=null,this._timeScaleInterpolant=null,this._weightInterpolant=null,this.loop=2201,this._loopCount=-1,this._startTime=null,this.time=0,this.timeScale=1,this._effectiveTimeScale=1,this.weight=1,this._effectiveWeight=1,this.repetitions=1/0,this.paused=!1,this.enabled=!0,this.clampWhenFinished=!1,this.zeroSlopeAtStart=!0,this.zeroSlopeAtEnd=!0}var e=t.prototype;return e.play=function(){return this._mixer._activateAction(this),this},e.stop=function(){return this._mixer._deactivateAction(this),this.reset()},e.reset=function(){return this.paused=!1,this.enabled=!0,this.time=0,this._loopCount=-1,this._startTime=null,this.stopFading().stopWarping()},e.isRunning=function(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)},e.isScheduled=function(){return this._mixer._isActiveAction(this)},e.startAt=function(t){return this._startTime=t,this},e.setLoop=function(t,e){return this.loop=t,this.repetitions=e,this},e.setEffectiveWeight=function(t){return this.weight=t,this._effectiveWeight=this.enabled?t:0,this.stopFading()},e.getEffectiveWeight=function(){return this._effectiveWeight},e.fadeIn=function(t){return this._scheduleFading(t,0,1)},e.fadeOut=function(t){return this._scheduleFading(t,1,0)},e.crossFadeFrom=function(t,e,n){if(t.fadeOut(e),this.fadeIn(e),n){var r=this._clip.duration,i=t._clip.duration,a=i/r,o=r/i;t.warp(1,a,e),this.warp(o,1,e)}return this},e.crossFadeTo=function(t,e,n){return t.crossFadeFrom(this,e,n)},e.stopFading=function(){var t=this._weightInterpolant;return null!==t&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this},e.setEffectiveTimeScale=function(t){return this.timeScale=t,this._effectiveTimeScale=this.paused?0:t,this.stopWarping()},e.getEffectiveTimeScale=function(){return this._effectiveTimeScale},e.setDuration=function(t){return this.timeScale=this._clip.duration/t,this.stopWarping()},e.syncWith=function(t){return this.time=t.time,this.timeScale=t.timeScale,this.stopWarping()},e.halt=function(t){return this.warp(this._effectiveTimeScale,0,t)},e.warp=function(t,e,n){var r=this._mixer,i=r.time,a=this.timeScale,o=this._timeScaleInterpolant;null===o&&(o=r._lendControlInterpolant(),this._timeScaleInterpolant=o);var s=o.parameterPositions,c=o.sampleValues;return s[0]=i,s[1]=i+n,c[0]=t/a,c[1]=e/a,this},e.stopWarping=function(){var t=this._timeScaleInterpolant;return null!==t&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this},e.getMixer=function(){return this._mixer},e.getClip=function(){return this._clip},e.getRoot=function(){return this._localRoot||this._mixer._root},e._update=function(t,e,n,r){if(this.enabled){var i=this._startTime;if(null!==i){var a=(t-i)*n;if(a<0||0===n)return;this._startTime=null,e=n*a}e*=this._updateTimeScale(t);var o=this._updateTime(e),s=this._updateWeight(t);if(s>0){var c=this._interpolants,l=this._propertyBindings;switch(this.blendMode){case j:for(var u=0,h=c.length;u!==h;++u)c[u].evaluate(o),l[u].accumulateAdditive(s);break;case W:default:for(var d=0,p=c.length;d!==p;++d)c[d].evaluate(o),l[d].accumulate(r,s)}}}else this._updateWeight(t)},e._updateWeight=function(t){var e=0;if(this.enabled){e=this.weight;var n=this._weightInterpolant;if(null!==n){var r=n.evaluate(t)[0];e*=r,t>n.parameterPositions[1]&&(this.stopFading(),0===r&&(this.enabled=!1))}}return this._effectiveWeight=e,e},e._updateTimeScale=function(t){var e=0;if(!this.paused){e=this.timeScale;var n=this._timeScaleInterpolant;if(null!==n)e*=n.evaluate(t)[0],t>n.parameterPositions[1]&&(this.stopWarping(),0===e?this.paused=!0:this.timeScale=e)}return this._effectiveTimeScale=e,e},e._updateTime=function(t){var e=this._clip.duration,n=this.loop,r=this.time+t,i=this._loopCount,a=2202===n;if(0===t)return-1===i?r:a&&1==(1&i)?e-r:r;if(2200===n){-1===i&&(this._loopCount=0,this._setEndings(!0,!0,!1));t:{if(r>=e)r=e;else{if(!(r<0)){this.time=r;break t}r=0}this.clampWhenFinished?this.paused=!0:this.enabled=!1,this.time=r,this._mixer.dispatchEvent({type:"finished",action:this,direction:t<0?-1:1})}}else{if(-1===i&&(t>=0?(i=0,this._setEndings(!0,0===this.repetitions,a)):this._setEndings(0===this.repetitions,!0,a)),r>=e||r<0){var o=Math.floor(r/e);r-=e*o,i+=Math.abs(o);var s=this.repetitions-i;if(s<=0)this.clampWhenFinished?this.paused=!0:this.enabled=!1,r=t>0?e:0,this.time=r,this._mixer.dispatchEvent({type:"finished",action:this,direction:t>0?1:-1});else{if(1===s){var c=t<0;this._setEndings(c,!c,a)}else this._setEndings(!1,!1,a);this._loopCount=i,this.time=r,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:o})}}else this.time=r;if(a&&1==(1&i))return e-r}return r},e._setEndings=function(t,e,n){var r=this._interpolantSettings;n?(r.endingStart=k,r.endingEnd=k):(r.endingStart=t?this.zeroSlopeAtStart?k:H:V,r.endingEnd=e?this.zeroSlopeAtEnd?k:H:V)},e._scheduleFading=function(t,e,n){var r=this._mixer,i=r.time,a=this._weightInterpolant;null===a&&(a=r._lendControlInterpolant(),this._weightInterpolant=a);var o=a.parameterPositions,s=a.sampleValues;return o[0]=i,s[0]=e,o[1]=i+t,s[1]=n,this},t}();function su(t){this._root=t,this._initMemoryManager(),this._accuIndex=0,this.time=0,this.timeScale=1}su.prototype=Object.assign(Object.create(rt.prototype),{constructor:su,_bindAction:function(t,e){var n=t._localRoot||this._root,r=t._clip.tracks,i=r.length,a=t._propertyBindings,o=t._interpolants,s=n.uuid,c=this._bindingsByRootAndName,l=c[s];void 0===l&&(l={},c[s]=l);for(var u=0;u!==i;++u){var h=r[u],d=h.name,p=l[d];if(void 0!==p)a[u]=p;else{if(void 0!==(p=a[u])){null===p._cacheIndex&&(++p.referenceCount,this._addInactiveBinding(p,s,d));continue}var f=e&&e._propertyBindings[u].binding.parsedPath;++(p=new ql(iu.create(n,d,f),h.ValueTypeName,h.getValueSize())).referenceCount,this._addInactiveBinding(p,s,d),a[u]=p}o[u].resultBuffer=p.buffer}},_activateAction:function(t){if(!this._isActiveAction(t)){if(null===t._cacheIndex){var e=(t._localRoot||this._root).uuid,n=t._clip.uuid,r=this._actionsByClip[n];this._bindAction(t,r&&r.knownActions[0]),this._addInactiveAction(t,n,e)}for(var i=t._propertyBindings,a=0,o=i.length;a!==o;++a){var s=i[a];0==s.useCount++&&(this._lendBinding(s),s.saveOriginalState())}this._lendAction(t)}},_deactivateAction:function(t){if(this._isActiveAction(t)){for(var e=t._propertyBindings,n=0,r=e.length;n!==r;++n){var i=e[n];0==--i.useCount&&(i.restoreOriginalState(),this._takeBackBinding(i))}this._takeBackAction(t)}},_initMemoryManager:function(){this._actions=[],this._nActiveActions=0,this._actionsByClip={},this._bindings=[],this._nActiveBindings=0,this._bindingsByRootAndName={},this._controlInterpolants=[],this._nActiveControlInterpolants=0;var t=this;this.stats={actions:{get total(){return t._actions.length},get inUse(){return t._nActiveActions}},bindings:{get total(){return t._bindings.length},get inUse(){return t._nActiveBindings}},controlInterpolants:{get total(){return t._controlInterpolants.length},get inUse(){return t._nActiveControlInterpolants}}}},_isActiveAction:function(t){var e=t._cacheIndex;return null!==e&&e=0;--e)t[e].stop();return this},update:function(t){t*=this.timeScale;for(var e=this._actions,n=this._nActiveActions,r=this.time+=t,i=Math.sign(t),a=this._accuIndex^=1,o=0;o!==n;++o){e[o]._update(r,t,i,a)}for(var s=this._bindings,c=this._nActiveBindings,l=0;l!==c;++l)s[l].apply(a);return this},setTime:function(t){this.time=0;for(var e=0;ethis.max.x||t.ythis.max.y)},e.containsBox=function(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y},e.getParameter=function(t,e){return void 0===e&&(console.warn("THREE.Box2: .getParameter() target is now required"),e=new pt),e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y))},e.intersectsBox=function(t){return!(t.max.xthis.max.x||t.max.ythis.max.y)},e.clampPoint=function(t,e){return void 0===e&&(console.warn("THREE.Box2: .clampPoint() target is now required"),e=new pt),e.copy(t).clamp(this.min,this.max)},e.distanceToPoint=function(t){return vu.copy(t).clamp(this.min,this.max).sub(t).length()},e.intersect=function(t){return this.min.max(t.min),this.max.min(t.max),this},e.union=function(t){return this.min.min(t.min),this.max.max(t.max),this},e.translate=function(t){return this.min.add(t),this.max.add(t),this},e.equals=function(t){return t.min.equals(this.min)&&t.max.equals(this.max)},t}(),yu=new Mt,xu=new Mt,_u=function(){function t(t,e){this.start=void 0!==t?t:new Mt,this.end=void 0!==e?e:new Mt}var e=t.prototype;return e.set=function(t,e){return this.start.copy(t),this.end.copy(e),this},e.clone=function(){return(new this.constructor).copy(this)},e.copy=function(t){return this.start.copy(t.start),this.end.copy(t.end),this},e.getCenter=function(t){return void 0===t&&(console.warn("THREE.Line3: .getCenter() target is now required"),t=new Mt),t.addVectors(this.start,this.end).multiplyScalar(.5)},e.delta=function(t){return void 0===t&&(console.warn("THREE.Line3: .delta() target is now required"),t=new Mt),t.subVectors(this.end,this.start)},e.distanceSq=function(){return this.start.distanceToSquared(this.end)},e.distance=function(){return this.start.distanceTo(this.end)},e.at=function(t,e){return void 0===e&&(console.warn("THREE.Line3: .at() target is now required"),e=new Mt),this.delta(e).multiplyScalar(t).add(this.start)},e.closestPointToPointParameter=function(t,e){yu.subVectors(t,this.start),xu.subVectors(this.end,this.start);var n=xu.dot(xu),r=xu.dot(yu)/n;return e&&(r=st.clamp(r,0,1)),r},e.closestPointToPoint=function(t,e,n){var r=this.closestPointToPointParameter(t,e);return void 0===n&&(console.warn("THREE.Line3: .closestPointToPoint() target is now required"),n=new Mt),this.delta(n).multiplyScalar(r).add(this.start)},e.applyMatrix4=function(t){return this.start.applyMatrix4(t),this.end.applyMatrix4(t),this},e.equals=function(t){return t.start.equals(this.start)&&t.end.equals(this.end)},t}();function bu(t){we.call(this),this.material=t,this.render=function(){},this.hasPositions=!1,this.hasNormals=!1,this.hasColors=!1,this.hasUvs=!1,this.positionArray=null,this.normalArray=null,this.colorArray=null,this.uvArray=null,this.count=0}bu.prototype=Object.create(we.prototype),bu.prototype.constructor=bu,bu.prototype.isImmediateRenderObject=!0;var wu=new Mt,Mu=function(t){function e(e,n){var r;(r=t.call(this)||this).light=e,r.light.updateMatrixWorld(),r.matrix=e.matrixWorld,r.matrixAutoUpdate=!1,r.color=n;for(var i=new _n,a=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1],o=0,s=1;o<32;o++,s++){var c=o/32*Math.PI*2,l=s/32*Math.PI*2;a.push(Math.cos(c),Math.sin(c),1,Math.cos(l),Math.sin(l),1)}i.setAttribute("position",new sn(a,3));var u=new Za({fog:!1,toneMapped:!1});return r.cone=new io(i,u),r.add(r.cone),r.update(),r}ut(e,t);var n=e.prototype;return n.dispose=function(){this.cone.geometry.dispose(),this.cone.material.dispose()},n.update=function(){this.light.updateMatrixWorld();var t=this.light.distance?this.light.distance:1e3,e=t*Math.tan(this.light.angle);this.cone.scale.set(e,e,t),wu.setFromMatrixPosition(this.light.target.matrixWorld),this.cone.lookAt(wu),void 0!==this.color?this.cone.material.color.set(this.color):this.cone.material.color.copy(this.light.color)},e}(we),Su=new Mt,Tu=new Qt,Eu=new Qt,Au=function(t){function e(e){for(var n,r=Lu(e),i=new _n,a=[],o=[],s=new We(0,0,1),c=new We(0,1,0),l=0;l.99999)this.quaternion.set(0,0,0,1);else if(t.y<-.99999)this.quaternion.set(1,0,0,0);else{Qu.set(t.z,0,-t.x).normalize();var e=Math.acos(t.y);this.quaternion.setFromAxisAngle(Qu,e)}},n.setLength=function(t,e,n){void 0===e&&(e=.2*t),void 0===n&&(n=.2*e),this.line.scale.set(1,Math.max(1e-4,t-e),1),this.line.updateMatrix(),this.cone.scale.set(n,e,n),this.cone.position.y=t,this.cone.updateMatrix()},n.setColor=function(t){this.line.material.color.set(t),this.cone.material.color.set(t)},n.copy=function(e){return t.prototype.copy.call(this,e,!1),this.line.copy(e.line),this.cone.copy(e.cone),this},e}(we),$u=function(t){function e(e){var n;void 0===e&&(e=1);var r=[0,0,0,e,0,0,0,0,0,0,e,0,0,0,0,0,0,e],i=new _n;i.setAttribute("position",new sn(r,3)),i.setAttribute("color",new sn([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],3));var a=new Za({vertexColors:!0,toneMapped:!1});return(n=t.call(this,i,a)||this).type="AxesHelper",n}return ut(e,t),e}(io),th=new Float32Array(1),eh=new Int32Array(th.buffer),nh={toHalfFloat:function(t){th[0]=t;var e=eh[0],n=e>>16&32768,r=e>>12&2047,i=e>>23&255;return i<103?n:i>142?(n|=31744,n|=(255==i?0:1)&&8388607&e):i<113?n|=((r|=2048)>>114-i)+(r>>113-i&1):(n|=i-112<<10|r>>1,n+=1&r)}},rh=Math.pow(2,8),ih=[.125,.215,.35,.446,.526,.582],ah=5+ih.length,oh=20,sh=((qu={})[3e3]=0,qu[3001]=1,qu[3002]=2,qu[3004]=3,qu[3005]=4,qu[3006]=5,qu[3007]=6,qu),ch=new rl,lh=_h(),uh=lh._lodPlanes,hh=lh._sizeLods,dh=lh._sigmas,ph=new We,fh=null,mh=(1+Math.sqrt(5))/2,vh=1/mh,gh=[new Mt(1,1,1),new Mt(-1,1,1),new Mt(1,1,-1),new Mt(-1,1,-1),new Mt(0,mh,vh),new Mt(0,mh,-vh),new Mt(vh,0,mh),new Mt(-vh,0,mh),new Mt(mh,vh,0),new Mt(-mh,vh,0)],yh=function(){function t(t){var e,n,r;this._renderer=t,this._pingPongRenderTarget=null,this._blurMaterial=(e=oh,n=new Float32Array(e),r=new Mt(0,1,0),new Ws({name:"SphericalGaussianBlur",defines:{n:e},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:n},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:r},inputEncoding:{value:sh[3e3]},outputEncoding:{value:sh[3e3]}},vertexShader:"\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute vec3 position;\n\t\tattribute vec2 uv;\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t",fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t\n\n\t\tuniform int inputEncoding;\n\t\tuniform int outputEncoding;\n\n\t\t#include \n\n\t\tvec4 inputTexelToLinear( vec4 value ) {\n\n\t\t\tif ( inputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( inputEncoding == 1 ) {\n\n\t\t\t\treturn sRGBToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 2 ) {\n\n\t\t\t\treturn RGBEToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 3 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 7.0 );\n\n\t\t\t} else if ( inputEncoding == 4 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 16.0 );\n\n\t\t\t} else if ( inputEncoding == 5 ) {\n\n\t\t\t\treturn RGBDToLinear( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn GammaToLinear( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 linearToOutputTexel( vec4 value ) {\n\n\t\t\tif ( outputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( outputEncoding == 1 ) {\n\n\t\t\t\treturn LinearTosRGB( value );\n\n\t\t\t} else if ( outputEncoding == 2 ) {\n\n\t\t\t\treturn LinearToRGBE( value );\n\n\t\t\t} else if ( outputEncoding == 3 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 7.0 );\n\n\t\t\t} else if ( outputEncoding == 4 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 16.0 );\n\n\t\t\t} else if ( outputEncoding == 5 ) {\n\n\t\t\t\treturn LinearToRGBD( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn LinearToGamma( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 envMapTexelToLinear( vec4 color ) {\n\n\t\t\treturn inputTexelToLinear( color );\n\n\t\t}\n\t\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t",blending:0,depthTest:!1,depthWrite:!1})),this._equirectShader=null,this._cubemapShader=null,this._compileMaterial(this._blurMaterial)}var e=t.prototype;return e.fromScene=function(t,e,n,r){void 0===e&&(e=0),void 0===n&&(n=.1),void 0===r&&(r=100),fh=this._renderer.getRenderTarget();var i=this._allocateTargets();return this._sceneToCubeUV(t,n,r,i),e>0&&this._blur(i,0,0,e),this._applyPMREM(i),this._cleanup(i),i},e.fromEquirectangular=function(t){return this._fromTexture(t)},e.fromCubemap=function(t){return this._fromTexture(t)},e.compileCubemapShader=function(){null===this._cubemapShader&&(this._cubemapShader=Sh(),this._compileMaterial(this._cubemapShader))},e.compileEquirectangularShader=function(){null===this._equirectShader&&(this._equirectShader=Mh(),this._compileMaterial(this._equirectShader))},e.dispose=function(){this._blurMaterial.dispose(),null!==this._cubemapShader&&this._cubemapShader.dispose(),null!==this._equirectShader&&this._equirectShader.dispose();for(var t=0;t2?rh:0,rh,rh),s.setRenderTarget(r),s.render(t,i)}s.toneMapping=l,s.outputEncoding=c,s.setClearColor(ph,u)},e._textureToCubeUV=function(t,e){var n=this._renderer;t.isCubeTexture?null==this._cubemapShader&&(this._cubemapShader=Sh()):null==this._equirectShader&&(this._equirectShader=Mh());var r=t.isCubeTexture?this._cubemapShader:this._equirectShader,i=new Fn(uh[0],r),a=r.uniforms;a.envMap.value=t,t.isCubeTexture||a.texelSize.value.set(1/t.image.width,1/t.image.height),a.inputEncoding.value=sh[t.encoding],a.outputEncoding.value=sh[e.texture.encoding],wh(e,0,0,3*rh,2*rh),n.setRenderTarget(e),n.render(i,ch)},e._applyPMREM=function(t){var e=this._renderer,n=e.autoClear;e.autoClear=!1;for(var r=1;roh&&console.warn("sigmaRadians, "+i+", is too large and will clip, as it requested "+f+" samples when the maximum is set to "+oh);for(var m=[],v=0,g=0;g4?r-8+4:0),3*b,2*b),s.setRenderTarget(e),s.render(l,ch)},t}();function xh(t){return void 0!==t&&t.type===y&&(t.encoding===q||t.encoding===X||t.encoding===Y)}function _h(){for(var t=[],e=[],n=[],r=8,i=0;i4?o=ih[i-8+4-1]:0==i&&(o=0),n.push(o);for(var s=1/(a-1),c=-s/2,l=1+s/2,u=[c,c,l,c,l,l,c,c,l,l,c,l],h=new Float32Array(108),d=new Float32Array(72),p=new Float32Array(36),f=0;f<6;f++){var m=f%3*2/3-1,v=f>2?0:-1,g=[m,v,0,m+2/3,v,0,m+2/3,v+1,0,m,v,0,m+2/3,v+1,0,m,v+1,0];h.set(g,18*f),d.set(u,12*f);var y=[f,f,f,f,f,f];p.set(y,6*f)}var x=new _n;x.setAttribute("position",new Qe(h,3)),x.setAttribute("uv",new Qe(d,2)),x.setAttribute("faceIndex",new Qe(p,1)),t.push(x),r>4&&r--}return{_lodPlanes:t,_sizeLods:e,_sigmas:n}}function bh(t){var e=new _t(3*rh,3*rh,t);return e.texture.mapping=s,e.texture.name="PMREM.cubeUv",e.scissorTest=!0,e}function wh(t,e,n,r,i){t.viewport.set(e,n,r,i),t.scissor.set(e,n,r,i)}function Mh(){return new Ws({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null},texelSize:{value:new pt(1,1)},inputEncoding:{value:sh[3e3]},outputEncoding:{value:sh[3e3]}},vertexShader:"\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute vec3 position;\n\t\tattribute vec2 uv;\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t",fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform vec2 texelSize;\n\n\t\t\t\n\n\t\tuniform int inputEncoding;\n\t\tuniform int outputEncoding;\n\n\t\t#include \n\n\t\tvec4 inputTexelToLinear( vec4 value ) {\n\n\t\t\tif ( inputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( inputEncoding == 1 ) {\n\n\t\t\t\treturn sRGBToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 2 ) {\n\n\t\t\t\treturn RGBEToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 3 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 7.0 );\n\n\t\t\t} else if ( inputEncoding == 4 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 16.0 );\n\n\t\t\t} else if ( inputEncoding == 5 ) {\n\n\t\t\t\treturn RGBDToLinear( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn GammaToLinear( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 linearToOutputTexel( vec4 value ) {\n\n\t\t\tif ( outputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( outputEncoding == 1 ) {\n\n\t\t\t\treturn LinearTosRGB( value );\n\n\t\t\t} else if ( outputEncoding == 2 ) {\n\n\t\t\t\treturn LinearToRGBE( value );\n\n\t\t\t} else if ( outputEncoding == 3 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 7.0 );\n\n\t\t\t} else if ( outputEncoding == 4 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 16.0 );\n\n\t\t\t} else if ( outputEncoding == 5 ) {\n\n\t\t\t\treturn LinearToRGBD( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn LinearToGamma( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 envMapTexelToLinear( vec4 color ) {\n\n\t\t\treturn inputTexelToLinear( color );\n\n\t\t}\n\t\n\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tvec2 f = fract( uv / texelSize - 0.5 );\n\t\t\t\tuv -= f * texelSize;\n\t\t\t\tvec3 tl = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.x += texelSize.x;\n\t\t\t\tvec3 tr = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.y += texelSize.y;\n\t\t\t\tvec3 br = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.x -= texelSize.x;\n\t\t\t\tvec3 bl = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\n\t\t\t\tvec3 tm = mix( tl, tr, f.x );\n\t\t\t\tvec3 bm = mix( bl, br, f.x );\n\t\t\t\tgl_FragColor.rgb = mix( tm, bm, f.y );\n\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t",blending:0,depthTest:!1,depthWrite:!1})}function Sh(){return new Ws({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},inputEncoding:{value:sh[3e3]},outputEncoding:{value:sh[3e3]}},vertexShader:"\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute vec3 position;\n\t\tattribute vec2 uv;\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t",fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\t\n\n\t\tuniform int inputEncoding;\n\t\tuniform int outputEncoding;\n\n\t\t#include \n\n\t\tvec4 inputTexelToLinear( vec4 value ) {\n\n\t\t\tif ( inputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( inputEncoding == 1 ) {\n\n\t\t\t\treturn sRGBToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 2 ) {\n\n\t\t\t\treturn RGBEToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 3 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 7.0 );\n\n\t\t\t} else if ( inputEncoding == 4 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 16.0 );\n\n\t\t\t} else if ( inputEncoding == 5 ) {\n\n\t\t\t\treturn RGBDToLinear( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn GammaToLinear( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 linearToOutputTexel( vec4 value ) {\n\n\t\t\tif ( outputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( outputEncoding == 1 ) {\n\n\t\t\t\treturn LinearTosRGB( value );\n\n\t\t\t} else if ( outputEncoding == 2 ) {\n\n\t\t\t\treturn LinearToRGBE( value );\n\n\t\t\t} else if ( outputEncoding == 3 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 7.0 );\n\n\t\t\t} else if ( outputEncoding == 4 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 16.0 );\n\n\t\t\t} else if ( outputEncoding == 5 ) {\n\n\t\t\t\treturn LinearToRGBD( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn LinearToGamma( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 envMapTexelToLinear( vec4 color ) {\n\n\t\t\treturn inputTexelToLinear( color );\n\n\t\t}\n\t\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb = envMapTexelToLinear( textureCube( envMap, vec3( - vOutputDirection.x, vOutputDirection.yz ) ) ).rgb;\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t",blending:0,depthTest:!1,depthWrite:!1})}function Th(t){console.warn("THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead."),Oc.call(this,t),this.type="catmullrom",this.closed=!0}function Eh(t){console.warn("THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead."),Oc.call(this,t),this.type="catmullrom"}function Ah(t){console.warn("THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead."),Oc.call(this,t),this.type="catmullrom"}Ac.create=function(t,e){return console.log("THREE.Curve.create() has been deprecated"),t.prototype=Object.create(Ac.prototype),t.prototype.constructor=t,t.prototype.getPoint=e,t},Object.assign(Xc.prototype,{createPointsGeometry:function(t){console.warn("THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");var e=this.getPoints(t);return this.createGeometry(e)},createSpacedPointsGeometry:function(t){console.warn("THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");var e=this.getSpacedPoints(t);return this.createGeometry(e)},createGeometry:function(t){console.warn("THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");for(var e=new wo,n=0,r=t.length;n. + +***********************************************************************/ + +var map_tiletype_resolution; +var tiletype_palette = []; +var tiletype_hash = -1; +var map_texture; + +/**************************************************************************** + Returns a texture containing each map tile, where the color of each pixel + indicates which Freeciv tile type the pixel is. +****************************************************************************/ +function init_map_tiletype_image() +{ + for (var terrain_id in terrains) { + tiletype_palette.push([terrain_id * 10, 0, 0]); //no river + tiletype_palette.push([terrain_id * 10, 10, 0]); //river + } + bmp_lib.render('map_tiletype_grid', + generate_map_tiletype_grid(), + tiletype_palette); + map_texture = new THREE.Texture(); + map_texture.magFilter = THREE.NearestFilter; + map_texture.minFilter = THREE.NearestFilter; + map_texture.image = document.getElementById("map_tiletype_grid"); + map_texture.image.onload = function () { + map_texture.needsUpdate = true; + }; + + if (graphics_quality == QUALITY_MEDIUM) setInterval(update_tiletypes_image, 80000); + if (graphics_quality == QUALITY_HIGH) setInterval(update_tiletypes_image, 60000); + + tiletype_hash = generate_tiletype_hash(); + + return map_texture; + } + +/**************************************************************************** + +****************************************************************************/ +function generate_map_tiletype_grid() { + + if (graphics_quality == QUALITY_MEDIUM) map_tiletype_resolution = 4096; + if (graphics_quality == QUALITY_HIGH) map_tiletype_resolution = 4096; + + var row; + // The grid of points that make up the image. + var grid = Array(map_tiletype_resolution); + for (row = 0; row < map_tiletype_resolution ; row++) { + grid[row] = Array(map_tiletype_resolution); + } + + for (var x = 0; x < map_tiletype_resolution ; x++) { + for (var y = 0; y < map_tiletype_resolution; y++) { + var gx = Math.floor(map.ysize * x / map_tiletype_resolution); + var gy = Math.floor(map.xsize * y / map_tiletype_resolution); + grid[x][y] = map_tiletype_tile_color(gy, gx); + } + } + + // randomize tile edges + var num_iterations; + var change_probability = 0.6; + if (graphics_quality == QUALITY_MEDIUM) { + num_iterations = 2; + } + if (graphics_quality == QUALITY_HIGH) { + num_iterations = 4; + } + for (var i = 0; i < num_iterations; i++) { + for (var x = 0; x < map_tiletype_resolution - 2; x++) { + for (var y = 0; y < map_tiletype_resolution - 2; y++) { + if (Math.random() >= change_probability) { + grid[x][y] = grid[x + 2][y + 2]; + } + } + } + } + + return grid; +} + + +/**************************************************************************** + Returns the color of the tile at the given map position. +****************************************************************************/ +function map_tiletype_tile_color(map_x, map_y) +{ + var ptile = map_pos_to_tile(map_x, map_y); + + if (ptile != null && tile_terrain(ptile) != null && !tile_has_extra(ptile, EXTRA_RIVER)) { + return tile_terrain(ptile)['id'] * 2; + } else if (ptile != null && tile_terrain(ptile) != null && tile_has_extra(ptile, EXTRA_RIVER)) { + return tile_terrain(ptile)['id'] * 2 + 1; + } + + return COLOR_OVERVIEW_UNKNOWN; +} + + +/**************************************************************************** + ... +****************************************************************************/ +function update_tiletypes_image() +{ + var hash = generate_tiletype_hash(); + if (hash != tiletype_hash) { + bmp_lib.render('map_tiletype_grid', + generate_map_tiletype_grid(), + tiletype_palette); + map_texture.image = document.getElementById("map_tiletype_grid"); + map_texture.image.onload = function () { + map_texture.needsUpdate = true; + }; + tiletype_hash = hash; + } + + return roads_texture; +} + +/**************************************************************************** + Creates a hash of the map tiletypes. +****************************************************************************/ +function generate_tiletype_hash() { + var hash = 0; + + for (var x = 0; x < map.xsize ; x++) { + for (var y = 0; y < map.ysize; y++) { + hash += map_tiletype_tile_color(x, y); + } + } + return hash; +} diff --git a/freeciv-web/src/main/webapp/javascript/webgl/mapctrl.js b/freeciv-web/src/main/webapp/javascript/webgl/mapctrl.js new file mode 100644 index 000000000..6b3e0ee76 --- /dev/null +++ b/freeciv-web/src/main/webapp/javascript/webgl/mapctrl.js @@ -0,0 +1,312 @@ +/********************************************************************** + Freeciv-web - the web version of Freeciv. http://play.freeciv.org/ + Copyright (C) 2009-2016 The Freeciv-web project + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +***********************************************************************/ + +var timeOfLastPinchZoom = new Date().getTime(); + +/**************************************************************************** + Init WebGL mapctrl. +****************************************************************************/ +function init_webgl_mapctrl() +{ + $("#canvas_div").mousedown(webglOnDocumentMouseDown); + $("#canvas_div").mouseup(webglOnDocumentMouseUp); + $(window).mousemove(mouse_moved_cb); + $('#canvas_div').bind('wheel', webglOnWheel); + + if (is_touch_device()) { + $('#canvas_div').bind('touchstart', webgl_mapview_touch_start); + $('#canvas_div').bind('touchend', webgl_mapview_touch_end); + $('#canvas_div').bind('touchmove', webgl_mapview_touch_move); + } + + window.addEventListener('resize', webglOnWindowResize, false ); + + /* setup zoom in/zoom out*/ + if (is_touch_device()) { + var mc = new Hammer.Manager(document.getElementById('canvas_div')); + mc.add(new Hammer.Pinch({ threshold: 0.1 })); + mc.on("pinch", webgl_mapview_pinch_zoom); + } +} + + +/**************************************************************************** +... +****************************************************************************/ +function webglOnWindowResize() { + + if (camera != null) { + camera.aspect = window.innerWidth / window.innerHeight; + camera.updateProjectionMatrix(); + } + if (maprenderer != null) { + maprenderer.setSize(window.innerWidth, window.innerHeight); + } +} + +/**************************************************************************** +Triggered when the mouse button is clicked UP on the mapview canvas. +****************************************************************************/ +function webglOnDocumentMouseUp( e ) { + + var rightclick = false; + var middleclick = false; + + if (!e) var e = window.event; + if (e.which) { + rightclick = (e.which == 3); + middleclick = (e.which == 2); + } else if (e.button) { + rightclick = (e.button == 2); + middleclick = (e.button == 1 || e.button == 4); + } + + var ptile = webgl_canvas_pos_to_tile(e.clientX, e.clientY - $("#canvas_div").offset().top); + if (ptile == null) return; + + if (rightclick) { + /* right click to recenter. */ + if (!map_select_active || !map_select_setting_enabled) { + context_menu_active = true; + webgl_recenter_button_pressed(ptile); + } else { + context_menu_active = false; + //map_select_units(mouse_x, mouse_y); + } + map_select_active = false; + map_select_check = false; + mapview_mouse_movement = false; + + } else if (!rightclick && !middleclick) { + /* Left mouse button*/ + do_map_click(ptile, SELECT_POPUP, true); + mapview_mouse_movement = false; + update_mouse_cursor(); + } + e.preventDefault(); + keyboard_input = true; +} + +/**************************************************************************** + Triggered when the mouse button is clicked DOWN on the mapview canvas. +****************************************************************************/ +function webglOnDocumentMouseDown(e) { + var rightclick = false; + var middleclick = false; + + if (!e) var e = window.event; + if (e.which) { + rightclick = (e.which == 3); + middleclick = (e.which == 2); + } else if (e.button) { + rightclick = (e.button == 2); + middleclick = (e.button == 1 || e.button == 4); + } + + if (!rightclick && !middleclick) { + /* Left mouse button is down */ + if (goto_active) return; + + var ptile = webgl_canvas_pos_to_tile(e.clientX, e.clientY - $("#canvas_div").offset().top); + set_mouse_touch_started_on_unit(ptile); + check_mouse_drag_unit(ptile); + if (!mouse_touch_started_on_unit) mapview_mouse_movement = true; + mapview_mouse_movement = true; + touch_start_x = mouse_x; + touch_start_y = mouse_y; + + } else if (middleclick || e['altKey']) { + popit(); + return false; + } else if (rightclick && !map_select_active && is_right_mouse_selection_supported()) { + /* The context menu blocks the right click mouse up event on some + * browsers. */ + context_menu_active = false; + mapview_mouse_movement = false; + } +} + + +/**************************************************************************** + Mouse wheel scrolling for map zoom in and zoom out. +****************************************************************************/ +function webglOnWheel(e) { + var new_camera_dx; + var new_camera_dy; + var new_camera_dz; + + var wd = e.originalEvent.deltaY; + + if (wd < 0) { + // zoom in + new_camera_dy = camera_dy - 60; + new_camera_dx = camera_dx - 45; + new_camera_dz = camera_dz - 45; + } else { + // zoom out + new_camera_dy = camera_dy + 60; + new_camera_dx = camera_dx + 45; + new_camera_dz = camera_dz + 45; + } + + if (new_camera_dy < 350 || new_camera_dy > 1500) { + return; + } else { + camera_dx = new_camera_dx; + camera_dy = new_camera_dy; + camera_dz = new_camera_dz; + } + + camera_look_at(camera_current_x, camera_current_y, camera_current_z); +} + + +/**************************************************************************** + Handle zoom in / out on touch device +****************************************************************************/ +function webgl_mapview_pinch_zoom(ev) +{ + timeOfLastPinchZoom = new Date().getTime(); + var new_camera_dx; + var new_camera_dy; + var new_camera_dz; + + if(ev.scale > 1) { + // zoom in + new_camera_dy = camera_dy - 8; + new_camera_dx = camera_dx - 4; + new_camera_dz = camera_dz - 4; + } else{ + // zoom out + new_camera_dy = camera_dy + 8; + new_camera_dx = camera_dx + 4; + new_camera_dz = camera_dz + 4; + } + if (new_camera_dy < 250 || new_camera_dy > 1100) { + return; + } else { + camera_dx = new_camera_dx; + camera_dy = new_camera_dy; + camera_dz = new_camera_dz; + } + + camera_look_at(camera_current_x, camera_current_y, camera_current_z); +} + +/**************************************************************************** + This function is triggered when beginning a touch event on a touch device, + eg. finger down on screen. +****************************************************************************/ +function webgl_mapview_touch_start(e) +{ + e.preventDefault(); + + touch_start_x = e.originalEvent.touches[0].pageX - $('#canvas_div').position().left; + touch_start_y = e.originalEvent.touches[0].pageY - $('#canvas_div').position().top; + + var ptile = webgl_canvas_pos_to_tile(touch_start_x, touch_start_y); + set_mouse_touch_started_on_unit(ptile); +} + +/**************************************************************************** + This function is triggered when ending a touch event on a touch device, + eg finger up from screen. +****************************************************************************/ +function webgl_mapview_touch_end(e) +{ + if (new Date().getTime() - timeOfLastPinchZoom < 400) { + return; + } + webgl_action_button_pressed(touch_start_x, touch_start_y, SELECT_POPUP); +} + +/**************************************************************************** + This function is triggered on a touch move event on a touch device. +****************************************************************************/ +function webgl_mapview_touch_move(e) +{ + mouse_x = e.originalEvent.touches[0].pageX - $('#canvas_div').position().left; + mouse_y = e.originalEvent.touches[0].pageY - $('#canvas_div').position().top; + + var spos = webgl_canvas_pos_to_map_pos(touch_start_x, touch_start_y); + var epos = webgl_canvas_pos_to_map_pos(mouse_x, mouse_y); + + touch_start_x = mouse_x; + touch_start_y = mouse_y; + var ptile = webgl_canvas_pos_to_tile(mouse_x, mouse_y); + if (!goto_active) { + check_mouse_drag_unit(ptile); + } + + if (client.conn.playing == null) return; + + /* Request preview goto path */ + goto_preview_active = true; + if (goto_active && current_focus.length > 0) { + if (ptile != null) { + for (var i = 0; i < current_focus.length; i++) { + if (i >= 20) return; // max 20 units goto a time. + if (goto_request_map[current_focus[i]['id'] + "," + ptile['x'] + "," + ptile['y']] == null) { + request_goto_path(current_focus[i]['id'], ptile['x'], ptile['y']); + } + } + } + return; + } + + if (spos != null && epos != null) { + camera_look_at(camera_current_x + spos['x'] - epos['x'], camera_current_y, camera_current_z + spos['y'] - epos['y']); + } +} + + +/************************************************************************** + Recenter the map on the canvas location, on user request. Usually this + is done with a right-click. +**************************************************************************/ +function webgl_recenter_button_pressed(ptile) +{ + if (can_client_change_view() && ptile != null) { + var sunit = find_visible_unit(ptile); + if (!client_is_observer() && sunit != null + && sunit['owner'] == client.conn.playing.playerno) { + /* the user right-clicked on own unit, show context menu instead of recenter. */ + if (current_focus.length <= 1) set_unit_focus(sunit); + $("#canvas_div").contextMenu(true); + $("#canvas_div").contextmenu(); + } else { + $("#canvas_div").contextMenu(false); + enable_mapview_slide_3d(ptile); + } + } +} + +/************************************************************************** + Do some appropriate action when the "main" mouse button (usually + left-click) is pressed. For more sophisticated user control use (or + write) a different xxx_button_pressed function. +**************************************************************************/ +function webgl_action_button_pressed(canvas_x, canvas_y, qtype) +{ + var ptile = webgl_canvas_pos_to_tile(canvas_x, canvas_y); + + if (can_client_change_view() && ptile != null) { + do_map_click(ptile, qtype, true); + } +} diff --git a/freeciv-web/src/main/webapp/javascript/webgl/maputil.js b/freeciv-web/src/main/webapp/javascript/webgl/maputil.js new file mode 100644 index 000000000..b2211e1b4 --- /dev/null +++ b/freeciv-web/src/main/webapp/javascript/webgl/maputil.js @@ -0,0 +1,99 @@ +/********************************************************************** + Freeciv-web - the web version of Freeciv. http://play.freeciv.org/ + Copyright (C) 2009-2016 The Freeciv-web project + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +***********************************************************************/ + + +/**************************************************************************** + Converts from map to scene coordinates. +****************************************************************************/ +function map_to_scene_coords(x, y) +{ + var result = {}; + result['x'] = Math.floor(-470 + x * mapview_model_width / map['xsize']); + result['y'] = Math.floor(30 + y * mapview_model_height / map['ysize']); + return result; +} + +/**************************************************************************** + Converts from scene to map coordinates. +****************************************************************************/ +function scene_to_map_coords(x, y) +{ + var result = {}; + result['x'] = Math.floor((x + 500) * map['xsize'] / mapview_model_width); + result['y'] = Math.floor((y) * map['ysize'] / mapview_model_height); + return result; +} + + +/**************************************************************************** + Converts from canvas coordinates to a tile. +****************************************************************************/ +function webgl_canvas_pos_to_tile(x, y) { + if (mouse == null || landMesh == null) return null; + + mouse.set( ( x / $('#canvas_div').width() ) * 2 - 1, - ( y / $('#canvas_div').height() ) * 2 + 1); + + raycaster.setFromCamera( mouse, camera ); + + var intersects = raycaster.intersectObject(landMesh); + + for (var i = 0; i < intersects.length; i++) { + var intersect = intersects[i]; + var pos = scene_to_map_coords(intersect.point.x, intersect.point.z); + var ptile = map_pos_to_tile(pos['x'], pos['y']); + if (ptile != null) return ptile; + } + + return null; +} + +/**************************************************************************** + Converts from canvas coordinates to Three.js coordinates. +****************************************************************************/ +function webgl_canvas_pos_to_map_pos(x, y) { + if (mouse == null || landMesh == null) return null; + + mouse.set( ( x / $('#canvas_div').width() ) * 2 - 1, - ( y / $('#canvas_div').height() ) * 2 + 1); + + raycaster.setFromCamera( mouse, camera ); + + var intersects = raycaster.intersectObject(landMesh); + + if (intersects.length > 0) { + var intersect = intersects[0]; + return {'x' : intersect.point.x, 'y' : intersect.point.z}; + } + + return null; +} + +/**************************************************************************** + Converts from unit['facing'] to number of rotations of 1/8 parts of full circle rotations (2PI). +****************************************************************************/ +function convert_unit_rotation(facing_dir) +{ + if (facing_dir == 0) return -3; + if (facing_dir == 1) return -4; + if (facing_dir == 2) return -5; + if (facing_dir == 4) return -6; + if (facing_dir == 7) return -7; + if (facing_dir == 6) return 0; + if (facing_dir == 5) return -1; + if (facing_dir == 3) return -2; +} diff --git a/freeciv-web/src/main/webapp/javascript/webgl/mapview.js b/freeciv-web/src/main/webapp/javascript/webgl/mapview.js new file mode 100644 index 000000000..5485f0476 --- /dev/null +++ b/freeciv-web/src/main/webapp/javascript/webgl/mapview.js @@ -0,0 +1,278 @@ +/********************************************************************** + Freeciv-web - the web version of Freeciv. http://play.freeciv.org/ + Copyright (C) 2009-2017 The Freeciv-web project + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +***********************************************************************/ + +var container, stats; +var scene, maprenderer; +var anaglyph_effect; + +var plane, cube; +var mouse, raycaster; +var directionalLight; +var clock; +var webgl_controls; + +var tiletype_terrains = ["lake","coast","floor","arctic","desert","forest","grassland","hills","jungle","mountains","plains","swamp","tundra", "beach"]; + +var landGeometry; +var landMesh; +var water; + +var start_webgl; + +var mapview_model_width; +var mapview_model_height; +var xquality; +var yquality; +var MAPVIEW_ASPECT_FACTOR = 35.71; + + +/**************************************************************************** + Start the Freeciv-web WebGL renderer +****************************************************************************/ +function webgl_start_renderer() +{ + var new_mapview_width = $(window).width() - width_offset; + var new_mapview_height; + if (!is_small_screen()) { + new_mapview_height = $(window).height() - height_offset; + } else { + new_mapview_height = $(window).height() - height_offset - 40; + } + + if (!Detector.webgl) { + swal("3D WebGL not supported by your browser or you don't have a 3D graphics card. Please go back and try the 2D version instead. "); + return; + } + + container = document.getElementById('canvas_div'); + camera = new THREE.PerspectiveCamera( 45, new_mapview_width / new_mapview_height, 1, 10000 ); + scene = new THREE.Scene(); + + raycaster = new THREE.Raycaster(); + mouse = new THREE.Vector2(); + + clock = new THREE.Clock(); + + // Lights + var ambientLight = new THREE.AmbientLight( 0x606060, 3.2 ); + scene.add(ambientLight); + + directionalLight = new THREE.DirectionalLight( 0xffffff, 3.6 ); + directionalLight.position.set( 0.5, 0.75, 1.0 ).normalize(); + scene.add( directionalLight ); + + var enable_antialiasing = graphics_quality >= QUALITY_MEDIUM; + var stored_antialiasing_setting = simpleStorage.get("antialiasing_setting", ""); + if (stored_antialiasing_setting != null && stored_antialiasing_setting == "false") { + enable_antialiasing = false; + } + + maprenderer = new THREE.WebGLRenderer( { antialias: enable_antialiasing } ); + + if (is_small_screen() || $(window).width() <= 1366) { + camera_dy = 390; + camera_dx = 180; + camera_dz = 180; + } + + maprenderer.setClearColor(0x000000); + maprenderer.setPixelRatio(window.devicePixelRatio); + maprenderer.setSize(new_mapview_width, new_mapview_height); + container.appendChild(maprenderer.domElement); + + if (anaglyph_3d_enabled) { + anaglyph_effect = new THREE.AnaglyphEffect( maprenderer ); + anaglyph_effect.setSize( new_mapview_width, new_mapview_height ); + } + + if (fcwDebug && Detector.webgl) { + stats = new Stats(); + container.appendChild( stats.dom ); + console.log("MAX_FRAGMENT_UNIFORM_VECTORS:" + maprenderer.context.getParameter(maprenderer.context.MAX_FRAGMENT_UNIFORM_VECTORS)); + } + + animate(); +} + + +/**************************************************************************** + This will render the map terrain mesh. +****************************************************************************/ +function init_webgl_mapview() { + start_webgl = new Date().getTime(); + + selected_unit_material = new THREE.MeshBasicMaterial( { color: 0xf6f7bf, transparent: true, opacity: 0.5} ); + + var textureLoader = new THREE.TextureLoader(); + var waterGeometry = new THREE.PlaneBufferGeometry( mapview_model_width - 10, mapview_model_height - 10 ); + + water = new THREE.Water(waterGeometry, { + color: '#ddddff', + scale: 8, + flowDirection: new THREE.Vector2( 0.1, -0.1), + textureWidth: 1024, + textureHeight: 1024, + reflectivity : 0.02, + clipBias : 0.1, + normalMap0 : textureLoader.load( '/textures/Water_1_M_Normal.jpg' ), + normalMap1 : textureLoader.load( '/textures/Water_2_M_Normal.jpg' ) + + } ); + + water.rotation.x = - Math.PI * 0.5; + water.translateOnAxis(new THREE.Vector3(0,0,1).normalize(), 50); + water.translateOnAxis(new THREE.Vector3(1,0,0).normalize(), Math.floor(mapview_model_width / 2) - 500); + water.translateOnAxis(new THREE.Vector3(0,1,0).normalize(), -mapview_model_height / 2); + scene.add( water ); + + var sunGeometry = new THREE.PlaneGeometry( 1000, 1000, 2, 2); + sunGeometry.rotateX( Math.PI / 2 ); + sunGeometry.translate(Math.floor(mapview_model_width / 2) - 500, 800, Math.floor(mapview_model_height / 3)); + var sunMesh = new THREE.Mesh( sunGeometry, webgl_materials['sun'] ); + scene.add(sunMesh); + + /* heightmap image */ + create_heightmap(); + init_borders_image(); + init_roads_image(); + + /* uniforms are variables which are used in the fragment shader fragment.js */ + var freeciv_uniforms = { + maptiles: { type: "t", value: init_map_tiletype_image() }, + borders: { type: "t", value: update_borders_image() }, + map_x_size: { type: "f", value: map['xsize'] }, + map_y_size: { type: "f", value: map['ysize'] }, + terrains: {type: "t", value: webgl_textures["terrains"]}, + roadsmap: { type: "t", value: update_roads_image()}, + roadsprites: {type: "t", value: webgl_textures["roads"]}, + railroadsprites: {type: "t", value: webgl_textures["railroads"]} + + }; + + /* create a WebGL shader for terrain. */ + var terrain_material = new THREE.ShaderMaterial({ + uniforms: freeciv_uniforms, + vertexShader: document.getElementById('terrain_vertex_shh').innerHTML, + fragmentShader: document.getElementById('terrain_fragment_shh').innerHTML, + vertexColors: THREE.VertexColors + }); + + xquality = map.xsize * 4 + 1; + yquality = map.ysize * 4 + 1; + + /* LandGeometry is a plane representing the landscape of the map. */ + landGeometry = new THREE.PlaneGeometry(mapview_model_width, mapview_model_height, xquality - 1, yquality - 1); + landGeometry.rotateX( - Math.PI / 2 ); + landGeometry.translate(Math.floor(mapview_model_width / 2) - 500, 0, Math.floor(mapview_model_height / 2)); + for ( var i = 0, l = landGeometry.vertices.length; i < l; i ++ ) { + var x = i % xquality, y = Math.floor( i / xquality ); + if (heightmap[x] != null && heightmap[x][y] != null) { + landGeometry.vertices[ i ].y = heightmap[x][y] * 100; + } + if (x == xquality - 1 && landGeometry.vertices[ i ].y >= 54) landGeometry.vertices[ i ].y = 54; + if (y == yquality - 1 && landGeometry.vertices[ i ].y >= 54) landGeometry.vertices[ i ].y = 54; + } + landGeometry.computeVertexNormals(); + landMesh = new THREE.Mesh( landGeometry, terrain_material ); + scene.add( landMesh ); + + for ( var i = 0; i < landGeometry.faces.length; i ++ ) { + var v = ['a', 'b', 'c']; + var vertex_colors = []; + for (var r = 0; r < v.length; r++) { + var vertex = landGeometry.vertices[landGeometry.faces[i][v[r]]]; + var vPos = landMesh.localToWorld(vertex); + var mapPos = scene_to_map_coords(vPos.x, vPos.z); + if (mapPos['x'] >= 0 && mapPos['y'] >= 0) { + var ptile = map_pos_to_tile(mapPos['x'], mapPos['y']); + if (ptile == null) { + vertex_colors.push(new THREE.Color(0,0,0)); + } else if (tile_get_known(ptile) == TILE_KNOWN_SEEN) { + vertex_colors.push(new THREE.Color(1,0,0)); + } else if (tile_get_known(ptile) == TILE_KNOWN_UNSEEN) { + vertex_colors.push(new THREE.Color(0.40,0,0)); + } else if (tile_get_known(ptile) == TILE_UNKNOWN) { + vertex_colors.push(new THREE.Color(0,0,0)); + } else { + vertex_colors.push(new THREE.Color(0,0,0)); + } + } else { + vertex_colors.push(new THREE.Color(0,0,0)); + } + } + landGeometry.faces[i].vertexColors = vertex_colors; + } + if (graphics_quality == QUALITY_HIGH) { + setInterval(update_tiles_known_vertex_colors, 350); + } else { + setInterval(update_tiles_known_vertex_colors, 1200); + } + + + add_trees_to_landgeometry(landGeometry, xquality); + + add_all_objects_to_scene(); + + // cleanup + heightmap = {}; + for (var i = 0; i < tiletype_terrains.length; i++) { + webgl_textures[tiletype_terrains[i]] = null; + } + webgl_textures = {}; + $.unblockUI(); + console.log("init_webgl_mapview took: " + (new Date().getTime() - start_webgl) + " ms."); + + benchmark_start = new Date().getTime(); + setTimeout(initial_benchmark_check, 10000); +} + +/**************************************************************************** + Main animation method +****************************************************************************/ +function animate() { + if (scene == null) return; + if (stats != null) stats.begin(); + if (mapview_slide['active']) update_map_slide_3d(); + + update_animated_objects(); + + + if (selected_unit_indicator != null && selected_unit_material != null) { + selected_unit_material.color.multiplyScalar (0.994); + if (selected_unit_material_counter > 80) { + selected_unit_material_counter = 0; + selected_unit_material.color.setHex(0xf6f7bf); + } + selected_unit_material_counter++; + } + + if (anaglyph_3d_enabled) { + anaglyph_effect.render(scene,camera ); + } else { + maprenderer.render(scene,camera ); + } + + if (goto_active) check_request_goto_path(); + if (stats != null) stats.end(); + if (initial_benchmark_enabled || benchmark_enabled) benchmark_frames_count++; + + if (webgl_controls != null && clock != null) webgl_controls.update(clock.getDelta()); + + requestAnimationFrame(animate); +} diff --git a/freeciv-web/src/main/webapp/javascript/webgl/object_position_handler.js b/freeciv-web/src/main/webapp/javascript/webgl/object_position_handler.js new file mode 100644 index 000000000..a685049a4 --- /dev/null +++ b/freeciv-web/src/main/webapp/javascript/webgl/object_position_handler.js @@ -0,0 +1,577 @@ +/********************************************************************** + Freeciv-web - the web version of Freeciv. http://play.freeciv.org/ + Copyright (C) 2009-2016 The Freeciv-web project + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +***********************************************************************/ + +// stores unit positions on the map. tile index is key, unit 3d model is value. +var unit_positions = {}; +// stores city positions on the map. tile index is key, unit 3d model is value. +var city_positions = {}; +var city_label_positions = {}; +var city_walls_positions = {}; +var city_disorder_positions = {}; + +// stores flag positions on the map. tile index is key, unit 3d model is value. +var unit_flag_positions = {}; +var unit_label_positions = {}; +var unit_activities_positions = {}; + +var map_tile_label_positions = {}; + +var unit_health_positions = {}; +var unit_healthpercentage_positions = {}; + +var forest_positions = {}; // tile index is key, boolean is value. +var jungle_positions = {}; // tile index is key, boolean is value. + +// stores tile extras (eg specials), key is extra + "." + tile_index. +var tile_extra_positions = {}; + +var selected_unit_indicator = null; +var selected_unit_material = null; +var selected_unit_material_counter = 0; + +/**************************************************************************** + Handles unit positions +****************************************************************************/ +function update_unit_position(ptile) { + if (renderer != RENDERER_WEBGL) return; + + var visible_unit = find_visible_unit(ptile); + var height = 5 + ptile['height'] * 100 + get_unit_height_offset(visible_unit); + + if (unit_positions[ptile['index']] != null && visible_unit == null) { + // tile has no visible units, remove it from unit_positions. + if (scene != null) scene.remove(unit_positions[ptile['index']]); + delete unit_positions[ptile['index']]; + + if (scene != null) scene.remove(unit_flag_positions[ptile['index']]); + delete unit_flag_positions[ptile['index']]; + + if (scene != null) scene.remove(unit_label_positions[ptile['index']]); + delete unit_label_positions[ptile['index']]; + unit_activities_positions[ptile['index']] = null; + + if (scene != null) scene.remove(unit_health_positions[ptile['index']]); + delete unit_health_positions[ptile['index']]; + unit_healthpercentage_positions[ptile['index']] = null; + } + + if (unit_positions[ptile['index']] == null && visible_unit != null) { + // add new unit to the unit_positions + var unit_type_name = unit_type(visible_unit)['name']; + if (unit_type_name == null) { + console.error(unit_type_name + " model not loaded correcly."); + return; + } + + var new_unit = webgl_get_model(unit_type_name); + if (new_unit == null) return; + unit_positions[ptile['index']] = new_unit; + var pos; + if (visible_unit['anim_list'].length > 0) { + var stile = tiles[visible_unit['anim_list'][0]['tile']]; + pos = map_to_scene_coords(stile['x'], stile['y']); + height = 5 + stile['height'] * 100 + get_unit_height_offset(visible_unit); + } else { + pos = map_to_scene_coords(ptile['x'], ptile['y']); + } + new_unit.matrixAutoUpdate = false; + new_unit.translateOnAxis(new THREE.Vector3(1,0,0).normalize(), pos['x'] - 4); + new_unit.translateOnAxis(new THREE.Vector3(0,1,0).normalize(), height - 2); + new_unit.translateOnAxis(new THREE.Vector3(0,0,1).normalize(), pos['y'] - 4); + var rnd_rotation = Math.floor(Math.random() * 8); + new_unit.rotateOnAxis(new THREE.Vector3(0,1,0).normalize(), (convert_unit_rotation(rnd_rotation) * Math.PI * 2 / 8)); + new_unit.updateMatrix(); + + if (scene != null) { + scene.add(new_unit); + } + /* add flag. */ + var pflag = get_unit_nation_flag_sprite(visible_unit, {'x': unit_offset_x , 'y': unit_offset_y}); + var new_flag; + if (unit_flag_positions[ptile['index']] == null) { + new_flag = get_flag_shield_mesh(pflag['key']); + new_flag.matrixAutoUpdate = false; + unit_flag_positions[ptile['index']] = new_flag; + new_flag.translateOnAxis(new THREE.Vector3(1,0,0).normalize(), pos['x'] - 10); + new_flag.translateOnAxis(new THREE.Vector3(0,1,0).normalize(), height + 20); + new_flag.translateOnAxis(new THREE.Vector3(0,0,1).normalize(), pos['y'] - 10); + new_flag.rotation.y = Math.PI / 4; + new_flag.updateMatrix(); + if (scene != null && new_flag != null) { + scene.add(new_flag); + } + } + + /* indicate focus unit*/ + var funit = get_focus_unit_on_tile(ptile); + var selected_mesh; + if (scene != null && funit != null && funit['id'] == visible_unit['id']) { + if (selected_unit_indicator != null) { + scene.remove(selected_unit_indicator); + selected_unit_indicator = null; + } + if (visible_unit['anim_list'].length == 0) { + selected_mesh = new THREE.Mesh( new THREE.RingBufferGeometry( 13, 25, 24), selected_unit_material ); + selected_mesh.translateOnAxis(new THREE.Vector3(1,0,0).normalize(), pos['x'] - 2); + selected_mesh.translateOnAxis(new THREE.Vector3(0,1,0).normalize(), height + 10); + selected_mesh.translateOnAxis(new THREE.Vector3(0,0,1).normalize(), pos['y'] - 2); + selected_mesh.rotation.x = -1 * Math.PI / 2; + scene.add(selected_mesh); + selected_unit_indicator = selected_mesh; + } + } + + anim_objs[visible_unit['id']] = {'unit' : visible_unit['id'], 'mesh' : new_unit, 'flag' : new_flag}; + + + } else if (unit_positions[ptile['index']] != null && visible_unit != null) { + // Update of visible unit. + // TODO: update_unit_position() contains _almost_ the same code twice. this is the duplicate part. + var unit_type_name = unit_type(visible_unit)['name']; + var pos; + if (visible_unit['anim_list'].length > 0) { + var stile = tiles[visible_unit['anim_list'][0]['tile']]; + pos = map_to_scene_coords(stile['x'], stile['y']); + height = 5 + stile['height'] * 100 + get_unit_height_offset(visible_unit); + } else { + pos = map_to_scene_coords(ptile['x'], ptile['y']); + } + + if (scene != null) scene.remove(unit_positions[ptile['index']]); + delete unit_positions[ptile['index']]; + + if (scene != null && unit_flag_positions[ptile['index']] != null) scene.remove(unit_flag_positions[ptile['index']]); + delete unit_flag_positions[ptile['index']]; + + + var activity; + if (unit_activities_positions[ptile['index']] != get_unit_activity_text(visible_unit) && visible_unit['anim_list'].length == 0) { + // add unit activity label + if (scene != null && unit_label_positions[ptile['index']] != null) scene.remove(unit_label_positions[ptile['index']]); + if (get_unit_activity_text(visible_unit) != null) { + activity = create_unit_label(visible_unit); + if (activity != null) { + activity.matrixAutoUpdate = false; + activity.translateOnAxis(new THREE.Vector3(1,0,0).normalize(), pos['x'] + 8); + activity.translateOnAxis(new THREE.Vector3(0,1,0).normalize(), height + 28); + activity.translateOnAxis(new THREE.Vector3(0,0,1).normalize(), pos['y'] - 5); + activity.rotation.y = Math.PI / 4; + activity.updateMatrix(); + if (scene != null) scene.add(activity); + unit_label_positions[ptile['index']] = activity; + } + } + unit_activities_positions[ptile['index']] = get_unit_activity_text(visible_unit); + } + + var new_unit_health_bar; + if (unit_healthpercentage_positions[ptile['index']] != visible_unit['hp'] && visible_unit['anim_list'].length == 0) { + if (scene != null && unit_health_positions[ptile['index']] != null) scene.remove(unit_health_positions[ptile['index']]); + new_unit_health_bar = get_unit_health_mesh(visible_unit); + new_unit_health_bar.matrixAutoUpdate = false; + unit_health_positions[ptile['index']] = new_unit_health_bar; + new_unit_health_bar.translateOnAxis(new THREE.Vector3(1,0,0).normalize(), pos['x'] - 10); + new_unit_health_bar.translateOnAxis(new THREE.Vector3(0,1,0).normalize(), height + 26); + new_unit_health_bar.translateOnAxis(new THREE.Vector3(0,0,1).normalize(), pos['y'] - 10); + new_unit_health_bar.rotation.y = Math.PI / 4; + new_unit_health_bar.updateMatrix(); + if (scene != null && new_unit_health_bar != null) { + scene.add(new_unit_health_bar); + } + unit_healthpercentage_positions[ptile['index']] = visible_unit['hp']; + } + + /* indicate focus unit*/ + var funit = get_focus_unit_on_tile(ptile); + var selected_mesh; + if (scene != null && funit != null && funit['id'] == visible_unit['id']) { + if (selected_unit_indicator != null) { + scene.remove(selected_unit_indicator); + selected_unit_indicator = null; + } + if (visible_unit['anim_list'].length == 0) { + selected_mesh = new THREE.Mesh( new THREE.RingBufferGeometry( 13, 24, 20), selected_unit_material ); + selected_mesh.translateOnAxis(new THREE.Vector3(1,0,0).normalize(), pos['x'] - 2); + selected_mesh.translateOnAxis(new THREE.Vector3(0,1,0).normalize(), height + 10); + selected_mesh.translateOnAxis(new THREE.Vector3(0,0,1).normalize(), pos['y'] - 2); + selected_mesh.rotation.x = -1 * Math.PI / 2; + scene.add(selected_mesh); + selected_unit_indicator = selected_mesh; + } + } + + if (unit_type_name == null) { + console.error(unit_type_name + " model not loaded correcly."); + return; + } + + var new_unit = webgl_get_model(unit_type_name); + if (new_unit == null) return; + unit_positions[ptile['index']] = new_unit; + unit_positions[ptile['index']]['unit_type'] = unit_type_name; + + new_unit.matrixAutoUpdate = false; + new_unit.translateOnAxis(new THREE.Vector3(1,0,0).normalize(), pos['x'] - 4); + new_unit.translateOnAxis(new THREE.Vector3(0,1,0).normalize(), height - 2); + new_unit.translateOnAxis(new THREE.Vector3(0,0,1).normalize(), pos['y'] - 4); + new_unit.rotateOnAxis(new THREE.Vector3(0,1,0).normalize(), (convert_unit_rotation(visible_unit['facing']) * Math.PI * 2 / 8)); + new_unit.updateMatrix(); + + if (scene != null && new_unit != null) { + scene.add(new_unit); + } + + /* add flag. */ + var pflag = get_unit_nation_flag_sprite(visible_unit, {'x': unit_offset_x , 'y': unit_offset_y}); + var new_flag; + if (unit_flag_positions[ptile['index']] == null) { + new_flag = get_flag_shield_mesh(pflag['key']); + new_flag.matrixAutoUpdate = false; + unit_flag_positions[ptile['index']] = new_flag; + new_flag.translateOnAxis(new THREE.Vector3(1,0,0).normalize(), pos['x'] - 10); + new_flag.translateOnAxis(new THREE.Vector3(0,1,0).normalize(), height + 20); + new_flag.translateOnAxis(new THREE.Vector3(0,0,1).normalize(), pos['y'] - 10); + new_flag.rotation.y = Math.PI / 4; + new_flag.updateMatrix(); + if (scene != null && new_flag != null) { + scene.add(new_flag); + } + } + + anim_objs[visible_unit['id']] = {'unit' : visible_unit['id'], 'mesh' : new_unit, 'flag' : new_flag}; + } + +} + +/**************************************************************************** + Handles city positions +****************************************************************************/ +function update_city_position(ptile) { + if (renderer != RENDERER_WEBGL) return; + + var pcity = tile_city(ptile); + var punits = tile_units(ptile); + + var height = 5 + ptile['height'] * 100 + get_city_height_offset(pcity); + + if (city_positions[ptile['index']] != null && pcity == null) { + // tile has no city, remove it from unit_positions. + if (scene != null) scene.remove(city_positions[ptile['index']]); + delete city_positions[ptile['index']]; + if (scene != null) scene.remove(city_label_positions[ptile['index']]); + delete city_label_positions[ptile['index']]; + if (scene != null) scene.remove(city_walls_positions[ptile['index']]); + delete city_walls_positions[ptile['index']]; + if (scene != null && city_disorder_positions[ptile['index']] != null) scene.remove(city_disorder_positions[ptile['index']]); + delete city_disorder_positions[ptile['index']]; + } + + if (city_positions[ptile['index']] == null && pcity != null) { + // add new city + var model_name = city_to_3d_model_name(pcity); + pcity['webgl_model_name'] = model_name; + var new_city = webgl_get_model(model_name); + if (new_city == null) return; + city_positions[ptile['index']] = new_city; + + var pos = map_to_scene_coords(ptile['x'], ptile['y']); + new_city.translateOnAxis(new THREE.Vector3(1,0,0).normalize(), pos['x'] - 10); + new_city.translateOnAxis(new THREE.Vector3(0,1,0).normalize(), height); + new_city.translateOnAxis(new THREE.Vector3(0,0,1).normalize(), pos['y'] - 10); + new_city.rotateOnAxis(new THREE.Vector3(0,1,0).normalize(), (2 * Math.PI * Math.random())); + + if (scene != null) { + scene.add(new_city); + } + + if (scene != null && pcity['walls'] && city_walls_positions[ptile['index']] == null) { + var city_walls = webgl_get_model("citywalls"); + if (city_walls != null) { + city_walls.translateOnAxis(new THREE.Vector3(1,0,0).normalize(), pos['x'] - 10); + city_walls.translateOnAxis(new THREE.Vector3(0,1,0).normalize(), height); + city_walls.translateOnAxis(new THREE.Vector3(0,0,1).normalize(), pos['y'] - 10); + city_walls.scale.x = city_walls.scale.y = city_walls.scale.z = get_citywalls_scale(pcity); + scene.add(city_walls); + city_walls_positions[ptile['index']] = city_walls; + } + } + + var city_label = create_city_label(pcity); + city_label_positions[ptile['index']] = city_label; + city_label.translateOnAxis(new THREE.Vector3(1,0,0).normalize(), pos['x'] - 5); + city_label.translateOnAxis(new THREE.Vector3(0,1,0).normalize(), height + 39); + city_label.translateOnAxis(new THREE.Vector3(0,0,1).normalize(), pos['y'] - 15); + city_label.rotation.y = Math.PI / 4; + pcity['webgl_label_hash'] = pcity['name'] + pcity['size'] + pcity['production_value'] + "." + pcity['production_kind'] + punits.length; + if (scene != null) scene.add(city_label); + return; + } + + if (city_positions[ptile['index']] != null && pcity != null) { + // Update of visible city. + var model_name = city_to_3d_model_name(pcity); + if (pcity['webgl_model_name'] != model_name) { + // update city model to a different size. + if (scene != null) scene.remove(city_positions[ptile['index']]); + pcity['webgl_model_name'] = model_name; + var new_city = webgl_get_model(model_name); + if (new_city == null) return; + city_positions[ptile['index']] = new_city; + + var pos = map_to_scene_coords(ptile['x'], ptile['y']); + new_city.translateOnAxis(new THREE.Vector3(1,0,0).normalize(), pos['x'] - 10); + new_city.translateOnAxis(new THREE.Vector3(0,1,0).normalize(), height); + new_city.translateOnAxis(new THREE.Vector3(0,0,1).normalize(), pos['y'] - 10); + new_city.rotateOnAxis(new THREE.Vector3(0,1,0).normalize(), (2 * Math.PI * Math.random())); + + if (scene != null) { + scene.add(new_city); + } + + if (scene != null && pcity['walls'] && city_walls_positions[ptile['index']] != null) { + // remove city walls, they need updating. + scene.remove(city_walls_positions[ptile['index']]); + delete city_walls_positions[ptile['index']]; + } + } + var pos = map_to_scene_coords(ptile['x'], ptile['y']); + + if (scene != null && pcity['walls'] && city_walls_positions[ptile['index']] == null) { + var city_walls = webgl_get_model("citywalls"); + if (city_walls != null) { + city_walls.translateOnAxis(new THREE.Vector3(1,0,0).normalize(), pos['x'] - 10); + city_walls.translateOnAxis(new THREE.Vector3(0,1,0).normalize(), height); + city_walls.translateOnAxis(new THREE.Vector3(0,0,1).normalize(), pos['y'] - 10); + city_walls.scale.x = city_walls.scale.y = city_walls.scale.z = get_citywalls_scale(pcity); + scene.add(city_walls); + city_walls_positions[ptile['index']] = city_walls; + } + } + + if (pcity['webgl_label_hash'] != pcity['name'] + pcity['size'] + pcity['production_value'] + "." + pcity['production_kind'] + punits.length) { + update_city_label(pcity); + pcity['webgl_label_hash'] = pcity['name'] + pcity['size'] + pcity['production_value'] + "." + pcity['production_kind'] + punits.length; + } + } + + // City civil disorder label + if (scene != null && pcity != null) { + if (city_disorder_positions[ptile['index']] == null && pcity['unhappy']) { + var city_disorder_label = create_city_disorder_label(); + if (city_disorder_label != null) { + city_disorder_label.matrixAutoUpdate = false; + city_disorder_label.translateOnAxis(new THREE.Vector3(1,0,0).normalize(), pos['x'] - 5); + city_disorder_label.translateOnAxis(new THREE.Vector3(0,1,0).normalize(), height + 25); + city_disorder_label.translateOnAxis(new THREE.Vector3(0,0,1).normalize(), pos['y'] - 10); + city_disorder_label.rotation.y = Math.PI / 4; + city_disorder_label.updateMatrix(); + if (scene != null) scene.add(city_disorder_label); + city_disorder_positions[ptile['index']] = city_disorder_label; + } + } else if (city_disorder_positions[ptile['index']] != null && !pcity['unhappy']) { + // Remove city civil disorder label + scene.remove(city_disorder_positions[ptile['index']]); + delete city_disorder_positions[ptile['index']]; + } + } + +} + +/**************************************************************************** + Handles tile extras, such as specials, mine. +****************************************************************************/ +function update_tile_extras(ptile) { + + if (ptile == null || tile_get_known(ptile) != TILE_KNOWN_SEEN) return; + + var height = 5 + ptile['height'] * 100; + + webgl_update_farmland_irrigation_vertex_colors(ptile); + + update_tile_extra_update_model(EXTRA_MINE, "Mine", ptile); + update_tile_extra_update_model(EXTRA_HUT, "Hut", ptile); + update_tile_extra_update_model(EXTRA_RUINS, "Ruins", ptile); + update_tile_extra_update_model(EXTRA_AIRBASE, "Airbase", ptile); + update_tile_extra_update_model(EXTRA_FORTRESS, "Fortress", ptile); + + // Render tile specials (extras). Fish and whales are 3D models, the rest are 2D sprites from the 2D version. + const extra_id = tile_resource(ptile); + var extra_resource = (extra_id === null) ? null : extras[extra_id]; + if (extra_resource != null && scene != null && tile_extra_positions[extra_resource['id'] + "." + ptile['index']] == null) { + if (extra_resource['name'] != "Fish" && extra_resource['name'] != "Whales" + && (!tile_has_extra(ptile, EXTRA_RIVER)) /* rendering specials on rivers is not supported yet. */) { + var key = extra_resource['graphic_str']; + var extra_mesh = get_extra_mesh(key); + + var pos = map_to_scene_coords(ptile['x'], ptile['y']); + extra_mesh.matrixAutoUpdate = false; + extra_mesh.translateOnAxis(new THREE.Vector3(1,0,0).normalize(), pos['x'] - 6); + extra_mesh.translateOnAxis(new THREE.Vector3(0,1,0).normalize(), height + 2); + extra_mesh.translateOnAxis(new THREE.Vector3(0,0,1).normalize(), pos['y'] - 6); + extra_mesh.rotation.y = Math.PI / 4; + extra_mesh.updateMatrix(); + + tile_extra_positions[extra_resource['id'] + "." + ptile['index']] = extra_mesh; + if (scene != null && extra_mesh != null) scene.add(extra_mesh); + } else { + update_tile_extra_update_model(extra_resource['id'], extra_resource['name'], ptile); + + } + } + + // show forest (set height of a hidden forest.) + var terrain_name = tile_terrain(ptile).name; + if (scene != null && forest_geometry != null + && tile_get_known(ptile) == TILE_KNOWN_SEEN + && forest_positions[ptile['index']] == null + && terrain_name == "Forest") { + for (var s = 0; s < forest_geometry.vertices.length; s++) { + if (forest_geometry.vertices[s]['tile'] == ptile['index']) { + forest_geometry.vertices[s].y = forest_geometry.vertices[s]['height']; + forest_positions[ptile['index']] = true; + } + } + forest_geometry.verticesNeedUpdate = true; + } + + // hide forest + if (scene != null && forest_geometry != null + && tile_get_known(ptile) == TILE_KNOWN_SEEN + && forest_positions[ptile['index']] != null + && terrain_name != "Forest") { + for (var s = 0; s < forest_geometry.vertices.length; s++) { + if (forest_geometry.vertices[s]['tile'] == ptile['index']) { + forest_geometry.vertices[s].y = 35; + forest_positions[ptile['index']] = null; + } + } + forest_geometry.verticesNeedUpdate = true; + } + + // add jungle + if (scene != null && jungle_geometry != null + && tile_get_known(ptile) == TILE_KNOWN_SEEN + && jungle_positions[ptile['index']] == null + && terrain_name == "Jungle") { + for (var s = 0; s < jungle_geometry.vertices.length; s++) { + if (jungle_geometry.vertices[s]['tile'] == ptile['index']) { + jungle_geometry.vertices[s].y = jungle_geometry.vertices[s]['height']; + jungle_positions[ptile['index']] = true; + } + } + jungle_geometry.verticesNeedUpdate = true; + } + + // hide jungle + if (scene != null && jungle_geometry != null + && tile_get_known(ptile) == TILE_KNOWN_SEEN + && jungle_positions[ptile['index']] != null + && terrain_name != "Jungle") { + for (var s = 0; s < jungle_geometry.vertices.length; s++) { + if (jungle_geometry.vertices[s]['tile'] == ptile['index']) { + jungle_geometry.vertices[s].y = 35; + jungle_positions[ptile['index']] = null; + } + } + jungle_geometry.verticesNeedUpdate = true; + } + + if (scene != null && ptile['label'] != null && ptile['label'].length > 0 && map_tile_label_positions[ptile['index']] == null) { + map_tile_label_positions[ptile['index']] = ptile; + var label = create_map_tile_label(ptile); + var pos = map_to_scene_coords(ptile['x'], ptile['y']); + label.translateOnAxis(new THREE.Vector3(1,0,0).normalize(), pos['x'] - 5); + label.translateOnAxis(new THREE.Vector3(0,1,0).normalize(), height + 29); + label.translateOnAxis(new THREE.Vector3(0,0,1).normalize(), pos['y'] - 15); + label.rotation.y = Math.PI / 4; + scene.add(label); + } + +} + + +/**************************************************************************** + Adds or removes a extra tile 3d model. +****************************************************************************/ +function update_tile_extra_update_model(extra_type, extra_name, ptile) +{ + if (tile_extra_positions[extra_type + "." + ptile['index']] == null && tile_has_extra(ptile, extra_type)) { + var height = 5 + ptile['height'] * 100; + var model = webgl_get_model(extra_name); + if (model == null) return; + tile_extra_positions[extra_type + "." + ptile['index']] = model; + var pos = map_to_scene_coords(ptile['x'], ptile['y']); + model.translateOnAxis(new THREE.Vector3(1,0,0).normalize(), pos['x'] - 10); + model.translateOnAxis(new THREE.Vector3(0,1,0).normalize(), height + 3); + model.translateOnAxis(new THREE.Vector3(0,0,1).normalize(), pos['y'] - 10); + if (scene != null) scene.add(model); + + } else if (scene != null && tile_extra_positions[extra_type + "." + ptile['index']] != null && !tile_has_extra(ptile, extra_type)) { + scene.remove(tile_extra_positions[extra_type + "." + ptile['index']]); + } +} + +/**************************************************************************** + Clears the selected unit indicator. +****************************************************************************/ +function webgl_clear_unit_focus() +{ + if (scene != null && selected_unit_indicator != null) { + scene.remove(selected_unit_indicator); + selected_unit_indicator = null; + } +} + +/**************************************************************************** + Adds all units and cities to the map. +****************************************************************************/ +function add_all_objects_to_scene() +{ + unit_positions = {}; + city_positions = {}; + city_label_positions = {}; + city_walls_positions = {}; + unit_flag_positions = {}; + unit_label_positions = {}; + unit_activities_positions = {}; + unit_health_positions = {}; + unit_healthpercentage_positions = {}; + forest_positions = {}; + jungle_positions = {}; + tile_extra_positions = {}; + road_positions = {}; + rail_positions = {}; + + for (var unit_id in units) { + var punit = units[unit_id]; + var ptile = index_to_tile(punit['tile']); + update_unit_position(ptile); + } + + for (var city_id in cities) { + var pcity = cities[city_id]; + update_city_position(city_tile(pcity)); + } + + for (var tile_id in tiles) { + update_tile_extras(tiles[tile_id]); + } + + +} diff --git a/freeciv-web/src/main/webapp/javascript/webgl/preload.js b/freeciv-web/src/main/webapp/javascript/webgl/preload.js new file mode 100644 index 000000000..0cb72c764 --- /dev/null +++ b/freeciv-web/src/main/webapp/javascript/webgl/preload.js @@ -0,0 +1,344 @@ +/********************************************************************** + Freeciv-web - the web version of Freeciv. http://play.freeciv.org/ + Copyright (C) 2009-2017 The Freeciv-web project + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +***********************************************************************/ + +var webgl_textures = {}; +var webgl_models = {}; +var start_preload = 0; +var total_model_count = 0; +var load_count = 0; +var webgl_materials = {}; + +var model_filenames = ["AEGIS Cruiser", "Helicopter", "Pikemen", + "Alpine Troops", "Horsemen", + "Archers", "citywalls", "Howitzer", "Riflemen", + "Armor", "Hut", + "Artillery", "Cruise Missile", "Ironclad", "Settlers", + "AWACS", "Cruiser", + "Barbarian Leader", "Destroyer", "Spy", + "Battleship", "Diplomat", "Knights", "Stealth Bomber", + "Bomber", "Dragoons", "Legion", "Submarine", + "Engineers", "Marines", "Transport", + "Cannon", "Explorer", "Mech. Inf.", "Trireme", + "Caravan", "Fighter", "Mine", "Warriors", + "Caravel", "Fish", "Musketeers", "Whales", + "Carrier", "Freight", "Nuclear", + "Catapult", "Frigate", "Migrants", + "Cavalry", "Paratroopers", "Workers", + "Chariot", "Galleon", "Partisan", + "Phalanx", "Ruins", + "Airbase", "Fortress", + "city_european_0", + "city_european_1", + "city_european_2", + "city_european_3", + "city_european_4", + "city_modern_0", + "city_modern_1", + "city_modern_2", + "city_modern_3", + "city_modern_4" + ]; + +/**************************************************************************** + Preload textures and models +****************************************************************************/ +function webgl_preload() +{ + $.blockUI({ message: "

Downloading

" }); + start_preload = new Date().getTime(); + + var loadingManager = new THREE.LoadingManager(); + loadingManager.onLoad = function () { + webgl_preload_models(); + }; + + var textureLoader = new THREE.ImageLoader( loadingManager ); + + /* Preload tree sprite. */ + var tree_sprite = new THREE.Texture(); + webgl_textures["tree_1"] = tree_sprite; + textureLoader.load( '/textures/tree_1.png', function ( image ) { + tree_sprite.image = image; + tree_sprite.needsUpdate = true; + } ); + + var jungle_sprite = new THREE.Texture(); + webgl_textures["jungle_1"] = jungle_sprite; + textureLoader.load( '/textures/jungle_1.png', function ( image ) { + jungle_sprite.image = image; + jungle_sprite.needsUpdate = true; + } ); + + var city_disorder = new THREE.Texture(); + textureLoader.load( '/textures/city_civil_disorder.png', function ( image ) { + city_disorder.image = image; + city_disorder.needsUpdate = true; + + var material = new THREE.ShaderMaterial({ + vertexShader: document.getElementById('labels_vertex_shh').textContent, + fragmentShader: document.getElementById('tex_fragment_shh').textContent, + uniforms: { + texture: { value: city_disorder }, + u_scale_factor: { value: 1 } + } + }); + material.transparent = true; + webgl_materials['city_disorder'] = material; + }); + + if (graphics_quality >= QUALITY_MEDIUM) { + var sun_texture = new THREE.Texture(); + webgl_textures["sun"] = sun_texture; + textureLoader.load( '/textures/sun.png', function ( image ) { + sun_texture.image = image; + sun_texture.needsUpdate = true; + var sunMaterial = new THREE.MeshBasicMaterial( { map: sun_texture} ); + webgl_materials['sun'] = sunMaterial; + } ); + } + + /* Preload terrain tile textures. */ + var imgurl; + if (graphics_quality == QUALITY_MEDIUM) imgurl = "/textures/medium/terrains.png"; + if (graphics_quality == QUALITY_HIGH) imgurl = "/textures/large/terrains.png"; + + textureLoader.load(imgurl, (function (url) { + return function (image) { + $("#download_progress").html(" terrain textures 10%"); + webgl_textures["terrains"] = new THREE.Texture(); + webgl_textures["terrains"].image = image; + webgl_textures["terrains"].wrapS = THREE.RepeatWrapping; + webgl_textures["terrains"].wrapT = THREE.RepeatWrapping; + webgl_textures["terrains"].magFilter = THREE.LinearFilter; + webgl_textures["terrains"].minFilter = THREE.LinearFilter; + webgl_textures["terrains"].needsUpdate = true; + } + })(imgurl) + ); + + /* Preload road textures. */ + if (graphics_quality == QUALITY_MEDIUM) imgurl = "/textures/medium/roads.png"; + if (graphics_quality == QUALITY_HIGH) imgurl = "/textures/large/roads.png"; + + textureLoader.load(imgurl, (function (url) { + return function (image) { + $("#download_progress").html(" road textures 15%"); + webgl_textures["roads"] = new THREE.Texture(); + webgl_textures["roads"].image = image; + webgl_textures["roads"].wrapS = THREE.RepeatWrapping; + webgl_textures["roads"].wrapT = THREE.RepeatWrapping; + webgl_textures["roads"].magFilter = THREE.LinearFilter; + webgl_textures["roads"].minFilter = THREE.LinearFilter; + webgl_textures["roads"].needsUpdate = true; + } + })(imgurl) + ); + + /* Preload railroads textures. */ + if (graphics_quality == QUALITY_MEDIUM) imgurl = "/textures/medium/railroads.png"; + if (graphics_quality == QUALITY_HIGH) imgurl = "/textures/large/railroads.png"; + + textureLoader.load(imgurl, (function (url) { + return function (image) { + $("#download_progress").html(" railroad textures 25%"); + webgl_textures["railroads"] = new THREE.Texture(); + webgl_textures["railroads"].image = image; + webgl_textures["railroads"].wrapS = THREE.RepeatWrapping; + webgl_textures["railroads"].wrapT = THREE.RepeatWrapping; + webgl_textures["railroads"].magFilter = THREE.LinearFilter; + webgl_textures["railroads"].minFilter = THREE.LinearFilter; + webgl_textures["railroads"].needsUpdate = true; + } + })(imgurl) + ); +} + +/**************************************************************************** + Preload all models. +****************************************************************************/ +function webgl_preload_models() +{ + total_model_count = model_filenames.length; + for (var i = 0; i < model_filenames.length; i++) { + load_model(model_filenames[i]); + } +} + +/**************************************************************************** + Load glTF (binary .glb) model from the server and import is as a model mesh. +****************************************************************************/ +function load_model(filename) +{ + var url = "/gltf/" + filename + ".glb"; + + var glTFLoader = new THREE.GLTFLoader(); + + glTFLoader.load( url, function(data) { + var model = data.scene; + $("#download_progress").html(" 3D models " + Math.floor(30 + (0.7 * 100 * load_count / total_model_count)) + "%"); + + model.traverse((node) => { + if (node.isMesh) { + node.material.flatShading = false; + node.material.side = THREE.DoubleSide; + node.material.needsUpdate = true; + node.geometry.computeVertexNormals(); + } + }); + + model.scale.x = model.scale.y = model.scale.z = 11; + webgl_models[filename] = model; + load_count++; + if (load_count == total_model_count) webgl_preload_complete(); + + }); +} + +/**************************************************************************** + Returns a single 3D model mesh object. +****************************************************************************/ +function webgl_get_model(filename) +{ + if (webgl_models[filename] != null) { + return webgl_models[filename].clone(); + } else { + return null; + } +} + +/**************************************************************************** + Returns a flag shield mesh +****************************************************************************/ +function get_flag_shield_mesh(key) +{ + if (meshes[key] != null) return new THREE.InstancedMesh(meshes[key].geometry, meshes[key].material, 1) + if (sprites[key] == null || key.substring(0,8) != "f.shield") { + console.log("Invalid flag shield key: " + key); + return null; + } + + /* resize flag to 32x16, since that is required by Three.js*/ + var fcanvas = document.createElement("canvas"); + fcanvas.width = 32; + fcanvas.height = 16; + var fcontext = fcanvas.getContext("2d"); + fcontext.drawImage(sprites[key], 0, 0, + sprites[key].width, sprites[key].height, + 0,0,32,16); + + meshes[key] = canvas_to_user_facing_mesh(fcanvas, 32, 12, 13, true); + return new THREE.InstancedMesh(meshes[key].geometry, meshes[key].material, 1) +} + +/**************************************************************************** + Returns a extra mesh +****************************************************************************/ +function get_extra_mesh(key) +{ + if (meshes[key] != null) return new THREE.InstancedMesh(meshes[key].geometry, meshes[key].material, 1); + if (sprites[key] == null ) { + console.log("Invalid extra key: " + key); + return null; + } + + var ecanvas = document.createElement("canvas"); + ecanvas.width = 64; + ecanvas.height = 32; + var econtext = ecanvas.getContext("2d"); + econtext.drawImage(sprites[key], 18, 8, + sprites[key].width - 36, sprites[key].height - 12, + 0,0,64,32); + + meshes[key] = canvas_to_user_facing_mesh(ecanvas, 64, 26, 16, true); + return new THREE.InstancedMesh(meshes[key].geometry, meshes[key].material, 1); +} + +/**************************************************************************** + Returns unit explosion mesh (frame = [0-4]. +****************************************************************************/ +function get_unit_explosion_mesh(frame) +{ + var key = 'explode.unit_' + frame; + if (meshes[key] != null) return new THREE.InstancedMesh(meshes[key].geometry, meshes[key].material, 1); + if (sprites[key] == null) { + console.log("Invalid unit explosion key: " + key); + return null; + } + + var ecanvas = document.createElement("canvas"); + ecanvas.width = 32; + ecanvas.height = 32; + var econtext = ecanvas.getContext("2d"); + econtext.drawImage(sprites[key], 0, 0, + sprites[key].width, sprites[key].height, + 0,0,32,32); + + meshes[key] = canvas_to_user_facing_mesh(ecanvas, 32, 32, 32, true); + return new THREE.InstancedMesh(meshes[key].geometry, meshes[key].material, 1); +} + +/**************************************************************************** + Returns nuke explosion mesh +****************************************************************************/ +function get_nuke_explosion_mesh(frame) +{ + var key = 'explode.nuke'; + if (meshes[key] != null) return new THREE.InstancedMesh(meshes[key].geometry, meshes[key].material, 1) + if (sprites[key] == null) { + console.log("Invalid nuke explosion key: " + key); + return null; + } + + var ecanvas = document.createElement("canvas"); + ecanvas.width = 256; + ecanvas.height = 256; + var econtext = ecanvas.getContext("2d"); + econtext.drawImage(sprites[key], 0, 0, + sprites[key].width, sprites[key].height, + 0,0,sprites[key].width,sprites[key].height); + + meshes[key] = canvas_to_user_facing_mesh(ecanvas, 180, 180, 176, true); + return new THREE.InstancedMesh(meshes[key].geometry, meshes[key].material, 1) +} + +/**************************************************************************** + Returns a unit health mesh +****************************************************************************/ +function get_unit_health_mesh(punit) +{ + if (punit == null || punit['hp'] == null) return null; + var hp = punit['hp']; + var unit_type = unit_types[punit['type']]; + var max_hp = unit_type['hp']; + var healthpercent = 10 * Math.floor((10 * hp) / max_hp); + var key = "unit_health_" + healthpercent; + + if (meshes[key] != null) return new THREE.InstancedMesh(meshes[key].geometry, meshes[key].material, 1) + + var fcanvas = document.createElement("canvas"); + fcanvas.width = 32; + fcanvas.height = 16; + var ctx = fcanvas.getContext("2d"); + ctx.drawImage(sprites["unit.hp_" + healthpercent], 25, 10, + 22, 7, + 0,0,32,16); + + meshes[key] = canvas_to_user_facing_mesh(fcanvas, 32, 18, 3, true); + return new THREE.InstancedMesh(meshes[key].geometry, meshes[key].material, 1) +} diff --git a/freeciv-web/src/main/webapp/javascript/webgl/renderer_main.js b/freeciv-web/src/main/webapp/javascript/webgl/renderer_main.js new file mode 100644 index 000000000..74a4a496a --- /dev/null +++ b/freeciv-web/src/main/webapp/javascript/webgl/renderer_main.js @@ -0,0 +1,126 @@ +/********************************************************************** + Freeciv-web - the web version of Freeciv. http://play.freeciv.org/ + Copyright (C) 2009-2017 The Freeciv-web project + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +***********************************************************************/ + +var QUALITY_MEDIUM = 2; // medium quality. +var QUALITY_HIGH = 3; // best quality, add features which require high-end graphics hardware here. + +var graphics_quality = QUALITY_HIGH; + +var anaglyph_3d_enabled = false; + +/**************************************************************************** + Init the Freeciv-web WebGL renderer +****************************************************************************/ +function init_webgl_renderer() +{ + if (!Detector.webgl) { + swal("3D WebGL not supported by your browser or you don't have a 3D graphics card. Please go back and try the 2D version instead. "); + return; + } + + // load Three.js dynamically. + /*$.ajax({ + async: false, + url: "/javascript/webgl/libs/three.min.js?" + ts , + dataType: "script" + });*/ + console.log("Three.js " + THREE.REVISION); + + $.ajax({ + async: false, + url: "/javascript/webgl-client.js?" + ts, + dataType: "script" + }); + + /* Loads the two tileset definition files */ + $.ajax({ + url: "/javascript/2dcanvas/tileset_config_amplio2.js", + dataType: "script", + async: false + }).fail(function() { + console.error("Unable to load tileset config."); + }); + + $.ajax({ + url: "/javascript/2dcanvas/tileset_spec_amplio2.js", + dataType: "script", + async: false + }).fail(function() { + console.error("Unable to load tileset spec. Run Freeciv-img-extract."); + }); + + if (is_touch_device()) { + $.ajax({ + url: "/javascript/libs/hammer.min.js", + dataType: "script", + async: false + }); + } + + init_sprites(); + + var renderer_name = "-"; + var gl = document.createElement('canvas').getContext('webgl'); + if (gl != null) { + var extension = gl.getExtension('WEBGL_debug_renderer_info'); + if (extension != undefined) { + renderer_name = gl.getParameter(extension.UNMASKED_RENDERER_WEBGL); + } + } + + var stored_graphics_quality_setting = simpleStorage.get("graphics_quality", ""); + if (stored_graphics_quality_setting != null && stored_graphics_quality_setting > 0) { + graphics_quality = stored_graphics_quality_setting; + } else { + graphics_quality = QUALITY_HIGH; //default value + } + +} + + +/**************************************************************************** + Preload is complete. +****************************************************************************/ +function webgl_preload_complete() +{ + $.unblockUI(); + + $("#canvas").remove(); + + if (C_S_RUNNING == client_state() || C_S_OVER == client_state()) { + // init a running game, switching from 2D to 3D. + + webgl_start_renderer(); + init_webgl_mapview(); + init_webgl_mapctrl(); + + for (var tile_id in tiles) { + if (tile_get_known(tiles[tile_id]) == TILE_KNOWN_SEEN) { + center_tile_mapcanvas(tiles[tile_id]); + break; + } + } + + } + + if ($.getUrlVar('autostart') == "true") { + username = "autostart"; + network_init(); + } +} diff --git a/freeciv-web/src/main/webapp/javascript/webgl/roads.js b/freeciv-web/src/main/webapp/javascript/webgl/roads.js new file mode 100644 index 000000000..92d5744aa --- /dev/null +++ b/freeciv-web/src/main/webapp/javascript/webgl/roads.js @@ -0,0 +1,191 @@ +/********************************************************************** + Freeciv-web - the web version of Freeciv. http://play.freeciv.org/ + Copyright (C) 2009-2017 The Freeciv-web project + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +***********************************************************************/ + +var num_road_tiles = 9; +var roads_palette = []; +var roads_texture; +var roads_hash = -1; + +/**************************************************************************** + Initialize roads image +****************************************************************************/ +function init_roads_image() +{ + generate_roads_image(); + roads_texture = new THREE.Texture(); + roads_texture.magFilter = THREE.NearestFilter; + roads_texture.minFilter = THREE.NearestFilter; + roads_texture.image = document.getElementById("roads_image"); + roads_texture.image.onload = function () { + roads_texture.needsUpdate = true; + }; + + if (graphics_quality == QUALITY_MEDIUM) setInterval(update_roads_image, 3000); + if (graphics_quality == QUALITY_HIGH) setInterval(update_roads_image, 1200); + +} + + +/**************************************************************************** + ... +****************************************************************************/ +function update_roads_image() +{ + var hash = generate_roads_hash(); + + if (hash != roads_hash) { + generate_roads_image(); + roads_texture.image = document.getElementById("roads_image"); + roads_texture.image.onload = function () { + roads_texture.needsUpdate = true; + }; + roads_hash = hash; + } + + return roads_texture; +} + +/**************************************************************************** + +****************************************************************************/ +function generate_roads_image() { + + var can = document.getElementById('roads_canvas'); + can.width = map.xsize; + can.height = map.ysize; + var ctx = can.getContext('2d'); + for (var x = 0; x < map.xsize ; x++) { + for (var y = 0; y < map.ysize; y++) { + ctx.fillStyle = road_image_color(x, y); + ctx.fillRect(x, y, 1, 1); + } + } + var img = document.getElementById("roads_image"); + img.src = can.toDataURL(); + +} + + +/**************************************************************************** +... +****************************************************************************/ +function road_image_color(map_x, map_y) +{ + var ptile = map_pos_to_tile(map_x, map_y); + + // Railroads. + if (ptile != null && tile_has_extra(ptile, EXTRA_RAIL)) { + + var result = [10, 0, 0]; // single road tile. + + // 1. iterate over adjacent tiles, see if they have railroad. + var adj_road_count = 0; + for (var dir = 0; dir < 8; dir++) { + if (dir != 1 && dir != 3 && dir != 4 && dir != 6) continue; + var checktile = mapstep(ptile, dir); + if (checktile != null && tile_has_extra(checktile, EXTRA_RAIL)) { + if (dir == 1) result[adj_road_count] = 12; + if (dir == 3) result[adj_road_count] = 18; + if (dir == 4) result[adj_road_count] = 14; + if (dir == 6) result[adj_road_count] = 16; + adj_road_count++; + if (adj_road_count > 2) { + var checktile = mapstep(ptile, 6); + if (checktile != null && tile_has_extra(checktile, EXTRA_RAIL)) return "rgb(43,0,0)"; //special case, 4 connected rails. + break; + } + } + } + for (var dir = 0; dir < 8; dir++) { + if (dir != 0 && dir != 2 && dir != 5 && dir != 7) continue; + var checktile = mapstep(ptile, dir); + if (checktile != null && tile_has_extra(checktile, EXTRA_RAIL)) { + if (dir == 0) result[adj_road_count] = 19; + if (dir == 2) result[adj_road_count] = 13; + if (dir == 5) result[adj_road_count] = 17; + if (dir == 7) result[adj_road_count] = 15; + adj_road_count++; + if (adj_road_count > 2) break; + } + } + + return "rgb("+result[0]+","+result[1]+","+result[2]+")"; + } + + // Roads + if (ptile != null && tile_has_extra(ptile, EXTRA_ROAD)) { + + var result = [1, 0, 0]; // single road tile. + + // 1. iterate over adjacent tiles, see if they have road. + var adj_road_count = 0; + for (var dir = 0; dir < 8; dir++) { + if (dir != 1 && dir != 3 && dir != 4 && dir != 6) continue; + var checktile = mapstep(ptile, dir); + if (checktile != null && tile_has_extra(checktile, EXTRA_ROAD)) { + if (dir == 1) result[adj_road_count] = 2; + if (dir == 3) result[adj_road_count] = 8; + if (dir == 4) result[adj_road_count] = 4; + if (dir == 6) result[adj_road_count] = 6; + adj_road_count++; + if (adj_road_count > 2) { + var checktile = mapstep(ptile, 6); + if (checktile != null && tile_has_extra(checktile, EXTRA_ROAD)) return "rgb(42,0,0)"; //special case, 4 connected roads. + break; + } + } + } + for (var dir = 0; dir < 8; dir++) { + if (dir != 0 && dir != 2 && dir != 5 && dir != 7) continue; + var checktile = mapstep(ptile, dir); + if (checktile != null && tile_has_extra(checktile, EXTRA_ROAD)) { + if (dir == 0) result[adj_road_count] = 9; + if (dir == 2) result[adj_road_count] = 3; + if (dir == 5) result[adj_road_count] = 7; + if (dir == 7) result[adj_road_count] = 5; + adj_road_count++; + if (adj_road_count > 2) break; + } + } + + return "rgb("+result[0]+","+result[1]+","+result[2]+")"; + } + return "rgb(0,0,0)"; // no road. + +} + +/**************************************************************************** + Creates a hash of the roads. +****************************************************************************/ +function generate_roads_hash() { + var hash = 0; + + for (var x = 0; x < map.xsize ; x++) { + for (var y = 0; y < map.ysize; y++) { + var ptile = map_pos_to_tile(x, y); + if (ptile != null && tile_has_extra(ptile, EXTRA_ROAD)) { + hash += ((x * y) + 1); + } + if (ptile != null && tile_has_extra(ptile, EXTRA_RAIL)) { + hash += ((x * y) + 10); + } + } + } + return hash; +} \ No newline at end of file diff --git a/freeciv-web/src/main/webapp/javascript/webgl/shaders/README.md b/freeciv-web/src/main/webapp/javascript/webgl/shaders/README.md new file mode 100644 index 000000000..f92ab1c9c --- /dev/null +++ b/freeciv-web/src/main/webapp/javascript/webgl/shaders/README.md @@ -0,0 +1,22 @@ +WebGL Shaders for Freeciv-web +============================= + +These are the WebGL fragment and vertex shaders used by Freeciv-web: + +Terrain +======= +The terrain shaders implement the rendering of different tile terrain types +on the game map. + +* terrain_vertex_shader.glsl +* terrain_fragment_shader.glsl + + +Labels +====== +The labels shaders implement labels which always face in the direction of the user. +* labels_vertex_shader.glsl +* labels_fragment_shader.glsl + + + diff --git a/freeciv-web/src/main/webapp/javascript/webgl/shaders/labels_fragment_shader.glsl b/freeciv-web/src/main/webapp/javascript/webgl/shaders/labels_fragment_shader.glsl new file mode 100644 index 000000000..bb6e38549 --- /dev/null +++ b/freeciv-web/src/main/webapp/javascript/webgl/shaders/labels_fragment_shader.glsl @@ -0,0 +1,27 @@ +/********************************************************************** + Freeciv-web - the web version of Freeciv. http://play.freeciv.org/ + Copyright (C) 2009-2017 The Freeciv-web project + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +***********************************************************************/ + +uniform sampler2D tex; + +varying vec2 vUv; + +void main() { + gl_FragColor = texture2D(tex, vUv); +} + diff --git a/freeciv-web/src/main/webapp/javascript/webgl/shaders/labels_vertex_shader.glsl b/freeciv-web/src/main/webapp/javascript/webgl/shaders/labels_vertex_shader.glsl new file mode 100644 index 000000000..47903b7c3 --- /dev/null +++ b/freeciv-web/src/main/webapp/javascript/webgl/shaders/labels_vertex_shader.glsl @@ -0,0 +1,45 @@ +/********************************************************************** + Freeciv-web - the web version of Freeciv. http://play.freeciv.org/ + Copyright (C) 2009-2017 The Freeciv-web project + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +***********************************************************************/ + +uniform float u_scale_factor; + +// Unit vectors +const vec4 ux = vec4(1., 0., 0., 0.); +const vec4 uy = vec4(0., 1., 0., 0.); +const vec4 uz = vec4(0., 0., 1., 0.); +const vec4 uw = vec4(0., 0., 0., 1.); + +varying vec2 vUv; + +void main() +{ + vUv = vec2(uv.x * u_scale_factor, uv.y); + // Extract scalings from the projection matrix + // 0.7 = sqrt(2)/2 is there because x is projected at 45° by the view matrix + float scale_x = 0.7 * dot(projectionMatrix * ux, ux); + float scale_y = dot(projectionMatrix * uy, uy); + mat4 scale = mat4(scale_x, 0., 0., 0., + 0., scale_y, 0., 0., + 0., 0., 0., 0., + 0., 0., 0., 0.); + // Extract translation from the matrices + vec4 translation = projectionMatrix * modelViewMatrix * uw; + // We don't use the full projection matrix because we don't want perspective + gl_Position = translation + scale * modelViewMatrix * vec4(position, 0.); +} diff --git a/freeciv-web/src/main/webapp/javascript/webgl/shaders/terrain_fragment_shader.glsl b/freeciv-web/src/main/webapp/javascript/webgl/shaders/terrain_fragment_shader.glsl new file mode 100644 index 000000000..324f5d9a1 --- /dev/null +++ b/freeciv-web/src/main/webapp/javascript/webgl/shaders/terrain_fragment_shader.glsl @@ -0,0 +1,474 @@ +/********************************************************************** + Freeciv-web - the web version of Freeciv. http://play.freeciv.org/ + Copyright (C) 2009-2017 The Freeciv-web project + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +***********************************************************************/ + +#ifdef GL_ES +precision highp float; +#endif + +varying vec3 vNormal; +varying vec3 vColor; + +uniform sampler2D terrains; +uniform sampler2D maptiles; +uniform sampler2D borders; +uniform sampler2D roadsmap; +uniform sampler2D roadsprites; +uniform sampler2D railroadsprites; + +uniform float map_x_size; +uniform float map_y_size; + +varying vec2 vUv; +varying vec3 vPosition; +varying vec3 vPosition_camera; + + +float sprite_pos0_x = 0.0; +float sprite_pos0_y = 0.75; +float sprite_pos1_x = 0.25; +float sprite_pos1_y = 0.75; +float sprite_pos2_x = 0.5; +float sprite_pos2_y = 0.75; +float sprite_pos3_x = 0.75; +float sprite_pos3_y = 0.75; +float sprite_pos4_x = 0.0; +float sprite_pos4_y = 0.5; +float sprite_pos5_x = 0.25; +float sprite_pos5_y = 0.5; +float sprite_pos6_x = 0.5; +float sprite_pos6_y = 0.5; +float sprite_pos7_x = 0.75; +float sprite_pos7_y = 0.5; +float sprite_pos8_x = 0.0; +float sprite_pos8_y = 0.25; +float sprite_pos9_x = 0.25; +float sprite_pos9_y = 0.25; +float sprite_pos10_x = 0.5; +float sprite_pos10_y = 0.25; +float sprite_pos11_x = 0.75; +float sprite_pos11_y = 0.25; +float sprite_pos12_x = 0.0; +float sprite_pos12_y = 0.0; +float sprite_pos13_x = 0.25; +float sprite_pos13_y = 0.0; +float sprite_pos14_x = 0.5; +float sprite_pos14_y = 0.0; +float sprite_pos15_x = 0.75; +float sprite_pos15_y = 0.0; + +float terrain_inaccessible = 0.0; +float terrain_lake = 10.0/255.0; +float terrain_coast = 20.0/255.0; +float terrain_floor = 30.0/255.0; +float terrain_arctic = 40.0/255.0; +float terrain_desert = 50.0/255.0; +float terrain_forest = 60.0/255.0; +float terrain_grassland = 70.0/255.0; +float terrain_hills = 80.0/255.0; +float terrain_jungle = 90.0/255.0; +float terrain_mountains = 100.0/255.0; +float terrain_plains = 110.0/255.0; +float terrain_swamp = 120.0/255.0; +float terrain_tundra = 130.0/255.0; + +float is_river_modifier = 10.0/255.0; + +// roads +float roadtype_1 = 1.0/255.0; +float roadtype_2 = 2.0/255.0; +float roadtype_3 = 3.0/255.0; +float roadtype_4 = 4.0/255.0; +float roadtype_5 = 5.0/255.0; +float roadtype_6 = 6.0/255.0; +float roadtype_7 = 7.0/255.0; +float roadtype_8 = 8.0/255.0; +float roadtype_9 = 9.0/255.0; +float roadtype_all = 42.0/255.0; + +// railroads +float roadtype_10 = 10.0/255.0; +float roadtype_11 = 11.0/255.0; +float roadtype_12 = 12.0/255.0; +float roadtype_13 = 13.0/255.0; +float roadtype_14 = 14.0/255.0; +float roadtype_15 = 15.0/255.0; +float roadtype_16 = 16.0/255.0; +float roadtype_17 = 17.0/255.0; +float roadtype_18 = 18.0/255.0; +float roadtype_19 = 19.0/255.0; +float railtype_all = 43.0/255.0; + +float beach_high = 53.5; +float beach_blend_high = 52.0; +float beach_blend_low = 50.0; +float beach_low = 44.0; +float blend_amount = 0.0; + +float mountains_low_begin = 93.0; +float mountains_low_end = 95.0; +float mountains_high = 100.2; + +vec3 ambiant = vec3(0.27, 0.55, 1.); +vec3 light = vec3(0.8, 0.6, 0.7); + +vec2 texture_coord; + + +void main(void) +{ + + if (vColor.r == 0.0) { + gl_FragColor.rgb = vec3(0, 0, 0); + return; + } + + vec4 terrain_type = texture2D(maptiles, vec2(vUv.x, vUv.y)); + vec4 border_color = texture2D(borders, vec2(vUv.x, vUv.y)); + vec4 road_type = texture2D(roadsmap, vec2(vUv.x, vUv.y)); + + vec3 c; + vec4 chosen_terrain_color; + + if (terrain_type.g == is_river_modifier) { + beach_high = 50.5; + beach_blend_high = 50.25; + } + + // Set pixel color based on tile type. + if (terrain_type.r == terrain_grassland) { + if (vPosition.y > beach_blend_high ) { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos6_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos6_y); + chosen_terrain_color = texture2D(terrains, texture_coord); + } else { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos2_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos2_y); + chosen_terrain_color = texture2D(terrains, texture_coord); + } + } else if (terrain_type.r == terrain_plains) { + if (vPosition.y > beach_blend_high ) { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos11_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos11_y); + chosen_terrain_color = texture2D(terrains, texture_coord); + } else { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos2_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos2_y); + chosen_terrain_color = texture2D(terrains, texture_coord); + } + } else if (terrain_type.r == terrain_lake) { + if (vPosition.y < beach_blend_high ) { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos9_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos9_y); + chosen_terrain_color = texture2D(terrains, texture_coord); + } else { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos6_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos6_y); + chosen_terrain_color = texture2D(terrains, texture_coord); + } + } else if (terrain_type.r == terrain_coast) { + if (vPosition.y < beach_blend_high ) { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos2_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos2_y); + chosen_terrain_color = texture2D(terrains, texture_coord); + if (fract((vPosition.x + 502.0) / 35.71) < 0.018 || fract((vPosition.z + 2.0) / 35.71) < 0.018) { + chosen_terrain_color.rgb = chosen_terrain_color.rgb * 1.45; // render tile grid. + } + + } else { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos6_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos6_y); + chosen_terrain_color = texture2D(terrains, texture_coord); + } + } else if (terrain_type.r == terrain_floor) { + if (vPosition.y < beach_blend_high ) { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos4_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos4_y); + chosen_terrain_color = texture2D(terrains, texture_coord); + if (fract((vPosition.x + 502.0) / 35.71) < 0.018 || fract((vPosition.z + 2.0) / 35.71) < 0.018) { + chosen_terrain_color.rgb = chosen_terrain_color.rgb * 1.7; // render tile grid. + } + } else { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos6_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos6_y); + chosen_terrain_color = texture2D(terrains, texture_coord); + } + } else if (terrain_type.r == terrain_arctic) { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos0_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos0_y); + chosen_terrain_color = texture2D(terrains, texture_coord); + } else if (terrain_type.r == terrain_desert) { + if (vPosition.y > beach_blend_high ) { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos3_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos3_y); + chosen_terrain_color = texture2D(terrains, texture_coord); + } else { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos2_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos2_y); + chosen_terrain_color = texture2D(terrains, texture_coord); + } + } else if (terrain_type.r == terrain_forest) { + if (vPosition.y > beach_blend_high ) { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos5_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos5_y); + chosen_terrain_color = texture2D(terrains, texture_coord); + } else { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos2_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos2_y); + chosen_terrain_color = texture2D(terrains, texture_coord); + } + } else if (terrain_type.r == terrain_hills) { + if (vPosition.y > beach_blend_high ) { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos7_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos7_y); + chosen_terrain_color = texture2D(terrains, texture_coord); + } else { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos2_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos2_y); + chosen_terrain_color = texture2D(terrains, texture_coord); + } + } else if (terrain_type.r == terrain_jungle) { + if (vPosition.y > beach_blend_high ) { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos8_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos8_y); + chosen_terrain_color = texture2D(terrains, texture_coord); + } else { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos2_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos2_y); + chosen_terrain_color = texture2D(terrains, texture_coord); + } + } else if (terrain_type.r == terrain_mountains) { + if (vPosition.y > beach_blend_high ) { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos10_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos10_y); + chosen_terrain_color = texture2D(terrains, texture_coord); + } else { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos2_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos2_y); + chosen_terrain_color = texture2D(terrains, texture_coord); + } + } else if (terrain_type.r == terrain_swamp) { + if (vPosition.y > beach_blend_high ) { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos12_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos12_y); + chosen_terrain_color = texture2D(terrains, texture_coord); + } else { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos2_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos2_y); + chosen_terrain_color = texture2D(terrains, texture_coord); + } + } else if (terrain_type.r == terrain_tundra) { + if (vPosition.y > beach_blend_high ) { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos13_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos13_y); + chosen_terrain_color = texture2D(terrains, texture_coord); + } else { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos2_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos2_y); + chosen_terrain_color = texture2D(terrains, texture_coord); + } + } else { + if (vPosition.y > beach_blend_high ) { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos11_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos11_y); + chosen_terrain_color = texture2D(terrains, texture_coord); + } else { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos2_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos2_y); + chosen_terrain_color = texture2D(terrains, texture_coord); + } + } + + c = chosen_terrain_color.rgb; + + if (vPosition.y > mountains_high) { + // snow in mountains texture over a certain height threshold. + blend_amount = ((3.0 - (mountains_high - vPosition.y)) / 3.0) - 1.0; + + vec4 Ca = texture2D(terrains, vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos0_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos0_y)); + vec4 Cb = texture2D(terrains, vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos10_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos10_y)); + c = mix(Ca.rgb, Cb.rgb, (1.0 - blend_amount)); + } else if (vPosition.y > mountains_low_begin) { + if (vPosition.y < mountains_low_end) { + vec4 Cmountain = texture2D(terrains, vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos10_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos10_y)); + c = mix(chosen_terrain_color.rgb, Cmountain.rgb, smoothstep(mountains_low_begin, mountains_low_end, vPosition.y)); + } else { + // mountain texture over a certain height threshold. + vec4 Cb = texture2D(terrains, vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos10_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos10_y)); + c = Cb.rgb; + } + } + + + if (fract((vPosition.x + 502.0) / 35.71) < 0.018 || fract((vPosition.z + 2.0) / 35.71) < 0.018) { + c = c - 0.085; // render tile grid. + } + + + // render the beach. + if (vPosition.y < beach_high && vPosition.y > beach_low) { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos1_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos1_y); + if (vPosition.y > beach_blend_high) { + blend_amount = ((beach_high - beach_blend_high) - (beach_high - vPosition.y)) / (beach_high - beach_blend_high); + vec4 Cbeach = texture2D(terrains, texture_coord); + c = mix(chosen_terrain_color.rgb, Cbeach.rgb, (1.0 - blend_amount)); + + } else if (vPosition.y < beach_blend_low) { + blend_amount = (beach_blend_low - vPosition.y) / 6.0; + vec4 Cbeach = texture2D(terrains, texture_coord) * 2.0; + c = mix(chosen_terrain_color.rgb, Cbeach.rgb, (1.0 - blend_amount)); + + } else { + vec4 Cbeach = texture2D(terrains, texture_coord); + c = Cbeach.rgb; + } + } + + if (vColor.g > 0.4 && vColor.g < 0.6) { + // render Irrigation. + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos15_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos15_y); + vec4 t1 = texture2D(terrains, texture_coord); + c = mix(c, vec3(t1), t1.a); + } + + if (vColor.g > 0.9) { + // render farmland. + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos14_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos14_y); + vec4 t1 = texture2D(terrains, texture_coord); + c = mix(c, vec3(t1), t1.a); + } + + // Roads + if (road_type.r == 0.0) { + // no roads + } else if (road_type.r == roadtype_1 && road_type.g == 0.0 && road_type.b == 0.0) { + // a single road tile. + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos0_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos0_y); + vec4 t1 = texture2D(roadsprites, texture_coord); + c = mix(c, vec3(t1), t1.a); + } else if (road_type.r == roadtype_all) { + // a road tile with 4 connecting roads. + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos1_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos1_y); + vec4 t1 = texture2D(roadsprites, texture_coord); + c = mix(c, vec3(t1), t1.a); + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos3_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos3_y); + t1 = texture2D(roadsprites, texture_coord); + c = mix(c, vec3(t1), t1.a); + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos5_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos5_y); + t1 = texture2D(roadsprites, texture_coord); + c = mix(c, vec3(t1), t1.a); + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos7_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos7_y); + t1 = texture2D(roadsprites, texture_coord); + c = mix(c, vec3(t1), t1.a); + } else if (road_type.r == railtype_all) { + // a rail tile with 4 connecting rails. + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos1_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos1_y); + vec4 t1 = texture2D(railroadsprites, texture_coord); + c = mix(c, vec3(t1), t1.a); + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos3_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos3_y); + t1 = texture2D(railroadsprites, texture_coord); + c = mix(c, vec3(t1), t1.a); + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos5_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos5_y); + t1 = texture2D(railroadsprites, texture_coord); + c = mix(c, vec3(t1), t1.a); + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos7_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos7_y); + t1 = texture2D(railroadsprites, texture_coord); + c = mix(c, vec3(t1), t1.a); + } else if (road_type.r > 0.0 && road_type.r < roadtype_10) { + // Roads + if (road_type.r == roadtype_2 || road_type.g == roadtype_2 || road_type.b == roadtype_2) { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos1_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos1_y); + vec4 t1 = texture2D(roadsprites, texture_coord); + c = mix(c, vec3(t1), t1.a); + } + if (road_type.r == roadtype_3 || road_type.g == roadtype_3 || road_type.b == roadtype_3) { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos2_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos2_y); + vec4 t1 = texture2D(roadsprites, texture_coord); + c = mix(c, vec3(t1), t1.a); + } + if (road_type.r == roadtype_4 || road_type.g == roadtype_4 || road_type.b == roadtype_4) { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos3_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos3_y); + vec4 t1 = texture2D(roadsprites, texture_coord); + c = mix(c, vec3(t1), t1.a); + } + if (road_type.r == roadtype_5 || road_type.g == roadtype_5 || road_type.b == roadtype_5) { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos4_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos4_y); + vec4 t1 = texture2D(roadsprites, texture_coord); + c = mix(c, vec3(t1), t1.a); + } + if (road_type.r == roadtype_6 || road_type.g == roadtype_6 || road_type.b == roadtype_6) { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos5_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos5_y); + vec4 t1 = texture2D(roadsprites, texture_coord); + c = mix(c, vec3(t1), t1.a); + } + if (road_type.r == roadtype_7 || road_type.g == roadtype_7 || road_type.b == roadtype_7) { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos6_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos6_y); + vec4 t1 = texture2D(roadsprites, texture_coord); + c = mix(c, vec3(t1), t1.a); + } + if (road_type.r == roadtype_8 || road_type.g == roadtype_8 || road_type.b == roadtype_8) { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos7_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos7_y); + vec4 t1 = texture2D(roadsprites, texture_coord); + c = mix(c, vec3(t1), t1.a); + } + if (road_type.r == roadtype_9 || road_type.g == roadtype_9 || road_type.b == roadtype_9) { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos8_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos8_y); + vec4 t1 = texture2D(roadsprites, texture_coord); + c = mix(c, vec3(t1), t1.a); + } + } else if (road_type.r >= roadtype_10 && road_type.r < roadtype_all) { + // Railroads + if (road_type.r == roadtype_10 && road_type.g == 0.0 && road_type.b == 0.0) { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos0_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos0_y); + vec4 t1 = texture2D(railroadsprites, texture_coord); + c = mix(c, vec3(t1), t1.a); + } + if (road_type.r == roadtype_12 || road_type.g == roadtype_12 || road_type.b == roadtype_12) { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos1_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos1_y); + vec4 t1 = texture2D(railroadsprites, texture_coord); + c = mix(c, vec3(t1), t1.a); + } + if (road_type.r == roadtype_13 || road_type.g == roadtype_13 || road_type.b == roadtype_13) { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos2_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos2_y); + vec4 t1 = texture2D(railroadsprites, texture_coord); + c = mix(c, vec3(t1), t1.a); + } + if (road_type.r == roadtype_14 || road_type.g == roadtype_14 || road_type.b == roadtype_14) { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos3_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos3_y); + vec4 t1 = texture2D(railroadsprites, texture_coord); + c = mix(c, vec3(t1), t1.a); + } + if (road_type.r == roadtype_15 || road_type.g == roadtype_15 || road_type.b == roadtype_15) { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos4_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos4_y); + vec4 t1 = texture2D(railroadsprites, texture_coord); + c = mix(c, vec3(t1), t1.a); + } + if (road_type.r == roadtype_16 || road_type.g == roadtype_16 || road_type.b == roadtype_16) { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos5_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos5_y); + vec4 t1 = texture2D(railroadsprites, texture_coord); + c = mix(c, vec3(t1), t1.a); + } + if (road_type.r == roadtype_17 || road_type.g == roadtype_17 || road_type.b == roadtype_17) { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos6_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos6_y); + vec4 t1 = texture2D(railroadsprites, texture_coord); + c = mix(c, vec3(t1), t1.a); + } + if (road_type.r == roadtype_18 || road_type.g == roadtype_18 || road_type.b == roadtype_18) { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos7_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos7_y); + vec4 t1 = texture2D(railroadsprites, texture_coord); + c = mix(c, vec3(t1), t1.a); + } + if (road_type.r == roadtype_19 || road_type.g == roadtype_19 || road_type.b == roadtype_19) { + texture_coord = vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos8_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos8_y); + vec4 t1 = texture2D(railroadsprites, texture_coord); + c = mix(c, vec3(t1), t1.a); + } + } + + + // Borders + if (!(border_color.r > 0.546875 && border_color.r < 0.5625 && border_color.b == 0.0 && border_color.g == 0.0)) { + c = mix(c, border_color.rbg, 0.53); + } + + // specular component, ambient occlusion and fade out underwater terrain + float x = 1.0 - clamp((vPosition.y - 30.) / 15., 0., 1.); + vec4 Cb = texture2D(terrains, vec2(mod(map_x_size * (vUv.x / 4.0), 0.25) + sprite_pos1_x , mod((vUv.y * map_y_size / 4.0), 0.25) + sprite_pos1_y)); + c = mix(c, Cb.rgb, x); + + float shade_factor = 0.1 + 1.2 * max(0., dot(vNormal, normalize(light))); + + // Fog of war, and unknown tiles, are stored as a vertex color in vColor.r. + c = c * vColor.r; + + gl_FragColor.rgb = mix(c * shade_factor, ambiant, (vPosition_camera.z - 550.) * 0.0001875); + +} diff --git a/freeciv-web/src/main/webapp/javascript/webgl/shaders/terrain_vertex_shader.glsl b/freeciv-web/src/main/webapp/javascript/webgl/shaders/terrain_vertex_shader.glsl new file mode 100644 index 000000000..da235fa7f --- /dev/null +++ b/freeciv-web/src/main/webapp/javascript/webgl/shaders/terrain_vertex_shader.glsl @@ -0,0 +1,42 @@ +/********************************************************************** + Freeciv-web - the web version of Freeciv. http://play.freeciv.org/ + Copyright (C) 2009-2017 The Freeciv-web project + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +***********************************************************************/ + +varying vec2 vUv; +varying vec3 vNormal; +varying vec3 vPosition; +varying vec3 vPosition_camera; +varying vec3 vColor; + +void main() +{ + vUv = uv; + + if (color.r == 0.0 && position.y < 54.0) { + // hidden water tile, move the black terrain landscape above the water plane. + vec4 mvPosition = modelViewMatrix * vec4( position.x, 54.0, position.z , 1.0 ); + gl_Position = projectionMatrix * mvPosition; + } else { + vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 ); + gl_Position = projectionMatrix * mvPosition; + } + vPosition_camera = gl_Position.xyz; + vNormal = normal; + vPosition = position; + vColor = color; +} \ No newline at end of file diff --git a/freeciv-web/src/main/webapp/javascript/webgl/text.js b/freeciv-web/src/main/webapp/javascript/webgl/text.js new file mode 100644 index 000000000..f325a4232 --- /dev/null +++ b/freeciv-web/src/main/webapp/javascript/webgl/text.js @@ -0,0 +1,367 @@ +/********************************************************************** + Freeciv-web - the web version of Freeciv. http://play.freeciv.org/ + Copyright (C) 2009-2016 The Freeciv-web project + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +***********************************************************************/ + +var texture_cache = {}; +var webgl_mapview_font = 'Bold 34px Georgia, serif'; + +/**************************************************************************** + Convert a canvas to a mesh that will always face the user. The height of + `canvas' should be 16px. + `width_final' gives the width of the content that will actually be displayed, not of the canvas itself. + 'width_input' I think is the width of the input. + 'height' is the height of the result. + `transparent' should be true if canvas' content is transparent. + 'texture_cache_key' is to specify a cache key, to reuse textures for multiple uses, such as unit labels. +****************************************************************************/ +function canvas_to_user_facing_mesh(canvas, width_input, width_final, height, transparent, texture_cache_key) +{ + var texture; + if (texture_cache_key != null && texture_cache[texture_cache_key] != null) { + texture = texture_cache[texture_cache_key]; + } else { + // Create a new texture out of the canvas + texture = new THREE.Texture(canvas); + texture.needsUpdate = true; + texture_cache[texture_cache_key] = texture; + } + + // Make a material + var material = new THREE.ShaderMaterial({ + vertexShader: document.getElementById('labels_vertex_shh').textContent, + fragmentShader: document.getElementById('tex_fragment_shh').textContent, + uniforms: { + tex: { value: texture }, + u_scale_factor: { value: width_input / canvas.width } + } + }); + material.transparent = transparent; + + // Put it all together + return new THREE.Mesh(new THREE.PlaneBufferGeometry(width_final, height), material); +} + +/**************************************************************************** + Create a new city name label and returns the resulting Three.js mesh. + This does the initial creation, not the updates. See update_city_label. +****************************************************************************/ +function create_city_label(pcity) +{ + var canvas = document.createElement('canvas'); + canvas.width = 512; + canvas.height = 42; + var ctx = canvas.getContext('2d'); + pcity['label_canvas'] = canvas; + + var owner_id = pcity.owner; + if (owner_id == null) return null; + var owner = players[owner_id]; + + // We draw from left to right, updating `width' after each call. + var width = 0; // Total width of the bar + + // Flag + var city_gfx = get_city_flag_sprite(pcity); + ctx.drawImage(sprites[city_gfx.key], + 1, 1, // Remove the 1px black border, it's ugly + sprites[city_gfx.key].width - 2, sprites[city_gfx.key].height - 2, + 0, 0, 28, 32); + width += 28; + + // Occupied + var ptile = city_tile(pcity); + var punits = tile_units(ptile); + if (punits.length > 0) { + // Background + ctx.fillStyle = 'black'; + ctx.fillRect(width, 0, 16, 32); + // Stars + ctx.drawImage(sprites[get_city_occupied_sprite(pcity)], width, 0, 13, 32); + width += 13; + } + + // Name and size + var city_text = pcity.name.toUpperCase() + " " + pcity.size; + ctx.font = webgl_mapview_font; + var txt_measure = ctx.measureText(city_text); + // Background + var background_color = nations[owner.nation].color; + if (background_color != null) { + if (graphics_quality >= QUALITY_HIGH) { + background_color = background_color.replace("rgb(", "rgba(").replace(")", ",0.52)"); + } + ctx.fillStyle = background_color; + } + ctx.fillRect(width, 0, txt_measure.width + 11 /* padding */, 32); + // Text + var dark_bg = false; + var nation_colors = nations[owner['nation']].color.replace("rgb(", "").replace(")", "").split(","); + if (parseInt(nation_colors[0]) + parseInt(nation_colors[1]) + parseInt(nation_colors[2]) < 300) dark_bg = true; + if (dark_bg) { + ctx.fillStyle = '#EFEFEF'; + } else { + ctx.fillStyle = '#050505'; + } + ctx.fillText(city_text, width + 4 /* padding */, 13*2); + + width += txt_measure.width + 11 /* padding */; + + // Production + var prod_type = get_city_production_type(pcity); + if (prod_type != null) { + var tag = tileset_ruleset_entity_tag_str_or_alt(prod_type, + "unit or building"); + if (tag != null) { + ctx.fillStyle = background_color; + ctx.fillRect(width, 0, 36, 32); + ctx.drawImage(sprites[tag], width, 0, 31, 18*2); + width += 32; + } + } + + if (width > 512) width = 512; + return canvas_to_user_facing_mesh(canvas, width, Math.floor(width * 0.5), 19, true, "city_" + pcity['id']); +} + +/**************************************************************************** + Update a city name label. This updates the canvas image of the city label, + which then updates the corresponding Three.js Texture. +****************************************************************************/ +function update_city_label(pcity) +{ + var canvas = pcity['label_canvas']; + if (canvas == null) { + canvas = document.createElement('canvas'); + canvas.width = 512; + canvas.height = 42; + pcity['label_canvas'] = canvas; + } + + var ctx = canvas.getContext('2d'); + ctx.clearRect(0, 0, canvas.width, canvas.height); + + var owner_id = pcity.owner; + if (owner_id == null) return null; + var owner = players[owner_id]; + + // We draw from left to right, updating `width' after each call. + var width = 0; // Total width of the bar + + // Flag + var city_gfx = get_city_flag_sprite(pcity); + ctx.drawImage(sprites[city_gfx.key], + 1, 1, // Remove the 1px black border, it's ugly + sprites[city_gfx.key].width - 2, sprites[city_gfx.key].height - 2, + 0, 0, 28, 32); + width += 28; + + // Occupied + var ptile = city_tile(pcity); + var punits = tile_units(ptile); + if (punits.length > 0) { + // Background + ctx.fillStyle = 'black'; + ctx.fillRect(width, 0, 16, 32); + // Stars + ctx.drawImage(sprites[get_city_occupied_sprite(pcity)], width, 0, 13, 32); + width += 13; + } + + // Name and size + var city_text = pcity.name.toUpperCase() + " " + pcity.size; + ctx.font = webgl_mapview_font; + var txt_measure = ctx.measureText(city_text); + // Background + var background_color = nations[owner.nation].color; + if (background_color != null) { + if (graphics_quality >= QUALITY_HIGH) { + background_color = background_color.replace("rgb(", "rgba(").replace(")", ",0.52)"); + } + ctx.fillStyle = background_color; + } + ctx.fillRect(width, 0, txt_measure.width + 11 /* padding */, 32); + // Text + var dark_bg = false; + var nation_colors = nations[owner['nation']].color.replace("rgb(", "").replace(")", "").split(","); + if (parseInt(nation_colors[0]) + parseInt(nation_colors[1]) + parseInt(nation_colors[2]) < 300) dark_bg = true; + if (dark_bg) { + ctx.fillStyle = '#EFEFEF'; + } else { + ctx.fillStyle = '#050505'; + } + ctx.fillText(city_text, width + 4 /* padding */, 13*2); + + width += txt_measure.width + 11 /* padding */; + + // Production + var prod_type = get_city_production_type(pcity); + if (prod_type != null) { + var tag = tileset_ruleset_entity_tag_str_or_alt(prod_type, + "unit or building"); + if (tag != null) { + ctx.fillStyle = background_color; + ctx.fillRect(width, 0, 36, 32); + ctx.drawImage(sprites[tag], width, 0, 31, 18*2); + width += 32; + } + } + + var texture = texture_cache['city_' + pcity['id']]; + texture.needsUpdate = true; +} + +/**************************************************************************** + Create a unit label +****************************************************************************/ +function create_unit_label(punit) +{ + var canvas1 = document.createElement('canvas'); + canvas1.width = 32; + canvas1.height = 32; + var context1 = canvas1.getContext('2d'); + context1.font = "Bold 16px Arial"; + context1.fillStyle = "rgba(222,255,0, 1.0)"; + context1.strokeStyle= "black"; + context1.lineWidth = 1.5; + + var text = get_unit_activity_text(punit); + var width = context1.measureText(text).width; + context1.strokeText(text, 0, 15); + context1.fillText(text, 0, 15); + + return canvas_to_user_facing_mesh(canvas1, width, 10, 26, true, get_unit_activity_text(punit)); +} + +/**************************************************************************** + Create a city civil disorder label +****************************************************************************/ +function create_city_disorder_label() +{ + return new THREE.Mesh(new THREE.PlaneBufferGeometry(80, 80), webgl_materials['city_disorder']); +} + +/**************************************************************************** + Create a map tile label +****************************************************************************/ +function create_map_tile_label(ptile) +{ + if (ptile['label'] == null || ptile['label'].length == 0) return null; + + var canvas = document.createElement('canvas'); + canvas.width = 512; + canvas.height = 40; + var ctx = canvas.getContext('2d'); + + + // We draw from left to right, updating `width' after each call. + var width = 0; // Total width of the bar + + + // Name and size + var label = ptile['label']; + ctx.font = 'Bold 36px Arial'; + var txt_measure = ctx.measureText(label); + // Background + var background_color = "rgba(0,0,0,0.5)"; + ctx.fillStyle = background_color; + ctx.fillRect(width, 0, txt_measure.width + 11 /* padding */, 32); + + // Text + ctx.fillStyle = '#EFEFEF'; + ctx.fillText(label, width + 4 /* padding */, 13*2); + + width += txt_measure.width + 11 /* padding */; + + if (width > 512) width = 512; + return canvas_to_user_facing_mesh(canvas, width, Math.floor(width * 0.5), 20, true, "ptile_" + ptile['label']); +} + +/********************************************************************** + ... +***********************************************************************/ +function get_unit_activity_text(punit) +{ + var activity = punit['activity']; + + /* don't draw activity for enemy units */ + if (client.conn.playing == null || punit['owner'] != client.conn.playing.playerno) { + return null; + } + + switch (activity) { + case ACTIVITY_POLLUTION: + return "F"; + + case ACTIVITY_MINE: + return "m"; + + case ACTIVITY_PLANT: + return "M"; + + case ACTIVITY_IRRIGATE: + return " i "; + + case ACTIVITY_CULTIVATE: + return "I"; + + case ACTIVITY_FORTIFIED: + return "F"; + + case ACTIVITY_BASE: + return "B"; + + case ACTIVITY_SENTRY: + return "S"; + + case ACTIVITY_PILLAGE: + return "P"; + + case ACTIVITY_GOTO: + return "G"; + + case ACTIVITY_EXPLORE: + return "X"; + + case ACTIVITY_TRANSFORM: + return "T"; + + case ACTIVITY_FORTIFYING: + return "F"; + + case ACTIVITY_GEN_ROAD: + return "R"; + + case ACTIVITY_CONVERT: + return "C"; + } + + if (unit_has_goto(punit)) { + return "G"; + } + + /*switch (punit['ssa_controller']) { + case SSA_NONE: + break; + case UNIT_AUTOSETTLERS: + return "A"; + case SSA_AUTOEXPLORE: + return "X"; + }*/ + + return null; +} diff --git a/freeciv-web/src/main/webapp/javascript/webgl/tile_visibility_handler.js b/freeciv-web/src/main/webapp/javascript/webgl/tile_visibility_handler.js new file mode 100644 index 000000000..0cc6767ed --- /dev/null +++ b/freeciv-web/src/main/webapp/javascript/webgl/tile_visibility_handler.js @@ -0,0 +1,95 @@ +/********************************************************************** + Freeciv-web - the web version of Freeciv. http://play.freeciv.org/ + Copyright (C) 2009-2016 The Freeciv-web project + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +***********************************************************************/ + +var vertex_colors_dirty = false; + +/************************************************************************** + Updates the terrain vertex colors to set tile to known, unknown or fogged. +**************************************************************************/ +function webgl_update_tile_known(old_tile, new_tile) +{ + if (new_tile == null || old_tile == null || tile_get_known(new_tile) == tile_get_known(old_tile) || landGeometry == null) return; + vertex_colors_dirty = true; +} + + + +/************************************************************************** +Updates the terrain vertex colors to set irrigation, farmland, or none. +**************************************************************************/ +function webgl_update_farmland_irrigation_vertex_colors(ptile) +{ + if (ptile == null || landGeometry == null) return; + vertex_colors_dirty = true; +} + +/************************************************************************** + This will update the fog of war and unknown tiles, and farmland/irrigation + by storing these as vertex colors in the landscape mesh. +**************************************************************************/ +function update_tiles_known_vertex_colors() +{ + if (!vertex_colors_dirty) return; + for ( var i = 0; i < landGeometry.faces.length; i ++ ) { + var v = ['a', 'b', 'c']; + for (var r = 0; r < v.length; r++) { + var vertex = landGeometry.vertices[landGeometry.faces[i][v[r]]]; + var vPos = landMesh.localToWorld(vertex); + var mapPos = scene_to_map_coords(vPos.x, vPos.z); + if (mapPos['x'] >= 0 && mapPos['y'] >= 0) { + var ptile = map_pos_to_tile(mapPos['x'], mapPos['y']); + if (ptile != null && tile_get_known(ptile) != TILE_UNKNOWN) { + if (landGeometry.faces[i].vertexColors[r] != null) landGeometry.faces[i].vertexColors[r].copy(get_vertex_color_from_tile(ptile)); + } + } + } + } + landGeometry.colorsNeedUpdate = true; + vertex_colors_dirty = false; + +} + + +/************************************************************************** + Returns the vertex colors (THREE.Color) of a tile. The color is used to + set terrain type in the terrain fragment shader. +**************************************************************************/ +function get_vertex_color_from_tile(ptile) +{ + var known_status_color = 0; + if (tile_get_known(ptile) == TILE_KNOWN_SEEN) { + known_status_color = 1; + } else if (tile_get_known(ptile) == TILE_KNOWN_UNSEEN) { + known_status_color = 0.40; + } else if (tile_get_known(ptile) == TILE_UNKNOWN) { + known_status_color = 0; + } + + var farmland_irrigation_color = 0; + if (tile_has_extra(ptile, EXTRA_FARMLAND)) { + farmland_irrigation_color = 1.0; + } else if (tile_has_extra(ptile, EXTRA_IRRIGATION)) { + farmland_irrigation_color = 0.5; + } else { + farmland_irrigation_color = 0; + } + + return new THREE.Color(known_status_color, farmland_irrigation_color,0); + +} diff --git a/freeciv-web/src/main/webapp/javascript/webgl/trees.js b/freeciv-web/src/main/webapp/javascript/webgl/trees.js new file mode 100644 index 000000000..20fa62750 --- /dev/null +++ b/freeciv-web/src/main/webapp/javascript/webgl/trees.js @@ -0,0 +1,108 @@ +/********************************************************************** + Freeciv-web - the web version of Freeciv. http://play.freeciv.org/ + Copyright (C) 2009-2016 The Freeciv-web project + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +***********************************************************************/ + +var meshes = {}; +var tree_points = null; +var jungle_points = null; + +var forest_geometry = null; +var jungle_geometry = null; + + +/**************************************************************************** + Prerender trees and jungle on known tiles. +****************************************************************************/ +function add_trees_to_landgeometry(landGeometry, xquality) { + /* Trees using Three.Points + TODO: Trees should be implemented using InstancedBufferGeometry with RawShaderMaterial and a billboard shader. + */ + forest_geometry = new THREE.Geometry(); + var treecolors = []; + for (var i = 0, l = landGeometry.vertices.length; i < l; i++) { + var x = i % xquality, y = Math.floor(i / xquality); + var gx = Math.round(x / 4 - 0.5); + var gy = Math.round(y / 4 - 0.5); + var ptile = map_pos_to_tile(gx, gy); + if (ptile != null) { + var terrain_name = tile_terrain(ptile).name; + var add_tree = false; + if (terrain_name == "Forest") { + /* Dense forests. */ + add_tree = true; + } + + /* No trees on beaches */ + add_tree &= (landGeometry.vertices[i].y > 57); + + if (add_tree) { + var vertex = new THREE.Vector3(); + vertex['tile'] = ptile['index']; + var theight = Math.floor(landGeometry.vertices[i].y + 2 + 0.1 * (-1.2 + 2.4 * Math.random())); + vertex['height'] = theight; + if (tile_get_known(ptile) != TILE_UNKNOWN) forest_positions[ptile['index']] = true; + vertex.x = Math.floor(landGeometry.vertices[i].x + 5 + 2.5 * (-1 + 2 * Math.random())); + vertex.y = tile_get_known(ptile) == TILE_UNKNOWN ? 35 : theight; + vertex.z = Math.floor(landGeometry.vertices[i].z + 5 + 2.5 * (-1 + 2 * Math.random())); + forest_geometry.vertices.push( vertex ); + if (graphics_quality == QUALITY_HIGH) { + var mycolor = new THREE.Color( 0xffffff ); + mycolor.setHSL(0.5 + (Math.random() - 0.5) / 2.0, 0.2 + Math.random() * 1.5, 0.6 ); + treecolors.push(mycolor); + } + } + } + } + if (graphics_quality == QUALITY_HIGH) forest_geometry.colors = treecolors; + var forest_material = new THREE.PointsMaterial( { size: 42, sizeAttenuation: true, map: webgl_textures["tree_1"], vertexColors: (graphics_quality == QUALITY_HIGH) ? THREE.VertexColors : THREE.NoColors, alphaTest: 0.5, transparent: true } ); + tree_points = new THREE.Points( forest_geometry, forest_material ); + scene.add(tree_points); + + + /* Jungle */ + jungle_geometry = new THREE.Geometry(); + for (var i = 0, l = landGeometry.vertices.length; i < l; i++) { + var x = i % xquality, y = Math.floor(i / xquality); + var gx = Math.round(x / 4 - 0.5); + var gy = Math.round(y / 4 - 0.5); + var ptile = map_pos_to_tile(gx, gy); + if (ptile != null) { + var terrain_name = tile_terrain(ptile).name; + var add_tree = false; + if (terrain_name == "Jungle") { + add_tree = true; + } + add_tree &= (landGeometry.vertices[i].y > 57); + if (add_tree) { + var vertex = new THREE.Vector3(); + vertex['tile'] = ptile['index']; + var theight = Math.floor(landGeometry.vertices[i].y + 2 + 0.1 * (-1.2 + 2.4 * Math.random())); + vertex['height'] = theight; + if (tile_get_known(ptile) != TILE_UNKNOWN) jungle_positions[ptile['index']] = true; + vertex.x = Math.floor(landGeometry.vertices[i].x + 5 + 2.5 * (-1 + 2 * Math.random())); + vertex.y = tile_get_known(ptile) == TILE_UNKNOWN ? 35 : theight; + vertex.z = Math.floor(landGeometry.vertices[i].z + 5 + 2.5 * (-1 + 2 * Math.random())); + jungle_geometry.vertices.push( vertex ); + } + } + } + var jungle_material = new THREE.PointsMaterial( { size: 42, sizeAttenuation: true, map: webgl_textures["jungle_1"], alphaTest: 0.5, transparent: true } ); + jungle_points = new THREE.Points( jungle_geometry, jungle_material ); + scene.add(jungle_points); + +} \ No newline at end of file diff --git a/freeciv-web/src/main/webapp/static/images/brand.png b/freeciv-web/src/main/webapp/static/images/brand.png index 18cb45d7c..630782a48 100644 Binary files a/freeciv-web/src/main/webapp/static/images/brand.png and b/freeciv-web/src/main/webapp/static/images/brand.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page.gif b/freeciv-web/src/main/webapp/static/images/fcw-front-page.gif deleted file mode 100644 index dbe9ea1ff..000000000 Binary files a/freeciv-web/src/main/webapp/static/images/fcw-front-page.gif and /dev/null differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page1.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page1.png new file mode 100644 index 000000000..f3b5b21b2 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page1.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page10.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page10.png new file mode 100644 index 000000000..bf79f5319 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page10.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page11.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page11.png new file mode 100644 index 000000000..f15040bbc Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page11.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page12.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page12.png new file mode 100644 index 000000000..0c3946c4c Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page12.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page13.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page13.png new file mode 100644 index 000000000..c920b1df3 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page13.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page14.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page14.png new file mode 100644 index 000000000..30a6aad2c Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page14.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page15.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page15.png new file mode 100644 index 000000000..65be918aa Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page15.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page16.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page16.png new file mode 100644 index 000000000..41164be85 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page16.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page17.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page17.png new file mode 100644 index 000000000..60c10f42c Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page17.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page18.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page18.png new file mode 100644 index 000000000..25869013d Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page18.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page19.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page19.png new file mode 100644 index 000000000..7dc8ef78c Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page19.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page2.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page2.png new file mode 100644 index 000000000..df23fb290 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page2.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page20.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page20.png new file mode 100644 index 000000000..c8ff5b963 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page20.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page21.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page21.png new file mode 100644 index 000000000..70100da44 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page21.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page22.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page22.png new file mode 100644 index 000000000..eece7e5f9 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page22.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page23.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page23.png new file mode 100644 index 000000000..131d84e8b Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page23.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page24.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page24.png new file mode 100644 index 000000000..ac76157cd Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page24.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page25.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page25.png new file mode 100644 index 000000000..c0b6a525c Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page25.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page26.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page26.png new file mode 100644 index 000000000..1b5335935 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page26.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page27.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page27.png new file mode 100644 index 000000000..66ed73e1e Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page27.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page28.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page28.png new file mode 100644 index 000000000..bd7ef9c74 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page28.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page29.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page29.png new file mode 100644 index 000000000..6787b21d3 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page29.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page3.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page3.png new file mode 100644 index 000000000..e07261944 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page3.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page30.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page30.png new file mode 100644 index 000000000..14f4e4ae3 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page30.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page31.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page31.png new file mode 100644 index 000000000..a17ac3062 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page31.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page32.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page32.png new file mode 100644 index 000000000..85432cab0 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page32.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page33.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page33.png new file mode 100644 index 000000000..8bf281a95 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page33.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page34.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page34.png new file mode 100644 index 000000000..91b87f413 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page34.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page35.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page35.png new file mode 100644 index 000000000..5077a2260 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page35.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page36.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page36.png new file mode 100644 index 000000000..d59e78067 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page36.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page37.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page37.png new file mode 100644 index 000000000..fbc9d3ba7 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page37.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page38.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page38.png new file mode 100644 index 000000000..16c9d85d5 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page38.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page39.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page39.png new file mode 100644 index 000000000..26cf5efe7 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page39.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page4.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page4.png new file mode 100644 index 000000000..d52483481 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page4.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page40.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page40.png new file mode 100644 index 000000000..1868329bf Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page40.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page41.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page41.png new file mode 100644 index 000000000..4954bac9d Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page41.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page42.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page42.png new file mode 100644 index 000000000..2398d9d2d Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page42.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page43.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page43.png new file mode 100644 index 000000000..002e49ee2 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page43.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page44.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page44.png new file mode 100644 index 000000000..79ad5eaf7 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page44.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page45.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page45.png new file mode 100644 index 000000000..f47a10af7 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page45.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page46.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page46.png new file mode 100644 index 000000000..d34b211e1 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page46.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page47.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page47.png new file mode 100644 index 000000000..1d9cee9b9 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page47.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page48.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page48.png new file mode 100644 index 000000000..51a2cdf5f Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page48.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page49.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page49.png new file mode 100644 index 000000000..7a9234b9c Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page49.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page5.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page5.png new file mode 100644 index 000000000..d24659323 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page5.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page50.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page50.png new file mode 100644 index 000000000..9bc63c2bb Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page50.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page51.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page51.png new file mode 100644 index 000000000..055f429d9 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page51.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page52.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page52.png new file mode 100644 index 000000000..8a8789747 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page52.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page53.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page53.png new file mode 100644 index 000000000..79c215407 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page53.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page54.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page54.png new file mode 100644 index 000000000..ebbe25472 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page54.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page55.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page55.png new file mode 100644 index 000000000..769e88ac0 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page55.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page56.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page56.png new file mode 100644 index 000000000..9169d2d96 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page56.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page57.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page57.png new file mode 100644 index 000000000..7346e1850 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page57.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page58.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page58.png new file mode 100644 index 000000000..0ed0728c4 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page58.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page59.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page59.png new file mode 100644 index 000000000..3006c3cdf Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page59.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page6.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page6.png new file mode 100644 index 000000000..82cda41c8 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page6.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page60.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page60.png new file mode 100644 index 000000000..65d02bdf5 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page60.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page61.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page61.png new file mode 100644 index 000000000..a30183589 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page61.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page7.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page7.png new file mode 100644 index 000000000..6da488a95 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page7.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page8.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page8.png new file mode 100644 index 000000000..02e7ce741 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page8.png differ diff --git a/freeciv-web/src/main/webapp/static/images/fcw-front-page9.png b/freeciv-web/src/main/webapp/static/images/fcw-front-page9.png new file mode 100644 index 000000000..82f58c869 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/fcw-front-page9.png differ diff --git a/freeciv-web/src/main/webapp/static/images/freeciv-tnt-classic2.png b/freeciv-web/src/main/webapp/static/images/freeciv-tnt-classic2.png new file mode 100644 index 000000000..3bcc844b6 Binary files /dev/null and b/freeciv-web/src/main/webapp/static/images/freeciv-tnt-classic2.png differ diff --git a/freeciv-web/src/main/webapp/static/images/frontpage-jumbotron.png b/freeciv-web/src/main/webapp/static/images/frontpage-jumbotron.png index 9a388827b..d69d8807a 100644 Binary files a/freeciv-web/src/main/webapp/static/images/frontpage-jumbotron.png and b/freeciv-web/src/main/webapp/static/images/frontpage-jumbotron.png differ diff --git a/freeciv-web/src/main/webapp/static/javascript/jdenticon.min.js b/freeciv-web/src/main/webapp/static/javascript/jdenticon.min.js new file mode 100644 index 000000000..7be16adb3 --- /dev/null +++ b/freeciv-web/src/main/webapp/static/javascript/jdenticon.min.js @@ -0,0 +1,3 @@ +// Jdenticon 3.1.1 | jdenticon.com | MIT licensed | (c) 2014-2021 Daniel Mester Pirttijärvi +!function(t,n){var i=function(t){"use strict";function n(t,n,i){return parseInt(t.substr(n,i),16)}function i(t){return(t|=0)<0?"00":t<16?"0"+t.toString(16):t<256?t.toString(16):"ff"}function e(t,n,e){return i(255*((e=e<0?e+6:e>6?e-6:e)<1?t+(n-t)*e:e<3?n:e<4?t+(n-t)*(4-e):t))}function r(t){if(/^#[0-9a-f]{3,8}$/i.test(t)){var n,i=t.length;if(i<6){var e=t[1],r=t[2],o=t[3],u=t[4]||"";n="#"+e+e+r+r+o+o+u+u}return(7==i||i>8)&&(n=t),n}}function o(t){var i,e=n(t,7,2);isNaN(e)?i=t:i="rgba("+n(t,1,2)+","+n(t,3,2)+","+n(t,5,2)+","+(e/255).toFixed(2)+")";return i}function u(t,n,r){var o;if(0==n){var u=i(255*r);o=u+u+u}else{var f=r<=.5?r*(n+1):r+n-r*n,h=2*r-f;o=e(h,f,6*t+2)+e(h,f,6*t)+e(h,f,6*t-2)}return"#"+o}function f(t,n,i){var e=[.55,.5,.5,.46,.6,.55,.55][6*t+.5|0];return u(t,n,i=i<.5?i*e*2:e+(i-.5)*(1-e)*2)}var h=t,s={G:"jdenticon_config",n:"config"},a={};function c(t){a=t}function v(t){return arguments.length&&(a[s.n]=t),a[s.n]}function l(t,n){var i="object"==typeof t&&t||a[s.n]||h[s.G]||{},e=i.lightness||{},o=i.saturation||{},u="color"in o?o.color:o,f=o.grayscale,c=i.backColor,v=i.padding;function l(t,n){var i=e[t];return i&&i.length>1||(i=n),function(t){return(t=i[0]+t*(i[1]-i[0]))<0?0:t>1?1:t}}function g(t){var n,e=i.hues;return e&&e.length>0&&(n=e[0|.999*t*e.length]),"number"==typeof n?(n/360%1+1)%1:t}return{X:g,p:"number"==typeof u?u:.5,H:"number"==typeof f?f:0,q:l("color",[.4,.8]),I:l("grayscale",[.3,.9]),J:r(c),Y:"number"==typeof t?t:"number"==typeof v?v:n}}var g=1,d=2,p={t:"data-jdenticon-hash",o:"data-jdenticon-value"},y="["+p.t+"],["+p.o+"]",m="undefined"!=typeof document&&document.querySelectorAll.bind(document);function b(t){if(t){var n=t.tagName;if(/^svg$/i.test(n))return g;if(/^canvas$/i.test(n)&&"getContext"in t)return d}}function w(t){"undefined"!=typeof MutationObserver&&new MutationObserver((function(n){for(var i=0;i1?0|h:h>.5?1:h,n.i(s,s,i-h-s,i-h-s)):4==t?(o=0|.15*i,u=0|.5*i,n.h(i-u-o,i-u-o,u)):5==t?((s=4*(h=.1*i))>3&&(s|=0),n.i(0,0,i,i),n.g([s,s,i-h,s,s+(i-s-h)/2,i-h],!0)):6==t?n.g([0,0,i,0,i,.7*i,.4*i,.4*i,.7*i,i,0,i]):7==t?n.j(i/2,i/2,i/2,i/2,3):8==t?(n.i(0,0,i,i/2),n.i(0,i/2,i/2,i/2),n.j(i/2,i/2,i/2,i/2,1)):9==t?(h=.14*i,s=i<4?1:i<6?2:0|.35*i,h=i<8?h:0|h,n.i(0,0,i,i),n.i(s,s,i-s-h,i-s-h,!0)):10==t?(s=3*(h=.12*i),n.i(0,0,i,i),n.h(s,s,i-h-s,!0)):11==t?n.j(i/2,i/2,i/2,i/2,3):12==t?(o=.25*i,n.i(0,0,i,i),n.N(o,o,i-o,i-o,!0)):!e&&(o=.4*i,u=1.2*i,n.h(o,o,u)):(r=.42*i,n.g([0,0,i,0,i,i-2*r,i-r,i,0,i]))}function N(t,n,i){var e;(t%=4)?1==t?n.j(0,i/2,i,i/2,0):2==t?n.N(0,0,i,i):(e=i/6,n.h(e,e,i-2*e)):n.j(0,0,i,i,0)}function T(t,n){return[f(t=n.X(t),n.H,n.I(0)),f(t,n.p,n.q(.5)),f(t,n.H,n.I(1)),f(t,n.p,n.q(1)),f(t,n.p,n.q(0))]}function k(t,i,e){var r=l(e,.08);r.J&&t.m(r.J);var o=t.k,u=.5+o*r.Y|0;o-=2*u;var f=new j(t),h=0|o/4,s=0|u+o/2-2*h,a=0|u+o/2-2*h;function c(e,r,o,u,c){var v=n(i,o,1),l=u?n(i,u,1):0;t.O(g[d[e]]);for(var p=0;p=0)for(var n=0;n=0)return!0}for(var y=0;y<3;y++)v=n(i,8+y,1)%g.length,(p([0,4])||p([2,3]))&&(v=1),d.push(v);c(0,N,2,3,[[1,0],[2,0],[2,3],[1,3],[0,1],[3,1],[3,2],[0,2]]),c(1,N,4,5,[[0,0],[3,0],[3,3],[0,3]]),c(2,M,1,null,[[1,1],[2,1],[2,2],[1,2]]),t.finish()}function I(t){var n,i=40,e=16,r=0,o=0,u=encodeURI(t)+"%80",f=[],h=[],s=1732584193,a=4023233417,c=~s,v=~a,l=3285377520,g=[s,a,c,v,l],d=0,p="";function y(t,n){return t<>>32-n}for(;r>2]=f[o>>2]|("%"==u[r]?parseInt(u.substring(r+1,r+=3),16):u.charCodeAt(r++))<<8*(3-(3&o));for(f[(n=(1+(o+7>>6))*e)-1]=8*o-8;d>3]>>>4*(7-(7&r))&15).toString(16);return p}function O(t){return/^[0-9a-f]{11,}$/i.test(t)&&t}function P(t){return I(null==t?"":""+t)}function F(t,n){var i=t.canvas,e=i.width,r=i.height;t.save(),n||(n=Math.min(e,r),t.translate((e-n)/2|0,(r-n)/2|0)),this.l=t,this.k=n,t.clearRect(0,0,n,n)}C.g=function(t,n){for(var i=this,e=n?-2:2,r=[],o=n?t.length-2:0;o=0;o+=e)r.push(i.A.L(t[o],t[o+1]));this.M.g(r)},C.h=function(t,n,i,e){var r=this.A.L(t,n,i,i);this.M.h(r,i,e)},C.i=function(t,n,i,e,r){this.g([t,n,t+i,n,t+i,n+e,t,n+e],r)},C.j=function(t,n,i,e,r,o){var u=[t+i,n,t+i,n+e,t,n+e,t,n];u.splice((r||0)%4*2,2),this.g(u,o)},C.N=function(t,n,i,e,r){this.g([t+i/2,n,t+i,n+e/2,t+i/2,n+e,t,n+e/2],r)};var R=F.prototype;function q(t,n,i,e){if(!t)throw new Error("No canvas specified.");k(new F(t,i),O(n)||P(n),e)}function B(t){return(10*t+.5|0)/10}function L(){this.B=""}R.m=function(t){var n=this.l,i=this.k;n.fillStyle=o(t),n.fillRect(0,0,i,i)},R.O=function(t){var n=this.l;n.fillStyle=o(t),n.beginPath()},R.P=function(){this.l.fill()},R.g=function(t){var n=this.l;n.moveTo(t[0].x,t[0].y);for(var i=1;i'}var J=H.prototype;function K(t,n,i){var e=new H(n);return k(new U(e),O(t)||P(t),i),e.toString()}function V(t,n){for(var i=[],e=arguments.length-2;e-- >0;)i[e]=arguments[e+2];for(var r=document.createElementNS(G.T,n),o=0;o+1')},J.S=function(t,n){this.F+=''},J.toString=function(){return this.F+""};var Y=W.prototype;function Z(){m&&E(y)}function E(t,n,i){X(t,n,i,(function(t,n){if(n)return n==g?new U(new W(t)):new F(t.getContext("2d"))}))}function X(t,n,i,e){if("string"!=typeof t){var r=O(n)||null!=n&&P(n)||O(t.getAttribute(p.t))||t.hasAttribute(p.o)&&P(t.getAttribute(p.o));if(r){var o=e(t,b(t));o&&k(o,r,i)}}else if(m)for(var u=m(t),f=0;f
+ + + diff --git a/freeciv-web/src/main/webapp/webclient/city.hbs b/freeciv-web/src/main/webapp/webclient/city.hbs index e17de2db5..2925945f6 100644 --- a/freeciv-web/src/main/webapp/webclient/city.hbs +++ b/freeciv-web/src/main/webapp/webclient/city.hbs @@ -100,9 +100,9 @@
- -
diff --git a/freeciv-web/src/main/webapp/webclient/empire.jsp b/freeciv-web/src/main/webapp/webclient/empire.jsp index 3761db29c..0bd701a3a 100644 --- a/freeciv-web/src/main/webapp/webclient/empire.jsp +++ b/freeciv-web/src/main/webapp/webclient/empire.jsp @@ -5,7 +5,7 @@ title="All units sorted by type" >♟National Units + title="All units by home city" >🏠Unit Upkeep diff --git a/freeciv-web/src/main/webapp/webclient/index.jsp b/freeciv-web/src/main/webapp/webclient/index.jsp index 43cd8e28c..5e0f63fb8 100644 --- a/freeciv-web/src/main/webapp/webclient/index.jsp +++ b/freeciv-web/src/main/webapp/webclient/index.jsp @@ -41,7 +41,9 @@ var fcwDebug=<%= fcwDebug %>; - + + + @@ -58,7 +60,7 @@ var fcwDebug=<%= fcwDebug %>; - + @@ -85,5 +87,21 @@ var fcwDebug=<%= fcwDebug %>; <% } %> + + + + + + + + diff --git a/freeciv-web/src/main/webapp/webclient/options.jsp b/freeciv-web/src/main/webapp/webclient/options.jsp index dacd8304b..206c80545 100644 --- a/freeciv-web/src/main/webapp/webclient/options.jsp +++ b/freeciv-web/src/main/webapp/webclient/options.jsp @@ -214,6 +214,17 @@ +
+ + + + - + @@ -84,6 +84,7 @@

 

 
 

+



ABBREVIATIONS:
avs = attacks vs.
dvs = defends vs.

\ No newline at end of file diff --git a/freeciv-web/vbuild-all-rules.sh b/freeciv-web/vbuild-all-rules.sh index d93fe6bf4..d03b08e58 100644 --- a/freeciv-web/vbuild-all-rules.sh +++ b/freeciv-web/vbuild-all-rules.sh @@ -1,7 +1,7 @@ #!/bin/bash # builds Freeciv-web, copies the war file to Tomcat and builds the selected rulesets. -RULESETS=(mp2-dragoon mp2-caravel mp2-brava mpplus classic civ2civ3 multiplayer civ1 civ2 ag mp2 sandbox webperimental experimental) +RULESETS=(mp2-dragoon mp2-caravel mp2-brava mp2-ag mpplus classic civ2civ3 multiplayer civ1 civ2 mp2 sandbox webperimental experimental alien) TOPDIR="$( cd ../"$( dirname "${BASH_SOURCE[0]}" )" > /dev/null && pwd )" printf "\nThis script may solve issues with Game Manual generation for vagrant users.\n" diff --git a/freeciv-web/vclean-rules.sh b/freeciv-web/vclean-rules.sh index 6d31ae155..dcd7f2202 100644 --- a/freeciv-web/vclean-rules.sh +++ b/freeciv-web/vclean-rules.sh @@ -1,7 +1,7 @@ 11#!/bin/bash # builds Freeciv-web, copies the war file to Tomcat and builds the selected rulesets. -RULESETS=(classic civ2civ3 maptest multiplayer mpplus mp2sandbox mp2 ag ag2 mp2-brava mp2-caravel mp2-dragoon) +RULESETS=(classic civ2civ3 maptest multiplayer mpplus mp2sandbox mp2 ag mp2-ag mp2-brava mp2-caravel mp2-dragoon) TOPDIR="$( cd ../"$( dirname "${BASH_SOURCE[0]}" )" > /dev/null && pwd )" printf "\n./vclean-rules.sh: VAGRANT VERSION. Use ./clean-rules.sh for deployed servers.\n" @@ -16,6 +16,7 @@ printf "************************************************************************ printf "\nOverwriting generated manual with release-version: MP2-Avant Garde" cp /vagrant/freeciv-web/src/derived/webapp/man/ag7.bak.html /vagrant/freeciv-web/src/derived/webapp/man/ag7.html + cp /vagrant/freeciv-web/src/derived/webapp/man/ag7.bak.html /vagrant/freeciv-web/src/derived/webapp/man/mp2-ag7.html printf "\nOverwriting generated manual with release-version: MP2-Brava" cp /vagrant/freeciv-web/src/derived/webapp/man/mp2-brava7.bak.html /vagrant/freeciv-web/src/derived/webapp/man/mp2-brava7.html printf "\nOverwriting auto-generated manual with release-version: MP2-Caravel" diff --git a/freeciv/advanced_backports.txt b/freeciv/advanced_backports.txt index eeef772e8..b436fe545 100644 --- a/freeciv/advanced_backports.txt +++ b/freeciv/advanced_backports.txt @@ -9,7 +9,7 @@ commits being done by cazfi: Keep the list sorted by the order they were committed to upstream Freeciv. Commit is the commit ID hash in the upstream Freeciv git repository. -Commit Date is NOT the author date (that GitHub shows) but the date it was committed. +Commit Date is NOT the author date (that GitHub shows) but the date it was committed << I don't underestand Completeness Comment is an explanation of what was changed and/or is missing. Commit Commit Date Completeness Comment @@ -19,8 +19,26 @@ a623e13f5ac5a539c6b90afacc667f4266ceae2e 2020-02-12 14:13:16 Unchanged and compl 46f22c251d36539d5059bd1876a46dbb024cc9ab 2020-02-18 00:00:05 Unchanged and complete 4b29d6320d8f12337a2f25dc0a99eb6b79e6d4ef 2020-02-22 23:51:23 Unchanged and complete 5c49fa4b0c6ac84b74d6adef10d49a777f5dd410 2020-02-25 16:45:31 Unchanged and complete +d9c010701fda075d083aea600adade73cef45020 2020-04-13 Unchanged and complete "Fix division by zero when transforming unit with zero move_rate" c67cb82f51ef5034cc361738ab8ae74946374262 2020-06-13 11:43:44 Unchanged and complete 5f5aad1b8cc6d2fea720e260f8c47944b696f32e 2020-06-13 11:43:44 Unchanged and complete +9cf91898a7fb1a1f048539ee15791d41d56070f3 2021-04-10 Unchanged and complete: Wait until city is in sane state before sending info packets + Hoped this would fix cityturn.c lines 967 and 1126 constantly throwing + 1: in city_increase_size() [../../freeciv/server/cityturn.c::1126]: assertion 'pcity->server.needs_arrange == CNA_NOT' failed. + ...But it did not. + + 9ffc624fd11f02acbec27f42df921cf796ccbe99 "Fix send_city_info_at_tile() crash when the tile has no city" d8a54ddb6a5ac083c400411a3dd456267d0ac17f 2021-05-13 Adjusted, but complete +91c7b0deb6db7af4e11bf5a446521aa3b58bd6e2 2021-07-02 identity_number can go > 64k cedd5f7a5af8a10445f01b09bd91794e0126101d 2021-07-04 09:41:02 Unchanged and complete -PATCH https://osdn.net/projects/freeciv/ticket/42600 - 2021-09-22 . Couldn't find commit for it yet +487302f4292c25f781e28d1ca7ff8c6b1e108e54 2021-09-28 Unchanged and complete "Allow moving CoastStrict unit to ocean city, or city in 1x1 island" +aacd4ab7b4e3d28b67eb77eb243054a722fa13c8 2021-10-05 ? Adjusted and complete "Free rally point when the city is destroyed." + (also sets dest_tile to -1 flag; FCW uses dest_tile so client can report coordinates of rally points.) +3f4d25ff3019e252f377c123ed4464276c476d30 2021-10-12 Unchanged and complete: Fix revealing trade partner to destination owner when trade route established +aa5cc416df38aa7baa8ae113f0b7ed4eb9f5dcd6 2021-10-17 Unchanged and complete: Lua: Add Tile:show() and Tile:hide() methods +3799001c7630b926ea1cc1693c2958077f082ea8 2021-10-19 Unchanged and complete "Clear rally point on city transfer" +569d5e61ef026a887f4c2667fddf75fea7f09b3b 2021-10-21 Unchanged and complete: default.lua: Add a chance that a map is found from a hut +8ba9f30e04b06a162ffb7d9a487ca478080a443c 2021-11-27 Unchanged and complete "Lua: Add Player:give_bulbs() method" +1673a1244ebd084fa288c66da661b36bfa70964e 2021-12-11 Lua: Add government information to Player object +https://osdn.net/projects/freeciv/ticket/44158#preview ... +... 2022-03-23 No upstream commit yet + diff --git a/freeciv/freeciv/ai/default/aidiplomat.c b/freeciv/freeciv/ai/default/aidiplomat.c index 019efd829..8080f26be 100644 --- a/freeciv/freeciv/ai/default/aidiplomat.c +++ b/freeciv/freeciv/ai/default/aidiplomat.c @@ -201,14 +201,31 @@ void dai_choose_diplomat_offensive(struct ai_type *ait, find_city_to_diplomat(pplayer, punit, &acity, &time_to_dest, pfm); pf_map_destroy(pfm); - unit_virtual_destroy(punit); if (acity == NULL || BV_ISSET(ai->stats.diplomat_reservations, acity->id)) { /* Found no target or city already considered */ + unit_virtual_destroy(punit); return; } incite_cost = city_incite_cost(pplayer, acity); + /* Actor cost mod. Target cost mod is in city_incite_cost(..) */ + incite_cost += (incite_cost + * get_target_bonus_effects(NULL, + unit_owner(punit), + city_owner(acity), + game_city_by_number(punit->homecity), + NULL, + city_tile(acity), + punit, + ut, + NULL, + NULL, + action_by_number(ACTION_SPY_INCITE_CITY), + EFT_ACTOR_INCITE_COST_PCT)) + / 100; + incite_cost = MAX(0, incite_cost); + unit_virtual_destroy(punit); if (POTENTIALLY_HOSTILE_PLAYER(ait, pplayer, city_owner(acity)) && (is_action_possible_on_city(ACTION_SPY_INCITE_CITY, pplayer, acity) @@ -511,6 +528,22 @@ static void find_city_to_diplomat(struct player *pplayer, struct unit *punit, } incite_cost = city_incite_cost(pplayer, acity); + /* Actor cost mod. Target cost mod is in city_incite_cost(..) */ + incite_cost += (incite_cost + * get_target_bonus_effects(NULL, + unit_owner(punit), + aplayer, + game_city_by_number(punit->homecity), + NULL, + city_tile(acity), + punit, + unit_type_get(punit), + NULL, + NULL, + action_by_number(ACTION_SPY_INCITE_CITY), + EFT_ACTOR_INCITE_COST_PCT)) + / 100; + incite_cost = MAX(0, incite_cost); can_incite = (incite_cost < INCITE_IMPOSSIBLE_COST) && (is_action_possible_on_city(ACTION_SPY_INCITE_CITY, pplayer, acity) @@ -686,6 +719,11 @@ static bool dai_diplomat_bribe_nearby(struct ai_type *ait, /* Should we make the expense? */ cost = unit_bribe_cost(pvictim, pplayer); + cost += (cost * get_target_bonus_effects(NULL, unit_owner(punit), + unit_owner(pvictim), game_city_by_number(punit->homecity), + NULL, unit_tile(pvictim), punit, unit_type_get(punit), + NULL, NULL, action_by_number(ACTION_SPY_BRIBE_UNIT), + EFT_ACTOR_BRIBE_COST_PCT)) / 100; if (!threat) { /* Don't empty our treasure without good reason! */ gold_avail = pplayer->economic.gold - dai_gold_reserve(pplayer); diff --git a/freeciv/freeciv/ai/default/aisettler.c b/freeciv/freeciv/ai/default/aisettler.c index dc452bdd9..f4c15f495 100644 --- a/freeciv/freeciv/ai/default/aisettler.c +++ b/freeciv/freeciv/ai/default/aisettler.c @@ -1054,8 +1054,17 @@ void dai_auto_settler_run(struct ai_type *ait, struct player *pplayer, dai_unit_new_task(ait, punit, AIUNIT_NONE, NULL); /* Only known way to end in here is that hut turned in to a city * when settler entered tile. So this is not going to lead in any - * serious recursion. */ + * serious recursion. FAMOUS LAST WORDS, it's causing segfault. + + See OSDN https://osdn.net//projects/freeciv/ticket/43630 + + FIXME: getting stuck in recursion because actionenabler req + for unit not being transported is segfaulting. If this is still + here after March 2022, tap upstream again for solution or do the + 'nuclear option' and change all rulesets to allow Settlers + to be transported, when founding cities. dai_auto_settler_run(ait, pplayer, punit, state); + */ return; } else { diff --git a/freeciv/freeciv/ai/default/daiactions.c b/freeciv/freeciv/ai/default/daiactions.c index 39dd54ae1..5d98079e5 100644 --- a/freeciv/freeciv/ai/default/daiactions.c +++ b/freeciv/freeciv/ai/default/daiactions.c @@ -157,6 +157,22 @@ adv_want dai_action_value_unit_vs_city(struct action *paction, int incite_cost, expenses; incite_cost = city_incite_cost(actor_player, target_city); + /* Actor cost mod. Target cost mod is in city_incite_cost(..) */ + incite_cost += (incite_cost + * get_target_bonus_effects(NULL, + actor_player, + target_player, + game_city_by_number(actor_unit->homecity), + NULL, + city_tile(target_city), + actor_unit, + unit_type_get(actor_unit), + NULL, + NULL, + action_by_number(ACTION_SPY_INCITE_CITY), + EFT_ACTOR_INCITE_COST_PCT)) + / 100; + incite_cost = MAX(0, incite_cost); dai_calc_data(actor_player, NULL, &expenses, NULL); if (incite_cost <= actor_player->economic.gold - 2 * expenses) { diff --git a/freeciv/freeciv/ai/default/daieffects.c b/freeciv/freeciv/ai/default/daieffects.c index 65f40ddf3..628e61a28 100644 --- a/freeciv/freeciv/ai/default/daieffects.c +++ b/freeciv/freeciv/ai/default/daieffects.c @@ -194,6 +194,8 @@ adv_want dai_effect_value(struct player *pplayer, struct government *gov, case EFT_OUTPUT_WASTE_BY_DISTANCE: case EFT_OUTPUT_WASTE_BY_REL_DISTANCE: case EFT_OUTPUT_WASTE_PCT: + case EFT_OUTPUT_WASTE_MIN_REDUCE: + case EFT_OUTPUT_WASTE_REDUCE: case EFT_SPECIALIST_OUTPUT: case EFT_ENEMY_CITIZEN_UNHAPPY_PCT: case EFT_IRRIGATION_PCT: @@ -359,6 +361,12 @@ adv_want dai_effect_value(struct player *pplayer, struct government *gov, * (capital + 1) * amount / 100; } break; + case EFT_TILE_NUKE_PROOF: + if (ai->threats.nuclear) { + v += city_size_get(pcity) * unit_list_size(pcity->tile->units) + * (capital + 1) * amount / 100; + } + break; case EFT_REVEAL_MAP: if (!ai->explore.land_done || !ai->explore.sea_done) { v += 10; @@ -445,6 +453,9 @@ adv_want dai_effect_value(struct player *pplayer, struct government *gov, num = num_affected_units(peffect, ai); v += amount * (3 * c + num); break; + case EFT_RAZE_BUILDING_PCT: + /* Negative is desirable, avoid amount=65535 to skew decision */ + v -= MAX(100,amount) / 5; case EFT_UPGRADE_UNIT: if (amount == 1) { v += ai->stats.units.upgradeable * 2; @@ -454,6 +465,14 @@ adv_want dai_effect_value(struct player *pplayer, struct government *gov, v += ai->stats.units.upgradeable * 4; } break; + case EFT_ACTOR_BRIBE_COST_PCT: + /* Negative amounts are desirable */ + v -= amount / 5; + break; + case EFT_ACTOR_INCITE_COST_PCT: + /* Negative amounts are desirable */ + v -= amount / 5; + break; case EFT_UNIT_BRIBE_COST_PCT: num = num_affected_units(peffect, ai); v += ((2 * c + num) * amount) / 400; @@ -551,6 +570,7 @@ adv_want dai_effect_value(struct player *pplayer, struct government *gov, case EFT_MARTIAL_LAW_EACH: case EFT_MARTIAL_LAW_MAX: case EFT_RAPTURE_GROW: + case EFT_RAPTURE_RATE_PM: case EFT_REVOLUTION_UNHAPPINESS: case EFT_HAS_SENATE: case EFT_INSPIRE_PARTISANS: @@ -560,6 +580,7 @@ adv_want dai_effect_value(struct player *pplayer, struct government *gov, case EFT_NOT_TECH_SOURCE: case EFT_OUTPUT_PENALTY_TILE: case EFT_OUTPUT_INC_TILE_CELEBRATE: + case EFT_CELEBRATE_SIZE_ADD: case EFT_TRADE_REVENUE_BONUS: case EFT_TILE_WORKABLE: case EFT_COMBAT_ROUNDS: @@ -570,6 +591,7 @@ adv_want dai_effect_value(struct player *pplayer, struct government *gov, case EFT_BORDER_VISION: case EFT_STEALINGS_IGNORE: case EFT_UNIT_SHIELD_VALUE_PCT: + case EFT_REHOME_PCT: break; /* This has no effect for AI */ case EFT_VISIBLE_WALLS: diff --git a/freeciv/freeciv/client/helpdata.c b/freeciv/freeciv/client/helpdata.c index d77ff956c..198f7be7e 100644 --- a/freeciv/freeciv/client/helpdata.c +++ b/freeciv/freeciv/client/helpdata.c @@ -1936,8 +1936,12 @@ char *helptext_unit(char *buf, size_t bufsz, struct player *pplayer, _("%s Can bypass unreachable units and attack reachable " "units on the same tile.\n"), BULLET_BIG); } + if (utype_has_flag(utype, UTYF_TRANSPORTDEFENDER)) { + CATLSTR(buf, bufsz, + _("%s Can always defend while transported, even on non-native terrain.\n"), BULLET_BIG); + } if (utype_has_flag(utype, UTYF_CANESCAPE)) { - CATLSTR(buf, bufsz, _("%s Has 50%% chance to escape once stack defender is lost, if it has more moves left than attacker.\n"), + CATLSTR(buf, bufsz, _("%s Has a chance to escape once stack defender is lost, if it has more moves left than attacker.\n"), BULLET_BIG); } if (utype_has_flag(utype, UTYF_CANKILLESCAPING)) { @@ -1948,6 +1952,10 @@ char *helptext_unit(char *buf, size_t bufsz, struct player *pplayer, if (utype_has_flag(utype, UTYF_NOBUILD)) { CATLSTR(buf, bufsz, _("%s May not be built in cities.\n"), BULLET_BIG); } + if (utype_has_flag(utype, UTYF_MULTISLOT)) { + CATLSTR(buf, bufsz, _("%s May use extra build slots: in some cases, cities " + "may produce more than one of these per turn.\n"), BULLET_BIG); + } if (utype_has_flag(utype, UTYF_BARBARIAN_ONLY)) { CATLSTR(buf, bufsz, _("%s Only barbarians may build this.\n"), BULLET_BIG); } @@ -2011,6 +2019,9 @@ char *helptext_unit(char *buf, size_t bufsz, struct player *pplayer, if (utype_has_flag(utype, UTYF_NOHOME)) { CATLSTR(buf, bufsz, _("%s Never has a home city.\n"), BULLET_BIG); } + if (utype_has_flag(utype, UTYF_SENTRYALWAYS)) { + CATLSTR(buf, bufsz, _("%s Always on Sentry: reports all enemy movement it sees.\n"), BULLET_BIG); + } if (utype_has_flag(utype, UTYF_GAMELOSS)) { CATLSTR(buf, bufsz, _("%s Losing this unit will lose you the game!\n"), BULLET_BIG); diff --git a/freeciv/freeciv/client/text.c b/freeciv/freeciv/client/text.c index d7ae723dc..955c6b7eb 100644 --- a/freeciv/freeciv/client/text.c +++ b/freeciv/freeciv/client/text.c @@ -157,7 +157,6 @@ const char *popup_info_text(struct tile *ptile) char nation[2 * MAX_LEN_NAME + 32]; int tile_x, tile_y, nat_x, nat_y; bool first; - int dummy; astr_clear(&str); index_to_map_pos(&tile_x, &tile_y, tile_index(ptile)); @@ -333,7 +332,7 @@ const char *popup_info_text(struct tile *ptile) astr_add_line(&str, _("Infrastructure: %s"), infratext); } } - activity_text = concat_tile_activity_text(ptile, &dummy); + activity_text = concat_tile_activity_text(ptile); if (strlen(activity_text) > 0) { astr_add_line(&str, _("Activity: %s"), activity_text); } diff --git a/freeciv/freeciv/common/actions.c b/freeciv/freeciv/common/actions.c index c742f7c07..f112c690f 100644 --- a/freeciv/freeciv/common/actions.c +++ b/freeciv/freeciv/common/actions.c @@ -214,14 +214,20 @@ static void hard_code_oblig_hard_reqs(void) ACTION_ATTACK, ACTION_SUICIDE_ATTACK, ACTION_NONE); - /* Why this is a hard requirement: Keep the old rules. Need to work - * out corner cases. */ + /* Why this used to be a hard requirement: Keep the old rules. Need to work + * out corner cases... + * Why this is NO LONGER a hard requirement... this totally handicaps the + upgrade command with something the ruleset actionenabler should be + responsible for doing by itself. For "old rules" compatibility just + make sure UNIT_UPGRADE actionenablers in all rulesets add the req: + "CityTile", "Center", "Local", TRUE oblig_hard_req_register(req_from_values(VUT_DIPLREL, REQ_RANGE_LOCAL, FALSE, TRUE, TRUE, DRO_FOREIGN), FALSE, "All action enablers for %s must require a " "domestic target.", ACTION_UPGRADE_UNIT, ACTION_NONE); + */ /* Why this is a hard requirement: The code expects that only domestic and * allied transports can be boarded. */ @@ -747,7 +753,7 @@ static void hard_code_actions(void) * keep the rules exactly as they were for now. */ 0, 0, FALSE); actions[ACTION_UPGRADE_UNIT] = - action_new(ACTION_UPGRADE_UNIT, ATK_CITY, ASTK_NONE, + action_new(ACTION_UPGRADE_UNIT, ATK_TILE, ASTK_NONE, FALSE, ACT_TGT_COMPL_SIMPLE, TRUE, TRUE, /* Illegal to perform to a target on another tile to * keep the rules exactly as they were for now. */ diff --git a/freeciv/freeciv/common/actions.h b/freeciv/freeciv/common/actions.h index 89e04f53d..9c0ceb9de 100644 --- a/freeciv/freeciv/common/actions.h +++ b/freeciv/freeciv/common/actions.h @@ -140,7 +140,7 @@ extern "C" { #define SPECENUM_VALUE37NAME "Nuke City" #define SPECENUM_VALUE38 ACTION_NUKE_UNITS #define SPECENUM_VALUE38NAME "Nuke Units" -#define SPECENUM_VALUE39 ACTION_DESTROY_CITY +#define SPECENUM_VALUE39 ACTION_DESTROY_CITY /* if this changes from 39, script.lua must be changed in MP2D and onward */ #define SPECENUM_VALUE39NAME "Destroy City" #define SPECENUM_VALUE40 ACTION_EXPEL_UNIT #define SPECENUM_VALUE40NAME "Expel Unit" @@ -156,7 +156,7 @@ extern "C" { #define SPECENUM_VALUE45NAME "Paradrop Unit" #define SPECENUM_VALUE46 ACTION_AIRLIFT #define SPECENUM_VALUE46NAME "Airlift Unit" -#define SPECENUM_VALUE47 ACTION_ATTACK +#define SPECENUM_VALUE47 ACTION_ATTACK /* NOTE: when ACTION_ATTACK_2 is added, be SURE to insert it into FCW's customized unit_can_do_action() for max_attacks compatibility */ #define SPECENUM_VALUE47NAME "Attack" #define SPECENUM_VALUE48 ACTION_SUICIDE_ATTACK #define SPECENUM_VALUE48NAME "Suicide Attack" diff --git a/freeciv/freeciv/common/aicore/aisupport.c b/freeciv/freeciv/common/aicore/aisupport.c index 9da40e39e..5c8140e7f 100644 --- a/freeciv/freeciv/common/aicore/aisupport.c +++ b/freeciv/freeciv/common/aicore/aisupport.c @@ -133,7 +133,7 @@ int city_gold_worth(struct city *pcity) if (punittype && can_city_build_unit_direct(pcity, punittype)) { /* obsolete, candidate for disbanding */ worth += unit_shield_value(punit, unit_type_get(punit), - action_by_number(ACTION_RECYCLE_UNIT)); + action_by_number(ACTION_RECYCLE_UNIT), pplayer); } else { worth += unit_build_shield_cost(pcity, punit); /* good stuff */ } diff --git a/freeciv/freeciv/common/city.c b/freeciv/freeciv/common/city.c index 627adcb72..fa4287890 100644 --- a/freeciv/freeciv/common/city.c +++ b/freeciv/freeciv/common/city.c @@ -742,30 +742,23 @@ bool city_production_build_units(const struct city *pcity, int shields_left = pcity->shield_stock; int unit_shield_cost, i; - /* When game.server.slot_control gives rulesets control over city_build_slots, - * then some units can be made multiple times, and other types can only be - * made once. The differentiator is the Shield2Gold flag, since - * (a) many rulesets don't use it, (b) rulesets who use it for some units and - * not others, tend to use it as a dynamic to encourage those unit types, (c) - * freeciv doesn't yet have a built-in unit-flag for differentiating (but when it - * does we will just change the UTYF_SHIELD2GOLD in a few lines below and we're - * good to go!) - * There are three potential values that can be put in a the slot_control_style server - * setting to regulate the style of this: - * 1. SC_MIXED: A non-multi-slot unit doesn't PREVENT multi-slot units from using up their - * intended ability to use free slots. Simply, more than one non-multi-slot unit - * cannot be made. That is, if you have 3 slots, you can make a max. of one - * non-multi-slot unit and up to two multi-slot units. For MANY reasons this - * option usually makes the most sense, which is why it's default. SC_MIXED - * 2. SC_SEGREGATED: Any multi-slot unit (msu) can be made with any other msu, and - * production halts the moment multiple slots attempt to be occupied, where a - * new slot being filled would result in a non-multi-slot unit being made in a - * batch that has more than 1 unit made. SC_SEGREGATED. - * 3. SC_SAME_TYPE: Only the same type of unit can be made multiple times. This is the legacy - * (kinda crappy) option. SC_SAME_TYPE. + /* When game.server.slot_control is on, then MULTISLOT UNITS ("MSU") can be made + * multiple times, and other types can only be made once. An "MSU" is any unit with + * that UTYF_MULTISLOT flag. There are three potential values that can be put in the + * slot_control_style server setting to regulate how slot_control will then operate: + * 1. "SC_MIXED": A maximum of one non-MSU can be made. Any extra slots must be used + * by MSU's. e.g., If you have 3 slots, you can make up to 3 units, only one of + * which can (optionally) be a non-MSU. "SC_MIXED" is the default setting. + * 2. "SC_SEGREGATED": Multiple slots can be used so long as they only units ever made + * are MSU's. Production halts the moment it would result in a non-MSU unit being + * bundled in a batch of multiple units. In other words, you can't use extra slots + * whenever a non-MSU is in the batch. + * 3. "SC_SAME_TYPE": Only the same type of unit can be made multiple times. This was + * the old, unpopular, and unrealistic legacy behaviour. * - * If game.server.slot_control is OFF, option 1 and 2 allow units of different - * types to mix. Option 3 disallows it. + * If game.server.slot_control is OFF, things are much simpler. Option 1 and 2 are + * identical and allow units of different types to mix. Option 3 disallows it and + * keeps the old legacy behaviour. */ bool utype_is_slotblocker = false; int slotblockers = 0; // slotblockers is a count of units from the group of which more @@ -783,33 +776,28 @@ bool city_production_build_units(const struct city *pcity, /* Can't use multiple city_build_slots: ➤ Unique units: restricts any second unit. - ➤ Units without utypeflag "Shield2Gold" IF game.server.slot_control==TRUE - Later, a custom flag "MultiSlot" should be used. - ➤ Pop units: restricts any second unit. - Can't think of WHY, this nerfs Migrants too much by wiping out a whole production-turn-slot. */ + ➤ Units without utypeflag "UTYF_MULTISLOT" IF game.server.slot_control==TRUE */ if (/*utype_pop_value(utype) != 0 || */utype_has_flag(utype, UTYF_UNIQUE) ) { - /* Pop_cost unit or Unique_unit: means ONLY this unit can be built */ + /* Unique_unit: ONLY this unit can be built */ (*num_units)++; // = 1 return FALSE; } if ( game.server.slot_control - && !(utype_has_flag(utype, UTYF_SHIELD2GOLD)) + && !(utype_has_flag(utype, UTYF_MULTISLOT)) && game.server.slot_control_style == SC_MIXED ) { utype_is_slotblocker = true; } else if ( game.server.slot_control && game.server.slot_control_style == SC_SEGREGATED - && !(utype_has_flag(utype, UTYF_SHIELD2GOLD))) { + && !(utype_has_flag(utype, UTYF_MULTISLOT))) { (*num_units)++; return FALSE; } if (add_production) { - //TODO: test, shouldn't this be pcity->surplus[O_SHIELD] instead? if we are crediting shields - //prior to upkeep, there could be a case where a unit gets made without sufficient shields? shields_left += pcity->prod[O_SHIELD]; } unit_shield_cost = utype_build_shield_cost(pcity, utype); @@ -854,12 +842,7 @@ bool city_production_build_units(const struct city *pcity, return FALSE; // ILLEGAL, go home } // STEP 2. Flag this unit if "a maximum of one unit from this category can be made" - // TODO: this is arbitrarily using UTYF_SHIELD2GOLD only because 1) I couldn't add new flag - // UTYF_MULTI_SLOT without it breaking the manual generator's fc_assertion at - // [unittype.c::1347]: assertion 'id >= UTYF_USER_FLAG_1 && id <= UTYF_LAST_USER_FLAG' failed. - // and 2) Shield2Gold flag is often never used AND when it is used, tends to favour higher - // quantities of those types of units (probably for a good reason.) - if (game.server.slot_control && !(utype_has_flag(target.value.utype, UTYF_SHIELD2GOLD))) { + if (game.server.slot_control && !(utype_has_flag(target.value.utype, UTYF_MULTISLOT))) { utype_is_slotblocker = true; } else utype_is_slotblocker = false; } @@ -884,7 +867,7 @@ bool city_production_build_units(const struct city *pcity, shields_left -= unit_shield_cost; /* If there is another item in the worklist, then: - ➤ check if it's legal for shield2gold (later multislot) production and exit if not, + ➤ check if it's legal for MultiSlot production and exit if not, ➤ otherwise if it's legal, adjust the shield cost to the new item ➤ so the loop will begin again with the right info to check. */ if (worklist_length(&pcity->worklist) > i) { @@ -904,11 +887,7 @@ bool city_production_build_units(const struct city *pcity, // STEP ONE. Check again if it it's legal to make >1 of this if (/*utype_pop_value(target.value.utype) != 0 || */ utype_has_flag(target.value.utype, UTYF_UNIQUE) - // to do: this is arbitrarily using UTYF_SHIELD2GOLD only because 1) I couldn't add new flag - // UTYF_MULTI_SLOT without it breaking the manual generator's assertion of - // [unittype.c::1347]: assertion 'id >= UTYF_USER_FLAG_1 && id <= UTYF_LAST_USER_FLAG' failed. - // and 2) it just so happens that every unit I was adding MultiSlot to in MP2 was Shield2Gold flag. - || (game.server.slot_control && !(utype_has_flag(target.value.utype, UTYF_SHIELD2GOLD))) ) { + || (game.server.slot_control && !(utype_has_flag(target.value.utype, UTYF_MULTISLOT))) ) { return FALSE; // not legal, go home } @@ -1755,7 +1734,7 @@ bool city_got_defense_effect(const struct city *pcity, **************************************************************************/ bool city_happy(const struct city *pcity) { - return (city_size_get(pcity) >= game.info.celebratesize + return (city_size_get(pcity) >= city_celebrate_size(pcity) && pcity->feel[CITIZEN_ANGRY][FEELING_FINAL] == 0 && pcity->feel[CITIZEN_UNHAPPY][FEELING_FINAL] == 0 && pcity->feel[CITIZEN_HAPPY][FEELING_FINAL] >= (city_size_get(pcity) + 1) / 2); @@ -1778,7 +1757,18 @@ bool city_unhappy(const struct city *pcity) **************************************************************************/ bool base_city_celebrating(const struct city *pcity) { - return (city_size_get(pcity) >= game.info.celebratesize && pcity->was_happy); + return (city_size_get(pcity) >= city_celebrate_size(pcity) && pcity->was_happy); +} + +/**********************************************************************//** + The minimum size at which a city may celebrate. +**************************************************************************/ +int city_celebrate_size(const struct city *pcity) +{ + return game.info.celebratesize + + get_target_bonus_effects(NULL, city_owner(pcity), NULL, pcity, NULL, + city_tile(pcity), NULL, NULL, NULL, NULL, NULL, + EFT_CELEBRATE_SIZE_ADD); } /**********************************************************************//** @@ -1789,6 +1779,64 @@ bool city_celebrating(const struct city *pcity) return base_city_celebrating(pcity) && city_happy(pcity); } +/**********************************************************************//** +The turns on which a city can rapture are altered by: +(1) EFT_RAPTURE_RATE_PM (e.g., 500 is half of turns, 1000 is every turn), +(2) game.info.rapturedelay == x, further slows all rapture to 1/x speed +**************************************************************************/ +bool is_rapture_turn(const struct city *pcity, int idx) +{ + int idx2 = idx-1; + + float rate; + int rate_pm = get_city_bonus(pcity, EFT_RAPTURE_RATE_PM); + + if (rate_pm) { + rate = rate_pm; + } else { + /* ruleset compat: default to 1000 ‰ if not set */ + rate = 1000; + } + + rate /= (game.info.rapturedelay*1000); + + /* Each time +=rate crosses a whole number boundary, + we qualify for another turn of rapture. */ + return (int)(idx*rate) != (int)(idx2*rate); +} + +/**********************************************************************//** +Returns bitcode helping us notify the user about rapture timing. + code & 1 = Qualifies to rapture and WILL rapture NOW. + code & 2 = Qualifies to rapture BUT is DELAYED, CAN rapture NEXT TURN. +i.e.: +0 = Doesn't qualify, OR is delayed this turn AND next turn. +1 = Raptured now but can't next turn, due to rate delay or rapturedelay. +2 = Delayed now but can rapture next turn. +3 = Raptured now and can rapture next turn. +**************************************************************************/ +int city_would_rapture(const struct city *pcity) +{ + int code = 0; + + if (pcity->rapture > 0 && pcity->surplus[O_FOOD] > 0 + && get_city_bonus(pcity, EFT_RAPTURE_GROW) > 0) { + + bool now = is_rapture_turn(pcity, pcity->rapture); + bool next = is_rapture_turn(pcity, pcity->rapture+1); + bool next2 = is_rapture_turn(pcity, pcity->rapture+2); + bool next3 = is_rapture_turn(pcity, pcity->rapture+3); + + if (now) code |= 1; + if (next) code |= 2; + if (next2) code |= 4; + if (next3) code |= 8; + } + + return code; +} + + /**********************************************************************//** Returns whether city is growing by rapture. **************************************************************************/ @@ -1796,9 +1844,19 @@ bool city_rapture_grow(const struct city *pcity) { /* .rapture is checked instead of city_celebrating() because this function is called after .was_happy was updated. */ + + if (pcity->rapture > 0 && pcity->surplus[O_FOOD] > 0 + && get_city_bonus(pcity, EFT_RAPTURE_GROW) > 0) { + + return is_rapture_turn(pcity, pcity->rapture); + } + + return false; +/* old code that does not use is_rapture_turn(..): return (pcity->rapture > 0 && pcity->surplus[O_FOOD] > 0 && (pcity->rapture % game.info.rapturedelay) == 0 && get_city_bonus(pcity, EFT_RAPTURE_GROW) > 0); +*/ } /**********************************************************************//** @@ -3410,16 +3468,29 @@ int city_waste(const struct city *pcity, Output_type_id otype, int total, if (waste_all) { penalty_waste = total_eft; } else { + /* Percentage to reduce penalty_waste by */ int waste_pct = get_city_output_bonus(pcity, get_output_type(otype), EFT_OUTPUT_WASTE_PCT); + /* The minimum amount to reduce from penalty_waste, i.e., if waste_pct + doesn't reduce more than this, this amount is reduced. */ + int min_waste_reduction = get_city_output_bonus(pcity, get_output_type(otype), + EFT_OUTPUT_WASTE_MIN_REDUCE); + /* An absolute amount to reduce from penalty_waste, as a raw subtractive value */ + int bonus_waste_reduction = get_city_output_bonus(pcity, get_output_type(otype), + EFT_OUTPUT_WASTE_REDUCE); /* corruption/waste calculated only for the actually produced amount */ if (waste_level > 0) { penalty_waste = total_eft * waste_level / 100; } + int original_penalty_waste = penalty_waste; /* bonus calculated only for the actually produced amount */ penalty_waste -= penalty_waste * waste_pct / 100; + penalty_waste -= bonus_waste_reduction; + if (original_penalty_waste - penalty_waste < min_waste_reduction) { + penalty_waste = original_penalty_waste - min_waste_reduction; + } /* Clip */ penalty_waste = MIN(MAX(penalty_waste, 0), total_eft); @@ -3627,6 +3698,7 @@ void destroy_city_virtual(struct city *pcity) citizens_free(pcity); + /* Free worker tasks */ while (worker_task_list_size(pcity->task_reqs) > 0) { struct worker_task *ptask = worker_task_list_get(pcity->task_reqs, 0); @@ -3636,6 +3708,9 @@ void destroy_city_virtual(struct city *pcity) } worker_task_list_destroy(pcity->task_reqs); + /* Free rally points */ + city_rally_point_clear(pcity); + unit_list_destroy(pcity->units_supported); trade_route_list_destroy(pcity->routes); if (pcity->tile_cache != NULL) { @@ -3736,3 +3811,19 @@ void city_set_ai_data(struct city *pcity, const struct ai_type *ai, { pcity->server.ais[ai_type_number(ai)] = data; } + +/**********************************************************************//** + Clear rally point set for the city. +**************************************************************************/ +void city_rally_point_clear(struct city *pcity) +{ + /* Free rally points */ + if (pcity->rally_point.length > 0) { + pcity->rally_point.length = 0; + pcity->rally_point.persistent = FALSE; + pcity->rally_point.vigilant = FALSE; + pcity->rally_point.dest_tile = -1; + free(pcity->rally_point.orders); + pcity->rally_point.orders = NULL; + } +} \ No newline at end of file diff --git a/freeciv/freeciv/common/city.h b/freeciv/freeciv/common/city.h index 77c14b339..2d0d7c0eb 100644 --- a/freeciv/freeciv/common/city.h +++ b/freeciv/freeciv/common/city.h @@ -299,6 +299,12 @@ enum city_build_result { CB_NO_MIN_DIST }; +enum city_needs_arrange { + CNA_NOT = 0, + CNA_NORMAL, + CNA_BROADCAST_PENDING +}; + struct tile_cache; /* defined and only used within city.c */ struct adv_city; /* defined in ./server/advisors/infracache.h */ @@ -370,7 +376,8 @@ struct city { int anarchy; /* anarchy rounds count */ int hangry; /* hangry rounds count */ - int rapture; /* rapture rounds count */ + int rapture; /* rapture rounds count */ + int rapture_status; /* reason/timing code for rapture status/delay */ int turn_founded; int turn_last_built; @@ -427,7 +434,7 @@ struct city { /* If set, workers need to be arranged when the city is unfrozen. * Set inside auto_arrange_workers() and city_freeze_workers_queue(). */ - bool needs_arrange; + enum city_needs_arrange needs_arrange; /* If set, city needs to be refreshed at a later time. * Set inside city_refresh() and city_refresh_queue_add(). */ @@ -564,7 +571,10 @@ int city_unit_unhappiness(struct unit *punit, int *free_unhappy); bool city_happy(const struct city *pcity); /* generally use celebrating instead */ bool city_unhappy(const struct city *pcity); /* anarchy??? */ bool base_city_celebrating(const struct city *pcity); +int city_celebrate_size(const struct city *pcity); bool city_celebrating(const struct city *pcity); /* love the king ??? */ +bool is_rapture_turn(const struct city *pcity, int idx2); /* rapturedelay, EFT_RAPTURE_RATE_PM */ +int city_would_rapture(const struct city *pcity); /* reason/timing code for (non)rapture */ bool city_rapture_grow(const struct city *pcity); bool city_is_occupied(const struct city *pcity); @@ -784,6 +794,8 @@ void *city_ai_data(const struct city *pcity, const struct ai_type *ai); void city_set_ai_data(struct city *pcity, const struct ai_type *ai, void *data); +void city_rally_point_clear(struct city *pcity); + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/freeciv/freeciv/common/clientutils.c b/freeciv/freeciv/common/clientutils.c index f4c31f567..17fc40e7c 100644 --- a/freeciv/freeciv/common/clientutils.c +++ b/freeciv/freeciv/common/clientutils.c @@ -28,6 +28,130 @@ * except that in case of freeciv-web, server does handle these * for the web client. */ +/************************************************************************//** + Creates the activity progress text for a single unit on its tile. + + This should be kept as identical as possible to + concat_tile_activity_text() one function below it. The difference is that + it doesn't concatenate all the activities of all the units on the tile. + The number of turns the single punit needs to finish its activity, + is passed back via the *finish_turns parameter. +****************************************************************************/ +const char *unit_tile_activity_text(struct unit *punit, + int *finish_turns) +{ + if (!punit) return NULL; + struct tile *ptile = unit_tile(punit); + int activity_total[ACTIVITY_LAST] = {0}; + int activity_units[ACTIVITY_LAST] = {0}; + int extra_total[MAX_EXTRA_TYPES] = {0}; + int extra_units[MAX_EXTRA_TYPES] = {0}; + int rmextra_total[MAX_EXTRA_TYPES] = {0}; + int rmextra_units[MAX_EXTRA_TYPES] = {0}; + int remains, turns = 0; + static struct astring str = ASTRING_INIT; + astr_clear(&str); + + unit_list_iterate(ptile->units, aunit) { + if (is_clean_activity(aunit->activity)) { + int eidx = extra_index(aunit->activity_target); + rmextra_total[eidx] += aunit->activity_count; + rmextra_total[eidx] += get_activity_rate_this_turn(aunit); + rmextra_units[eidx] += get_activity_rate(aunit); + } else if (is_build_activity(aunit->activity, ptile)) { + int eidx = extra_index(aunit->activity_target); + extra_total[eidx] += aunit->activity_count; + extra_total[eidx] += get_activity_rate_this_turn(aunit); + extra_units[eidx] += get_activity_rate(aunit); + } else { + activity_total[aunit->activity] += aunit->activity_count; + activity_total[aunit->activity] += get_activity_rate_this_turn(aunit); + activity_units[aunit->activity] += get_activity_rate(aunit); + } + } unit_list_iterate_end; + + enum unit_activity i = punit->activity; + + if (is_build_activity(i, ptile)) { + enum extra_cause cause = EC_NONE; + switch (i) { + case ACTIVITY_GEN_ROAD: + cause = EC_ROAD; + break; + case ACTIVITY_BASE: + cause = EC_BASE; + break; + case ACTIVITY_IRRIGATE: + cause = EC_IRRIGATION; + break; + case ACTIVITY_MINE: + cause = EC_MINE; + break; + default: + fc_assert(cause != EC_NONE); + break; + }; + if (cause != EC_NONE) { + int ei = extra_index(punit->activity_target); + if (extra_units[ei] > 0) { + remains = tile_activity_time(i, ptile, punit->activity_target) - extra_total[ei]; + if (remains > 0) { + turns = 1 + (remains + extra_units[ei] - 1) / extra_units[ei]; + } else { + /* extra will be finished this turn */ + turns = 1; + } + astr_add(&str, "%s(%d)", extra_name_translation(punit->activity_target), turns); + } + } + } else if (is_clean_activity(i)) { + enum extra_rmcause rmcause = ERM_NONE; + switch (i) { + case ACTIVITY_PILLAGE: + rmcause = ERM_PILLAGE; + break; + case ACTIVITY_POLLUTION: + rmcause = ERM_CLEANPOLLUTION; + break; + case ACTIVITY_FALLOUT: + rmcause = ERM_CLEANFALLOUT; + break; + default: + fc_assert(rmcause != ERM_NONE); + break; + }; + if (rmcause != ERM_NONE) { + extra_type_by_rmcause_iterate(rmcause, ep) { + int ei = extra_index(ep); + + if (rmextra_units[ei] > 0) { + remains = tile_activity_time(i, ptile, ep) - rmextra_total[ei]; + if (remains > 0) { + turns = 1 + (remains + rmextra_units[ei] - 1) / rmextra_units[ei]; + } else { + /* extra will be removed this turn */ + turns = 1; + } + astr_add(&str, rmcause == ERM_PILLAGE ? _("Pillage %s(%d)") : _("Clean %s(%d)"), + extra_name_translation(ep), turns); + } + } extra_type_by_rmcause_iterate_end; + } + } else if (is_tile_activity(i)) { + if (activity_units[i] > 0) { + remains = tile_activity_time(i, ptile, NULL) - activity_total[i]; + if (remains > 0) { + turns = 1 + (remains + activity_units[i] - 1) / activity_units[i]; + } else { + /* activity will be finished this turn */ + turns = 1; + } + astr_add(&str, "%s(%d)", get_activity_text(i), turns); + } + } + *finish_turns = turns; + return astr_str(&str); +} /************************************************************************//** Creates the activity progress text for the given tile. @@ -35,12 +159,12 @@ Caller is responsible now for passing an int *, this empowers other code to also use this function to calculate turns left on the tile. - FIXME: This freeciv-web addition of turns pointer is buggy, - as if there's multiple activities going, number of turns is - returned just for one of them, and not any logically selected - one in that. + FIXME: Any changes to this should be transferred as identical as possible + to the unit_tile_activity_text() function directly above, which does + the same as this, but for a single punit (it doesn't concatenate multiple + unit activities.) ****************************************************************************/ -const char *concat_tile_activity_text(struct tile *ptile, int *turns) +const char *concat_tile_activity_text(struct tile *ptile) { int activity_total[ACTIVITY_LAST]; int activity_units[ACTIVITY_LAST]; @@ -49,7 +173,7 @@ const char *concat_tile_activity_text(struct tile *ptile, int *turns) int rmextra_total[MAX_EXTRA_TYPES]; int rmextra_units[MAX_EXTRA_TYPES]; int num_activities = 0; - int remains; //, turns; + int remains, turns; static struct astring str = ASTRING_INIT; astr_clear(&str); @@ -110,15 +234,15 @@ const char *concat_tile_activity_text(struct tile *ptile, int *turns) if (extra_units[ei] > 0) { remains = tile_activity_time(i, ptile, ep) - extra_total[ei]; if (remains > 0) { - *turns = 1 + (remains + extra_units[ei] - 1) / extra_units[ei]; + turns = 1 + (remains + extra_units[ei] - 1) / extra_units[ei]; } else { /* extra will be finished this turn */ - *turns = 1; + turns = 1; } if (num_activities > 0) { astr_add(&str, "/"); } - astr_add(&str, "%s(%d)", extra_name_translation(ep), *turns); + astr_add(&str, "%s(%d)", extra_name_translation(ep), turns); num_activities++; } } extra_type_by_cause_iterate_end; @@ -148,16 +272,16 @@ const char *concat_tile_activity_text(struct tile *ptile, int *turns) if (rmextra_units[ei] > 0) { remains = tile_activity_time(i, ptile, ep) - rmextra_total[ei]; if (remains > 0) { - *turns = 1 + (remains + rmextra_units[ei] - 1) / rmextra_units[ei]; + turns = 1 + (remains + rmextra_units[ei] - 1) / rmextra_units[ei]; } else { /* extra will be removed this turn */ - *turns = 1; + turns = 1; } if (num_activities > 0) { astr_add(&str, "/"); } astr_add(&str, rmcause == ERM_PILLAGE ? _("Pillage %s(%d)") : _("Clean %s(%d)"), - extra_name_translation(ep), *turns); + extra_name_translation(ep), turns); num_activities++; } } extra_type_by_rmcause_iterate_end; @@ -166,15 +290,15 @@ const char *concat_tile_activity_text(struct tile *ptile, int *turns) if (activity_units[i] > 0) { remains = tile_activity_time(i, ptile, NULL) - activity_total[i]; if (remains > 0) { - *turns = 1 + (remains + activity_units[i] - 1) / activity_units[i]; + turns = 1 + (remains + activity_units[i] - 1) / activity_units[i]; } else { /* activity will be finished this turn */ - *turns = 1; + turns = 1; } if (num_activities > 0) { astr_add(&str, "/"); } - astr_add(&str, "%s(%d)", get_activity_text(i), *turns); + astr_add(&str, "%s(%d)", get_activity_text(i), turns); num_activities++; } } diff --git a/freeciv/freeciv/common/clientutils.h b/freeciv/freeciv/common/clientutils.h index f0425620b..0df3f7a8a 100644 --- a/freeciv/freeciv/common/clientutils.h +++ b/freeciv/freeciv/common/clientutils.h @@ -19,7 +19,8 @@ extern "C" { struct tile; -const char *concat_tile_activity_text(struct tile *ptile, int *turns); +const char *unit_tile_activity_text(struct unit *punit, int *finish_turns); +const char *concat_tile_activity_text(struct tile *ptile); #ifdef __cplusplus } diff --git a/freeciv/freeciv/common/combat.c b/freeciv/freeciv/common/combat.c index 287cec91f..226457cba 100644 --- a/freeciv/freeciv/common/combat.c +++ b/freeciv/freeciv/common/combat.c @@ -442,6 +442,43 @@ struct city *sdi_try_defend(const struct player *owner, return NULL; } +/*******************************************************************//** + Besides SDI protecting a city, individual tiles may be nuke resistant + for their own reasons; e.g., bunker, fallout shelter, etc. + This gives finer control of protecting specific tiles without + shooting down the nuke and preventing its explosion. In addition, + it allows setting a probability for tile protection. (Use 0 or 100 + for boolean behaviour). +***********************************************************************/ +bool is_tile_nuke_proof(const struct tile *ptile) +{ + /* Set initial resistance value of the tile */ + int val = get_target_bonus_effects(NULL, NULL, NULL, tile_city(ptile), + NULL, ptile, NULL, NULL, NULL, + NULL, NULL, EFT_TILE_NUKE_PROOF); + + + /* Check if any unit has a higher resistance than the tile itself */ + unit_list_iterate_safe(ptile->units, punit) { + int tmp = get_target_bonus_effects(NULL, + unit_owner(punit), + NULL, + tile_city(ptile), + NULL, + ptile, + punit, + unit_type_get(punit), + NULL, + NULL, + NULL, + EFT_TILE_NUKE_PROOF); + /* The highest resistance value will be used. */ + if (tmp > val) val = tmp; + } unit_list_iterate_safe_end; + + return (fc_rand(100) < val); +} + /*******************************************************************//** Convenience wrapper for base_get_attack_power. ***********************************************************************/ @@ -576,12 +613,7 @@ static int defense_multiplication(const struct unit_type *att_type, defensepower += defensepower * tile_extras_defense_bonus(ptile, def_type) / 100; - /* //+++ - if ((pcity || def->activity == ACTIVITY_FORTIFIED) - && uclass_has_flag(utype_class(def_type), UCF_CAN_FORTIFY) - && !utype_has_flag(def_type, UTYF_CANT_FORTIFY)) { - defensepower = (defensepower * 3) / 2; - }*/ // old hard coded 0.5 bonus for fortified or in city, now uses: + defensepower = defensepower * (100 + get_target_bonus_effects(NULL, unit_owner(def), NULL, diff --git a/freeciv/freeciv/common/combat.h b/freeciv/freeciv/common/combat.h index e42beecee..852062313 100644 --- a/freeciv/freeciv/common/combat.h +++ b/freeciv/freeciv/common/combat.h @@ -61,6 +61,8 @@ bool unit_really_ignores_citywalls(const struct unit *punit); struct city *sdi_try_defend(const struct player *owner, const struct tile *ptile); +bool is_tile_nuke_proof(const struct tile *ptile); + int get_attack_power(const struct unit *punit); int base_get_attack_power(const struct unit_type *punittype, int veteran, int moves_left); diff --git a/freeciv/freeciv/common/effects.h b/freeciv/freeciv/common/effects.h index fd3669068..3a437b762 100644 --- a/freeciv/freeciv/common/effects.h +++ b/freeciv/freeciv/common/effects.h @@ -343,6 +343,36 @@ extern "C" { /* Adds raw value bonus to final defense bonus of the terrain (not multiply.) */ #define SPECENUM_VALUE134 EFT_TERRAIN_DEFEND_ADD_BONUS #define SPECENUM_VALUE134NAME "Terrain_Defend_Add_Bonus" +/* The rate of rapture (at rapturedelay=1). 1000 == every turn; 800 == 4 out of 5 turns, etc. + If not set, the game uses the formerly hard-coded rate of 1000 (for ruleset compat.) */ +#define SPECENUM_VALUE135 EFT_RAPTURE_RATE_PM +#define SPECENUM_VALUE135NAME "Rapture_Rate_Pm" +/* The percent chance a unit that would normally disband after its homecity is conquered, + will rehome to nearest legal city instead: */ +#define SPECENUM_VALUE136 EFT_REHOME_PCT +#define SPECENUM_VALUE136NAME "Rehome_Pct" +/* Bonus/Penalty adjustment to the size at which a city celebrates: */ +#define SPECENUM_VALUE137 EFT_CELEBRATE_SIZE_ADD +#define SPECENUM_VALUE137NAME "Celebrate_Size_Add" +/* The raw minimum value by which to reduce Output Waste (if Output_Waste_Pct doesn't reduce by more) */ +#define SPECENUM_VALUE138 EFT_OUTPUT_WASTE_MIN_REDUCE +#define SPECENUM_VALUE138NAME "Output_Waste_Min_Reduce" +/* A raw value by which to reduce Output Waste (rather than the percentage reduction of Output_Waste_Pct) */ +#define SPECENUM_VALUE139 EFT_OUTPUT_WASTE_REDUCE +#define SPECENUM_VALUE139NAME "Output_Waste_Reduce" +/* Similar to unit_bribe_cost_pct but alters the cost based on actor player and actor unit (not target) */ +#define SPECENUM_VALUE140 EFT_ACTOR_BRIBE_COST_PCT +#define SPECENUM_VALUE140NAME "Actor_Bribe_Cost_Pct" +/* Similar to incite_cost_pct but alters the cost based on actor player (not target player) */ +#define SPECENUM_VALUE141 EFT_ACTOR_INCITE_COST_PCT +#define SPECENUM_VALUE141NAME "Actor_Incite_Cost_Pct" +/* The percent chance a tile will be immune to nuclear blast */ +#define SPECENUM_VALUE142 EFT_TILE_NUKE_PROOF +#define SPECENUM_VALUE142NAME "Tile_Nuke_Proof" +/* Modifies the chance the actor will raze buildings when conquering cities */ +#define SPECENUM_VALUE143 EFT_RAZE_BUILDING_PCT +#define SPECENUM_VALUE143NAME "Raze_Building_Pct" + /* FCW does not have /common and needs to hard code any changes or re-ordering of the above in effects.js */ /********************************************************************************************************~*/ diff --git a/freeciv/freeciv/common/events.c b/freeciv/freeciv/common/events.c index 49844c107..683a6d733 100644 --- a/freeciv/freeciv/common/events.c +++ b/freeciv/freeciv/common/events.c @@ -221,8 +221,10 @@ static struct { GEN_EV(E_MULTIPLIER, E_S_NATION, N_("Multiplier changed")), GEN_EV(E_UNIT_ACTION_ACTOR_SUCCESS, E_S_UNIT, N_("Your unit did")), GEN_EV(E_UNIT_ACTION_ACTOR_FAILURE, E_S_UNIT, N_("Your unit failed")), - GEN_EV(E_UNIT_ACTION_TARGET_HOSTILE, E_S_UNIT, N_("Unit did to you")), GEN_EV(E_UNIT_ACTION_TARGET_OTHER, E_S_UNIT, N_("Unit did")), + GEN_EV(E_UNIT_ACTION_TARGET_HOSTILE, E_S_UNIT, N_("Unit did to you")), + GEN_EV(E_UNIT_SENTRY_WAKE, E_S_UNIT, N_("Sentry report")), + GEN_EV(E_HUT_MAP, E_S_HUT, N_("Map found from a hut")), /* Chat events for client to know how to render class of message */ GEN_EV(E_CHAT_MSG_PUBLIC, E_S_XYZZY, N_("Public chat messages")), GEN_EV(E_CHAT_MSG_PRIVATE_SENT, E_S_XYZZY, N_("Private chat messages sent")), diff --git a/freeciv/freeciv/common/events.h b/freeciv/freeciv/common/events.h index 8c2225a14..33bdab606 100644 --- a/freeciv/freeciv/common/events.h +++ b/freeciv/freeciv/common/events.h @@ -171,10 +171,13 @@ extern "C" { #define SPECENUM_VALUE132 E_UNIT_ACTION_ACTOR_FAILURE #define SPECENUM_VALUE133 E_UNIT_ACTION_TARGET_OTHER #define SPECENUM_VALUE134 E_UNIT_ACTION_TARGET_HOSTILE -#define SPECENUM_VALUE135 E_CHAT_MSG_PUBLIC -#define SPECENUM_VALUE136 E_CHAT_MSG_PRIVATE_SENT -#define SPECENUM_VALUE137 E_CHAT_MSG_PRIVATE_RCVD -#define SPECENUM_VALUE138 E_CHAT_MSG_ALLY +#define SPECENUM_VALUE135 E_UNIT_SENTRY_WAKE +#define SPECENUM_VALUE136 E_HUT_MAP +#define SPECENUM_VALUE137 E_CHAT_MSG_PUBLIC +#define SPECENUM_VALUE138 E_CHAT_MSG_PRIVATE_SENT +#define SPECENUM_VALUE139 E_CHAT_MSG_PRIVATE_RCVD +#define SPECENUM_VALUE140 E_CHAT_MSG_ALLY +// DO NOT INCLUDE "synthetic events" E_CHAT_PRIVATE, E_CHAT_ALLIES, E_CHAT_OBSERVER /* * Note: If you add a new event, make sure you make a similar change * to the events array in "common/events.c" using GEN_EV, to diff --git a/freeciv/freeciv/common/extras.h b/freeciv/freeciv/common/extras.h index 73e1d166a..4926e6ed5 100644 --- a/freeciv/freeciv/common/extras.h +++ b/freeciv/freeciv/common/extras.h @@ -58,15 +58,18 @@ extern "C" { /* Units inside will not die all at once */ #define SPECENUM_VALUE10 EF_NO_STACK_DEATH #define SPECENUM_VALUE10NAME N_("NoStackDeath") - -#define SPECENUM_VALUE11 EF_USER_FLAG_1 -#define SPECENUM_VALUE12 EF_USER_FLAG_2 -#define SPECENUM_VALUE13 EF_USER_FLAG_3 -#define SPECENUM_VALUE14 EF_USER_FLAG_4 -#define SPECENUM_VALUE15 EF_USER_FLAG_5 -#define SPECENUM_VALUE16 EF_USER_FLAG_6 -#define SPECENUM_VALUE17 EF_USER_FLAG_7 -#define SPECENUM_VALUE18 EF_USER_FLAG_8 +/* Extra Reports Enemy moves in 3 tiles */ +#define SPECENUM_VALUE11 EF_REPORTS +#define SPECENUM_VALUE11NAME N_("Reports") + +#define SPECENUM_VALUE12 EF_USER_FLAG_1 +#define SPECENUM_VALUE13 EF_USER_FLAG_2 +#define SPECENUM_VALUE14 EF_USER_FLAG_3 +#define SPECENUM_VALUE15 EF_USER_FLAG_4 +#define SPECENUM_VALUE16 EF_USER_FLAG_5 +#define SPECENUM_VALUE17 EF_USER_FLAG_6 +#define SPECENUM_VALUE18 EF_USER_FLAG_7 +#define SPECENUM_VALUE19 EF_USER_FLAG_8 #define SPECENUM_COUNT EF_COUNT #define SPECENUM_NAMEOVERRIDE diff --git a/freeciv/freeciv/common/fc_types.h b/freeciv/freeciv/common/fc_types.h index 3ea56a286..0c6ca3696 100644 --- a/freeciv/freeciv/common/fc_types.h +++ b/freeciv/freeciv/common/fc_types.h @@ -34,6 +34,7 @@ extern "C" { * in savegame2.c needs to be changed */ #define MAX_NUM_BARBARIANS 12 /* 3, but slots reserved for future use. */ #define MAX_NUM_PLAYERS MAX_NUM_PLAYER_SLOTS - MAX_NUM_BARBARIANS +#define MAX_NUM_SUPERCOWS 10 /* Used in the network protocol. */ #define MAX_NUM_CONNECTIONS (2 * (MAX_NUM_PLAYER_SLOTS)) /* e.g. unit_types. Used in the network protocol. */ @@ -122,7 +123,7 @@ enum output_type_id { #define SPECENUM_VALUE12 ACTIVITY_TRANSFORM #define SPECENUM_VALUE12NAME N_("Transform") #define SPECENUM_VALUE13 ACTIVITY_UNKNOWN -#define SPECENUM_VALUE13NAME "Unused" +#define SPECENUM_VALUE13NAME "Vigil" #define SPECENUM_VALUE14 ACTIVITY_AIRBASE #define SPECENUM_VALUE14NAME "Unused Airbase" #define SPECENUM_VALUE15 ACTIVITY_FORTIFYING diff --git a/freeciv/freeciv/common/game.c b/freeciv/freeciv/common/game.c index dd841dc78..eb3f18bfd 100644 --- a/freeciv/freeciv/common/game.c +++ b/freeciv/freeciv/common/game.c @@ -356,6 +356,7 @@ static void game_defaults(bool keep_ruleset_value) game.server.autoattack_style = GAME_DEFAULT_AUTOATTACK_STYLE; game.server.barbarianrate = GAME_DEFAULT_BARBARIANRATE; game.server.blueprints = GAME_DEFAULT_BLUEPRINTS; + game.server.casusbelli_allies = GAME_DEFAULT_CASUSBELLI_ALLIES; game.server.casusbelliturns = GAME_DEFAULT_CASUSBELLITURNS; game.server.ceasefirelength = GAME_DEFAULT_CEASEFIRELENGTH; game.server.city_output_style = GAME_DEFAULT_CITY_OUTPUT_STYLE; @@ -446,6 +447,9 @@ static void game_defaults(bool keep_ruleset_value) game.server.slot_control_style = GAME_DEFAULT_SLOT_CONTROL_STYLE; game.server.spaceship_travel_time = GAME_DEFAULT_SPACESHIP_TRAVEL_TIME; game.server.start_year = GAME_START_YEAR; + for (i = 0; i < MAX_NUM_SUPERCOWS; i++) { + game.server.supercows[i][0] = '\0'; + } game.server.tcptimeout = GAME_DEFAULT_TCPTIMEOUT; game.server.techlost_donor = GAME_DEFAULT_TECHLOST_DONOR; game.server.techlost_recv = GAME_DEFAULT_TECHLOST_RECV; diff --git a/freeciv/freeciv/common/game.h b/freeciv/freeciv/common/game.h index f1fa11e53..632bc2334 100644 --- a/freeciv/freeciv/common/game.h +++ b/freeciv/freeciv/common/game.h @@ -58,7 +58,8 @@ enum barbarians_rate { enum loot_style { LOOT_CLASSIC = 0, LOOT_OFF, - LOOT_BASE_TRADE + LOOT_BASE_TRADE, + LOOT_TRADE_AND_PROPERTY }; enum autosave_type { @@ -139,6 +140,7 @@ struct civ_game { enum barbarians_rate barbarianrate; int blueprints; int base_incite_cost; + int casusbelli_allies; int casusbelliturns; int ceasefirelength; int city_output_style; @@ -210,6 +212,7 @@ struct civ_game { char start_units[MAX_LEN_STARTUNIT]; bool start_city; int start_year; + char supercows[MAX_NUM_SUPERCOWS][MAX_LEN_NAME]; /* admins/Gamemasters/supercows for this game */ int techloss_restore; int techlost_donor; int techlost_recv; @@ -744,6 +747,10 @@ extern struct world wld; #define GAME_MIN_CEASEFIRELENGTH 1 #define GAME_MAX_CEASEFIRELENGTH 1000 +#define GAME_DEFAULT_CASUSBELLI_ALLIES 0 +#define GAME_MIN_CASUSBELLI_ALLIES 0 +#define GAME_MAX_CASUSBELLI_ALLIES 1 + #define GAME_DEFAULT_CASUSBELLITURNS 2 #define GAME_MIN_CASUSBELLITURNS 2 #define GAME_MAX_CASUSBELLITURNS 1000 diff --git a/freeciv/freeciv/common/map.c b/freeciv/freeciv/common/map.c index 9e2a03c35..b0f98161c 100644 --- a/freeciv/freeciv/common/map.c +++ b/freeciv/freeciv/common/map.c @@ -867,6 +867,33 @@ int tile_move_cost_ptrs(const struct civ_map *nmap, cost = tile_terrain(t2)->movement_cost * SINGLE_MOVE; ri = restrict_infra(pplayer, t1, t2); + bool rri_active = false; // if ReverseRestrictInfra is in effect + + /* If ri is active, then rri on the source_tile or dest_tile may + trigger a movement penalty cost: */ + if (ri) { + extra_type_list_iterate(pclass->cache.bonus_roads, pextra) { + bool src_has_road = tile_has_extra(t1, pextra); + bool dest_has_road = tile_has_extra(t2, pextra); + + if ( (src_has_road || dest_has_road) + && is_native_extra_to_uclass(pextra, pclass)) { + + struct road_type *proad = extra_road_get(pextra); + bool rri = road_has_flag(proad, RF_REVERSE_RESTRICT_INFRA); + + if (rri) { + rri_active |= rri; + if (dest_has_road || (src_has_road && road_has_flag(proad, RF_INTEGRATE_COST_UP))) { + if (cost < proad->move_cost) { + cost = proad->move_cost; + } + } + } + } + } extra_type_list_iterate_end; + } + if (rri_active) goto finish; /* skip extra processing and revoke IGTER */ extra_type_list_iterate(pclass->cache.bonus_roads, pextra) { struct road_type *proad = extra_road_get(pextra); @@ -931,6 +958,7 @@ int tile_move_cost_ptrs(const struct civ_map *nmap, } cardinal_between_iterate_end; } break; + /* TODO: this code should never be reached. Remove it. */ case RMM_FAST_ALWAYS: fc_assert(proad->move_mode != RMM_FAST_ALWAYS); /* Already handled above */ cost = proad->move_cost; @@ -952,6 +980,8 @@ int tile_move_cost_ptrs(const struct civ_map *nmap, cost = MOVE_COST_IGTER; } + finish: + if (terrain_control.pythagorean_diagonal) { if (!cardinality_checked) { cardinal_move = (ALL_DIRECTIONS_CARDINAL() diff --git a/freeciv/freeciv/common/movement.c b/freeciv/freeciv/common/movement.c index 4b70613f0..d0e4d4b5c 100644 --- a/freeciv/freeciv/common/movement.c +++ b/freeciv/freeciv/common/movement.c @@ -173,20 +173,9 @@ bool unit_can_defend_here(const struct civ_map *nmap, const struct unit *punit) { struct unit *ptrans = unit_transport_get(punit); -/* Hack - There was no way for ruleset utype flags to set a unit to defend - while transported on non-native tiles. This uses UTYF_USER_FLAG_34 to - do so IFF using AG or MP2 rulesetdir. TODO: Switch from user flag. - Make a new standard utype flag, UTYF_TRANSPORT_DEFEND. Remove the whole - #ifdef block and replace with this single line: - if (unit_has_type_flag(punit, UTYF_TRANSPORT_DEFENDER)) return true; -*/ -#ifdef FREECIV_WEB -// some units always defend while transported, regardless of terrain type: -if (strcmp(game.server.rulesetdir, "ag") == 0 - || strcmp(game.server.rulesetdir, "mp2") == 0) { - if (unit_has_type_flag(punit, UTYF_USER_FLAG_34)) return true; - } -#endif +/* Some units can always defend while transported, regardless of terrain + nativity. This means they can _always_ defend: */ + if (unit_has_type_flag(punit, UTYF_TRANSPORTDEFENDER)) return true; /* Do not just check if unit is transported. * Even transported units may step out from transport to fight, diff --git a/freeciv/freeciv/common/nation.c b/freeciv/freeciv/common/nation.c index 55cc57a79..5f2bbd208 100644 --- a/freeciv/freeciv/common/nation.c +++ b/freeciv/freeciv/common/nation.c @@ -202,15 +202,17 @@ bool is_word_plural(const char *word) if (len<3) return false; if (strcmp(&word[len-2], "ss") == 0) return false; // -ss are singular if (word[len-1] == 's') return true; + if (strcmp(&word[len-4], "s II") == 0) return true; // Workers II, Barracks II if (strcmp(&word[len-3], "men") == 0) return true; // Pikemen, Riflemen, etc. + if (strcmp(&word[len-7], "nfantry") == 0) return true; // mechanized infantry + if (strcmp(&word[len-8], "rtillery") == 0) return true; // artillery + return false; - /* Exceptions I, currently commented because they don't come up: if (strcmp(word, "AWACS") == 0) return false; // names end in small 's' if (strcmp(word, "JTIDS") == 0) return false; // names end in small 's' if (strcmp(word, "United Nations") == 0) return false; // debatable ;)*/ /* Exceptions II, currently not needed / unimportant. if (len>=5) { - if (strcmp(&word[len-4], "s II") == 0) return true; // Barracks II, et similia if (strcmp(&word[len-5], "s III") == 0) return true; // Barracks III, et similia if (strcmp(&word[len-5], "solos") == 0) return false; // Mausoleum of Mausolos if (strcmp(&word[len-5], "temis") == 0) return false; // Temple of Artemis diff --git a/freeciv/freeciv/common/networking/connection.c b/freeciv/freeciv/common/networking/connection.c index 379ffa4ee..5abcd6b87 100644 --- a/freeciv/freeciv/common/networking/connection.c +++ b/freeciv/freeciv/common/networking/connection.c @@ -498,9 +498,12 @@ const char *conn_description(const struct connection *pconn) cat_snprintf(buffer, sizeof(buffer), _(" (player %s)"), player_name(pconn->playing)); } - if (pconn->observer) { + if (pconn->supercow) { /* TRANS: preserve leading space. */ - sz_strlcat(buffer, _(" (observer)")); + sz_strlcat(buffer, _(" (admin) ")); + } else if (pconn->observer) { + /* TRANS: preserve leading space. */ + sz_strlcat(buffer, _(" (observer) ")); } return buffer; diff --git a/freeciv/freeciv/common/networking/packets.def b/freeciv/freeciv/common/networking/packets.def index 54a56508c..b2bad99ca 100644 --- a/freeciv/freeciv/common/networking/packets.def +++ b/freeciv/freeciv/common/networking/packets.def @@ -721,6 +721,7 @@ PACKET_CITY_INFO = 31; sc, lsend, is-game-info, force, cancel(PACKET_CITY_SHORT_ SINT16 anarchy; SINT16 hangry; + SINT16 rapture_status; TURN turn_founded; TURN turn_last_built; @@ -814,6 +815,7 @@ end PACKET_CITY_MAKE_SPECIALIST = 37; cs, dsend CITY city_id; TILE tile_id; + SPECIALIST specialist_to; end PACKET_CITY_MAKE_WORKER = 38; cs, dsend diff --git a/freeciv/freeciv/common/player.c b/freeciv/freeciv/common/player.c index c1c8c4798..50a854e44 100644 --- a/freeciv/freeciv/common/player.c +++ b/freeciv/freeciv/common/player.c @@ -195,6 +195,8 @@ enum dipl_reason pplayer_can_make_treaty(const struct player *p1, else return DIPL_ERROR; } if (treaty == DS_ALLIANCE) { + /* Existing alliance with casus belli clears the casus belli: */ + if (existing == DS_ALLIANCE && casus_belli) return DIPL_OK; if (!is_valid_alliance(p1, p2)) { /* Our war with a third party prevents entry to alliance. */ return DIPL_ALLIANCE_PROBLEM_US; @@ -993,6 +995,15 @@ bool can_player_see_unit_at(const struct player *pplayer, const struct tile *ptile, bool is_transported) { + /* attempt to catch segfault */ + if (!pplayer || !punit || !ptile) { + log_verbose("can_player_see_unit_at called with a nullptr:"); + if (!pplayer) log_verbose("pplayer is null!"); + if (!punit) log_verbose("punit is null!"); + if (!ptile) log_verbose("ptile is null!"); + return FALSE; + } + struct city *pcity; /* If the player can't even see the tile... */ @@ -1005,9 +1016,20 @@ bool can_player_see_unit_at(const struct player *pplayer, * isn't taken into account. */ if (is_transported && unit_owner(punit) != pplayer && !pplayers_allied(pplayer, unit_owner(punit))) { +#ifdef FREECIV_WEB + /* TODO: is_cargo_visible based on EFT or just a new var in unit_type */ + // currently, ugly hack waiting for the above: + const struct unit *tunit = unit_transport_get(punit); + // possible add later: Galley, Trireme, Longboat, Carrier (planes on deck) + if (tunit != NULL + && (0 == strcmp("Wagon", utype_rule_name(unit_type_get(tunit))) + || 0 == strcmp("Trawler", utype_rule_name(unit_type_get(tunit))))) { + goto next_check; + } +#endif return FALSE; } - +next_check: /* Units in cities may be hidden. */ pcity = tile_city(ptile); if (pcity && !can_player_see_units_in_city(pplayer, pcity)) { @@ -1046,6 +1068,7 @@ bool can_player_see_unit_at(const struct player *pplayer, bool can_player_see_unit(const struct player *pplayer, const struct unit *punit) { + /* was segfaulting from this call below, attempted fix in that func */ return can_player_see_unit_at(pplayer, punit, unit_tile(punit), unit_transported(punit)); } @@ -1091,6 +1114,14 @@ bool can_player_see_units_in_city(const struct player *pplayer, bool can_player_see_city_internals(const struct player *pplayer, const struct city *pcity) { +#ifdef FREECIV_WEB + /* FCW allows allies who share vision to see internals, as it + helps with many things such as planning trade routes. */ + if (pplayers_allied(pplayer, city_owner(pcity)) + && gives_shared_vision(city_owner(pcity), pplayer)) { + return true; + } +#endif return (!pplayer || pplayer == city_owner(pcity)); } diff --git a/freeciv/freeciv/common/player.h b/freeciv/freeciv/common/player.h index ff4a5685d..72d0266d5 100644 --- a/freeciv/freeciv/common/player.h +++ b/freeciv/freeciv/common/player.h @@ -35,8 +35,8 @@ extern "C" { #include "unitlist.h" #include "vision.h" -#define PLAYER_DEFAULT_TAX_RATE 0 -#define PLAYER_DEFAULT_SCIENCE_RATE 100 +#define PLAYER_DEFAULT_TAX_RATE 40 +#define PLAYER_DEFAULT_SCIENCE_RATE 60 // NB: Team game setup resulted in Unassigned with 100% sci keeping this illegal rate when assigned to a human. #define PLAYER_DEFAULT_LUXURY_RATE 0 #define ANON_PLAYER_NAME "noname" diff --git a/freeciv/freeciv/common/research.c b/freeciv/freeciv/common/research.c index 904a7bed2..c3fd88496 100644 --- a/freeciv/freeciv/common/research.c +++ b/freeciv/freeciv/common/research.c @@ -997,6 +997,17 @@ int research_total_bulbs_required(const struct research *presearch, if (is_barbarian(aplayer)) { continue; } +/* FCW games can have "pseudo-dead" players who are idle and all but dead, + and NewAvailablePlayers who are empty slots and not playing */ +#ifdef FREECIV_WEB +const int IDLE_IS_DEAD = 5; + if (is_human(aplayer) && aplayer->nturns_idle >= IDLE_IS_DEAD) { + continue; + } + if (strncmp("NewAvailablePlayer", aplayer->name, 18) == 0) { + continue; + } +#endif players++; if (A_FUTURE == tech ? research_get(aplayer)->future_tech > presearch->future_tech diff --git a/freeciv/freeciv/common/road.h b/freeciv/freeciv/common/road.h index ffc3f81c0..aa2f83de9 100644 --- a/freeciv/freeciv/common/road.h +++ b/freeciv/freeciv/common/road.h @@ -31,6 +31,11 @@ extern "C" { #define SPECENUM_VALUE3NAME N_("JumpTo") #define SPECENUM_VALUE4 RF_INTEGRATE_COST_UP #define SPECENUM_VALUE4NAME N_("IntegrateCostUp") +/* Has the reverse effect of RestrictInfra: Allies don't pay this road's + move cost. (Used for obstacle road_extras with high mp meant to slow + enemy movement. [chevaux de frise,walls,ditches, etc.] */ +#define SPECENUM_VALUE5 RF_REVERSE_RESTRICT_INFRA +#define SPECENUM_VALUE5NAME N_("ReverseRestrictInfra") #define SPECENUM_COUNT RF_COUNT #define SPECENUM_BITVECTOR bv_road_flags #include "specenum_gen.h" diff --git a/freeciv/freeciv/common/scriptcore/tolua_game.pkg b/freeciv/freeciv/common/scriptcore/tolua_game.pkg index 30d936efe..0b6322446 100644 --- a/freeciv/freeciv/common/scriptcore/tolua_game.pkg +++ b/freeciv/freeciv/common/scriptcore/tolua_game.pkg @@ -35,6 +35,7 @@ $#include "luascript_types.h" struct Player { const char *name; Nation_Type *nation; + Government *government; bool is_alive; }; @@ -42,6 +43,7 @@ struct City { const char *name; Player *owner; Player *original; + int food_stock; const int id; }; diff --git a/freeciv/freeciv/common/terrain.c b/freeciv/freeciv/common/terrain.c index 3f09abc5b..2023d002b 100644 --- a/freeciv/freeciv/common/terrain.c +++ b/freeciv/freeciv/common/terrain.c @@ -528,7 +528,9 @@ const char *get_infrastructure_text(bv_extras extras) } extra_type_iterate_end; // Ultra-short names flag extras which are invisible to players, e.g. hideout - if (strlen(extra_name_translation(pextra)) <= 1) + if (strlen(extra_name_translation(pextra)) <= 1 + // TODO: a built in ExtraFlag for not showing/revealing certain extras, instead of this: + || strcmp("Depth", extra_rule_name(pextra))==0) //zero-width space indicates no-show hidden = true; if (!hidden) { diff --git a/freeciv/freeciv/common/tile.c b/freeciv/freeciv/common/tile.c index 84f8722b3..984a7de91 100644 --- a/freeciv/freeciv/common/tile.c +++ b/freeciv/freeciv/common/tile.c @@ -402,7 +402,10 @@ void tile_set_continent(struct tile *ptile, Continent_id val) enum known_type tile_get_known(const struct tile *ptile, const struct player *pplayer) { - if (!dbv_isset(&pplayer->tile_known, tile_index(ptile))) { + if (!ptile || !pplayer) { /* possible segfault catch */ + log_verbose("tile_get_known() called with nullptr") + return TILE_UNKNOWN; + } else if (!dbv_isset(&pplayer->tile_known, tile_index(ptile))) { return TILE_UNKNOWN; } else if (!fc_funcs->player_tile_vision_get(ptile, pplayer, V_MAIN)) { return TILE_KNOWN_UNSEEN; @@ -916,6 +919,23 @@ bool tile_has_extra_flag(const struct tile *ptile, enum extra_flag_id flag) return FALSE; } +/************************************************************************//** + Same as function above but returns the first extra which provides + the effect in question. +****************************************************************************/ +const struct extra_type *tile_get_extra_by_flag(const struct tile *ptile, + enum extra_flag_id flag) +{ + extra_type_iterate(pextra) { + if (tile_has_extra(ptile, pextra) + && extra_has_flag(pextra, flag)) { + return pextra; + } + } extra_type_iterate_end; + + return NULL; +} + /************************************************************************//** Returns TRUE if the given tile has a extra conflicting with the given one. ****************************************************************************/ diff --git a/freeciv/freeciv/common/tile.h b/freeciv/freeciv/common/tile.h index 4a2eac367..09041ad21 100644 --- a/freeciv/freeciv/common/tile.h +++ b/freeciv/freeciv/common/tile.h @@ -152,7 +152,9 @@ bool tile_has_visible_extra(const struct tile *ptile, const struct extra_type *p bool tile_has_cause_extra(const struct tile *ptile, enum extra_cause cause); void tile_add_extra(struct tile *ptile, const struct extra_type *pextra); void tile_remove_extra(struct tile *ptile, const struct extra_type *pextra); -bool tile_has_extra_flag(const struct tile *ptile, enum extra_flag_id flag);; +bool tile_has_extra_flag(const struct tile *ptile, enum extra_flag_id flag); +const struct extra_type *tile_get_extra_by_flag(const struct tile *ptile, + enum extra_flag_id flag); /* Vision related */ enum known_type tile_get_known(const struct tile *ptile, @@ -166,7 +168,7 @@ bool tile_is_seen(const struct tile *target_tile, * help to avoid rounding errors; however it should probably be removed. */ /* No, it needs to be increased to allow for granularity and application * of "Work_Bonus" similar to "Move_Bonus" */ -#define ACTIVITY_FACTOR 100 +#define ACTIVITY_FACTOR 100 // must match same value in unit.js int tile_activity_time(enum unit_activity activity, const struct tile *ptile, struct extra_type *tgt); diff --git a/freeciv/freeciv/common/unit.c b/freeciv/freeciv/common/unit.c index 0db5b9b9f..ce7f4e47e 100644 --- a/freeciv/freeciv/common/unit.c +++ b/freeciv/freeciv/common/unit.c @@ -220,16 +220,19 @@ bool unit_has_orders(const struct unit *punit) @param punit the unit. Can be NULL if punittype is set. @param punittype the unit's type. Can be NULL iff punit is set. @param paction the action the unit does when valued. + @param pplayer the player who would do the upgrade. Can be NULL but + would then miss government/tech/wonder bonuses. @return the unit's value in shields. **************************************************************************/ int unit_shield_value(const struct unit *punit, const struct unit_type *punittype, - const struct action *paction) + const struct action *paction, + const struct player *act_player) { int value; bool has_unit; - const struct player *act_player; + //const struct player *act_player; has_unit = punit != NULL; @@ -241,7 +244,9 @@ int unit_shield_value(const struct unit *punit, fc_assert(punit == NULL || unit_type_get(punit) == punittype); fc_assert_ret_val(paction != NULL, 0); - act_player = has_unit ? unit_owner(punit) : NULL; + if (!act_player) { + act_player = has_unit ? unit_owner(punit) : NULL; + } /* TODO: determine if tile and city should be where the unit currently is * located or the target city. Those two may differ. Wait for ruleset * author feed back. */ @@ -324,6 +329,22 @@ bool is_military_unit(const struct unit *punit) return !unit_has_type_flag(punit, UTYF_CIVILIAN); } +/**********************************************************************//** + Determines if a unit with a limited number of attacks per turn is + still able to attack (or has used up all its attacks.) +**************************************************************************/ +static bool unit_has_attacks_left(const struct unit *punit) { + struct extra_unit_stats pstats; + unit_get_extra_stats(&pstats, punit); + + if (pstats.max_attacks) { + if (punit->server.attacks_this_turn >= pstats.max_attacks) { + return false; + } + } + + return true; +} /**********************************************************************//** Return TRUE iff this unit can do the specified generalized (ruleset defined) action enabler controlled action. @@ -331,6 +352,11 @@ bool is_military_unit(const struct unit *punit) bool unit_can_do_action(const struct unit *punit, const action_id act_id) { + /* Hard-coded req: unit can't attack if it has no attacks left: */ + if (act_id == ACTION_ATTACK) { + /* if other ACTION_ATTACK types are added, && them in above */ + if (!unit_has_attacks_left(punit)) return false; + } return utype_can_do_action(unit_type_get(punit), act_id); } @@ -484,7 +510,7 @@ int get_activity_rate(const struct unit *punit) float move_rate = (float)unit_type_get(punit)->move_rate; // Add work_bonus_rate and/or multiple by work_bonus_pct: - move_rate = (move_rate + work_bonus_rate) * (1.0 + work_bonus_pct) + .5; //round up + move_rate = (move_rate + work_bonus_rate) * (1.0 + work_bonus_pct) + .1; //round up /* All settler actions are multiplied by ACTIVITY_FACTOR. */ @@ -2060,9 +2086,17 @@ enum unit_upgrade_result unit_upgrade_test(const struct unit *punit, struct player *pplayer = unit_owner(punit); const struct unit_type *to_unittype = can_upgrade_unittype(pplayer, unit_type_get(punit)); - struct city *pcity; int cost; + if (punit->activity == ACTIVITY_CONVERT) { + /* TODO: There may be other activities that the upgraded unit is not + allowed to do, which we could also test. + - + If convert were legal for new unit_type we could allow, but then it + has a 'head start' getting activity time from the old conversion. */ + return UU_NOT_ACTIVITY; + } + if (!to_unittype) { return UU_NO_UNITTYPE; } @@ -2073,14 +2107,17 @@ enum unit_upgrade_result unit_upgrade_test(const struct unit *punit, return UU_NO_MONEY; } - pcity = tile_city(unit_tile(punit)); + /*THESE REQS ARE NOW SOFT-CODED IN RULESET ACTIONENABLER, not HARD-CODED HERE + struct city *pcity = tile_city(unit_tile(punit)); if (!pcity) { return UU_NOT_IN_CITY; } if (city_owner(pcity) != pplayer) { - /* TODO: should upgrades in allied cities be possible? */ + // TODO: should upgrades in allied cities be possible? + // ANSWER: LET THE ACTIONENABLER DECIDE ! return UU_NOT_CITY_OWNER; } + */ } if (!can_type_transport_units_cargo(to_unittype, punit)) { @@ -2196,6 +2233,12 @@ enum unit_upgrade_result unit_upgrade_info(const struct unit *punit, utype_name_translation(to_unittype), unit_name_translation(punit->transporter)); break; + case UU_NOT_ACTIVITY: + fc_snprintf(buf, bufsz, + _("Cannot upgrade %s while doing '%s'."), + utype_name_translation(from_unittype), + unit_activity_name(punit->activity)); + break; } return result; diff --git a/freeciv/freeciv/common/unit.h b/freeciv/freeciv/common/unit.h index 7d4fc0d24..c72a128a1 100644 --- a/freeciv/freeciv/common/unit.h +++ b/freeciv/freeciv/common/unit.h @@ -63,8 +63,9 @@ enum unit_upgrade_result { UU_NOT_IN_CITY, UU_NOT_CITY_OWNER, UU_NOT_ENOUGH_ROOM, - UU_NOT_TERRAIN, /* The upgraded unit could not survive. */ - UU_UNSUITABLE_TRANSPORT /* Can't upgrade inside current transport. */ + UU_NOT_TERRAIN, /* The upgraded unit could not survive. */ + UU_UNSUITABLE_TRANSPORT, /* Can't upgrade inside current transport. */ + UU_NOT_ACTIVITY /* Can't upgrade during this activity (e.g., CONVERT) */ }; enum unit_airlift_result { @@ -242,6 +243,7 @@ struct unit { int ord_city; struct vision *vision; + int attacks_this_turn; // tracks "OneAttack", "TwoAttack", etc. time_t action_timestamp; struct unit_wait_list_link *wait; int action_turn; @@ -309,7 +311,8 @@ bool are_unit_orders_equal(const struct unit_order *order1, int unit_shield_value(const struct unit *punit, const struct unit_type *punittype, - const struct action *paction); + const struct action *paction, + const struct player *pplayer); bool unit_can_help_build_wonder_here(const struct unit *punit); bool unit_can_est_trade_route_here(const struct unit *punit); enum unit_airlift_result diff --git a/freeciv/freeciv/common/unittype.c b/freeciv/freeciv/common/unittype.c index 8aa75c08d..bf58150ca 100644 --- a/freeciv/freeciv/common/unittype.c +++ b/freeciv/freeciv/common/unittype.c @@ -1337,9 +1337,14 @@ const struct unit_type *can_upgrade_unittype(const struct player *pplayer, /**********************************************************************//** Return the cost (gold) of upgrading a single unit of the specified type - to the new type. This price could (but currently does not) depend on - other attributes (like nation or government type) of the player the unit - belongs to. + to the new type. + FORMERLY: + "This price could (but currently does not) depend on other attributes + (like nation or government type) of the player the unit belongs to." + 2022.Jan.19: + This price may depend on other attributes like nation or government + type of the player the unit belongs to THEREFORE needs to send + *pplayer to unit_shield_value **************************************************************************/ int unit_upgrade_price(const struct player *pplayer, const struct unit_type *from, @@ -1350,7 +1355,7 @@ int unit_upgrade_price(const struct player *pplayer, * before generalized actions appears. */ const struct action *paction = action_by_number(ACTION_UPGRADE_UNIT); int missing = (utype_build_shield_cost_base(to) - - unit_shield_value(NULL, from, paction)); + - unit_shield_value(NULL, from, paction, pplayer)); int base_cost = 2 * missing + (missing * missing) / 20; return base_cost @@ -2516,8 +2521,13 @@ void utype_get_extra_stats(struct extra_unit_stats *pstats, { fc_assert(NULL != ptype); -//FIXME: / SINGLE_MOVE should be there instead of / 9, but it means all these -//functions need to go into unittools.c in the /server directory: + /* This bitfield needs some preparations: the server multiplies the value + * in units.ruleset by SINGLE_MOVE when loading the utype data. This makes + * this a non-ideal var for storing bitfield since: + (1) we lose 4 bits of resolution (from 32 down to 28: BIT27 is our max) + (2) we just assume SINGLE_MOVE is 9 (MP2), but can't know what it is + without moving these funcs into /server, since /common doesn't have + access to SINGLE_MOVE */ int BB = ptype->paratroopers_mr_sub / 9; /* extra_unit_stats are currently embedded in paratroopers_mr_sub, @@ -2545,7 +2555,10 @@ void utype_get_extra_stats(struct extra_unit_stats *pstats, pstats->iPillage_random_targets = (BB & 0b11000000000) >> 9; // Bit 11-15: # of rounds of Bombard retaliation pstats->bombard_retaliate_rounds = - (BB & 0b11111100000000000) >> 11; + (BB & 0b1111100000000000) >> 11; + // Bit 16-18: # of max attacks per turn + pstats->max_attacks = (BB & 0b1110000000000000000) >> 16; + /* Adjustments of the raw encoded values to match their purpose: */ diff --git a/freeciv/freeciv/common/unittype.h b/freeciv/freeciv/common/unittype.h index 6625bc322..d2057e13d 100644 --- a/freeciv/freeciv/common/unittype.h +++ b/freeciv/freeciv/common/unittype.h @@ -185,8 +185,10 @@ struct unit_class { #define SPECENUM_VALUE5NAME N_("?unitflag:OneAttack") #define SPECENUM_VALUE6 UTYF_FIELDUNIT #define SPECENUM_VALUE6NAME N_("?unitflag:FieldUnit") -/* autoattack: a unit will choose to attack this unit even if defending - * against it has better odds. */ +/* a unit will choose to autoattack a unit flagged PROVOKING even if + * defending against it has better odds. if autoattack_style=1, then + * only units with Provoking flag will be attacked by units doing + * ACTIVITY_VIGIL. */ #define SPECENUM_VALUE7 UTYF_PROVOKING #define SPECENUM_VALUE7NAME N_("?unitflag:Provoking") /* Overrides unreachable_protects server setting for defender */ @@ -267,56 +269,82 @@ struct unit_class { /* Overrides unreachable_protects server setting for attacker */ #define SPECENUM_VALUE32 UTYF_NEVER_BLOCKED #define SPECENUM_VALUE32NAME N_("?unitflag:NeverBlocked") - -#define SPECENUM_VALUE33 UTYF_USER_FLAG_1 -#define SPECENUM_VALUE34 UTYF_USER_FLAG_2 -#define SPECENUM_VALUE35 UTYF_USER_FLAG_3 -#define SPECENUM_VALUE36 UTYF_USER_FLAG_4 -#define SPECENUM_VALUE37 UTYF_USER_FLAG_5 -#define SPECENUM_VALUE38 UTYF_USER_FLAG_6 -#define SPECENUM_VALUE39 UTYF_USER_FLAG_7 -#define SPECENUM_VALUE40 UTYF_USER_FLAG_8 -#define SPECENUM_VALUE41 UTYF_USER_FLAG_9 -#define SPECENUM_VALUE42 UTYF_USER_FLAG_10 -#define SPECENUM_VALUE43 UTYF_USER_FLAG_11 -#define SPECENUM_VALUE44 UTYF_USER_FLAG_12 -#define SPECENUM_VALUE45 UTYF_USER_FLAG_13 -#define SPECENUM_VALUE46 UTYF_USER_FLAG_14 -#define SPECENUM_VALUE47 UTYF_USER_FLAG_15 -#define SPECENUM_VALUE48 UTYF_USER_FLAG_16 -#define SPECENUM_VALUE49 UTYF_USER_FLAG_17 -#define SPECENUM_VALUE50 UTYF_USER_FLAG_18 -#define SPECENUM_VALUE51 UTYF_USER_FLAG_19 -#define SPECENUM_VALUE52 UTYF_USER_FLAG_20 -#define SPECENUM_VALUE53 UTYF_USER_FLAG_21 -#define SPECENUM_VALUE54 UTYF_USER_FLAG_22 -#define SPECENUM_VALUE55 UTYF_USER_FLAG_23 -#define SPECENUM_VALUE56 UTYF_USER_FLAG_24 -#define SPECENUM_VALUE57 UTYF_USER_FLAG_25 -#define SPECENUM_VALUE58 UTYF_USER_FLAG_26 -#define SPECENUM_VALUE59 UTYF_USER_FLAG_27 -#define SPECENUM_VALUE60 UTYF_USER_FLAG_28 -#define SPECENUM_VALUE61 UTYF_USER_FLAG_29 -#define SPECENUM_VALUE62 UTYF_USER_FLAG_30 -#define SPECENUM_VALUE63 UTYF_USER_FLAG_31 -#define SPECENUM_VALUE64 UTYF_USER_FLAG_32 -#define SPECENUM_VALUE65 UTYF_USER_FLAG_33 -#define SPECENUM_VALUE66 UTYF_USER_FLAG_34 -#define SPECENUM_VALUE67 UTYF_USER_FLAG_35 -#define SPECENUM_VALUE68 UTYF_USER_FLAG_36 -#define SPECENUM_VALUE69 UTYF_USER_FLAG_37 -#define SPECENUM_VALUE70 UTYF_USER_FLAG_38 -#define SPECENUM_VALUE71 UTYF_USER_FLAG_39 -#define SPECENUM_VALUE72 UTYF_USER_FLAG_40 -#define SPECENUM_VALUE73 UTYF_USER_FLAG_41 -#define SPECENUM_VALUE74 UTYF_USER_FLAG_42 -#define SPECENUM_VALUE75 UTYF_USER_FLAG_43 -#define SPECENUM_VALUE76 UTYF_USER_FLAG_44 -/*#define SPECENUM_VALUE76 UTYF_USER_FLAG_45 removed to make space for #32*/ -/* Note that first role must have value next to last flag */ - -/*changed from #45 to #44 to after we got rid of 45 to make space for #32*/ -#define UTYF_LAST_USER_FLAG UTYF_USER_FLAG_44 +/* if server setting slot_control is ON, only unit types with this + flag can use extra city_build_slots */ +#define SPECENUM_VALUE33 UTYF_MULTISLOT +#define SPECENUM_VALUE33NAME N_("?unitflag:MultiSlot") +/* Unit can always defend while transported, even on non-native terrain */ +#define SPECENUM_VALUE34 UTYF_TRANSPORTDEFENDER +#define SPECENUM_VALUE34NAME N_("?unitflag:TransportDefender") +/* These units always behave as sentry (e.g. fortified snipers, air + reconnaissance units who can't sentry because !refuel tile, etc.) */ +#define SPECENUM_VALUE35 UTYF_SENTRYALWAYS +#define SPECENUM_VALUE35NAME N_("?unitflag:SentryAlways") +/* RESERVED for future use*/ +/* the future came and we're using it. This is being used when autoattack_style=1 + and a unit is vigiling, to specify that this unit_type does not limit itself + to autoattacking only units with the "?unitflag:Provoking" but may autoattack + anything. if you rename this flag then make sure to search codebase for + "Reserved1" and adjust that to Reserved2 or assign that mechanic another UTYF */ +#define SPECENUM_VALUE36 UTYF_RESERVED1 +#define SPECENUM_VALUE36NAME N_("?unitflag:Reserved1") /* see comment above */ +/* RESERVED for future use*/ +#define SPECENUM_VALUE37 UTYF_RESERVED2 +#define SPECENUM_VALUE37NAME N_("?unitflag:Reserved2") +/* RESERVED for future use*/ +#define SPECENUM_VALUE38 UTYF_RESERVED3 +#define SPECENUM_VALUE38NAME N_("?unitflag:Reserved3") + +#define SPECENUM_VALUE39 UTYF_USER_FLAG_1 +#define SPECENUM_VALUE40 UTYF_USER_FLAG_2 +#define SPECENUM_VALUE41 UTYF_USER_FLAG_3 +#define SPECENUM_VALUE42 UTYF_USER_FLAG_4 +#define SPECENUM_VALUE43 UTYF_USER_FLAG_5 +#define SPECENUM_VALUE44 UTYF_USER_FLAG_6 +#define SPECENUM_VALUE45 UTYF_USER_FLAG_7 +#define SPECENUM_VALUE46 UTYF_USER_FLAG_8 +#define SPECENUM_VALUE47 UTYF_USER_FLAG_9 +#define SPECENUM_VALUE48 UTYF_USER_FLAG_10 +#define SPECENUM_VALUE49 UTYF_USER_FLAG_11 +#define SPECENUM_VALUE50 UTYF_USER_FLAG_12 +#define SPECENUM_VALUE51 UTYF_USER_FLAG_13 +#define SPECENUM_VALUE52 UTYF_USER_FLAG_14 +#define SPECENUM_VALUE53 UTYF_USER_FLAG_15 +#define SPECENUM_VALUE54 UTYF_USER_FLAG_16 +#define SPECENUM_VALUE55 UTYF_USER_FLAG_17 +#define SPECENUM_VALUE56 UTYF_USER_FLAG_18 +#define SPECENUM_VALUE57 UTYF_USER_FLAG_19 +#define SPECENUM_VALUE58 UTYF_USER_FLAG_20 +#define SPECENUM_VALUE59 UTYF_USER_FLAG_21 +#define SPECENUM_VALUE60 UTYF_USER_FLAG_22 +#define SPECENUM_VALUE61 UTYF_USER_FLAG_23 +#define SPECENUM_VALUE62 UTYF_USER_FLAG_24 +#define SPECENUM_VALUE63 UTYF_USER_FLAG_25 +#define SPECENUM_VALUE64 UTYF_USER_FLAG_26 +#define SPECENUM_VALUE65 UTYF_USER_FLAG_27 +#define SPECENUM_VALUE66 UTYF_USER_FLAG_28 +#define SPECENUM_VALUE67 UTYF_USER_FLAG_29 +#define SPECENUM_VALUE68 UTYF_USER_FLAG_30 +#define SPECENUM_VALUE69 UTYF_USER_FLAG_31 +#define SPECENUM_VALUE70 UTYF_USER_FLAG_32 +#define SPECENUM_VALUE71 UTYF_USER_FLAG_33 +#define SPECENUM_VALUE72 UTYF_USER_FLAG_34 +#define SPECENUM_VALUE73 UTYF_USER_FLAG_35 +#define SPECENUM_VALUE74 UTYF_USER_FLAG_36 +#define SPECENUM_VALUE75 UTYF_USER_FLAG_37 +#define SPECENUM_VALUE76 UTYF_USER_FLAG_38 +#define SPECENUM_VALUE77 UTYF_USER_FLAG_39 +#define SPECENUM_VALUE78 UTYF_USER_FLAG_40 +#define SPECENUM_VALUE79 UTYF_USER_FLAG_41 +#define SPECENUM_VALUE80 UTYF_USER_FLAG_42 +#define SPECENUM_VALUE81 UTYF_USER_FLAG_43 +#define SPECENUM_VALUE82 UTYF_USER_FLAG_44 +#define SPECENUM_VALUE83 UTYF_USER_FLAG_45 + +/* Note: the first ROLE flag must have a value +1 greater than last UTYF flag */ + +/*changed from #45 to #43 after we made space for more non-user flags: */ +#define UTYF_LAST_USER_FLAG UTYF_USER_FLAG_45 #define MAX_NUM_USER_UNIT_FLAGS (UTYF_LAST_USER_FLAG - UTYF_USER_FLAG_1 + 1) #define SPECENUM_NAMEOVERRIDE #define SPECENUM_BITVECTOR bv_unit_type_flags @@ -338,101 +366,101 @@ struct unit_class { #define SPECENUM_NAME unit_role_id /* is built first when city established */ -#define SPECENUM_VALUE77 L_FIRSTBUILD -#define SPECENUM_VALUE77NAME N_("?unitflag:FirstBuild") +#define SPECENUM_VALUE84 L_FIRSTBUILD +#define SPECENUM_VALUE84NAME N_("?unitflag:FirstBuild") /* initial explorer unit */ -#define SPECENUM_VALUE78 L_EXPLORER -#define SPECENUM_VALUE78NAME N_("?unitflag:Explorer") +#define SPECENUM_VALUE85 L_EXPLORER +#define SPECENUM_VALUE85NAME N_("?unitflag:Explorer") /* can be found in hut */ -#define SPECENUM_VALUE79 L_HUT -#define SPECENUM_VALUE79NAME N_("?unitflag:Hut") +#define SPECENUM_VALUE86 L_HUT +#define SPECENUM_VALUE86NAME N_("?unitflag:Hut") /* can be found in hut, tech required */ -#define SPECENUM_VALUE80 L_HUT_TECH -#define SPECENUM_VALUE80NAME N_("?unitflag:HutTech") +#define SPECENUM_VALUE87 L_HUT_TECH +#define SPECENUM_VALUE87NAME N_("?unitflag:HutTech") /* is created in Partisan circumstances */ -#define SPECENUM_VALUE81 L_PARTISAN -#define SPECENUM_VALUE81NAME N_("?unitflag:Partisan") +#define SPECENUM_VALUE88 L_PARTISAN +#define SPECENUM_VALUE88NAME N_("?unitflag:Partisan") /* ok on defense (AI) */ -#define SPECENUM_VALUE82 L_DEFEND_OK -#define SPECENUM_VALUE82NAME N_("?unitflag:DefendOk") +#define SPECENUM_VALUE89 L_DEFEND_OK +#define SPECENUM_VALUE89NAME N_("?unitflag:DefendOk") /* primary purpose is defense (AI) */ -#define SPECENUM_VALUE83 L_DEFEND_GOOD -#define SPECENUM_VALUE83NAME N_("?unitflag:DefendGood") +#define SPECENUM_VALUE90 L_DEFEND_GOOD +#define SPECENUM_VALUE90NAME N_("?unitflag:DefendGood") /* is useful for ferrying (AI) */ -#define SPECENUM_VALUE84 L_FERRYBOAT -#define SPECENUM_VALUE84NAME N_("?unitflag:FerryBoat") +#define SPECENUM_VALUE91 L_FERRYBOAT +#define SPECENUM_VALUE91NAME N_("?unitflag:FerryBoat") /* barbarians unit, land only */ -#define SPECENUM_VALUE85 L_BARBARIAN -#define SPECENUM_VALUE85NAME N_("?unitflag:Barbarian") +#define SPECENUM_VALUE92 L_BARBARIAN +#define SPECENUM_VALUE92NAME N_("?unitflag:Barbarian") /* barbarians unit, global tech required */ -#define SPECENUM_VALUE86 L_BARBARIAN_TECH -#define SPECENUM_VALUE86NAME N_("?unitflag:BarbarianTech") +#define SPECENUM_VALUE93 L_BARBARIAN_TECH +#define SPECENUM_VALUE93NAME N_("?unitflag:BarbarianTech") /* barbarian boat */ -#define SPECENUM_VALUE87 L_BARBARIAN_BOAT -#define SPECENUM_VALUE87NAME N_("?unitflag:BarbarianBoat") +#define SPECENUM_VALUE94 L_BARBARIAN_BOAT +#define SPECENUM_VALUE94NAME N_("?unitflag:BarbarianBoat") /* what barbarians should build */ -#define SPECENUM_VALUE88 L_BARBARIAN_BUILD -#define SPECENUM_VALUE88NAME N_("BarbarianBuild") +#define SPECENUM_VALUE95 L_BARBARIAN_BUILD +#define SPECENUM_VALUE95NAME N_("BarbarianBuild") /* barbarians build when global tech */ -#define SPECENUM_VALUE89 L_BARBARIAN_BUILD_TECH -#define SPECENUM_VALUE89NAME N_("?unitflag:BarbarianBuildTech") +#define SPECENUM_VALUE96 L_BARBARIAN_BUILD_TECH +#define SPECENUM_VALUE96NAME N_("?unitflag:BarbarianBuildTech") /* barbarian leader */ -#define SPECENUM_VALUE90 L_BARBARIAN_LEADER -#define SPECENUM_VALUE90NAME N_("?unitflag:BarbarianLeader") +#define SPECENUM_VALUE97 L_BARBARIAN_LEADER +#define SPECENUM_VALUE97NAME N_("?unitflag:BarbarianLeader") /* sea raider unit */ -#define SPECENUM_VALUE91 L_BARBARIAN_SEA -#define SPECENUM_VALUE91NAME N_("?unitflag:BarbarianSea") +#define SPECENUM_VALUE98 L_BARBARIAN_SEA +#define SPECENUM_VALUE98NAME N_("?unitflag:BarbarianSea") /* sea raider unit, global tech required */ -#define SPECENUM_VALUE92 L_BARBARIAN_SEA_TECH -#define SPECENUM_VALUE92NAME N_("?unitflag:BarbarianSeaTech") +#define SPECENUM_VALUE99 L_BARBARIAN_SEA_TECH +#define SPECENUM_VALUE99NAME N_("?unitflag:BarbarianSeaTech") /* Startunit: Cities */ -#define SPECENUM_VALUE93 L_START_CITIES -#define SPECENUM_VALUE93NAME N_("?unitflag:CitiesStartunit") +#define SPECENUM_VALUE100 L_START_CITIES +#define SPECENUM_VALUE100NAME N_("?unitflag:CitiesStartunit") /* Startunit: Worker */ -#define SPECENUM_VALUE94 L_START_WORKER -#define SPECENUM_VALUE94NAME N_("?unitflag:WorkerStartunit") +#define SPECENUM_VALUE101 L_START_WORKER +#define SPECENUM_VALUE101NAME N_("?unitflag:WorkerStartunit") /* Startunit: Explorer */ -#define SPECENUM_VALUE95 L_START_EXPLORER -#define SPECENUM_VALUE95NAME N_("?unitflag:ExplorerStartunit") +#define SPECENUM_VALUE102 L_START_EXPLORER +#define SPECENUM_VALUE102NAME N_("?unitflag:ExplorerStartunit") /* Startunit: King */ -#define SPECENUM_VALUE96 L_START_KING -#define SPECENUM_VALUE96NAME N_("?unitflag:KingStartunit") +#define SPECENUM_VALUE103 L_START_KING +#define SPECENUM_VALUE103NAME N_("?unitflag:KingStartunit") /* Startunit: Diplomat */ -#define SPECENUM_VALUE97 L_START_DIPLOMAT -#define SPECENUM_VALUE97NAME N_("?unitflag:DiplomatStartunit") +#define SPECENUM_VALUE104 L_START_DIPLOMAT +#define SPECENUM_VALUE104NAME N_("?unitflag:DiplomatStartunit") /* Startunit: Ferryboat */ -#define SPECENUM_VALUE98 L_START_FERRY -#define SPECENUM_VALUE98NAME N_("?unitflag:FerryStartunit") +#define SPECENUM_VALUE105 L_START_FERRY +#define SPECENUM_VALUE105NAME N_("?unitflag:FerryStartunit") /* Startunit: DefendOk */ -#define SPECENUM_VALUE99 L_START_DEFEND_OK -#define SPECENUM_VALUE99NAME N_("?unitflag:DefendOkStartunit") +#define SPECENUM_VALUE106 L_START_DEFEND_OK +#define SPECENUM_VALUE106NAME N_("?unitflag:DefendOkStartunit") /* Startunit: DefendGood */ -#define SPECENUM_VALUE100 L_START_DEFEND_GOOD -#define SPECENUM_VALUE100NAME N_("?unitflag:DefendGoodStartunit") +#define SPECENUM_VALUE107 L_START_DEFEND_GOOD +#define SPECENUM_VALUE107NAME N_("?unitflag:DefendGoodStartunit") /* Startunit: AttackFast */ -#define SPECENUM_VALUE101 L_START_ATTACK_FAST -#define SPECENUM_VALUE101NAME N_("?unitflag:AttackFastStartunit") +#define SPECENUM_VALUE108 L_START_ATTACK_FAST +#define SPECENUM_VALUE108NAME N_("?unitflag:AttackFastStartunit") /* Startunit: AttackStrong */ -#define SPECENUM_VALUE102 L_START_ATTACK_STRONG -#define SPECENUM_VALUE102NAME N_("?unitflag:AttackStrongStartunit") +#define SPECENUM_VALUE109 L_START_ATTACK_STRONG +#define SPECENUM_VALUE109NAME N_("?unitflag:AttackStrongStartunit") /* Startunit: UserType1 */ -#define SPECENUM_VALUE103 L_START_USERTYPE1 -#define SPECENUM_VALUE103NAME N_("?unitflag:UserType1Startunit") +#define SPECENUM_VALUE110 L_START_USERTYPE1 +#define SPECENUM_VALUE110NAME N_("?unitflag:UserType1Startunit") /* Startunit: UserType2 */ -#define SPECENUM_VALUE104 L_START_USERTYPE2 -#define SPECENUM_VALUE104NAME N_("?unitflag:UserType2Startunit") +#define SPECENUM_VALUE111 L_START_USERTYPE2 +#define SPECENUM_VALUE111NAME N_("?unitflag:UserType2Startunit") /* Startunit: UserType3 */ -#define SPECENUM_VALUE105 L_START_USERTYPE3 -#define SPECENUM_VALUE105NAME N_("?unitflag:UserType3Startunit") +#define SPECENUM_VALUE112 L_START_USERTYPE3 +#define SPECENUM_VALUE112NAME N_("?unitflag:UserType3Startunit") /* Startunit: Trade */ -#define SPECENUM_VALUE106 L_START_TRADE -#define SPECENUM_VALUE106NAME N_("?unitflag:TradeStartUnit") +#define SPECENUM_VALUE113 L_START_TRADE +#define SPECENUM_VALUE113NAME N_("?unitflag:TradeStartUnit") /* AI hunter type unit */ -#define SPECENUM_VALUE107 L_HUNTER -#define SPECENUM_VALUE107NAME N_("?unitflag:Hunter") +#define SPECENUM_VALUE114 L_HUNTER +#define SPECENUM_VALUE114NAME N_("?unitflag:Hunter") /* can improve terrain */ -#define SPECENUM_VALUE108 L_SETTLERS -#define SPECENUM_VALUE108NAME N_("?unitflag:Settlers") +#define SPECENUM_VALUE115 L_SETTLERS +#define SPECENUM_VALUE115NAME N_("?unitflag:Settlers") #define L_LAST (L_SETTLERS + 1) #include "specenum_gen.h" @@ -593,13 +621,13 @@ struct bombard_stats { int bombard_move_cost; // Bits 2-7: Move fragments expended by performing a bombard action int bombard_primary_targets; // Bits 8-10: Max # of targets on tile that are hit. (0==all) int bombard_primary_kills; // Bits 11-13: Max # of kills possible on primary targets (0==none) + int bombard_atk_mod; // Bits 14-19: Attack strength mod for bombard, cf.utype_get_bombard_stats int bombard_collateral_targets; // RESERVED, # of secondary units who receive (lesser) damage int bombard_collateral_kills; // RESERVED, # of collateral units who could possibly die (0==none) int bombard_collateral_rate_reduce;//RESERVED, reduction in bombard_rate for collateral target exposure int bombard_collateral_atk_mod; // RESERVED, adjustment to atk strength on collateral targets (e.g., -25) int bombard_fortified_def_mod; // RESERVED, additional defense bonus for targets IFF fortified int bombard_rate_range_mod; // RESERVED, adjustment to bombard_rate for each 1 tile distance - int bombard_atk_mod; // RESERVED, % adjustment to attack strength when bombarding (-50 = -50%) int bombard_atk_range_mod; // RESERVED, % adjustment to attack strength for tile distance beyond dist==1 // RESERVED for later use @@ -625,6 +653,7 @@ struct extra_unit_stats { int iPillage_odds; // Bits 5-8 - odds of success expressed as 100-(6*) int iPillage_random_targets; // Bit 9-10: non-zero==randomly pick x targets. 0==user select target. int bombard_retaliate_rounds; // Bits 11-15:number of rounds of bombard retaliation when bombarded + int max_attacks; // Bits 16-18:max number of attacks per turn, e.g., 001 = 'OneAttack' /****** NOTE ****** A retaliator should be aware to also set the following bombard_stats, which are used in its retaliation but do NOT enable initiated bombardment, per se: bombard_primary_targets diff --git a/freeciv/freeciv/configure.ac b/freeciv/freeciv/configure.ac index 7b1388ff6..46679d81d 100644 --- a/freeciv/freeciv/configure.ac +++ b/freeciv/freeciv/configure.ac @@ -1663,6 +1663,11 @@ AC_CONFIG_FILES([Makefile data/webperimental/Makefile data/mpplus/Makefile data/mp2/Makefile + data/mp2-ag/Makefile + data/mp2-brava/Makefile + data/mp2-caravel/Makefile + data/mp2c-desert/Makefile + data/mp2c-occ/Makefile data/scenarios/Makefile data/nation/Makefile data/ruledit/Makefile diff --git a/freeciv/freeciv/data/.historic/ag2/README.ag2 b/freeciv/freeciv/data/.historic/ag2/README.ag2 deleted file mode 100644 index 2af4c4616..000000000 --- a/freeciv/freeciv/data/.historic/ag2/README.ag2 +++ /dev/null @@ -1,31 +0,0 @@ -AG: Avant-garde ruleset -------------------------------------- -LINKS: -Full Game Manual -Multiplayer II Summary -Design Log -... -Terrain -Bases -Combat -Governments -Economy -Diplomacy -Diplomatic Odds Charts -... -Terrain+Base Defense Bonus Quick-Reference -Hotkeys and Mouse Control - -The Avant-garde ruleset is a modernized ruleset to take advantage of cutting-edge advancements in Freeciv Server development. -Compared to Multiplayer-Evolution (MP2), the differences are that it is less restrained to keep the same "DNA" as the other -MP-branch rulesets, and allows itself to import features, improvements, and novel ideas from all other versions of Freeciv, -later versions of the commercial series, as well as original ideas from players. - -This ruleset began using MP2 as its base and added to it. Enjoy! - ------------------------------ -Changes from MP2: ------------------------------ -Hotkeys and Mouse Control - -END. \ No newline at end of file diff --git a/freeciv/freeciv/data/.historic/ag2/changelog.txt b/freeciv/freeciv/data/.historic/ag2/changelog.txt deleted file mode 100644 index a9076ad35..000000000 --- a/freeciv/freeciv/data/.historic/ag2/changelog.txt +++ /dev/null @@ -1,35 +0,0 @@ -1. Spy Plane upgrades AWACS -2. Airplane can carry diplomatic units. - a. can be expelled (doc it) -3. Train - a. capturable (doc it) - b. foot units can embark/disembark - c. unreachable to pre-gunpowder - d. cargo: any unit with <=2 moves, also balloons -4. Transporting units can't fortify -5. Trade is no longer a requirement for making wonders. - Wonders already need a tech to enable them, - logistics on Commerce units are already a limitation - priority of early economic growth is already a limitation - remove artificial impossibility of making bronze age wonders in bronze age -6. [phalanx] -7. Stone Age herds of wild game appear in forests for first 10 turns (3000 BC), during the age before they are hunted out and/or learn to be more wary of humans. - a. this micro-balances resource distribution balance; smooths effect of luck on starting position; micro-accelerates the slower starting turns -[[[8. Hidden resources can exist as in Civ2 - transforming a terrain type to another type might reveal it.]]] disabled *** commented about as ; "Appear" -9. Robotics needed for Plastics, forces Armor I to be required before Armor II -10. On average, Fallout lasts 5 turns before randomly disappearing. -12. Appian Way wonder, allows Wagon also. -13. Deer and Wild Boar: piques the first 10 turns with slightly more speed and interest; smooths statistical resource distribution and "fair start" issues -14. Foot soldiers can clean pollution -**. Document, clean pollution can be done by foot soldiers and also while transported -15. New server setting killcitizen_pct defaults to 62% (doc it) -16. Ecclesiastical Palace price drop to 90. -17. Commerce units can enter Peace territory for peaceful purposes, and during War can attack. -18. Pre-civilized tribes enjoy a +1/3 move bonus. Building your first city increases sedentary culture and eliminates the bonus. - -Angkor Wat -Code of Hammurabi - - - - diff --git a/freeciv/freeciv/data/.historic/ag2/effects.ruleset b/freeciv/freeciv/data/.historic/ag2/effects.ruleset deleted file mode 100644 index 7b6230bc1..000000000 --- a/freeciv/freeciv/data/.historic/ag2/effects.ruleset +++ /dev/null @@ -1,5043 +0,0 @@ -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes, -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -; Note that the freeciv AI may not cope well with anything more -; than minor changes. - -[datafile] -description="Avant-garde effects data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -; /* <-- avoid gettext warnings -; -; Effects -; -; type = What the effect does. Values of multiple active effects -; of the same type get summed for the total. -; See README.effects for list of possible types -; value = Value added for the effect type when this effect is active, -; i.e., all requirements are fulfilled -; multiplier = Name of the policy that gives a multiplier for effect's value -; reqs = Requirements for the effect to be active. -; See README.effects for help on requirements -; -; */ <-- avoid gettext warnings - -; Med. Bomber is a "Soft Field Unit." If non-aggressively deployed, 0 unhappy in Republic, -; 1 unhappy in Democracy: -[effect_medium_bomber_field_unit_minus_one] -type = "Peaceful_Field_Unit_Bonus" -value = 1 -reqs = - { "type", "name", "range", "present" - "UnitType", "Medium Bomber", "Local", TRUE - } - -; EXAMPLE OF HOW TO USE NEW Unit_Unhappy_Cost EFFECT, almost same -; as the above effect (don't use both!) -;[effect_medium_bomber_field_unit_minus_one] -;type = "Unit_Unhappy_Cost" -;value = -1 -;reqs = -; { "type", "name", "range", "present" -; "UnitType", "Medium Bomber", "Local", TRUE -; "UnitState","OnDomesticTile","Local", TRUE -; } - -; Combat_rounds for ancient ships -[effect_combat_rounds_riverships] -type = "Combat_Rounds" -value = 15 -reqs = - { "type", "name", "range", "present" - "UnitClass", "RiverShip", "Local", TRUE - "UnitType", "Frigate", "Local", FALSE - } -[effect_combat_rounds_trireme] -type = "Combat_Rounds" -value = 15 -reqs = - { "type", "name", "range", "present" - "UnitType", "Trireme", "Local", TRUE - } - -; Cheating AI effects are in separate file -*include "default/ai_effects.ruleset" - -[effect_unhappysize] -type = "City_Unhappy_Size" -value = 4 - -; Percent foreign citizens who are unhappy if at war -; with their original nation -[effect_angry_conquered] -type = "Enemy_Citizen_Unhappy_Pct" -value = 34 ; handles proper rounding for 1/3 - -; Barbarian effects -[effect_barb1] -type = "No_Diplomacy" -value = 1 -reqs = - { "type", "name", "range" - "NationGroup", "Barbarian", "Player" - } - -; Barbarian disappearance -[effect_barb_disappear] -type = "Retire_Pct" -value = 10 -reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", TRUE - "Age", "5", "Local", TRUE - "CityTile", "Center", "Local", FALSE - } - -; Lone Leader might escape on coast (33% chance) -; Complement of the two effects should be 0.9 * 0.66 = 0.594 -; (100 - 59) - 10 = 31 -[effect_leader_escape] -type = "Retire_Pct" -value = 31 -reqs = - { "type", "name", "range" - "UnitType", "Barbarian Leader", "Local" - "Age", "5", "Local" - "TerrainClass", "Oceanic", "Adjacent" - "MaxUnitsOnTile", "1", "Local" - } - -; Specialist output bonuses -[effect_elvis] -type = "Specialist_Output" -value = 2 -reqs = - { "type", "name", "range" - "Specialist", "elvis", "Local" - "OutputType", "luxury", "Local" - } - -[effect_scientist] -type = "Specialist_Output" -value = 3 -reqs = - { "type", "name", "range" - "Specialist", "scientist", "Local" - "OutputType", "science", "Local" - } - -[effect_taxman] -type = "Specialist_Output" -value = 3 -reqs = - { "type", "name", "range" - "Specialist", "taxman", "Local" - "OutputType", "gold", "Local" - } - -[effect_merchant] -type = "Specialist_Output" -value = 2 -reqs = - { "type", "name", "range" - "Specialist", "merchant", "Local" - "OutputType", "trade", "Local" - "Building", "A.Smith's Trading Co.", "Player" - } -[effect_merchant2] -type = "Specialist_Output" -value = 1 -reqs = - { "type", "name", "range" - "Specialist", "merchant", "Local" - "OutputType", "gold", "Local" - "Building", "A.Smith's Trading Co.", "Player" - } - -[effect_worker] -type = "Specialist_Output" -value = 1 -reqs = - { "type", "name", "range" - "Specialist", "worker", "Local" - "OutputType", "shield", "Local" - "Building", "A.Smith's Trading Co.", "Player" - } - -[effect_farmer] -type = "Specialist_Output" -value = 1 -reqs = - { "type", "name", "range" - "Specialist", "farmer", "Local" - "OutputType", "food", "Local" - "Building", "A.Smith's Trading Co.", "Player" - } - -; Vision benefit from mountains (for every land unit) -[effect_mountains_vision] -type = "Unit_Vision_Radius_Sq" -value = 5 -reqs = - { "type", "name", "range" - "Terrain", "Mountains", "Local" - "UnitClass", "Land", "Local" - } -[effect_mountains_vision_1] -type = "Unit_Vision_Radius_Sq" -value = 5 -reqs = - { "type", "name", "range" - "Terrain", "Mountains", "Local" - "UnitClass", "LandAirSea", "Local" - } -[effect_mountains_vision_2] -type = "Unit_Vision_Radius_Sq" -value = 5 -reqs = - { "type", "name", "range" - "Terrain", "Mountains", "Local" - "UnitClass", "LandNoKill", "Local" - } - -; basic free tech upkeep -[effect_upkeep_tech_free] -type = "Tech_Upkeep_Free" -value = 3 - -; *************************** TRADE ROUTES **************************** -[effect_trade_routes] -type = "Max_Trade_Routes" -value = 1 - -; -------------------- TRADE ROUTE ONGOING REVENUE -------------------- -[effect_appian_traderoute_nation] -type = "Traderoute_Pct" -value = 33 -reqs = - { "type", "name", "range" - "Building", "Appian Way", "Player" - } -[effect_appian_traderoute_city] -type = "Traderoute_Pct" -value = 33 -reqs = - { "type", "name", "range" - "Building", "Appian Way", "City" - } - -; ------------ ESTABLISH TRADE ROUTE, ONE TIME BONUS ----------------- -;pow(2, value/1000) = 19% or about 1/5 of normal -[effect_base_trade_revenue_reduce] -type = "Trade_Revenue_Bonus" -value = -2400 -reqs = - { "type", "name", "range", "present" - } -[effect_appian_base_restore] -type = "Trade_Revenue_Bonus" -value = 2400 -reqs = - { "type", "name", "range", "present" -; don't stack on top of already restored bonuses for Enter Marketplace - "Action", "Enter Marketplace", "Local", FALSE - "Building", "Appian Way", "Player", TRUE - } -; 2 ^ (-0.414) = 75% (i.e. -25%) -[effect_railroad_trade_revenue_reduce] -type = "Trade_Revenue_Bonus" -value = -414 -reqs = - { "type", "name", "range", "present" - "Tech", "Railroad", "Player", TRUE - } -; 2 ^ (-0.414) = 75% (i.e. -25%) -[effect_flight_trade_revenue_reduce] -type = "Trade_Revenue_Bonus" -value = -414 -reqs = - { "type", "name", "range", "present" - "Tech", "Flight", "Player", TRUE - } -; ------------ ESTABLISH TRADE ROUTE, ONE TIME BONUS ----------------- -; 1. Restore Trade_Revenue_Bonus effects: -2400+1986=-414 = 75% of norm. -; Average-ish Size8-to-Size8 route gets 80 gold, i.e. 20 in profit for 30 shield unit. -[effect_enter_marketplace_bonus_restore] -type = "Trade_Revenue_Bonus" -value = 1986 -reqs = - { "type", "name", "range" - "Action", "Enter Marketplace", "Local" - } - -; ***************************** SEA UNIT REPAIR ******************************* -; Sea units have crews which pro-actively repair damage regardless of movement. -; This is almost comparable to land unit healing. Sea units being "Use once -; and dispose", and/or unable to re-enter action for literally centuries, had -; created issues in realism, playability, and balance. 8% repair/turn effect: -; 10hp units: +0 hp/turn 20hp units: +1 hp/turn -; 30hp units: +2 hp/turn 40hp units: +3 hp/turn -;[effect_sea_hp_regen] -;type = "Unit_Recover_Pct" -;value = 8 -;reqs = -; { "type", "name", "range" -; "UnitClass", "Sea", "Local" -; } -;[effect_sub_hp_regen] -;type = "Unit_Recover_Pct" -;value = 8 -;reqs = -; { "type", "name", "range" -; "UnitClass", "Submarine", "Local" -; } -;[effect_rivership_hp_regen] -;type = "Unit_Recover_Pct" -;value = 8 -;reqs = -; { "type", "name", "range" -; "UnitClass", "RiverShip", "Local" -; } -; The effects above replace the effects below after Unit_Recover_Pct is up -; The effects below substitute if Unit_Recover_Pct is missing from server -[effect_sea_hp_regen] -type = "Unit_Recover" ;30 hp units get + 2 -value = 2 -reqs = - { "type", "name", "range" - "UnitClass", "Sea", "Local" - } -[effect_sub_hp_regen] ;30 hp units get + 2 -type = "Unit_Recover" -value = 2 -reqs = - { "type", "name", "range" - "UnitClass", "Submarine", "Local" - } -[effect_rivership_hp_regen] ;20 hp units get + 1 -type = "Unit_Recover" -value = 1 -reqs = - { "type", "name", "range", "present" - "UnitClass", "RiverShip", "Local", TRUE - "UnitType", "Boat", "Local", FALSE ;have to exclude all 10hp ships - "UnitType", "Galley", "Local", FALSE - "UnitType", "War Galley", "Local", FALSE - "UnitType", "Longboat", "Local", FALSE - "UnitType", "Caravel", "Local", FALSE - "UnitType", "Ram Ship", "Local", FALSE - } -[effect_battleship_hp_regen] ;40 hp units get + 3 -type = "Unit_Recover" -value = 1 ; 2+1=3 -reqs = - { "type", "name", "range" - "UnitType", "Battleship", "Local" - } -[effect_carrier_hp_regen] ;40 hp units get + 3 -type = "Unit_Recover" -value = 1 ; 2+1=3 -reqs = - { "type", "name", "range" - "UnitType", "Carrier", "Local" - } - -; *********************************** BASES ******************************* - -; **** FORT ***** -[effect_fort_defense] -type = "Defend_Bonus" -value = 33 -reqs = - { "type", "name", "range", "present" - "Extra", "Fort", "Local", TRUE - "Extra", "Fortress", "Local", FALSE ; Fortress calculated separately even if a fort is under it. - "Extra", "Naval Base", "Local", FALSE ; Naval base calculated separately even if a fort is under it. - "UnitClass", "Helicopter", "Local", FALSE ; ... these attackers do not activate Fort defense bonus - "UnitClass", "Air", "Local", FALSE ; ... " " " " " " " " - "UnitClass", "AirPillage", "Local", FALSE ; ... " " " " " " " " - "UnitClass", "AirProtect", "Local", FALSE ; ... " " " " " " " " - "UnitType", "Armor", "Local", FALSE ; ... " " " " " " " " - "UnitType", "Armor II", "Local", FALSE ; ... " " " " " " " " - } -; Fort HP regen -[effect_fort_hp_regen] -type = "HP_Regen" -value = 10 -reqs = - { "type", "name", "range" - "Extra", "Fort", "Tile" - "UnitClass", "Land", "Local" - } -[effect_fort_hp_regen_1] -type = "HP_Regen" -value = 10 -reqs = - { "type", "name", "range" - "Extra", "Fort", "Tile" - "UnitClass", "LandAirSea", "Local" - } -[effect_fort_hp_regen_2] -type = "HP_Regen" -value = 10 -reqs = - { "type", "name", "range" - "Extra", "Fort", "Tile" - "UnitClass", "LandNoKill", "Local" - } - -; **** FORTRESS/NAVAL BASE *************************************************** - -; Adjust the 1.67xdefense_bonus in terrain.ruleset for some attackers: -; **************************************************************************** -[effect_nonfortbuster_vs_fortress] -type = "Defend_Bonus" -value = 20 ;increase 1.67x to 2x except when defending against FortBuster types. -;note: 1.20*1.67=2.0 (this bonus is multiplied after terrain defense_bonus was multiplied) -reqs = - { "type", "name", "range", "present" - "Extra", "Fortress", "Local", TRUE - "UnitFlag", "FortBuster", "Local", FALSE - "UnitFlag", "FortressBuster", "Local", FALSE - "UnitFlag", "AirAttacker", "Local", FALSE - } -[effect_nonfortbuster_vs_navalbase] ;same as above but for naval base -type = "Defend_Bonus" -value = 20 ;increase 1.67x to 2x except when defending against FortBuster types. -;note: 1.20*1.67=2.0 (this bonus is multiplied after terrain defense_bonus was multiplied) -reqs = - { "type", "name", "range", "present" - "Extra", "Naval Base", "Local", TRUE - "UnitFlag", "FortBuster", "Local", FALSE - "UnitFlag", "FortressBuster", "Local", FALSE - "UnitFlag", "AirAttacker", "Local", FALSE - } -[effect_fortressbuster_fortress] -type = "Attack_Bonus" -value = 67 ;Cancel defender's 1.67x with attacker getting 1.67x -reqs = - { "type", "name", "range", "present" - "Extra", "Fortress", "Local", TRUE - "UnitFlag", "FortressBuster", "Local", TRUE - } -[effect_fortressbuster_navalbase] -type = "Attack_Bonus" -value = 67 ;Cancel defender's 1.67x with attacker getting 1.67x -reqs = - { "type", "name", "range", "present" - "Extra", "Naval Base", "Local", TRUE - "UnitFlag", "FortressBuster", "Local", TRUE - } - -; ****** ^^ defense_bonus_correctives ^^ ************************************* - -; Vision benefit from fortress watchtowers -[effect_fortress_vision] -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "tile" - "Tech", "Invention", "Player" - "UnitClass", "Land", "Local" - } -[effect_fortress_vision_1] ;Marines, AAA -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "tile" - "Tech", "Invention", "Player" - "UnitClass", "LandAirSea", "Local" - } -[effect_fortress_vision_2] ;Knights -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "tile" - "Tech", "Invention", "Player" - "UnitClass", "LandNoKill", "Local" - } - -; Fortress HP regen -[effect_fortress_hp_regen] -; Cumulative with fort: 10+15=25 -type = "HP_Regen" -value = 15 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "Tile" - "UnitClass", "Land", "Local" - } -[effect_fortress_hp_regen_1] -type = "HP_Regen" -value = 15 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "Tile" - "UnitClass", "LandAirSea", "Local" - } -[effect_fortress_hp_regen_2] -type = "HP_Regen" -value = 15 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "Tile" - "UnitClass", "LandNoKill", "Local" - } -[effect_fortress_hp_regen_3] -type = "HP_Regen" -value = 25 ;25 because not cumulative with Fort -reqs = - { "type", "name", "range" - "Extra", "Fortress", "Tile" - "UnitClass", "Helicopter", "Local" - } - -[effect_airbase_hp_regen] -type = "HP_Regen" -value = 25 -reqs = - { "type", "name", "range" - "Extra", "Airbase", "Tile" - "UnitClass", "Helicopter", "Local" - } -[effect_airbase_hp_regen1] -type = "HP_Regen" -value = 15 -reqs = - { "type", "name", "range" - "Extra", "Airbase", "Tile" - "UnitClass", "AirProtect", "Local" - } -[effect_airbase_hp_regen2] -type = "HP_Regen" -value = 15 -reqs = - { "type", "name", "range" - "Extra", "Airbase", "Tile" - "UnitClass", "Air", "Local" - } -[effect_airbase_hp_regen3] -type = "HP_Regen" -value = 15 -reqs = - { "type", "name", "range" - "Extra", "Airbase", "Tile" - "UnitClass", "AirPillage", "Local" - } - -; ****************** NAVAL BASE ****************************** -[effect_navbase_vision] -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "tile" - "Tech", "Invention", "Player" - "UnitClass", "Trireme", "Local" - } -[effect_navbase_vision1] -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "tile" - "Tech", "Invention", "Player" - "UnitClass", "RiverShip", "Local" - } -[effect_navbase_vision2] -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "tile" - "Tech", "Invention", "Player" - "UnitClass", "Sea", "Local" - } -; Naval Base HP regen -[effect_navbase_hp_regen] -type = "HP_Regen" -value = 20 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "Tile" - "UnitClass", "Sea", "Local" - } -[effect_navbase_hp_regen_1] -type = "HP_Regen" -value = 20 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "Tile" - "UnitClass", "RiverShip", "Local" - } -[effect_navbase_hp_regen_2] -type = "HP_Regen" -value = 20 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "Tile" - "UnitClass", "Trireme", "Local" - } -[effect_navbase_hp_regen_3] -type = "HP_Regen" -value = 20 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "Tile" - "UnitClass", "Submarine", "Local" - } -; *********************************************************** - -; Base vision range - radius of vision is sqrt(5) = 2.24 -[effect_city_vision] -type = "City_Vision_Radius_Sq" -value = 5 - -;PERCENTAGE CHANCE OF STEALING A TECH WHEN CONQUERING A CITY. -[effect_conquest_tech] -type = "Conquest_Tech_Pct" -value = 100 - -;Freshly fueled full hp helicopters get +1 move per turn -[effect_fresh_helicopter] -type = "Move_Bonus" -value = 9 -reqs = - { "type", "name", "range" - "UnitClass", "Helicopter", "Local" - "Extra", "Airbase", "Local" - } -;Freshly fueled full hp helicopters get +1 move per turn -[effect_fresh_helicopter2] -type = "Move_Bonus" -value = 9 -reqs = - { "type", "name", "range" - "UnitClass", "Helicopter", "Local" - "CityTile", "Center", "Local" - } - -; Nuclear power gives +1 moves to sea units (+2 under 2x) -[effect_nuclear_powered_boats] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Tech", "Nuclear Power", "Player" - "UnitClass", "Sea", "Local" - } -; Nuclear power gives +1 moves to sea units (+2 under 2x) -[effect_nuclear_powered_subs] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Tech", "Nuclear Power", "Player" - "UnitClass", "Submarine", "Local" - } - -[effect_anarchy_upkeep] -type = "Upkeep_Free" -value = 99 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } -[effect_upkeep_communism] -type = "Upkeep_Free" -value = 1 -reqs = - { "type", "name", "range", "quiet" - "Gov", "Communism", "Player", TRUE - } - -[effect_anarchy_upkeep_tech_free] -type = "Tech_Upkeep_Free" -value = 9999 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_republic] -type = "Make_Content_Mil" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_corruption_anarchy0] -type = "Output_Waste" -value = 25 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_anarchy1] -type = "Output_Waste_By_Distance" -value = 200 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_despotism0] -type = "Output_Waste" -value = 37 -reqs = - { "type", "name", "range", "present" - "Gov", "Despotism", "Player", TRUE - "Building", "Code of Hammurabi", "Player", FALSE - "OutputType", "Trade", "Local", TRUE - } -[effect_corruption_hammurabi_despotism0] -type = "Output_Waste" -value = 26 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - "Building", "Code of Hammurabi", "Player" - "OutputType", "Trade", "Local" - } - - -[effect_corruption_despotism1] -type = "Output_Waste_By_Distance" -value = 400 -reqs = - { "type", "name", "range", "present" - "Gov", "Despotism", "Player", TRUE - "Building", "Code of Hammurabi", "Player", FALSE - "OutputType", "Trade", "Local", TRUE - } -[effect_corruption_hammurabi_despotism1] -type = "Output_Waste_By_Distance" -value = 300 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - "Building", "Code of Hammurabi", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_monarchy0] -type = "Output_Waste" -value = 15 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_monarchy1] -type = "Output_Waste_By_Distance" -value = 200 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_communism0] -type = "Output_Waste" -value = 20 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_republic0] -type = "Output_Waste" -value = 15 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_republic1] -type = "Output_Waste_By_Distance" -value = 200 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - "OutputType", "Trade", "Local" - } - -[effect_base_unit_upkeep] -type = "Upkeep_Factor" -value = 1 - -[effect_republic_unit_upkeep] -type = "Upkeep_Factor" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - "OutputType", "Food", "Local" - } - -[effect_democracy_unit_upkeep] -type = "Upkeep_Factor" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - "OutputType", "Food", "Local" - } - -[effect_republic_unit_unhappiness] -type = "Unhappy_Factor" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_democracy_unit_unhappiness] -type = "Unhappy_Factor" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_upkeep_free_units_anarchy] -type = "Unit_Upkeep_Free_Per_City" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - "OutputType", "Shield", "Local" - } - -[effect_upkeep_free_units_despotism] -type = "Unit_Upkeep_Free_Per_City" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - "OutputType", "Shield", "Local" - } - -[effect_upkeep_free_units_monarchy] -type = "Unit_Upkeep_Free_Per_City" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - "OutputType", "Shield", "Local" - } - -[effect_upkeep_free_units_communism] -type = "Unit_Upkeep_Free_Per_City" -value = 4 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - "OutputType", "Shield", "Local" - } - -[effect_civil_war_0] -type = "Civil_War_Chance" -value = 90 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_civil_war_1] -type = "Civil_War_Chance" -value = 80 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_civil_war_2] -type = "Civil_War_Chance" -value = 70 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -[effect_civil_war_3] -type = "Civil_War_Chance" -value = 50 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - } - -[effect_civil_war_4] -type = "Civil_War_Chance" -value = 40 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_civil_war_5] -type = "Civil_War_Chance" -value = 30 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_empire_size_base_0] -type = "Empire_Size_Base" -value = 9 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_empire_size_base_1] -type = "Empire_Size_Base" -value = 10 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_empire_size_base_2] -type = "Empire_Size_Base" -value = 11 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -[effect_empire_size_base_3] -type = "Empire_Size_Base" -value = 12 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - } - -[effect_empire_size_base_4] -type = "Empire_Size_Base" -value = 13 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_empire_size_base_5] -type = "Empire_Size_Base" -value = 14 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_empire_size_base_6] -type = "Empire_Size_Base" -value = 14 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_empire_size_step_0] -type = "Empire_Size_Step" -value = 6 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_empire_size_step_1] -type = "Empire_Size_Step" -value = 10 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_empire_size_step_2] -type = "Empire_Size_Step" -value = 12 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -; Empire_Size_Step disabled for Communism - -[effect_empire_size_step_3] -type = "Empire_Size_Step" -value = 14 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_empire_size_step_4] -type = "Empire_Size_Step" -value = 16 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_empire_size_step_5] -type = "Empire_Size_Step" -value = 15 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_max_rates_0] -type = "Max_Rates" -value = 100 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_max_rates_1] -type = "Max_Rates" -value = 60 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_max_rates_2] -type = "Max_Rates" -value = 70 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -[effect_max_rates_3] -type = "Max_Rates" -value = 80 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - } - -[effect_max_rates_4] -type = "Max_Rates" -value = 80 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_max_rates_5] -type = "Max_Rates" -value = 100 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_martial_law_each_0] -type = "Martial_Law_Each" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_martial_law_each_1] -type = "Martial_Law_Each" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_martial_law_each_2] -type = "Martial_Law_Each" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -[effect_martial_law_each_3] -type = "Martial_Law_Each" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - } - -[effect_martial_law_each_4] -type = "Martial_Law_Each" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_martial_law_max_0] -type = "Martial_Law_Max" -value = 100 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_martial_law_max_1] -type = "Martial_Law_Max" -value = 100 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_martial_law_max_2] -type = "Martial_Law_Max" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -[effect_martial_law_max_3] -type = "Martial_Law_Max" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - } - -[effect_martial_law_max_4] -type = "Martial_Law_Max" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_rapture_grow_0] -type = "Rapture_Grow" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_rapture_grow_1] -type = "Rapture_Grow" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_communism_0] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - "UnitFlag", "Diplomat", "Local" - } - -[effect_gov_tile_bonus_anarchy] -type = "Output_Penalty_Tile" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_gov_tile_bonus_despotism] -type = "Output_Penalty_Tile" -value = 2 -reqs = - { "type", "name", "range", "present" - "Gov", "Despotism", "Player", TRUE - "Building", "Code of Hammurabi","Player", FALSE - } -[effect_gov_tile_bonus_despotism1] ; Code of Hammurabi removes tile penalty on lowlands tiles -type = "Output_Penalty_Tile" -value = 2 -reqs = - { "type", "name", "range", "present" - "Gov", "Despotism", "Player", TRUE - "Building", "Code of Hammurabi","Player", TRUE - "TerrainFlag", "Low Land", "Local", FALSE - } - -[effect_gov_tile_bonus_2] -type = "Output_Inc_Tile_Celebrate" -value = 1 -reqs = - { "type", "name", "range" - "OutputType", "Trade", "Local" - "Gov", "Monarchy", "Player" - } - -[effect_gov_tile_bonus_3] -type = "Output_Inc_Tile_Celebrate" -value = 1 -reqs = - { "type", "name", "range" - "OutputType", "Trade", "Local" - "Gov", "Communism", "Player" - } - -[effect_gov_tile_bonus_4] -type = "Output_Inc_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - "OutputType", "Trade", "Local" - } - -[effect_gov_tile_bonus_5] -type = "Output_Inc_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_gov_tile_bonus_6] -type = "Output_Inc_Tile_Celebrate" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Trade", "Local" - } - -[effect_revolution_0] -type = "Revolution_Unhappiness" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_senate_0] -type = "Has_Senate" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_senate_1] -type = "Has_Senate" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_partisans_communism] -type = "Inspire_Partisans" -value = 1 -reqs = - { "type", "name", "range", "present" - "Gov", "Communism", "Player", TRUE - "Tech", "Communism", "Player", TRUE - "Tech", "Gunpowder", "Player", TRUE - "Tech", "Guerilla Warfare", "World", TRUE - "NationGroup", "Barbarian", "Player", FALSE - } - -[effect_partisans_democracy] -type = "Inspire_Partisans" -value = 1 -reqs = - { "type", "name", "range", "present" - "Gov", "Democracy", "Player", TRUE - "Tech", "Communism", "Player", TRUE - "Tech", "Gunpowder", "Player", TRUE - "Tech", "Guerilla Warfare", "World", TRUE - "NationGroup", "Barbarian", "Player", FALSE - } - -[effect_airport_2] -type = "Airlift" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Airport", "City" - } - -[effect_airport_v0] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Airport", "City", TRUE - "UnitClass", "Air", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_airport_v1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Airport", "City", TRUE - "UnitClass", "AirProtect", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_airport_v2] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Airport", "City", TRUE - "UnitClass", "AirPillage", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_airport_v3] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Airport", "City", TRUE - "UnitClass", "Helicopter", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_airport_v4] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Airport", "City", TRUE - "UnitClass", "Missile", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } - -[effect_airport_h1] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Airport", "City" - "UnitClass", "Air", "Local" - } -[effect_airport_h2] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Airport", "City" - "UnitClass", "AirProtect", "Local" - } -[effect_airport_h3] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Airport", "City" - "UnitClass", "AirPillage", "Local" - } -[effect_airport_h4] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Airport", "City" - "UnitClass", "Helicopter", "Local" - } - -; Base max city size of 8 -[effect_aqueduct_size] -type = "Size_Adj" -value = 8 - -[effect_aqueduct] -type = "Size_Adj" -value = 4 -reqs = - { "type", "name", "range" - "Building", "Aqueduct", "City" - } - -[effect_aqueduct_health] -type = "Health_Pct" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Aqueduct", "City" - } - -[effect_bank] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - "Building", "Bank", "City" - "OutputType", "Gold", "Local" - } - -[effect_bank_1] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - "Building", "Bank", "City" - "OutputType", "Luxury", "Local" - } - -[effect_barracks] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "Land", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_a] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "Land", "Local", TRUE - } -[effect_barracks_b] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE ; might be resting in allied city with Barracks I - } -[effect_barracks_c] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - } - -[effect_barracks_ii] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "Land", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_ii_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_ii_2] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_ii_a] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "Land", "Local", TRUE - } -[effect_barracks_ii_b] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - } -[effect_barracks_ii_c] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - } - -[effect_barracks_iii] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "Land", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_iii_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_iii_2] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_iii_a] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Barracks III", "City" - "UnitClass", "Land", "Local" - } -[effect_barracks_iii_b] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - } -[effect_barracks_iii_c] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - } - -;prolongs time-window relevance of amphibious invasions later in game -[effect_triple_training_marines] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "Building", "Port Facility", "City", TRUE - "Building", "Airport", "City", TRUE - "UnitType", "Marines", "Local", TRUE - } - -;--- STANDARD CATHEDRAL sans Michelangelo ------------------------ -[effect_cathedral] -type = "Make_Content" -value = 3 -reqs = - { "type", "name", "range", "present" - "Building", "Cathedral", "City", TRUE - "Building", "Michelangelo's Chapel", "Player", FALSE - } -[effect_cathedral_1] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range", "present" - "Tech", "Theology", "Player", TRUE - "Building", "Cathedral", "City", TRUE - "Building", "Michelangelo's Chapel", "Player", FALSE - } -[effect_cathedral_2] -type = "Make_Content" -value = -1 -reqs = - { "type", "name", "range", "present" - "Gov", "Communism", "Player", TRUE - "Building", "Cathedral", "City", TRUE - "Building", "Michelangelo's Chapel", "Player", FALSE - } -;--- ENHANCED CATHEDRAL with Michelangelo: *** -[effect_cathedral_ma] -type = "Make_Happy" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Cathedral", "City", TRUE - "Building", "Michelangelo's Chapel", "Player", TRUE - } -[effect_cathedral_ma2] -type = "Force_Content" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Cathedral", "City", TRUE - "Building", "Michelangelo's Chapel", "Player", TRUE - } -;------------------------------------------------------------ -[effect_city_walls] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "UnitClass", "Land", "Local", TRUE -; "Building", "Great Wall", "Player", FALSE - "UnitType", "Howitzer", "Local", FALSE - } -[effect_city_walls_0] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "UnitClass", "Helicopter", "Local", TRUE -; "Building", "Great Wall", "Player", FALSE - } -[effect_city_walls_0a] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE -; "Building", "Great Wall", "Player", FALSE - "UnitType", "Howitzer", "Local", FALSE - } -[effect_city_walls_0b] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE -; "Building", "Great Wall", "Player", FALSE - "UnitType", "Howitzer", "Local", FALSE - } -[effect_city_walls_1] -type = "Unit_No_Lose_Pop" -value = 1 -reqs = - { "type", "name", "range" - "Building", "City Walls", "City" - } -[effect_city_walls_visible] -type = "Visible_Walls" -value = 1 -reqs = - { "type", "name", "range" - "Building", "City Walls", "City" - } - -[effect_coastal_defense] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Coastal Defense", "City" - "UnitClass", "Sea", "Local" - } -[effect_coastal_defense_1] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Coastal Defense", "City" - "UnitClass", "RiverShip", "Local" - } -[effect_coastal_defense_2] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Coastal Defense", "City" - "UnitClass", "Submarine", "Local" - } -[effect_coastal_defense_trireme] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Coastal Defense", "City" - "UnitClass", "Trireme", "Local" - } - -[effect_gibraltar_fortress] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Gibraltar Fortress", "Player", TRUE - "Building", "Coastal Defense", "City", FALSE - "UnitClass", "Sea", "Local" - } -[effect_gibraltar_fortress_1] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Gibraltar Fortress", "Player", TRUE - "Building", "Coastal Defense", "City", FALSE - "UnitClass", "RiverShip", "Local" - } -[effect_gibraltar_fortress_2] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Gibraltar Fortress", "Player", TRUE - "Building", "Coastal Defense", "City", FALSE - "UnitClass", "Submarine", "Local" - } -[effect_gibraltar_fortress_trireme] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Gibraltar Fortress", "Player", TRUE - "Building", "Coastal Defense", "City", FALSE - "UnitClass", "Trireme", "Local" - } - -[effect_amphitheatre] -type = "Make_Content" -value = 3 -reqs = - { "type", "name", "range" - "Building", "Amphitheatre", "City" - } - -[effect_amphitheatre_1] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Tech", "Electricity", "Player" - "Building", "Amphitheatre", "City" - } - -; BECAUSE OF ROUNDING, AVERAGE EFFECT OF 50 ENDS UP BEING 41%, WHEREAS 60 YIELDS ABOUT 53% WHICH IS CLOSER TO ADVERTISED -[effect_courthouse_corruption1] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "OutputType", "Trade", "Local", TRUE - } -[effect_courthouse_corruption2] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "OutputType", "shield", "local", TRUE - } -[effect_courthouse_tile_corruption] ; Removes output penalties (Despotism/Anarchy) for cities with courthouses -type = "Output_Penalty_Tile" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Courthouse", "City", TRUE - } -[effect_courthouse_democracy] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - "Building", "Courthouse", "City" - } -[effect_courthouse_incite_cost_occupied] -type = "Incite_Cost_Pct" -value = 300 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "MaxUnitsOnTile", "0", "Local", FALSE - } -[effect_courthouse_incite_cost_empty] -type = "Incite_Cost_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - "Building", "Courthouse", "City", TRUE - } -[effect_courthouse_upkeep] ; Law and order provides +1 upkeep -type = "Unit_Upkeep_Free_Per_City" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Courthouse", "City", TRUE - "OutputType", "Shield", "Local" - } -[effect_courthouse_spy_resistance] -type = "Spy_Resistant" -value = 25 ;25% reduction of 50% base chance is 12.5% bonus. 50%-12.5%=37.5% success rate - ; No protection= 1/2, HL = 3/8, CH+HL = 1/4, CH+HL+PS = 1/8 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - } -[effect_courthouse_hostile_diplomat0] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Steal Tech", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_1] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Steal Tech Escape Expected", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_2] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Targeted Steal Tech", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_3] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_4] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Sabotage City", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_5] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Sabotage City Escape", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_6] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Targeted Sabotage City", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_7] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Targeted Sabotage City Escape", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_8] -type = "Action_Odds_Pct" -value = -25 ;40 minus 25%*80 = 20% -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Steal Maps Escape", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_9] -type = "Action_Odds_Pct" -value = -25 ;40 minus 25%*80 = 20% -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Steal Maps", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_10] -type = "Action_Odds_Pct" -value = -25 ;40 minus 25%*80 = 20% -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Poison City Escape", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_11] -type = "Action_Odds_Pct" -value = -25 ;40 minus 25%*80 = 20% -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Incite City", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_12] -type = "Action_Odds_Pct" -value = -25 ;40 minus 25%*80 = 20% -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Incite City Escape", "Local", TRUE - } - -[effect_diplomat_defense_fortress] -type = "Spy_Resistant" -value = 25 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "Local" - } - -[effect_incite_cost_empty] -type = "Incite_Cost_Pct" -value = -50 -reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - "Building", "Courthouse", "City", FALSE - "Building", "Supreme Court", "Player", FALSE - } - -[effect_factory] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Factory", "City" - "OutputType", "Shield", "Local" - } - -[effect_fusion_reactor] -type = "Output_Bonus" -value = 75 -reqs = - { "type", "name", "range" - "Building", "Fusion Reactor", "City" - "OutputType", "Shield", "Local" - } -[effect_fusion_reactor1] -type = "Unit_Upkeep_Free_Per_City" -value = 5 -reqs = - { "type", "name", "range" - "Building", "Fusion Reactor", "City", TRUE - "OutputType", "Shield", "Local" - } -[effect_fusion_reactor2] -type = "City_Build_Slots" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Fusion Reactor", "City", TRUE - } - -[effect_granary] -type = "Growth_Food" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Granary", "City" - } - -[effect_harbour] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "TerrainClass", "Oceanic", "Local" - "Building", "Harbour", "City" - "OutputType", "Food", "Local" - } - -[effect_deer] -type = "Output_Add_Tile" -value = 3 -reqs = - { "type", "name", "range" - "Extra", "Deer", "Local" - "OutputType", "Food", "Local" - } - -[effect_wild_boar] -type = "Output_Add_Tile" -value = 3 -reqs = - { "type", "name", "range" - "Extra", "Wild Boar", "Local" - "OutputType", "Food", "Local" - } - -[effect_hydro_plant] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Hydro Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_hydro_plant_1] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Hydro Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_hydro_plant_2] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Hydro Plant", "City", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_hydro_plant_3] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Hydro Plant", "City", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_library] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Library", "City" - "OutputType", "Science", "Local" - } - -[effect_marketplace] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - "OutputType", "Gold", "Local" - } - -[effect_marketplace_1] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - "OutputType", "Luxury", "Local" - } - -; No population pollution until certain techs researched -[effect_pollu_pop_base] -type = "Pollu_Pop_Pct_2" -value = -100 - -[effect_pollu_pop_automobile] -type = "Pollu_Pop_Pct_2" -value = 25 -reqs = - { "type", "name", "range" - "Tech", "Automobile", "Player" - } - -[effect_pollu_pop_industrialization] -type = "Pollu_Pop_Pct_2" -value = 25 -reqs = - { "type", "name", "range" - "Tech", "Industrialization", "Player" - } - -[effect_pollu_pop_mass_production] -type = "Pollu_Pop_Pct_2" -value = 25 -reqs = - { "type", "name", "range" - "Tech", "Mass Production", "Player" - } - -[effect_pollu_pop_plastics] -type = "Pollu_Pop_Pct_2" -value = 25 -reqs = - { "type", "name", "range" - "Tech", "Plastics", "Player" - } - -[effect_mass_transit] -type = "Pollu_Pop_Pct" -value = -100 -reqs = - { "type", "name", "range" - "Building", "Mass Transit", "City" - } -; Increased citizen mobility and ticket revenues increase city base trade by +2 -[effect_mass_transit_1] -type = "Output_Add_Tile" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Mass Transit", "City" - "CityTile", "Center", "Local" - "OutputType", "Trade", "Local" - } - -[effect_mfg_plant] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Mfg. Plant", "City" - "OutputType", "Shield", "Local" - } - -[effect_nuclear_plant] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Nuclear Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_nuclear_plant_1] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Nuclear Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_nuclear_plant_2] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Nuclear Plant", "City", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_nuclear_plant_3] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Nuclear Plant", "City", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_offshore_platform] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "TerrainClass", "Oceanic", "Local" - "Building", "Offshore Platform", "City" - "OutputType", "Shield", "Local" - } - -;Having a Palace means having a city, the beginning of -;sedentary culture and loss of game-start move bonus. -[effect_sedentary_people_are_slow] -type = "Move_Bonus" -value = 3 -reqs = - { - "type", "name", "range", "present" - "Building", "Palace", "Player", FALSE - "UnitClass", "Land", "Local", TRUE - } -[effect_palace] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - "OutputType", "Trade", "Local" - } -[effect_palace_1] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - "OutputType", "shield", "local" - } -[effect_palace_2] -type = "Spy_Resistant" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - } -[effect_palace_2_sabotage] -type = "Building_Saboteur_Resistant" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - } -[effect_palace_3] -type = "Capital_City" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - } -[effect_palace_gov_center] -type = "Gov_Center" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - } -[effect_palace_5] -type = "Output_Bonus" -value = 75 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - "Building", "Palace", "City" - "OutputType", "Shield", "Local" - } - -[effect_palace_6] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - "Building", "Palace", "City" - "OutputType", "Shield", "Local" - } -[effect_palace_6a] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - "Building", "Palace", "City" - "OutputType", "Shield", "Local" - } -[effect_palace_7] -type = "Make_Happy" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - } -[effect_palace_fundamentalism] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range", "present", "quiet" - "Gov", "Fundamentalism", "Player", TRUE, TRUE - "Building", "Palace", "City", TRUE, FALSE - "OutputType", "Gold", "Local", TRUE, FALSE - } - -[effect_ecclesiastical_palace] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "OutputType", "Trade", "Local", TRUE - "Building", "Palace", "City", FALSE - } -[effect_ecclesiastical_palace_1] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "OutputType", "Shield", "local", TRUE - "Building", "Palace", "City", FALSE - } -[effect_ecclesiastical_palace_2] -type = "Spy_Resistant" -value = 50 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "Building", "Palace", "City", FALSE - } -[effect_ecclestiastical_palace_3] -type = "Make_Happy" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Ecclesiastical Palace", "City" - } -[effect_ecclesiastical_palace_4] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "UnitType", "Fanatics", "Local", TRUE - } -[effect_ecclesiastical_palace_gov_center] -type = "Gov_Center" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "Building", "Palace", "City", FALSE - } -[effect_ecclesiastical_palace_despotism] -type = "Output_Bonus" -value = 75 -reqs = - { "type", "name", "range", "present", "quiet" - "Gov", "Despotism", "Player", TRUE, TRUE - "Building", "Ecclesiastical Palace", "City", TRUE, FALSE - "OutputType", "Gold", "Local", TRUE, FALSE -; "Building", "Palace", "City", FALSE, FALSE - } -[effect_ecclesiastical_palace_monarchy] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range", "present", "quiet" - "Gov", "Monarchy", "Player", TRUE, TRUE - "Building", "Ecclesiastical Palace", "City", TRUE, FALSE - "OutputType", "Gold", "Local", TRUE, FALSE -; "Building", "Palace", "City", FALSE, FALSE - } -[effect_ecclesiastical_palace_fundamentalism] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range", "present", "quiet" - "Gov", "Fundamentalism", "Player", TRUE, TRUE - "Building", "Ecclesiastical Palace", "City", TRUE, FALSE - "OutputType", "Gold", "Local", TRUE, FALSE - ; "Building", "Palace", "City", FALSE, FALSE - } -[effect_ecclesiastical_palace_communism] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present", "quiet" - "Gov", "Communism", "Player", TRUE, TRUE - "Building", "Ecclesiastical Palace", "City", TRUE, FALSE - "OutputType", "Gold", "Local", TRUE, FALSE - ; "Building", "Palace", "City", FALSE, FALSE - } - -[effect_ecclesiastical_palace_culture] -type = "History" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "Building", "Palace", "City", FALSE - } -[effect_ecclesiastical_palace_2_sabotage] -type = "Building_Saboteur_Resistant" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Ecclesiastical Palace", "City" - } - -[effect_police_station] -type = "Make_Content_Mil" -value = 2 -reqs = - { "type", "name", "range", "present" - "Gov", "Republic", "Player", TRUE - "Building", "Police Station", "City", TRUE - "Building", "Women's Suffrage", "Player", FALSE - } -[effect_police_station_1] -type = "Make_Content_Mil" -value = 4 -reqs = - { "type", "name", "range", "present" - "Gov", "Democracy", "Player", TRUE - "Building", "Police Station", "City", TRUE - "Building", "Women's Suffrage", "Player", FALSE - } -[effect_police_station_vet_diplo] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "UnitFlag", "NoVeteran", "Local", FALSE - "UnitFlag", "Diplomat", "Local", TRUE - } -[effect_police_station_spy_resistant] -type = "Spy_Resistant" -value = 25 ; 25% of 50% = -12.5% 4/8-1/8 = 3/8 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - } -[effect_police_station_hostile_diplomat_0] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Steal Tech", "Local", TRUE - } -[effect_police_station_hostile_diplomat_1] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Steal Tech Escape Expected", "Local", TRUE - } -[effect_police_station_hostile_diplomat_2] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Targeted Steal Tech", "Local", TRUE - } -[effect_police_station_hostile_diplomat_3] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE - } -[effect_police_station_hostile_diplomat_4] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Sabotage City", "Local", TRUE - } -[effect_police_station_hostile_diplomat_5] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Sabotage City Escape", "Local", TRUE - } -[effect_police_station_hostile_diplomat_6] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Targeted Sabotage City", "Local", TRUE - } -[effect_police_station_hostile_diplomat_7] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Targeted Sabotage City Escape", "Local", TRUE - } -[effect_police_station_hostile_diplomat_8] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Steal Maps Escape", "Local", TRUE - } -[effect_police_station_hostile_diplomat_9] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Steal Maps", "Local", TRUE - } -[effect_police_station_hostile_diplomat_10] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Poison City Escape", "Local", TRUE - } -[effect_police_station_hostile_diplomat_11] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Incite City", "Local", TRUE - } -[effect_police_station_hostile_diplomat_12] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Incite City Escape", "Local", TRUE - } - -[effect_port_facility] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Port Facility", "City", TRUE - "UnitClass", "Sea", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_port_facility_a] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Port Facility", "City", TRUE - "UnitClass", "RiverShip", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_port_facility_b] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Port Facility", "City", TRUE - "UnitClass", "Submarine", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_port_facility_1] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Port Facility", "City" - "UnitClass", "Sea", "Local" - } -[effect_port_facility_1a] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Port Facility", "City" - "UnitClass", "RiverShip", "Local" - } -[effect_port_facility_1b] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Port Facility", "City" - "UnitClass", "Submarine", "Local" - } -[effect_port_facility_trireme] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Port Facility", "City", TRUE - "UnitClass", "Trireme", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_port_facility_trireme_1] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Port Facility", "City" - "UnitClass", "Trireme", "Local" - } - -[effect_power_plant] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Power Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Hydro Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_power_plant_1] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Power Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Hydro Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_recycling_center] -type = "Pollu_Prod_Pct" -value = -66 -reqs = - { "type", "name", "range", "present" - "Building", "Recycling Center", "City", TRUE -; A Solar Plant can give a stronger effect than a Recycling Center, in which -; case we want only the Solar Plant's effect (not the addition of the two). - "Building", "Solar Plant", "City", FALSE - } - -; Nasty special cases: where a Solar Plant is present but its effect is less -; than that of a Recycling Center, top up so that the net effect is that of the -; Recycling Center. -; (This would be so much easier if effects could be combined by functions -; other than addition...) - -; Factory and no Mfg. Plant: Solar Plant saves 50%, less than 66%; add 16% -[effect_recycling_center_1] -type = "Pollu_Prod_Pct" -value = -16 -reqs = - { "type", "name", "range", "present" - "Building", "Recycling Center", "City", TRUE - "Building", "Solar Plant", "City", TRUE - "Building", "Factory", "City", TRUE - "Building", "Mfg. Plant", "City", FALSE - } - -; Mfg. Plant and no Factory: Solar Plant saves 50%, less than 66%; add 16% -[effect_recycling_center_2] -type = "Pollu_Prod_Pct" -value = -16 -reqs = - { "type", "name", "range", "present" - "Building", "Recycling Center", "City", TRUE - "Building", "Solar Plant", "City", TRUE - "Building", "Mfg. Plant", "City", TRUE - "Building", "Factory", "City", FALSE - } - -; Neither Factory nor Mfg. Plant: Solar Plant saves 0%; add 66% -[effect_recycling_center_3] -type = "Pollu_Prod_Pct" -value = -66 -reqs = - { "type", "name", "range", "present" - "Building", "Recycling Center", "City", TRUE - "Building", "Solar Plant", "City", TRUE - "Building", "Factory", "City", FALSE - "Building", "Mfg. Plant", "City", FALSE - } - -; Raw materials generated from Recycling add +2 base shields to city production. -[effect_recycling_center_4] -type = "Output_Add_Tile" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Recycling Center", "City" - "CityTile", "Center", "Local" - "OutputType", "Shield", "Local" - } - - -[effect_research_lab] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Library", "City" - "Building", "Research Lab", "City" - "OutputType", "Science", "Local" - } - -[effect_research_lab_1] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "University", "City" - "Building", "Research Lab", "City" - "OutputType", "Science", "Local" - } - -[effect_sam_battery] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "SAM Battery", "City", TRUE - "UnitClass", "Air", "Local", TRUE - "UnitType", "Stealth Bomber", "Local", FALSE - } -[effect_sam_battery_1] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "SAM Battery", "City", TRUE - "UnitClass", "AirProtect", "Local", TRUE - "UnitType", "Stealth Fighter", "Local", FALSE - } -[effect_sam_battery_2] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "SAM Battery", "City" - "UnitClass", "AirPillage", "Local" - } -[effect_sam_battery_stealth_bomber] -type = "Defend_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "SAM Battery", "City", TRUE - "UnitType", "Stealth Bomber", "Local", TRUE - } -[effect_sam_battery_stealth_fighter] -type = "Defend_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "SAM Battery", "City", TRUE - "UnitType", "Stealth Fighter", "Local", TRUE - } - -[effect_sdi_defense] -type = "Nuke_Proof" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "SDI Defense", "City", TRUE - "DiplRel", "Foreign", "Local", TRUE - "DiplRel", "Team", "Local", FALSE - } - -[effect_sdi_defense_1] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "SDI Defense", "City" - "UnitClass", "Missile", "Local" - } - -[effect_sewer_system] -type = "Size_Unlimit" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Aqueduct", "City" - "Building", "Sewer System", "City" - } - -[effect_sewer_system_health] -type = "Health_Pct" -value = 30 -reqs = - { "type", "name", "range" - "Building", "Aqueduct", "City" - "Building", "Sewer System", "City" - } - -[effect_solar_plant] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range" - "Building", "Factory", "City" - "Building", "Solar Plant", "City" - "OutputType", "Shield", "Local" - } - -[effect_solar_plant_1] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range" - "Building", "Mfg. Plant", "City" - "Building", "Solar Plant", "City" - "OutputType", "Shield", "Local" - } - -[effect_solar_plant_2] -type = "Pollu_Prod_Pct" -value = -50 -reqs = - { "type", "name", "range" - "Building", "Factory", "City" - "Building", "Solar Plant", "City" - } - -[effect_solar_plant_3] -type = "Pollu_Prod_Pct" -value = -50 -reqs = - { "type", "name", "range" - "Building", "Mfg. Plant", "City" - "Building", "Solar Plant", "City" - } - -[effect_space_component] -type = "SS_Component" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Space Component", "City" - } - -[effect_space_module] -type = "SS_Module" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Space Module", "City" - } - -[effect_space_structural] -type = "SS_Structural" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Space Structural", "City" - } - -;Timeline is already way behind and too slow, REMOVE: -;[effect_plastics_slowdown] -;type = "Slow_Down_Timeline" -;value = 1 -;reqs = -; { "type", "name", "range", "survives" -; "Tech", "Plastics", "World", TRUE -; } - -;[effect_superconductor_slowdown] -;type = "Slow_Down_Timeline" -;value = 1 -;reqs = -; { "type", "name", "range", "survives" -; "Tech", "Superconductors", "World", TRUE -; } -;1 year per turn ensures spaceship travel time calibrated. -;this can be removed after game.info.spacerace bug of not changing -;timeline gets fixed in server. -[effect_spaceflight_slowdown] -type = "Turn_Years" -value = 1 -reqs = - { "type", "name", "range", "survives" - "Tech", "Space Flight", "World", TRUE - } - -[effect_stock_exchange] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Bank", "City" - "Building", "Stock Exchange", "City" - "OutputType", "Gold", "Local" - } - -[effect_stock_exchange_1] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Bank", "City" - "Building", "Stock Exchange", "City" - "OutputType", "Luxury", "Local" - } - -[effect_super_highways] -type = "Output_Per_Tile" -value = 50 -reqs = - { "type", "name", "range" - "Extra", "Road", "Local" - "Building", "Super Highways", "City" - "OutputType", "Trade", "Local" - } - -; Super Highways increase logistical efficiency to -; get more use out of an airport in size 12+ city. -[effect_super_highways_airlift_facilitation] -type = "Airlift" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Super Highways", "City" - "Building", "Airport", "City" - "Building", "Sewer System", "City" - } - -[effect_mine] -type = "Mining_Pct" -value = 100 -reqs = - { "type", "name", "range" - "Extra", "Mine", "Local" - } - -[effect_oil_well] -type = "Mining_Pct" -value = 100 -reqs = - { "type", "name", "range" - "Extra", "Oil Well", "Local" - } - -[effect_irrigation] -type = "Irrigation_Pct" -value = 100 -reqs = - { "type", "name", "range" - "Extra", "Irrigation", "Local" - } -; Desert with river (and no Oasis) gets 1 extra food from irrigation (total 2) -; ("Nile floods" effect) -[effect_irrigation_2] -type = "Irrigation_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "Terrain", "Desert", "Local", TRUE - "Extra", "River", "Local", TRUE - "Extra", "Oasis", "Local", FALSE - "Extra", "Irrigation", "Local", TRUE - } -; ...same for city centers -[effect_irrigation_3] -type = "Irrigation_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "Terrain", "Desert", "Local", TRUE - "Extra", "River", "Local", TRUE - "Extra", "Oasis", "Local", FALSE - "CityTile", "Center", "Local", TRUE -; "Extra", "Irrigation", "Local", FALSE - "TerrainAlter", "CanIrrigate", "Local", TRUE - "Extra", "Mine", "Local", FALSE - "Extra", "Oil Well", "Local", FALSE - } - -[effect_irrigation_center] -type = "Irrigation_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "CityTile", "Center", "Local", TRUE - "Extra", "Irrigation", "Local", FALSE - "TerrainAlter", "CanIrrigate", "Local", TRUE - "Extra", "Mine", "Local", FALSE - "Extra", "Oil Well", "Local", FALSE - } - -[effect_supermarket] -type = "Output_Per_Tile" -value = 100 -reqs = - { "type", "name", "range" - "Extra", "Farmland", "Local" - "Building", "Supermarket", "City" - "OutputType", "Food", "Local" - } - -[effect_supermarket_center] -type = "Output_Per_Tile" -value = 50 -reqs = - { "type", "name", "range", "present" - "CityTile", "Center", "Local", TRUE - "Extra", "Farmland", "Local", FALSE - "TerrainAlter", "CanIrrigate", "Local", TRUE - "Building", "Supermarket", "City", TRUE - "OutputType", "Food", "Local", TRUE - "Extra", "Mine", "Local", FALSE - "Extra", "Oil Well", "Local", FALSE - } - -[effect_temple] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - } - -[effect_temple_1] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Tech", "Mysticism", "Player" - "Building", "Temple", "City" - } - -[effect_university] -type = "Output_Bonus" -value = 150 -reqs = - { "type", "name", "range" - "Building", "Library", "City" - "Building", "University", "City" - "OutputType", "Science", "Local" - } - -[effect_apollo_program] -type = "Enable_Space" -value = 1 -reqs = - { "type", "name", "range", "survives" - "Building", "Apollo Program", "Player", TRUE - } - -[effect_telegraph_border_vision] -type = "Border_Vision" -value = 1 -reqs = - { "type", "name", "range" - "Tech", "Electricity", "Player" - } - - ; Air+Sea+LandAirSea CLASS units REQUIRE PHYSICS so their BONUS is in their stats to AVOID more [effect_] entries. -[effect_physics_vision] -type = "Unit_Vision_Radius_Sq" -value = 4 -reqs = - { "type", "name", "range" - "Tech", "Physics", "Player" - "UnitClass", "Land", "Local" - } -[effect_physics_vision_1] -type = "Unit_Vision_Radius_Sq" -value = 4 -reqs = - { "type", "name", "range" - "Tech", "Physics", "Player" - "UnitClass", "LandNoKill", "Local" - } -[effect_physics_vision_2] -type = "Unit_Vision_Radius_Sq" -value = 4 -reqs = - { "type", "name", "range" - "Tech", "Physics", "Player" - "UnitClass", "Trireme", "Local" - } -[effect_physics_vision_3] -type = "Unit_Vision_Radius_Sq" -value = 4 -reqs = - { "type", "name", "range" - "Tech", "Physics", "Player" - "UnitClass", "RiverShip", "Local" - } - -[effect_satellite_vision] ;Vision benefit from satellite communication to land units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "Land", "Local" - } -[effect_satellite_vision_1] ;Vision benefit from satellite communication to land units (Marines) -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "LandAirSea", "Local" - } -[effect_satellite_vision_2] ;Vision benefit from satellite communication to sea units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "Sea", "Local" - } -[effect_satellite_vision_2a] ;Vision benefit from satellite communication to sea units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "Submarine", "Local" - } -[effect_satellite_vision_3] ;Vision benefit from satellite communication to sea units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "Air", "Local" - } -[effect_satellite_vision_3a] ;Vision benefit from satellite communication to sea units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "AirProtect", "Local" - } -[effect_satellite_vision_4] ;Vision benefit from satellite communication to cities -type = "City_Vision_Radius_Sq" -value = 36 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - } -[effect_radar_vision] -type = "City_Vision_Radius_Sq" -value = 50 ;7 cardinal, 5 diagonal -reqs = - { "type", "name", "range" - "Tech", "Radar", "Player" - "Building", "Radar Tower", "City" - } -;[effect_radar_vision2] -;type = "Unit_Vision_Radius_Sq" -;value = 16 -;reqs = -; { "type", "name", "range", "present" -; "Extra", "Airbase", "tile", TRUE -; "Tech", "Radar", "Player", TRUE -; "MaxUnitsOnTile", "0", "Local", FALSE ;occupied base -; } - -[effect_agoge_move_bonus_1] -type = "Move_Bonus" -value = 3 -reqs = - { "type", "name", "range", "present" - "Building", "Agōgē of Sparta", "Player", TRUE - "UnitFlag", "FootSoldier", "Local", TRUE - } -[effect_agoge_move_bonus_2] -type = "Move_Bonus" -value = 6 ; 3/9 + 6/9 = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Agōgē of Sparta", "City", TRUE - "UnitFlag", "FootSoldier", "Local", TRUE - } -[effect_agoge_phalanx] -type = "Attack_Bonus" -value = 50 -reqs = - { "type", "name", "range", "present" - "Building", "Agōgē of Sparta", "Player", TRUE - "UnitType", "Phalanx", "Local", TRUE - } -[effect_agoge_pikemen] -type = "Attack_Bonus" -value = 50 -reqs = - { "type", "name", "range", "present" - "Building", "Agōgē of Sparta", "Player", TRUE - "UnitType", "Pikemen", "Local", TRUE - } - -[effect_appian_trade_city] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Appian Way", "City" - "Building", "Appian Way", "Player" - "CityTile", "Center", "Local" - "OutputType", "Trade", "Local" - } - -[effect_angkor_wat] -type = "No_Unhappy" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Angkor Wat", "Player" - } - -[effect_asmiths_trading_co] -type = "Upkeep_Free" -value = 1 -reqs = - { "type", "name", "range" - "Building", "A.Smith's Trading Co.", "Player" - } - -[effect_code_of_hammurabi_temple] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Code of Hammurabi", "Player", TRUE - "Building", "Temple", "City", FALSE - } -;other hammurabi effects in gov:despotism section - -[effect_colossus] -type = "Output_Inc_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Colossus", "City" - "OutputType", "Trade", "Local" - } - -[effect_copernicus_observatory] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Copernicus' Observatory", "City" - "OutputType", "Science", "Local" - } - -[effect_cure_for_cancer] -type = "Make_Happy" -value = 2 - reqs = - { "type", "name", "range" - "Building", "Cure For Cancer", "World" - "Tech", "Genetic Engineering", "Player" - } - -; HACK: there's all kinds of nasty hard-coded stuff to this Wonder, so it had to be -; given a different name (Voyage of Darwin) to avoid potential messyness -[effect_darwins_voyage] -type = "Output_Inc_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Voyage of Darwin", "City" - "OutputType", "Trade", "Local" - } - -[effect_eiffel_tower] -type = "Unit_Upkeep_Free_Per_City" -value = 1 - reqs = - { "type", "name", "range" - "Building", "Eiffel Tower", "Player" - "OutputType", "Shield", "Local" - } - -[effect_supreme_court_corruption1] -type = "Output_Waste_Pct" -value = 60 - reqs = - { "type", "name", "range" - "Building", "Supreme Court", "Player" - "OutputType", "Trade", "Local" - } -[effect_supreme_court_corruption2] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player", TRUE - "OutputType", "Shield", "local", TRUE - } -[effect_supreme_court_democracy] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - "Building", "Supreme Court", "Player" - } -[effect_supreme_court_incite_occupied] -type = "Incite_Cost_Pct" -value = 300 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player", TRUE - "MaxUnitsOnTile", "0", "Local", FALSE - } -[effect_supreme_court_incite_empty] -type = "Incite_Cost_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - "Building", "Supreme Court", "Player", TRUE - } -[effect_supreme_court_upkeep] -type = "Unit_Upkeep_Free_Per_City" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Supreme Court", "Player" - "OutputType", "Shield", "Local" - } -; Removes penalties (Despotism/Anarchy) for tiles >3 output -[effect_supreme_court_tile_corruption] -type = "Output_Penalty_Tile" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Supreme Court", "Player" - } -; HOMELAND SECURITY EFFECTS -; ********************************************************** -[effect_homeland_security_spy_resistance] -type = "Spy_Resistant" -value = 25 ;25% reduction of 50% base chance is 12.5% bonus. 50%-12.5%=37.5% success rate - ; No protection= 1/2, HL = 3/8, CH+HL = 1/4, CH+HL+PS = 1/8 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - } -[effect_homeland_security_hostile_diplomat0] -type = "Action_Odds_Pct" -value = -25 ; 25% of 80% base rate = 20% - ; No protection = 4/5, HL = 3/5, CH+HL = 2/5, CH+HL+PS = 1/5 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Steal Tech", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_1] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Steal Tech Escape Expected", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_2] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Targeted Steal Tech", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_3] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_4] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Sabotage City", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_5] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Sabotage City Escape", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_6] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Targeted Sabotage City", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_7] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Targeted Sabotage City Escape", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_8] -type = "Action_Odds_Pct" -value = -25 ;40 minus 25%*80 = 20% -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Steal Maps Escape", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_9] -type = "Action_Odds_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Steal Maps", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_10] -type = "Action_Odds_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Poison City Escape", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_11] -type = "Action_Odds_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Incite City", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_12] -type = "Action_Odds_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Incite City Escape", "Local", TRUE - } - -;============================================================== -; GREAT Wall -;============================================================== -[effect_great_wall_0_original] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", TRUE - "UnitClass", "Land", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "UnitType", "Howitzer", "Local", FALSE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_0_assimilated] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", FALSE - "MinForeignPct", "19", "City", FALSE - "UnitClass", "Land", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "UnitType", "Howitzer", "Local", FALSE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_1_original] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range" - "Building", "Great Wall", "Player" - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", TRUE - "UnitClass", "Helicopter", "Local" - "CityTile", "Center", "Local" - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_1_assimilated] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range" - "Building", "Great Wall", "Player" - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", FALSE - "MinForeignPct", "19", "City", FALSE - "UnitClass", "Helicopter", "Local" - "CityTile", "Center", "Local" - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_2_original] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "UnitType", "Howitzer", "Local", FALSE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_2_assimilated] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", FALSE - "MinForeignPct", "19", "City", FALSE - "UnitClass", "LandNoKill", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "UnitType", "Howitzer", "Local", FALSE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_3_original] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "UnitType", "Howitzer", "Local", FALSE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_3_assimilated] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", FALSE - "MinForeignPct", "19", "City", FALSE - "UnitClass", "LandAirSea", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "UnitType", "Howitzer", "Local", FALSE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_poploss_original] -type = "Unit_No_Lose_Pop" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", TRUE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_poploss_assimilated] -type = "Unit_No_Lose_Pop" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", FALSE - "MinForeignPct", "19", "City", FALSE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_visible_original] -type = "Visible_Walls" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", TRUE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_visible_assimilated] -type = "Visible_Walls" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", FALSE - "MinForeignPct", "19", "City", FALSE - "Tech", "Machine Tools", "World", FALSE - } -;============================================================== - -[effect_hanging_gardens] -type = "Make_Happy" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Hanging Gardens", "Player" - } -[effect_hanging_gardens_1] -type = "Output_Add_Tile" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Hanging Gardens", "City" - "CityTile", "Center", "Local" - "OutputType", "Luxury", "Local" - } - -[effect_hoover_dam] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Hoover Dam", "Player", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Solar Plant", "City", FALSE - } -[effect_hoover_dam_1] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Hoover Dam", "Player", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Solar Plant", "City", FALSE - } -[effect_hoover_dam_2] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Hoover Dam", "Player", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } -[effect_hoover_dam_3] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Hoover Dam", "Player", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_isaac_newtons_college] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "University", "City" - "Building", "Isaac Newton's College", "Player" - "OutputType", "Science", "Local" - } - -[effect_jtids] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "JTIDS", "Player", TRUE - "UnitFlag", "FootSoldier", "Local", TRUE - } -[effect_jtids_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "JTIDS", "Player", TRUE - "UnitType", "Mech. Inf.", "Local", TRUE ; uses rule_name - } -[effect_jtids_2] -type = "Veteran_Combat" -value = 75 ; 87 57::35 26 26 26 -reqs = - { "type", "name", "range", "present" - "Building", "JTIDS", "Player", TRUE - "UnitFlag", "FootSoldier", "Local", TRUE - "UnitType", "Marines", "Local", FALSE - } -[effect_jtids_3] -type = "Veteran_Combat" -value = 60 ; 80 52::32 24 24 24 -reqs = - { "type", "name", "range", "present" - "Building", "JTIDS", "Player", TRUE - "UnitType", "Mech. Inf.", "Local", TRUE ; uses rule_name - } -[effect_jtids_4] -type = "Veteran_Combat" -value = 40 ;84 70::56 42 28 21 -reqs = - { "type", "name", "range", "present" - "Building", "JTIDS", "Player", TRUE - "UnitFlag", "FootSoldier", "Local", TRUE - "UnitType", "Marines", "Local", TRUE - } - -[effect_js_bachs_cathedral] -type = "Force_Content" -value = 2 -reqs = - { "type", "name", "range" - "Building", "J.S. Bach's Cathedral", "Player" - } - -[effect_king_richards_crusade] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "King Richard's Crusade", "City" - "OutputType", "Shield", "Local" - } -[effect_city_build_slots_kr] -type = "City_Build_Slots" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "King Richard's Crusade", "City", TRUE - } - -[effect_leonardos_workshop] -type = "Upgrade_Unit" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Leonardo's Workshop", "Player" - } - -[effect_genghis_khans_equestrian_school] -type = "Move_Bonus" -value = 9 -reqs = - { "type", "name", "range", "present" - "Building", "Genghis Khan's Equestrian School", "Player", TRUE - "UnitFlag", "Horse", "Local", TRUE - } -[effect_genghis_khans_equestrian_school2] -type = "Move_Bonus" -value = 9 -reqs = - { "type", "name", "range", "present" - "Building", "Genghis Khan's Equestrian School", "Player", TRUE - "UnitType", "Explorer", "Local", TRUE - } - -[effect_airplane_range_1] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Tech", "Radio", "Player" - "UnitType", "Airplane", "Local" - } -[effect_airplane_range_2] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Tech", "Advanced Flight", "Player" - "UnitType", "Airplane", "Local" - } -[effect_airplane_range_3] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Tech", "Radar", "Player" - "UnitType", "Airplane", "Local" - } -[effect_airplane_range_4] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Tech", "Rocketry", "Player" - "UnitType", "Airplane", "Local" - } -[effect_airplane_range_5] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitType", "Airplane", "Local" - } -[effect_airplane_range_6] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Tech", "Avionics", "Player" - "UnitType", "Airplane", "Local" - } - -[effect_rail_electricity] -type = "Move_Bonus" -value = 9 -reqs = - { "type", "name", "range" - "Tech", "Electricity", "Player" - "UnitClass", "LandRail", "Local" - } -[effect_rail_combustion] -type = "Move_Bonus" -value = 9 -reqs = - { "type", "name", "range" - "Tech", "Combustion", "Player" - "UnitClass", "LandRail", "Local" - } - -[effect_lighthouse] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Sea", "Local" - } -[effect_lighthouse_a] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Submarine", "Local" - } -[effect_lighthouse_1] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Trireme", "Local" - } -[effect_lighthouse_2] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "RiverShip", "Local" - } -[effect_lighthouse_3] -type = "Unit_Vision_Radius_Sq" -value = 6 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Sea", "Local" - } -[effect_lighthouse_3a] -type = "Unit_Vision_Radius_Sq" -value = 6 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Submarine", "Local" - } -[effect_lighthouse_4] -type = "Unit_Vision_Radius_Sq" -svalue = 6 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Trireme", "Local" - } -[effect_lighthouse_5] -type = "Unit_Vision_Radius_Sq" -svalue = 6 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "RiverShip", "Local" - } - -[effect_magellans_expedition] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Magellan's Expedition", "Player", TRUE - "UnitClass", "Sea", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_magellans_expedition_a] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Magellan's Expedition", "Player", TRUE - "UnitClass", "RiverShip", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_magellans_expedition_b] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Magellan's Expedition", "Player", TRUE - "UnitClass", "Submarine", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } - -[effect_manhattan_project] -type = "Enable_Nuke" -value = 1 -reqs = - { "type", "name", "range", "survives" - "Building", "Manhattan Project", "World", TRUE - } - -[effect_marco_polos_embassy] -type = "Output_Bonus" -value = 40 -reqs = - { "type", "name", "range" - "Building", "Marco Polo's Embassy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_michelangelos_chapel] -type = "Make_Content" -value = 3 -reqs = - { "type", "name", "range" - "Building", "Michelangelo's Chapel", "Player" - } -[effect_michelangelos_chapel_1] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Tech", "Theology", "Player" - "Building", "Michelangelo's Chapel", "Player" - } -[effect_michelangelos_chapel_2] -type = "Make_Content" -value = -1 -reqs = - { "type", "name", "range" - "Building", "Michelangelo's Chapel", "Player" - "Gov", "Communism", "Player" - } - -[effect_mausoleum_of_mausolos_1] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "Building", "Great Wall", "Player", FALSE - "Building", "Mausoleum of Mausolos", "Player", TRUE - } - -;Great Wall counts as City Walls in every city. -[effect_mausoleum_of_mausolos_1a] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Great Wall", "Player" - "Building", "Mausoleum of Mausolos", "Player" - } -[effect_mausoleum_of_mausolos_2] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Building", "Mausoleum of Mausolos", "Player", TRUE - } -;Mausoleum respects that Supreme Court counts as extra Courthouse in every city. -[effect_mausoleum_of_mausolos_2a] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Supreme Court", "Player" - "Building", "Mausoleum of Mausolos", "Player" - } -[effect_mausoleum_of_mausolos_culture] -type = "History" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Mausoleum of Mausolos", "City" - } - -[effect_statue_of_zeus_content_republic] -type = "Make_Content_Mil" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Statue of Zeus", "Player", TRUE - "Gov", "Republic", "Player", TRUE - "Tech", "Tactics", "Player", FALSE - } -[effect_statue_of_zeus_content_democracy] -type = "Make_Content_Mil" -value = 2 -reqs = - { "type", "name", "range", "present" - "Building", "Statue of Zeus", "Player", TRUE - "Gov", "Democracy", "Player", TRUE - "Tech", "Tactics", "Player", FALSE - } -[effect_statue_of_zeus_1] -type = "Unit_Upkeep_Free_Per_City" -value = 4 -reqs = - { "type", "name", "range", "present" - "Building", "Statue of Zeus", "City", TRUE - "Tech", "Tactics", "Player", FALSE - "OutputType", "Shield", "Local", TRUE - } -[effect_statue_of_zeus_2] -type = "Make_Happy" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Statue of Zeus", "City" - } - -[effect_temple_of_artemis] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Luxury", "Local" - } -;Note: the city applies +1 to 0-shield city tiles on grass,swamp,hills,tundra -;Thus this bonus negates the condition of getting that +1 and needs a -;compensating +1 further below -[effect_temple_of_artemis_1] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Shield", "Local" - } -;-------- -;Give the city its extra shield if it was built on a 0-shield (grass/hills/swamp/tundra) -;tile or +1-shield resource (grass-shield,fur) -[effect_temple_of_artemis_1a] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Terrain", "Grassland", "Local" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Shield", "Local" - } -[effect_temple_of_artemis_1b] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range", "present" - "Terrain", "Hills", "Local", TRUE - "Extra", "Coal", "Local", FALSE ; only apply to 0 shield tile - "Extra", "Mine", "Local", FALSE ; only apply to 0 shield tile - "Building", "Temple", "City", TRUE - "Building", "Temple of Artemis", "Player", TRUE - "CityTile", "Center", "Local", TRUE - "OutputType", "Shield", "Local", TRUE - } -[effect_temple_of_artemis_1d] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range", "present" - "Terrain", "Swamp", "Local", TRUE - "Extra", "Peat", "Local", FALSE ; only apply to 0 shield tile - "Building", "Temple", "City", TRUE - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local", TRUE - "OutputType", "Shield", "Local", TRUE - } -[effect_temple_of_artemis_1e] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range", "present" - "Terrain", "Tundra", "Local", TRUE - "Extra", "Game", "Local", FALSE ; only apply to 0 shield tile - "Building", "Temple", "City", TRUE - "Building", "Temple of Artemis", "Player", TRUE - "CityTile", "Center", "Local", TRUE - "OutputType", "Shield", "Local", TRUE - } -;------ - -[effect_temple_of_artemis_2] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Gold", "Local" - } - -[effect_temple_of_artemis_3] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Science", "Local" - } - - -[effect_teslas_laboratory] -type = "Upgrade_Unit" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Tesla's Laboratory", "Player" - } -[effect_tesla_laboratory2] -type = "Upgrade_Price_Pct" -value = -20 -reqs = - { "type", "name", "range" - "Building", "Tesla's Laboratory", "Player" - } - -[effect_oracle] -type = "Make_Content" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - "Building", "Oracle", "Player" - } - -[effect_pyramids] -type = "Growth_Food" -value = 25 -reqs = - { "type", "name", "range" - "Building", "Pyramids", "Player" - } - -[effect_pyramids_1] -type = "Rapture_Grow" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Pyramids", "City" - } - -[effect_internet] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Research Lab", "City" - "Building", "The Internet", "Player" - "OutputType", "Science", "Local" - } - -[effect_shakespeares_theatre] -type = "No_Unhappy" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Shakespeare's Theatre", "City" - } - -[effect_sphinx_tile] -type = "Output_Penalty_Tile" -value = 100 -reqs = - { "type", "name", "range" - "Building", "The Sphinx", "City" - } -[effect_sphinx_luxury] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "The Sphinx", "City" - "CityTile", "Center", "Local" - "OutputType", "Luxury", "Local" - } -[effect_sphinx_corruption] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range" - "Building", "The Sphinx", "City" - "OutputType", "Trade", "Local" - } - -[effect_statue_of_liberty] -type = "Any_Government" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Statue of Liberty", "Player" - } - -[effect_statue_of_liberty_1] -type = "No_Anarchy" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Statue of Liberty", "Player" - } - -[effect_sun_tzus_war_academy] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Sun Tzu's War Academy", "Player", TRUE - "UnitClass", "Land", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_sun_tzus_war_academy_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Sun Tzu's War Academy", "Player", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - } -[effect_sun_tzus_war_academy_2] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Sun Tzu's War Academy", "Player", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - } - -[effect_united_nations] -type = "Has_Senate" -value = 1 -reqs = - { "type", "name", "range" - "Building", "United Nations", "World" - } - -[effect_united_nations_1] -type = "Revolution_Unhappiness" -value = 2 -reqs = - { "type", "name", "range", "present" - "Building", "United Nations", "World", TRUE -; Without !present UN would make revolution less likely instead -; of enabling it with Democracy (value 2 -> 4 instead of 0 -> 2) - "Gov", "Democracy", "Player", FALSE - } - -[effect_womens_suffrage] -type = "Make_Content_Mil" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - "Building", "Women's Suffrage", "Player" - } - -[effect_womens_suffrage_1] -type = "Make_Content_Mil" -value = 4 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - "Building", "Women's Suffrage", "Player" - } - -[effect_fanatics_fundamentalism] -type = "Fanatics" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_corruption_fundamentalism0] -type = "Output_Waste" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_fundamentalism1] -type = "Output_Waste_By_Distance" -value = 200 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Trade", "Local" - } - -;Shield waste is not a proper feature of mp rulesets -;[effect_waste_fundamentalism0] -;type = "Output_Waste" -;value = 2 -;reqs = -; { "type", "name", "range" -; "Gov", "Fundamentalism", "Player" -; "OutputType", "Shield", "Local" -; } - -;[effect_waste_fundamentalism1] -;type = "Output_Waste_By_Distance" -;value = 100 -;reqs = -; { "type", "name", "range" -; "Gov", "Fundamentalism", "Player" -; "OutputType", "Shield", "Local" -; } - -[effect_fundamentalism_unit_upkeep] -type = "Upkeep_Factor" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Food", "Local" - } - -[effect_upkeep_free_units_fundamentalism] -type = "Unit_Upkeep_Free_Per_City" -value = 10 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Shield", "Local" - } - -[effect_bad_sci_fundamentalism] -type = "Output_Bonus_2" -value = -50 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "science", "local" - } - -[effect_tithes_fundamentalism] -type = "Happiness_To_Gold" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_sabotage_bonus_fundamentalism1] -type = "Action_Odds_Pct" -value = 13 ;// 13%*80% = 10.4% -reqs = - { "type", "name", "range", "present" - "Gov", "Fundamentalism", "Player", TRUE - "Action", "Sabotage City", "Local", TRUE - } -[effect_sabotage_bonus_fundamentalism2] -type = "Action_Odds_Pct" -value = 13 ;// 13%*80% = 10.4% -reqs = - { "type", "name", "range", "present" - "Gov", "Fundamentalism", "Player", TRUE - "Action", "Sabotage City Escape", "Local", TRUE - } -[effect_sabotage_bonus_fundamentalism3] -type = "Action_Odds_Pct" -value = 13 ;// 13%*80% = 10.4% (int rounds to 10%) -reqs = - { "type", "name", "range", "present" - "Gov", "Fundamentalism", "Player", TRUE - "Action", "Targeted Sabotage City", "Local", TRUE - } -[effect_sabotage_bonus_fundamentalism4] -type = "Action_Odds_Pct" -value = 13 ;// 13%*80% = 10.4% (int rounds to 10%) -reqs = - { "type", "name", "range", "present" - "Gov", "Fundamentalism", "Player", TRUE - "Action", "Targeted Sabotage City Escape", "Local", TRUE - } - -[effect_max_rates_fundamentalism] -type = "Max_Rates" -value = 80 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_enviromentalism] -type = "Pollu_Prod_Pct" -value = -50 -reqs = - { "type", "name", "range" - "Tech", "Environmentalism", "Player" - } - -[effect_calendar_base] -type = "Turn_Years" -value = 100 - -; 100 - 50 = 50 -[effect_calendar_1] -type = "Turn_Years" -value = -50 -reqs = - { "type", "name", "range" - "MinYear", "0", "World" - } - -; 50 - 25 = 25 -[effect_calendar_2] -type = "Turn_Years" -value = -25 -reqs = - { "type", "name", "range" - "MinYear", "1000", "World" - } - -; 25 - 15 = 10 -[effect_calendar_3] -type = "Turn_Years" -value = -15 -reqs = - { "type", "name", "range" - "MinYear", "1800", "World" - } - -; 10 - 5 = 5 -[effect_calendar_4] -type = "Turn_Years" -value = -5 -reqs = - { "type", "name", "range" - "MinYear", "1900", "World" - } - -; 5 - 3 = 2 -[effect_calendar_5] -type = "Turn_Years" -value = -3 -reqs = - { "type", "name", "range" - "MinYear", "1950", "World" - } - -; 2 - 1 = 1 -[effect_calendar_6] -type = "Turn_Years" -value = -1 -reqs = - { "type", "name", "range" - "MinYear", "2012", "World" - } - -[effect_tech_cost_base] -type = "Tech_Cost_Factor" -value = 1 - -; Cities can always work tiles -[effect_tile_workable] -type = "Tile_Workable" -value = 1 -reqs = - { "type", "name", "range", "present" - "Terrain", "Inaccessible", "Local", FALSE - } - -; Each city has at least one slot to build units -[effect_city_build_slots_basic] -type = "City_Build_Slots" -value = 1 - -; Capital has two slots -[effect_city_build_slots_capital] -type = "City_Build_Slots" -value = 1 -reqs = - { "type", "name", "range", "present" - "Tech", "Conscription", "Player", TRUE - "Building", "Palace", "City", TRUE - } -[effect_city_build_slots_capital2] -type = "City_Build_Slots" -value = 1 -reqs = - { "type", "name", "range", "present" - "Tech", "Conscription", "Player", TRUE - "Building", "Ecclesiastical Palace", "City", TRUE - } -[effect_city_build_slots_factory] -type = "City_Build_Slots" -value = 1 -reqs = - { "type", "name", "range", "present" - "Tech", "Conscription", "Player", TRUE - "Building", "Factory", "City", TRUE - } -[effect_city_build_slots_mfg_plant] -type = "City_Build_Slots" -value = 1 -reqs = - { "type", "name", "range", "present" - "Tech", "Conscription", "Player", TRUE - "Building", "Mfg. Plant", "City", TRUE - } - -[effect_city_image_1] -type = "City_Image" -value = 1 -reqs = - { "type", "name", "range" - "MinSize", "4", "City" - } - -[effect_city_image_2] -type = "City_Image" -value = 1 -reqs = - { "type", "name", "range" - "MinSize", "8", "City" - } - -[effect_city_image_3] -type = "City_Image" -value = 1 -reqs = - { "type", "name", "range" - "MinSize", "12", "City" - } - -[effect_city_image_4] -type = "City_Image" -value = 1 -reqs = - { "type", "name", "range" - "MinSize", "16", "City" - } - -[effect_pollution] -type = "Output_Tile_Punish_Pct" -value = 50 -reqs = - { "type", "name", "range", "present" - "Extra", "Pollution", "Local", TRUE - "Extra", "Fallout", "Local", FALSE - } - -[effect_fallout] -type = "Output_Tile_Punish_Pct" -value = 50 -reqs = - { "type", "name", "range", "present" - "Extra", "Fallout", "Local", TRUE - "Extra", "Pollution", "Local", FALSE - } - -; This would bring back bridges in cities without Bridge Building, -; but not get the trade bonus until BB discovered. Not needed now -; since Quay was added. -; collect trade from them until Bridge Building. -;[effect_bridge_without_bridge_building] -;type = "Output_Add_Tile" -;value = -1 -;reqs = -; { "type", "name", "range", "present" -; "Tech", "Bridge Building", "Player", FALSE -; "CityTile", "Center", "Local", TRUE -; "Extra", "River", "Local", TRUE -; "OutputType","Trade", "Local", TRUE -; -; ;Don't subtract a non-existent bonus. -; "Terrain", "Arctic", "Local", FALSE -; "Terrain", "Forest", "Local", FALSE -; "Terrain", "Hills", "Local", FALSE -; "Terrain", "Jungle", "Local", FALSE -; "Terrain", "Mountains", "Local", FALSE -; "Terrain", "Swamp", "Local", FALSE -; } - -[effect_pollution_fallout] -type = "Output_Tile_Punish_Pct" -value = 75 -reqs = - { "type", "name", "range" - "Extra", "Fallout", "Local" - "Extra", "Pollution", "Local" - } - -; **** Action Odds for Hostile Diplomatic Actions ******* -;******************************************************** -[effect_reduced_chance_steal_maps_escape] -type = "Action_Odds_Pct" -value = -32 ;80 minus 31%*80 = 55% -reqs = - { "type", "name", "range", "present" - "Action", "Steal Maps Escape", "Local", TRUE - } -[effect_reduced_chance_steal_maps] -type = "Action_Odds_Pct" -value = -13 ;80 minus 13%*80 = 70% -reqs = - { "type", "name", "range", "present" - "Action", "Steal Maps", "Local", TRUE - } -[effect_reduced_targeted_sabotage_city] -type = "Action_Odds_Pct" -value = -32 ;80 minus 31%*80 = 55% -reqs = - { "type", "name", "range", "present" - "Action", "Targeted Sabotage City Escape", "Local", TRUE - } -[effect_reduced_poison_city_escape] -type = "Action_Odds_Pct" -value = -13 ;80 minus 13%*80 = 70% -reqs = - { "type", "name", "range", "present" - "Action", "Poison City Escape", "Local", TRUE - } -;********************************************************* - -; FIXED flag from "Cities" to "NonMil" to have proper effect. -[effect_unit_bribe_cost_settlers] -type = "Unit_Bribe_Cost_Pct" -value = -50 -reqs = - { "type", "name", "range" - "UnitFlag", "NonMil", "Local" - } - -;LOSING MOVES FROM ILLEGAL ACTION NEVER MADE SENSE. JUST FORBID IT AND LET THEM PICK A LEGAL ACTION. -;[effect_illegal_action_move_cost_base] -;type = "Illegal_Action_Move_Cost" -;value = 0 -;reqs = -; { "type", "name", "range", "present" -; "Action", "Found City", "Local", FALSE -; "Action", "Join City", "Local", FALSE -; } - -;CASUS BELLI INCIDENTS -;******************************************************** -[effect_incident_success_pillage] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Pillage", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_caught_steal_maps1] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Maps Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_steal_maps1] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Maps Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_steal_maps2] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Maps", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_steal_maps2] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Maps", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_steal_tech] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Tech", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_steal_tech] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Tech", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_steal_tech_esc] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Tech Escape Expected", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_steal_tech_esc] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Tech Escape Expected", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_tgt_steal_tech] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_tgt_steal_tech] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_bribe_unit] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Bribe Unit", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_capture_unit] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Capture Units", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_sabotage_unit] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Sabotage Unit Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_sabotage_unit] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Sabotage Unit Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_incite] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Incite City", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_incite] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Incite City", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_incite_esc] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Incite City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_incite_esc] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Incite City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_poison] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Poison City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_poison] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Poison City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_sabotage_city] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Sabotage City", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_sabotage_city] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Sabotage City", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_sabotage_city_esc] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Sabotage City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_sabotage_city_esc] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Sabotage City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_tgt_sabotage_city] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Targeted Sabotage City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_tgt_sabotage_city] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Targeted Sabotage City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_explode_nuke] -type = "Casus_Belli_Success" -value = 1000 -reqs = - { "type", "name", "range", "present" - "Action", "Explode Nuclear", "Local", TRUE - } -;******************************************************************** - -; Double (+100%) buy cost for Great Wonders -[effect_great_wonder_buy_cost] -type = "Building_Buy_Cost_Pct" -value = 100 -reqs = - { "type", "name", "range" - "BuildingGenus", "GreatWonder", "Local" - } - -; Double buy cost for Small Wonders except Palaces -[effect_small_wonder_buy_cost] -type = "Building_Buy_Cost_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "BuildingGenus", "SmallWonder", "Local", TRUE - "Building", "Palace", "Local", FALSE - "Building", "Ecclesiastical Palace", "Local", FALSE - } - -; The Well-Digger can move 3 before you know Pottery or Alphabet. -[effect_welldigger_movement] -type = "Move_Bonus" -value = -27 -reqs = - { - "type", "name", "range", "present" - "UnitFlag", "Well-Digger", "Local", TRUE - "Tech", "Alphabet", "Player", TRUE - } -[effect_welldigger_movement_1] -type = "Move_Bonus" -value = -27 -reqs = - { - "type", "name", "range", "present" - "UnitFlag", "Well-Digger", "Local", TRUE - "Tech", "Pottery", "Player", TRUE - } - -;Can't give orders to Proletarians unless communist. -[effect_proletarian_movement] -type = "Move_Bonus" -value = -18 -reqs = - { - "type", "name", "range", "present" - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player", FALSE - } - -;5 shield discount Riflemen -[effect_communist_riflemen] -type = "Unit_Build_Cost_Pct" -value = -12 -reqs = - { - "type", "name", "range", "present" - "UnitType", "Riflemen", "Local", TRUE - "Gov", "Communism", "Player", TRUE - } - -;10 shield discount "Sturmovik Effect". -[effect_communist_dive_bombers] -type = "Unit_Build_Cost_Pct" -value = -16 -reqs = - { - "type", "name", "range", "present" - "UnitType", "Dive Bomber", "Local", TRUE - "Gov", "Communism", "Player", TRUE - } - -;Labor Union changes upkeep of foot units and mech.inf to gold -[effect_labor_union_upkeep] -type = "Shield2Gold_Factor" -value = 100 -reqs = - { - "type", "name", "range", "present" - "Tech", "Labor Union", "Player", TRUE - } diff --git a/freeciv/freeciv/data/.historic/ag2/game.ruleset b/freeciv/freeciv/data/.historic/ag2/game.ruleset deleted file mode 100644 index f3d67cbf0..000000000 --- a/freeciv/freeciv/data/.historic/ag2/game.ruleset +++ /dev/null @@ -1,2114 +0,0 @@ -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes, -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -; Note that the freeciv AI may not cope well with anything more -; than minor changes. - -[datafile] -description="Avant-garde game rules for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -; This section contains meta information for freeciv-ruledit to recreate the ruleset -; file in a form wanted. These have no in-game effect whatsoever -[ruledit] - -; Which file to read description in from. -description_file = "ag2/README.ag2" - -[about] -; Ruleset name -; DO NOT CHANGE, FCW unfortunately has to hard-code certain special cases for this. -name = _("Avant-garde 2") - -; There`s no separate versioning in rulesets part of main freeciv distribution -;version = "" - -; Summary of the ruleset -; /* TRANS: In the client, this is displayed alongside the contents of -; README.ag2, which are not localized. */ -summary = _("") - -; Detailed description -; When updating this, update also desciption_file in [ruledit] section to match -description = *ag2/README.ag2* - -; What capabilities ruleset provides for the scenarios. -; mimimum-default-sets - Default units, terrains, buildings, etc -capabilities = "minimum-default-sets" - -[options] -global_init_techs="" -global_init_buildings="Palace" - -[civstyle] -; Value added to city pollution -base_pollution = -20 - -; Cost in luxuries of making one citizen happier -happy_cost = 2 - -; Cost in food of upkeeping a single citizen -food_cost = 2 - -; Parameters used to generalize the calculation of city granary size: -; if city_size <= num_inis: -; city_granary_size = (granary_food_ini[city_size] * foodbox / 100) -; if city_size > num_inis; -; city_granary_size = (granary_food_ini[num_inis] + -; granary_food_inc * (city_size - num_inis)) * foodbox / 100 -granary_food_ini = 20, 30, 40, 50, 60, 70 -granary_food_inc = 0 - -; City center minimum outputs -min_city_center_food = 1 -min_city_center_shield = 1 -min_city_center_trade = 0 - -; Square of initial city radius -init_city_radius_sq = 5 - -; Square of initially visible radius (true distance). -init_vis_radius_sq = 5 - -; A base bribe cost, modified heavily by other factors -base_bribe_cost = 750 - -; Barbarian leader ransom in gold -ransom_gold = 100 - -; Number of veteran levels lost when upgrading a unit -upgrade_veteran_loss = 0 - -; Number of veteran levels lost when auto-upgrading a unit -autoupgrade_veteran_loss = 0 - -; Whether player gets to select which terrain improvement to pillage. -pillage_select = TRUE - -; Whether one can steal a tech for which prereqs are not known -tech_steal_allow_holes = FALSE -; Whether one can get a tech for which prereqs are not known via -; diplomatic trading -tech_trade_allow_holes = FALSE -; ...and whether one can lose a tech which is prereq for another known -; tech via trade, if techlost_donor is nonzero -tech_trade_loss_allow_holes = FALSE -; Whether one can get a tech for which prereqs are not known via -; parasite effect (classic ruleset's Great Library) -tech_parasite_allow_holes = FALSE -; Whether one can lose a tech which is prereq for another known tech -; due to negative bulbs, if techlossforgiveness allows loss -tech_loss_allow_holes = FALSE - -; Whether civil war is possible at all -civil_war_enabled = TRUE - -; Comma separated list of things to happen, in addition to death -; of owner, when gameloss unit dies -; "CivilWar" - Part of the empire remains, controlled by a new player -; "Barbarians" - Depending on if there`s also "CivilWar", all or part -; or half of the dead players empire gets under barbarian -; control. -; "Loot" - Player who killed the gameloss unit gets loot: -; Partial map, gold, techs, cities -gameloss_style = "" - -; Whether units may safely paradrop to transport on non-native terrain -paradrop_to_transport = FALSE - -; Method of paying unit and improvement gold upkeep -; "City" - The player`s total gold must be non-negative after paying upkeep -; costs associated with each city. If for any city the player`s -; gold is negative, random buildings in the city are sold off. If -; the gold is still negative, then supported units with gold upkeep -; are disbanded. -; "Mixed" - In the first step, the player`s total gold must be non-negative -; after paying upkeep for all buildings within a city. If for any -; city the player`s gold is negative, random buildings in the city -; are sold off. -; In the second step, gold upkeep for all units is paid in a lump -; sum. If the player does not have enough gold, random units with -; gold upkeep are disbanded. -; "Nation" - Gold upkeep for all buildings and units is paid in a lump sum -; after all cities have been processed. If the player does not -; have enough gold, random buildings from random cities are sold. -; If still more gold is needed, then random units with gold -; upkeep are disbanded. -gold_upkeep_style = "City" - -[illness] -; Whether plagues (illness) are possible -; There are some latent building effects in effects.ruleset which affect -; health, if you enable plague here. -illness_on = FALSE - -; the base factor for illness (of percent) -illness_base_factor = 25 - -; minimum city size for illness -illness_min_size = 3 - -; factor for how much trading with a plagued city increases our city`s -; chance for plague (in percent) -illness_trade_infection = 0 - -; factor for how much pollution within a city increases its chance for -; plague (in percent) -illness_pollution_factor = 50 - -[incite_cost] -; city_incite_cost = { [TF * SZ * NF * (BIC+owner_gold) * (2*CON) * (2*CEL) * (BONUS)] + (UF*UC) + (IF*IC) } / (3*DIST) -; See city_incite_cost() for more details -total_factor = 100 ; TF = 100 (effectively makes 100x cost at capital and 1x cost at DIST=32) -;city_size_adjusted ; SZ (happy*2 + content*1 + unhappy*0 - angry*2) -;nationality factor ; NF native=1.0, was_conquered=0.67, originally_belonged_to_inciter=0.5 -base_incite_cost = 1500 ; BIC =1100 (base cost before modifiers) -; content bonus. -;city is content ; CON -;city is celebrating ; CEL -;incite defence bonuses ; BONUS -50% empty + 300% occupied+courthouse OR + 100% empty+courthouse + supreme_court applies courthouse bonuses again -; ; +∞ = democracy/mausoleum/palace/ecclesiastical palace -;total unit shield cost ; UC -;total improvements cost ; IC -;distance to capital ; DIST (max distance penalty=32 tiles) -improvement_factor = 20 ; IF = 20 these need inflation because subject to huge divisors -unit_factor = 50 ; UF = 50 - -[global_unit_options] -; Shore landing style -; FALSE - normal movement -; TRUE - (default) slow invasions by removing all -; movement points from ground units moving -; from ocean tile to land -slow_invasions = TRUE - -[combat_rules] -; If tired_attack is set to TRUE, units that attack with less than a single -; move point (per move_fragments in terrain.ruleset) will have their attack -; power reduced accordingly. For instance, if move_fragments=3, a unit with -; 2/3 move points will have attack power 2/3 of normal. -; If this is set to FALSE units will attack with full strength even if they -; have only fractional moves left. -tired_attack = TRUE - -[auto_attack] -; An auto attack may be triggered when another unit moves to an adjacent -; tile and the autoattack server setting is enabled. The following details -; are ruleset controlled. -; will_never - units with this unit type flag will never auto attack. - -; Non-fighters don't auto-attack. -will_never = "WillNever" - -[actions] -; If force_trade_route is set to TRUE it is illegal for an actor unit to -; enter the marketplace of a city if it can establish a trade route to it -; instead. -force_trade_route = FALSE - -; If force_capture_units is set to TRUE it is illegal for an actor unit to -; bombard, explode nuclear or perform a regular attack against a tile if -; it can capture units on it in stead. -force_capture_units = FALSE - -; If force_bombard is set to TRUE it is illegal for an actor unit to -; explode nuclear or perform a regular attack against a tile if it can -; bombard it in stead. -force_bombard = FALSE - -; If force_explode_nuclear is set to TRUE it is illegal for an actor unit -; to perform a regular attack against a tile if it can do explode nuclear -; in stead. -force_explode_nuclear = TRUE - -; If poison_empties_food_stock is set to TRUE a successful "Poison City" -; or "Poison City Escape" will empty the food stock. -poison_empties_food_stock = FALSE - -; The maximum distance from the actor unit to the target of the "Bombard" -; action. The value 1 means that the targets must be on a tile adjacent to -; the actor unit. The special value "unlimited" lifts the maximum distance -; restriction. The maximum distance can`t be smaller than the minimum -; distance. -bombard_max_range = 1 - -; What each action should be called when showing them to the player. -; The first %s should be before the mnemonic of the action. A Freeciv client -; that supports mnemonics will replace it with the in-band signal that marks -; the following character as a mnemonic in its graphical toolkit. -; The second %s marks where extra details should be inserted. - -; /* TRANS: _Deploy (3% chance of success). */ -ui_name_convert_unit = _("%sConvert Unit%s") - -; /* TRANS: _Poison City (3% chance of success). */ -ui_name_poison_city_escape = _("%sPoison City%s") - -; /* TRANS: _Sabotage Enemy Unit (3% chance of success). */ -ui_name_sabotage_unit_escape = _("%sSabotage Enemy Unit%s") - -; /* TRANS: _Bribe Enemy Unit (3% chance of success). */ -ui_name_bribe_unit = _("%sBribe Enemy Unit%s") - -; /* TRANS: _Sabotage City (3% chance of success). */ -ui_name_sabotage_city = _("%sSabotage City%s") - -; /* TRANS: _Sabotage City Escape (3% chance of success). */ -ui_name_sabotage_city_escape = _("%sSabotage City Escape%s") - -; /* TRANS: Industrial _Sabotage (3% chance of success). */ -ui_name_targeted_sabotage_city_escape = _("Targeted %sSabotage%s") - -; /* TRANS: Incite a _Revolt (3% chance of success). */ -ui_name_incite_city = _("Incite a %sRevolt%s") - -; /* TRANS: Incite a _Revolt and Escape (3% chance of success). */ -ui_name_incite_city_escape = _("Incite a Re%svolt and Escape%s") - -; /* TRANS: Establish Trade _Route (100% chance of success). */ -ui_name_establish_trade_route = _("Establish Trade %sRoute%s") - -; /* TRANS: Enter _Marketplace (100% chance of success). */ -ui_name_enter_marketplace = _("Enter %sMarketplace%s") - -; /* TRANS: Establish _Embassy (100% chance of success). */ -ui_name_establish_embassy = _("Establish %sEmbassy%s") - -; /* TRANS: Becom_e Ambassador (100% chance of success). */ -ui_name_establish_embassy_stay = _("Becom%se Ambassador%s") - -; /* TRANS: Steal _Technology (3% chance of success). */ -ui_name_steal_tech = _("Steal %sTechnology%s") - -; /* TRANS: Steal _Technology and Escape (3% chance of success). */ -ui_name_steal_tech_escape = _("Steal %sTechnology and Escape%s") - -; /* TRANS: Indus_trial Espionage (3% chance of success). */ -ui_name_targeted_steal_tech_escape = _("Tar%sgeted Tech Theft%s") - -; /* TRANS: Steal _Map Fragments and Escape (3% chance of success). */ -ui_name_steal_maps_escape = _("Steal %sMap Fragments and Escape%s") - -; /* TRANS: Steal _Map Fragments (3% chance of success). */ -ui_name_steal_maps = _("Steal %sMap Fragments%s") - -; /* TRANS: _Investigate City (100% chance of success). */ -ui_name_investigate_city = _("%sInvestigate City%s") - -; /* TRANS: _Investigate City (spends the unit) (100% chance of success). */ -ui_name_investigate_city_spend_unit = _("%sInvestigate City (spends the unit)%s") - -; /* TRANS: Help _build Wonder (100% chance of success). */ -ui_name_help_wonder = _("Help %sbuild Wonder%s") - -; /* TRANS: Rec_ycle Unit (100% chance of success). */ -ui_name_recycle_unit = _("Rec%sycle Unit%s") - -; /* TRANS: _You're Fired (100% chance of success). */ -ui_name_disband_unit = _("%sYou're Fired%s") - -; /* TRANS: _Capture Units (100% chance of success). */ -ui_name_capture_units = _("%sCapture Units%s") - -; /* TRANS: _Build City (100% chance of success). */ -ui_name_found_city = _("%sBuild City%s") - -; /* TRANS: _Add to City (100% chance of success). */ -ui_name_join_city = _("%sAdd to City%s") - -; /* TRANS: Explode _Nuclear (100% chance of success). */ -ui_name_explode_nuclear = _("Explode %sNuclear%s") - -; /* TRANS: Destroy _City (100% chance of success). */ -;ui_name_destroy_city = _("Destroy %sCity%s") ;ready to be enabled if we think of how - -; /* TRANS: Set _Home City (100% chance of success). */ -ui_name_home_city = _("Set %sHome City%s") - -; /* TRANS: _Upgrade Unit (100% chance of success). */ -ui_name_upgrade_unit = _("%sUpgrade Unit%s") - -; /* TRANS: Drop _Paratrooper (100% chance of success). */ -ui_name_paradrop_unit = _("Drop %sParatrooper%s") - -; /* TRANS: _Airlift to City (100% chance of success). */ -ui_name_airlift_unit = _("%sAirlift to City%s") - -; /* TRANS: _Attack (100% chance of success). */ -ui_name_attack = _("%sAttack%s") - -; /* TRANS: _Bombard (100% chance of success). */ -ui_name_bombard = _("Range%sd Attack%s") - -/* TRANS: _Explode Missile (100% chance of success). */ -ui_name_suicide_attack = _("%sExplode Missile%s") - -; /* TRANS: _Conquer City (100% chance of success). */ -ui_name_conquer_city = _("%sConquer City%s") - -; /* TRANS: _Transform Terrain (3% chance of success). */ - ui_name_transform_terrain = _("%sTransform Terrain%s") - -; /* TRANS: Transform by _Irrigate (3% chance of success). */ - ui_name_irrigate_tf = _("Transform by %sIrrigate%s") - -; /* TRANS: Transform by _Mine (3% chance of success). */ - ui_name_mine_tf = _("Transform by %sMine%s") - -; /* TRANS: Pilla_ge (100% chance of success). */ - ui_name_pillage = _("Pilla%sge%s") - -; /* TRANS: _Fortify (100% chance of success). */ - ui_name_fortify = _("%sFortify%s") - -; /* TRANS: Build _Road (100% chance of success). */ - ui_name_road = _("Build %sRoad%s") - -; /* TRANS: Build _Canal (100% chance of success). */ - ui_name_canal = _("Build %Canal%s") - ui_name_waterway = _("Build Water%way%s") - -; /* TRANS: _Build Base (100% chance of success). */ - ui_name_build_base = _("%sBuild Base%s") - -; /* TRANS: Build _Mine (100% chance of success). */ - ui_name_build_mine = _("Build %sMine%s") - -; /* TRANS: Build _Irrigation (100% chance of success). */ - ui_name_irrigate = _("Build %sIrrigation%s") - -; NOT IMPLEMENTED IN SERVER YET - ; /* TRANS: _Unload (100% chance of success). */ -;ui_name_transport_unload = _("%sUnload%s") - -; Suppress automatic help text generation about what enables and/or -; disables the following actions. -; -; Can make the help text less redundant when you document it your self. -;quiet_actions = "Targeted Sabotage City", "Targeted Steal Tech" - -; /* <-- avoid gettext warnings -; -; Action enablers: -; -; action = the action to enable. -; actor_reqs = requirements that apply to the actor. -; target_reqs = requirements that apply to the target. -; -; README.actions lists the possible actions and their hard coded -; requirements. -; -; An action enabler is active when its actor_reqs AND its target_reqs are -; satisfied. -; -; */ <-- avoid gettext warnings - -[actionenabler_convert_leader] -action = "Convert Unit" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "GameLoss", "Local" - } - -[actionenabler_communist_rifles_to_plows] -action = "Convert Unit" -actor_reqs = - { "type", "name", "range" - "UnitType", "Riflemen", "Local" - "Gov", "Communism", "Player" - "Tech", "Communism", "Player" - "Tech", "Pottery", "Player" - "UnitState","OnDomesticTile","Local" - } -[actionenabler_communist_plows_to_rifles] -action = "Convert Unit" -actor_reqs = - { "type", "name", "range" - "UnitType", "Workers", "Local" - "Gov", "Communism", "Player" - "Tech", "Communism", "Player" - "Tech", "Conscription", "Player" - "UnitState","OnDomesticTile","Local" - } -;**Mobile SAM is an upgrade to AAA but does not obsolete it, -; since AAA retains special uses. Instead, AAA can convert -; to Mobile SAM under special conditions. -[actionenabler_convert_AAA_in_capital] -action = "Convert Unit" -actor_reqs = - { "type", "name", "range" - "UnitType", "Anti-Aircraft Artillery", "Local" - "UnitState","OnDomesticTile", "Local" - "CityTile", "Center", "Local" - "Building", "Palace", "City" - "Tech", "Space Flight", "Player" - "Age", "10", "Local" - } -[actionenabler_convert_AAA_in_capital_2] -action = "Convert Unit" -actor_reqs = - { "type", "name", "range" - "UnitType", "Anti-Aircraft Artillery", "Local" - "UnitState","OnDomesticTile", "Local" - "CityTile", "Center", "Local" - "Building", "Ecclesiastical Palace", "City" - "Tech", "Space Flight", "Player" - "Age", "10", "Local" - } - -[actionenabler_sabotage_city] -action = "Sabotage City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Diplomat", "Local", TRUE - "DiplRel", "War", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "UnitFlag", "Spy", "Local", FALSE - } - -[actionenabler_sabotage_city_spy] -action = "Sabotage City Escape" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "Spy", "Local" - "DiplRel", "War", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - } - -[actionenabler_sabotage_city_target] -action = "Targeted Sabotage City Escape" -actor_reqs = - { "type", "name", "range" - "DiplRel", "War", "Local" - "UnitFlag", "Spy", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - } - -; ************************ ESTABLISH EMBASSY *********************** -; normal establish embassy--if not at war -[actionenabler_establish_embassy] -action = "Establish Embassy Stay" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Diplomat", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "UnitState", "Transported", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "UnitFlag", "Spy", "Local", FALSE - "DiplRel", "War", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - } -;if at war, police station/fundie will block embassy: do a cease-fire first! -[actionenabler_establish_embassy_war] -action = "Establish Embassy Stay" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Diplomat", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "UnitState", "Transported", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "UnitFlag", "Spy", "Local", FALSE - "DiplRel", "War", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - "Building", "Police Station", "City", FALSE ; to do: when we can check for spy present to stop it - "Gov", "Fundamentalism", "Player", FALSE - } - -; normal establish embassy--if not at war -[actionenabler_establish_embassy_spy] -action = "Establish Embassy" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Spy", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "UnitState", "Transported", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - } -;if at war, police station or fundie will block embassy: do a cease-fire first! -[actionenabler_establish_embassy_spy_war] -action = "Establish Embassy" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Spy", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "UnitState", "Transported", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "DiplRel", "War", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - "Building", "Police Station", "City", FALSE ; to do: when we can check for spy present to stop it - "Gov", "Fundamentalism", "Player", FALSE - } -; *************************************************** - -[actionenabler_investigate_city] -action = "Investigate City Spend Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Diplomat", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "UnitState", "Transported", "Local", FALSE - "UnitFlag", "Spy", "Local", FALSE - } - -[actionenabler_investigate_city_spy] -action = "Investigate City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Spy", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "UnitState", "Transported", "Local", FALSE - "DiplRel", "Foreign", "Local", TRUE - } - -[actionenabler_poison_city] -action = "Poison City Escape" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Spy", "Local", TRUE - "UnitState", "Transported", "Local", FALSE - "DiplRel", "War", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - } -target_reqs = - { "type", "name", "range" - "MinSize", "2", "City" - } - -[actionenabler_steal_maps_escape] -action = "Steal Maps Escape" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Spy", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "UnitState", "Transported", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - } -[actionenabler_steal_maps] -action = "Steal Maps" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Diplomat", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - "DiplRel", "Foreign", "Local" - "UnitState", "Transported", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - } - -[actionenabler_steal_tech_random] -action = "Steal Tech" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Spy", "Local", FALSE - "UnitFlag", "Diplomat", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "UnitState", "Transported", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - } - -[actionenabler_steal_tech_random_esc] -action = "Steal Tech Escape Expected" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Spy", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "UnitState", "Transported", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - } - -[actionenabler_steal_tech_target] -action = "Targeted Steal Tech Escape Expected" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Spy", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "UnitState", "Transported", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - } - -[actionenabler_incite_city] -action = "Incite City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Diplomat", "Local", TRUE - "DiplRel", "Alliance", "Local", FALSE - "DiplRel", "Team", "Local", FALSE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "UnitFlag", "Spy", "Local", FALSE - "UnitState", "Transported", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "Gov", "Democracy", "Player", FALSE - "Building", "Palace", "City", FALSE - "Building", "Ecclesiastical Palace", "City", FALSE - "Building", "Mausoleum of Mausolos", "Player", FALSE - } - -[actionenabler_incite_city_spy] -action = "Incite City Escape" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Spy", "Local", TRUE - "DiplRel", "Alliance", "Local", FALSE - "DiplRel", "Team", "Local", FALSE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "UnitState", "Transported", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "Gov", "Democracy", "Player", FALSE - "Building", "Palace", "City", FALSE - "Building", "Ecclesiastical Palace", "City", FALSE - "Building", "Mausoleum of Mausolos", "Player", FALSE - } - -[actionenabler_bribe_unit] -action = "Bribe Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Diplomat", "Local", TRUE - "DiplRel", "Alliance", "Local", FALSE - "DiplRel", "Team", "Local", FALSE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Unbribable", "Local", FALSE - "CityTile", "Center", "Local", FALSE - "Gov", "Democracy", "Player", FALSE - "MaxUnitsOnTile", "1", "Local", TRUE - } - -[actionenabler_sabotage_unit] -action = "Sabotage Unit Escape" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "Spy", "Local" - "DiplRel", "War", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - } -target_reqs = - { "type", "name", "range", "present" - "CityTile", "Center", "Local", FALSE - "UnitClassFlag", "Unreachable", "Local", FALSE - "UnitClass", "Helicopter", "Local", FALSE - "MinHitPoints", "2", "Local", TRUE - "MaxUnitsOnTile", "1", "Local", TRUE - } - -[actionenabler_traderoute] -action = "Establish Trade Route" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "TradeRoute", "Local", TRUE - "Tech", "Trade", "Player", TRUE - "MinMoveFrags", "1", "Local", TRUE -; "DiplRel", "War", "Local", FALSE ; allows establishing during war then awaiting diplomatic relation to activate trade income. - } - -[actionenabler_traderoute_boat] -action = "Establish Trade Route" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "TradeRoute", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "UnitType", "Boat", "Local", TRUE -; "DiplRel", "War", "Local", FALSE ; allows establishing during war then awaiting diplomatic relation to activate trade income. - } - -[actionenabler_marketplace] -action = "Enter Marketplace" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "TradeRoute", "Local", TRUE - "Tech", "Trade", "Player", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -target_reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - } - -[actionenabler_help_build_wonder] -action = "Help Wonder" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "HelpWonder", "Local", TRUE -; "Tech", "Trade", "Player", TRUE - "DiplRel", "War", "Local", FALSE - "UnitType", "Caravel", "Local", FALSE - } -target_reqs = - { "type", "name", "range" - "BuildingGenus", "GreatWonder", "Local" - } - -[actionenabler_help_build_small_wonder] -action = "Help Wonder" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "HelpWonder", "Local", TRUE -; "Tech", "Trade", "Player", TRUE - "DiplRel", "War", "Local", FALSE - "UnitType", "Caravel", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "BuildingGenus", "SmallWonder", "Local", TRUE -; "Building", "Palace", "Local", FALSE - } - -[actionenabler_help_build_wonder_boat] -action = "Help Wonder" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "HelpWonder", "Local", TRUE -; "Tech", "Currency", "Player", TRUE - "DiplRel", "War", "Local", FALSE - "UnitType", "Boat", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "BuildingGenus", "SmallWonder", "Local", TRUE -; "Building", "Palace", "Local", FALSE - } -; Allow no-home commerce units to be used on a first wonder: -[actionenabler_help_build_wonder_starting_caravan] -action = "Help Wonder" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "HelpWonder", "Local", TRUE - "UnitState", "HasHomeCity", "Local", FALSE - "DiplRel", "War", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "BuildingGenus", "SmallWonder", "Local", TRUE - } - -[actionenabler_recycle_unit] -action = "Recycle Unit" -actor_reqs = - { "type", "name", "range", "present", "quiet" - "UnitFlag", "EvacuateFirst","Local", FALSE, TRUE - "DiplRel", "War", "Local", FALSE, TRUE - "DiplRel", "Cease-fire", "Local", FALSE, TRUE - "DiplRel", "Armistice", "Local", FALSE, TRUE - "DiplRel", "Peace", "Local", FALSE, TRUE - } - -[actionenabler_disband_unit] -action = "Disband Unit" -actor_reqs = - { "type", "name", "range", "present", "quiet" - "UnitFlag", "EvacuateFirst", "Local", FALSE, TRUE - } - -;CAPTURING LAND UNITS a "Capturer" must get a "Capturable" but not on a mountain. -[actionenabler_capture] -action = "Capture Units" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Capturer", "Local", TRUE - "UnitState", "Transported", "Local", FALSE -; "DiplRel", "War", "Local", TRUE ;NAH - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "DiplRel", "Alliance", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Capturable", "Local", TRUE - "CityTile", "Center", "Local", FALSE - "Terrain", "Mountains", "Local", FALSE - "MaxUnitsOnTile", "1", "Local", TRUE - "Extra", "Fort", "Local", FALSE - "Extra", "Fortress", "Local", FALSE - } - -;Archers can strafe/soften every unit on a tile for one -;round of combat only, iff it is not a city, fortress, -;or sea tile: -[actionenabler_archer_bombard] ;**** -action = "Bombard" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Bombarder", "Local", TRUE - "UnitType", "Archers", "Local", TRUE -; "UnitState", "Transported", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "War", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "CityTile", "Center", "Local", FALSE - "Extra", "Fortress", "Local", FALSE - "TerrainClass", "Oceanic", "Local", FALSE - } - -;Fanatics can strafe/soften every unit on a tile for one -;round of combat only, iff it is in domestic territory. -[actionenabler_fanatic_bombard] ;**** -action = "Bombard" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Bombarder", "Local", TRUE - "UnitType", "Fanatics", "Local", TRUE - "UnitState", "OnDomesticTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "War", "Local", TRUE - "Gov", "Fundamentalism", "Player", TRUE -; "UnitState", "Transported", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "CityTile", "Center", "Local", FALSE - "Extra", "Fortress", "Local", FALSE - "TerrainClass", "Oceanic", "Local", FALSE - } - - -[actionenabler_build_city_pioneer] -action = "Found City" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "Cities", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - } -target_reqs = - { "type", "name", "range", "present" - "CityTile", "Claimed", "Local", FALSE - } - -[actionenabler_build_city_domestic] -action = "Found City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Cities", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", FALSE - } - -[actionenabler_build_city_fort] -action = "Found City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Cities", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "Extra", "Fort", "Local", TRUE - } - -[actionenabler_join_city] -action = "Join City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "AddToCity", "Local", TRUE - "DiplRel", "Foreign", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - } - -[actionenabler_join_city_pilgrims_domestic] -action = "Join City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "AddToCity", "Local", TRUE - "UnitType", "Pilgrims", "Local", TRUE - "DiplRel", "Foreign", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - } - -;Land expel: must be not on a mountain nor an air expeller/expellee -[actionenabler_border_police] -action = "Expel Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "BorderPolice", "Local", TRUE - "UnitClass", "Air", "Local", FALSE - "UnitClass", "AirProtect", "Local", FALSE - "UnitFlag", "NonMil", "Local", FALSE ;Non-Military land class can't expel - "UnitType", "Warriors", "Local", FALSE ;Warriors are too weak to expel - "UnitState", "OnDomesticTile", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "DiplRel", "Team", "Local", FALSE - "DiplRel", "Alliance", "Local", FALSE -; "DiplRel", "War", "Local", FALSE ;NAH, you could expel anyone if you wanted. - "MinMoveFrags", "1", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Expellable", "Local", TRUE - "UnitClass", "Air", "Local", FALSE ;LAND UNITS CAN'T EXPEL AWACS - "UnitState", "OnDomesticTile", "Local", FALSE - "Terrain", "Mountains", "Local", FALSE ;Can't expel people hiding in the mountains - "MaxUnitsOnTile", "1", "Local", TRUE - } - -;Air expel: must be be air-to-air expelling from an aggressor air unit. -[actionenabler_air_border_police] -action = "Expel Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "BorderPolice", "Local", TRUE - "UnitFlag", "AirAttacker", "Local", TRUE ;some air class might not be expellers (AWACS) - "UnitFlag", "FieldUnit", "Local", FALSE ;bombers can't expel - "UnitState", "OnDomesticTile", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "DiplRel", "Team", "Local", FALSE - "DiplRel", "Alliance", "Local", FALSE -; "DiplRel", "War", "Local", FALSE ;NAH, you could expel anyone if you wanted. - "MinMoveFrags", "1", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Expellable", "Local", TRUE ;Has to be 1-expellable and 2-an air unit, in order for an air-expeller... - "UnitClass", "Air", "Local", TRUE ;...to be able to do border police action - "UnitState", "OnDomesticTile", "Local", FALSE - "MaxUnitsOnTile", "1", "Local", TRUE - } - -[actionenabler_nuke] -action = "Explode Nuclear" -actor_reqs = - { "type", "name", "range", "present", "quiet" - "UnitFlag", "Nuclear", "Local", TRUE, FALSE - "ServerSetting","nukes_minor","World", TRUE, FALSE - } - -;DESTROY CITY -; The GameLoss unit requirement makes sending units on a suicide mission to -; capture and destroy cities deep inside enemy terrain national suicide. -; The risk of moving a GameLoss unit to the target city increases the cost -; of the action. Rationalization for the requirement: the physical presence -; of the Leader makes it easier to comply with the order to destroy the -; city. (See the "orders by phone" Milgram experiment variation) -; -; The domestic city requirement forces the player to invade a city before -; he can destroy it. If this limit is weakened by allowing the destruction -; of undefended (MaxUnitsOnTile) foreign cities during war it will lead to -; situations where a player can destroy a city but is unable to occupy it. -; Rationalization: the resistance must be crushed before the destruction. -; -; TODO: create an international incident (set the Casus_Belli_Success -; effect value to 1000) if "Destroy City" still is overpowered. -[actionenabler_scorched_earth] -action = "Destroy City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "GameLoss", "Local", TRUE - "DiplRel", "Foreign", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "MaxUnitsonTile","0", "Local", TRUE - } - -;UPGRADE - all the below need Missile=FALSE after merge with main branch -;--------------------------------------------------------------------------- -;Native attack ALWAYS allowed for units who aren't CargoRestrained -[actionenabler_attack_native_unrestrained] -action = "Attack" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE - "UnitClassFlag","Missile", "Local", FALSE - "UnitClassFlag","CargoRestrained","Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - "UnitState", "OnNativeTile", "Local", TRUE - "DiplRel", "War", "Local", TRUE - } -;Native attack for CargoRestrained units allowed, if not Transported -[actionenabler_attack_native_restrained] -action = "Attack" -;Should Archers attack from Rivers? Probably, but then what is the Pandora's box? Muskets, etc? -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE - "UnitClassFlag","Missile", "Local", FALSE - "UnitClassFlag","CargoRestrained","Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "UnitState", "OnNativeTile", "Local", TRUE - "UnitState", "Transported", "Local", FALSE - "DiplRel", "War", "Local", TRUE - } -;Commerce units have to be NonMil to enter peaceful waters -;but they can also attack those with whom they are at war: -[actionenabler_attack_native_nonmil_attacker] -action = "Attack" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "NonMilAttack", "Local", TRUE - "UnitClassFlag","Missile", "Local", FALSE - "UnitClassFlag","CargoRestrained","Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - "UnitState", "OnNativeTile", "Local", TRUE - "DiplRel", "War", "Local", TRUE - } -;Marines -[actionenabler_attack_marines] -action = "Attack" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE - "UnitClassFlag","Missile", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - "UnitFlag", "Marines", "Local", TRUE - "DiplRel", "War", "Local", TRUE - } -[actionenabler_attack_from_non_native] -action = "Attack" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE - "UnitClassFlag", "Missile", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - "UnitClassFlag", "AttFromNonNative", "Local", TRUE - "DiplRel", "War", "Local", TRUE - } -[actionenabler_attack_from_non_native_nonmil_attacker] -action = "Attack" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "NonMilAttack", "Local", TRUE - "UnitClassFlag", "Missile", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - "UnitClassFlag", "AttFromNonNative", "Local", TRUE - "DiplRel", "War", "Local", TRUE - } - -[actionenabler_explode_missile] -action = "Suicide Attack" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE - "UnitClassFlag", "Missile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "War", "Local", TRUE - } -;--------------------------------------------------------------------------- -[actionenabler_conquer_city_native_unrestrained] -action = "Conquer City" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "CanOccupyCity", "Local", TRUE - "UnitClassFlag", "CargoRestrained","Local", FALSE - "UnitFlag", "NonMil", "Local", FALSE - "DiplRel", "War", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - } -[actionenabler_conquer_city_native_restrained] -action = "Conquer City" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "CanOccupyCity", "Local", TRUE - "UnitClassFlag", "CargoRestrained","Local", TRUE - "UnitState", "Transported", "Local", FALSE - "UnitFlag", "NonMil", "Local", FALSE - "DiplRel", "War", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - } -[actionenabler_conquer_city_marines] -action = "Conquer City" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "CanOccupyCity", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "DiplRel", "War", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "UnitFlag", "Marines", "Local", TRUE - "UnitType", "Anti-Aircraft Artillery", "Local", FALSE - ;AAA got Marines flag only to enable reasonable attacks, - ;not for conquering cities from a Transport. - } -target_reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - } -[actionenabler_conquer_city_from_non_native] -action = "Conquer City" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "CanOccupyCity", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "DiplRel", "War", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "UnitClassFlag", "AttFromNonNative", "Local", TRUE - "UnitType", "Anti-Aircraft Artillery", "Local", FALSE - ;AAA got AttFromNonNative only to enable reasonable attacks, - ;not for conquering cities from a Transport. - } -target_reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - } -;--------------------------------------------------------------------------- -[actionenabler_change_home_city] -action = "Home City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "NoHome", "Local", FALSE - "UnitState", "HasHomeCity", "Local", TRUE -; REMOVE LINE BELOW TO ALLOW GIVING UNITS TO ALLIES THROUGH HOME CITY COMMAND - "DiplRel", "Foreign", "Local", FALSE - } -; Allow no-home caravans to be "homed" so they can be used for a Trade Route: -[actionenabler_change_home_commerce] -action = "Home City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "NoHome", "Local", FALSE - "UnitFlag", "TradeRoute", "Local", TRUE -; REMOVE LINE BELOW TO ALLOW GIVING UNITS TO ALLIES THROUGH HOME CITY COMMAND - "DiplRel", "Foreign", "Local", FALSE - } - -[actionenabler_paradrop_base] -action = "Paradrop Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Paratroopers", "Local", TRUE - "UnitState", "Transporting", "Local", FALSE - "Extra", "Airbase", "Local", TRUE - } - -[actionenabler_paradrop_city] -action = "Paradrop Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Paratroopers", "Local", TRUE - "UnitState", "Transporting", "Local", FALSE - "CityTile", "Center", "Local", TRUE - } - -[actionenabler_upgrade_unit] -action = "Upgrade Unit" -actor_reqs = - { "type", "name", "range", "present" - "DiplRel", "Foreign", "Local", FALSE - } - -[actionenabler_airlift_unit] -action = "Airlift Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "Airliftable", "Local", TRUE - "UnitState", "Transporting", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - } - -[actionenabler_transform_terrain_outside_city] -action = "Transform Terrain" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Transform", "Local", TRUE - "CityTile", "Center", "Local", FALSE - } -[actionenabler_transform_terrain_inside_city] ;can't change grass to hills inside a city -action = "Transform Terrain" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Transform", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "Terrain", "Grassland", "Local", FALSE - } - -[actionenabler_irrigate_tf] -action = "Irrigate TF" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitFlag", "CanHide", "Local", FALSE -; "UnitType", "Legion", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - } -[actionenabler_irrigate_tf_prole] -action = "Irrigate TF" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player", TRUE - } - -[actionenabler_mine_tf_outside_city] -action = "Mine TF" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitFlag", "CanHide", "Local", FALSE -; "UnitType", "Legion", "Local", FALSE - "UnitType", "Proletarians","Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE - "CityTile", "Center", "Local", FALSE - } -[actionenabler_mine_tf_outside_city_prole] -action = "Mine TF" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians","Local", TRUE - "Gov", "Communism", "Player", TRUE - "CityTile", "Center", "Local", FALSE - } -[actionenabler_mine_tf_inside_city] ;you can't plant a forest in an existing city -action = "Mine TF" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE -; "UnitType", "Legion", "Local", FALSE - "UnitFlag", "CanHide", "Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - "CityTile", "Center", "Local", TRUE - "Terrain", "Grassland", "Local", FALSE - "Terrain", "Plains", "Local", FALSE - } - -[actionenabler_pillage] -action = "Pillage" -actor_reqs = - { "type", "name", "range" - "UnitClassFlag", "CanPillage", "Local" - } -[actionenabler_pillage2] -action = "Pillage" -actor_reqs = - { "type", "name", "range" - "UnitType", "Ground Strike Fighter", "Local" - } - -[actionenabler_fortify] -action = "Fortify" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "CanFortify", "Local", TRUE - "UnitFlag", "Cant_Fortify", "Local", FALSE - "UnitClass", "AirProtect", "Local", FALSE - "UnitState", "Transported", "Local", FALSE - } - -[actionenabler_road] -action = "Road" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitFlag", "CanHide", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - } -[actionenabler_road_prole] -action = "Road" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player", TRUE - } -[actionenabler_legion_road] -action = "Road" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Legion", "Local", TRUE - "UnitState", "OnDomesticTile","Local", FALSE - } -; Don't force legions to road BEFORE making a fortress -; from fortress being "domestic national territory" -[actionenabler_legion_road2] -action = "Road" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Legion", "Local", TRUE - "Extra", "Fort", "Local", TRUE - } - -[actionenabler_base] -action = "Build Base" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "CanFortress", "Local", TRUE - "UnitType", "Proletarians", "Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE - } -[actionenabler_base_prole] -action = "Build Base" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "CanFortress", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player", TRUE - } -[actionenabler_build_hideout_domestic] -action = "Build Base" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "CanHide", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "DiplRel", "Foreign", "Local", FALSE - } -[actionenabler_build_hideout_unclaimed] -action = "Build Base" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "CanHide", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "CityTile", "Claimed", "Local", FALSE - } - -[actionenabler_mining] -action = "Build Mine" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitFlag", "Well-Digger", "Local", FALSE -; "UnitType", "Legion", "Local", FALSE - "UnitFlag", "CanHide", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "TerrainFlag", "Oil", "Local", FALSE - } -[actionenabler_mining_prole] -action = "Build Mine" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "TerrainFlag", "Oil", "Local", FALSE - } - -[actionenabler_desert_oil] -action = "Build Mine" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE -; "UnitType", "Legion", "Local", FALSE - "UnitFlag", "CanHide", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE - "Tech", "Construction", "Player", TRUE - } -target_reqs = - { "type", "name", "range" - "Terrain", "Desert", "Local" - } -[actionenabler_desert_oil_prole] -action = "Build Mine" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player", TRUE - "Tech", "Construction", "Player", TRUE - } -target_reqs = - { "type", "name", "range" - "Terrain", "Desert", "Local" - } - -[actionenabler_arctic_oil] -action = "Build Mine" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE -; "UnitType", "Legion", "Local", FALSE - "UnitFlag", "CanHide", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE - "Tech", "Refining", "Player", TRUE - } -target_reqs = - { "type", "name", "range" - "Terrain", "Arctic", "Local" - } -[actionenabler_arctic_oil_prole] -action = "Build Mine" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "Gov", "Communism", "Player", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Tech", "Refining", "Player", TRUE - } -target_reqs = - { "type", "name", "range" - "Terrain", "Arctic", "Local" - } - -[actionenabler_irrigate_welldigger] -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitFlag", "Well-Digger", "Local", TRUE - "Age", "10", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "TerrainFlag", "Low Land", "Local", TRUE - "Tech", "Pottery", "Player", FALSE - "Tech", "Alphabet","Player", FALSE - "Tech", "Writing", "World", FALSE - } - -[actionenabler_irrigate_src_ocean] -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitFlag", "Well-Digger", "Local", FALSE -; "UnitType", "Legion", "Local", FALSE - "UnitFlag", "CanHide", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "TerrainClass", "Oceanic", "CAdjacent", TRUE - } -[actionenabler_irrigate_src_ocean_prole] -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player",TRUE - } -target_reqs = - { "type", "name", "range", "present" - "TerrainClass", "Oceanic", "CAdjacent", TRUE - } - -[actionenabler_irrigate_src_river] ;canal and waterway too -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE -; "UnitType", "Legion", "Local", FALSE - "UnitFlag", "CanHide", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "ExtraFlag", "IrrigationSource", "CAdjacent", TRUE -; "Extra", "River", "CAdjacent", TRUE - } -[actionenabler_irrigate_src_river_prole] ;canal and water way too -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player",TRUE - } -target_reqs = - { "type", "name", "range", "present" - "ExtraFlag", "IrrigationSource", "CAdjacent", TRUE -; "Extra", "River", "CAdjacent", TRUE - } - -[actionenabler_irrigate_src_oasis] -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE -; "UnitType", "Legion", "Local", FALSE - "UnitFlag", "CanHide", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "Extra", "Oasis", "CAdjacent", TRUE - } -[actionenabler_irrigate_src_oasis_prole] -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player",TRUE - } -target_reqs = - { "type", "name", "range", "present" - "Extra", "Oasis", "CAdjacent", TRUE - } - -[actionenabler_irrigate_src_irrigation] -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitFlag", "Well-Digger", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE -; "UnitType", "Legion", "Local", FALSE - "UnitFlag", "CanHide", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "Extra", "Irrigation", "CAdjacent", TRUE - } -[actionenabler_irrigate_src_irrigation_prole] -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player",TRUE - } -target_reqs = - { "type", "name", "range", "present" - "Extra", "Irrigation", "CAdjacent", TRUE - } - -; NOT IMPLEMENTED IN SERVER YET -;[actionenabler_unload] -;action = "Transport Unload" -;actor_reqs = -; { "type", "name", "range" -; "UnitState", "Transporting", "Local" -; } -;target_reqs = -; { "type", "name", "range" -; "UnitState", "OnLivableTile", "Local" -; "UnitState", "Transported", "Local" -; } - -[borders] -; Base border radius from city. -radius_sq_city = 17 - -; Border radius square increased by this amount / point of city size -size_effect = 1 - -; Difference between city workable area and area permanently claimed by -; city (these tiles cannot be stolen by stronger border sources). -; 0 means exactly city workable area is immune to border stealing. -; Negative value means outer workable tiles can be stolen; highly negative -; value (more than max city radius_sq) means any workable tile can be stolen. -; If City_Radius_Sq is variable, so is the set of locked tiles; this is -; a squared value, so the radius of the ring of tiles which are workable -; but not locked (or vice versa) varies but the area is constant. -radius_sq_city_permanent = 0 - -[research] -; Method of calculating technology costs -; "Civ I|II" - Civ (I|II) style. Every new tech add base_tech_cost to -; cost of next tech. -; "Classic" - Cost of technology is: -; base_tech_cost * (1 + reqs) * sqrt(1 + reqs) / 2 -; where reqs == number of requirement for tech, counted -; recursively. -; "Classic+" - Cost are read from tech.ruleset. Missing costs are -; generated by style "Classic". -; "Experimental" - Cost of technology is: -; base_tech_cost * (reqs^2 / (1 + sqrt(sqrt(reqs + 1))) -; - 0.5) -; where reqs == number of requirement for tech, counted -; recursively. Initial techs` cost will be base_tech_cost. -; "Experimental+" - Cost are read from tech.ruleset. Missing costs are -; generated by style "Experimental". -; "Linear" - Cost of technology is: -; base_tech_cost * reqs -; where reqs == number of requirement for tech, counted -; recursively. -tech_cost_style = "Classic+" - -; Base research cost. Used in tech cost styles where tech cost is generated. -; In other words: used everywhere unless the cost of *all* techs are -; specified and the tech cost style is "Experimental+" or "Classic+". -base_tech_cost = 20 - -; Technology leak from other civilizations -; "None" - No reduction of the technology cost. -; "Embassies" - Technology cost is reduced depending on the number of -; players which already know the tech and you have an -; embassy with. -; "All Players" - Technology cost is reduced depending on the number of -; all players (human, AI and barbarians) which already -; know the tech. -; "Normal Players" - Technology cost is reduced depending on the number of -; normal players (human and AI) which already know the -; tech. -tech_leakage = "All Players" - -; Method of paying tech upkeep -; "None" - no upkeep -; "Basic" - upkeep is calculated as: -; / tech_upkeep_divider - tech_upkeep_free -; "Cities" - upkeep is calculated like "Basic", but multiplied by number of cities -tech_upkeep_style = "None" - -; upkeep cost is divided by this value -tech_upkeep_divider = 2000 - -; Method of selecting techs given for free -; "Goal" - Towards player`s goal, random if no goal -; "Random" - Random researchable tech -; "Cheapest" - Cheapest researchable tech, random among equal cost ones -free_tech_method = "Goal" - -[culture] -; Minimum culture points for cultural domination victory -victory_min_points = 1000 - -; How big lead relative to second best player is needed for victory -victory_lead_pct = 200 - -; How much each culture point affects the migration -; from/to the city. Each culture point count as this many permilles -; of a migration point. -migration_pml = 50 - -[calendar] -; Year in the beginning of the game -start_year = -4000 - -; Year 1 instead of 0. -skip_year_0 = TRUE - -; How many fragments each year has. In addition to this, "Turn_Fragments" effects are -; needed to control fragment accumulation. -; Value 0 here disables year advancement by fragment accumulation. -fragments = 0 - -; Calendar fragment names. If name is missing, only a fragment number +1 (so human readable -; numbers begin from 1 and not 0) is shown. - -;fragment_name0 = "Jan" -;fragment_name1 = "Feb" -; ... - -; What labels are used for positive and negative years. -; /* TRANS: year label (Anno Domini, Common Era) */ -positive_label = _("AD") -; /* TRANS: year label (BC was before Common Era became PC) */ -negative_label = _("BC") - -; /* <-- avoid gettext warnings -; -; Disaster types: -; -; name = translatable name as seen by user -; reqs = requirements for disaster to happen (see effects.ruleset -; and README.effects for help on requirements) -; frequency = how likely disaster is to occur -; effects -; - "DestroyBuilding" = Random building is destroyed -; - "ReducePopulation" = Reduce city size by one unless it's already 1 -; - "ReducePopDestroy" = Reduce city size by one, possibly destroying the city -; - "EmptyFoodStock" = Remove all food from food stock -; - "EmptyProdStock" = Destroy current production -; - "Pollution" = One tile surrounding city polluted -; - "Fallout" = One tile surrounding city polluted with fallout -; -; */ <-- avoid gettext warnings - -; No disasters in multiplayer ruleset - -; /* <-- avoid gettext warnings -; -; Achievement types: -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets -; etc; if not present, "name" is used for this -; purpose too. Since the name used in savegames must -; not change, if you want to rename an item after a -; ruleset has been released, you should set -; "rule_name" to the original value of "name". -; type = What event grants the achievement to player. -; See README.achievements for list of these types. -; unique = If TRUE, only first one reaching the achievement will -; get it. Defaults to TRUE. -; value = Value to reach. Exact meaning of this depends on -; achievement type. -; culture = Amount of culture granted to player who gets achievement -; granted. -; first_msg = Message shown to first player gaining the achievement -; cons_msg = Message shown to consecutive players gaining the achievement -; -; */ <-- avoid gettext warnings - -; No achievements in multiplayer ruleset - -; -; Trade settings -; -; IN = international, IC = intercontinental. -; For each of the trade route types: -; "pct" - Trade income %. If this is 0, trade route cannot be -; established at all -; "cancelling" - What to do to previously established traderoutes when they -; turn illegal -; "Active" - Keep them active (although they will only -; provide nonzero income if illegal due to -; trademindist rather than pct==0) -; "Inactive" - Keep them inactive -; "Cancel" - Cancel them altogether -; "bonus" - One-time bonuses granted when traderoute established -; "None" - No one-time bonus -; "Gold" - Bonus to gold -; "Science" - Bonus to research -; "Both" - Bonus to gold and research -; -[trade] -settings = - { "type", "pct", "cancelling", "bonus" - "National", 0, "Cancel", "None" - "NationalIC", 0, "Cancel", "None" - "IN", 35, "Inactive", "Gold" - "INIC", 35, "Inactive", "Gold" - "Ally", 35, "Inactive", "Gold" - "AllyIC", 35, "Inactive", "Gold" - "Enemy", 0, "Inactive", "Gold" - "EnemyIC", 0, "Inactive", "Gold" - "Team", 35, "Inactive", "Gold" - "TeamIC", 35, "Inactive", "Gold" - } - -; When are goods for the trade route chosen. -; "Leaving" - Goods to carry are assigned to unit when it`s built, or it changes homecity -; "Arrival" - Goods are chosen when trade route is established, when unit arrives to destination -goods_selection = "Arrival" - -; /* <-- avoid gettext warnings -; -; Goods types: -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets -; etc; if not present, "name" is used for this -; purpose too. Since the name used in savegames must -; not change, if you want to rename an item after a -; ruleset has been released, you should set -; "rule_name" to the original value of "name". -; reqs = requirements for a city to provide goods (see effects.ruleset -; and README.effects for help on requirements) -; from_pct = Income for the sending end of the trade route. Default is 100% -; This value is applied to both ends of bidirectional routes. -; to_pct = Income for the receiving end of the trade route. Default is 100% -; This value is not used at all in case of bidirectional routes. -; onetime_pct = Onetime bonuses when traderoute is established. Default is 100% -; flags -; - "Bidirectional" = Trade route carrying the goods does not have "from" and "to" -; ends, but both ends are considered the same. -; - "Depletes" = Trade route gets cancelled when the source city cannot provide -; goods any more. Bidirectional routes gets cancelled if either -; one of the involved cities cannot provide goods. -; helptext = Optional help text string; should escape all raw -; newlines so that xgettext parsing works -; -; */ <-- avoid gettext warnings - -[goods_good] -name = _("Goods") - - -; /* <-- avoid gettext warnings -; -; Clause types -; -; Clause types that are not listed here, are not enabled at all. -; -; type = Type of the clause, one of "Advance", "Gold", "Map", "Seamap", -; "City", "Ceasefire", "Peace", "Alliance", "Vision", "Embassy" -; -; */ <-- avoid gettext warnings - -[clause_advance] -type = "Advance" - -[clause_gold] -type = "Gold" - -[clause_map] -type = "Map" - -[clause_seamap] -type = "Seamap" - -[clause_city] -type = "City" - -[clause_ceasefire] -type = "Ceasefire" - -[clause_peace] -type = "Peace" - -[clause_alliance] -type = "Alliance" - -[clause_vision] -type = "Vision" - -[clause_embassy] -type = "Embassy" - - -[playercolors] -background.r = 86 -background.g = 86 -background.b = 86 - -; Player colors for 32 players are defined below. -; Avoid greens, blues, and white / very pale colors (too easy to confuse -; with terrain). -; Avoid dark colors. -colorlist = - { "r", "g", "b" - 255, 0, 0 ; Red - 255, 255, 0 ; Yellow - 0, 255, 255 ; Blue - 138, 43, 226 ; Purple - 255, 165, 0 ; Orange - 255, 0, 255 ; Magenta - 173, 216, 230 ; Cornflower - 0, 255, 127 ; Emerald - 250, 128, 114 ; Salmon - 124, 252, 0 ; Green - 139, 0, 0 ; Burgundy - 255, 192, 203 ; Pink - 211, 211, 211 ; Silver - 218, 112, 214 ; Heliotrope - 255, 20, 147 ; Fuchsia - 100, 149, 237 ; Azure - 255, 215, 0 ; Gold - 245, 222, 179 ; Khaki - 255, 255, 128 ; Butter - 192, 255, 128 ; Mint - 204, 255, 0 ; Lime - 255, 211, 140 ; Peach - 255, 79, 0 ; Vermilion - 240, 145, 169 ; Puce - 255, 219, 88 ; Mustard - 153, 17, 153 ; Aubergine - 184, 134, 11 ; Brown - 255, 102, 0 ; Pumpkin - 102, 205, 170 ; Turquoise - 195, 33, 72 ; Crimson - 168, 153, 230 ; Lavender - 255, 250, 205 ; Cream - } - -[teams] -; Team names correspond roughly to colors defined above, so that -; plrcolormode=TEAM_ORDER is not gratuitously confusing. -names = -; /* TRANS: Name of a color; used as unique identifier for a team */ -; /* TRANS: With this and other color team names, uniqueness is more */ -; /* TRANS: important than precise translation. To see the colors, start a */ -; /* TRANS: multiplayer game with 32 players and look at the Nations report. */ - _("?team name:Red"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Yellow"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Blue"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Purple"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Orange"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Magenta"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Cornflower"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Emerald"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Salmon"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Green"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Burgundy"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Pink"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Silver"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Heliotrope"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Fuchsia"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Azure"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Gold"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Khaki"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Butter"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Mint"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Lime"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Peach"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Vermilion"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Puce"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Mustard"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Aubergine"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Brown"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Pumpkin"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Turquoise"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Crimson"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Lavender"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Cream") - - -; RESTRICTINFRA ENABLED ONLY RESTRICTS ENEMY RAILS TO FUNCTION AS ROADS -[settings] -; TO DISABLE SPACERACE INCLUDE THESE LINES BELOW: -; "endspaceship", DISABLED, FALSE -; "victories", "ALLIED", FALSE - -set = - { "name", "value", "lock" - "mapsize", "PLAYER", FALSE - "tilesperplayer", 300, FALSE - "netwait", 20, FALSE - "nettimeout", 120, FALSE - "pingtime", 30, FALSE - "pingtimeout", 240, FALSE - "restrictinfra", "ENABLED", FALSE - "alltemperate", FALSE, FALSE - "aifill", 6, FALSE - "airliftingstyle", "FROM_ALLIES|TO_ALLIES", FALSE - "airliftdestdivisor", 3, FALSE - "autoattack", "enabled", FALSE - "autoattack_style", 1, FALSE - "barbarians", "DISABLED", FALSE - "borders", "SEE_INSIDE", FALSE - "contactturns", 10, FALSE - "diplomacy", "ALL", FALSE - "dispersion", 0, FALSE - "endspaceship", "ENABLED", FALSE - "foggedborders", TRUE, FALSE - "generator", "RANDOM", FALSE - "gold", 100, FALSE - "hideouts", TRUE, FALSE - "huts", 0, FALSE - "killcitizen_pct", 60, FALSE ; regulates % chance of pop kill by city pop-killer units - "landmass", 63, FALSE - "minplayers", 0, FALSE - "move_bonus_in_frags", "ENABLED", TRUE ;locked - "nationset", "all", FALSE - "nuclearwinter_percent", 20, FALSE - "nukes_minor", "ENABLED", FALSE ; set to DISABLED to completely disallow nuclear detonations - "nukes_major", "DISABLED", FALSE ; set to ENABLED to allow nuclear fusion weapons - "revolen", 1, FALSE - "separatepoles", FALSE, FALSE - "slot_control", TRUE, FALSE ; multiple units per turn - "slot_control_style", 1, FALSE ; 1 = Shield2Gold units only - "spaceship_travel_time", 225, FALSE - "specials", 350, FALSE - "startpos", "DEFAULT", FALSE - "startunits", "xxcccwwwADD", FALSE - "techleak", 25, FALSE - "techpenalty", 0, FALSE - "tinyisles", FALSE, FALSE - "trademindist", 12, FALSE - "trade_revenue_style", "SIMPLE", FALSE ;"simple" formula based on average trade in both cities (sans distance etc.) - "topology", "WRAPX", FALSE - "trading_city", "DISABLED", FALSE - "universal_unload", "ENABLED", FALSE - "unload_override", 0, FALSE ;0=native unloading same as non-native. 1+ = move_fragment cost for unloading. - "unreachableprotects", "ENABLED", FALSE - "unitwaittime_style", "ACTIVITIES|FORTIFY|DELAYGOTO", FALSE - "victories", "ALLIED|SPACERACE", FALSE - "zoc_purity", "ENABLED", FALSE ; igZOC units don't lift ZOC for units subject to ZOC - } diff --git a/freeciv/freeciv/data/.historic/ag2/script.lua b/freeciv/freeciv/data/.historic/ag2/script.lua deleted file mode 100644 index 3ee59c570..000000000 --- a/freeciv/freeciv/data/.historic/ag2/script.lua +++ /dev/null @@ -1,203 +0,0 @@ --- Freeciv - Copyright (C) 2007 - The Freeciv Project --- This program is free software; you can redistribute it and/or modify --- it under the terms of the GNU General Public License as published by --- the Free Software Foundation; either version 2, or (at your option) --- any later version. --- --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU General Public License for more details. - --- This file is for lua-functionality that is specific to a given --- ruleset. When freeciv loads a ruleset, it also loads script --- file called 'default.lua'. The one loaded if your ruleset --- does not provide an override is default/default.lua. - - --- This flags whether philosophy awards a bonus advance, and gets set to off (0) after T85. -philosophy_possible = 1 -game_turn = 0 - ---Give players custom messages on certain years. Currently at 1600 AD (T85), Philosophy expires. Let them know. -function history_turn_notifications(turn, year) - game_turn = turn - - if turn > 78 and turn < 85 then - notify.all("Philosophy will no longer award a bonus tech after turn 85.") - end - - if turn == 85 then - -- Philosophy no longer gives advances after 1600 AD - notify.all("Philosophers around the world mourn the execution of Giordano Bruno. Philosophy no longer gives a bonus advance.") - philosophy_possible = 0 - end - - return false -end -signal.connect("turn_begin", "history_turn_notifications") -- *************** turn_started deprecated in 3.1, renamed turn_begin - --- Place Ruins at the location of the destroyed city. -function city_destroyed_callback(city, loser, destroyer) - city.tile:create_extra("Ruins", NIL) - -- continue processing - return false -end - -signal.connect("city_destroyed", "city_destroyed_callback") - - --- Hack: record which players already got Philosophy, to avoid --- teams getting it multiple times with team_pooled_research. --- Stored as a string as this is a type simple enough to be included --- in savefiles. --- (It`s probably not necessary to test for existence as savefile --- data is loaded after this script is executed.) -if philo_players == nil then - philo_players = "" -end - --- Record that a player got Philosophy in our hacky string. -function record_philo(player) - local pos = player.id + 1 - philo_players = string.sub(philo_players, 1, pos-1) .. - string.rep(" ", math.max(0, pos - 1 - #philo_players)) .. - "." .. string.sub(philo_players, pos+1) -end - --- Grant one tech when the tech Philosophy is researched. -function tech_researched_handler(tech, player, how) - local id - local gained - - if tech == nil then - -- no tech was researched. - return - end - - id = tech.id --- Report early Horseback riding. - if id == find.tech_type("Horseback Riding").id and how == "researched" then - if game_turn < 15 then - for c in player:cities_iterate() do - if c:has_building(find.building_type("Palace")) then - notify.event(NIL, c.tile, E.TECH_GAIN, - _("Travellers tell stories of the amazing skills of the %s, who ride wild beasts near %s! (%i,%i)"), - player.nation:plural_translation(), c.name, c.tile.x, c.tile.y ) - - notify.all( _("Tribesmen have learned to ride wild beasts near %s (%i,%i)"), c.name, c.tile.x, c.tile.y) - end - end - end - end -------------------------- - if id == find.tech_type("Philosophy").id and how == "researched" then - - -- Check potential teammates. - for p in players_iterate() do - if player:shares_research(p) - and string.sub(philo_players, p.id+1, p.id+1) == "." then - -- Another player in the same team already got Philosophy. - record_philo(player) - return - end - end - - record_philo(player) - - - -- Philosophy does not give a bonus tech under certain conditions. Check for those conditions ------------------- - if philosophy_possible == 0 then - -- No Philosophy advance after turn 85 (1600 CE) - return - end - - -- Philosophy can only give advances if you know NO techs from the next tier -------------- - -- Even knowing any of these techs makes an advance impossible ! - - local researcher = player - - local forbidden_tech = find.tech_type("Banking") - if researcher:knows_tech(forbidden_tech) then - return - end - - forbidden_tech = find.tech_type("Medicine") - if researcher:knows_tech(forbidden_tech) then - return - end - - forbidden_tech = find.tech_type("University") - if researcher:knows_tech(forbidden_tech) then - return - end - - forbidden_tech = find.tech_type("Invention") - if researcher:knows_tech(forbidden_tech) then - return - end - - forbidden_tech = find.tech_type("Physics") - if researcher:knows_tech(forbidden_tech) then - return - end - - forbidden_tech = find.tech_type("Monotheism") - if researcher:knows_tech(forbidden_tech) then - return - end - - -- Give the player a free advance. - -- This will give a free advance for each player that shares research. - gained = player:give_tech(nil, -1, false, "researched") - - -- Notify the player. Include the tech names in a way that makes it - -- look natural no matter if each tech is announced or not. - notify.event(player, NIL, E.TECH_GAIN, - _("Great philosophers from all the world join your civilization: you get the immediate advance %s."), - gained:name_translation()) - - -- Notify research partners - notify.research(player, false, E.TECH_GAIN, - _("Great philosophers from all the world join the %s: you get the immediate advance %s."), - player.nation:plural_translation(), - gained:name_translation()) - - -- default.lua informs the embassies when the tech source is a hut. - -- They should therefore be informed about the source here too. - notify.research_embassies(player, E.TECH_EMBASSY, - -- /* TRANS: first %s is leader or team name */ - _("Great philosophers from all the world join %s: they get %s as an immediate advance."), - player:research_name_translation(), - gained:name_translation()) - end -end - -signal.connect("tech_researched", "tech_researched_handler") - -function turn_callback(turn, year) - if turn == 120 then - notify.event(nil, nil, E.SCRIPT, -_("Prophets have Visions!\n\ -Evangelists warn the End Times are near.\ -")) - end - - if turn == 2 then - notify.event(nil, nil, E.SCRIPT, -_("Hunt for Food!\n\ -Meat from wild animals is an important part of the Stone Age diet. Use wandering Deer and Wild Boar for extra food.\ - (TIP: Use Shift-W and Ctrl-Shift-Click to monitor and manage these resource opportunities.)\ -")) - end - - if turn == 12 then - notify.event(nil, nil, E.SCRIPT, -_("Ecology Report\n\ -Frequent hunting has reduced wild animal populations and scared them away from human settlements.\ -")) - end -end - - -signal.connect('turn_begin', 'turn_callback') diff --git a/freeciv/freeciv/data/.historic/ag2/terrain.ruleset b/freeciv/freeciv/data/.historic/ag2/terrain.ruleset deleted file mode 100644 index ed201477d..000000000 --- a/freeciv/freeciv/data/.historic/ag2/terrain.ruleset +++ /dev/null @@ -1,2475 +0,0 @@ - -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes, -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -; Note that the freeciv AI may not cope well with anything more -; than minor changes. - -[datafile] -description="Avant-garde terrain data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -[control] -; Names for custom terrain flags. There can be up to 8 of these. -; name = rule name; In some circumstances user may see this -; as part of some sentences, so try to make it descriptive -; and sensible. -; helptxt = displayed in the help for terrains with this flag (optional) -flags = - { "name", "helptxt" - _("Oil"), _("Has Oil Well instead of Mine.") - _("NoPollution"), _("No Pollution nor Fallout appear here.") - _("Low Land"), _("Terrain suitable for canal digging.") - } - -; Names for custom extra flags. There can be up to 8 of these. -; name = rule name; In some circumstances user may see this -; as part of some sentences, so try to make it descriptive -; and sensible. -; helptxt = displayed in the help for extra types with this flag -; (optional) -extra_flags = - { "name", "helptxt" - _("Quayable"), _("Allows Quays to be built.") - _("IrrigationSource"), _("Allows Irrigation.") - } - -[parameters] - -; Percentage of "land" tiles required to be adjacent to a water tile before -; it may be "reclaimed" into a land tile (0-101; 0=anywhere, default 101=nowhere) -ocean_reclaim_requirement = 30 - -; Percentage of "water" tiles required to be adjacent to a land tile before -; it may be "channeled" into a water tile (0-101; 0=anywhere, default 101=nowhere) -land_channel_requirement = 10 - -; Percentage of unfrozen tiles (no "Frozen" flag) required to be adjacent -; to a frozen tile before it can thaw (0-101; 0=anywhere, default 101=nowhere) -thaw_requirement = 0 - -; Percentage of frozen tiles ("Frozen" flag) required to be adjacent to an -; unfrozen tile before it can freeze (0-101; 0=anywhere, default 101=nowhere) -freeze_requirement = 0 - -; Bodies of water up to this size are considered freshwater lakes, if there is -; also terrain type(s) with flag "FreshWater" in the ruleset. -lake_max_size = 14 - -; How many native tiles first startunit must be able to reach. -; 0 to disable check. -min_start_native_area = 0 - -; How many fragments each movement point has. -; For example road movement costs are relative to this. -move_fragments = 9 - -; How many move_fragments IgTer unit movement costs -igter_cost = 3 - -; Whether diagonal movement has increased cost (no effect with hex topology) -; The cost increase is more accurate with larger values for move_fragments -pythagorean_diagonal = FALSE - -; There is no resources in the middle of the oceans, only near coast -ocean_resources = FALSE - -; /* <-- avoid gettext warnings -; -; The individual terrain types, one per section. -; Roughly sorted by identifier. -; The actual tag used (the * in [terrain_*]) must be unique for each terrain, -; and may be used in debug output when reading this file. -; -; Notes: -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; -; if not present, "name" is used for this purpose too. -; Since the name used in savegames must not change, if -; you want to rename an item after a ruleset has been -; released, you should set "rule_name" to the original -; value of "name". -; graphic = preferred graphic; Tilespec [tile_*] section -; with 'tag' matching this will be used. -; graphic_alt = alternate graphic. When no tilespec 'tag' matching -; preferred graphic is not found, this will be used. -; Otherwise may be "-" -; identifier = single-character identifier used in savegames. This -; must be unique for each terrain. -; class = Terrain class terrain belongs to: "Land" or "Oceanic" -; movement_cost = in whole movement points, not move_fragments; -; typically 1 to 3 -; defense_bonus = percent added to defense; typically 0% to 200% -; food = normal food production -; shield = normal shield production -; trade = normal trade production -; resources = list of possible resources on this terrain -; road_food_incr_pct = percent of road food_incr applied to this terrain -; road_shield_incr_pct = percent of road shield_incr applied to this terrain -; road_trade_incr_pct = percent of road trade_incr applied to this terrain -; base_time = time to build bases; if 0, cannot build any bases. -; Nonzero values only affect extras with build_time 0. -; road_time = time to build roads; if 0, cannot build any roads. -; Nonzero values only affect extras with build_time 0. -; irrigation_result = result of 'irrigate' activity; one of: -; "no" -- cannot irrigate -; "yes" -- can build extra -; terrain section -- irrigation changes to that terrain -; irrigation_food_incr = increment to food if tile is 100% irrigated -; (actual bonus controlled by Irrigation_Pct effect) -; irrigation_time = time for 'irrigate' activity; if 0, cannot irrigate -; Nonzero values only affect extras with build_time 0. -; Such extras can modify time with build_time_factor. -; mining_result = result of 'mine' activity; one of: -; "no" -- cannot mine -; "yes" -- can build extra -; terrain section -- mining changes to that terrain -; mining_shield_incr = increment to shields if tile is 100% mined -; (actual bonus controlled by Mining_Pct effect) -; mining_time = time for 'mine' activity; if 0, cannot mine -; Nonzero values only affect extras with build_time 0. -; Such extras can modify time with build_time_factor. -; transform_result = result of transformation; one of: -; "no" -- cannot transform -; terrain section -- transformation changes to that -; terrain -; transform_time = time to transform; if 0, cannot transform -; pillage_time = time to pillage extra from the tile (0 = impossible) -; Nonzero values only affect extras with removal_time 0. -; clean_pollution_time = time for 'clean pollution' activity (0 = impossible) -; Nonzero values only affect extras with removal_time 0. -; clean_fallout_time = time for 'clean fallout' activity (0 = impossible) -; Nonzero values only affect extras with removal_time 0. -; animal = unit type that can appear as animal on the terrain -; warmer_wetter_result = result of global warming for wet terrains; one of: -; "no" -- no change; does not count for warming -; "yes" -- no change; counts for warming -; terrain section -- warming changes to that terrain -; warmer_drier_result = result of global warming for dry terrains; -; see warmer_wetter_result -; cooler_wetter_result = result of nuclear winter for wet terrains; -; see warmer_wetter_result -; cooler_drier_result = result of nuclear winter for dry terrains; -; see warmer_wetter_result -; native_to = List of unit classes that can move here -; flags = General flags for this terrain. List taken from the -; following, and/or any user flags defined above: -; - NoBarbs = Barbarians will not be spawned here. -; - NoCities = Cities may not be built or found on this terrain. -; - Starter = Players will only be started on "Starter" terrain. -; (Currently this cannot be Oceanic terrain.) -; - CanHaveRiver = Set to 1 if this terrain can have river on it (the -; actual chance of river generation is controlled -; separately). -; - UnsafeCoast = This terrain does not provide a safe voyage for -; units with flag "Trireme" -; - FreshWater = This terrain is used for small bodies of water. -; If this becomes adjacent to non-FreshWater terrain, -; the whole contiguous FreshWater area will be flooded -; with the non-FreshWater terrain. -; - NotGenerated = Map generator never places this terrain type. It can -; be added from editor only, or by ingame events -; (lua scripting) -; - NoZoc = Units on this terrain are not generating or subject -; to zoc -; - NoFortify = Units cannot fortify on this terrain -; - Frozen = Frozen/polar terrain. For water tiles, Frozen terrain -; is generated near poles. Conversion between frozen -; and unfrozen terrain can be controlled with -; thaw_requirement/freeze_requirement, and Frozen -; terrain is shown differently on the overview map. -; property_* = specific property % values used by mapgen. Most -; terrains will have 0 for most values. Properties -; other than ocean_depth are only used for land tiles. -; - mountainous = degree to which this terrain is mountainous -; - green = how much life this terrain has -; - foliage = how much thick undergrowth the terrain has -; - tropical = how "tropical" the terrain is (high temperature) -; - temperate = how "temperate" the terrain is (med temperature) -; - cold = how "cold" the terrain is (low temperature) -; - frozen = how "frozen" the terrain is (very low temperature) -; (does not necessarily have to have the "Frozen" flag) -; - wet = how "wet" the terrain is (moisture) -; - dry = how "dry" the terrain is (moisture) -; - ocean_depth = the depth of an ocean, as an average level -; color.r = color of the terrain (red value) -; color.g = color of the terrain (green value) -; color.b = color of the terrain (blue value) -; helptext = optional help text string; should escape all raw -; newlines so that xgettext parsing works -; -; */ <-- avoid gettext warnings - -[terrain_inaccesible] -name = _("Inaccessible") -graphic = "inaccessible" -graphic_alt = "arctic" -identifier = "i" -class = "Land" -movement_cost = 0 -defense_bonus = 0 -food = 0 -shield = 0 -trade = 0 -road_food_incr_pct = 0 -road_shield_incr_pct = 0 -road_trade_incr_pct = 0 -base_time = 0 -road_time = 0 -irrigation_result = "no" -irrigation_food_incr = 0 -irrigation_time = 0 -mining_result = "no" -mining_shield_incr = 0 -mining_time = 0 -transform_result = "no" -transform_time = 0 -pillage_time = 0 -clean_pollution_time = 0 -clean_fallout_time = 0 -animal = "None" -warmer_wetter_result = "no" -warmer_drier_result = "no" -cooler_wetter_result = "no" -cooler_drier_result = "no" -flags = "NotGenerated", "NoPollution", "NoCities", "UnsafeCoast", "Frozen" -color.r = 25 -color.g = 25 -color.b = 25 -helptext = _("\ -No unit can enter this terrain, nor can any city work its tiles.\ -") - -[terrain_lake] -name = _("Lake") -graphic = "lake" -graphic_alt = "coast" -identifier = "+" -class = "Oceanic" -movement_cost = 1 -defense_bonus = 0 -food = 1 -shield = 0 -trade = 2 -resources = "Fish" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 0 -irrigation_result = "no" -irrigation_food_incr = 0 -irrigation_time = 0 -mining_result = "no" -mining_shield_incr = 0 -mining_time = 0 -transform_result = "Swamp" -transform_time = 36 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "no" -warmer_drier_result = "Swamp" -cooler_wetter_result = "Arctic" -cooler_drier_result = "Tundra" -native_to = "Sea", "Air", "Balloon", "Missile", "Helicopter", "Trireme", "RiverShip", "Submarine", "AirProtect", "AirPillage", "Bomb" -flags = "NoCities", "NoBarbs", "NoPollution", "FreshWater", "NoZoc", "NoFortify" -property_ocean_depth = 0 -color.r = 46 -color.g = 120 -color.b = 182 -helptext = _("\ -Lakes are bodies of fresh water not connected to sea or ocean.\ -") - -[terrain_ocean] -name = _("Ocean") -graphic = "coast" -graphic_alt = "-" -identifier = " " -class = "Oceanic" -movement_cost = 1 -defense_bonus = 0 -food = 1 -shield = 0 -trade = 2 -resources = "Fish", "Whales" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 0 -irrigation_result = "no" -irrigation_food_incr = 0 -irrigation_time = 0 -mining_result = "no" -mining_shield_incr = 0 -mining_time = 0 -transform_result = "Swamp" -transform_time = 36 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "no" -warmer_drier_result = "Swamp" -cooler_wetter_result = "Arctic" -cooler_drier_result = "Arctic" -native_to = "Sea", "Air", "Balloon", "Missile", "Helicopter", "Trireme", "RiverShip", "Submarine", "AirProtect", "AirPillage", "Bomb" -flags = "NoCities", "NoPollution", "UnsafeCoast", "NoZoc", "NoFortify" -property_ocean_depth = 32 -color.r = 0 -color.g = 46 -color.b = 137 -helptext = _("\ -Shallow oceans are mostly found near coastlines, and are often rich\ - sources of food and other resources.\ -") - -[terrain_deep_ocean] -name = _("Deep Ocean") -graphic = "floor" -graphic_alt = "coast" -identifier = ":" -class = "Oceanic" -movement_cost = 1 -defense_bonus = 0 -food = 1 -shield = 0 -trade = 2 -;resources = "none" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 0 -irrigation_result = "no" -irrigation_food_incr = 0 -irrigation_time = 0 -mining_result = "no" -mining_shield_incr = 0 -mining_time = 0 -transform_result = "no" -transform_time = 0 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "no" -warmer_drier_result = "no" -cooler_wetter_result = "no" -cooler_drier_result = "no" -native_to = "Trireme", "Sea", "Air", "Balloon", "Missile", "Helicopter", "RiverShip", "Submarine", "AirProtect", "AirPillage", "Bomb" -flags = "NoCities", "NoPollution", "UnsafeCoast", "NoZoc", "NoFortify" -property_ocean_depth = 87 -color.r = 0 -color.g = 33 -color.b = 129 -helptext = _("\ -Deep oceans cover much of the world away from coastlines, and only\ - seaworthy units can travel on them.\ -") - -[terrain_arctic] -name = _("Arctic") -graphic = "arctic" -graphic_alt = "-" -identifier = "a" -class = "Land" -movement_cost = 2 -defense_bonus = 0 -food = 0 -shield = 0 -trade = 0 -resources = "Ivory", "Oil" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 4 -irrigation_result = "Tundra" -irrigation_food_incr = 0 -irrigation_time = 15 -mining_result = "yes" -mining_shield_incr = 2 -mining_time = 10 -transform_result = "Desert" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Tundra" -warmer_drier_result = "Tundra" -cooler_wetter_result = "no" -cooler_drier_result = "no" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "NoBarbs", "NoCities", "CanHaveRiver", "Oil", "Frozen" -property_frozen = 23 -color.r = 232 -color.g = 232 -color.b = 232 -helptext = _("\ -Arctic terrain is cold icy permafrost, found only in the far north or south.\ -"), _("\ - Oil wells can be built when Refining is known.\ -") - -[terrain_desert] -name = _("Desert") -graphic = "desert" -graphic_alt = "-" -identifier = "d" -class = "Land" -movement_cost = 1 -defense_bonus = 0 -food = 0 -shield = 1 -trade = 0 -resources = "Oasis", "Oil" -road_trade_incr_pct = 100 -base_time = 1 -road_time = 2 -irrigation_result = "yes" -irrigation_food_incr = 1 -irrigation_time = 5 -mining_result = "yes" -mining_shield_incr = 1 -mining_time = 5 -transform_result = "Plains" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Grassland" -warmer_drier_result = "no" -cooler_wetter_result = "Plains" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "CanHaveRiver", "Oil", "Low Land" -property_dry = 75 -property_tropical = 40 -property_temperate = 26 -color.r = 214 -color.g = 185 -color.b = 106 -helptext = _("\ -Deserts are very dry. Agriculture is difficult if not on a river or oasis. \ -"), _("\ -Oil wells can be built when Construction is known.\ -") - -[terrain_forest] -name = _("Forest") -graphic = "forest" -graphic_alt = "-" -identifier = "f" -class = "Land" -movement_cost = 2 -defense_bonus = 33 -food = 1 -shield = 2 -trade = 0 -resources = "Pheasant", "Silk" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 4 -irrigation_result = "Plains" -irrigation_food_incr = 0 -irrigation_time = 5 -mining_result = "Swamp" -mining_shield_incr = 0 -mining_time = 15 -transform_result = "Grassland" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Jungle" -warmer_drier_result = "Plains" -cooler_wetter_result = "Swamp" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "Starter", "CanHaveRiver", "Low Land" -property_cold = 35 -property_frozen = 7 -property_mountainous = 15 -property_wet = 30 -property_foliage = 50 -property_temperate = 50 -color.r = 43 -color.g = 107 -color.b = 19 -helptext = _("\ -Forests are densely wooded, providing lumber for production, but\ - making agriculture somewhat problematic.\ -") - -[terrain_grassland] -name = _("Grassland") -graphic = "grassland" -graphic_alt = "-" -identifier = "g" -class = "Land" -movement_cost = 1 -defense_bonus = 0 -food = 2 -shield = 0 -trade = 0 -resources = "Resources" -road_trade_incr_pct = 100 -base_time = 1 -road_time = 2 -irrigation_result = "yes" -irrigation_food_incr = 1 -irrigation_time = 5 -mining_result = "Forest" -mining_shield_incr = 0 -mining_time = 10 -transform_result = "Hills" -transform_time = 30 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Lake" -warmer_drier_result = "Desert" -cooler_wetter_result = "Arctic" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "Starter", "CanHaveRiver", "Low Land" -property_green = 50 -property_temperate = 50 -property_cold = 12 -property_dry = 10 -property_tropical = 20 -color.r = 11 -color.g = 138 -color.b = 4 -helptext = _("\ -Grassland affords exceptional agricultural opportunities.\ -") - -[terrain_hills] -name = _("Hills") -graphic = "hills" -graphic_alt = "-" -identifier = "h" -class = "Land" -movement_cost = 2 -defense_bonus = 100 -food = 1 -shield = 0 -trade = 0 -resources = "Coal", "Wine" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 4 -irrigation_result = "yes" -irrigation_food_incr = 1 -irrigation_time = 10 -mining_result = "yes" -mining_shield_incr = 3 -mining_time = 10 -transform_result = "Plains" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "no" -warmer_drier_result = "no" -cooler_wetter_result = "no" -cooler_drier_result = "no" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "Starter", "CanHaveRiver" -property_green = 50 -property_mountainous = 35 -property_cold = 35 -property_frozen = 20 -property_dry = 15 -color.r = 24 -color.g = 97 -color.b = 5 -helptext = _("\ -Hills are frequently rich in resources. Difficult access makes\ - them good for defense but poor for trade.\ -") - -[terrain_jungle] -name = _("Jungle") -graphic = "jungle" -graphic_alt = "-" -identifier = "j" -class = "Land" -movement_cost = 2 -defense_bonus = 50 -food = 1 -shield = 1 -trade = 0 -resources = "Gems", "Fruit", "Rubber" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 4 -irrigation_result = "Grassland" -irrigation_food_incr = 0 -irrigation_time = 8 -mining_result = "Forest" -mining_shield_incr = 0 -mining_time = 10 -transform_result = "Plains" -transform_time = 12 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Lake" -warmer_drier_result = "Desert" -cooler_wetter_result = "Swamp" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "CanHaveRiver", "Low Land" -property_foliage = 45 -property_tropical = 50 -property_wet = 45 -color.r = 55 -color.g = 156 -color.b = 38 -helptext = _("\ -Jungles are densely overgrown but sometimes provide rich resources and good defense.\ -") - -[terrain_mountains] -name = _("Mountains") -graphic = "mountains" -graphic_alt = "-" -identifier = "m" -class = "Land" -movement_cost = 3 -defense_bonus = 200 -food = 0 -shield = 1 -trade = 0 -resources = "Gold", "Iron" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 6 -irrigation_result = "no" -irrigation_food_incr = 0 -irrigation_time = 0 -mining_result = "yes" -mining_shield_incr = 1 -mining_time = 10 -transform_result = "Hills" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "no" -warmer_drier_result = "no" -cooler_wetter_result = "no" -cooler_drier_result = "no" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "CanHaveRiver" -property_mountainous = 65 -property_cold = 50 -color.r = 129 -color.g = 127 -color.b = 118 -helptext = _("\ -Mountains are regions of extreme altitude, excellent for defense but inferior\ - for trade and agriculture.\ -") - -[terrain_plains] -name = _("Plains") -graphic = "plains" -graphic_alt = "-" -identifier = "p" -class = "Land" -movement_cost = 1 -defense_bonus = 0 -food = 1 -shield = 1 -trade = 0 -resources = "Buffalo", "Wheat" -road_trade_incr_pct = 100 -base_time = 1 -road_time = 2 -irrigation_result = "yes" -irrigation_food_incr = 1 -irrigation_time = 5 -mining_result = "Forest" -mining_shield_incr = 0 -mining_time = 15 -transform_result = "Grassland" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Lake" -warmer_drier_result = "Desert" -cooler_wetter_result = "Arctic" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "Starter", "CanHaveRiver", "Low Land" -property_green = 50 -property_frozen = 5 -property_dry = 16 -property_cold = 28 -property_tropical = 10 -property_temperate = 50 -property_mountainous = 15 -color.r = 122 -color.g = 156 -color.b = 46 -helptext = _("\ -Plains are broad flat regions with decent potential for\ - agriculture, production, and trade.\ -") - -[terrain_swamp] -name = _("Swamp") -graphic = "swamp" -graphic_alt = "-" -identifier = "s" -class = "Land" -movement_cost = 2 -defense_bonus = 33 -food = 1 -shield = 0 -trade = 0 -resources = "Peat", "Spice" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 4 -irrigation_result = "Grassland" -irrigation_food_incr = 0 -irrigation_time = 15 -mining_result = "Forest" -mining_shield_incr = 0 -mining_time = 15 -transform_result = "Lake" -transform_time = 12 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Lake" -warmer_drier_result = "Desert" -cooler_wetter_result = "Arctic" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "CanHaveRiver", "Low Land" -property_wet = 100 -property_frozen = 3 -property_tropical = 10 -property_temperate = 10 -property_cold = 17 -color.r = 48 -color.g = 85 -color.b = 97 -helptext = _("\ -Swamps suffer from an over-abundance of water, making agriculture\ - and trade problematic.\ -") - -[terrain_tundra] -name = _("Tundra") -graphic = "tundra" -graphic_alt = "-" -identifier = "t" -class = "Land" -movement_cost = 1 -defense_bonus = 0 -food = 1 -shield = 0 -trade = 0 -resources = "Game", "Furs", "Game", "Furs", "Gold" ; 40/40/20 instead of 33/33/33 -road_trade_incr_pct = 100 -base_time = 1 -road_time = 2 -irrigation_result = "yes" -irrigation_food_incr = 1 -irrigation_time = 5 -mining_result = "Desert" -mining_shield_incr = 0 -mining_time = 15 -transform_result = "Plains" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Lake" -warmer_drier_result = "Desert" -cooler_wetter_result = "Arctic" -cooler_drier_result = "no" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "Starter", "NoBarbs", "CanHaveRiver", "Low Land" -property_cold = 38 -property_frozen = 45 -color.r = 188 -color.g = 188 -color.b = 188 -helptext = _("\ -Tundra regions are cold and barren, only fit for mediocre agriculture and trade.\ -") - -; /* <-- avoid gettext warnings -; -; Resource types: -; -; The actual tag used (the * in [resource_*]) must be unique for each resource, -; and may be used in debug output when reading this file. -; -; Notes: -; -; extra = name of the extra this resource section is part of -; (must have "Resource" in its causes) -; identifier = single-character identifier used in old savegames. This -; must be unique for each resource, and changing it will -; break loading those old savegames. -; food = increased food production -; shield = increased shield production -; trade = increased trade production -; -; */ <-- avoid gettext warnings - -[resource_gold] -extra = "Gold" -identifier = "$" -trade = 8 -# mountains, tundra - -[resource_iron] -extra = "Iron" -identifier = "/" -shield = 3 -# mountains. - -[resource_game] -extra = "Game" -identifier = "e" -food = 2 -shield = 2 -# tundra. - -[resource_furs] -extra = "Furs" -identifier = "u" -food = 1 -shield = 1 -trade = 3 -# tundra - -[resource_coal] -extra = "Coal" -identifier = "c" -shield = 2 -# hills. - -[resource_fish] -extra = "Fish" -identifier = "y" -food = 2 -# ocean. - -[resource_fruit] -extra = "Fruit" -identifier = "f" -food = 4 -trade = 2 -# jungle. - -[resource_gems] -extra = "Gems" -identifier = "g" -trade = 5 -# jungle. - -[resource_rubber] -extra = "Rubber" -identifier = "^" -shield = 2 -trade = 2 -# jungle. - -; "h" reserved for strategic horses - -[resource_buffalo] -extra = "Buffalo" -identifier = "b" -shield = 2 -# plains (horses => buffalo => cattle). - -[resource_forest_game] -extra = "Deer" -identifier = "d" -;food = 3 ;food added in effects because only generated resources tied to a terrain type can access this var - -[resource_wild_boar] -extra = "Wild Boar" -identifier = "q" -;food = 3 ;food added in effects because only generated resources tied to a terrain type can access this var - - -[resource_wheat] -extra = "Wheat" -identifier = "j" -food = 2 -# plains. - -; "k" reserved for (cane) sugar - -; "l" reserved for tobacco - -; "m" reserved for marble - -[resource_oasis] -extra = "Oasis" -identifier = "o" -food = 3 -# desert. - -[resource_peat] -extra = "Peat" -identifier = "a" -shield = 4 -# swamp (petroleum => peat => petroleum). - -[resource_pheasant] -extra = "Pheasant" -identifier = "p" -food = 2 -# forest, forested. - -; "r" reserved for rubber - -[resource_bonus] -extra = "Resources" -identifier = "r" -shield = 1 -# grassland. - -[resource_icy_ivory] -extra = "Ivory" -identifier = "i" -food = 1 -shield = 1 -trade = 4 -# arctic - -[resource_silk] -extra = "Silk" -identifier = "s" -trade = 3 -# forest - -[resource_spice] -extra = "Spice" -identifier = "t" -food = 2 -trade = 4 -# swamp-only. - -; "u" reserved for uranium - -[resource_whales] -extra = "Whales" -identifier = "v" -food = 1 -shield = 1 -# ocean (sea). - -[resource_wine] -extra = "Wine" -identifier = "w" -trade = 4 -# hills-only. - -[resource_oil] -extra = "Oil" -identifier = "x" -shield = 3 ; arctic used to have 4, now it's 3+2 allowing an 0 2 0 tile. -# arctic, desert - - -[extraui] -; Player visible names of the base gui types. -ui_name_base_fortress = _("?gui_type:Build Fort/Buoy") -ui_name_base_airbase = _("?gui_type:Build Airbase") - -; /* <-- avoid gettext warnings -; -; Each extra, including bases, roads, and resource, must have a section here. -; Bases, roads, and resources have additional sections for their specific features. -; -; -; Extra types: -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets -; etc; if not present, "name" is used for this -; purpose too. Since the name used in savegames must -; not change, if you want to rename an item after a -; ruleset has been released, you should set -; "rule_name" to the original value of "name". -; category = How UI should categorize this extra. One of -; "Infra", "Natural", "Nuisance", "Resource", -; or "Bonus" -; causes = events that can create extra type. -; "Irrigation", "Mine", "Hut", "Pollution", "Fallout", -; "Appear", "Resource", "Base", or "Road" -; (the last three require a corresponding -; [resource_*] / [base_*] / [road_*] section) -; rmcauses = events that can remove extra type. -; "CleanPollution", "CleanFallout", "Pillage", or -; "Disappear" -; graphic = tag specifying preferred graphic -; graphic_alt = tag for alternate graphic if preferred graphic is -; not present. Can use eg "-" for no alternate -; graphic -; activity_gfx = tag specifying graphic for unit building extra -; This can be "None" to indicate that graphic sprite -; is not needed. -; act_gfx_alt = tag for alternative graphic for unit building extra -; act_gfx_alt2 = tag for second alternative graphic for unit building extra -; rmact_gfx = tag specifying graphic for unit removing extra -; This can be "None" to indicate that graphic sprite -; is not needed. -; rmact_gfx_alt = tag for alternative graphic for unit removing extra -; reqs = requirements to build the extra (see effects.ruleset -; and README.effects for help on requirements) -; rmreqs = requirements to remove the extra -; appearance_reqs = spontaneous appearance requirements -; disappearance_reqs = spontaneous disappearance requirements -; visibility_req = Tech a player needs to have to see the extra -; This affects visibility only, for all the rules -; extra is still there even if player can't see it. -; buildable = Can extra be built? Defaults to TRUE if extra has -; any causes indicating it can result from worker -; activity. -; generated = Can map generator place the extra? Applicable -; for Hut, Resource, and River extras. -; build_time = how long it takes a unit to build this extra. -; Value of 0 (default) means that terrain- and -; build activity specific time is used instead. -; build_time_factor = This setting take effect only if build_time is 0. -; Terrain and activity specific build time will be -; multiplied by this value (default 1) -; removal_time = how long it takes a unit to remove this extra. -; Value of 0 (default) means that terrain- and -; removal activity specific time is used instead. -; removal_time_factor = This setting take effect only if removal_time is 0. -; Terrain and activity specific removal time will be -; multiplied by this value (default 1) -; defense_bonus = Percent added to defense when tile has the extra -; (default none) -; unit_seen = How opponents see units inside this extra -; "Normal" - Units are seen normally (default) -; "Hidden" - Units are hidden from opponents -; appearance_chance = If extra has cause "Appear" and other requirements -; for its appearance are fulfilled, this tells how big -; chance it has to appear each turn. The chance is 1/10000 -; times this value. -; disappearance_chance = If extra has rmcause "Disappear" and other requirements -; for its disappearance are fulfilled, this tells how big -; chance it has to disappear each turn. The chance is 1/10000 -; times this value. -; native_to = List of unit classes that are considered to -; be inside the extra when they are on same tile -; conflicts = List of extras that cannot be on the same tile. -; Bases with non-zero border_sq automatically conflict -; with each other. -; hidden_by = List of extra types that will make this extra -; type not to show on UI if both present. -; bridged_over = List of extra types that, if present in tile, will prevent -; building this extra if can't be bridged over -; flags -; - "NativeTile" = Native units consider tile native regardless of -; terrain -; - "Refuel" = Native units can use tile as refuel point -; - "TerrChangeRemoves" = Extra gets removed when ever terrain changes even -; if target terrain could support it -; - "AlwaysOnCityCenter" = City center tiles always have this extra type -; regardless of its other requirements -; - "AutoOnCityCenter" = City center tiles will automatically have this -; extra type if the player can build it -; - "ConnectLand" = Road style gfx on Oceanic tiles are drawn to -; connect to adjacent Land tiles even if they have -; no extra. This affects appearance only -; - "GlobalWarming" = Instances of this extra on map count towards -; Global Warming -; - "NuclearWinter" = Instances of this extra on map count towards -; Nuclear Winter -; - "ShowFlag" = Draw owner's flag -; - "NaturalDefense" = Extra's defense bonus will be counted to "Natural" -; defense layer. The defense bonus of all the extras -; located at the tile, native to defending unit, -; is calculated as a 1 + sum of bonuses from the extras -; on the default "Fortification" defense layer multiplied -; by the 1 + sum of bonuses from the extras on the -; "Natural" layer. -; - "NoStackDeath" = Units inside do not die all at once when attacked -; helptext = optional help text string; should escape all raw -; newlines so that xgettext parsing works -; -; */ <-- avoid gettext warnings - -[extra_irrigation] -name = _("Irrigation") -category = "Infra" -causes = "Irrigation" -rmcauses = "Pillage" -graphic = "tx.irrigation" -graphic_alt = "-" -activity_gfx = "unit.irrigation" -act_gfx_alt = "unit.irrigate" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -build_time = 0 -removal_time = 0 -conflicts = "Mine", "Oil Well" -hidden_by = "Farmland" -helptext = _("\ -Irrigating a suitable tile causes it to produce extra food each turn. Most\ - tiles yield +1 extra food. A desert river that does not already benefit\ - from an oasis will yield +2, or +3 if it is a city on a desert river.\ -"), _("\ -Irrigating a tile with a mine or oil well will destroy it.\ -"), _("\ -City center tiles get their terrain irrigation bonus automatically, \ -if there is no conflicting mine or oil well on the tile; however, \ -this does not make cities count as a water source for further \ -irrigation. Irrigation can be built on the city tile simply to allow \ -irrigating elsewhere, but will not give the tile any further bonus \ -except in the case of a desert river (see above.)\ -") - -[extra_mine] -name = _("Mine") -category = "Infra" -causes = "Mine" -rmcauses = "Pillage" -graphic = "tx.mine" -graphic_alt = "-" -activity_gfx = "unit.mine" -act_gfx_alt = "unit.plant" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "TerrainFlag", "Oil", "Local", FALSE, TRUE - } -build_time = 0 -removal_time = 0 -conflicts = "Irrigation", "Farmland" -helptext = _("\ -Mines can be built on some types of terrain, which increases the \ -number of production points produced by that tile. Hills get an extra \ -3 production points per tile; other terrains get 1 extra production \ -point.\ -"), _("\ -Building a mine on an irrigated tile will destroy the irrigation.\ -") - -[extra_oil_well] -name = _("Oil Well") -category = "Infra" -causes = "Mine" -rmcauses = "Pillage" -graphic = "tx.oil_mine" -graphic_alt = "tx.mine" -activity_gfx = "unit.oil_mine" -act_gfx_alt = "unit.mine" -act_gfx_alt2 = "unit.plant" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "quiet" - "TerrainFlag", "Oil", "Local", TRUE - } -build_time = 0 -removal_time = 0 -conflicts = "Irrigation", "Farmland" -helptext = _("\ -Oil wells behave like mines (giving an extra production point), but \ -require more technology. Oil wells can be built on Desert with knowledge \ -of Construction, and on Arctic terrain with knowledge of Refining.\ -"), _("\ -Building an oil well on an irrigated tile will destroy the irrigation.\ -") - -[extra_pollution] -name = _("Pollution") -category = "Nuisance" -causes = "Pollution" -rmcauses = "CleanPollution" -graphic = "tx.pollution" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "unit.pollution" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "TerrainFlag", "NoPollution", "Local", FALSE, TRUE - } -removal_time = 0 -flags = "GlobalWarming" -helptext = _("\ -Pollution appears on land tiles around cities with high production or \ -population. \ -It halves all output from its tile, and contributes to the risk of \ -global warming.\ -"), _("\ -The pollution can only be cleared by dispatching Workers, \ -Settlers, or Engineers with the \"clean pollution\" order.\ -"), _("\ -Pollution from production is likely to start becoming important as \ -your civilization becomes more industrialized, giving you buildings \ -such as Factory and Power Plant which boost production. Replacing a \ -Power Plant with cleaner forms of energy -- a Hydro Plant / Hoover \ -Dam, Nuclear Plant, or Solar Plant -- will reduce pollution from \ -production, as will a Recycling Center or knowledge of \ -Environmentalism.\ -"), _("\ -The city population starts adding to pollution with the discovery of \ -Industrialization, and Automobile, Mass Production, and Plastics make \ -this worse. Building a Mass Transit in a city eliminates the \ -populational contribution to pollution.\ -"), _("\ -The contribution of these factors can be seen in the city dialog; once \ -it exceeds a threshold, the excess is the percent chance of pollution \ -appearing each turn.\ -"), _("\ -When an unused tile becomes polluted, there is the temptation to avoid \ -the effort of cleaning it; but the spread of pollution has far more \ -terrible results than the immediate economic impact -- every polluted \ -tile increases the chance of global warming. Each time global warming \ -advances, the entire world loses coastal land to the sea and to jungles \ -and swamps, and inland tiles are lost to desert. This tends to \ -devastate cities and leads to global impoverishment.\ -"), _("\ -The risk of global warming is cumulative; the longer polluted tiles \ -are left uncleaned, the higher the risk becomes, and the risk can \ -linger for some time even after all pollution has been cleaned. If a \ -long time passes with an elevated risk of warming, its effects will be \ -all the more severe when it does occur.\ -") - -[extra_hut] -name = _("Minor Tribe Village") -rule_name = "Hut" -category = "Bonus" -causes = "Hut" -;rmcauses = "" -graphic = "tx.village" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range" - "TerrainClass", "Land", "Local" - } -helptext = _("\ -Villages (also called \"huts\") are primitive communities spread \ -across the world at the beginning of the game. Any land unit can enter \ -a village, making the village disappear and deliver a random response. \ -If the village proves hostile, it could produce barbarians or the unit \ -entering may simply be destroyed. If they are friendly, the player \ -could receive gold, a new technology, a military unit (occasionally a \ -settler; and sometimes a unit that the player cannot yet create), or \ -even a new city.\ -"), _("\ -Later in the game, helicopters may also enter villages, but overflight \ -by other aircraft will cause the villagers to take fright and disband.\ -") - -[extra_farmland] -name = _("Farmland") -category = "Infra" -causes = "Irrigation" -rmcauses = "Pillage" -graphic = "tx.farmland" -graphic_alt = "-" -activity_gfx = "unit.farmland" -act_gfx_alt = "unit.irrigation" -act_gfx_alt2 = "unit.irrigate" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range" - "Tech", "Refrigeration", "Player" - "Extra", "Irrigation", "Local" - } -build_time = 0 -removal_time = 0 -conflicts = "Mine", "Oil Well" -helptext = _("\ -Once Refrigeration is known, irrigation systems can be upgraded to \ -farmland by irrigating them a second time; if the city working the tile \ -has a Supermarket, a farmland tile provides twice as much food.\ -"), _("\ -Like irrigation, farmland is incompatible with mines and oil wells.\ -") - -[extra_fallout] -name = _("Fallout") -category = "Nuisance" -causes = "Fallout" -rmcauses = "CleanFallout", "Disappear" -graphic = "tx.fallout" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "unit.fallout" -rmact_gfx_alt = "unit.pollution" -reqs = - { "type", "name", "range", "present", "quiet" - "TerrainFlag", "NoPollution", "Local", FALSE, TRUE - } -removal_time = 0 -disappearance_chance = 2000 -disappearance_reqs = - { "type", "name", "range" - } -flags = "NuclearWinter" -helptext = _("\ -Nuclear fallout can appear on land tiles when a Nuclear unit is \ -detonated. It halves all output from its tile.\ -"), _("\ -Every tile with nuclear fallout also increases the risk of global \ -nuclear winter. If nuclear winter occurs, land across the globe \ -changes into desert, tundra, and ice, and lakes and oceans freeze.\ -"), _("\ -Settlers, Workers, and Engineers can clean up nuclear fallout.\ - Nuclear fallout disperses and disappears randomly over time.\ - On average, it lasts for 5 turns.\ -") - -; ***************************** BASES **************************************** -[extra_hideout] -rule_name = "Hideout" -name = _("") ; null name is to prevent awareness of it. -category = "Infra" -causes = "Base" -rmcauses = "Pillage", "Disappear" -graphic = "None" -graphic_alt = "None" -activity_gfx = "unit.hideout" -act_gfx_alt = "unit.buoy" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range","present","quiet" - "CityTile","Center", "Local", FALSE, TRUE - "Terrain", "Hills", "Local", FALSE, FALSE - "Terrain", "Plains", "Local", FALSE, FALSE - "Terrain", "Grassland", "Local", FALSE, FALSE - "Terrain", "Tundra", "Local", FALSE, FALSE - "Terrain", "Desert", "Local", FALSE, FALSE - "Terrain", "Arctic", "Local", FALSE, FALSE - "Tech", "Warrior Code", "Player",TRUE, FALSE - "TerrainClass","Land", "Local", TRUE, FALSE - "UnitFlag","CanHide", "Local", TRUE, FALSE - "Extra", "Naval Base","Local", FALSE, FALSE - "Extra", "Fortress", "Local", FALSE, FALSE - "Extra", "Airbase", "Local", FALSE, FALSE - "Extra", "Fort", "Local", FALSE, FALSE - "Extra", "Quay", "Local", FALSE, FALSE - "ServerSetting","hideouts","World",TRUE, FALSE - } -disappearance_reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - "Extra", "Ruins","Local", FALSE - } -disappearance_chance = 1500 ; 1500/10000 = 15% per turn if unoccupied -build_time = 3 -removal_time = 0 -unit_seen = "Hidden" -native_to = "Land", "LandAirSea", "LandNoKill", "Helicopter" -flags = "NativeTile" -helptext = _("\ -Since the dawn of time, camouflaged and concealed terrain has been\ - enhanced to make Hideouts. Usually the intent is to evade an\ - aggressor or to set an ambush. Hideouts can only be put in Forests,\ - Swamps, Mountains, and Jungle. Warrior Code must be known. Tile must\ - be Friendly or Unclaimed. Only Foot soldiers can make Hideouts. Only\ - Land units and Helicopters can hide in them. Other types will be seen.\ - Invisibility is the only bonus of a Hideout. Hideouts can't stack with\ - other bases. Hideouts are invisible to anyone not occupying the tile with\ - a Land unit. For each turn it is unoccupied, a Hideout has a 15% chance\ - of being lost to the elements of nature. The only way to know if there is\ - a Hideout on a tile is to move a Land unit onto it.\ -"), _(" -TIP: Hideouts are good for guarding a border or setting a trap for\ - intruders. Be careful! An abandoned Hideout can be used against you!\ -") - -[extra_fort] -name = _("Fort") -category = "Infra" -causes = "Base" -rmcauses = "Pillage" -graphic = "base.outpost" -graphic_alt = "base.fortress" -activity_gfx = "unit.outpost" -act_gfx_alt = "unit.fortress" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Masonry", "Player", TRUE, FALSE - "TerrainClass", "Land", "Local", TRUE, FALSE - "UnitFlag", "CanFortress", "Local", TRUE, FALSE - "CityTile", "Center", "Local", FALSE, TRUE - "Extra", "Hideout", "Local", FALSE, FALSE - } -build_time = 3 -removal_time = 0 -native_to = "Land", "LandAirSea", "LandNoKill", "Helicopter", "Balloon", "AirProtect" -hidden_by = "Fortress", "Naval Base" -flags = "NativeTile", "NoStackDeath" ;, "Refuel" -;NOTE: effect_fortress_regen should give 25% of 20HP to helicopter, +1hp for being stationary -;thus a fortress should give +6hp -2hp for not being in refuel spot or +4hp/turn. Healing 67% -;as fast as an airbase. MEANWHILE, removing the refuel flag allows us to make Forts native -;to AirProtect so that they cannot prevent attacks on forts. This is debatable issue of -;Fort with no Killstack but not Airprotected vs no fort, Killstack and Airprotect, but -;many times fighters over forts have come up as a dynamic. -helptext = _("\ -Forts are rapidly built fortifications which give Land units +33% defense\ - against Land and Sea units. Defending units are lost one at a time instead\ - of the entire stack dying. A fort is necessary to start building a fortress.\ -"), _(" -TIP: Forts make great outposts for keeping watch on your borders. Be careful--\ -an unmanned Fort can be claimed by a foreign unit.\ -") - -[extra_fortress] -name = _("Fortress") -category = "Infra" -causes = "Base" -rmcauses = "Pillage" -graphic = "base.fortress" -graphic_alt = "-" -activity_gfx = "unit.fortress" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "Extra", "Fort", "Local", TRUE, FALSE - "Extra", "Hideout", "Local", FALSE, FALSE - "Tech", "Construction", "Player", TRUE, FALSE - "TerrainClass", "Land", "Local", TRUE, FALSE - "UnitFlag", "CanFortress", "Local", TRUE, FALSE - "CityTile", "Center", "Local", FALSE, TRUE - } -build_time = 5 -removal_time = 0 -defense_bonus = 67 -native_to = "Land", "LandAirSea", "LandNoKill", "Helicopter", "Balloon" -hidden_by = "Naval Base" -flags = "NativeTile", "Refuel", "NoStackDeath" -helptext = _("\ -Fortresses are improvements built on top of Forts which greatly improve defense.\ - A Land unit remaining in a fortress for a whole turn without moving recovers a\ - quarter of its hit points. With Invention, fortresses gain watchtowers from which\ - land units can see farther.\ -"), _("\ -Units in a Fortress die one at a time instead of the entire stack being lost.\ -Diplomatic units get a 25% defense bonus in diplomatic fights.\ -") - -[extra_navalbase] -name = _("Naval Base") -category = "Infra" -causes = "Base" -rmcauses = "Pillage" -graphic = "base.navalbase" -graphic_alt = "base.fortress" -activity_gfx = "unit.navalbase" -act_gfx_alt = "unit.fortress" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "Extra", "Fort", "Local", TRUE, FALSE - "Extra", "Hideout", "Local", FALSE, FALSE - "Tech", "Engineering", "Player", TRUE, FALSE - "TerrainFlag", "Low Land", "Local", TRUE, FALSE - "TerrainClass", "Oceanic", "CAdjacent", TRUE, FALSE - "UnitFlag", "CanFortress", "Local", TRUE, FALSE - "CityTile", "Center", "Local", FALSE, TRUE - } -build_time = 8 -removal_time = 0 -conflicts = "Airbase", "Fortress" -defense_bonus = 67 -native_to = "Trireme", "RiverShip", "Sea", "Submarine", "Balloon", - "Land", "LandAirSea", "LandNoKill", "Helicopter" -flags = "NativeTile", "NoStackDeath", "Refuel" -helptext = _("\ -Naval bases are coastal Fortresses with ocean access. They allow ships to enter and\ - receive a 1.33x bonus from superior fortifications and defensive position. Naval\ - Bases are built into Fortresses--all other units get the benefits of a Fortress.\ -"), _(" -NOTE: Naval bases are the only location where ships can be sure to avoid stack death without\ - suffering a defense disadvantage.\ -") - -[extra_airbase] -name = _("Airbase") -category = "Infra" -causes = "Base" -rmcauses = "Pillage" -graphic = "base.airbase" -graphic_alt = "-" -activity_gfx = "unit.airbase" -act_gfx_alt = "unit.fortress" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Radio", "Player", TRUE, FALSE - "Extra", "Hideout", "Local", FALSE, FALSE - "TerrainClass", "Land", "Local", TRUE, FALSE - "UnitFlag", "Airbase", "Local", TRUE, FALSE - "CityTile", "Center", "Local", FALSE, TRUE - } -build_time = 3 -removal_time = 0 -native_to = "Air", "Balloon", "Helicopter", "Missile", "Bomb", "AirProtect", "AirPillage" -flags = "Refuel", "NoStackDeath" -helptext = _("\ -Airbases allow your air units to land and refuel outside cities. \ -Air units in an airbase may be attacked by land units.\ -"), _("\ -Units can paradrop from this tile.\ -") - -[extra_radar] -name = _("Radar") -category = "Infra" -causes = "Base" -rmcauses = "Pillage" -graphic = "base.airbase" -graphic_alt = "-" -activity_gfx = "unit.radar" -act_gfx_alt = "unit.airbase" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Radar", "Player", TRUE, FALSE - "Extra", "Hideout", "Local", FALSE, FALSE - "Extra", "Airbase", "Local", TRUE, FALSE - "TerrainClass", "Land", "Local", TRUE, FALSE - "UnitFlag", "Airbase", "Local", TRUE, FALSE - "CityTile", "Center", "Local", FALSE, TRUE - } -build_time = 5 -removal_time = 0 -native_to = "Air", "Balloon", "Helicopter", "Missile", "Bomb", "AirProtect", "AirPillage" -flags = "Refuel", "NoStackDeath" -helptext = _("\ -With the available tech, Radar can be added to an Airbase, which significantly increases its vision.\ -") - -[extra_buoy] -name = _("Buoy") -category = "Infra" -causes = "Base" -rmcauses = "Pillage" -graphic = "base.buoy" -graphic_alt = "base.fortress" -activity_gfx = "unit.buoy" -act_gfx_alt = "unit.fortress" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Radio", "Player", TRUE, FALSE - "TerrainClass", "Oceanic", "Local", TRUE, FALSE - "UnitFlag", "Airbase", "Local", TRUE, FALSE - "CityTile", "Center", "Local", FALSE, TRUE - } -build_time = 3 -removal_time = 0 -flags = "ShowFlag" -helptext = _("\ -Buoys may be built in the ocean (by units on a sea-going vessel) to \ -allow their owner to see the surrounding tiles.\ -") - -[extra_ruins] -name = _("Ruins") -category = "Bonus" -;causes = "" -rmcauses = "Pillage" -graphic = "extra.ruins" -graphic_alt = "base.ruins" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "TerrainClass", "Land", "Local", TRUE, FALSE - "CityTile", "Center", "Local", FALSE, TRUE - } -buildable = FALSE -removal_time = 0 -flags = "TerrChangeRemoves" -helptext = _("\ -Ruins mark the former site of a city that was destroyed or abandoned.\ -") - -[extra_quay] -name = _("Quay") -category = "Infra" -causes = "Road" -rmcauses = "Pillage" -graphic = "base.quay" -graphic_alt = "base.fort" -activity_gfx = "unit.quay" -act_gfx_alt = "unit.outpost" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" -; "Extra", "River", "Local", TRUE, FALSE - "ExtraFlag", "Quayable", "Local", TRUE, FALSE - "Tech", "Pottery", "Player",TRUE, FALSE - "TerrainClass","Land", "Local", TRUE, FALSE - "UnitFlag", "CanFortress","Local", TRUE, TRUE - "Extra", "Hideout", "Local", FALSE, TRUE - } -build_time = 3 -removal_time = 0 -native_to = "Land", "LandAirSea", "LandNoKill", "Trireme", "Balloon", "RiverShip" -;hidden_by = "" -flags = "NativeTile", "AutoOnCityCenter" -helptext = _("\ -Quays are structures on both sides of rivers, where boats dock parallel to the\ - river bank for quick loading and unloading. River traffic can directly offload\ - onto nearby roads and be underway. Quays also have built-in infrastructure to ferry\ - units across a river——the ancient way to cross rivers before the advent of Bridge\ - Building. Stepping from a road onto a Quay uses a full move point: the time needed\ - to load up and use its infrastructure. Any unit already on a Quay can immediately\ - step onto connecting roads at no penalty. (Cargo units must first be unloaded by\ - the transport carrying them.)\ -"), _(" -TIP: Quays can boost transportational logistics for ancient civilisations who have\ - built on rivers. Don't be tempted to make too many Quays. The unloading and movement\ - bonus is often the extra edge an enemy needs for an effective surprise attack.\ -"), _("Moves needed to cross a river to a tile on the other side:\n -⁶⁄₃ moves: No infrastructure.\n\ -⁴⁄₃ moves: Quay connected to roads.\n\ -2⁄₃ moves: Bridge connected to roads.\n\ -") - -[extra_road] -name = _("Road") -category = "Infra" -causes = "Road" -rmcauses = "Pillage" -graphic = "road.road" -graphic_alt = "-" -activity_gfx = "unit.road" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range" - "UnitFlag", "CanRoad", "Local" - "TerrainClass", "Land", "Local" - } -build_time = 0 -removal_time = 0 -native_to = "Land", "LandNoKill", "LandAirSea", "LandRoad" -hidden_by = "Railroad", "Maglev", "Naval Base" -flags = "AutoOnCityCenter", "NativeTile" -bridged_over = "River" -helptext = _("\ -Roads allow your land units to move more quickly, and on some terrain,\ - also provide a trade bonus.\ -"), _("\ -Building roads on river tiles requires knowledge of Bridge Building.\ - City center tiles automatically get roads (unless they are on a river\ - tile and you do not yet know Bridge Building).\ -") - -[extra_railroad] -name = _("Railroad") -category = "Infra" -causes = "Road" -rmcauses = "Pillage" -graphic = "road.rail" -graphic_alt = "-" -activity_gfx = "unit.rail" -act_gfx_alt = "unit.road" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range" - "Tech", "Railroad", "Player" - "Extra", "Road", "Local" - "UnitFlag", "CanRoad", "Local" - "TerrainClass", "Land", "Local" - } -build_time = 3 -removal_time = 0 -native_to = "Land", "LandNoKill", "LandAirSea", "LandRail" -hidden_by = "Maglev", "Naval Base" -flags = "AutoOnCityCenter", "NativeTile" -bridged_over = "River" -helptext = _("\ -Once you learn Railroad technology, you may upgrade your roads to\ - railroads. Units travel three times faster along railroads than\ - along roads.\ -"), _("\ -A railroad also increases any shield resources produced by a tile.\ - A tile whose road is upgraded to a railroad retains any trade bonus\ - from the road as well.\ -"), _("\ -City center tiles with roads are automatically upgraded to railroads\ - when you learn the Railroad technology.\ -") - -[extra_maglev] -name = _("Maglev") -category = "Infra" -causes = "Road" -rmcauses = "Pillage" -graphic = "road.maglev" -graphic_alt = "road.rail" -activity_gfx = "unit.maglev" -act_gfx_alt = "unit.road" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Superconductors", "Player", TRUE, FALSE -; "Extra", "Railroad", "Local", TRUE, FALSE - "UnitFlag", "CanRoad", "Local", TRUE, FALSE -; "UnitClass", "Sea", "Local", FALSE, TRUE -; "TerrainClass", "Land", "Local", TRUE, FALSE - } -build_time = 3 -removal_time = 0 -native_to = "Land", "LandNoKill", "LandAirSea" -hidden_by = "Naval Base" -flags = "NativeTile", "AutoOnCityCenter" -helptext = _("\ -With Superconductors, you may build MAGnetic LEVitation tracks\ - on tiles. Land units expend no movement points\ - when riding a MagLev; you may ride indefinitely.\ -"), _("\ -City center tiles with railroads are automatically upgraded to MagLev\ - when you learn about Superconductors.\ -") - -[extra_river] -name = _("River") -category = "Infra" ;TEST for well-digger -causes = "Road" -;rmcauses = "" -graphic = "road.river" -graphic_alt = "-" -activity_gfx = "unit.canal" -act_gfx_alt = "unit.oil_mine" -act_gfx_alt2 = "unit.road" -rmact_gfx = "None" -rmact_gfx_alt = "-" -buildable = TRUE -generated = TRUE -defense_bonus = 33 -reqs = - { "type", "name", "range", "present" - "TerrainClass", "Land", "Local", TRUE - "Tech", "Pottery", "Player", FALSE - "Tech", "Alphabet","Player", FALSE - "Tech", "Writing", "World", FALSE - "UnitFlag", "Well-Digger", "Local", TRUE - "Age", "10", "Local", FALSE - } -build_time = 2 -removal_time = 0 -flags = "NativeTile", "Quayable", "IrrigationSource" -native_to = "Land", "LandNoKill", "LandAirSea", "Trireme", "RiverShip" -helptext = _("\ -Any land terrain type may have a River on it. A River adds 1\ - trade to the resources produced by that tile. It also increases the tile\ - defense factor by 50%. Finally, land units may move along a River (but\ - not diagonally) for fast travel.\ -"), _("\ -Roads, railroads and MagLev can only be built on River tiles if your\ - civilization has learned Bridge Building technology.\ -") - -[extra_canal] -name = _("Canal") -category = "Infra" -causes = "Road" -rmcauses = "Pillage" -graphic = "road.canal" -graphic_alt = "road.river" -activity_gfx = "unit.canal" -act_gfx_alt = "unit.convert" -act_gfx_alt2 = "unit.airstrip" -rmact_gfx = "None" -rmact_gfx_alt = "-" -generated = FALSE -reqs = - { "type", "name", "range", "present" - "TerrainFlag", "Low Land", "Local", TRUE - "TerrainClass", "Oceanic", "Adjacent", TRUE - "Tech", "Engineering", "Player", TRUE - "UnitFlag", "CanRoad", "Local", TRUE - } -build_time = 10 -removal_time = 0 -native_to = "Trireme", "Sea", "RiverShip", "Land", "LandAirSea", "LandNoKill", "Helicopter", "Submarine" -flags = "NativeTile", "Quayable" -helptext = _("\ -Canals allow ships to travel through land tiles. Canals can be built on \ -low land tiles only, and not far inland.\ -") -[extra_canal2] -name = _("Waterway") -category = "Infra" -causes = "Road" -rmcauses = "Pillage" -graphic = "road.canal" -graphic_alt = "road.river" -activity_gfx = "unit.canal" -act_gfx_alt = "unit.convert" -act_gfx_alt2 = "unit.airstrip" -rmact_gfx = "None" -rmact_gfx_alt = "-" -generated = FALSE -reqs = - { "type", "name", "range", "present" - "TerrainFlag", "Low Land", "Local", TRUE - "Extra", "River", "Adjacent", TRUE - "Tech", "Engineering", "Player", TRUE - "UnitFlag", "CanRoad", "Local", TRUE - } -build_time = 10 -removal_time = 0 -native_to = "Trireme", "Sea", "RiverShip", "Land", "LandAirSea", "LandNoKill", "Helicopter", "Submarine" -flags = "NativeTile", "Quayable" -helptext = _("\ -Waterways are navigational channels that connect canals with rivers. Essentially, they're the same as canals.\ -") - -[extra_gold] -name = _("Gold") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.gold" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_iron] -name = _("Iron") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.iron" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_game] -name = _("?animals:Game") -category = "Resource" -causes = "Resource"; "Appear" -;rmcauses = "" -graphic = "ts.tundra_game" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -;hidden Elk in Arctic (1 of 2) -appearance_chance = 1200 ; (12%) -appearance_reqs = - { "type", "name", "range", "present" - "Terrain", "Arctic","Local", TRUE - "MinYear", "-3900", "World", FALSE - } - -[extra_furs] -name = _("Furs") -category = "Resource" -causes = "Resource"; "Appear" -;rmcauses = "" -graphic = "ts.furs" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -;hidden Furs in Arctic (2 of 2), 12%+12% = 24% chance of hidden special (+6% higher for arctic) -appearance_chance = 1363 ; (13.63% of (100%-12%) = 12%) -appearance_reqs = - { "type", "name", "range", "present" - "Terrain", "Arctic","Local", TRUE - "MinYear", "-3900", "World", FALSE - } - -[extra_coal] -name = _("Coal") -category = "Resource" -causes = "Resource"; "Appear" -;rmcauses = "" -graphic = "ts.coal" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -;hidden Coal in Grass (1 of 1) -appearance_chance = 1800 -appearance_reqs = - { "type", "name", "range", "present" - "Terrain", "Grassland","Local", TRUE - "MinYear", "-3900", "World", FALSE - } - -[extra_fish] -name = _("Fish") -category = "Resource" -causes = "Resource"; "Appear" -;rmcauses = "" -graphic = "ts.fish" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -;hidden Fish in Swamp (1 of 1 of 3) -;swamp transforms 3 ways, so to keep a 18% chance of finding a special after -;a transformation, requires special math. -appearance_chance = 1800 ; first one is easy, 18% -appearance_reqs = - { "type", "name", "range", "present" - "Terrain", "Swamp","Local", TRUE - "MinYear", "-3900", "World", FALSE - } - -[extra_fruit] -name = _("Fruit") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.fruit" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_gems] -name = _("Gems") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.gems" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_rubber] -name = _("Rubber") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.rubber" -graphic_alt = "ts.peat" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_buffalo] -name = _("Buffalo") -category = "Resource" -causes = "Resource"; "Appear" -;rmcauses = "" -graphic = "ts.buffalo" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -;hidden Buffalo in Tundra (1 of 1 of 2) -appearance_chance = 1800 ;if transforming Tundra to Plains, 18% chance for a special. -appearance_reqs = - { "type", "name", "range", "present" - "Terrain", "Tundra","Local", TRUE - "MinYear", "-3900", "World", FALSE - } - -[extra_deer] -name = _("Deer") -category = "Resource" -causes = "Appear", "Resource" -rmcauses = "Disappear" -graphic = "ts.forest_game" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -disappearance_chance = 10000 -disappearance_reqs = - { "type", "name", "range" - } -appearance_chance = 400 -appearance_reqs = - { "type", "name", "range", "present" - "Terrain", "Grassland","Local", TRUE - "MinYear", "-3000", "World", FALSE - "Extra", "Deer", "Adjacent", FALSE - } - -[extra_wild_boar] -name = _("Wild Boar") -category = "Resource" -causes = "Appear", "Resource" -rmcauses = "Disappear" -graphic = "ts.boar" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -disappearance_chance = 10000 -disappearance_reqs = - { "type", "name", "range" - } -appearance_chance = 400 -appearance_reqs = - { "type", "name", "range", "present" - "Terrain", "Forest","Local", TRUE - "MinYear", "-3000", "World", FALSE - "Extra", "Wild Boar", "Adjacent", FALSE - } - -[extra_wheat] -name = _("Wheat") -category = "Resource" -causes = "Resource"; "Appear" -;rmcauses = "" -graphic = "ts.wheat" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -;hidden wheat in forests (1 of 1) -appearance_chance = 1800 ;18% -appearance_reqs = - { "type", "name", "range", "present" - ;"Terrain", "Forest", "Local", TRUE - ;"MinYear", "-3900", "World", FALSE - } - -[extra_oasis] -name = _("Oasis") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.oasis" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_peat] -name = _("Peat") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.peat" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_pheasant] -name = _("Pheasant") -category = "Resource" -causes = "Resource"; "Appear" -;rmcauses = "" -graphic = "ts.pheasant" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -;hidden Pheasant in Jungle (1 of 1) -appearance_chance = 1800 -appearance_reqs = - { "type", "name", "range", "present" - "Terrain", "Jungle", "Local", TRUE - "MinYear", "-3900", "World", FALSE - } - -[extra_bonus] -name = _("Resources") -category = "Resource" -causes = "Resource"; "Appear" -;rmcauses = "" -graphic = "ts.grassland_resources" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -;hidden shields in swamps (2 of 3 of 3 terrain types) -;swamp transforms 3 ways, so to keep 18% chance of special after transformation, requires special maths -appearance_chance = 2195 ; (21.95% of (100%-18%) = 18%) -appearance_reqs = - { "type", "name", "range", "present" - "Terrain", "Swamp", "Local", TRUE - "MinYear", "-3900", "World", FALSE - } - -[extra_ivory] -name = _("Ivory") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.arctic_ivory" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_silk] -name = _("Silk") -category = "Resource" -causes = "Resource"; "Appear" -;rmcauses = "" -graphic = "ts.silk" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -;hidden silk in swamps (3 of 3 of 3 terrain types) -;swamp transforms 3 ways, so to keep 18% of special after transformation, requires special maths -appearance_chance = 2813 ; (28.13% of (100%-18%-18%) = 18%) -appearance_reqs = - { "type", "name", "range", "present" - "Terrain", "Swamp", "Local", TRUE - "MinYear", "-3900", "World", FALSE - } - -[extra_spice] -name = _("Spice") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.spice" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_whales] -name = _("Whales") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.whales" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_wine] -name = _("Wine") -category = "Resource" -causes = "Resource"; "Appear" -;rmcauses = "" -graphic = "ts.wine" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -;hidden wine in mountains (1 of 1) -appearance_chance = 1800 ;18% of finding special -appearance_reqs = - { "type", "name", "range", "present" - "Terrain", "Mountains", "Local", TRUE - "MinYear", "-3900", "World", FALSE - } - -[extra_oil] -name = _("Oil") -category = "Resource" -causes = "Resource"; "Appear" -;rmcauses = "" -graphic = "ts.oil" -graphic_alt = "-" -act_gfx_alt2 = "-" -activity_gfx = "None" -act_gfx_alt = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -;hidden Oil in Tundra (1 of 2 of 2) -appearance_chance = 2195 ; (21.95% of (100-18%) = 18%) -appearance_reqs = - { "type", "name", "range", "present" - "Terrain", "Tundra","Local", TRUE - "MinYear", "-3900", "World", FALSE - } - -; /* <-- avoid gettext warnings -; -; Base types: -; -; extra = name of the extra this base section is part of -; (must have "Base" in its causes) -; gui_type = How gui should handle this base. -; Value can be "Fortress", "Airbase", or "Other" -; border_sq = Base will claim land ownership up to this radius, -; -1 to disable. If enabled, base cannot exist in city tile. -; vision_main_sq = Base will have main layer vision to this radius -; vision_invis_sq = Base will have invisible layer vision to this radius -; vision_subs_sq = Base will have subsurface layer vision to this radius -; flags -; - "NoAggressive" = Units inside are not considered aggressive if there`s -; friendly city within 3 tiles -; -; */ <-- avoid gettext warnings - -[base_hideout] -extra = "Hideout" -gui_type = "Other" -border_sq = -1 -vision_main_sq = 2 - -[base_fort] -extra = "Fort" -gui_type = "Fortress" -border_sq = -1 -vision_main_sq = 4 - -[base_fortress] -extra = "Fortress" -gui_type = "Fortress" -border_sq = 4 -vision_main_sq = 4 -flags = "NoAggressive" - -[base_airbase] -extra = "Airbase" -gui_type = "Airbase" - -[base_radar] -extra = "Radar" -gui_type = "Airbase" -vision_main_sq = 30 - -[base_buoy] -extra = "Buoy" -gui_type = "Fortress" -vision_main_sq = 5 - -[base_navalbase] -extra = "Naval Base" -gui_type = "Fortress" -border_sq = 3 ;this may be causing the nationality flip behaviour for allies co-occupying -vision_main_sq = 6 -vision_subs_sq = 4 -flags = "NoAggressive" - - -; /* <-- avoid gettext warnings -; -; Road types: -; -; extra = name of the extra this road section is part of -; (must have "Road" in its causes) -; first_reqs = additional requirements to build the first part of -; the road, when none of the adjacent tiles have any -; integrating roads (see effects.ruleset and -; README.effects for help on requirements) -; move_cost = how much movement it takes to travel -; via this road (in fractional move points, as -; defined by move_fragments) -; -1 means that road provides no speed bonus. -; move_mode = how movement costs are applied -; - "Cardinal" = Road cost applies only on cardinal moves -; - "Relaxed" = Road cost is normal for cardinal, double for diagonal moves -; - "FastAlways" = Road cost applies always between two tiles with the roads -; (default) -; food_incr_const = food production added to tile regardless of terrain -; shield_incr_const = shield production added to tile regardless of -; terrain -; trade_incr_const = trade production added to tile regardless of -; terrain -; food_incr = food production added to tile; multiplied by -; terrain-specific road_food_incr_pct -; shield_incr = shield production added to tile; multiplied by -; terrain-specific road_shield_incr_pct -; trade_incr = trade production added to tile; multiplied by -; terrain-specific road_trade_incr_pct -; food_bonus = percent added to food production -; shield_bonus = percent added to shield production -; trade_bonus = percent added to trade production -; In summary, output bonuses from roads are given by the formula: -; (base_prod + roads.incr_const + roads.incr*terrain.incr_pct) * roads.bonus -; compat_special = what kind of pre-2.5 special this road corresponds -; to, if any: "Road", "Railroad", "River", or "None". -; Used for UI and loading old savegames -; integrates = list of road types that are suitable next steps -; for travel from this road type -; flags -; - "River" = Automatically generated by map generator, always -; flowing from land tiles to ocean -; - "UnrestrictedInfra" = Use of the enemy owned road is not restricted -; even if server setting 'restrictinfra' is set -; - "JumpFrom" = Move to a tile nativity providing "JumpTo" -; road is considered native -; - "JumpTo" = Move from a tile nativity providing "JumpFrom" -; road is considered native -; -; */ <-- avoid gettext warnings - -[road_road] -extra = "Road" -move_cost = 3 -food_incr = 0 -shield_incr = 0 -trade_incr = 1 -food_bonus = 0 -shield_bonus = 0 -trade_bonus = 0 -integrates = "Quay" -compat_special = "Road" -flags = "UnrestrictedInfra" - -[road_quay] -extra = "Quay" -move_cost = 9 -food_incr = 0 -shield_incr = 0 -trade_incr = 0 -food_bonus = 0 -shield_bonus = 0 -trade_bonus = 0 -integrates = "Road" -flags = "UnrestrictedInfra" - -[road_railroad] -extra = "Railroad" -move_cost = 1 -food_incr = 0 -shield_incr = 0 -trade_incr = 0 -food_bonus = 0 -shield_bonus = 50 -trade_bonus = 0 -compat_special = "Railroad" - -[road_maglev] -extra = "Maglev" -move_cost = 0 -food_incr = 0 -shield_incr = 0 -trade_incr = 0 -food_bonus = 0 -shield_bonus = 0 -trade_bonus = 0 - -[road_river] -extra = "River" -move_cost = 3 -move_mode = "Cardinal" -trade_incr_const = 1 -compat_special = "River" -integrates = "Canal", "Waterway" -flags = "River", "UnrestrictedInfra" - -[road_canal] -extra = "Canal" -move_cost = 9 -move_mode = "Cardinal" -integrates = "River", "Waterway" -compat_special = "None" - -[road_waterway] -extra = "Waterway" -move_cost = 9 -move_mode = "Cardinal" -integrates = "River", "Canal" -compat_special = "None" diff --git a/freeciv/freeciv/data/.historic/ag2/units.ruleset b/freeciv/freeciv/data/.historic/ag2/units.ruleset deleted file mode 100644 index f76b2baaf..000000000 --- a/freeciv/freeciv/data/.historic/ag2/units.ruleset +++ /dev/null @@ -1,4421 +0,0 @@ -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes, -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. -; -; You should sort role units from worst to better, as often the best -; available role unit of a given sort will be picked by choosing -; the first available (not obsolete) such unit, or by picking the last -; such unit directly. When determining starting units, the first -; unit with the relevant role that the player can build will be chosen. -; If no such unit can be found (eg Explorers that require Seafaring), -; then the first unit with this role will be chosen. - -[datafile] -description="Unit definitions for the Avant-garde ruleset." -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -[control] -; Names for custom unit type flags. There can be up to 45 of these. -; name = rule name; In some circumstances user may see this -; as part of some sentences, so try to make it descriptive -; and sensible. -; helptxt = displayed in the help for unit types with this flag (optional) -; ************** ANTYHING WHICH CHANGES THE SEQUENCE OR NUMBER OF THE USER CUSTOM FLAGS BELOW SHOULD BE -; ************** MADE COMPATIBLE BETWEEN MP+ AND MP2 RULESETS AND POSSIBLY CLASSIC AND CIV2CIV3 SO THAT -; ************** THERE IS UNIFORMITY IN FCW CLIENT which checks these flags based on index #. Not keeping -; ************** uniformity results in loss of features as ability to check these flags would be lost. -flags = - { "name", "helptxt" - _("Airbase") - _("Transform"), _("Can do advanced Terrain transformations.") - _("CanRoad"), _("Able to build Roads.") - _("CanFortress"), _("Can build Forts and Fortresses") - _("Bombarder"), _("Can safely conduct Ranged Attacks.") - _("AirAttacker"), _("Anti-Air units have a defense bonus against this unit.") - _("Horse"), _("Attack value halved when attacking Pikemen.\n\ -➤ Knights defend at 3 when attacked by this unit.") - _("FootSoldier"), _("Knights defend at 2 when attacked by this unit.") - _("Helicopter"), _("Loses 1hp for every turn in the air.\n\ -➤ Gets +1 move point if starting its turn in a City or Airbase.") - _("Submarine"), _("Attack value reduced against some ships.") - _("Unbribable"), _("Can't be bribed.") - _("TradeRoute"), _("Can establish a foreign trade route (must travel to target city).") - _("HelpWonder"), _("Can help build a Wonder in any non-hostile city.") - _("Capturer"), _("Can capture some enemy units.") - _("Capturable"), _("Can be captured by some enemy units.") - _("Cities") - _("AddToCity"), _("Can add itself to the population of a city.") - _("Nuclear"), _("Can perform a Nuclear Detonation obliterating all adjacent tiles.") - _("Missile"), _("AEGIS and Armor II have a defense bonus against this unit.") - _("Well-Digger"), _("Can dig a well and irrigate tiles with no water.") - _("Infra"), _("Can build infrastructure.") - _("Proletarian"), _("Controllable only by Communist governments.") - _("Paratroopers"), _("Can be paradropped from a friendly city or suitable base.") - _("Marines"), _("Can launch attack from non-native tiles.") - _("Expellable"), _("Can be peacefully expelled from foreign tiles.") - _("AirProtector"), _("Is Unreachable AND can protect its tile from units unable to attack this unit.") - _("CantReachAir"), _("Unable to attack air units.") - _("FortBuster"), _("Defending Forts get no bonus. +33% attack bonus vs. the 2x defense of a Fortress.") - _("FortressBuster"), _("Defending Fortresses get no bonus.") - _("AntiAir"), _("Anti-Air bonus of this unit is less effective against Stealth, which has a 25% bonus against this unit.") -;;; _("NeverProtects"), _("Does not protect other units on its tile.") ; UNCOMMENT THIS IF NOT USING SCL'S PATCH FOR THIS FLAG -;;; _("NeverBlocked"), _("Bypasses unreachable units when attacking a tile.") ; UNCOMMENT THIS IF NOT USING LEXXIE'S PATCH FOR THIS FLAG - _("MultiSlot"), _("Cities with proper requirements can produce more than one of these per turn.") ;uncomment if you don't have slot_control patch - _("CanHide"), _("In appropriate terrain, this unit can make a Hideout, which will conceal all land units on the tile.") - _("WillNever") -;;; The following flag MUST be #34 position to work with hack in movement.c which allows transported AAA to defend on non-native: -;;; this comment can be removed when we have some smarter way for unit_can_defend_here(..) to get ruleset control. - _("TransportDefender"), _("Can defend while transported on non-native tiles.") - _("NonMilAttack"), _("Has military capacity but for peaceful purposes, can enter territories with whom you are at Peace") - } - -; Names for custom unit class flags. There can be up to 8 of these. -; name = rule name; In some circumstances user may see this -; as part of some sentences, so try to make it descriptive -; and sensible. -; helptxt = displayed in the help for unit types belonging to a class -; with this flag (optional) -class_flags = - { "name", "helptxt" - _("Airliftable"), _("Can be airlifted if it has remaining moves.") - _("BorderPolice"), _("Military units from this class can peacefully expel certain foreign units.") - _("AttFromNonNative"), _("Can launch attack from non-native tiles.") - _("CargoRestrained"), _("Can't attack as Cargo. Must first unload.") - } - -[veteran_system] -; What are the names of the levels? -veteran_names = _("green"), _("veteran"), _("hardened"), _("elite"), _("crack"), _("master"), _("champion") - -; The percentage chance of increasing level through combat -veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 - -; The percentage chance of a settler/engineer increasing level through -; performing useful work (per turn) -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 - -; Power factors are as a percentage. -; +50% is represented by 150 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 - -; The additional number of movement points granted for different veteran -; levels. These are fractional move points as defined by move_fragments in -; terrain.ruleset. -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 - -; /* <-- avoid gettext warnings -; -; Unit classes -; The number can be variable, up to 32 -; When adding new classes, remember to check effects.ruleset also. -; Eg. if you divide class 'Land' to two separate classes, you may -; want add effect giving City Walls defence bonus against new class -; too. -; -; The actual tag used (the * in [unitclass_*]) does not matter, except -; it must be unique within this file, and it may be used in debug -; output when reading this file. -; -; ** Fields ** -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; -; if not present, "name" is used for this purpose too. -; Since the name used in savegames must not change, if -; you want to rename an item after a ruleset has been -; released, you should set "rule_name" to the original -; value of "name". -; min_speed = Minimum speed after damage and effects (whole movement points) -; hp_loss_pct = Hitpoints lost each turn if unit not in city or native base -; non_native_def_pct = Defense power percentage applying when defending on -; non-native terrain (such as ship in harbour) -; hut_behavior = What happens to huts when unit enters tile: -; "Normal", "Nothing", or "Frighten" -; flags = List of unit class flags (from the following list; you -; cannot add custom unit class flags) -; helptext = optional help text string; should escape all raw newlines -; so that xgettext parsing works -; -; ** Unit class Flags ** -; -; "TerrainSpeed" = Unit Class uses terrain specific speed -; "TerrainDefense" = Unit Class gains defense bonus from terrain -; "DamageSlows" = Damaged units are slowed down -; "CanOccupyCity" = Military units of this class can occupy enemy cities -; "Missile" = Unit Class is destroyed when it attacks -; "BuildAnywhere" = Unit Class can be built even in the middle of non-native terrain -; "Unreachable" = Unit Class can be attacked only by units explicitly listing this -; class in its 'targets', unless on a city or native base. -; For class members which are transports, cargo cannot load/ -; unload except in a city or native base, unless that unit -; explicitly lists this class in its 'embarks'/'disembarks'. -; "CollectRansom" = Unit Class can collect ransom when killing lone barbarian leader -; "ZOC" = Unit Class is subject to ZOC rules. Unit type flag "IgZOC" can -; override this -; "CanFortify" = Unit can fortify at land tiles. Unit type flag -; "Cant_Fortify" can override this -; "CanPillage" = Unit Class can pillage tile infrastructure -; "DoesntOccupyTile" = Even if this class of enemy unit is on tile, cities can -; still work that tile -; "AttackNonNative" = Unit Class can attack units on non-native tiles. Unit type -; flag "Only_Native_Attack" can override this -; "AttFromNonNative" = Unit Class can launch attack from non-native tile (against -; native one) -; This applies for both attacking from transport or -; cities. If only some unit types of the class should -; get this property, use type flag "Marines" -; "KillCitizen" = Upon successful attack against a city, unit kills one -; citizen. The effect "Unit_No_Lose_Pop" and the server -; setting 'killcitizen' can disable this. - -; "Airliftable" = This Unit Class may be airlifted -; */ <-- avoid gettext warnings - - -; ********************************************************************************** -; ********************************************************************************** -; WARNING: ANY CHANGES TO WHAT TYPES OR CLASSES CAN LOAD ONTO WHICH TRANSPORTS MAY -; REQUIRE CHANGES TO FCW function unit_could_possibly_load() in unit.js -; ********************************************************************************** -; ********************************************************************************** -[unitclass_missile] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Missile") -min_speed = 1 -hp_loss_pct = 0 -hut_behavior = "Frighten" -flags = "Missile", "Unreachable", "DoesntOccupyTile", "Airliftable" - -; missile flag not class, indicates suicide explosion and possibly other things. -[unitclass_bomb] -name = _("?unitclass:Bomb") -min_speed = 1 -hp_loss_pct = 0 -hut_behavior = "Frighten" -flags = "Unreachable", "DoesntOccupyTile", "Airliftable" -helptext = _("\ - • Can be airlifted from a suitable city.\ -") - -[unitclass_landrail] -name = _("?unitclass:LandRail") -min_speed = 4 -hp_loss_pct = 0 -flags = "Unreachable", "BuildAnywhere", "ZOC", "TerrainDefense", "TerrainSpeed" -helptext = _("\ - • Only able to move on railroad tiles.\ -") - -[unitclass_landroad] -name = _("?unitclass:LandRoad") -min_speed = 3 -hp_loss_pct = 0 -flags = "BuildAnywhere", "ZOC", "TerrainDefense", "TerrainSpeed" -helptext = _("\ - • Only able to move on road tiles.\ -") - -[unitclass_land] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Land") -min_speed = 1 -hp_loss_pct = 0 -flags = "TerrainSpeed", "DamageSlows", "CanOccupyCity", "BuildAnywhere", - "CollectRansom", "ZOC", "CanFortify", "CanPillage", - "TerrainDefense", "KillCitizen", "Airliftable", "BorderPolice", - "CargoRestrained" -helptext = _("\ - • Can be airlifted from a suitable city.\ -") - -[unitclass_landnokill] -name = _("?unitclass:LandNoKill") -min_speed = 1 -hp_loss_pct = 0 -flags = "TerrainSpeed", "DamageSlows", "CanOccupyCity", "BuildAnywhere", - "CollectRansom", "ZOC", "CanFortify", "CanPillage", - "TerrainDefense", "Airliftable", "BorderPolice", - "CargoRestrained" -helptext = _("\ - • Does not reduce population when attacking city.\ -") - -;Land units that are multipurpose for land/air/sea attacks (i.e., anti-aircraft, marines) -;include "Unreachable" in the targets for individual units -[unitclass_landairsea] -name = _("?unitclass:LandAirSea") -min_speed = 1 -hp_loss_pct = 0 -flags = "TerrainSpeed", "DamageSlows", "CanOccupyCity", "BuildAnywhere", - "CollectRansom", "ZOC", "CanFortify", "CanPillage", - "TerrainDefense", "KillCitizen", "Airliftable", - "AttackNonNative", "AttFromNonNative", "BorderPolice" -helptext = _("\ - • Can attack from Ships and Helicopters.\ -") - -[unitclass_sea] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Sea") -min_speed = 3 -hp_loss_pct = 0 -flags = "DamageSlows", "AttackNonNative", "AttFromNonNative", "CanPillage" -helptext = _("\ - • Crew Repair: each turn, regardless of movement, recovers 8% of its hit points (rounded down).\ -") - -; Separating the Submarine class finally allows it to be unreachable by Air. The old Submarine was -; far too offensively overpowered while simultaneously almost useless from ultra-vulnerability to Air units. -; Because it is now Unreachable, any unit able to attack it needs this class in its targets. -[unitclass_submarine] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Submarine") -min_speed = 3 -hp_loss_pct = 0 -flags = "DamageSlows", "AttackNonNative", "AttFromNonNative", "CanPillage", "Unreachable" -helptext = _("\ - • Visibility bonus: not visible to other players unless they have a unit or city adjacent to it.\n\ - • Crew Repair: each turn, regardless of movement, recovers 2 hit points.\ -") - -[unitclass_trireme] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Trireme") -min_speed = 2 -hp_loss_pct = 0 -flags = "DamageSlows", "AttFromNonNative" - -[unitclass_rivership] -; /* Extra class providing ability to travel rivers */ -name = _("?unitclass:RiverShip") -min_speed = 2 -hp_loss_pct = 0 -flags = "DamageSlows", "AttackNonNative", "AttFromNonNative" - -[unitclass_heli] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Helicopter") -min_speed = 1 -hp_loss_pct = 5 -flags = "Unreachable", "CanOccupyCity", "CollectRansom", "Airliftable" - -; This class is for air units that are unreachable but do not protect a stack. -[unitclass_air] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Air") -min_speed = 1 -hp_loss_pct = 0 -hut_behavior = "Frighten" -flags = "Unreachable", "DoesntOccupyTile", "Airliftable" - -; This class is for air units that can pillage terrain (i.e. Jet Bomber) -[unitclass_airpillage] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:AirPillage") -min_speed = 1 -hp_loss_pct = 0 -hut_behavior = "Frighten" -flags = "Unreachable", "DoesntOccupyTile", "Airliftable", "CanPillage" - -; This class is for air units that can also protect a stack. -; (Fighters) -- technically a separate AirProtect class is not needed, but -; Fighters also have Border Police abilities, and a separate class -; facilitates future adjustments and balancing in an isolated class. -[unitclass_air_protect] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:AirProtect") -min_speed = 1 -hp_loss_pct = 0 -hut_behavior = "Frighten" -flags = "Unreachable", "DoesntOccupyTile", "Airliftable", "BorderPolice" -helptext = _("\ - • INTERCEPTOR: can be given the Vigil order to auto-attack adjacent Air units.\n\ - • AIR COVER: Most units who cannot attack this unit also cannot attack other units on the tile.\ -") -[unitclass_balloon] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Balloon") -min_speed = 1 -hp_loss_pct = 0 -hut_behavior = "Frighten" -flags = "Unreachable", "DoesntOccupyTile", "Airliftable" - - -; /* <-- avoid gettext warnings -; -; Below: The individual unit types, one per section. -; -; The number can be variable, up to 200. -; However for the "official" rulesets, units should not be removed -; because that would break backward compatability with savegames. -; -; The order here matters: later units are considered "better" for -; a given flag or role. -; -; The actual tag used (the * in [unit_*]) does not matter, except -; it must be unique within this file, and it may be used in debug -; output when reading this file. -; -; ** Fields ** -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; if -; not present, "name" is used for this purpose too. Since -; the name used in savegames must not change, if you want -; to rename an item after a ruleset has been released, you -; should set "rule_name" to the original value of "name". -; graphic = tag specifying preferred graphic -; graphic_alt = tag for alternate graphic if preferred graphic is not -; present; especially if preferred graphic is non-standard, -; this should be a standard tag. Otherwise can use eg "-" -; for no alternate graphic. -; tech_req = required advance, names from techs.ruleset, or special: -; "None" => available from start -; impr_req = required city improvement, names from buildings.ruleset -; gov_req = required government, names from governments.ruleset -; obsolete_by = can be upgraded to and made obsolete by another unit by name -; build_cost = production shields required to build -; pop_cost = population removed from city when built; for 'Join City' -; units this is also the population added to the destination -; attack = base attack strength (0 = cannot attack) -; defense = base defense strength (0 = cannot defend) -; hitpoints = how much damage unit can withstand -; firepower = number of hitpoints removed per round of combat; at least 1 -; move_rate = base move rate (whole movement points) -; vision_radius_sq = base vision of unit: unit can see tile up to the square -; root of this value away -; convert_to = can be converted to another type of unit by name -; convert_time = number of movement points it takes to convert to -; another unit type -; class = One of the classes listed above -; transport_cap = Number of units (ground, or air/missiles, depending on flags) -; fuel = Number of turns unit can spend outside refuel points. -; If more time passes without unit refueling over turn change, -; they are lost. If this is zero, unit has no need to refuel -; Units with "Coast" flag set consider any tile next to coast -; refuel point -; uk_* = upkeep costs, these are used as base values in the game -; cargo = Unit classes this unit can transport -; city_slots = How many of homecity's unit maintenance slots unit takes -; city_size = Initial size of the cities built by 'Found City' type units -; (but 'Join City' uses pop_cost) -; targets = list of unit classes this unit can attack against even -; if they have Unreachable unit class flag -; embarks = list of unit classes this unit may load into while not in -; native base or city even if transporter has Unreachable unit -; class flag -; disembarks = list of unit classes this unit may unload from while not in -; native base or city even if transporter has Unreachable unit -; class flag -; vision_layer = At which layer this unit is visible; "Main", "Stealth", -; or "Subsurface" -; bonuses = definitions of combat bonuses against specific other units -; bonuses.flag = flag of the unit that bonus applies against -; bonuses.type = type of the bonus. See below -; bonuses.value = value of the bonus. Sum of these is used if multiple apply. -; bonuses.quiet = don't auto generate help text for this bonus. Use this if -; the bonus is documented in the unit type's help text. -; This is useful when the combination of a unit's bonuses -; becomes complex enough to make the auto generated help -; ugly or inaccurate. -; flags = special flag strings; list of built-in flags described below -; and/or user flags defined above -; -; veteran_names = Special veteran level for this unit. See the definitions in -; game.ruleset. All of the veteran_* entries have to have the -; same length! -; veteran_base_raise_chance = -; veteran_work_raise_chance = -; veteran_power_fact = -; veteran_move_bonus = -; -; roles = special role strings -; sound_move = optional sound effect when the unit moves -; sound_move_alt = optional alternative sound effect if above not -; supported in client -; sound_fight = optional sound effect when the unit fights -; sound_fight_alt = optional alternative sound effect if above not -; supported in client -; helptext = optional help text string; should escape all raw newlines -; so that xgettext parsing works -; -; -; ** Bonuses ** -; -; "DefenseMultiplier" = Multiply defense value (1 + 'value') times. -; Value of 1 means multiplication by 2, value 2 by 3... -; Bonus is defined in defenders entry. -; "DefenseMultiplierPct" = Multiply defense by 1 + (value / 100). -; Value of 100 means multiplication by 2, -; value of 50 means multiplication by 1.5, etc. -; Effectively increases defense by value percent. -; Bonus is defined in defenders entry. -; "DefenseDivider" = Divide defense value with (1 + 'value'). -; Bonus is defined in attackers entry. -; "DefenseDividerPct" = Divide defense value by 1 + (value / 100). -; Value of 100 means division by 2, (2x for attacker) -; value of 50 means division by 1.5, (1.5x for attacker) -; i.e.: Effectively increases *attack* by value percent. -; "FirePower1" = Defender firepower is reduced to value 1 when -; ever this has non-zero value. -; Bonus is defined in attackers entry. -; -; ** Flags ** -; -; "IgZOC" = ignore Zones of Control (ZOC) even if unit class has -; "ZOC" flag -; "HasNoZOC" = unit has no Zone of Control (ZOC), thus any unit can move -; around it freely -; "NonMil" = a non-military unit: no martial law; can enter -; peaceful borders; DoesntOccupyTile -; "IgTer" = use constant move cost defined in igter_cost (terrain.ruleset) -; rather than terrain/road etc cost, unless terrain cost is -; less -; "OneAttack" = can only make a single attack, regardless of movement points -; "FieldUnit" = cause unhappiness even when not being aggressive -; "BeachLander" = won't lose all its movement when moving from non-native -; terrain to native terrain even if slow_invasions is on. -; "Settlers" = "can irrigate and build roads" but really seems to be a required flag for -; any tile improvement at all. -; "Diplomat" = can defend against diplomat actions (see diplchance -; server option) -; "Spy" = strong in diplomatic battles. _Must_ be "Diplomat" also -; "CoastStrict" = (sea only) cannot leave coast -; "Coast" = (sea only) can refuel on coast. Set fuel to force unit -; to regularly end turn on coast -; "Only_Native_Attack" = cannot attack targets on non-native tiles even if -; unit class can -; "Cant_Fortify" = cannot fortify even if unit class has "CanFortify" flag -; "Fanatic" = can only be built by governments that allow them -; (see civ2/governments.ruleset, Fundamentalism government) -; "Unique" = a player can only have one of these units in the game at -; the same time; barbarians cannot use this at present -; "GameLoss" = losing one of these units means you lose the game, but it -; is produced without homecity and upkeep -; "EvacuateFirst" = the game will try to rescue units with this flag before -; it tries to rescue units without it when their transport -; is destroyed. Think of the Birkenhead drill ("women and -; children first"). Replace "women and children" with -; "units with the EvacuateFirst unit type flag". -; "SuperSpy" = this unit always wins diplomatic contests, that is, unless -; it encounters another SuperSpy, in which case defender wins; -; can also be used on non-diplomat units, in which case it can -; protect cities from diplomats; also 100% spy survival chance -; "NoHome" = this unit has no homecity and will be free of all upkeep, and -; therefore will not revolt along with its city of origin should -; it be incited -; "NoVeteran" = this unit cannot gain veteran levels through experience -; (as if both raise_chance and work_raise_chance were zero); -; it can still gain veterancy through Veteran_Build, etc -; "CityBuster" = this unit has double firepower against cities -; "NoBuild" = this unit cannot be built -; "BadWallAttacker" = the firepower of this unit is set to 1 if -; attacking a city -; defended by a city wall (or other city building defense) -; "BadCityDefender" = if attacked while in a city, firepower is set to 1 -; and firepower of attacker is doubled (the Pearl Harbour -; rule) -; "BarbarianOnly" = only barbarians can build this unit -; "Shield2Gold" = Switch from shield upkeep to gold upkeep possible -; "NewCityGamesOnly" = unit can't be built on scenarios where founding new cities -; is not allowed. Give this flag to units that would make no sense -; to have in a game with such a scenario -; "CanEscape" = this unit has, given that certain conditions are -; fulfilled, a 50% chance to escape rather than being -; killed when killstack is enabled and the defender of its -; tile is defeated. The conditions are that it has more move -; points than required to move to an adjacent tile plus the -; attackers move points and that the attacker doesn't have -; the "CanKillEscaping" unit type flag. -; "CanKillEscaping" = an attack from this unit ignores the "CanEscape" unit -; type flag. -; "Provoking" = Under autoattack_style=1 which this ruleset uses, only -; Fighter types will autoattack and will ONLY attack units -; marked with the Provoking flag. If overridden to autoattack_style=0, -; a unit considering to auto attack this unit will choose to -; do so even if has better odds when defending against it -; then when attacking it. Applies when the autoattack server -; setting is enabled. -; "NeverProtects" = doesn't protect reachable units on its tile from enemy -; attackers, even if the unreachableprotects server setting -; is enabled and the unit class is unreachable -; "NeverBlocked" = isn't blocked by unreachable units on targeted tile, -; even if the unreachableprotects server setting -; is enabled and the unit class is unreachable -; "MultiSlot" = if server setting slot_control is ON, only unit types with this -; flag can use extra city_build_slots -; -; Following actions require extra fields: -; "Attack" -; attack = base attack strength -; "Bombard" -; attack = base attack strength -; bombard_rate = the number of shots fired at enemy units when attacking -; FOR NUKES: the amount to add to the default radius of 1 tile -; "Join City" -; pop_cost = the number of population added to the target city -; "Paradrop Unit" -; paratroopers_range = the maximal range the unit can be paradropped to. -; Max range is 65534. -; paratroopers_mr_req = the move rate which is required at least for -; paradropping (whole movement points) -; paratroopers_mr_sub = the move rate which is subtracted after paradropping -; (whole movement points) -; "Upgrade Unit" -; obsolete_by = the unit type upgraded to. -; "Convert Unit" -; convert_to = the unit type converted to. -; -; ** Roles ** -; -; "FirstBuild" = first to be built when city founded -; "Explorer" = unit to use for exploring -; "Hut" = can be found in a hut -; "HutTech" = can be found in a hut, but its techs required -; "Partisan" = can be created as a partisan (only one unit can have this -; flag), see end of this file for its tech requirements option -; "DefendOk" = AI hint: ok for defending with -; "DefendGood" = AI hint: good for defending with -; "Ferryboat" = AI hint: useful for ferrying -; "Barbarian" = can be created as land barbarian -; "BarbarianTech" = can be created as land barbarian, if someone has -; researched its tech requirements -; "BarbarianBoat" = can be created as boat for sea barbarian -; "BarbarianBuild" = can be built by barbarians -; "BarbarianBuildTech" = can be built by barbarians if someone has -; researched its tech requirements -; "BarbarianLeader" = this unit is the barbarian leader (only one) -; "BarbarianSea" = can be created as a barbarian that disembarks from a barbarian boat -; "BarbarianSeaTech" = can be created as a barbarian that disembarks from a barbarian boat -; if someone has researched its tech requirements -; "Settlers" = can irrigate and build roads -; "Hunter" = AI hint: good for hunting other units -; "CitiesStartUnit" = Gets granted as 'c' startunit -; "WorkerStartUnit" = Gets granted as 'w' startunit -; "ExplorerStartUnit" = Gets granted as 'x' startunit -; "KingStartUnit" = Gets granted as 'k' startunit -; "DiplomatStartUnit" = Gets granted as 's' startunit -; "FerryStartUnit" = Gets granted as 'f' startunit -; "DefendOkStartUnit" = Gets granted as 'd' startunit -; "DefendGoodStartUnit" = Gets granted as 'D' startunit -; "AttackFastStartUnit" = Gets granted as 'a' startunit -; "AttackStrongStartUnit" = Gets granted as 'A' startunit -; -; */ <-- avoid gettext warnings - -[unit_settlers] -name = _("Settlers") -class = "Land" -tech_req = "None" -obsolete_by = "None" -graphic = "u.settlers" -graphic_alt = "-" -sound_move = "m_settlers" -sound_move_alt = "m_generic" -sound_fight = "f_settlers" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 1 -attack = 0 -defense = 1 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 1 -uk_food = 1 -uk_gold = 0 -flags = "Settlers", "Infra", "CanRoad", "CanFortress", "NonMil", "HasNoZOC", "AddToCity", "Cities", "Cant_Fortify", "Expellable" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_base_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "CitiesStartUnit" -helptext = _("\ -Settlers are your only means of founding new cities.\ -"), _("\ -Settlers can perform most of the terrain alterations as\ - Workers (but cannot build Airbases or Buoys).\ -"), _("\ -Upkeep for Settlers costs food as well as production. A Settler\ - can die if its supporting city runs out of food. Settlers in a\ - Republic, Democracy, or Fundamentalist nation require twice as\ - much food per turn.\ -") - -[unit_tribesmen] -name = _("?unit:Tribesmen") -class = "Land" -tech_req = "None" -obsolete_by = "None" -graphic = "u.tribesmen" -graphic_alt = "u.engineers" ; for compatibility -sound_move = "m_worker" -sound_move_alt = "m_generic" -sound_fight = "f_worker" -sound_fight_alt = "f_generic" -build_cost = 20 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 5 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -flags = "NoBuild", "NonMil", "HasNoZOC", "Cant_Fortify", "Capturable", "Expellable" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_base_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "DefendGoodStartUnit" ; re-purposed from Phalanx -helptext = _("\ -Tribesmen are the founding ancestors of your nation. Their deeds are forgotten\ - in the sands of time. But at the dawn of time, Tribesmen can boost the\ - progress of your nation in several ways. They can defend cities, though poorly.\ - They can be disbanded, dedicating their life work to 10 shields of the first\ - project of your cities. They can scope out the area of your new civilization\ - or watch for nearby tribes. They cannot do tile improvements.\ -") - -;A unique patch unit to provide fair starts regardless of lack of nearby water. -;to make as a start unit, use the letter "a": for example, cccwwwxxa -[unit_welldigger] -name = _("Well-Digger") -class = "Land" -tech_req = "None" -obsolete_by = "Workers" -graphic = "u.well_digger" -graphic_alt = "u.migrants" -sound_move = "m_worker" -sound_move_alt = "m_generic" -sound_fight = "f_worker" -sound_fight_alt = "f_generic" -build_cost = 5 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 3 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 5 -uk_food = 2 -uk_gold = 2 -flags = "Settlers", "Infra", "NonMil", "HasNoZOC", "Cant_Fortify", "Unique", "Well-Digger", "Expellable" -embarks = "LandRoad" -disembarks = "LandRoad" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_base_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "AttackFastStartUnit" ;this role taken over for well-digger -helptext = _("\ -AG2 ! \ -This unit can fix unlucky starts, but has very high upkeep.\ - If you have no water, make a Well-Digger in a city that can\ - support it, create a water source, then disband the unit.\n\ - This unit can dig wells or irrigate any lowland tile. It will cost its home city\ - -2 Food -2 Prod. This unit WILL NOT WORK: • Outside your borders,\ - • After Alphabet or Pottery, • After any player discovers Writing, • After 10 turns.\ - >> Don't fool around: high upkeep will permanently hinder you. Only make this unit if you\ - lack water when the game starts!\ -") - -[unit_proletarians] -name = _("Proletarians") -class = "Land" -tech_req = "Communism" -gov_req = "Communism" -obsolete_by = "None" -graphic = "u.proletarian" -graphic_alt = "u.migrants" -sound_move = "m_worker" -sound_move_alt = "m_generic" -sound_fight = "f_worker" -sound_fight_alt = "f_generic" -build_cost = 10 -pop_cost = 1 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 1 -uk_gold = 0 -embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only -disembarks = "LandRoad", "LandRail", "Helicopter" -flags = "Settlers", "Infra", "Cant_Fortify", "NonMil", "HasNoZOC", "AddToCity", "Capturable", "Expellable", "Airbase", "CanFortress", "CanRoad", "Proletarian" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_base_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 1 -roles = "Settlers" -helptext = _("\ -Proletarians can only be controlled by Communist governments.\ -"), _("\ -Communist States can assign Proletarians from one city to another, which transfers population\ - from one to the other. They can also be ordered to the same tasks as Workers.\ -"), _("\ -Large numbers of Proletarians can be used to rapidly complete important State projects,\ - which you may organize into Five-turn Plans.\ -") - -[unit_pilgrims] -name = _("Pilgrims") -class = "Land" -tech_req = "Fundamentalism" -gov_req = "Fundamentalism" -obsolete_by = "None" -graphic = "u.pilgrims" -graphic_alt = "u.migrants" -sound_move = "m_worker" -sound_move_alt = "m_generic" -sound_fight = "f_worker" -sound_fight_alt = "f_generic" -build_cost = 10 -pop_cost = 1 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 2 -uk_gold = 0 -embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only -disembarks = "LandRoad", "LandRail", "Helicopter" -flags = "Fanatic", "Cant_Fortify", "NonMil", "HasNoZOC", "AddToCity", "Capturable", "Expellable" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_base_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -helptext = _("\ -Pilgrims are wayfaring migrants from Fundamentalist nations. Like Fanatics,\ - they have no upkeep if under a Fundamentalist government. Heeding the call\ - of ecclesiastic authority, Pilgrims can be guided from one city to another in\ - order to transfer population from city to city.\ -") - - -[unit_worker] -name = _("?unit:Workers") -class = "Land" -tech_req = "Pottery" -obsolete_by = "Engineers" -graphic = "u.worker" -graphic_alt = "u.engineers" ; for compatibility -sound_move = "m_worker" -sound_move_alt = "m_generic" -sound_fight = "f_worker" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -convert_to = "Riflemen" -convert_time = 2 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only -disembarks = "LandRoad", "LandRail", "Helicopter" -flags = "Settlers", "Infra", "CanRoad", "CanFortress", "NonMil", "HasNoZOC", "Airbase", "Cant_Fortify", "Capturable", "Expellable" -; No veteran levels (level name is never displayed) -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:army worker"), - _("?vet_rank:army engineer"), - _("?vet_rank:chief engineer") -veteran_base_raise_chance = 0, 0, 0, 0 -veteran_work_raise_chance = 0, 0, 0, 0 -veteran_power_fact = 100, 100, 100, 100 -veteran_move_bonus = 0, 1, 1, 1 -roles = "Settlers", "WorkerStartUnit" -helptext = _("\ -Workers can improve terrain tiles. See the manual on Terrain for details.\ -"), _("\ -Masonry lets Workers build Forts. Construction lets them build Fortresses and\ - Oil Wells. Engineering lets them build Canals and Naval Bases. Radio lets them\ - build Airbases and Buoys, which Settlers cannot. Workers must be on a ship to build Buoys.\ -"), _("\ -Communism tech allows Communist governments to conscript Workers into Riflemen via the\ - Convert order. And vice versa.\ -") - -[unit_engineers] -name = _("Engineers") -class = "Land" -tech_req = "Explosives" -obsolete_by = "None" -graphic = "u.engineers" -graphic_alt = "u.worker" -sound_move = "m_engineers" -sound_move_alt = "m_generic" -sound_fight = "f_engineers" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 0 -defense = 2 -hitpoints = 20 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter" ; transport helicopter only -disembarks = "Helicopter" -flags = "Settlers", "Infra", "CanRoad", "CanFortress", "NonMil", "HasNoZOC", "Transform", "Airbase", "Cant_Fortify", "Expellable" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_base_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "Settlers", "WorkerStartUnit" -helptext = _("\ -Engineers can do everything Workers can do, at twice the speed.\ - Unlike Workers, Engineers can Transform, such as converting\ - Desert to Plains. Converting Ocean to Swamp requires being on a ship\ - on a tile bordering 3 land tiles.\ -") - -[unit_warriors] -name = _("Warriors") -class = "Land" -tech_req = "None" -obsolete_by = "Pikemen" -graphic = "u.warriors" -graphic_alt = "-" -sound_move = "m_warriors" -sound_move_alt = "m_generic" -sound_fight = "f_warriors" -sound_fight_alt = "f_generic" -build_cost = 10 -pop_cost = 0 -attack = 1 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only -disembarks = "LandRoad", "LandRail", "Helicopter" -flags = "FootSoldier", "CantReachAir", "Settlers", "CanHide", "MultiSlot", "Shield2Gold", "WillNever" -roles = "DefendOk", "DefendOkStartUnit", "FirstBuild", "Hut" -helptext = _("\ -The Warrior is the weakest military unit, but can also be very cost effective.\ -") - -[unit_phalanx] -name = _("Phalanx") -class = "Land" -tech_req = "Bronze Working" -obsolete_by = "Pikemen" -graphic = "u.phalanx" -graphic_alt = "-" -sound_move = "m_phalanx" -sound_move_alt = "m_generic" -sound_fight = "f_phalanx" -sound_fight_alt = "f_generic" -build_cost = 20 -pop_cost = 0 -attack = 1 -defense = 2 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only -disembarks = "LandRoad", "LandRail", "Helicopter" -flags = "FootSoldier", "CantReachAir", "Settlers", "CanHide", "MultiSlot", "Shield2Gold", "WillNever" -roles = "DefendGood", "FirstBuild", "HutTech" -helptext = _("\ -The Phalanx is armored infantry, suitable for defending your cities. It offers good value\ - for defending.\ -") - -[unit_archers] -name = _("Archers") -class = "Land" -tech_req = "Warrior Code" -obsolete_by = "Musketeers" -graphic = "u.archers" -graphic_alt = "-" -sound_move = "m_archers" -sound_move_alt = "m_generic" -sound_fight = "f_archers" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 3 -defense = 2 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only -disembarks = "LandRoad", "LandRail", "Helicopter" -flags = "FootSoldier", "Capturer", "CantReachAir", "Bombarder", "Settlers", "CanHide", "MultiSlot", "Shield2Gold", "WillNever" -roles = "DefendOk", "DefendOkStartUnit" -helptext = _("\ -Archers fight with bows and arrows. They have good offense and decent defense.\ - Rather than fight to the death, Archers can also do a Ranged Attack with no risk\ - of retaliatory damage: a single volley of arrows is fired over all enemy units on the tile,\ - causing 1hp of damage to any units who are hit. This is useful for softening\ - enemies prior to battle, or for deterring an approach to a strategic location.\ - (Ranged Attack is not possible on Cities or Fortresses.)\ -") -bombard_rate = 1 - - -[unit_legion] -name = _("Legion") -class = "Land" -tech_req = "Iron Working" -obsolete_by = "Musketeers" -graphic = "u.legion" -graphic_alt = "-" -sound_move = "m_legion" -sound_move_alt = "m_generic" -sound_fight = "f_legion" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 4 -defense = 2 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only -disembarks = "LandRoad", "LandRail", "Helicopter" -flags = "FootSoldier", "Settlers", "CanHide", "Infra", "CanRoad", "CanFortress", "Capturer", - "CantReachAir", "MultiSlot", "Shield2Gold", "WillNever" -roles = "DefendOk", "DefendOkStartUnit", "BarbarianBuild", "BarbarianSea" -helptext = _("\ -Legions are heavily armed well disciplined soldiers with excellent offensive strength.\ - They are famous and feared for their engineering abilities: with the required\ - technology they can build Forts and Fortresses. They can build Roads outside domestic\ - national territory and inside Forts and Fortresses.\ -") - -[unit_pikemen] -name = _("Pikemen") -class = "Land" -tech_req = "Feudalism" -obsolete_by = "Musketeers" -graphic = "u.pikemen" -graphic_alt = "-" -sound_move = "m_pikemen" -sound_move_alt = "m_generic" -sound_fight = "f_pikemen" -sound_fight_alt = "f_generic" -build_cost = 20 -pop_cost = 0 -attack = 1 -defense = 2 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only -disembarks = "LandRoad", "LandRail", "Helicopter" -bonuses = - { "flag", "type", "value" - "Horse", "DefenseMultiplier", 1 - } -flags = "FootSoldier", "CantReachAir", "Settlers", "CanHide", "MultiSlot", "Shield2Gold", "WillNever" -roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild" -helptext = _("\ -Equipped with long pikes and a 2x defence bonus against\ - mounted units, Pikemen replace the Phalanx as the\ - preferred city defender.\ -") - -[unit_musketeers] -name = _("Musketeers") -class = "Land" -tech_req = "Gunpowder" -obsolete_by = "Riflemen" -graphic = "u.musketeers" -graphic_alt = "-" -sound_move = "m_musketeers" -sound_move_alt = "m_generic" -sound_fight = "f_musketeers" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 3 -defense = 3 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only -disembarks = "LandRoad", "LandRail", "Helicopter" -targets = "LandRail" -flags = "FootSoldier", "Capturer", "CantReachAir", "Settlers", "CanHide", "MultiSlot", "Shield2Gold", "WillNever" -roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild", - "BarbarianTech", "BarbarianBuildTech", "BarbarianSeaTech" -helptext = _("\ -Musketeers are infantry equipped with early\ - firearms and replace Pikemen as the preferred\ - city defender, and replace Archers and Legions\ - for offensive foot soldiers.\ -") - -[unit_fanatics] -name = _("Fanatics") -class = "Land" -tech_req = "Fundamentalism" -gov_req = "Fundamentalism" -obsolete_by = "None" -graphic = "u.fanatics" -graphic_alt = "-" -sound_move = "m_fanatics" -sound_move_alt = "m_generic" -sound_fight = "f_fanatics" -sound_fight_alt = "f_generic" -build_cost = 20 -pop_cost = 0 -attack = 4 -defense = 4 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 2 -uk_shield = 2 -uk_food = 0 -uk_gold = 0 -embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only -disembarks = "LandRoad", "LandRail", "Helicopter" -targets = "Balloon", "Helicopter", "LandRail" -flags = "Fanatic", "FootSoldier", "Capturer", "CantReachAir", "Unbribable", "Bombarder", - "Settlers", "CanHide", "MultiSlot", "Shield2Gold", "WillNever" -roles = "DefendGood", "DefendGoodStartUnit" -helptext = _("\ -Fanatics are warriors devoted to a higher cause. Their faith\ - is strong and they cannot be bribed.\ -"), _("\ -Fundamentalist nations can maintain Fanatics without paying\ - their steep upkeep. (Fanatics are unhappy if not under Fundamentalism,\ - requiring high upkeep to stay content.) Fanatics\ - produced in a city with Ecclesiastical Palace are inspired by\ - fervorous faith to +1 higher veteran level.\ -"), _("\ -Fanatics zealously defend their homeland, and can do surprise skirmish\ - assaults to snipe and injure foreign occupants: Each invader\ - on the tile will endure three combat rounds without defense.\ -"), _("\ -\nThe discovery of Labor Union changes upkeep from shields to gold.\ -") -bombard_rate = 3 - -[unit_partisan] -name = _("Partisan") -class = "Land" -tech_req = "Guerilla Warfare" -obsolete_by = "None" -graphic = "u.partisan" -graphic_alt = "-" -sound_move = "m_partisan" -sound_move_alt = "m_generic" -sound_fight = "f_partisan" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 4 -defense = 4 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only -disembarks = "LandRoad", "LandRail", "Helicopter" -targets = "Balloon", "Helicopter", "LandRail" -flags = "MultiSlot", "IgTer", "IgZOC", "NoHome", "FootSoldier", "Capturer", "CantReachAir", - "Shield2Gold", "Settlers", "CanHide", "WillNever" -;yes Partisan has 0 upkeep so Shield2Gold is meaningless, but currently used to substitute MultiSlot inaccessible in c-server -roles = "DefendGood", "DefendGoodStartUnit", "Partisan", "BarbarianTech" -helptext = _("\ -Partisans are guerilla fighters who can use the terrain to their advantage. Like the Explorer\ - that they upgrade, they can slip through ZOC and live off the land with no upkeep.\ -"), _("\ -Proportional to city size, up to 8 Partisans appear when an enemy conquers your city. They\ - randomly fortify on any tile inside the circle defined by its workable radius. Partisans\ - prefer defensive tiles, and ignore tile nationality. They spawn only when:\n\ - ➣ Guerilla Warfare is known by any player.\n\ - ➣ The city was originally built by you.\n\ - ➣ You know Communism and Gunpowder.\n\ - ➣ You must be Democracy or Communist.\ -") - -[unit_alpine_troops] -name = _("Alpine Troops") -class = "Land" -tech_req = "Tactics" -obsolete_by = "None" -graphic = "u.alpine_troops" -graphic_alt = "-" -sound_move = "m_alpine_troops" -sound_move_alt = "m_generic" -sound_fight = "f_alpine_troops" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 5 -defense = 5 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only -disembarks = "LandRoad", "LandRail", "Helicopter" -targets = "Balloon", "Helicopter", "LandRail" -flags = "MultiSlot", "IgTer", "FootSoldier", "Capturer", "CantReachAir", "Shield2Gold", "Settlers", "CanHide", "WillNever" -roles = "DefendGood", "DefendGoodStartUnit" -helptext = _("\ -Alpine Troops are highly mobile units and\ - excellent defenders. Similar to an Explorer, they\ - treat every land tile like a road were on it.\ -"), _("\ -\nThe discovery of Labor Union changes upkeep from shields to gold.\ -") - -[unit_riflemen] -name = _("Riflemen") -class = "Land" -tech_req = "Conscription" -obsolete_by = "None" -graphic = "u.riflemen" -graphic_alt = "-" -sound_move = "m_riflemen" -sound_move_alt = "m_generic" -sound_fight = "f_riflemen" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 5 -defense = 4 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -convert_to = "Workers" -convert_time = 2 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only -disembarks = "LandRoad", "LandRail", "Helicopter" -targets = "Balloon", "Helicopter", "LandRail" -flags = "MultiSlot", "FootSoldier", "Capturer", "CantReachAir", "Shield2Gold", "Settlers", "CanHide", "WillNever" -roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild" -helptext = _("\ -Riflemen are World War-era infantry. They are good at defending cities and\ - strategic Fortresses. They also have good attack capability.\ -"), _("\ -Under Communism this unit costs 5 less. Also, Communism tech allows Communist\ - governments to de-commission Riflemen into Workers via the Convert order. And vice versa.\ -"), _("\ -\nThe discovery of Labor Union changes upkeep from shields to gold.\ -") - -[unit_marines] -name = _("Marines") -class = "LandAirSea" -tech_req = "Amphibious Warfare" -obsolete_by = "None" -graphic = "u.marines" -graphic_alt = "-" -sound_move = "m_marines" -sound_move_alt = "m_generic" -sound_fight = "f_marines" -sound_fight_alt = "f_generic" -build_cost = 60 -pop_cost = 0 -attack = 8 -defense = 5 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 8 ; hard-coded the +4 extra for effect_physics_vision since it is a pre-req anyway -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter", "Land", "Sea", "LandRoad", "LandRail" -disembarks = "Helicopter", "Land", "Sea", "LandRoad", "LandRail" -targets = "Sea", "Balloon", "Helicopter", "LandRail" -flags = "MultiSlot", "Marines", "FootSoldier", "BeachLander", "Capturer", - "NeverBlocked", "Shield2Gold", "Settlers", "CanHide", "WillNever" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:Ranger"), - _("?vet_rank:Commando"), - _("?vet_rank:Green Beret"), - _("?vet_rank:Navy SEAL") -veteran_base_raise_chance = 60, 50, 40, 30, 20, 15, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 250, 300, 350, 400 -veteran_move_bonus = 0, 0, 0, 1, 1, 1, 1 -roles = "DefendOk", "DefendOkStartUnit", "BarbarianSeaTech" -helptext = _("\ -Marines are experts at amphibious war. They are the strongest\ - foot unit in the game, and are armed with diverse weaponry.\n\ - Unlike other units, Marines can attack Sea units (at a penalty).\ - Air units do not stop them from attacking reachable targets.\ - They can attack from a Transport or Helicopter. Marines promoted to three\ - veteran levels become commandos suitable for special ops.\n\ - Marines built in a city with an Airport, Port Facility, and Barracks III\ - receive the second veteran level (hardened.)\ -"), _("\ -\nThe discovery of Labor Union changes upkeep from shields to gold.\ -") - -[unit_paratroopers] -name = _("Paratroopers") -class = "Land" -tech_req = "Combined Arms" -obsolete_by = "None" -graphic = "u.paratroopers" -graphic_alt = "-" -sound_move = "m_paratroopers" -sound_move_alt = "m_generic" -sound_fight = "f_paratroopers" -sound_fight_alt = "f_generic" -build_cost = 60 -pop_cost = 0 -attack = 6 -defense = 4 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only -disembarks = "LandRoad", "LandRail", "Helicopter" -targets = "Balloon", "Helicopter", "LandRail" -flags = "Paratroopers", "FootSoldier", "Capturer", "CantReachAir", "Provoking", - "Shield2Gold", "MultiSlot", "Settlers", "CanHide", "WillNever" -roles = "DefendOk", "DefendOkStartUnit" -helptext = _("\ -Paratroopers are experts at airborne attacks.\ - From a friendly city or airbase, Paratroopers who have not used any\ - move points can paradrop directly to any tile in range, and be\ - immediately ready to act there. Beware dropping into unseen territory,\ - as Paratroopers landing on a tile occupied by enemy units will be lost.\ - Also note: Paradropping is assumed to be done from aircraft. Therefore,\ - Fighters on Vigil may auto-attack the tile you land on, if adjacent.\ -"), _("\ -\nThe discovery of Labor Union changes upkeep from shields to gold.\ -") -paratroopers_range = 14 -paratroopers_mr_req = 1 -paratroopers_mr_sub = 0 - -[unit_mech_inf] -name = _("Mechanized Infantry") -rule_name = "Mech. Inf." -class = "Land" -tech_req = "Labor Union" -obsolete_by = "None" -graphic = "u.mech_inf" -graphic_alt = "-" -sound_move = "m_mech_inf" -sound_move_alt = "m_generic" -sound_fight = "f_mech_inf" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 6 -defense = 6 -hitpoints = 30 -firepower = 1 -move_rate = 6 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter" ; transport helicopter only -;disembarks = "Helicopter" -targets = "Balloon", "Helicopter", "LandRail" -flags = "CantReachAir", "Shield2Gold", "MultiSlot", "WillNever" -roles = "DefendGood", "DefendGoodStartUnit" -helptext = _("\ -Mechanized Infantry have the strongest general defense strength of any land unit.\ - They have decent attack strength in open field engagements, and excellent mobility.\ -"), _("\ -\nUpkeep for Mechanized infantry is paid in gold instead of shields.\ -") - -[unit_horsemen] -name = _("Horsemen") -class = "Land" -tech_req = "Horseback Riding" -obsolete_by = "Knights" -graphic = "u.horsemen" -graphic_alt = "-" -sound_move = "m_horsemen" -sound_move_alt = "m_generic" -sound_fight = "f_horsemen" -sound_fight_alt = "f_generic" -build_cost = 20 -pop_cost = 0 -attack = 2 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "Horse", "CantReachAir", "WillNever" -roles = "AttackFastStartUnit", "Barbarian", "Hunter" -helptext = _("\ -Horsemen are mounted warriors and an early shock-troop that can penetrate deep into\ - enemy territory.\ -") - -[unit_chariot] -name = _("Chariot") -class = "Land" -tech_req = "The Wheel" -obsolete_by = "Knights" -graphic = "u.chariot" -graphic_alt = "-" -sound_move = "m_chariot" -sound_move_alt = "m_generic" -sound_fight = "f_chariot" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 3 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "Horse", "Capturer", "CantReachAir", "WillNever" -roles = "AttackFastStartUnit", "Hunter" -helptext = _("\ -Chariots are horse-pulled war wagons, stronger but more expensive than horsemen.\ -") - -[unit_elephants] -name = _("Elephants") -class = "Land" -tech_req = "Polytheism" -obsolete_by = "Crusaders" -graphic = "u.elephants" -graphic_alt = "-" -sound_move = "m_elephants" -sound_move_alt = "m_generic" -sound_fight = "f_elephants" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 4 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "Horse", "Capturer", "CantReachAir", "WillNever" -roles = "AttackFastStartUnit" -helptext = _("\ -Elephants are towering animals trained for war. Their mobility and formidable\ - attack strength make them excellent for offensive engagements, but they\ - defend poorly against most units.\ -") - -[unit_crusaders] -name = _("Crusaders") -class = "Land" -tech_req = "Monotheism" -obsolete_by = "Dragoons" -graphic = "u.crusaders" -graphic_alt = "-" -sound_move = "m_crusaders" -sound_move_alt = "m_generic" -sound_fight = "f_crusaders" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 5 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "Horse", "Capturer", "CantReachAir", "WillNever" -roles = "AttackFastStartUnit" -helptext = _("\ -Crusaders are mounted warriors driven by a higher cause.\ - They have superior attack to Knights, but are poor at defending.\ - They are ideally suited for leading the charge in offensive campaigns.\ -") - -[unit_knights] -name = _("Knights") -class = "LandNoKill" -tech_req = "Chivalry" -obsolete_by = "Dragoons" -graphic = "u.knights" -graphic_alt = "-" -sound_move = "m_knights" -sound_move_alt = "m_generic" -sound_fight = "f_knights" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 4 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -bonuses = - { "flag", "type", "value" - "Horse", "DefenseMultiplier", 2 - "FootSoldier", "DefenseMultiplier", 1 - } -flags = "Horse", "Capturer", "CantReachAir", "WillNever" -roles = "AttackFastStartUnit", "BarbarianTech", - "BarbarianBuildTech", "BarbarianSeaTech", "Hunter" -helptext = _("\ -Knights are heavily armored mounted warriors. They defend at D:3 against mounted units.\ - They defend at D:2 against foot units. They defend at D:1 against everything else.\ - Their noble status allows them to attack cities without population reduction.\ -") - -[unit_dragoons] -name = _("Dragoons") -class = "Land" -tech_req = "Leadership" -obsolete_by = "Cavalry" -graphic = "u.dragoons" -graphic_alt = "-" -sound_move = "m_dragoons" -sound_move_alt = "m_generic" -sound_fight = "f_dragoons" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 5 -defense = 2 -hitpoints = 20 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "LandRail" -flags = "Horse", "Capturer", "CantReachAir", "WillNever" -roles = "AttackFastStartUnit", "BarbarianBuildTech", "BarbarianSeaTech", "Hunter" -helptext = _("\ -Dragoons are mounted warriors carrying early firearms.\ - Being the first highly mobile gunpowder unit, they are\ - formidable for offensive campaigns.\ -") - -[unit_cavalry] -name = _("Cavalry") -class = "Land" -tech_req = "Tactics" -obsolete_by = "Armor" -graphic = "u.cavalry" -graphic_alt = "-" -sound_move = "m_cavalry" -sound_move_alt = "m_generic" -sound_fight = "f_cavalry" -sound_fight_alt = "f_generic" -build_cost = 60 -pop_cost = 0 -attack = 8 -defense = 3 -hitpoints = 20 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter", "LandRail" -bonuses = - { "flag", "type", "value" - "Helicopter", "DefenseDividerPct", -50 - ; the only ground unit not covered by "FootSoldier" or "Horse", gets an attack bonus of -50% instead of heli defend bonus of +50% - } -flags = "Capturer", "CantReachAir", "WillNever" -roles = "AttackFastStartUnit", "Hunter" -helptext = _("\ -The combination of mobility and superior attack strength make Cavalry\ - the most feared offensive unit in their era.\ -") - -[unit_armor] -name = _("Armor") -class = "Land" -tech_req = "Mobile Warfare" -obsolete_by = "Armor II" -graphic = "u.armor" -graphic_alt = "-" -sound_move = "m_armor" -sound_move_alt = "m_generic" -sound_fight = "f_armor" -sound_fight_alt = "f_generic" -build_cost = 80 -pop_cost = 0 -attack = 10 -defense = 5 -hitpoints = 30 -firepower = 1 -move_rate = 6 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter" ; transport helicopter only -;disembarks = "Helicopter" -targets = "Balloon", "Helicopter", "LandRail" -flags = "CantReachAir", "FortBuster", "WillNever" -roles = "AttackFastStartUnit", "Hunter" -helptext = _("\ -Armor is the mechanized equivalent of a Cavalry unit. They have high attack strength,\ - superb mobility, and the highest defense of any offensive unit. They are massive all-terrain\ - vehicles, well-suited for penetrating defensive fortifications: Units inside Forts get no defense\ - bonus against Armor. Units inside Fortresses get a reduced bonus of 1.67x instead of 2x.\ -") - -[unit_armor_ii] -name = _("Armor II") -class = "Land" -tech_req = "Plastics" -obsolete_by = "None" -graphic = "u.armor_ii" -graphic_alt = "u.armor" -sound_move = "m_armor_ii" -sound_move_alt = "m_armor" -sound_fight = "f_armor_ii" -sound_fight_alt = "f_armor" -build_cost = 80 -pop_cost = 0 -attack = 16 -defense = 6 -hitpoints = 30 -firepower = 1 -move_rate = 6 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter" ; transport helicopter only -;disembarks = "Helicopter" -targets = "Balloon", "Helicopter", "LandRail" -bonuses = - { "flag", "type", "value" - "Missile", "DefenseMultiplier", 1 - } -flags = "CantReachAir", "FortressBuster", "NeverBlocked", "WillNever" -roles = "AttackFastStartUnit", "Hunter" -helptext = _("\ -Armor II is the ultra-modern upgrade to Armor. It features high tech composite armor and\ - electronic countermeasures (ECM). Forts and Fortresses gain no bonus against\ - its ability to blast and break through fortifications. ECM and composite armor\ - give a 2x defense bonus against Missiles. Unlike most land units,\ - Armor II can attack reachable units regardless of whether unreachable units protect the tile.\ -") - -[unit_catapult] -name = _("Catapult") -class = "Land" -tech_req = "Mathematics" -obsolete_by = "Cannon" -graphic = "u.catapult" -graphic_alt = "-" -sound_move = "m_catapult" -sound_move_alt = "m_generic" -sound_fight = "f_catapult" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 6 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "CantReachAir", "WillNever" -roles = "" -helptext = _("\ -Catapults are war machines that hurl massive rocks to crush\ - and break their targets. They are strong attackers but equally\ - weak defenders, and will need an escort to be effective.\ -") - -[unit_cannon] -name = _("Cannon") -class = "Land" -tech_req = "Metallurgy" -obsolete_by = "Artillery" -graphic = "u.cannon" -graphic_alt = "-" -sound_move = "m_cannon" -sound_move_alt = "m_generic" -sound_fight = "f_cannon" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 8 -defense = 1 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter" ; transport helicopter only -disembarks = "Helicopter" -targets = "LandRail" -flags = "CantReachAir", "WillNever" -roles = "BarbarianTech", "BarbarianBuildTech" -helptext = _("\ -Cannons are huge guns that fire heavy metallic projectiles. They are strong\ - attackers but weak defenders, so they need an escort to be effective.\ -") - -[unit_artillery] -name = _("Artillery") -class = "Land" -tech_req = "Machine Tools" -obsolete_by = "Howitzer" -graphic = "u.artillery_o" -graphic_alt = "-" -sound_move = "m_artillery" -sound_move_alt = "m_generic" -sound_fight = "f_artillery" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 10 -defense = 1 -hitpoints = 20 -firepower = 2 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter" ; transport helicopter only -disembarks = "Helicopter" -targets = "Balloon", "LandRail" -flags = "CantReachAir", "WillNever" -roles = "" -helptext = _("\ -Artillery are a major upgrade to Cannons, with doubled firepower. They are\ - superb attackers but poor at defense. They need an escort to be effective.\ -") - -[unit_anti_aircraft] -name = _("Anti-Aircraft Artillery") -class = "LandAirSea" -tech_req = "Flight" -obsolete_by = "None" -graphic = "u.anti_aircraft" -graphic_alt = "u.howitzer" -sound_move = "m_anti_aircraft" -sound_move_alt = "m_generic" -sound_fight = "f_anti_aircraft" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 2 -defense = 2 -hitpoints = 20 -firepower = 2 -move_rate = 2 -vision_radius_sq = 8; hard-coding in physics bonus here since its a req, lets us cut making a new effect -convert_to = "Mobile SAM" -convert_time = 7 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "LandRoad", "Helicopter" -disembarks = "LandRoad", "Helicopter" -targets = "Air", "AirProtect", "Sea", "Balloon", "Helicopter", "LandRail" -bonuses = - { "flag", "type", "value" - "AirAttacker", "DefenseDivider", 1 - "AirAttacker", "DefenseMultiplier", 1 - } -flags = "NeverBlocked", "AntiAir", "Marines", "WillNever", "TransportDefender" -roles = "" -helptext = _("\ -Anti-Aircraft Artillery (AAA) can attack almost anything from anywhere. AAA get a\ - 2x bonus against Air units. AAA qualify as weaponry for Marines and have the same\ - abilities: they can be transported on any unit that carries Marines, can attack from\ - or to non-native tiles, and do not lose a turn when unloading. (AAA cannot attack Submarines, Missiles,\ - or Jet Bombers.)\ -"), _(" -After Space Flight and 10 turns of service, AAA can be retrofitted to\ - Mobile SAM. The Convert order must be done in your capital, and takes 4 turns.\ -") - -[unit_mobile_sam] -name = _("Mobile SAM") -class = "Land" -tech_req = "Space Flight" -obsolete_by = "None" -graphic = "u.mobile_sam" -graphic_alt = "u.howitzer" -sound_move = "m_howitzer" -sound_move_alt = "m_generic" -sound_fight = "f_mobile_sam" -sound_fight_alt = "f_generic" -build_cost = 75 -pop_cost = 0 -attack = 2 -defense = 2 -hitpoints = 30 -firepower = 2 -move_rate = 6 -vision_radius_sq = 4 -transport_cap = 1 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter" ; transport helicopter only -disembarks = "Helicopter" -targets = "Air", "AirProtect", "AirPillage", "Balloon", "Helicopter", "LandRail" -cargo = "Missile" -bonuses = - { "flag", "type", "value" - "AirAttacker", "DefenseDivider", 1 - "AirAttacker", "DefenseMultiplier", 1 - } -flags = "NeverBlocked", "AntiAir", "WillNever" -roles = "" -helptext = _("\ -The Mobile SAM is the strongest Anti-Air unit on the ground. It can\ - attack nearby aircraft. It has a 2x bonus against all Air units. The\ - Mobile SAM can also carry one Missile of any type. Unlike the AAA, it\ - cannot attack non-native tiles or attack while transported.\ -"), _(" -AAA can upgrade to Mobile SAM for free on its 10th turn of service.\ - The Convert order must be done in the capital city and takes 4 turns.\ -") - -[unit_howitzer] -name = _("Howitzer") -class = "Land" -tech_req = "Robotics" -obsolete_by = "None" -graphic = "u.howitzer_o" -graphic_alt = "u.howitzer" -sound_move = "m_howitzer" -sound_move_alt = "m_generic" -sound_fight = "f_howitzer" -sound_fight_alt = "f_generic" -build_cost = 70 -pop_cost = 0 -attack = 12 -defense = 2 -hitpoints = 30 -firepower = 2 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter" ; transport helicopter only -disembarks = "Helicopter" -targets = "Balloon", "LandRail" -flags = "CantReachAir", "WillNever" -roles = "" -helptext = _("\ -Howitzers are upgraded Artillery with significant increase in mobility and attack strength. They can fire over city walls, ignoring their effect.\ -") - -[unit_balloon] -name = _("Balloon") -class = "Balloon" -tech_req = "Chemistry" -obsolete_by = "None" -graphic = "u.balloon" -graphic_alt = "u.trireme" -sound_move = "m_balloon" -sound_move_alt = "m_trireme" -sound_fight = "f_warrior" -sound_fight_alt = "f_generic" -build_cost = 25 -pop_cost = 0 -attack = 0 -defense = 0 -hitpoints = 10 -firepower = 1 -move_rate = 5 -vision_radius_sq = 17 -transport_cap = 0 -fuel = 2 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -flags = "Unbribable", "HasNoZOC", "NeverProtects", "NonMil", "NoVeteran" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_base_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "" -helptext = _("\ -Balloons gather intel on potential battle areas. They have great vision and\ - are unreachable by units prior to Riflemen and Ironclads. They can stay in\ - the air for one Turn Change before landing in a City, Fortress, Naval Base,\ - Airbase, or transport unit with cargo capacity of 4+. Balloons do not block units under\ - them from being attacked, and cannot fly over mountains.\ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_airplane] -name = _("Airplane") -class = "Air" -tech_req = "Flight" -obsolete_by = "None" -graphic = "u.airplane" -graphic_alt = "u.awacs" -sound_move = "pm_prop_fighters" -sound_move_alt = "m_generic" -sound_fight = "f_fighter" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 20 -firepower = 1 -move_rate = 20 -vision_radius_sq = 8 -transport_cap = 1 -fuel = 2 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "HasNoZOC", "NoVeteran", "Unbribable", "Expellable", "NeverProtects", "CanEscape", "Provoking" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_base_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "" -cargo = "Land" -helptext = _("\ -Airplanes can carry a single diplomatic unit. They can land in any domestic or allied\ - city. For missions to non-allied nations, an empty Airbase must be available for landing.\ - Airplanes have two turns of fuel. Each new aviation tech upgrades range by +2 moves per turn.\ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_fighter] -name = _("Fighter") -class = "AirProtect" -tech_req = "Flight" -obsolete_by = "Jet Fighter" -graphic = "u.fighter" -graphic_alt = "-" -sound_move = "m_fighter" -sound_move_alt = "m_generic" -sound_fight = "f_fighter" -sound_fight_alt = "f_generic" -build_cost = 60 -pop_cost = 0 -attack = 4 -defense = 3 -hitpoints = 20 -firepower = 2 -move_rate = 20 -vision_radius_sq = 12 -transport_cap = 0 -fuel = 1 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Air", "AirProtect", "Missile", "Balloon", "Helicopter", "LandRail" -bonuses = - { "flag", "type", "value" - } -flags = "AirAttacker", "Unbribable", "HasNoZOC", "CanEscape", - "AirProtector", "Provoking" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_base_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -Fighters are the first offensive Air units. Their superior mobility and firepower alter\ - the very nature of warfare. They can move anywhere and attack any unit (except Submarines\ - and Jet Bombers.)\n\ -"), _(" -INTERCEPTOR: the Vigil order lets Fighters auto-attack adjacent Air units if they\ - have better attack odds. A Fighter can Vigil if it uses 2 move points or less.\n\ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_escort_fighter] -name = _("Escort Fighter") -class = "AirProtect" -tech_req = "Radio" -obsolete_by = "Jet Fighter" -graphic = "u.escort_fighter" -graphic_alt = "u.fighter" -sound_move = "m_escort_fighter" -sound_move_alt = "m_generic" -sound_fight = "f_fighter" -sound_fight_alt = "f_generic" -build_cost = 80 -pop_cost = 0 -attack = 3 -defense = 5 -hitpoints = 20 -firepower = 2 -move_rate = 18 -vision_radius_sq = 12 -transport_cap = 0 -fuel = 2 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Air", "AirProtect", "Missile", "Balloon", "Helicopter", "LandRail" -bonuses = - { "flag", "type", "value" - } -flags = "AirAttacker", "Unbribable", "HasNoZOC", "CanEscape", "AirProtector", "Provoking" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -Escort Fighters are large fighters with high fuel capacity. Higher mass and\ - stronger construction allow them to absorb more damage. They do not attack\ - as well as standard Fighters, but can return home on the next turn. They are\ - good for long-range missions, defensive air support, and escorting bombers.\ -"), _(" -INTERCEPTOR: the Vigil order lets Escort Fighters auto-attack adjacent Air units if they\ - have better attack odds. This unit can Vigil if it uses 3 move points or less.\n\ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_dive_bomber] -name = _("Dive Bomber") -class = "Air" -tech_req = "Radio" -obsolete_by = "Ground Strike Fighter" -graphic = "u.dive_bomber" -graphic_alt = "-" -sound_move = "m_dive_bomber" -sound_move_alt = "m_escort_fighter" -sound_fight = "f_medium_bomber" -sound_fight_alt = "f_artillery" -build_cost = 60 -pop_cost = 0 -attack = 3 -defense = 3 -hitpoints = 20 -firepower = 2 -move_rate = 18 -vision_radius_sq = 12 -transport_cap = 0 -fuel = 1 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Air", "AirProtect", "Balloon", "Helicopter", "LandRail" -bonuses = - { "flag", "type", "value" - ; A4.5 vs all Surface Units - "CantReachAir", "DefenseDividerPct", 50 - "NonMil", "DefenseDividerPct", 50 ; NonMil don't have CantReachAir flag - "AntiAir", "DefenseDividerPct", 50 ; AntiAir don't hav CantReachAir flag - - ; Cancel CantReachAir bonus on Bombers - "FieldUnit", "DefenseDividerPct", -50 - ; D4 vs Anti-Air - "AntiAir", "DefenseMultiplierPct", 33 - } -flags = "AirAttacker", "Unbribable", "CanEscape", - "NeverProtects", "Provoking", "WillNever" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_base_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -Dive Bombers are like Fighters but fitted for Ground Attack and Sea combat. Range\ - is reduced by heavy armor and armaments which help in attacking surface targets\ - and in defending against Anti-Air, but hurt in Air-to-Air combat. Though unreachable\ - to Land units, they lack agility to block attacks on their same tile. But over a wider\ - radius, they exert ZoC on adjacent land tiles. The Dive Bomber is not an interceptor.\ - Role specialization yields the following gains and losses over a Fighter:\n\n\ - GAINS:\n\ - • A:4½ vs Surface units (Land or Sea)\n\ - • D:4 vs Anti-Air\n\ - • ZoC\n\ -LOSSES:\n\ - • A3 instead of A4 in Air-to-Air\n\ - • Can't block its tile\n\ - • Can't intercept\ -"), _(" -Communists pay 10 less for this unit. GOTO prevents unit loss from lack of fuel.\ - Override this by ordering adjacent moves.\ -") - -[unit_medium_bomber] -name = _("Medium Bomber") -class = "Air" -tech_req = "Advanced Flight" -obsolete_by = "Jet Bomber" -graphic = "u.medium_bomber" -graphic_alt = "u.bomber" -sound_move = "m_medium_bomber" -sound_move_alt = "m_generic" -sound_fight = "f_medium_bomber" -sound_fight_alt = "f_generic" -build_cost = 85 -pop_cost = 0 -attack = 7 -defense = 2 -hitpoints = 20 -firepower = 2 -move_rate = 15 -vision_radius_sq = 12 -transport_cap = 0 -fuel = 2 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "LandRail" -bonuses = - { "flag", "type", "value" - } -flags = "FieldUnit", "Unbribable", "AirAttacker", "HasNoZOC", "CanEscape", - "CantReachAir", "NeverProtects", "Provoking", "WillNever" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_base_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -The Medium Bomber is well suited for moderately strong targets or multiple weak targets.\ - It may not attack other Air units. It is a Soft Field Unit and can't carry Bomb\ - units, causing less discontent than other types of Bombers.\n\ -➤ Unhappy effect for Soft Field units:\n\ -Republic:0 Democracy:1 (non-aggressive)\n\ -Republic:1 Democracy:2 (aggressive)\ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_heavy_bomber] -name = _("Heavy Bomber") -class = "Air" -tech_req = "Radar" -obsolete_by = "Jet Bomber" -graphic = "u.heavy_bomber_o" -graphic_alt = "u.bomber" -sound_move = "m_bomber" -sound_move_alt = "m_generic" -sound_fight = "f_heavy_bomber" -sound_fight_alt = "f_bomber" -build_cost = 120 -pop_cost = 0 -attack = 12 -defense = 3 -hitpoints = 20 -firepower = 2 -move_rate = 16 -vision_radius_sq = 12 -transport_cap = 1 -fuel = 2 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "LandRail" -cargo = "Bomb" -bonuses = - { "flag", "type", "value" - } -flags = "FieldUnit", "Unbribable", "AirAttacker", "HasNoZOC", "CanEscape", - "CantReachAir", "NeverProtects", "Provoking", "WillNever" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_base_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -Heavy Bombers are large and sturdy Bombers with larger payload and numerous gunner defense stations.\ - They are excellent for hitting strong well-defended ground targets.\ - They cannot attack Air units. They can carry one Bomb. Like most Bombers, the Heavy Bomber is a Field Unit.\ - Field Units cause the same unhappiness no matter if aggressively or peacefully deployed.\n\ -➤ Unhappy effect for Field units:\n\ -Republic:1 Democracy:2\ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_strategic_bomber] -name = _("Strategic Bomber") -class = "Air" -tech_req = "Rocketry" -obsolete_by = "Jet Bomber" -graphic = "u.ultra_heavy_bomber_o" -graphic_alt = "u.bomber" -sound_move = "m_strategic_bomber" -sound_move_alt = "m_bomber" -sound_fight = "f_strategic_bomber" -sound_fight_alt = "f_bomber" -build_cost = 135 -pop_cost = 0 -attack = 13 -defense = 4 -hitpoints = 20 -firepower = 2 -move_rate = 16 -vision_radius_sq = 12 -transport_cap = 2 -fuel = 3 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "LandRail" -cargo = "Bomb" -bonuses = - { "flag", "type", "value" - } -flags = "FieldUnit", "Unbribable", "AirAttacker", "HasNoZOC", "CanEscape", - "CantReachAir", "NeverProtects", "Provoking", "WillNever" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_base_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -The Strategic Bomber offers a small improvement in attack. Higher altitude offers a good upgrade in\ - defense. It has considerably longer range, with one more turn of fuel. May carry two Bombs.\ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_awacs] -name = _("AWACS") -class = "Air" -tech_req = "Radar" -obsolete_by = "Spy Plane" -graphic = "u.awacs_o" -graphic_alt = "u.awacs" -sound_move = "m_awacs" -sound_move_alt = "m_generic" -sound_fight = "f_awacs" -sound_fight_alt = "f_generic" -build_cost = 140 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 20 -firepower = 1 -move_rate = 32 -vision_radius_sq = 46 -transport_cap = 0 -fuel = 2 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "HasNoZOC", "NoVeteran", "Unbribable", "Expellable", "NeverProtects", "CanEscape", "Provoking" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_base_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "" -helptext = _("\ -The AWACS has great fuel capacity for long range flights, and advanced radar that can determine\ - the location of enemy units over a wide area. The AWACS has 2 turns of fuel.\ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_spy_plane] -name = _("Spy Plane") -class = "Air" -tech_req = "Stealth" -obsolete_by = "None" -graphic = "u.spy_plane_o" -graphic_alt = "u.awacs" -sound_move = "m_awacs" -sound_move_alt = "m_generic" -sound_fight = "f_awacs" -sound_fight_alt = "f_generic" -build_cost = 160 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 20 -firepower = 1 -move_rate = 34 -vision_radius_sq = 46 -transport_cap = 0 -fuel = 2 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -vision_layer = "Stealth" -flags = "HasNoZOC", "NoVeteran", "Unbribable", "NeverProtects", "CanEscape", "Provoking" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_base_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "" -helptext = _("\ -The Spy Plane is an ultrasonic high altitude aircraft with long range. It gathers\ - intel over a wide area. Stealth technology makes it invisible, except to enemies on\ - adjacent tiles. Spy Planes have 2 turns of fuel.\ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_transport_helicopter] -; /* TRANS: unit type */ -name = _("Transport Helicopter") -class = "Helicopter" -tech_req = "Combined Arms" -obsolete_by = "None" -graphic = "u.t_helicopter" -graphic_alt = "u.helicopter" -sound_move = "m_helicopter" -sound_move_alt = "m_generic" -sound_fight = "f_helicopter" -sound_fight_alt = "f_generic" -build_cost = 90 -pop_cost = 0 -attack = 0 -defense = 3 -hitpoints = 21 -firepower = 2 -move_rate = 12 -vision_radius_sq = 12 -transport_cap = 3 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -bonuses = - { "flag", "type", "value" - "FootSoldier", "DefenseMultiplierPct", 50 ; all Infantry (Foot and Mech.) - "Horse", "DefenseMultiplierPct", 50 - ;Cavalry is covered by it getting a separate "attack bonus of -50%" - } -cargo = "Land", "LandAirSea", "LandNoKill" -flags = "Helicopter", "AirAttacker", "Unbribable", "Provoking", - "CanEscape", "WillNever", "HasNoZOC" - ; Tranport Heli is provoking; Fighters don't like them. -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -Transport Helicopters can carry three land units.\ -"), _("\ - Foot and artillery types can unload on any tile, but will lose moves (except Marines).\ - Other types need a city or base to unload.\n.\ -"), _("\ - Helicopters lose 1 hp for each turn not ended in a City, Base, or Carrier. +1 move\ - is awarded if starting a turn in a City or Airbase.\n\ -"), _("\ - All Helicopters can be attacked by land from Riflemen onward; by sea from Ironclad\ - onward; get +50% defence vs. foot units; and are unreachable to artillery types.\ - Unlike attack Helicopters, Transport Helicopters are intercepted by Fighters on vigil.\ -") - -[unit_helicopter] -; /* TRANS: unit type */ -name = _("Helicopter") -class = "Helicopter" -tech_req = "Combined Arms" -obsolete_by = "None" -graphic = "u.helicopter" -graphic_alt = "-" -sound_move = "m_helicopter" -sound_move_alt = "m_generic" -sound_fight = "f_helicopter" -sound_fight_alt = "f_generic" -build_cost = 95 -pop_cost = 0 -attack = 10 -defense = 5 -hitpoints = 21 -firepower = 2 -move_rate = 12 -vision_radius_sq = 12 -transport_cap = 1 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter", "LandRail" -bonuses = - { "flag", "type", "value" - "FootSoldier", "DefenseMultiplierPct", 50 ; all Infantry (Foot and Mech.) - "Horse", "DefenseMultiplierPct", 50 - ;Cavalry is covered by it getting a separate "attack bonus of -50%" - } -cargo = "LandAirSea" -flags = "Helicopter", "AirAttacker", "Unbribable", - "CanEscape", "WillNever" - ; Heli is low-altitude and non-provoking: if it's ever thought to be OP, - ; changing this flag fixes that right away. But currently it MIGHT be UnP - ; because hp_loss, range, city walls, and Ground Strike Fighter -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -Helicopters are the Air Cavalry of modern armies. They can attack multiple targets\ - and conquer cities. Unaffected by terrain, they are good for Partisan suppression.\ - They can transport Marines and AAA and are thus well-suited for commando ops.\n\ -"), _("\ -For each turn not ended in a City, Base, or Carrier, 1hp is lost. +1 move\ - is awarded if starting a turn in a City or Airbase.\n\ -"), _("\ -Helicopters fly low to avoid Interception. This invites attacks by ground units from\ - Riflemen onward. They are unreachable to Artillery types and get +50% defense\ - vs. foot units. City Walls get a defense bonus against them;\ - SAM Batteries do not. Helicopters can be attacked by Sea from Ironclad onward.\n\ -"), _("\ -Helicopters can transport one Marines or AAA unit.\ -") - -[unit_jet_fighter] -name = _("Jet Fighter") -class = "AirProtect" -tech_req = "Avionics" -obsolete_by = "None" -graphic = "u.jet_fighter" -graphic_alt = "u.stealth_fighter" -sound_move = "m_jet_fighter" -sound_move_alt = "m_stealth_fighter" -sound_fight = "f_jet_fighter" -sound_fight_alt = "f_stealth_fighter" -build_cost = 70 -pop_cost = 0 -attack = 6 -defense = 5 -hitpoints = 20 -firepower = 2 -move_rate = 24 -vision_radius_sq = 12 -transport_cap = 0 -fuel = 1 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Air", "AirProtect", "AirPillage", "Missile", "Balloon", "Helicopter", "LandRail" -bonuses = - { "flag", "type", "value" - } -flags = "AirAttacker", "Unbribable", "HasNoZOC", "CanEscape", "AirProtector", "Provoking" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_base_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -Jet Fighters upgrade the Fighter with improved attack, defense, and range.\ -"), _(" -INTERCEPTOR: the Vigil order Jets Fighters auto-attack adjacent Air units if they\ - have better attack odds. This unit can Vigil if it uses 3 move points or less.\n\ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_ground_strike_fighter] -name = _("Ground Strike Fighter") -class = "Air" -tech_req = "Avionics" -obsolete_by = "None" -graphic = "u.strike_fighter" -graphic_alt = "-" -sound_move = "m_strike_fighter" -sound_move_alt = "m_jet_fighter" -sound_fight = "f_medium_bomber" -sound_fight_alt = "f_artillery" -build_cost = 80 -pop_cost = 0 -attack = 7 -defense = 4 -hitpoints = 20 -firepower = 2 -move_rate = 21 -vision_radius_sq = 12 -transport_cap = 0 -fuel = 2 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Air", "AirPillage", "Balloon", "Helicopter", "LandRail" -bonuses = - { "flag", "type", "value" - "AntiAir", "DefenseMultiplierPct", 33 ; D5.33 vs Anti-Air - } -flags = "AirAttacker", "Unbribable", "CanEscape", "NeverBlocked", - "NeverProtects", "Provoking", "WillNever" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_base_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -Ground Strike Fighters upgrade the Dive Bomber. They cannot block attacks on other\ - units on their tile, nor engage against Fighters. However, like the Dive Bomber,\ - they can interdict ZoC over land tiles. High fuel capacity allows two turns in the\ - air. No unit can stop this unit from attacking surface units on a tile. This unit\ - can also do pinpointed surgical strikes to pillage tiles. This aircraft is a\ - specialized niche unit. It is not an interceptor.\n\ -NOTE: GOTO prevents unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_jet_bomber] -name = _("Jet Bomber") -class = "AirPillage" -tech_req = "Space Flight" -obsolete_by = "None" -graphic = "u.jet_bomber_o" -graphic_alt = "u.bomber" -sound_move = "m_jet_bomber" -sound_move_alt = "m_bomber" -sound_fight = "f_jet_bomber" -sound_fight_alt = "f_bomber" -build_cost = 145 -pop_cost = 0 -attack = 15 -defense = 1 -hitpoints = 20 -firepower = 2 -move_rate = 19 -vision_radius_sq = 12 -transport_cap = 3 -fuel = 3 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "LandRail" -cargo = "Bomb" -flags = "FieldUnit", "Unbribable", "AirAttacker", "HasNoZOC", "CanEscape", - "CantReachAir", "NeverProtects", "Provoking", "WillNever" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_base_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -Jet Bombers are stratospheric long-range bombers with 3 turns of fuel: they can be airborne for two\ - turn-changes. Their range makes them useful even after Stealth Bombers are available. Stratospheric\ - altitude is unreachable to propeller-based Fighters and AAA. Jet Bombers can carpet-bomb,\ - pillaging tiles from the air. May carry three Bombs.\ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_stealth_fighter] -name = _("Stealth Fighter") -class = "AirProtect" -tech_req = "Stealth" -obsolete_by = "None" -graphic = "u.stealth_fighter" -graphic_alt = "-" -sound_move = "m_stealth_fighter" -sound_move_alt = "m_generic" -sound_fight = "f_stealth_fighter" -sound_fight_alt = "f_generic" -build_cost = 80 -pop_cost = 0 -attack = 8 -defense = 4 -hitpoints = 20 -firepower = 2 -move_rate = 28 -vision_radius_sq = 12 -transport_cap = 0 -fuel = 1 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Air", "AirProtect", "AirPillage", "Missile", "Balloon", "Helicopter", "LandRail" -bonuses = - { "flag", "type", "value" - "AntiAir", "DefenseDividerPct", 25 - "AntiAir", "DefenseMultiplierPct", 25 - } -vision_layer = "Stealth" -flags = "AirAttacker", "Unbribable", "HasNoZOC", "CanEscape", "AirProtector", "Provoking" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_base_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -The most advanced Fighter, with improved attack and longer range. Stealth Fighters cannot be seen unless adjacent\ - to an enemy. Stealth evasion gives a 25% bonus against all Anti-Air units, and reduces\ - SAM Batteries down to a smaller 25% bonus.\ -"), _(" -INTERCEPTOR: the Vigil order lets Stealth Fighters auto-attack adjacent Air units if they\ - have better attack odds. This unit can Vigil if it uses 4 move points or less.\n\ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_stealth_bomber] -name = _("Stealth Bomber") -class = "Air" -tech_req = "Stealth" -obsolete_by = "None" -graphic = "u.stealth_bomber_o" -graphic_alt = "u.stealth_bomber" -sound_move = "m_stealth_bomber" -sound_move_alt = "m_generic" -sound_fight = "f_stealth_bomber" -sound_fight_alt = "f_generic" -build_cost = 160 -pop_cost = 0 -attack = 19 -defense = 5 -hitpoints = 20 -firepower = 2 -move_rate = 24 -vision_radius_sq = 12 -transport_cap = 2 -fuel = 2 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "LandRail" -bonuses = - { "flag", "type", "value" - "AntiAir", "DefenseDividerPct", 25 - "AntiAir", "DefenseMultiplierPct", 25 - } -vision_layer = "Stealth" -cargo = "Bomb" -flags = "FieldUnit", "AirAttacker", "HasNoZOC", "Unbribable", - "CanEscape", "CantReachAir", "NeverProtects", "Provoking", "WillNever" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_base_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -The deadliest Bomber, with improved attack and speed. Stealth Bombers cannot be seen\ - unless adjacent to an enemy. Stealth evasion gives a 25% bonus against all Anti-Air\ - units, and reduces SAM Batteries down to only a 25% bonus. May carry two Bombs.\ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_boat] -name = _("Boat") -class = "RiverShip" -tech_req = "None" -obsolete_by = "Trireme" -graphic = "u.boat" -graphic_alt = "-" -sound_move = "m_trireme" -sound_move_alt = "m_generic" -sound_fight = "f_trireme" -sound_fight_alt = "f_generic" -build_cost = 10 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 1 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea" -flags = "BadCityDefender", "HelpWonder", "TradeRoute", "CoastStrict", "NonMil", "HasNoZOC" -roles = "Ferryboat", "FerryStartUnit" -helptext = _("\ -Boats were used pre-historically for exploration,\ - transport, and interaction with other tribes. They\ - can travel rivers and oceans, but must always stay\ - near shore. Boats can carry one unit and do ancient\ - commerce: building Wonders or setting up Traderoutes\ - without Trade tech. Primitive bartering generates little\ - or no extra trade, but may help you advance faster or\ - create relations with ancient neighbors. To build\ - Wonders with Boats requires Currency.\ -") - -[unit_trireme] -name = _("Trireme") -class = "Trireme" -tech_req = "Alphabet" -obsolete_by = "Galley" -graphic = "u.trireme" -graphic_alt = "-" -sound_move = "m_trireme" -sound_move_alt = "m_generic" -sound_fight = "f_trireme" -sound_fight_alt = "f_generic" -build_cost = 20 -pop_cost = 0 -attack = 1 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 6 -vision_radius_sq = 4 -transport_cap = 2 -fuel = 2 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea" -flags = "BadCityDefender", "CantReachAir", "HelpWonder", - "TradeRoute", "Coast", "WillNever", "NonMil", "NonMilAttack" -roles = "Ferryboat", "FerryStartUnit" -helptext = _("\ -Triremes are used for exploration, transport, and Commerce.\ - The entry on Caravan explains what Commerce units may do.\ -"), _(" -Triremes can enter Deep Ocean, but there is risk: they must end every second\ - turn on river, coastline, or a city—or else be lost at sea. They can travel\ - and attack on rivers, but cannot attack the shore.\ -"), _(" -Like most ancient sea units, when it initiates combat there will be 15 rounds\ - of combat and 15 total hp lost between both units. This may or may not\ - result in a victor. Triremes do not cause unhappiness.\ -") - -[unit_longboat] -name = _("Longboat") -class = "RiverShip" -tech_req = "Map Making" -obsolete_by = "Caravel" -graphic = "u.longboat" -graphic_alt = "u.trireme" -sound_move = "m_longboat" -sound_move_alt = "m_trireme" -sound_fight = "f_trireme" -sound_fight_alt = "f_generic" -build_cost = 25 -pop_cost = 0 -attack = 2 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 6 -vision_radius_sq = 4 -transport_cap = 1 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea" -flags = "BadCityDefender", "CantReachAir", "WillNever" -roles = "Ferryboat", "Hunter" -helptext = _("\ -The Longboat is a warship. It can attack at sea, attack the shore, and carry one land\ - unit. It is useful for ancient sea campaigns. Longboats can travel on rivers.\ -"), _(" -Like most early sea units, when it initiates combat there will be 15 rounds\ - of combat and 15 total hp lost between both units. This may or may not\ - result in the loss of one of the units.\ -") - -[unit_galley] -name = _("Galley") -class = "RiverShip" -tech_req = "Seafaring" -obsolete_by = "Caravel" -graphic = "u.galley" -graphic_alt = "u.trireme" -sound_move = "m_galley" -sound_move_alt = "m_trireme" -sound_fight = "f_trireme" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 2 -defense = 2 -hitpoints = 10 -firepower = 1 -move_rate = 6 -vision_radius_sq = 4 -transport_cap = 2 -fuel = 0 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea" -flags = "BadCityDefender", "CantReachAir", "HelpWonder", - "Traderoute", "Only_Native_Attack", "WillNever", "NonMil", "NonMilAttack" -roles = "Ferryboat", "FerryStartUnit", "BarbarianBoat" -helptext = _("\ -The Galley is an all-purpose sea unit and upgrades the Trireme. It has decent\ - combat strength, can transport, and is a Commerce unit. The entry on Caravan\ - explains what Commerce units may do. Galleys can travel and attack on rivers,\ - but cannot attack the shore. Galleys do not cause unhappiness.\ -"), _(" -Like most early sea units, when it initiates an attack, there will be 15 rounds\ - of combat and 15 total hp lost between both units. This may or may not\ - result in the loss of one of the units.\ -") - -[unit_war_galley] -name = _("War Galley") -class = "RiverShip" -tech_req = "Astronomy" -obsolete_by = "Caravel" -graphic = "u.war_galley" -graphic_alt = "u.trireme" -sound_move = "m_war_galley" -sound_move_alt = "m_trireme" -sound_fight = "f_trireme" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 3 -defense = 3 -hitpoints = 10 -firepower = 1 -move_rate = 6 -vision_radius_sq = 4 -transport_cap = 3 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea" -flags = "BadCityDefender", "CantReachAir", "WillNever" -roles = "Ferryboat", "FerryStartUnit", "BarbarianBoat", "Hunter" -helptext = _("\ -The War Galley has improved offense, defense, and cargo capacity, but lacks commerce\ - ability. War Galleys can travel and attack on rivers, and do shore attacks from the sea.\ -"), _(" -Like most ancient sea units, when it initiates combat there will be 15 rounds\ - of combat and 15 total hitpoints lost between both units. This may or may not\ - result in the loss of one of the units.\ -") - -[unit_ram_ship] -name = _("Ram Ship") -class = "Sea" -tech_req = "Engineering" -obsolete_by = "Caravel" -graphic = "u.ram_ship" -graphic_alt = "u.trireme" -sound_move = "m_ram_ship" -sound_move_alt = "m_trireme" -sound_fight = "f_ram_ship" -sound_fight_alt = "f_catapult" -build_cost = 35 -pop_cost = 0 -attack = 4 -defense = 2 -hitpoints = 10 -firepower = 1 -move_rate = 6 -vision_radius_sq = 1 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea" -flags = "BadCityDefender", "CantReachAir", "Only_Native_Attack", "WillNever" -roles = "Hunter" -helptext = _("\ -The Ram Ship has one purpose: to destroy other ships. It has poor vision, no transport or\ - commerce ability, and cannot travel rivers. Unlike other early ships, there will always be\ - a winner and a loser when Ram Ships attack. They are good for first-strike, and are good\ - counter units for nations not invested into sea tech. Ram Ships cannot do shore attacks.\ -") - -[unit_caravel] -name = _("Caravel") -class = "RiverShip" -tech_req = "Navigation" -obsolete_by = "Galleon" -graphic = "u.caravel" -graphic_alt = "u.trireme" -sound_move = "m_caravel" -sound_move_alt = "m_generic" -sound_fight = "f_caravel" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 4 -defense = 4 -hitpoints = 10 -firepower = 1 -move_rate = 7 -vision_radius_sq = 4 -transport_cap = 3 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea" -flags = "BadCityDefender", "CantReachAir", "Traderoute", "WillNever", "NonMil", "NonMilAttack" -roles = "Ferryboat", "FerryStartUnit", "BarbarianBoat", "Hunter" -helptext = _("\ -Caravels upgrade older sea units, and are a big advance in combat, speed, range, and transport capacity. They have\ - the commerce ability of the Galley, but cannot build Wonders. Caravels can travel and attack on rivers and do shore attacks.\ -"), _(" -Like most early sea units, when it initiates an attack, there will be 15 rounds\ - of combat and 15 total hitpoints lost between both units. This may or may not\ - result in the loss of one of the units.\ -") - -[unit_galleon] -name = _("Galleon") -class = "RiverShip" -tech_req = "Magnetism" -obsolete_by = "Transport" -graphic = "u.galleon" -graphic_alt = "-" -sound_move = "m_galleon" -sound_move_alt = "m_generic" -sound_fight = "f_galleon" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 2 -defense = 3 -hitpoints = 20 -firepower = 1 -move_rate = 8 -vision_radius_sq = 4 -transport_cap = 4 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Submarine", "LandRail" -cargo = "Land", "LandNoKill", "LandAirSea", "Balloon" -flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever" -roles = "Ferryboat", "FerryStartUnit", "BarbarianBoat" -helptext = _("\ -The Galleon is a heavily armed transport ship that can carry up to 4 units. Galleons can travel and attack on rivers,\ - and also do shore attacks. Galleon crews repair their ship an extra +1hp per turn, regardless of whether it has moved.\ -"), _(" -Like most early sea units, when it initiates combat there will be 15 rounds\ - of combat and 15 total hitpoints lost between both units. This may or may not\ - result in the loss of one of the units.\ -"), _(" -Galleons can Stack-Escape: a 50% chance to escape a killed stack if they have more remaining moves than the attacker.\ -") - -[unit_frigate] -name = _("Frigate") -class = "RiverShip" -tech_req = "Magnetism" -obsolete_by = "Ironclad" -graphic = "u.frigate" -graphic_alt = "-" -sound_move = "m_frigate" -sound_move_alt = "m_generic" -sound_fight = "f_frigate" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 4 -defense = 3 -hitpoints = 20 -firepower = 1 -move_rate = 8 -vision_radius_sq = 4 -transport_cap = 2 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Submarine", "LandRail" -cargo = "Land", "LandNoKill", "LandAirSea" -bonuses = - { "flag", "type", "value" - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever" -roles = "Hunter" -helptext = _("\ -The Frigate is versatile — it's a superior offensive unit and also a decent transport ship. Frigates\ - can travel and attack on rivers, or make shore attacks from sea. Frigate crews repair their ship an\ - extra +1hp per turn, regardless of whether it has moved.\ -"), _(" -From Frigates onward, all sea attacks end with a single victor.\ - Frigates can Stack-Escape: a 50% chance to escape a killed stack if they have more remaining move points than the attacker.\ -") - -[unit_ironclad] -name = _("Ironclad") -class = "Sea" -tech_req = "Steam Engine" -obsolete_by = "Destroyer" -graphic = "u.ironclad" -graphic_alt = "-" -sound_move = "m_ironclad" -sound_move_alt = "m_generic" -sound_fight = "f_ironclad" -sound_fight_alt = "f_generic" -build_cost = 60 -pop_cost = 0 -attack = 4 -defense = 4 -hitpoints = 30 -firepower = 1 -move_rate = 8 -vision_radius_sq = 8 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter", "LandRail" -bonuses = - { "flag", "type", "value" - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever" -roles = "Hunter" -helptext = _("\ -The Ironclad is an armored ship that is much more sturdy than the Frigate but\ - loses transport capability and the ability to navigate rivers. From the Ironclad\ - onward, warships are excellent at attacking shore targets, and can also pillage\ - buoys.\ -"), _(" -Ironclads and all modern ships can Stack-Escape: a 50% chance to escape a killed stack if they have more remaining move points than the attacker.\ -") - -[unit_destroyer] -name = _("Destroyer") -class = "Sea" -tech_req = "Electricity" -obsolete_by = "Missile Destroyer" -graphic = "u.destroyer" -graphic_alt = "-" -sound_move = "m_missile_destroyer" -sound_move_alt = "m_destroyer" -sound_fight = "f_missile_destroyer" -sound_fight_alt = "f_destroyer" -build_cost = 60 -pop_cost = 0 -attack = 5 -defense = 5 -hitpoints = 30 -firepower = 1 -move_rate = 12 -vision_radius_sq = 15 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter", "LandRail" -bonuses = - { "flag", "type", "value" - "Submarine", "DefenseMultiplier", 3 - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever" -roles = "Hunter" -helptext = _("\ -Destroyers are the first of the modern ships to start your modern\ - navy. Their main roles are fast scouting, seek-and-destroy,\ - anti-submarine warfare, shore bombardment of lighter targets,\ - and supporting the needs of larger fleets. 4x ASW defence gives a\ - 35% chance defending vs Submarines.\ -") - -[unit_cruiser] -name = _("Cruiser") -class = "Sea" -tech_req = "Steel" -obsolete_by = "AEGIS Cruiser" -graphic = "u.cruiser" -graphic_alt = "-" -sound_move = "m_cruiser" -sound_move_alt = "m_generic" -sound_fight = "f_cruiser" -sound_fight_alt = "f_generic" -build_cost = 80 -pop_cost = 0 -attack = 6 -defense = 6 -hitpoints = 30 -firepower = 2 -move_rate = 11 -vision_radius_sq = 13 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter", "LandRail" -bonuses = - { "flag", "type", "value" - "Submarine", "DefenseMultiplier", 1 - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever" -roles = "Hunter" -helptext = _("\ -The Cruiser is a large and fast surface warship with equally strong offensive and defensive strength. More often than not, its\ - 2x ASW defence allows it to survive a Submarine attack.\ -"), _("\ -The main duties of the Cruiser are offensive strikes against lesser ships, and escorting weaker ships.\ -") - -[unit_missile_destroyer] -name = _("Missile Destroyer") -class = "Sea" -tech_req = "Rocketry" -obsolete_by = "None" -graphic = "u.missile_destroyer" -graphic_alt = "u.destroyer" -sound_move = "m_destroyer" -sound_move_alt = "m_generic" -sound_fight = "f_destroyer" -sound_fight_alt = "f_generic" -build_cost = 60 -pop_cost = 0 -attack = 5 -defense = 5 -hitpoints = 30 -firepower = 2 -move_rate = 12 -vision_radius_sq = 16 -transport_cap = 1 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter", "LandRail" -cargo = "Missile" -bonuses = - { "flag", "type", "value" - "Submarine", "DefenseMultiplier", 1 - "Marines", "DefenseMultiplier", 1 - "AirAttacker", "DefenseMultiplier", 1 - "Missile", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever" -roles = "Hunter" -helptext = _("\ -The Missile Destroyer has double the firepower of a Destroyer, and shares the same roles\ - as its ancestor. It gains 2x defense against Air and Missile units. It has a 2x ASW bonus\ - and can can carry one Missile.\ -") - -[unit_aegis_cruiser] -name = _("AEGIS Cruiser") -class = "Sea" -tech_req = "Rocketry" -obsolete_by = "None" -graphic = "u.aegis_cruiser" -graphic_alt = "-" -sound_move = "m_aegis_cruiser" -sound_move_alt = "m_generic" -sound_fight = "f_aegis_cruiser" -sound_fight_alt = "f_generic" -build_cost = 100 -pop_cost = 0 -attack = 8 -defense = 8 -hitpoints = 30 -firepower = 2 -move_rate = 11 -vision_radius_sq = 19 -transport_cap = 2 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Air", "AirProtect", "AirPillage", "Missile", "Helicopter", "Balloon", "Submarine", "LandRail" -cargo = "Missile" -bonuses = - { "flag", "type", "value" - "AirAttacker", "DefenseMultiplier", 2 - "Missile", "DefenseMultiplier", 2 - "Submarine", "DefenseMultiplier", 1 - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "CanEscape", "AntiAir", "WillNever" -roles = "Hunter" -helptext = _("\ -The AEGIS Cruiser has an Anti-Air missile system. Radar and sonar\ - give superior vision and 2x defense bonus against Submarines.\ - The AEGIS can carry two Missiles, and is the only ship that can attack\ - Air and Missile units.\ -"), _("\ -Excellent vision and 3x Anti-Air bonus are ideal for scouting and escorting.\ -") - -[unit_battleship] -name = _("Battleship") -class = "Sea" -tech_req = "Refining" -obsolete_by = "None" -graphic = "u.battleship" -graphic_alt = "u.battleship" -sound_move = "m_battleship" -sound_move_alt = "m_generic" -sound_fight = "f_battleship" -sound_fight_alt = "f_generic" -build_cost = 160 -pop_cost = 0 -attack = 12 -defense = 12 -hitpoints = 40 -firepower = 2 -move_rate = 10 -vision_radius_sq = 12 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter", "LandRail" -bonuses = - { "flag", "type", "value" - "Submarine", "DefenseMultiplier", 1 - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever" -roles = "" -helptext = _("\ -The Battleship is the supreme naval unit with excellent offensive and defensive strength. It has a 2x defense bonus vs Submarines.\ -") - -[unit_submarine] -name = _("Submarine") -class = "Submarine" -tech_req = "Automobile" -obsolete_by = "None" -graphic = "u.submarine" -graphic_alt = "-" -sound_move = "m_submarine" -sound_move_alt = "m_generic" -sound_fight = "f_submarine" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 12 -defense = 2 -hitpoints = 28 -firepower = 2 -move_rate = 10 -vision_radius_sq = 12 -transport_cap = 8 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Submarine" -cargo = "Missile" -vision_layer = "Subsurface" -bonuses = - { "flag", "type", "value" - "Submarine", "DefenseMultiplier", 1 - } -flags = "NeverProtects", "BadCityDefender", "Only_Native_Attack", - "Submarine", "CanEscape", "CantReachAir", "WillNever" -roles = "Hunter" -helptext = _("\ -Submarines are strong attackers but weak defenders. They can carry 8 Missiles.\ - They are unreachable by Air units, but do not block air attacks on surface ships.\ - Submarines cannot attack units on shore. Submarines cannot be seen by other players\ - unless they have a unit or city adjacent to it.\ -"), _("\ -Submarines have superior attrition rates when attacking in numbers. They excel\ - at hit-and-run against weaker ships.\ -") - -[unit_carrier] -name = _("Carrier") -class = "Sea" -tech_req = "Advanced Flight" -obsolete_by = "None" -graphic = "u.carrier" -graphic_alt = "-" -sound_move = "m_carrier" -sound_move_alt = "m_generic" -sound_fight = "f_carrier" -sound_fight_alt = "f_generic" -build_cost = 155 -pop_cost = 0 -attack = 1 -defense = 9 -hitpoints = 40 -firepower = 2 -move_rate = 10 -vision_radius_sq = 12 -transport_cap = 9 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter" -cargo = "Air", "AirProtect", "AirPillage", "Missile", "Helicopter", "Balloon", "LandAirSea" -bonuses = - { "flag", "type", "value" - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "Only_Native_Attack", "CanEscape", - "CantReachAir", "WillNever" -roles = "" -helptext = _("\ -The Carrier is a mobile airport that can carry Air units, Helicopters, AAA, Marines, and Missiles.\ - Fighters can Vigil on a Carrier if they have enough moves and the Carrier has not moved since the\ - Vigil order was given.\ -"), _("\ -Carriers are very expensive and thus, usually protected by a fleet of scouts and escorts.\ -") - -[unit_cargo_ship] -name = _("Cargo Ship") -class = "RiverShip" -tech_req = "Industrialization" -obsolete_by = "None" -graphic = "u.cargo_ship" -graphic_alt = "u.transport" -sound_move = "m_transport" -sound_move_alt = "m_transport" -sound_fight = "f_trireme" -sound_fight_alt = "f_generic" -build_cost = 45 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 30 -firepower = 1 -move_rate = 7 -vision_radius_sq = 4 -transport_cap = 4 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea", "Balloon" -flags = "BadCityDefender", "HelpWonder", "Traderoute", "NonMil", "HasNoZOC", "NoVeteran" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_base_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "" -helptext = _("\ -Cargo ships are Commerce units: they can establish Trade Routes and help\ - build Wonders. They can travel rivers and oceans. Cargo ships can also carry\ - four land units: thus, they are useful for transporting units by river or sea.\ -") - -[unit_transport] -name = _("Transport") -class = "Sea" -tech_req = "Industrialization" -obsolete_by = "None" -graphic = "u.transport" -graphic_alt = "-" -sound_move = "m_transport" -sound_move_alt = "m_generic" -sound_fight = "f_transport" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 0 -defense = 3 -hitpoints = 30 -firepower = 1 -move_rate = 10 -vision_radius_sq = 12 -transport_cap = 8 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea", "Balloon" -bonuses = - { "flag", "type", "value" - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "CanEscape" -roles = "Ferryboat", "FerryStartUnit" -helptext = _("\ -The Transport cannot attack but can defend itself when under attack.\ - Marines and Anti-Aircraft Artillery can directly attack from a Transport. Its\ - large cargo capacity makes it a significant logistical upgrade in\ - sea transportation.\ -") - -[unit_cruise_missile] -name = _("Cruise Missile") -class = "Missile" -tech_req = "Rocketry" -obsolete_by = "None" -graphic = "u.cruise_missile" -graphic_alt = "-" -sound_move = "m_cruise_missile" -sound_move_alt = "m_generic" -sound_fight = "f_cruise_missile" -sound_fight_alt = "f_generic" -build_cost = 60 -pop_cost = 0 -attack = 18 -defense = 0 -hitpoints = 10 -firepower = 3 -move_rate = 24 -vision_radius_sq = 2 -transport_cap = 0 -fuel = 1 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "Submarine" -disembarks = "Submarine" -targets = "LandRail" -flags = "NeverProtects", "FieldUnit", "OneAttack", "HasNoZOC", "Unbribable", - "CantReachAir", "Missile", "NeverBlocked", "WillNever" -roles = "" -helptext = _("\ -A Cruise Missile can strike distant targets. It\ - cannot attack Air units, but Air units never block\ - a strike on reachable surface units. Cruise Missiles\ - can be relocated by ending their turn on a city,\ - airbase, Submarine, Missile Destroyer, AEGIS Cruiser,\ - Carrier, or Mobile SAM. A Cruise Missile cannot\ - block attacks on other units on its tile.\ -") - -[unit_atom_bomb] -name = _("Atom Bomb") -class = "Bomb" -tech_req = "Nuclear Fission" -obsolete_by = "None" -graphic = "u.atom_bomb" -graphic_alt = "u.nuclear" -sound_move = "m_atom_bomb" -sound_move_alt = "m_generic" -sound_fight = "f_atom_bomb" -sound_fight_alt = "f_nuclear" -build_cost = 150 -pop_cost = 0 -attack = 100 -defense = 0 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 0 -transport_cap = 0 -fuel = 1 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter", "Air", "AirProtect", "AirPillage", "Missile", "Submarine", "LandRail" -disembarks = "Air", "AirPillage" -flags = "NeverProtects", "FieldUnit", "OneAttack", "Nuclear", "HasNoZOC", "Unbribable", - "NeverBlocked", "WillNever", "NoVeteran" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_base_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "" -helptext = _("\ -If you have Nuclear Fission and the Manhattan Project has been built by any player, you can make Atom Bombs.\ - A Bomber can drop it within two tiles of its location. Unload the bomb and fly the Bomber out of range, then\ - attack the target (or detonate by pressing D twice.) The blast destroys ALL cardinally adjacent tiles. City population\ - is reduced by half. Land tiles may get nuclear fallout.\ -"), _("\ -Fallout reduces tile output and increases risk of nuclear winter.\ -") -bombard_rate = -1 ; default radius - 1 = just nuke single tile. - -[unit_hbomb] -name = _("Hydrogen Bomb") -class = "Bomb" -tech_req = "Fusion Power" -impr_req = "Enrichment Facility" -obsolete_by = "None" -graphic = "u.hbomb" -graphic_alt = "u.nuclear" -sound_move = "m_atom_bomb" -sound_move_alt = "m_generic" -sound_fight = "f_atom_bomb" -sound_fight_alt = "f_nuclear" -build_cost = 190 -pop_cost = 0 -attack = 100 -defense = 0 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 0 -transport_cap = 0 -fuel = 1 -uk_happy = 2 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter", "Air", "AirProtect", "AirPillage", "Missile", "Submarine", "LandRail" -disembarks = "Air", "AirPillage" -flags = "NeverProtects", "FieldUnit", "OneAttack", "Nuclear", "HasNoZOC", "Unbribable", - "NeverBlocked", "WillNever", "NoVeteran" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_base_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "" -helptext = _("\ -Hydrogen Bombs make Atom Bombs seem tame. Any unprotected city at Ground Zero will be absolutely annihilated.\ - In other cities in the blast radius, population is reduced by about 75%. Blast area is 21 tiles:\ - the same area as an entire city (5x5 minus the corners.) All units within the blast are destroyed.\n\ -A Bomber can drop a Hydrogen Bomb within two tiles of its location. Unload the bomb, fly the Bomber out of\ - range, then detonate by pressing D twice.\n\ -If you have Fusion Power and the Manhattan Project was built, a Hydrogen Bomb\ - can be made in a city with an Enrichment Facility. \ -"), _("\ -Fallout from a Hydrogen Bomb is grave, with more than double the contaminated area.\ -") -bombard_rate = 5 ; sq_radius = 2 + 5 = 7 (entire workable city area) - -[unit_doomsday_bomb] -name = _("Doomsday Bomb") -class = "Bomb" -tech_req = "Fusion Power" -impr_req = "Enrichment Facility" -obsolete_by = "None" -graphic = "u.ddomb" -graphic_alt = "u.atom_bomb" -sound_move = "m_atom_bomb" -sound_move_alt = "m_generic" -sound_fight = "f_atom_bomb" -sound_fight_alt = "f_nuclear" -build_cost = 1000 -pop_cost = 0 -attack = 100 -defense = 0 -hitpoints = 30 -firepower = 1 -move_rate = 2 -vision_radius_sq = 0 -transport_cap = 0 -fuel = 1 -uk_happy = 4 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter", "Air", "AirProtect", "AirPillage", "Missile", "Submarine", "LandRail" -disembarks = "Air", "AirPillage" -flags = "NeverProtects", "FieldUnit", "OneAttack", "Nuclear", "HasNoZOC", "Unbribable", - "NeverBlocked", "WillNever", "Unique", "NoVeteran" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_base_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "" -helptext = _("\ -The Doomsday Bomb is the mother of all bombs. Blast area is about 100 tiles.\ - Only one can be made at a time. A city at Ground Zero will be\ - annihilated. Other cities in the blast area lose about 75% of their population.\ - All units within the blast are completely destroyed.\n\ -A Bomber can drop the Bomb within two tiles of its location. Unload the Bomb and\ - pray that you can fly the Bomber out of range. Detonate by pressing D twice.\n\ -If you have Fusion Power and the Manhattan Project was built, a Doomsday Bomb\ - can be made in a city with an Enrichment Facility. \ -"), _("\ -The Fallout from a Doomsday Bomb is a sure ticket to Nuclear Winter.\ -") -bombard_rate = 25 ; radius = sqrt(27) = 5.19 - -[unit_nuclear_missile] -name = _("Nuclear Missile") -class = "Missile" -tech_req = "Space Flight" -obsolete_by = "None" -graphic = "u.nuclear" -graphic_alt = "-" -sound_move = "m_nuclear" -sound_move_alt = "m_generic" -sound_fight = "f_nuclear" -sound_fight_alt = "f_generic" -build_cost = 160 -pop_cost = 0 -attack = 100 -defense = 0 -hitpoints = 10 -firepower = 1 -move_rate = 24 -vision_radius_sq = 2 -transport_cap = 0 -fuel = 1 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "Submarine" -disembarks = "Submarine" -targets = "Balloon", "Helicopter", "Air", "AirProtect", "AirPillage", "Missile", "Submarine", "LandRail" -flags = "NeverProtects", "FieldUnit", "OneAttack", "Nuclear", "HasNoZOC", "Unbribable", - "NeverBlocked", "WillNever", "NoVeteran" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_base_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "" -helptext = _("\ -If you have Space Flight and the Manhattan Project has been built by any player, you can make Nuclear Missiles.\ - Nuclear blasts destroy ALL units in a 3x3 area. City population is reduced by half. Land tiles may get nuclear fallout.\ - Fallout reduces tile output and increases risk of nuclear winter.\ -"), _("\ -If Fallout is cleaned on the turn it appears, the chance of nuclear winter is reduced.\ -") -bombard_rate = 0 ; default sq_radius of 2: every adjacent tile. - -[unit_tactical_nuke] -name = _("Tactical Nuke") -class = "Missile" -tech_req = "Fusion Power" -impr_req = "Enrichment Facility" -obsolete_by = "None" -graphic = "u.tnuke" -graphic_alt = "-" -sound_move = "m_nuclear" -sound_move_alt = "m_generic" -sound_fight = "f_nuclear" -sound_fight_alt = "f_generic" -build_cost = 140 -pop_cost = 0 -attack = 100 -defense = 0 -hitpoints = 10 -firepower = 1 -move_rate = 18 -vision_radius_sq = 2 -transport_cap = 0 -fuel = 1 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "Submarine" -disembarks = "Submarine" -targets = "Balloon", "Helicopter", "Air", "AirProtect", "AirPillage", "Missile", "Submarine", "LandRail" -flags = "NeverProtects", "FieldUnit", "OneAttack", "Nuclear", "HasNoZOC", "Unbribable", - "NeverBlocked", "WillNever", "NoVeteran" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_base_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "" -helptext = _("\ -Tactical Nukes are very small warheads attached to missiles. A Tactical Nuke destroys all units on\ - a single tile. City population is reduced by half. The target tile may get Fallout. In theory,\ - Tactical Nukes are small enough to get the advantages of nuclear armaments without the severity of\ - consequences. In reality, they might be a gateway that escalates toward mutual assured destruction.\n\ -If you have Fusion Power and the Manhattan Project was built, a Tactical Nuke\ - can be made in a city with an Enrichment Facility. \ -") -bombard_rate = -2 ; 2 - 2 = 0: only nukes target tile. - -[unit_diplomat] -name = _("Diplomat") -class = "Land" -tech_req = "Writing" -obsolete_by = "Spy" -graphic = "u.diplomat" -graphic_alt = "-" -sound_move = "m_diplomat" -sound_move_alt = "m_generic" -sound_fight = "f_diplomat" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 0 -defense = 0 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -embarks = "LandRail", "Helicopter" ; transport helicopter only -disembarks = "LandRail", "Helicopter" -flags = "Diplomat", "IgZOC", "NonMil", "HasNoZOC", "Expellable" -veteran_names = - _("?diplomatic_rank:attaché"), - _("?diplomatic_rank:secretary"), - _("?diplomatic_rank:envoy"), - _("?diplomatic_rank:ambassador"), - _("?diplomatic_rank:emissary"), - _("?diplomatic_rank:statesman"), - _("?diplomatic_rank:plenipotentiary") - -veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 110, 115, 120, 125, 130, 135 -veteran_move_bonus = 0, 0, 0, 0, 0, 0, 0 -roles = "DiplomatStartUnit" -helptext = _("\ -A Diplomat performs official or covert actions. Covert acts make incidents\ - which let Senates break treaties. Diplomats in cities defend such acts with\ - combat. Diplomats can • Bribe a lone unit • Establish embassy • Investigate City\ - • Sabotage production/buildings • Steal tech • Steal maps • Incite city revolt.\n\ -"), _("\ -Full rules for Diplomats are in the Manual.\ -") - -[unit_spy] -name = _("Spy") -class = "Land" -tech_req = "Espionage" -obsolete_by = "None" -graphic = "u.spy" -graphic_alt = "-" -sound_move = "m_spy" -sound_move_alt = "m_generic" -sound_fight = "f_spy" -sound_fight_alt = "f_generic" -build_cost = 35 -pop_cost = 0 -attack = 0 -defense = 0 -hitpoints = 10 -firepower = 1 -move_rate = 6 -vision_radius_sq = 8 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -embarks = "LandRail", "Helicopter" ; transport helicopter only -disembarks = "LandRail", "Helicopter" -flags = "Diplomat", "IgZOC", "NonMil", "HasNoZOC", "Spy", "Expellable" -veteran_names = - _("?spy_level:informant"), - _("?spy_level:handler"), - _("?spy_level:agent"), - _("?spy_level:operative"), - _("?spy_level:secret agent"), - _("?spy_level:neutralizer"), - _("?spy_level:spymaster") - -veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 110, 115, 120, 125, 130, 135 -veteran_move_bonus = 0, 0, 0, 0, 0, 0, 0 -roles = "DiplomatStartUnit" -helptext = _("\ -Spies can do what a Diplomat can, and also: • Survive ops\ - • Sabotage lone units • Poison city water • Steal specific tech\ - • Steal tech from cities more than once • Sabotage specific targets in cities.\ -"), _("\ -Spies who survive ops escape to the nearest friendly city. Spies have\ - a 25% advantage over Diplomats in combat: a base 75% chance to win.\ - Full rules are in the Manual.\ -") - -[unit_caravan] -name = _("Caravan") -class = "Land" -tech_req = "Trade" -obsolete_by = "Freight" -graphic = "u.caravan" -graphic_alt = "-" -sound_move = "m_caravan" -sound_move_alt = "m_generic" -sound_fight = "f_caravan" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -embarks = "LandRoad", "Helicopter" ; transport helicopter only -disembarks = "LandRoad", "Helicopter" -flags = "HelpWonder", "TradeRoute", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Expellable", "Shield2Gold" -roles = "AttackStrongStartUnit" ;note: MP2 doesn't start games with ASSU's so has co-opted this for caravan start unit. -helptext = _("\ -Caravans are Commerce units. Commerce units can help build Wonders in any city with whom\ - you are not at war. In foreign cities 12+ tiles distant, they can create Trade Routes,\ - increasing net trade in both cities relative to their combined trade. Routes are inactive\ - during war and (re)activate during peace.\n\ -Commerce units can enter the Marketplace of non-hostile foreign cities to sell goods: revenue derives\ - from total trade in both cities. This is only profitable between cities with very high trade.\n\ -Commerce units can build any Wonders for which you have the tech requirement. To use them\ - for a Trade Route, the Trade tech is needed, and they need to have an assigned Home City.\n\ -➤ Caravans are the only Commerce unit that can be produced more than once per turn, if the city\ - has appropriate output bonuses.\ -") - -[unit_freight] -name = _("Freight") -class = "Land" -tech_req = "The Corporation" -obsolete_by = "None" -graphic = "u.freight" -graphic_alt = "-" -sound_move = "m_freight" -sound_move_alt = "m_generic" -sound_fight = "f_freight" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -flags = "HelpWonder", "TradeRoute", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Expellable" -roles = "" -helptext = _("\ -The Freight unit replaces the Caravan as the basic Commerce unit on Land. It moves at\ - twice the speed. Each Freight used to build a wonder will add 50 shields. See the\ - entry on Caravan to read what Commerce units may do.\ -") - -[unit_explorer] -name = _("Explorer") -class = "Land" -tech_req = "Seafaring" -obsolete_by = "Partisan" -graphic = "u.explorer" -graphic_alt = "-" -sound_move = "m_explorer" -sound_move_alt = "m_generic" -sound_fight = "f_explorer" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -embarks = "LandRoad", "Helicopter" ; transport helicopter only -disembarks = "LandRoad", "Helicopter" -flags = "IgTer", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Expellable" -roles = "Explorer", "ExplorerStartUnit" -helptext = _("\ -Explorers are brave individuals who map unknown territory. They can slip through enemy\ - ZOC, and have no unit upkeep.\ -") - -[unit_train] -name = _("Train") -class = "LandRail" -tech_req = "Railroad" -obsolete_by = "None" -graphic = "u.train" -graphic_alt = "u.transport" -sound_move = "m_train" -sound_move_alt = "m_generic" -sound_fight = "f_generic" -sound_fight_alt = "f_generic" -build_cost = 35 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 30 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 6 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 1 -cargo = "Land", "LandAirSea", "Balloon", "Bomb" -flags = "HelpWonder", "TradeRoute", "NonMil", "HasNoZOC", "NoVeteran", "Capturable" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_base_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "" -helptext = _("\ -Trains are Commerce units with an important bonus: they allow units with 2 or less\ - move points to travel your rails at distances comparable to other units. Only Foot Soldiers\ - are allowed to load/unload outside a city, but lose their moves if doing so.\n\n\ -On non-allied foreign rails, Trains incur full terrain movement cost.\ - Pre-gunpowder units can't attack Trains.\n\n\ -Electricity and Combustion each give Trains an additional +1 move.\ -") - -[unit_leader] -name = _("?unit:Leader") -class = "Land" -tech_req = "None" -obsolete_by = "None" -graphic = "u.leader" -graphic_alt = "u.explorer" -sound_move = "m_leader" -sound_move_alt = "m_generic" -sound_fight = "f_leader" -sound_fight_alt = "f_generic" -build_cost = 10 -pop_cost = 0 -attack = 0 -defense = 2 -hitpoints = 20 -firepower = 1 -move_rate = 4 -vision_radius_sq = 8 -convert_to = "Queen" -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -embarks = "LandRail", "Helicopter" ; transport helicopter only -disembarks = "LandRail", "Helicopter" -flags = "IgZOC", "NonMil", "HasNoZOC", "NoBuild", "NoHome", "SuperSpy", - "EvacuateFirst", "Unbribable", "GameLoss", "Unique", "WillNever" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_base_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "KingStartUnit" -helptext = _("\ -This is you. If you lose this unit, you lose the game.\ -"), _("\ -Will not unleash barbarians from huts.\ -"), _("\ -You can use the DO command to change the gender of the Leader.\ -") - -[unit_queen] -name = _("?unit:Queen") -class = "Land" -tech_req = "None" -obsolete_by = "None" -graphic = "u.queen" -graphic_alt = "u.leader" -sound_move = "m_leader" -sound_move_alt = "m_generic" -sound_fight = "f_leader" -sound_fight_alt = "f_generic" -build_cost = 10 -pop_cost = 0 -attack = 0 -defense = 2 -hitpoints = 20 -firepower = 1 -move_rate = 4 -vision_radius_sq = 8 -convert_to = "Leader" -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -embarks = "LandRail", "Helicopter" ; transport helicopter only -disembarks = "LandRail", "Helicopter" -flags = "IgZOC", "NonMil", "HasNoZOC", "NoBuild", "NoHome", "SuperSpy", - "EvacuateFirst", "Unbribable", "GameLoss", "Unique", "WillNever" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_base_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "KingStartUnit" -helptext = _("\ -(Alternate form of Leader. Behaves identically in-game.)\ - This is you. If you lose this unit, you lose the game.\ -"), _("\ -Will not unleash barbarians from huts.\ -"), _("\ -You can use the DO command to change the gender of the Leader.\ -") - - -[unit_barbarian_leader] -name = _("Barbarian Leader") -class = "Land" -tech_req = "None" -obsolete_by = "None" -graphic = "u.barbarian_leader" -graphic_alt = "u.diplomat" -sound_move = "m_barbarian_leader" -sound_move_alt = "m_generic" -sound_fight = "f_barbarian_leader" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 0 -defense = 0 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -flags = "IgZOC", "NonMil", "HasNoZOC", "Unbribable", "WillNever", - "EvacuateFirst", "SuperSpy", "NoHome", "NoBuild" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_base_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "BarbarianLeader" -helptext = _("\ -One Barbarian Leader appears every time there is a barbarian uprising\ - somewhere in the world.\ -"), _("\ -When a Barbarian Leader is killed on a tile without any defending units,\ - the 100 gold ransom is paid, but only to land units and helicopters.\ -") - -[unit_wagon] -name = _("Wagon") -class = "LandRoad" -tech_req = "The Wheel" -impr_req = "Appian Way" -obsolete_by = "Train" -graphic = "u.wagon" -graphic_alt = "-" -sound_move = "m_explorer" -sound_move_alt = "m_generic" -sound_fight = "f_caravan" -sound_fight_alt = "f_generic" -build_cost = 25 -pop_cost = 0 -attack = 0 -defense = 0 -hitpoints = 10 -firepower = 1 -move_rate = 3 -vision_radius_sq = 4 -transport_cap = 2 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 1 -cargo = "Land", "LandAirSea" -flags = "HelpWonder", "TradeRoute", "NonMil", "HasNoZOC", "Capturable", "Expellable", "Shield2Gold" -roles = "" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_base_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -helptext = _("\ -Wagons are special Commerce units that can be made in the city that built the Appian Way.\ - Read the help on Caravans to see what Commerce units can do.\n\n\ -Wagons are the first Land unit that can do Commerce; but they pay gold upkeep, cannot defend,\ - cannot fortify, and can only travel on roads. The main benefit of Wagons\ - is to transport slower units and reach distant cities faster.\n\n\ -Units with 2 moves or less can be carried on Wagons. Only Foot units can\ - load/unload outside a city, but may lose their moves doing so.\n\n\ -") diff --git a/freeciv/freeciv/data/.historic/mp2-May2019-historic/README.mp2 b/freeciv/freeciv/data/.historic/mp2-May2019-historic/README.mp2 deleted file mode 100644 index 92224cced..000000000 --- a/freeciv/freeciv/data/.historic/mp2-May2019-historic/README.mp2 +++ /dev/null @@ -1,78 +0,0 @@ ----------------------------------------------------------------------- - Multiplayer-Evolution Ruleset - (MP2) ----------------------------------------------------------------------- - -The Multiplayer-Evolution ruleset is a fully modernized ruleset to take -advantage of cutting-edge advancements in Freeciv Server development. -Compared to original Multiplayer, the most notable changes will be new -late-game units and the wholescale improvement of balance and tactical -possibility in late-game Air and Sea units. A large number of contributors -over an almost two year period helped add and balance many other changes -whose aim was to increase playability, strategic depth and creativity, -realism, and overall richness. Enjoy! - -Please read the PDF in the MP2 directory for detailed explanations. - -Changes from original Multiplayer rules: - -1. Tech costs equalize pace of discovery for all game stages. -2. Darwin's Voyage is now similar to Colossus. -3. No Philosophy bonus after Conscription, Industrialization, Electricity, or T85. -4. Space Flight gives a Satellite Vision Bonus to cities and units. -5. Electricity removes Fog of War inside your own borders. -6. Vision:Movement ratio fixed for 2x movement: starts at 1.4x:2x then is 2x:2x when Physics discovered. -7. Restrictinfra=ON makes enemy rails act only like roads. -8. Railroad move speed changed to 9x, Maglevs available with Superconductors for unlimited moves. -9. Non-military Bribe cost fixed to work on all non-military units. -10. Land units on mountains get +1 vision. -11. Nukes get 1.5x moves, not 2x moves. -12. Knights defend at 3 against mounted units and do not kill city population. -13. No bribe/sabotage on Air and Missile units. -14. “OneAttack” flag deprecated since version 2.3 onward had made them dysfunctional. -15. Air Units exert no ZoC over adjacent tiles. -16. Para-drop for Paratroopers adjusted to 2x area coverage (1.4x range). -17. Marines now have real role of multipurpose role and can attack land/air/sea units. -18. Escort Fighters added. Cost: 80. A3 D5 FP2. Moves:18. Fuel: 2 turns. -19. Medium Bombers added. Cost: 85. A6 D2 FP2. Moves:12. Fuel: 2 turns. -20. Bomber renamed 'Heavy Bomber'. Cost: 110. A12 D3 FP2. Moves:15. Fuel: 2 turns. -21. Anti-aircraft Artillery added. Cost: 50. A1 D1 FP2. Moves:2. 3X attack/4X defence vs. Air. -22. Stealth Bomber cost increased to 180. -23. “CanEscape” flag given to Air and Sea units. Each unit has 50% chance to escape Killstack if it - has more moves than the attacker. -24. Major Naval Re-balance. Please read manual for stats on all units from Destroyer onward. -25. Galleons attack at 1. -26. Air units can now "air lift themselves". This fixed an ironic imbalance where Land units could - move farther and faster than Air units when using railroads and airlift. -27. Triremes, Caravels, Galleons, and Frigates can use rivers. -28. Pyramids: Added Classic effect of +25% food storage in every city. -29. Copernicus' Observatory cost changed to 100 shields. -30. Great Wall. Cost: 275. Obsolete by: Machine Tools. -31. Supreme Court is the new name for Great Library, to avoid confusion for new players coming from Classic - rules. The new name reflects what the Wonder always been in MP: it acts as a Courthouse in every city. -32. Hanging Garden gains +2 luxury to the home city it's built in. -33. Colossus obsolete by Automobile, not Flight. -34. Lighthouse: +2 moves, +1 vision, obsolete by Miniaturization. -35. Ecclesiastical Palace added from Civ2civ3. Helps non-rapture governments and remote colonies. -36. Temple of Artemis added. Cost 250. +1 gold,luxury,bulb,and shield in every city. -37. Mausoleum of Mausolus added from Civ2civ3. -38. Statue of Zeus added from Civ2civ3. -39. Genghis Khan's Equestrian School. +1 move to Horse units before Cavalry. Obsolete: Mobile Warfare. -40. Courthouse overhauled to be useful again. - a. Cost 45. This reflects its loss of over half its Classic value, which was prevention of incitations. - b. Corruption reduction changed to 60%. (Bad rounding turns 50% to 41%, and 60% to 53%.) - c. Gives 1 free unit upkeep (law and order bonus) - d. Decreases hostile espionage chances by 20%. - e. Nullifies tile penalties in Anarchy and Despotism. -41. Granary cost 35 shields: slightly aids non-rapture governments. -42. Mass Transit: 60 shields, +2T. Recycling Center: 70 shields, +2P. This fixed 2 totally broken buildings. -43. Palace makes +1 happy to support capital having higher population. -44. Special resource tile “Gold” goes from 0/1/6 to 0/1/8. (Formerly it had the lowest F/P/T score of all resources.) -45. Illegal Action movement penalty removed. -46. Swamp Transform reduced to 12 worker-turns: aids fairness and naval balance in continental games. -47. Transform time for Grasslands to Hills changed from 12 to 15: - Converting cities to get Hills defence bonus should be more difficult. -48. The new Well-digger is a "patch" unit that gives fair balance to nations who have no nearby water. -49. Engineering lets Infra units dig Canal tile improvement. The only effect of a Canal is it lets ships pass through. -50. Caravans and Freight can help build Foreign Wonders. This increases depth of diplomatic negotiation possibilities. -51. Helicopters may use Fortresses as bases to rest and repair. \ No newline at end of file diff --git a/freeciv/freeciv/data/.historic/mp2-May2019-historic/buildings.ruleset b/freeciv/freeciv/data/.historic/mp2-May2019-historic/buildings.ruleset deleted file mode 100644 index 8ee7ce822..000000000 --- a/freeciv/freeciv/data/.historic/mp2-May2019-historic/buildings.ruleset +++ /dev/null @@ -1,1987 +0,0 @@ -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes, -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -; Note that the freeciv AI may not cope well with anything more -; than minor changes. - -[datafile] -description="Multiplayer-Evo buildings data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -; /* <-- avoid gettext warnings -; -; Below: The individual buildings, one per section. -; (Buildings = City Improvements and Wonders) -; -; The actual tag used (the * in [building_*]) does not matter, except -; it must be unique within this file, and it may be used in debug -; output when reading this file. -; -; Notes: -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; if -; not present, "name" is used for this purpose too. Since -; the name used in savegames must not change, if you want -; to rename an item after a ruleset has been released, you -; should set "rule_name" to the original value of "name". -; genus = genus; one of: -; "GreatWonder", "SmallWonder", "Improvement", "Special". -; reqs = requirements to build the building (see effects.ruleset -; and README.effects for help on requirements) -; graphic = icon of improvement (used in city dialog) -; graphic_alt = alternate icon of improvement -; obsolete_by = requirements for the building to become obsolete -; build_cost = production shields required to build -; upkeep = monetary upkeep value -; sabotage = percent chance of diplomat sabotage being successful -; flags = special flag strings -; -; ** Building flags ** -; "VisibleByOthers" = Anyone who can see your city knows whether it has -; this improvement. (Great and small wonders are -; always visible.) -; "SaveSmallWonder" = If you lose the city with this building in, and the -; "savepalace" server setting is enabled, another will -; be built for free in a random city. -; Should only be used with genus "SmallWonder". -; "Gold" = Not a real building; production turned into gold -; indefinitely (capitalization/coinage). -; Genus should be "Special". -; "DisasterProof" = Disasters never destroy this building. Is meaningful -; only for genus "Improvement" buildings as others are -; automatically disaster proof. -; -; */ <-- avoid gettext warnings - -[building_airport] -name = _("Airport") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Radio", "Player" - } -graphic = "b.airport" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 120 -upkeep = 3 -sabotage = 100 -sound = "b_airport" -sound_alt = "b_generic" -helptext = _("\ -Allows a city to produce veteran Air units, Helicopters, and Missiles.\ - Damaged Air units and Helicopters which stay in town for one full turn\ - without moving are completely repaired.\ -"), _("\ -Two cities with Airports can airlift units. Airlifting instantly transports\ - the unit from one city to another and will use all of the unit's movement\ - points. A unit must have some movement points left to be airlifted.\ -") - -[building_amphitheatre] -name = _("Amphitheater") -rule_name = "Amphitheatre" ; en_GB used originally -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Construction", "Player" - } -graphic = "b.colosseum" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 4 -sabotage = 100 -sound = "b_colosseum" -sound_alt = "b_generic" -helptext = _("\ -Entertains the citizens of a city, making 3 unhappy citizens content. \ - (Four after the discovery of Electricity.) However, it does not\ - affect citizens made unhappy by military activity.\ -") - -[building_aqueduct] -name = _("Aqueduct") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Construction", "Player" - } -graphic = "b.aqueduct" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 2 -sabotage = 100 -sound = "b_aqueduct" -sound_alt = "b_generic" -helptext = _("\ -Allows a city to grow larger than size 8. A Sewer System is also\ - required for a city to grow larger than size 12.\ -") -; There is also an effect to reduce the chance of plague, but you have to -; enable illness in game.ruleset for that to be relevant. - -[building_bank] -name = _("Bank") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Banking", "Player" - "Building", "Marketplace", "City" - } -graphic = "b.bank" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 80 -upkeep = 2 -sabotage = 100 -sound = "b_bank" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Together, a Bank and Marketplace double the tax and luxury production in a city.\ - That is, the Bank adds another +50% to the +50% of the Marketplace.\ -") - -[building_barracks] -name = _("Barracks") -genus = "Improvement" -reqs = - { "type", "name", "range" - - } -graphic = "b.barracks_i" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Gunpowder", "Player" - "Building", "Barracks II", "City" - "Building", "Barracks III", "City" - } -build_cost = 30 -upkeep = 1 -sabotage = 100 -sound = "b_barracks_i" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -With a Barracks I, each new land unit built in a city will\ - automatically have Veteran V1 status, which means that its attack and\ - defense strengths are increased by 50%. Also, damaged land units\ - which stay in town for one full turn without moving are completely\ - healed. Obsolete by: Gunpowder.\ -") - -[building_barracks_ii] -name = _("Barracks II") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Gunpowder", "Player" - } -graphic = "b.barracks_ii" -graphic_alt = "b.barracks_i" -obsolete_by = - { "type", "name", "range" - "Tech", "Mobile Warfare", "Player" - "Building", "Barracks III", "City" - } -build_cost = 30 -upkeep = 1 -sabotage = 100 -sound = "b_barracks_ii" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -With a Barracks II, each new land unit built in a city will\ - automatically have Veteran V1 status, which means that its attack and\ - defense strengths are increased by 50%. Also, damaged land units\ - which stay in town for one full turn without moving are completely\ - restored. Obsolete by: Mobile Warfare.\ -") - -[building_barracks_iii] -name = _("Barracks III") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Mobile Warfare", "Player" - } -graphic = "b.barracks_iii" -graphic_alt = "b.barracks_i" -obsolete_by = - { "type", "name", "range" - } -build_cost = 30 -upkeep = 1 -sabotage = 100 -sound = "b_barracks_iii" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -With a Barracks III, each new land unit built in a city will\ - automatically have Veteran V1 status, which means that its attack and\ - defense strengths are increased by 50%. Also, damaged land units\ - which stay in town for one full turn without moving are completely\ - restored.\ -") - -[building_cathedral] -name = _("Cathedral") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Monotheism", "Player" - "Building", "Temple", "City" - } -graphic = "b.cathedral" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 80 -upkeep = 3 -sabotage = 100 -sound = "b_cathedral" -sound_alt = "b_generic" -helptext = _("\ -A Cathedral makes 3 unhappy citizens content in a city, making it\ - easier to maintain order in that city; however, it does not affect\ - citizens made unhappy by military activity. The discovery of Theology\ - increases the effect of a Cathedral, making an additional unhappy\ - citizen content. The discovery of Communism lessens the effect of\ - a Cathedral, reducing by one the number of unhappy citizens made\ - content.\ -") - -[building_city_walls] -name = _("City Walls") -genus = "Improvement" -flags = "VisibleByOthers" -reqs = - { "type", "name", "range" - "Tech", "Masonry", "Player" - } -graphic = "b.city_walls" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 0 -sabotage = 50 -sound = "b_city_walls" -sound_alt = "b_generic" -helptext = _("\ -City Walls enhance the 1.5x bonus for Land units in a city to 3x, effectively\ - doubling the strength of Land units against attacks from other Land units and also\ - Helicopters. City Walls are ineffective against Air units, Sea units, Missiles, and Howitzers,\ - in which case the normal 1.5x bonus is given. City Walls prevent population loss\ - when a defending unit is destroyed by a Land unit.\ -") - -[building_coastal_defense] -name = _("Coastal Defense") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Gunpowder", "Player" - "TerrainClass", "Oceanic", "Adjacent" - } -graphic = "b.coastal_defense" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 1 -sabotage = 100 -sound = "b_coastal_defense" -sound_alt = "b_generic" -helptext = _("\ -Doubles the defense strength of all units in a city when defending against\ - against enemy ships.\ -") - -[building_courthouse] -name = _("Courthouse") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Code of Laws", "Player" - } -graphic = "b.courthouse" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 45 -upkeep = 1 -sabotage = 100 -sound = "b_courthouse" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Reduces the corruption and waste in a city by half, (60% rounded down)\ - Revolt cost of the city is double if empty and quadruple if occupied.\ - Provides law and order to support +1 unit free of upkeep. Removes\ - tile corruption penalties under all governments. Increases protection\ - from hostile diplomatic actions by +20%. \ -"), _("\ -Under a Democracy, a Courthouse also makes 1 unhappy citizen content\ - (unless that citizen is unhappy about military activity).\ -") - -[building_factory] -name = _("Factory") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Industrialization", "Player" - } -graphic = "b.factory" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 140 -upkeep = 4 -sabotage = 100 -sound = "b_factory" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Increases the shield production in a city by +50%. This increase may\ - contribute to pollution.\ -") - -[building_granary] -name = _("Granary") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Pottery", "Player" - } -graphic = "b.granary" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 35 -upkeep = 1 -sabotage = 100 -sound = "b_granary" -sound_alt = "b_generic" -helptext = _("\ -The amount of stored food will be set to half full whenever a city\ - with a Granary shrinks or grows. This helps a city to grow faster\ - and more easily withstand famine.\ -") - -[building_harbour] -name = _("Harbor") -rule_name = "Harbour" ; en_GB spelling used originally -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Seafaring", "Player" - "TerrainClass", "Oceanic", "Adjacent" - } -graphic = "b.harbour" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 40 -upkeep = 1 -sabotage = 100 -sound = "b_harbour" -sound_alt = "b_generic" -helptext = _("\ -Gives one extra food resource on all Oceanic tiles. The city needs\ - to be coastal to build this improvement.\ -") - -[building_hydro_plant] -name = _("Hydro Plant") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Electronics", "Player" - "Building", "Factory", "City" - "Extra", "River", "Adjacent" - } -graphic = "b.hydro_plant" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 180 -upkeep = 4 -sabotage = 100 -sound = "b_hydro_plant" -sound_alt = "b_generic" -helptext = _("\ -For each Factory or Mfg. Plant in a city, a Hydro Plant adds +25% to\ - base production, and reduces pollution from production by -25%.\ -"), _("\ -*If a city has either a Factory or Mfg. Plant, this makes a combined +75%\ - production bonus with a 25% decrease in pollution from production.\ -"), _("\ -*In a city with both a Factory and Mfg. Plant, this makes a combined +150%\ - production bonus with a 50% decrease in pollution from production.\ -"), _("\ -*Only one Power Plant, Hydro Plant, Nuclear Plant, or\ - Solar Plant can have an active effect in a city.\ -") - -[building_library] -name = _("Library") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Writing", "Player" - } -graphic = "b.library" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 1 -sabotage = 100 -sound = "b_library" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Increases the science output in a city by +100%.\ -") - -[building_marketplace] -name = _("Marketplace") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Currency", "Player" - } -graphic = "b.marketplace" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 0 -sabotage = 100 -sound = "b_marketplace" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Increases the luxury and tax output in a city by +50%.\ -") - -[building_mass_transit] -name = _("Mass Transit") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Mass Production", "Player" - } -graphic = "b.mass_transit" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 0 -sabotage = 100 -sound = "b_mass_transit" -sound_alt = "b_generic" -helptext = _("\ -Eliminates the pollution generated by population.\ - Production becomes the only source of pollution in\ - the city.\ -"), _("\ -Increased citizen mobility and ticket reyenues\ - increase base trade on city centre tile by +2\ -") - -[building_mfg_plant] -name = _("Mfg. Plant") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Robotics", "Player" - "Building", "Factory", "City" - } -graphic = "b.mfg_plant" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 220 -upkeep = 6 -sabotage = 100 -sound = "b_mfg_plant" -sound_alt = "b_generic" -helptext = _("\ -A Manufacturing Plant increases base production by +50%.\ -"), _("\ -A Mfg. Plant & Factory together double the production in a city.\ - That is, the Mfg. Plant adds another +50% to the +50% of the Factory.\ -"), _("\ -A Mfg. Plant with a Factory AND a Power/Hydro/Nuclear/Solar Plant\ - will combine for a total +150% increase over base production.\ -"), _("\ -The pollution reduction of a Hydro/Nuclear/Solar Plant is applied one more time\ - to cities with Mfg. Plants, effectively doubling the bonus percentage.\ -") - -[building_nuclear_plant] -name = _("Nuclear Plant") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Nuclear Power", "Player" - "Building", "Factory", "City" - } -graphic = "b.nuclear_plant" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 120 -upkeep = 2 -sabotage = 100 -sound = "b_nuclear_plant" -sound_alt = "b_generic" -helptext = _("\ -For each Factory or Mfg. Plant in a city, a Nuclear Plant adds +25% to\ - base production, and reduces pollution from production by -25%.\ -"), _("\ -*If a city has either a Factory or Mfg. Plant, this makes a combined +75%\ - production bonus with a 25% decrease in pollution from production.\ -"), _("\ -*In a city with both a Factory and Mfg. Plant, this makes a combined +150%\ - production bonus with a 50% decrease in pollution from production.\ -"), _("\ -*Only one Power Plant, Hydro Plant, Nuclear Plant, or\ - Solar Plant can have an active effect in a city.\ -") - -[building_offshore_platform] -name = _("Offshore Platform") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Miniaturization", "Player" - "TerrainClass", "Oceanic", "Adjacent" - } -graphic = "b.offshore_platform" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 120 -upkeep = 3 -sabotage = 100 -sound = "b_offshore_platform" -sound_alt = "b_generic" -helptext = _("\ -Adds 1 extra shield resource on all Oceanic tiles worked by a city. The\ - city needs to be coastal to build this improvement.\ -") - -[building_palace] -name = _("Palace") -genus = "SmallWonder" -flags = "SaveSmallWonder" -reqs = - { "type", "name", "range" - "Tech", "Masonry", "Player" - } -graphic = "b.palace" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 70 -upkeep = 0 -sabotage = 0 -sound = "b_palace" -sound_alt = "b_generic" -helptext = _("\ -Makes a city the capital of your nation.\ - Corruption and waste in other cities is related to how far away\ - from the capital they are (except under Democracy or\ - Communism.) A Palace makes corruption and waste in your capital\ - half of what it would otherwise be.\ -"), _("\ -The cost of inciting a revolt depends on the city's distance from the\ - capital. The capital cannot be incited to revolt, and reduces enemy\ - agents' chance of defeating your agents by -50%. Attempts to sabotage your\ - capital's buildings are also reduced by 50%.\ -"), _("\ -Take good care of your capital, as its loss may result in your\ - empire plunging into civil war. Losing your current palace also\ - results in losing whatever spaceship you might have.\ -"), _("\ -If the capital is in a dangerous location, or a more central capital\ - would give a better corruption distribution, you can move your palace\ - by rebuilding it in another city.\ -"), -_("\ -Under Despotism the city containing the palace gains a +75%\ - production bonus, and under Monarchy a +50% production bonus.\ -") - -[building_ecclesiastical_palace] -name = _("Ecclesiastical Palace") -genus = "SmallWonder" -reqs = - { "type", "name", "range" - "Tech", "Mysticism", "Player" - } -graphic = "b.ecclesiastical_palace" -graphic_alt = "b.palace" -obsolete_by = - { "type", "name", "range" - } -build_cost = 110 -upkeep = 0 -sabotage = 0 -sound = "b_palace" -sound_alt = "b_generic" -helptext = _("\ -Makes a city the ecclesiastical capital, that acts as a second center \ -of government.\ -"), _("\ -This building is a second Palace and confers all effects of a Palace,\ - including reduction of corruption based on which capital a city is\ - closest to. Under Despotism, the city containing the Palace gains a\ - +75% gold bonus. Under Monarchy, a +50% gold bonus. \ -"), _("\ -The city where this Palace is located cannot be incited to revolt,\ - and enjoys a bonus when enemy agents try to evade your own agents\ - stationed in the city, or sabotage your buildings.\ -") - -[building_police_station] -name = _("Police Station") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Communism", "Player" - } -graphic = "b.police_station" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 50 -upkeep = 2 -sabotage = 100 -sound = "b_police_station" -sound_alt = "b_generic" -helptext = _("\ -Reduces the unhappiness caused by aggressively deployed military\ - units owned by the city by -4 under Democracy and -2 under Republic\ - -- in other words, it neutralizes the unhappiness caused by two\ - military units. This improvement has no effect under other governments.\ -") - -[building_port_facility] -name = _("Port Facility") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Amphibious Warfare", "Player" - "TerrainClass", "Oceanic", "Adjacent" - } -graphic = "b.port_facility" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 3 -sabotage = 100 -sound = "b_port_facility" -sound_alt = "b_generic" -helptext = _("\ -Allows a city to build veteran sea units. Damaged sea units\ - which stay in town for one full turn without moving are completely\ - restored.\ -") - -[building_power_plant] -name = _("Power Plant") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Refining", "Player" - "Building", "Factory", "City" - } -graphic = "b.power_plant" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 130 -upkeep = 4 -sabotage = 100 -sound = "b_power_plant" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -For each Factory or Mfg. Plant in a city, a Power Plant adds +25% to\ - base production. The extra production may lead to more pollution.\ -"), _("\ -*If a city has either a Factory or Mfg. Plant, this makes a combined +75%\ - production bonus.\ -"), _("\ -*In a city with both a Factory and Mfg. Plant, this makes a combined +150%\ - production bonus.\ -"), _("\ -*Only one Power Plant, Hydro Plant, Nuclear Plant, or\ - Solar Plant can have an active effect in a city.\ -") - -[building_recycling_center] -name = _("Recycling Center") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Recycling", "Player" - } -graphic = "b.recycling_center" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 70 -upkeep = 1 -sabotage = 100 -sound = "b_recycling_center" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -A Recycling Center reduces the pollution\ - generated by production in a city by -66%. Supply of raw\ - recycled materials adds +2 producton to the city\ - center tile.\ -") - -[building_research_lab] -name = _("Research Lab") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Computers", "Player" - "Building", "University", "City" - } -graphic = "b.research_lab" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 120 -upkeep = 3 -sabotage = 100 -sound = "b_research_lab" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Adds +100% to base science output for each Library and University\ - in a city.\ -*In a city with a Library or University, the combined increase to science\ - output is +200%. \ -*In a city with a Library and a University, the combined increase\ - is +450%.\ -") - -[building_sam_battery] -name = _("SAM Battery") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Rocketry", "Player" - } -graphic = "b.sam_battery" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 70 -upkeep = 2 -sabotage = 100 -sound = "b_sam_battery" -sound_alt = "b_generic" -helptext = _("\ -Doubles the defense of all units inside the city when attacked by\ - aircraft (not including helicopters or missiles).\ -") - -[building_sdi_defense] -name = _("SDI Defense") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Laser", "Player" - } -graphic = "b.sdi_defense" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 140 -upkeep = 4 -sabotage = 100 -sound = "b_sdi_defense" -sound_alt = "b_generic" -helptext = _("\ -Protects a city and its environs (up to 2 tiles away) from attacks\ - by other nations' Nuclear units. A Nuclear unit not owned by you or a\ - teammate will be shot down and have no effect.\ - Also, doubles defense for units in the city against non-nuclear missiles.\ -") - -[building_sewer_system] -name = _("Sewer System") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Sanitation", "Player" - "Building", "Aqueduct", "City" - } -graphic = "b.sewer_system" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 80 -upkeep = 2 -sabotage = 100 -sound = "b_sewer_system" -sound_alt = "b_generic" -helptext = _("\ -Allows a city to grow larger than size 12. An Aqueduct is first\ - required for a city to grow larger than size 8.\ -") -; There is also an effect to reduce the chance of plague, but you have to -; enable illness in game.ruleset for that to be relevant. - -[building_solar_plant] -name = _("Solar Plant") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Environmentalism", "Player" - "Building", "Factory", "City" - } -graphic = "b.solar_plant" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 320 -upkeep = 4 -sabotage = 100 -sound = "b_solar_plant" -sound_alt = "b_generic" -helptext = _("\ -For each Factory or Mfg. Plant in a city, a Solar Plant adds +25% to\ - base production, and reduces pollution from production by -50%.\ -"), _("\ -*If a city has either a Factory or Mfg. Plant, this makes a combined +75%\ - production bonus with a 50% decrease in pollution from production.\ -"), _("\ -*In a city with both a Factory and Mfg. Plant, this makes a combined +150%\ - production bonus with 100% elimination of all pollution from production.\ -"), _("\ -*Only one Power Plant, Hydro Plant, Nuclear Plant, or\ - Solar Plant can have an active effect in a city.\ -") - -[building_space_component] -name = _("Space Component") -genus = "Special" -reqs = - { "type", "name", "range" - "Tech", "Plastics", "Player" - "Building", "Factory", "City" - } -graphic = "b.space_component" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 160 -upkeep = 0 -sabotage = 100 -sound = "b_space_component" -sound_alt = "b_generic" -helptext = _("\ -Space Components can be differentiated into Propulsion and Fuel\ - Components. Each pair of them reduces your spaceship's travel\ - time. You can build up to 8 pairs.\ -"), _("\ -Before you can build any spaceship parts, any nation must have built the\ - Apollo Program.\ -") - -[building_space_module] -name = _("Space Module") -genus = "Special" -reqs = - { "type", "name", "range" - "Tech", "Superconductors", "Player" - "Building", "Factory", "City" - } -graphic = "b.space_modules" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 320 -upkeep = 0 -sabotage = 100 -sound = "b_space_module" -sound_alt = "b_generic" -helptext = _("\ -Space Modules are the most expensive parts of spaceships. There\ - are three different types of Space Module:\ -"), _("\ -- Habitation Module: provides living space for 10,000 people.\ -"), _("\ -- Life Support Module: provides food and water for the population of\ - one Habitation Module.\ -"), _("\ -- Solar Panels: provides the energy needed for any two of the other\ - Modules.\ -"), _("\ -You can build up to 4 Space Modules of each kind.\ -"), _("\ -Before you can build any spaceship parts, any nation must have built the\ - Apollo Program.\ -") - -[building_space_structural] -name = _("Space Structural") -genus = "Special" -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "Building", "Factory", "City" - } -graphic = "b.space_structural" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 80 -upkeep = 0 -sabotage = 100 -sound = "b_space_structural" -sound_alt = "b_generic" -helptext = _("\ -Space Structurals form the base of your spaceship. All other\ - spaceship parts need to be connected to Structurals in order to\ - function. You can build up to 32 Space Structurals.\ -"), _("\ -Before you can build any spaceship parts, a nation must have built the\ - Apollo Program.\ -") - -[building_stock_exchange] -name = _("Stock Exchange") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Economics", "Player" - "Building", "Bank", "City" - } -graphic = "b.stock_exchange" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 120 -upkeep = 3 -sabotage = 100 -sound = "b_stock_exchange" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -In cities with a Bank, a Stock Exchange boosts tax and luxury\ - production by an additional +50%.\ -"), _("\ -*A Bank and Stock Exchange together boost\ - tax and luxury production by +100%.\ -"), _("\ -*A Marketplace, Bank, and Stock Exchange together boost\ - tax and luxury production by +150%.\ -") - -[building_super_highways] -name = _("Super Highways") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Automobile", "Player" - } -graphic = "b.super_highways" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 120 -upkeep = 3 -sabotage = 100 -sound = "b_super_highways" -sound_alt = "b_generic" -helptext = _("\ -Increases trade by +50% on all tiles with roads or\ - railroads (rounded down.)\ -") - -[building_supermarket] -name = _("Supermarket") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Refrigeration", "Player" - } -graphic = "b.supermarket" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 80 -upkeep = 3 -sabotage = 100 -sound = "b_supermarket" -sound_alt = "b_generic" -helptext = _("\ -Increases the food resources by +100% on each farmland tile which\ - is being used around the city. The city centre tile receives a\ - +50% bonus immediately, but can't receive a benefit from farmland.\ - Farmland tiles are those which have been irrigated a second time.\ -") - -[building_temple] -name = _("Temple") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Ceremonial Burial", "Player" - } -graphic = "b.temple" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 30 -upkeep = 1 -sabotage = 100 -sound = "b_temple" -sound_alt = "b_generic" -helptext = _("\ -Makes one unhappy citizen content. Mysticism doubles\ - this effect. With both Mysticism and the Oracle, +4 citizens are\ - made content. Does not affect citizens made unhappy by military\ - activity.\ -") - -[building_university] -name = _("University") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "University", "Player" - "Building", "Library", "City" - } -graphic = "b.university" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 120 -upkeep = 3 -sabotage = 100 -sound = "b_university" -sound_alt = "b_generic" -helptext = _("\ -Adds +150% to science output in a city with a Library.\ -"), _("\ -*A University and Library combine for a +250% increase\ - in science output.\ -") - -[building_apollo_program] -name = _("Apollo Program") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Space Flight", "Player", TRUE, FALSE - "Building", "Apollo Program", "Player", FALSE, TRUE - } -graphic = "b.apollo_program" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 600 -upkeep = 0 -sabotage = 0 -sound = "w_apollo_program" -sound_alt = "w_generic" -helptext = _("\ -Allows you to start building spaceship parts in cities\ - with factories (assuming you have researched the necessary\ - technologies).\ -") - -[building_asmiths_trading_co] -name = _("A.Smith's Trading Co.") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Economics", "Player", TRUE, FALSE - "Building", "A.Smith's Trading Co.", "Player", FALSE, TRUE - } -graphic = "b.asmiths_trading_co" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 300 -upkeep = 0 -sabotage = 0 -sound = "w_asmiths_trading_co" -sound_alt = "w_generic" -helptext = _("\ -City improvements with upkeep of 1 gold become free\ - of upkeep for all your cities. This wonder is never obsolete.\ -") - -[building_colossus] -name = _("Colossus") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Bronze Working", "Player", TRUE, FALSE - "Building", "Colossus", "Player", FALSE, TRUE - } -graphic = "b.colossus" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Automobile", "Player" - } -build_cost = 100 -upkeep = 0 -sabotage = 0 -sound = "w_colossus" -sound_alt = "w_generic" -helptext = _("\ -Each tile in and around the city where this wonder is built that is\ - already generating some trade produces one extra trade resource.\ - Obsolete by: Automobile.\ -") - -[building_copernicus_observatory] -name = _("Copernicus' Observatory") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Astronomy", "Player", TRUE, FALSE - "Building", "Copernicus' Observatory", "Player", FALSE, TRUE - } -graphic = "b.copernicus_observatory" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 100 -upkeep = 0 -sabotage = 0 -sound = "w_copernicus_observatory" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Boosts science production by 100% in the city where it is built.\ - That is, the base science level before any improvements were made,\ - is added to the total science. This wonder is never obsolete.\ -") - -[building_cure_for_cancer] -name = _("Cure For Cancer") -genus = "GreatWonder" -reqs = - { "type", "name", "range" - "Tech", "Genetic Engineering", "Player" - } -graphic = "b.cure_for_cancer" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 400 -upkeep = 0 -sabotage = 0 -sound = "w_cure_for_cancer" -sound_alt = "w_generic" -helptext = _("\ -This stunning technological achievement makes two content citizens\ - happy in all cities of all players who know Genetic\ - Engineering. In the event where there are not enough\ - content citizens to benefit from this effect, the wonder\ - applies to unhappy citizens (including those unhappy about military\ - activity), making each content then happy. This wonder is never obsolete.\ -") - -[building_darwins_voyage] -name = _("Voyage of Darwin") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Railroad", "Player", TRUE, FALSE - "Building", "Voyage of Darwin", "Player", FALSE, TRUE - } -graphic = "b.darwins_voyage" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 200 -upkeep = 0 -sabotage = 0 -sound = "w_darwins_voyage" -sound_alt = "w_generic" -helptext = _("\ -Each tile in and around the city where this wonder is built that is\ - already generating some trade produces one extra trade resource.\ - This Wonder is never obsolete.\ -") - -[building_eiffel_tower] -name = _("Eiffel Tower") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Steam Engine", "Player", TRUE, FALSE - "Building", "Eiffel Tower", "Player", FALSE, TRUE - } -graphic = "b.eiffel_tower" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 100 -upkeep = 0 -sabotage = 0 -sound = "w_eiffel_tower" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -All your cities support one unit free of\ - shield upkeep. This wonder is never obsolete.\ -") - -[building_genghis_khans_equestrian_school] -name = _("Genghis Khan's Equestrian School") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Horseback Riding", "Player", TRUE, FALSE - "Building", "Genghis Khan's Equestrian School", "Player", FALSE, TRUE - } -graphic = "b.genghis_khans_equestrian_school" -graphic_alt = "b.sun_tzus_war_academy" -obsolete_by = - { "type", "name", "range" - "Tech", "Mobile Warfare", "Player" - } -build_cost = 150 -upkeep = 0 -sabotage = 0 -sound = "w_sun_tzus_war_academy" -sound_alt = "w_generic" -helptext = _("\ -Gives mounted units 1 additional movement point. Does not work\ - on Cavalry. Obsolete by: Mobile Warfare.\ -") - -[building_gibraltar_fortress] -name = _("Gibraltar Fortress") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Metallurgy", "Player", TRUE, FALSE - "Building", "Gibraltar Fortress", "Player", FALSE, TRUE - "TerrainClass", "Oceanic", "Adjacent", TRUE, FALSE - } -graphic = "b.gibraltar_fortress" -graphic_alt = "b.great_wall" -obsolete_by = - { "type", "name", "range" - } -build_cost = 350 -upkeep = 0 -sabotage = 0 -sound = "w_gibraltar_fortress" -sound_alt = "w_generic" -helptext = _("\ -Gives a Coastal Defense in all your coastal cities. This has no effect\ - when Coastal Defense is already present. This Wonder must be built\ - in a coastal city. It does not become obsolete.\ -") - -[building_great_wall] -name = _("Great Wall") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Masonry", "Player", TRUE, FALSE - "Building", "Great Wall", "Player", FALSE, TRUE - } -graphic = "b.great_wall" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Machine Tools", "Player" - } -build_cost = 275 -upkeep = 0 -sabotage = 0 -sound = "w_great_wall" -sound_alt = "w_generic" -helptext = _("\ -Gives a City Wall in all your cities. This has no effect\ - when City Walls are already present. This Wonder is made\ - obsolete when you discover Machine Tools.\ -") - -[building_hanging_gardens] -name = _("Hanging Gardens") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Pottery", "Player", TRUE, FALSE - "Building", "Hanging Gardens", "Player", FALSE, TRUE - } -graphic = "b.hanging_gardens" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Railroad", "Player" - } -build_cost = 200 -upkeep = 0 -sabotage = 0 -sound = "w_hanging_gardens" -sound_alt = "w_generic" -helptext = _("\ -Makes two content citizens happy in every city in your nation.\ - In the event where there are no content citizens to get the\ - effect of Hanging Gardens, the wonder applies to unhappy citizens\ - (including those unhappy about military activity), making each content\ - then happy. Gives +2 luxury in the city where it's built.\ - Obsolete by: Railroad.\ -") - -[building_hoover_dam] -name = _("Hoover Dam") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Electronics", "Player", TRUE, FALSE - "Extra", "River", "Adjacent", TRUE, FALSE - "Building", "Hoover Dam", "Player", FALSE, TRUE - } -graphic = "b.hoover_dam" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 600 -upkeep = 0 -sabotage = 0 -sound = "w_hoover_dam" -sound_alt = "w_generic" -helptext = _("\ -Works exactly as a Hydro Plant in all your cities.\ - (This reduces pollution and increases the effects\ - of Factories and Mfg. Plants.) This wonder is never obsolete.\ -") - -[building_isaac_newtons_college] -name = _("Isaac Newton's College") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Theory of Gravity", "Player", TRUE, FALSE - "Building", "Isaac Newton's College", "Player", FALSE, TRUE - } -graphic = "b.isaac_newtons_college" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 400 -upkeep = 0 -sabotage = 0 -sound = "w_isaac_newtons_college" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Adds 100% of base science production to every city in your\ - nation that has a University. That is, the boost that a\ - Library gives with no other science improvements is added\ - to the total science output in each city with a University.\ - This wonder is never obsolete.\ -") - -[building_js_bachs_cathedral] -name = _("J.S. Bach's Cathedral") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Theology", "Player", TRUE, FALSE - "Building", "J.S. Bach's Cathedral", "Player", FALSE, TRUE - } -graphic = "b.js_bachs_cathedral" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 300 -upkeep = 0 -sabotage = 0 -sound = "w_js_bachs_cathedral" -sound_alt = "w_generic" -helptext = _("\ -Makes two unhappy citizens content in every city in your nation\ - (including citizens unhappy about military activity).\ - This wonder is never obsolete.\ -") - -[building_king_richards_crusade] -name = _("King Richard's Crusade") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Engineering", "Player", TRUE, FALSE - "Building", "King Richard's Crusade", "Player", FALSE, TRUE - } -graphic = "b.king_richards_crusade" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Robotics", "Player" - } -build_cost = 150 -upkeep = 0 -sabotage = 0 -sound = "w_king_richards_crusade" -sound_alt = "w_generic" -helptext = _("\ -Adds one extra shield resource on every tile in and around\ - the city where it is built. Obsolete by: Robotics.\ -") - -[building_leonardos_workshop] -name = _("Leonardo's Workshop") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Invention", "Player", TRUE, FALSE - "Building", "Leonardo's Workshop", "Player", FALSE, TRUE - } -graphic = "b.leonardos_workshop" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Automobile", "Player" - } -build_cost = 300 -upkeep = 0 -sabotage = 0 -sound = "w_leonardos_workshop" -sound_alt = "w_generic" -helptext = _("\ -Upgrades two obsolete units per game turn. The discovery\ - of Automobile will make Leonardo's Workshop obsolete.\ -") - -[building_lighthouse] -name = _("Lighthouse") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Map Making", "Player", TRUE, FALSE - "TerrainClass", "Oceanic", "Adjacent", TRUE, FALSE - "Building", "Lighthouse", "Player", FALSE, TRUE - } -graphic = "b.lighthouse" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Miniaturization", "Player" - } -build_cost = 170 -upkeep = 0 -sabotage = 0 -sound = "w_lighthouse" -sound_alt = "w_generic" -helptext = _("\ -Gives all your sea units 2 additional movement points,\ - while increasing their vision. Obsolete by: Miniaturization.\ -") - -[building_magellans_expedition] -name = _("Magellan's Expedition") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Navigation", "Player", TRUE, FALSE - "TerrainClass", "Oceanic", "Adjacent", TRUE, FALSE - "Building", "Magellan's Expedition", "Player", FALSE, TRUE - } -graphic = "b.magellans_expedition" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 400 -upkeep = 0 -sabotage = 0 -sound = "w_magellans_expedition" -sound_alt = "w_generic" -helptext = _("\ -All your new sea units built in cities in your nation start with\ - an additional veteran level (this is cumulative with any Port Facility\ - This wonder is never obsolete.\ -") - -[building_manhattan_project] -name = _("Manhattan Project") -genus = "GreatWonder" -reqs = - { "type", "name", "range" - "Tech", "Nuclear Fission", "Player" - } -graphic = "b.manhattan_project" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 600 -upkeep = 0 -sabotage = 0 -sound = "w_manhattan_project" -sound_alt = "w_generic" -;helptext is set in client/helpdata.c:helptext_wonder() -helptext = _("\ -Allows all nations who know Nuclear Fission to make nuclear weapons.\ - This Wonder does not become obsolete.\ -") - -[building_marco_polos_embassy] -name = _("Marco Polo's Embassy") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Trade", "Player", TRUE, FALSE - "Building", "Marco Polo's Embassy", "Player", FALSE, TRUE - } -graphic = "b.marco_polos_embassy" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 400 -upkeep = 0 -sabotage = 0 -sound = "w_marco_polos_embassy" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Increases trade output by 40% in all your cities.\ - This Wonder does not become obsolete.\ -") - -[building_michelangelos_chapel] -name = _("Michelangelo's Chapel") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Monotheism", "Player", TRUE, FALSE - "Building", "Michelangelo's Chapel", "Player", FALSE, TRUE - } -graphic = "b.michelangelos_chapel" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 300 -upkeep = 0 -sabotage = 0 -sound = "w_michelangelos_chapel" -sound_alt = "w_generic" -helptext = _("\ -Counts as having a Cathedral in all of your cities.\ - This makes 3 unhappy citizens content in each city;\ - however, it does not affect citizens made unhappy by military activity.\ - The discovery of Theology increases the effect of a Cathedral,\ - making an additional unhappy citizen content. The discovery of\ - Communism lessens the effect of a Cathedral, reducing by one\ - the number of unhappy citizens made content.\ -") - -;this is wonder #61 -[building_mausoleum_of_mausolos] -name = _("Mausoleum of Mausolos") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Ceremonial Burial", "Player", TRUE, FALSE - "Building", "Mausoleum of Mausolos", "Player", FALSE, TRUE - } -graphic = "b.mausoleum" -graphic_alt = "b.oracle" -obsolete_by = - { "type", "name", "range", "survives" - "Tech", "Radio", "Player", FALSE - } -build_cost = 200 -upkeep = 0 -sabotage = 0 -sound = "w_oracle" -sound_alt = "w_generic" -helptext = _("\ -With this wonder, City Walls and Courthouses each make one unhappy\ - citizen content in their city, unless that citizen is unhappy about\ - aggression. Also, none of the owner's cities can be incited to revolt.\ - The discovery of Radio makes the Mausoleum obsolete.\ -") - -[building_oracle] -name = _("Oracle") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Mysticism", "Player", TRUE, FALSE - "Building", "Oracle", "Player", FALSE, TRUE - } -graphic = "b.oracle" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Theology", "Player" - } -build_cost = 100 -upkeep = 0 -sabotage = 0 -sound = "w_oracle" -sound_alt = "w_generic" -helptext = _("\ -Makes two of your unhappy citizens content in every city\ - with a Temple in your nation. Does not affect citizens made\ - unhappy by military activity. Obsolete by: Theology.\ -") - -[building_pyramids] -name = _("Pyramids") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Masonry", "Player", TRUE, FALSE - "Building", "Pyramids", "Player", FALSE, TRUE - } -graphic = "b.pyramids" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 160 -upkeep = 0 -sabotage = 0 -sound = "w_pyramids" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Every city will gain +25% to its food storage when population changes.\ - In addition, the city with the Pyramids can rapture when celebrating.\ - This Wonder does not become obsolete.\ -") - -[building_shakespeares_theatre] -name = _("Shakespeare's Theater") -rule_name = "Shakespeare's Theatre" ; en_GB used originally -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Medicine", "Player", TRUE, FALSE - "Building", "Shakespeare's Theatre", "Player", FALSE, TRUE - } -graphic = "b.shakespeares_theatre" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 200 -upkeep = 0 -sabotage = 0 -sound = "w_shakespeares_theatre" -sound_alt = "w_generic" -helptext = _("\ -Makes all angry and unhappy citizens content in the city where it\ - is located, including citizens unhappy about military activity.\ - This Wonder does not become obsolete.\ -") - -;this should be wonder #65 if we counted correctly and need it for the "statue hack" to determine if player can get gov. -[building_statue_of_liberty] -name = _("Statue of Liberty") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Democracy", "Player", TRUE, FALSE - "Building", "Statue of Liberty", "Player", FALSE, TRUE - } -graphic = "b.statue_of_liberty" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 400 -upkeep = 0 -sabotage = 0 -sound = "w_statue_of_liberty" -sound_alt = "w_generic" -helptext = _("\ -Allows you to instantly change government, including governments\ - not yet researched by your civilization, and without\ - the transition period of Anarchy.\ - This Wonder does not become obsolete.\ -") - -[building_statue_of_zeus] -name = _("Statue of Zeus") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Polytheism", "Player", TRUE, FALSE - "Building", "Statue of Zeus", "Player", FALSE, TRUE - } -graphic = "b.statue_of_zeus" -graphic_alt = "b.oracle" -obsolete_by = - { "type", "name", "range", "survives" - "Tech", "Tactics", "Player", FALSE - } -build_cost = 100 -upkeep = 0 -sabotage = 0 -sound = "w_oracle" -sound_alt = "w_generic" -helptext = _("\ -The powerful Zeus gives order and organization to both city and nation.\ - One citizen is made content about military activity in every city in\ - your nation. In the city the statue is located, it makes one citizen\ - happy and provides free upkeep to 4 units.\ - The discovery of Tactics makes the Statue of Zeus obsolete.\ -") - -[building_supreme_court] -name = _("Supreme Court") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Literacy", "Player", TRUE, FALSE - "Building", "Supreme Court", "Player", FALSE, TRUE - } -graphic = "b.great_library" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 200 -upkeep = 0 -sabotage = 0 -sound = "w_great_library" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -The Supreme Court acts as a Courthouse in every city.\ - This Wonder does not become obsolete.\ -") - -[building_sun_tzus_war_academy] -name = _("Sun Tzu's War Academy") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Feudalism", "Player", TRUE, FALSE - "Building", "Sun Tzu's War Academy", "Player", FALSE, TRUE - } -graphic = "b.sun_tzus_war_academy" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Mobile Warfare", "Player" - } -build_cost = 300 -upkeep = 0 -sabotage = 0 -sound = "w_sun_tzus_war_academy" -sound_alt = "w_generic" -helptext = _("\ -All your new military land units produced in cities in your nation\ - start with an additional veteran level (this is cumulative with any\ - Barracks building in a city; with both, units are created as Hardened).\ - Obsolete by: Mobile Warfare.\ -") - -[building_temple_of_artemis] -name = _("Temple of Artemis") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Mysticism", "Player", TRUE, FALSE - "Building", "Temple", "City", TRUE, FALSE - "Building", "Temple of Artemis", "Player", FALSE, TRUE - - } -graphic = "b.temple_of_artemis" -graphic_alt = "b.oracle" -obsolete_by = - { "type", "name", "range", "survives" - "Tech", "Computers", "Player", FALSE - } -build_cost = 250 -upkeep = 0 -sabotage = 0 -sound = "w_oracle" -sound_alt = "w_generic" -helptext = _("\ -The bounteous Artemis bestows to all cities with Temples a small yet\ - multitudinous benediction: +1 each to production, luxury, science, and gold.\ - Requires a Temple in the city where it will be built. The discovery of Computers\ - makes the Temple of Artemis obsolete.") - -[building_internet] -name = _("The Internet") -genus = "SmallWonder" - reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Computers", "Player", TRUE, FALSE - "Building", "The Internet", "Player", FALSE, TRUE - } -graphic = "b.internet" -graphic_alt = "b.seti_program" -obsolete_by = - { "type", "name", "range" - } -build_cost = 600 -upkeep = 0 -sabotage = 0 -sound = "w_internet" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Adds to science production in all your cities with\ - a Research Lab, 100% of base output.\ - This Wonder does not become obsolete.\ -") - -[building_united_nations] -name = _("United Nations") -genus = "GreatWonder" -reqs = - { "type", "name", "range" - "Tech", "Communism", "Player" - } -graphic = "b.united_nations" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 600 -upkeep = 0 -sabotage = 0 -sound = "w_united_nations" -sound_alt = "w_generic" -helptext = _("\ -Creates a world senate that may prevent declarations of\ - war in some circumstances. If any player's city is in revolt\ - for more than two turns, that player's government falls.\ - This Wonder does not become obsolete.\ -") - -[building_womens_suffrage] -name = _("Women's Suffrage") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Industrialization", "Player", TRUE, FALSE - "Building", "Women's Suffrage", "Player", FALSE, TRUE - } -graphic = "b.womens_suffrage" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 300 -upkeep = 0 -sabotage = 0 -sound = "w_womens_suffrage" -sound_alt = "w_generic" -helptext = _("\ -Counts as a Police Station in every city in your nation.\ - (That is, for each city, it reduces the unhappiness caused by\ - aggressively deployed military units owned by that city by 4 under\ - Democracy and 2 under Republic -- in other words, it neutralizes\ - the unhappiness caused by two military units per city. This wonder\ - has no effect under other governments.)\ - This Wonder does not become obsolete.\ -") - -[building_capitalization] -name = _("Coinage") -genus = "Special" -flags = "Gold" -reqs = - { "type", "name", "range" - - } -graphic = "b.capitalization" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 999 -upkeep = 0 -sabotage = 0 -helptext = _("\ -This is not a normal improvement. Instead, setting a city's\ - production to Coinage means its shield production is\ - converted to tax output (money, coins!).\ -") diff --git a/freeciv/freeciv/data/.historic/mp2-May2019-historic/cities.ruleset b/freeciv/freeciv/data/.historic/mp2-May2019-historic/cities.ruleset deleted file mode 100644 index 105fac641..000000000 --- a/freeciv/freeciv/data/.historic/mp2-May2019-historic/cities.ruleset +++ /dev/null @@ -1,135 +0,0 @@ -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -[datafile] -description="Cities data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -; /* <-- avoid gettext warnings -; -; A specialist is a city citizen who is not a tile worker. Usually the -; player can control what specialist each citizen is, so long as the -; requirements for that specialist are met. -; -; Below are the entries for the specialists, one per specialist type. -; The tag name (in [specialist_*]) doesn't matter so long as it's unique. -; For each specialist the following fields may be set: -; -; -; name = translatable (plural) name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; if -; not present, "name" is used for this purpose too. Since -; the name used in savegames must not change, if you want -; to rename an item after a ruleset has been released, you -; should set "rule_name" to the original value of "name". -; short_name = one-character "short name" used (for instance) in cityrep; -; should be first character/abbrevation of "name" -; graphic = tag specifying preferred graphic -; Different images based on citizen number are supported. -; If no such images indexed with citizen number are found, -; plain tag is used instead. -; graphic_alt = fallback graphic tag in case the specialist graphic isn't -; found. -; reqs = requirements to have the specialist pick (see -; effects.ruleset and README.effects for help on requirements) -; helptext = optional help text string; should escape all raw newlines -; so that xgettext parsing works -; -; */ <-- avoid gettext warnings - -[specialist_elvis] -name = _("Entertainers") -; (The original specialist names in the classic ruleset and derivatives were -; not designed to be user-visible.) -rule_name = "elvis" -short_name = _("?Elvis:E") -graphic = "specialist.entertainer" -reqs = - { "type", "name", "range" -; Nothing - } -helptext = _("\ -Each entertainer produces two luxury points for their city per turn. \ -See the section on Happiness for the effects of luxury points.\ -") - -[specialist_scientist] -name = _("Scientists") -rule_name = "scientist" -short_name = _("?Scientist:S") -graphic = "specialist.scientist" -reqs = - { "type", "name", "range" -; Nothing - } -helptext = _("\ -Each scientist adds three points to your empire's research output \ -per turn.\ -") - -[specialist_taxman] -name = _("Taxmen") -rule_name = "taxman" -short_name = _("?Taxman:T") -graphic = "specialist.taxman" -reqs = - { "type", "name", "range" -; Nothing - } -helptext = _("\ -Each tax collector produces three extra gold for your treasury \ -per turn.\ -") - -[parameters] -add_to_size_limit = 8 ; cities >= this cannot be added to. -angry_citizens = TRUE ; set to FALSE to disable angry citizens -celebrate_size_limit = 3 ; cities >= can celebrate - -changable_tax = TRUE ; set to FALSE to disallow changing of tax rates -;forced_science = 0 ; set these fields when changeable_tax is turned off -;forced_luxury = 100 -;forced_gold = 0 - -vision_reveal_tiles = TRUE ; civ1 & 2 default FALSE - -pop_report_zeroes = 4 ; Population in reports in tens of thousands - -[citizen] -nationality = FALSE ; account for the nationality of the citizens -convert_speed = 50 ; base probability 50/1000 -> once every 20 turns -partisans_pct = 0 ; percentage of own nationality to inspire partisans - ; if 0, original city owner information is used instead -conquest_convert_pct = 0 ; percentage which converts to the new nation - ; after a city was conquered. Applied separately for each - ; nationality present in the city, and number of - ; converted people rounded up - -[missing_unit_upkeep] -; Get rid of a unit the city is unable to pay the X upkeep of. -; X_protected - never get rid of a unit with any of the listed unit type -; flags. -; X_unit_act - have the unit perform the listed actions until success, -; death or the list ends. -; X_wipe - wipe the unit if it survived performing the actions listed -; above. - -food_protected = "EvacuateFirst" -; food_unit_act = -food_wipe = TRUE - -; TODO: Should missing gold upkeep really be able to kill units with the -; EvacuateFirst unit type flag? -; gold_protected = -; gold_unit_act = -gold_wipe = TRUE - -shield_protected = "EvacuateFirst" -shield_unit_act = "Help Wonder", "Recycle Unit", "Disband Unit" -shield_wipe = FALSE diff --git a/freeciv/freeciv/data/.historic/mp2-May2019-historic/effects.ruleset b/freeciv/freeciv/data/.historic/mp2-May2019-historic/effects.ruleset deleted file mode 100644 index 86ba1229c..000000000 --- a/freeciv/freeciv/data/.historic/mp2-May2019-historic/effects.ruleset +++ /dev/null @@ -1,3690 +0,0 @@ -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes, -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -; Note that the freeciv AI may not cope well with anything more -; than minor changes. - -[datafile] -description="Multiplayer-Evolution effects data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -; /* <-- avoid gettext warnings -; -; Effects -; -; type = What the effect does. Values of multiple active effects -; of the same type get summed for the total. -; See README.effects for list of possible types -; value = Value added for the effect type when this effect is active, -; i.e., all requirements are fulfilled -; multiplier = Name of the policy that gives a multiplier for effect's value -; reqs = Requirements for the effect to be active. -; See README.effects for help on requirements -; -; */ <-- avoid gettext warnings - -; /* <-- avoid gettext warnings -; Combat_rounds test as a way to fine tune Bomber balance: -;[effect_combat_rounds_medium_bomber] -;type = "Combat_Rounds" -;value = 20 -;reqs = -; { "type", "name", "range", "present" -; "UnitType", "Medium Bomber", "Local", TRUE -; } -;[effect_combat_rounds_heavy_bomber] -;type = "Combat_Rounds" -;value = 20 -;reqs = -; { "type", "name", "range", "present" -; "UnitType", "Heavy Bomber", "Local", TRUE -; } -;[effect_combat_rounds_stealth_bomber] -;type = "Combat_Rounds" -;value = 20 -;reqs = -; { "type", "name", "range", "present" -; "UnitType", "Stealth Bomber", "Local", TRUE -; } -; */ <-- avoid gettext warnings - -; Cheating AI effects are in separate file -*include "default/ai_effects.ruleset" - -[effect_unhappysize] -type = "City_Unhappy_Size" -value = 4 - -; Barbarian effects - -[effect_barb1] -type = "No_Diplomacy" -value = 1 -reqs = - { "type", "name", "range" - "NationGroup", "Barbarian", "Player" - } - -; Barbarian disappearance - -[effect_barb_disappear] -type = "Retire_Pct" -value = 10 -reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", TRUE - "Age", "5", "Local", TRUE - "CityTile", "Center", "Local", FALSE - } - -; Lone Leader might escape on coast (33% chance) -; Complement of the two effects should be 0.9 * 0.66 = 0.594 -; (100 - 59) - 10 = 31 -[effect_leader_escape] -type = "Retire_Pct" -value = 31 -reqs = - { "type", "name", "range" - "UnitType", "Barbarian Leader", "Local" - "Age", "5", "Local" - "TerrainClass", "Oceanic", "Adjacent" - "MaxUnitsOnTile", "1", "Local" - } - -; Specialist output bonuses - -[effect_elvis] -type = "Specialist_Output" -value = 2 -reqs = - { "type", "name", "range" - "Specialist", "elvis", "Local" - "OutputType", "luxury", "Local" - } - -[effect_scientist] -type = "Specialist_Output" -value = 3 -reqs = - { "type", "name", "range" - "Specialist", "scientist", "Local" - "OutputType", "science", "Local" - } - -[effect_taxman] -type = "Specialist_Output" -value = 3 -reqs = - { "type", "name", "range" - "Specialist", "taxman", "Local" - "OutputType", "gold", "Local" - } - - -; Vision benefit from fortress watchtowers -[effect_fortress_vision] -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "tile" - "Tech", "Invention", "Player" - "UnitClass", "Land", "Local" - } - -[effect_fortress_vision_1] ;Marines, AAA -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "tile" - "Tech", "Invention", "Player" - "UnitClass", "LandAirSea", "Local" - } - -[effect_fortress_vision_2] ;Knights -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "tile" - "Tech", "Invention", "Player" - "UnitClass", "LandNoKill", "Local" - } - -; Vision benefit from mountains (for every land unit) -[effect_mountains_vision] -type = "Unit_Vision_Radius_Sq" -value = 5 -reqs = - { "type", "name", "range" - "Terrain", "Mountains", "Local" - "UnitClass", "Land", "Local" - } -[effect_mountains_vision_1] -type = "Unit_Vision_Radius_Sq" -value = 5 -reqs = - { "type", "name", "range" - "Terrain", "Mountains", "Local" - "UnitClass", "LandAirSea", "Local" - } -[effect_mountains_vision_2] -type = "Unit_Vision_Radius_Sq" -value = 5 -reqs = - { "type", "name", "range" - "Terrain", "Mountains", "Local" - "UnitClass", "LandNoKill", "Local" - } - -; basic free tech upkeep -[effect_upkeep_tech_free] -type = "Tech_Upkeep_Free" -value = 3 - -; Fortress HP regen -[effect_fortress_hp_regen] -type = "HP_Regen" -value = 25 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "Tile" - "UnitClass", "Land", "Local" - } -[effect_fortress_hp_regen_1] -type = "HP_Regen" -value = 25 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "Tile" - "UnitClass", "LandAirSea", "Local" - } -[effect_fortress_hp_regen_2] -type = "HP_Regen" -value = 25 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "Tile" - "UnitClass", "LandNoKill", "Local" - } -[effect_fortress_hp_regen_3] -type = "HP_Regen" -value = 25 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "Tile" - "UnitClass", "Helicopter", "Local" - } -[effect_airbase_hp_regen] -type = "HP_Regen" -value = 25 -reqs = - { "type", "name", "range" - "Extra", "Airbase", "Tile" - "UnitClass", "Helicopter", "Local" - } - -; Base vision range - radius of vision is sqrt(5) = 2.24 -[effect_city_vision] -type = "City_Vision_Radius_Sq" -value = 5 - -;PERCENTAGE CHANCE OF STEALING A TECH WHEN CONQUERING A CITY. -[effect_conquest_tech] -type = "Conquest_Tech_Pct" -value = 100 - -; Nuclear power gives +1 moves to sea units (+2 under 2x) -[effect_nuclear_powered_boats] -type = "Move_Bonus" -value = 2 -reqs = - { "type", "name", "range" - "Tech", "Nuclear Power", "Player" - "UnitClass", "Sea", "Local" - } -; Nuclear power gives +1 moves to sea units (+2 under 2x) -[effect_nuclear_powered_subs] -type = "Move_Bonus" -value = 2 -reqs = - { "type", "name", "range" - "Tech", "Nuclear Power", "Player" - "UnitClass", "Submarine", "Local" - } - -[effect_anarchy_upkeep] -type = "Upkeep_Free" -value = 99 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_anarchy_upkeep_tech_free] -type = "Tech_Upkeep_Free" -value = 9999 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_republic] -type = "Make_Content_Mil" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_corruption_anarchy0] -type = "Output_Waste" -value = 25 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_anarchy1] -type = "Output_Waste_By_Distance" -value = 200 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_despotism0] -type = "Output_Waste" -value = 37 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_despotism1] -type = "Output_Waste_By_Distance" -value = 400 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_monarchy0] -type = "Output_Waste" -value = 15 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_monarchy1] -type = "Output_Waste_By_Distance" -value = 200 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_communism0] -type = "Output_Waste" -value = 20 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_republic0] -type = "Output_Waste" -value = 15 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_republic1] -type = "Output_Waste_By_Distance" -value = 200 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - "OutputType", "Trade", "Local" - } - -[effect_base_unit_upkeep] -type = "Upkeep_Factor" -value = 1 - -[effect_republic_unit_upkeep] -type = "Upkeep_Factor" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - "OutputType", "Food", "Local" - } - -[effect_democracy_unit_upkeep] -type = "Upkeep_Factor" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - "OutputType", "Food", "Local" - } - -[effect_republic_unit_unhappiness] -type = "Unhappy_Factor" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_democracy_unit_unhappiness] -type = "Unhappy_Factor" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_upkeep_free_units_anarchy] -type = "Unit_Upkeep_Free_Per_City" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - "OutputType", "Shield", "Local" - } - -[effect_upkeep_free_units_despotism] -type = "Unit_Upkeep_Free_Per_City" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - "OutputType", "Shield", "Local" - } - -[effect_upkeep_free_units_monarchy] -type = "Unit_Upkeep_Free_Per_City" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - "OutputType", "Shield", "Local" - } - -[effect_upkeep_free_units_communism] -type = "Unit_Upkeep_Free_Per_City" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - "OutputType", "Shield", "Local" - } - -[effect_civil_war_0] -type = "Civil_War_Chance" -value = 90 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_civil_war_1] -type = "Civil_War_Chance" -value = 80 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_civil_war_2] -type = "Civil_War_Chance" -value = 70 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -[effect_civil_war_3] -type = "Civil_War_Chance" -value = 50 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - } - -[effect_civil_war_4] -type = "Civil_War_Chance" -value = 40 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_civil_war_5] -type = "Civil_War_Chance" -value = 30 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_empire_size_base_0] -type = "Empire_Size_Base" -value = 9 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_empire_size_base_1] -type = "Empire_Size_Base" -value = 10 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_empire_size_base_2] -type = "Empire_Size_Base" -value = 11 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -[effect_empire_size_base_3] -type = "Empire_Size_Base" -value = 12 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - } - -[effect_empire_size_base_4] -type = "Empire_Size_Base" -value = 13 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_empire_size_base_5] -type = "Empire_Size_Base" -value = 14 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_empire_size_base_6] -type = "Empire_Size_Base" -value = 14 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_empire_size_step_0] -type = "Empire_Size_Step" -value = 6 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_empire_size_step_1] -type = "Empire_Size_Step" -value = 10 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_empire_size_step_2] -type = "Empire_Size_Step" -value = 12 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -; Empire_Size_Step disabled for Communism - -[effect_empire_size_step_3] -type = "Empire_Size_Step" -value = 14 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_empire_size_step_4] -type = "Empire_Size_Step" -value = 16 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_empire_size_step_5] -type = "Empire_Size_Step" -value = 12 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_max_rates_0] -type = "Max_Rates" -value = 100 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_max_rates_1] -type = "Max_Rates" -value = 60 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_max_rates_2] -type = "Max_Rates" -value = 70 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -[effect_max_rates_3] -type = "Max_Rates" -value = 80 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - } - -[effect_max_rates_4] -type = "Max_Rates" -value = 80 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_max_rates_5] -type = "Max_Rates" -value = 100 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_martial_law_each_0] -type = "Martial_Law_Each" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_martial_law_each_1] -type = "Martial_Law_Each" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_martial_law_each_2] -type = "Martial_Law_Each" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -[effect_martial_law_each_3] -type = "Martial_Law_Each" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - } - -[effect_martial_law_max_0] -type = "Martial_Law_Max" -value = 100 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_martial_law_max_1] -type = "Martial_Law_Max" -value = 100 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_martial_law_max_2] -type = "Martial_Law_Max" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -[effect_martial_law_max_3] -type = "Martial_Law_Max" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - } - -[effect_rapture_grow_0] -type = "Rapture_Grow" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_rapture_grow_1] -type = "Rapture_Grow" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_communism_0] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - "UnitFlag", "Diplomat", "Local" - } - -[effect_gov_tile_bonus_0] -type = "Output_Penalty_Tile" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_gov_tile_bonus_1] -type = "Output_Penalty_Tile" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_gov_tile_bonus_2] -type = "Output_Inc_Tile_Celebrate" -value = 1 -reqs = - { "type", "name", "range" - "OutputType", "Trade", "Local" - "Gov", "Monarchy", "Player" - } - -[effect_gov_tile_bonus_3] -type = "Output_Inc_Tile_Celebrate" -value = 1 -reqs = - { "type", "name", "range" - "OutputType", "Trade", "Local" - "Gov", "Communism", "Player" - } - -[effect_gov_tile_bonus_4] -type = "Output_Inc_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - "OutputType", "Trade", "Local" - } - -[effect_gov_tile_bonus_5] -type = "Output_Inc_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_gov_tile_bonus_6] -type = "Output_Inc_Tile_Celebrate" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Trade", "Local" - } - -[effect_revolution_0] -type = "Revolution_Unhappiness" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_senate_0] -type = "Has_Senate" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_senate_1] -type = "Has_Senate" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_partisans_communism] -type = "Inspire_Partisans" -value = 1 -reqs = - { "type", "name", "range", "present" - "Gov", "Communism", "Player", TRUE - "Tech", "Communism", "Player", TRUE - "Tech", "Gunpowder", "Player", TRUE - "Tech", "Guerilla Warfare", "World", TRUE - "NationGroup", "Barbarian", "Player", FALSE - } - -[effect_partisans_democracy] -type = "Inspire_Partisans" -value = 1 -reqs = - { "type", "name", "range", "present" - "Gov", "Democracy", "Player", TRUE - "Tech", "Communism", "Player", TRUE - "Tech", "Gunpowder", "Player", TRUE - "Tech", "Guerilla Warfare", "World", TRUE - "NationGroup", "Barbarian", "Player", FALSE - } - -[effect_airport_v0] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Airport", "City", TRUE - "UnitClass", "Air", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_airport_v1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Airport", "City", TRUE - "UnitClass", "AirProtect", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_airport_v2] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Airport", "City", TRUE - "UnitClass", "AirPillage", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_airport_v3] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Airport", "City", TRUE - "UnitClass", "Helicopter", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_airport_v4] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Airport", "City", TRUE - "UnitClass", "Missile", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } - -[effect_airport_h1] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Airport", "City" - "UnitClass", "Air", "Local" - } -[effect_airport_h2] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Airport", "City" - "UnitClass", "AirProtect", "Local" - } -[effect_airport_h3] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Airport", "City" - "UnitClass", "AirPillage", "Local" - } -[effect_airport_h4] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Airport", "City" - "UnitClass", "Helicopter", "Local" - } -[effect_airport_2] -type = "Airlift" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Airport", "City" - } - -; Base max city size of 8 -[effect_aqueduct_size] -type = "Size_Adj" -value = 8 - -[effect_aqueduct] -type = "Size_Adj" -value = 4 -reqs = - { "type", "name", "range" - "Building", "Aqueduct", "City" - } - -[effect_aqueduct_health] -type = "Health_Pct" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Aqueduct", "City" - } - -[effect_bank] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - "Building", "Bank", "City" - "OutputType", "Gold", "Local" - } - -[effect_bank_1] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - "Building", "Bank", "City" - "OutputType", "Luxury", "Local" - } - -[effect_barracks] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "Land", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_a] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "Land", "Local", TRUE - } -[effect_barracks_b] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE ; might be resting in allied city with Barracks I - } -[effect_barracks_c] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - } - -[effect_barracks_ii] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "Land", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_ii_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_ii_2] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_ii_a] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "Land", "Local", TRUE - } -[effect_barracks_ii_b] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - } -[effect_barracks_ii_c] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - } - -[effect_barracks_iii] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "Land", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_iii_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_iii_2] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_iii_a] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Barracks III", "City" - "UnitClass", "Land", "Local" - } -[effect_barracks_iii_b] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - } -[effect_barracks_iii_c] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - } - -[effect_cathedral] -type = "Make_Content" -value = 3 -reqs = - { "type", "name", "range", "present" - "Building", "Cathedral", "City", TRUE - "Building", "Michelangelo's Chapel", "Player", FALSE - } - -[effect_cathedral_1] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range", "present" - "Tech", "Theology", "Player", TRUE - "Building", "Cathedral", "City", TRUE - "Building", "Michelangelo's Chapel", "Player", FALSE - } - -[effect_cathedral_2] -type = "Make_Content" -value = -1 -reqs = - { "type", "name", "range", "present" - "Tech", "Communism", "Player", TRUE - "Building", "Cathedral", "City", TRUE - "Building", "Michelangelo's Chapel", "Player", FALSE - } - -[effect_city_walls] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "UnitClass", "Land", "Local", TRUE - "Building", "Great Wall", "Player", FALSE - "UnitType", "Howitzer", "Local", FALSE - } - -[effect_city_walls_0] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "UnitClass", "Helicopter", "Local", TRUE - "Building", "Great Wall", "Player", FALSE - } -[effect_city_walls_0a] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - "Building", "Great Wall", "Player", FALSE - "UnitType", "Howitzer", "Local", FALSE - } -[effect_city_walls_0b] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - "Building", "Great Wall", "Player", FALSE - "UnitType", "Howitzer", "Local", FALSE - } - -[effect_city_walls_1] -type = "Unit_No_Lose_Pop" -value = 1 -reqs = - { "type", "name", "range" - "Building", "City Walls", "City" - } - -[effect_city_walls_visible] -type = "Visible_Walls" -value = 1 -reqs = - { "type", "name", "range" - "Building", "City Walls", "City" - } - -[effect_coastal_defense] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Coastal Defense", "City" - "UnitClass", "Sea", "Local" - } -[effect_coastal_defense_1] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Coastal Defense", "City" - "UnitClass", "RiverShip", "Local" - } -[effect_coastal_defense_2] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Coastal Defense", "City" - "UnitClass", "Submarine", "Local" - } -[effect_coastal_defense_trireme] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Coastal Defense", "City" - "UnitClass", "Trireme", "Local" - } - -[effect_gibraltar_fortress] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Gibraltar Fortress", "Player", TRUE - "Building", "Coastal Defense", "City", FALSE - "UnitClass", "Sea", "Local" - } -[effect_gibraltar_fortress_1] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Gibraltar Fortress", "Player", TRUE - "Building", "Coastal Defense", "City", FALSE - "UnitClass", "RiverShip", "Local" - } -[effect_gibraltar_fortress_2] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Gibraltar Fortress", "Player", TRUE - "Building", "Coastal Defense", "City", FALSE - "UnitClass", "Submarine", "Local" - } -[effect_gibraltar_fortress_trireme] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Gibraltar Fortress", "Player", TRUE - "Building", "Coastal Defense", "City", FALSE - "UnitClass", "Trireme", "Local" - } - -[effect_amphitheatre] -type = "Make_Content" -value = 3 -reqs = - { "type", "name", "range" - "Building", "Amphitheatre", "City" - } - -[effect_amphitheatre_1] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Tech", "Electricity", "Player" - "Building", "Amphitheatre", "City" - } - -; BECAUSE OF ROUNDING, AVERAGE EFFECT OF 50 ENDS UP BEING 41%, WHEREAS 60 YIELDS ABOUT 53% WHICH IS CLOSER TO ADVERTISED -[effect_courthouse] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "OutputType", "Trade", "Local", TRUE -; "Building", "Palace", "City", FALSE ; Courthouse is not advertised to be useless in cities with a Palace - } - -[effect_courthouse_1] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "OutputType", "shield", "local", TRUE -; "Building", "Palace", "City", FALSE ; Courthouse is not advertised to be useless in cities with a Palace - } - -[effect_courthouse_2] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - "Building", "Courthouse", "City" - } - -[effect_courthouse_3] -type = "Incite_Cost_Pct" -value = 300 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "MaxUnitsOnTile", "0", "Local", FALSE - } - -[effect_courthouse_upkeep] ; Law and order provides +1 upkeep -type = "Unit_Upkeep_Free_Per_City" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Courthouse", "City", TRUE - "OutputType", "Shield", "Local" - } - -[effect_courthouse_tile_corruption] ; Removes output penalties (Despotism/Anarchy) for cities with courthouses -type = "Output_Penalty_Tile" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Courthouse", "City", TRUE - } - -;Courthouse improves chances against hostile diplomats by 20% - These effects REQUIRE 3.0 -[effect_courthouse_spy_resistance] -type = "Spy_Resistant" -value = 20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - } - -;Courthouse improves chances against hostile diplomats by 20% - These effects REQUIRE 3.0 -[effect_courthouse_hostile_diplomat_1] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Sabotage City", "Local", TRUE - } - -[effect_courthouse_hostile_diplomat_2] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Sabotage City Escape", "Local", TRUE - } - -[effect_courthouse_hostile_diplomat_3] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Targeted Sabotage City", "Local", TRUE - } - -[effect_courthouse_hostile_diplomat_4] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Targeted Sabotage City Escape", "Local", TRUE - } - -[effect_courthouse_hostile_diplomat_5] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Steal Tech", "Local", TRUE - } - -[effect_courthouse_hostile_diplomat_7] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Steal Tech Escape Expected", "Local", TRUE - } - -[effect_courthouse_hostile_diplomat_8] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Targeted Steal Tech", "Local", TRUE - } - -[effect_courthouse_hostile_diplomat_9] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE - } - - -[effect_incite_cost_empty_courthouse] -type = "Incite_Cost_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - "Building", "Courthouse", "City", TRUE - } - -[effect_diplomat_defense_fortress] -type = "Spy_Resistant" -value = 25 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "Local" - } - -[effect_incite_cost_empty] -type = "Incite_Cost_Pct" -value = -50 -reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - "Building", "Courthouse", "City", FALSE - } - -[effect_factory] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Factory", "City" - "OutputType", "Shield", "Local" - } - -[effect_granary] -type = "Growth_Food" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Granary", "City" - } - -[effect_harbour] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "TerrainClass", "Oceanic", "Local" - "Building", "Harbour", "City" - "OutputType", "Food", "Local" - } - -[effect_hydro_plant] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Hydro Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_hydro_plant_1] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Hydro Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_hydro_plant_2] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Hydro Plant", "City", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_hydro_plant_3] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Hydro Plant", "City", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_library] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Library", "City" - "OutputType", "Science", "Local" - } - -[effect_marketplace] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - "OutputType", "Gold", "Local" - } - -[effect_marketplace_1] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - "OutputType", "Luxury", "Local" - } - -; No population pollution until certain techs researched -[effect_pollu_pop_base] -type = "Pollu_Pop_Pct_2" -value = -100 - -[effect_pollu_pop_automobile] -type = "Pollu_Pop_Pct_2" -value = 25 -reqs = - { "type", "name", "range" - "Tech", "Automobile", "Player" - } - -[effect_pollu_pop_industrialization] -type = "Pollu_Pop_Pct_2" -value = 25 -reqs = - { "type", "name", "range" - "Tech", "Industrialization", "Player" - } - -[effect_pollu_pop_mass_production] -type = "Pollu_Pop_Pct_2" -value = 25 -reqs = - { "type", "name", "range" - "Tech", "Mass Production", "Player" - } - -[effect_pollu_pop_plastics] -type = "Pollu_Pop_Pct_2" -value = 25 -reqs = - { "type", "name", "range" - "Tech", "Plastics", "Player" - } - -[effect_mass_transit] -type = "Pollu_Pop_Pct" -value = -100 -reqs = - { "type", "name", "range" - "Building", "Mass Transit", "City" - } -; Increased citizen mobility and ticket revenues increase city base trade by +2 -[effect_mass_transit_1] -type = "Output_Add_Tile" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Mass Transit", "City" - "CityTile", "Center", "Local" - "OutputType", "Trade", "Local" - } - -[effect_mfg_plant] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Mfg. Plant", "City" - "OutputType", "Shield", "Local" - } - -[effect_nuclear_plant] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Nuclear Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_nuclear_plant_1] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Nuclear Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_nuclear_plant_2] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Nuclear Plant", "City", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_nuclear_plant_3] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Nuclear Plant", "City", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_offshore_platform] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "TerrainClass", "Oceanic", "Local" - "Building", "Offshore Platform", "City" - "OutputType", "Shield", "Local" - } - -[effect_palace] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - "OutputType", "Trade", "Local" - } - -[effect_palace_1] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - "OutputType", "shield", "local" - } - -[effect_palace_2] -type = "Spy_Resistant" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - } - -[effect_palace_2_sabotage] -type = "Building_Saboteur_Resistant" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - } - -[effect_palace_3] -type = "Capital_City" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - } - -[effect_palace_gov_center] -type = "Gov_Center" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - } - -[effect_palace_5] -type = "Output_Bonus" -value = 75 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - "Building", "Palace", "City" - "OutputType", "Shield", "Local" - } - -[effect_palace_6] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - "Building", "Palace", "City" - "OutputType", "Shield", "Local" - } - -[effect_palace_7] -type = "Make_Happy" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - } - -[effect_ecclesiastical_palace] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "OutputType", "Trade", "Local", TRUE - "Building", "Palace", "City", FALSE - } - -[effect_ecclesiastical_palace_1] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "OutputType", "Shield", "local", TRUE - "Building", "Palace", "City", FALSE - } - -[effect_ecclesiastical_palace_2] -type = "Spy_Resistant" -value = 50 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "Building", "Palace", "City", FALSE - } - -[effect_ecclestiastical_palace_3] -type = "Make_Happy" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Ecclesiastical Palace", "City" - } - -[effect_ecclesiastical_palace_gov_center] -type = "Gov_Center" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "Building", "Palace", "City", FALSE - } - -[effect_ecclesiastical_palace_despotism] -type = "Output_Bonus" -value = 75 -reqs = - { "type", "name", "range", "present", "quiet" - "Gov", "Despotism", "Player", TRUE, TRUE - "Building", "Ecclesiastical Palace", "City", TRUE, FALSE - "OutputType", "Gold", "Local", TRUE, FALSE - "Building", "Palace", "City", FALSE, FALSE - } - -[effect_ecclesiastical_palace_monarchy] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range", "present", "quiet" - "Gov", "Monarchy", "Player", TRUE, TRUE - "Building", "Ecclesiastical Palace", "City", TRUE, FALSE - "OutputType", "Gold", "Local", TRUE, FALSE - "Building", "Palace", "City", FALSE, FALSE - } - -[effect_ecclesiastical_palace_culture] -type = "History" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "Building", "Palace", "City", FALSE - } -[effect_ecclesiastical_palace_2_sabotage] -type = "Building_Saboteur_Resistant" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Ecclesiastical Palace", "City" - } - - -[effect_police_station] -type = "Make_Content_Mil" -value = 2 -reqs = - { "type", "name", "range", "present" - "Gov", "Republic", "Player", TRUE - "Building", "Police Station", "City", TRUE - "Building", "Women's Suffrage", "Player", FALSE - } - -[effect_police_station_1] -type = "Make_Content_Mil" -value = 4 -reqs = - { "type", "name", "range", "present" - "Gov", "Democracy", "Player", TRUE - "Building", "Police Station", "City", TRUE - "Building", "Women's Suffrage", "Player", FALSE - } - -[effect_port_facility] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Port Facility", "City", TRUE - "UnitClass", "Sea", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_port_facility_a] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Port Facility", "City", TRUE - "UnitClass", "RiverShip", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_port_facility_b] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Port Facility", "City", TRUE - "UnitClass", "Submarine", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_port_facility_1] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Port Facility", "City" - "UnitClass", "Sea", "Local" - } -[effect_port_facility_1a] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Port Facility", "City" - "UnitClass", "RiverShip", "Local" - } -[effect_port_facility_1b] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Port Facility", "City" - "UnitClass", "Submarine", "Local" - } -[effect_port_facility_trireme] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Port Facility", "City", TRUE - "UnitClass", "Trireme", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_port_facility_trireme_1] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Port Facility", "City" - "UnitClass", "Trireme", "Local" - } - -[effect_power_plant] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Power Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Hydro Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_power_plant_1] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Power Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Hydro Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_recycling_center] -type = "Pollu_Prod_Pct" -value = -66 -reqs = - { "type", "name", "range", "present" - "Building", "Recycling Center", "City", TRUE -; A Solar Plant can give a stronger effect than a Recycling Center, in which -; case we want only the Solar Plant's effect (not the addition of the two). - "Building", "Solar Plant", "City", FALSE - } - -; Nasty special cases: where a Solar Plant is present but its effect is less -; than that of a Recycling Center, top up so that the net effect is that of the -; Recycling Center. -; (This would be so much easier if effects could be combined by functions -; other than addition...) - -; Factory and no Mfg. Plant: Solar Plant saves 50%, less than 66%; add 16% -[effect_recycling_center_1] -type = "Pollu_Prod_Pct" -value = -16 -reqs = - { "type", "name", "range", "present" - "Building", "Recycling Center", "City", TRUE - "Building", "Solar Plant", "City", TRUE - "Building", "Factory", "City", TRUE - "Building", "Mfg. Plant", "City", FALSE - } - -; Mfg. Plant and no Factory: Solar Plant saves 50%, less than 66%; add 16% -[effect_recycling_center_2] -type = "Pollu_Prod_Pct" -value = -16 -reqs = - { "type", "name", "range", "present" - "Building", "Recycling Center", "City", TRUE - "Building", "Solar Plant", "City", TRUE - "Building", "Mfg. Plant", "City", TRUE - "Building", "Factory", "City", FALSE - } - -; Neither Factory nor Mfg. Plant: Solar Plant saves 0%; add 66% -[effect_recycling_center_3] -type = "Pollu_Prod_Pct" -value = -66 -reqs = - { "type", "name", "range", "present" - "Building", "Recycling Center", "City", TRUE - "Building", "Solar Plant", "City", TRUE - "Building", "Factory", "City", FALSE - "Building", "Mfg. Plant", "City", FALSE - } - -; Raw materials generated from Recycling add +2 base shields to city production. -[effect_recycling_center_4] -type = "Output_Add_Tile" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Recycling Center", "City" - "CityTile", "Center", "Local" - "OutputType", "Shield", "Local" - } - - -[effect_research_lab] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Library", "City" - "Building", "Research Lab", "City" - "OutputType", "Science", "Local" - } - -[effect_research_lab_1] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "University", "City" - "Building", "Research Lab", "City" - "OutputType", "Science", "Local" - } - -[effect_sam_battery] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "SAM Battery", "City" - "UnitClass", "Air", "Local" - } -[effect_sam_battery_1] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "SAM Battery", "City" - "UnitClass", "AirProtect", "Local" - } - -[effect_sdi_defense] -type = "Nuke_Proof" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "SDI Defense", "City", TRUE - "DiplRel", "Foreign", "Local", TRUE - "DiplRel", "Team", "Local", FALSE - } - -[effect_sdi_defense_1] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "SDI Defense", "City" - "UnitClass", "Missile", "Local" - } - -[effect_sewer_system] -type = "Size_Unlimit" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Aqueduct", "City" - "Building", "Sewer System", "City" - } - -[effect_sewer_system_health] -type = "Health_Pct" -value = 30 -reqs = - { "type", "name", "range" - "Building", "Aqueduct", "City" - "Building", "Sewer System", "City" - } - -[effect_solar_plant] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range" - "Building", "Factory", "City" - "Building", "Solar Plant", "City" - "OutputType", "Shield", "Local" - } - -[effect_solar_plant_1] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range" - "Building", "Mfg. Plant", "City" - "Building", "Solar Plant", "City" - "OutputType", "Shield", "Local" - } - -[effect_solar_plant_2] -type = "Pollu_Prod_Pct" -value = -50 -reqs = - { "type", "name", "range" - "Building", "Factory", "City" - "Building", "Solar Plant", "City" - } - -[effect_solar_plant_3] -type = "Pollu_Prod_Pct" -value = -50 -reqs = - { "type", "name", "range" - "Building", "Mfg. Plant", "City" - "Building", "Solar Plant", "City" - } - -[effect_space_component] -type = "SS_Component" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Space Component", "City" - } - -[effect_space_module] -type = "SS_Module" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Space Module", "City" - } - -[effect_space_structural] -type = "SS_Structural" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Space Structural", "City" - } - -[effect_plastics_slowdown] -type = "Slow_Down_Timeline" -value = 1 -reqs = - { "type", "name", "range", "survives" - "Tech", "Plastics", "World", TRUE - } - -[effect_superconductor_slowdown] -type = "Slow_Down_Timeline" -value = 1 -reqs = - { "type", "name", "range", "survives" - "Tech", "Superconductors", "World", TRUE - } - -[effect_spaceflight_slowdown] -type = "Slow_Down_Timeline" -value = 1 -reqs = - { "type", "name", "range", "survives" - "Tech", "Space Flight", "World", TRUE - } - -[effect_stock_exchange] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Bank", "City" - "Building", "Stock Exchange", "City" - "OutputType", "Gold", "Local" - } - -[effect_stock_exchange_1] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Bank", "City" - "Building", "Stock Exchange", "City" - "OutputType", "Luxury", "Local" - } - -[effect_super_highways] -type = "Output_Per_Tile" -value = 50 -reqs = - { "type", "name", "range" - "Extra", "Road", "Local" - "Building", "Super Highways", "City" - "OutputType", "Trade", "Local" - } - -[effect_mine] -type = "Mining_Pct" -value = 100 -reqs = - { "type", "name", "range" - "Extra", "Mine", "Local" - } - -[effect_oil_well] -type = "Mining_Pct" -value = 100 -reqs = - { "type", "name", "range" - "Extra", "Oil Well", "Local" - } - -[effect_irrigation] -type = "Irrigation_Pct" -value = 100 -reqs = - { "type", "name", "range" - "Extra", "Irrigation", "Local" - } - -[effect_irrigation_center] -type = "Irrigation_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "CityTile", "Center", "Local", TRUE - "Extra", "Irrigation", "Local", FALSE - "TerrainAlter", "CanIrrigate", "Local", TRUE - "Extra", "Mine", "Local", FALSE - "Extra", "Oil Well", "Local", FALSE - } - -[effect_supermarket] -type = "Output_Per_Tile" -value = 100 -reqs = - { "type", "name", "range" - "Extra", "Farmland", "Local" - "Building", "Supermarket", "City" - "OutputType", "Food", "Local" - } - -[effect_supermarket_center] -type = "Output_Per_Tile" -value = 50 -reqs = - { "type", "name", "range", "present" - "CityTile", "Center", "Local", TRUE - "Extra", "Farmland", "Local", FALSE - "TerrainAlter", "CanIrrigate", "Local", TRUE - "Building", "Supermarket", "City", TRUE - "OutputType", "Food", "Local", TRUE - "Extra", "Mine", "Local", FALSE - "Extra", "Oil Well", "Local", FALSE - } - -[effect_temple] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - } - -[effect_temple_1] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Tech", "Mysticism", "Player" - "Building", "Temple", "City" - } - -[effect_university] -type = "Output_Bonus" -value = 150 -reqs = - { "type", "name", "range" - "Building", "Library", "City" - "Building", "University", "City" - "OutputType", "Science", "Local" - } - -[effect_apollo_program] -type = "Enable_Space" -value = 1 -reqs = - { "type", "name", "range", "survives" - "Building", "Apollo Program", "Player", TRUE - } - - -[effect_telegraph_border_vision] -type = "Border_Vision" -value = 1 -reqs = - { "type", "name", "range" - "Tech", "Electricity", "Player" - } - - ; Air+Sea+LandAirSea CLASS units REQUIRE PHYSICS so their BONUS is in their stats to AVOID more [effect_] entries. -[effect_physics_vision] -type = "Unit_Vision_Radius_Sq" -value = 4 -reqs = - { "type", "name", "range" - "Tech", "Physics", "Player" - "UnitClass", "Land", "Local" - } -[effect_physics_vision_1] -type = "Unit_Vision_Radius_Sq" -value = 4 -reqs = - { "type", "name", "range" - "Tech", "Physics", "Player" - "UnitClass", "LandNoKill", "Local" - } -[effect_physics_vision_2] -type = "Unit_Vision_Radius_Sq" -value = 4 -reqs = - { "type", "name", "range" - "Tech", "Physics", "Player" - "UnitClass", "Trireme", "Local" - } -[effect_physics_vision_3] -type = "Unit_Vision_Radius_Sq" -value = 4 -reqs = - { "type", "name", "range" - "Tech", "Physics", "Player" - "UnitClass", "RiverShip", "Local" - } - -[effect_satellite_vision] ;Vision benefit from satellite communication to land units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "Land", "Local" - } -[effect_satellite_vision_1] ;Vision benefit from satellite communication to land units (Marines) -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "LandAirSea", "Local" - } -[effect_satellite_vision_2] ;Vision benefit from satellite communication to sea units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "Sea", "Local" - } -[effect_satellite_vision_2a] ;Vision benefit from satellite communication to sea units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "Submarine", "Local" - } -[effect_satellite_vision_3] ;Vision benefit from satellite communication to sea units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "Air", "Local" - } -[effect_satellite_vision_3a] ;Vision benefit from satellite communication to sea units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "AirProtect", "Local" - } -[effect_satellite_vision_4] ;Vision benefit from satellite communication to cities -type = "City_Vision_Radius_Sq" -value = 36 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - } - -[effect_asmiths_trading_co] -type = "Upkeep_Free" -value = 1 -reqs = - { "type", "name", "range" - "Building", "A.Smith's Trading Co.", "Player" - } - -[effect_colossus] -type = "Output_Inc_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Colossus", "City" - "OutputType", "Trade", "Local" - } - -[effect_copernicus_observatory] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Copernicus' Observatory", "City" - "OutputType", "Science", "Local" - } - -[effect_cure_for_cancer] -type = "Make_Happy" -value = 2 - reqs = - { "type", "name", "range" - "Building", "Cure For Cancer", "World" - "Tech", "Genetic Engineering", "Player" - } - -; HACK: there's all kinds of nasty hard-coded stuff to this Wonder, so it had to be -; given a different name (Voyage of Darwin) to avoid potential messyness -[effect_darwins_voyage] -type = "Output_Inc_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Voyage of Darwin", "City" - "OutputType", "Trade", "Local" - } - -[effect_eiffel_tower] -type = "Unit_Upkeep_Free_Per_City" -value = 1 - reqs = - { "type", "name", "range" - "Building", "Eiffel Tower", "Player" - "OutputType", "Shield", "Local" - } - -[effect_supreme_court] -type = "Output_Waste_Pct" -value = 60 - reqs = - { "type", "name", "range" - "Building", "Supreme Court", "Player" - "OutputType", "Trade", "Local" - } - -;The following effects make Supreme Court count as Courthouse in every city, as advertised -[effect_supreme_court_1] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player" - "OutputType", "Shield", "local", TRUE - } - -[effect_supreme_court_2] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - "Building", "Supreme Court", "Player" - } - -[effect_supreme_court_3] -type = "Incite_Cost_Pct" -value = 300 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player" - "MaxUnitsOnTile", "0", "Local", FALSE - } - -[effect_supreme_court_upkeep] ; Law and order provides +1 upkeep -type = "Unit_Upkeep_Free_Per_City" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Supreme Court", "Player" - "OutputType", "Shield", "Local" - } - -[effect_supreme_court_tile_corruption] ; Removes output penalties (Despotism/Anarchy) for cities with courthouses -type = "Output_Penalty_Tile" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Supreme Court", "Player" - } - -;Courthouse improves chances against hostile diplomats by 20% - These effects REQUIRE 3.0 -[effect_supreme_court_spy_resistance] -type = "Spy_Resistant" -value = 20 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player", TRUE - } - -;Courthouse improves chances against hostile diplomats by 20% - These effects REQUIRE 3.0 -[effect_supreme_court_hostile_diplomat_1] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player" - "Action", "Sabotage City", "Local", TRUE - } - -[effect_supreme_court_hostile_diplomat_2] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player" - "Action", "Sabotage City Escape", "Local", TRUE - } - -[effect_supreme_court_hostile_diplomat_3] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player" - "Action", "Targeted Sabotage City", "Local", TRUE - } - -[effect_supreme_court_hostile_diplomat_4] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player" - "Action", "Targeted Sabotage City Escape", "Local", TRUE - } - -[effect_supreme_court_hostile_diplomat_5] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player" - "Action", "Steal Tech", "Local", TRUE - } - -[effect_supreme_court_hostile_diplomat_7] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player" - "Action", "Steal Tech Escape Expected", "Local", TRUE - } - -[effect_supreme_court_hostile_diplomat_8] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player" - "Action", "Targeted Steal Tech", "Local", TRUE - } - -[effect_supreme_court_hostile_diplomat_9] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player" - "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE - } - -[effect_great_wall] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "UnitClass", "Land", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "UnitType", "Howitzer", "Local", FALSE - } -[effect_great_wall_0] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range" - "Building", "Great Wall", "Player" - "UnitClass", "Helicopter", "Local" - "CityTile", "Center", "Local" - } -[effect_great_wall_0a] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "UnitType", "Howitzer", "Local", FALSE - } -[effect_great_wall_0b] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "UnitType", "Howitzer", "Local", FALSE - } - -[effect_great_wall_1] -type = "Unit_No_Lose_Pop" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Great Wall", "Player" - } - -[effect_great_wall_visible] -type = "Visible_Walls" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Great Wall", "Player" - } - -[effect_hanging_gardens] -type = "Make_Happy" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Hanging Gardens", "Player" - } - -[effect_hanging_gardens_1] -type = "Output_Add_Tile" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Hanging Gardens", "City" - "CityTile", "Center", "Local" - "OutputType", "Luxury", "Local" - } - -[effect_hoover_dam] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Hoover Dam", "Player", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Solar Plant", "City", FALSE - } - -[effect_hoover_dam_1] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Hoover Dam", "Player", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Solar Plant", "City", FALSE - } - -[effect_hoover_dam_2] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Hoover Dam", "Player", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_hoover_dam_3] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Hoover Dam", "Player", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_isaac_newtons_college] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "University", "City" - "Building", "Isaac Newton's College", "Player" - "OutputType", "Science", "Local" - } - -[effect_js_bachs_cathedral] -type = "Force_Content" -value = 2 -reqs = - { "type", "name", "range" - "Building", "J.S. Bach's Cathedral", "Player" - } - -[effect_king_richards_crusade] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "King Richard's Crusade", "City" - "OutputType", "Shield", "Local" - } - -[effect_leonardos_workshop] -type = "Upgrade_Unit" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Leonardo's Workshop", "Player" - } - -[effect_genghis_khans_equestrian_school] -type = "Move_Bonus" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Genghis Khan's Equestrian School", "Player", TRUE - "UnitFlag", "Horse", "Local", TRUE - } -[effect_genghis_khans_equestrian_school2] -type = "Move_Bonus" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Genghis Khan's Equestrian School", "Player", TRUE - "UnitType", "Explorer", "Local", TRUE - } - -[effect_lighthouse] -type = "Move_Bonus" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Sea", "Local" - } - -[effect_lighthouse_a] -type = "Move_Bonus" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Submarine", "Local" - } - -[effect_lighthouse_1] -type = "Move_Bonus" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Trireme", "Local" - } - -[effect_lighthouse_2] -type = "Move_Bonus" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "RiverShip", "Local" - } - -[effect_lighthouse_3] -type = "Unit_Vision_Radius_Sq" -value = 6 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Sea", "Local" - } - -[effect_lighthouse_3a] -type = "Unit_Vision_Radius_Sq" -value = 6 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Submarine", "Local" - } - -[effect_lighthouse_4] -type = "Unit_Vision_Radius_Sq" -svalue = 6 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Trireme", "Local" - } - -[effect_lighthouse_5] -type = "Unit_Vision_Radius_Sq" -svalue = 6 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "RiverShip", "Local" - } - -[effect_magellans_expedition] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Magellan's Expedition", "Player" - "UnitClass", "Sea", "Local" - } -[effect_magellans_expedition_a] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Magellan's Expedition", "Player" - "UnitClass", "RiverShip", "Local" - } -[effect_magellans_expedition_b] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Magellan's Expedition", "Player" - "UnitClass", "Submarine", "Local" - } -; Should be quite useless, just in case: -[effect_magellans_expedition_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Magellan's Expedition", "Player" - "UnitClass", "Trireme", "Local" - } - -[effect_manhattan_project] -type = "Enable_Nuke" -value = 1 -reqs = - { "type", "name", "range", "survives" - "Building", "Manhattan Project", "World", TRUE - } - -[effect_marco_polos_embassy] -type = "Output_Bonus" -value = 40 -reqs = - { "type", "name", "range" - "Building", "Marco Polo's Embassy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_michelangelos_chapel] -type = "Make_Content" -value = 3 -reqs = - { "type", "name", "range" - "Building", "Michelangelo's Chapel", "Player" - } - -[effect_michelangelos_chapel_1] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Tech", "Theology", "Player" - "Building", "Michelangelo's Chapel", "Player" - } - -[effect_michelangelos_chapel_2] -type = "Make_Content" -value = -1 -reqs = - { "type", "name", "range" - "Tech", "Communism", "Player" - "Building", "Michelangelo's Chapel", "Player" - } - -[effect_mausoleum_of_mausolos_1] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "Building", "Great Wall", "Player", FALSE - "Building", "Mausoleum of Mausolos", "Player", TRUE - } - -;Great Wall counts as City Walls in every city. -[effect_mausoleum_of_mausolos_1a] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Great Wall", "Player" - "Building", "Mausoleum of Mausolos", "Player" - } - -[effect_mausoleum_of_mausolos_2] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Building", "Supreme Court", "Player", FALSE - "Building", "Mausoleum of Mausolos", "Player", TRUE - } - -;Supreme Court counts as Courthouse in every city. -[effect_mausoleum_of_mausolos_2a] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Supreme Court", "Player" - "Building", "Mausoleum of Mausolos", "Player" - } - -[effect_mausoleum_of_mausolos_culture] -type = "History" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Mausoleum of Mausolos", "City" - } - -[effect_statue_of_zeus] -type = "Make_Content_Mil_Per" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Statue of Zeus", "Player" - } - -[effect_statue_of_zeus_1] -type = "Unit_Upkeep_Free_Per_City" -value = 4 -reqs = - { "type", "name", "range" - "Building", "Statue of Zeus", "City" - "OutputType", "Shield", "Local" - } - -[effect_statue_of_zeus_2] -type = "Make_Happy" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Statue of Zeus", "City" - } - -[effect_temple_of_artemis] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Luxury", "Local" - } - -[effect_temple_of_artemis_1] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Shield", "Local" - } - -;Patch -- we have to do another Output_Add_Tile to give the city its extra shield, if it was built on a +0 shield tile (grass/hills/jungle/swamp/tundra) -[effect_temple_of_artemis_1a] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Terrain", "Grassland", "Local" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Shield", "Local" - } -[effect_temple_of_artemis_1b] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Terrain", "Hills", "Local" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Shield", "Local" - } -[effect_temple_of_artemis_1c] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Terrain", "Jungle", "Local" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Shield", "Local" - } -[effect_temple_of_artemis_1d] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Terrain", "Swamp", "Local" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Shield", "Local" - } -[effect_temple_of_artemis_1e] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Terrain", "Tundra", "Local" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Shield", "Local" - } - -[effect_temple_of_artemis_2] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Gold", "Local" - } - -[effect_temple_of_artemis_3] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Science", "Local" - } - -[effect_oracle] -type = "Make_Content" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - "Building", "Oracle", "Player" - } - -[effect_pyramids] -type = "Growth_Food" -value = 25 -reqs = - { "type", "name", "range" - "Building", "Pyramids", "Player" - } - -[effect_pyramids_1] -type = "Rapture_Grow" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Pyramids", "City" - } - -[effect_internet] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Research Lab", "City" - "Building", "The Internet", "Player" - "OutputType", "Science", "Local" - } - -[effect_shakespeares_theatre] -type = "No_Unhappy" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Shakespeare's Theatre", "City" - } - -[effect_statue_of_liberty] -type = "Any_Government" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Statue of Liberty", "Player" - } - -[effect_statue_of_liberty_1] -type = "No_Anarchy" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Statue of Liberty", "Player" - } - -[effect_sun_tzus_war_academy] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Sun Tzu's War Academy", "Player", TRUE - "UnitClass", "Land", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_sun_tzus_war_academy_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Sun Tzu's War Academy", "Player", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - } -[effect_sun_tzus_war_academy_2] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Sun Tzu's War Academy", "Player", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - } - -[effect_united_nations] -type = "Has_Senate" -value = 1 -reqs = - { "type", "name", "range" - "Building", "United Nations", "World" - } - -[effect_united_nations_1] -type = "Revolution_Unhappiness" -value = 2 -reqs = - { "type", "name", "range", "present" - "Building", "United Nations", "World", TRUE -; Without !present UN would make revolution less likely instead -; of enabling it with Democracy (value 2 -> 4 instead of 0 -> 2) - "Gov", "Democracy", "Player", FALSE - } - -[effect_womens_suffrage] -type = "Make_Content_Mil" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - "Building", "Women's Suffrage", "Player" - } - -[effect_womens_suffrage_1] -type = "Make_Content_Mil" -value = 4 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - "Building", "Women's Suffrage", "Player" - } - -[effect_fanatics_fundamentalism] -type = "Fanatics" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_corruption_fundamentalism0] -type = "Output_Waste" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_fundamentalism1] -type = "Output_Waste_By_Distance" -value = 200 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Trade", "Local" - } - -[effect_waste_fundamentalism0] -type = "Output_Waste" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Shield", "Local" - } - -[effect_waste_fundamentalism1] -type = "Output_Waste_By_Distance" -value = 100 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Shield", "Local" - } - -[effect_fundamentalism_unit_upkeep] -type = "Upkeep_Factor" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Food", "Local" - } - -[effect_upkeep_free_units_fundamentalism] -type = "Unit_Upkeep_Free_Per_City" -value = 10 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Shield", "Local" - } - -[effect_bad_sci_fundamentalism] -type = "Output_Bonus_2" -value = -50 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "science", "local" - } - -[effect_tithes_fundamentalism] -type = "Happiness_To_Gold" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_max_rates_fundamentalism] -type = "Max_Rates" -value = 80 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_enviromentalism] -type = "Pollu_Prod_Pct" -value = -50 -reqs = - { "type", "name", "range" - "Tech", "Environmentalism", "Player" - } - -[effect_calendar_base] -type = "Turn_Years" -value = 50 - -; 50 - 25 = 25 -[effect_calendar_1] -type = "Turn_Years" -value = -25 -reqs = - { "type", "name", "range" - "MinYear", "-1000", "World" - } - -; 25 - 5 = 20 -[effect_calendar_2] -type = "Turn_Years" -value = -5 -reqs = - { "type", "name", "range" - "MinYear", "0", "World" - } - -; 20 - 10 = 10 -[effect_calendar_3] -type = "Turn_Years" -value = -10 -reqs = - { "type", "name", "range" - "MinYear", "1000", "World" - } - -; 10 - 5 = 5 -[effect_calendar_4] -type = "Turn_Years" -value = -5 -reqs = - { "type", "name", "range" - "MinYear", "1500", "World" - } - -; 5 - 3 = 2 -[effect_calendar_5] -type = "Turn_Years" -value = -3 -reqs = - { "type", "name", "range" - "MinYear", "1750", "World" - } - -; 2 - 1 = 1 -[effect_calendar_6] -type = "Turn_Years" -value = -1 -reqs = - { "type", "name", "range" - "MinYear", "1900", "World" - } - -[effect_tech_cost_base] -type = "Tech_Cost_Factor" -value = 1 - -; Cities can always work tiles -[effect_tile_workable] -type = "Tile_Workable" -value = 1 -reqs = - { "type", "name", "range", "present" - "Terrain", "Inaccessible", "Local", FALSE - } - -; each city has at least one slot to build units -[effect_city_build_slots_basic] -type = "City_Build_Slots" -value = 1 - -[effect_city_image_1] -type = "City_Image" -value = 1 -reqs = - { "type", "name", "range" - "MinSize", "4", "City" - } - -[effect_city_image_2] -type = "City_Image" -value = 1 -reqs = - { "type", "name", "range" - "MinSize", "8", "City" - } - -[effect_city_image_3] -type = "City_Image" -value = 1 -reqs = - { "type", "name", "range" - "MinSize", "12", "City" - } - -[effect_city_image_4] -type = "City_Image" -value = 1 -reqs = - { "type", "name", "range" - "MinSize", "16", "City" - } - -[effect_pollution] -type = "Output_Tile_Punish_Pct" -value = 50 -reqs = - { "type", "name", "range", "present" - "Extra", "Pollution", "Local", TRUE - "Extra", "Fallout", "Local", FALSE - } - -[effect_fallout] -type = "Output_Tile_Punish_Pct" -value = 50 -reqs = - { "type", "name", "range", "present" - "Extra", "Fallout", "Local", TRUE - "Extra", "Pollution", "Local", FALSE - } - -[effect_pollution_fallout] -type = "Output_Tile_Punish_Pct" -value = 75 -reqs = - { "type", "name", "range" - "Extra", "Fallout", "Local" - "Extra", "Pollution", "Local" - } - -[effect_incident_caught_steal_maps] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Maps Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_steal_maps] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Maps Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_half_chance_steal_maps] -type = "Action_Odds_Pct" -value = -30 ;80 minus 30 is 50% or half chance, but who knows if it's really 80-.3*8=56% -reqs = - { "type", "name", "range", "present" - "Action", "Steal Maps Escape", "Local", TRUE - } - -; FIXED flag from "Cities" to "NonMil" to have proper effect. -[effect_unit_bribe_cost_settlers] -type = "Unit_Bribe_Cost_Pct" -value = -50 -reqs = - { "type", "name", "range" - "UnitFlag", "NonMil", "Local" - } - -;LOSING MOVES FROM ILLEGAL ACTION NEVER MADE SENSE. JUST FORBID IT AND LET THEM PICK A LEGAL ACTION. -;[effect_illegal_action_move_cost_base] -;type = "Illegal_Action_Move_Cost" -;value = 0 -;reqs = -; { "type", "name", "range", "present" -; "Action", "Found City", "Local", FALSE -; "Action", "Join City", "Local", FALSE -; } - -[effect_incident_caught_steal_tech] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Tech", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_steal_tech] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Tech", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_caught_steal_tech_esc] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Tech Escape Expected", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_steal_tech_esc] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Tech Escape Expected", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_caught_tgt_steal_tech] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_tgt_steal_tech] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_bribe_unit] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Bribe Unit", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_sabotage_unit] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Sabotage Unit Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_incite] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Incite City", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_incite_esc] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Incite City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_poison] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Poison City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_sabotage_city] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Sabotage City", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_sabotage_city_esc] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Sabotage City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_tgt_sabotage_city] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Targeted Sabotage City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_tgt_sabotage_city_half_chance] -type = "Action_Odds_Pct" -value = -50 -reqs = - { "type", "name", "range", "present" - "Action", "Targeted Sabotage City Escape", "Local", TRUE - } - -[effect_incident_success_explode_nuke] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Explode Nuclear", "Local", TRUE - } - -; Double (+100%) buy cost for Great Wonders -[effect_great_wonder_buy_cost] -type = "Building_Buy_Cost_Pct" -value = 100 -reqs = - { "type", "name", "range" - "BuildingGenus", "GreatWonder", "Local" - } - -; Double buy cost for Small Wonders except Palaces -[effect_small_wonder_buy_cost] -type = "Building_Buy_Cost_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "BuildingGenus", "SmallWonder", "Local", TRUE - "Building", "Palace", "Local", FALSE - "Building", "Ecclesiastical Palace", "Local", FALSE - } - -; The Well-Digger can move 3 before you know Pottery or Alphabet. -[effect_welldigger_movement] -type = "Move_Bonus" -value = -3 -reqs = - { - "type", "name", "range", "present" - "UnitFlag", "Well-Digger", "Local", TRUE - "Tech", "Alphabet", "Player", TRUE - } -[effect_welldigger_movement_1] -type = "Move_Bonus" -value = -3 -reqs = - { - "type", "name", "range", "present" - "UnitFlag", "Well-Digger", "Local", TRUE - "Tech", "Pottery", "Player", TRUE - } diff --git a/freeciv/freeciv/data/.historic/mp2-May2019-historic/game.ruleset b/freeciv/freeciv/data/.historic/mp2-May2019-historic/game.ruleset deleted file mode 100644 index 333d69723..000000000 --- a/freeciv/freeciv/data/.historic/mp2-May2019-historic/game.ruleset +++ /dev/null @@ -1,1556 +0,0 @@ -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes, -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -; Note that the freeciv AI may not cope well with anything more -; than minor changes. - -[datafile] -description="Multiplayer-Evolution game rules for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -; This section contains meta information for freeciv-ruledit to recreate the ruleset -; file in a form wanted. These have no in-game effect whatsoever -[ruledit] - -; Which file to read description in from. -description_file = "mp2/README.mp2" - -[about] -; Ruleset name -; DO NOT CHANGE, FCW unfortunately has to hard-code certain special cases for this. -name = _("Multiplayer-Evolution ruleset") - -; There`s no separate versioning in rulesets part of main freeciv distribution -;version = "" - -; Summary of the ruleset -; /* TRANS: In the client, this is displayed alongside the contents of -; README.multiplayer, which are not localized. */ -summary = _("\ -You are playing Freeciv with rules designed for multiplayer gaming. \ -The biggest differences from the classic ruleset are that trade routes \ -are disabled, and that most wonders can be built once by each player. \ -A full description of the differences can be found in README.mp2.\ -Or search on the freeciv.wikia.com site.\ -") - -; Detailed description -; When updating this, update also desciption_file in [ruledit] section to match -description = *mp2/README.mp2* - -; What capabilities ruleset provides for the scenarios. -; mimimum-default-sets - Default units, terrains, buildings, etc -capabilities = "minimum-default-sets" - -[options] -global_init_techs="" -global_init_buildings="Palace" - -[civstyle] -; Value added to city pollution -base_pollution = -20 - -; Cost in luxuries of making one citizen happier -happy_cost = 2 - -; Cost in food of upkeeping a single citizen -food_cost = 2 - -; Parameters used to generalize the calculation of city granary size: -; if city_size <= num_inis: -; city_granary_size = (granary_food_ini[city_size] * foodbox / 100) -; if city_size > num_inis; -; city_granary_size = (granary_food_ini[num_inis] + -; granary_food_inc * (city_size - num_inis)) * foodbox / 100 -granary_food_ini = 20, 30, 40, 50, 60, 70 -granary_food_inc = 0 - -; City center minimum outputs -min_city_center_food = 1 -min_city_center_shield = 1 -min_city_center_trade = 0 - -; Square of initial city radius -init_city_radius_sq = 5 - -; Square of initially visible radius (true distance). -init_vis_radius_sq = 5 - -; A base bribe cost, modified heavily by other factors -base_bribe_cost = 750 - -; Barbarian leader ransom in gold -ransom_gold = 100 - -; Number of veteran levels lost when upgrading a unit -upgrade_veteran_loss = 0 - -; Number of veteran levels lost when auto-upgrading a unit -autoupgrade_veteran_loss = 0 - -; Whether player gets to select which terrain improvement to pillage. -pillage_select = TRUE - -; Whether one can steal a tech for which prereqs are not known -tech_steal_allow_holes = FALSE -; Whether one can get a tech for which prereqs are not known via -; diplomatic trading -tech_trade_allow_holes = TRUE -; ...and whether one can lose a tech which is prereq for another known -; tech via trade, if techlost_donor is nonzero -tech_trade_loss_allow_holes = TRUE -; Whether one can get a tech for which prereqs are not known via -; parasite effect (classic ruleset's Great Library) -tech_parasite_allow_holes = TRUE -; Whether one can lose a tech which is prereq for another known tech -; due to negative bulbs, if techlossforgiveness allows loss -tech_loss_allow_holes = TRUE - -; Whether civil war is possible at all -civil_war_enabled = TRUE - -; Comma separated list of things to happen, in addition to death -; of owner, when gameloss unit dies -; "CivilWar" - Part of the empire remains, controlled by a new player -; "Barbarians" - Depending on if there`s also "CivilWar", all or part -; or half of the dead players empire gets under barbarian -; control. -; "Loot" - Player who killed the gameloss unit gets loot: -; Partial map, gold, techs, cities -gameloss_style = "" - -; Whether units may safely paradrop to transport on non-native terrain -paradrop_to_transport = FALSE - -; Method of paying unit and improvement gold upkeep -; "City" - The player`s total gold must be non-negative after paying upkeep -; costs associated with each city. If for any city the player`s -; gold is negative, random buildings in the city are sold off. If -; the gold is still negative, then supported units with gold upkeep -; are disbanded. -; "Mixed" - In the first step, the player`s total gold must be non-negative -; after paying upkeep for all buildings within a city. If for any -; city the player`s gold is negative, random buildings in the city -; are sold off. -; In the second step, gold upkeep for all units is paid in a lump -; sum. If the player does not have enough gold, random units with -; gold upkeep are disbanded. -; "Nation" - Gold upkeep for all buildings and units is paid in a lump sum -; after all cities have been processed. If the player does not -; have enough gold, random buildings from random cities are sold. -; If still more gold is needed, then random units with gold -; upkeep are disbanded. -gold_upkeep_style = "City" - -[illness] -; Whether plagues (illness) are possible -; There are some latent building effects in effects.ruleset which affect -; health, if you enable plague here. -illness_on = FALSE - -; the base factor for illness (of percent) -illness_base_factor = 25 - -; minimum city size for illness -illness_min_size = 3 - -; factor for how much trading with a plagued city increases our city`s -; chance for plague (in percent) -illness_trade_infection = 0 - -; factor for how much pollution within a city increases its chance for -; plague (in percent) -illness_pollution_factor = 50 - -[incite_cost] -; city_incite_cost = total_factor * (city_size) * (base_incite_cost -; + (units_cost) * unit_factor -; + (improvements_cost) * improvement_factor) -; / ((distance to capital) * 100) -; See city_incite_cost() for more details -base_incite_cost = 10000 -improvement_factor = 1 -unit_factor = 2 -total_factor = 10000 - -[global_unit_options] -; Shore landing style -; FALSE - normal movement -; TRUE - (default) slow invasions by removing all -; movement points from ground units moving -; from ocean tile to land -slow_invasions = TRUE - -[combat_rules] -; If tired_attack is set to TRUE, units that attack with less than a single -; move point (per move_fragments in terrain.ruleset) will have their attack -; power reduced accordingly. For instance, if move_fragments=3, a unit with -; 2/3 move points will have attack power 2/3 of normal. -; If this is set to FALSE units will attack with full strength even if they -; have only fractional moves left. -tired_attack = TRUE - -[auto_attack] -; An auto attack may be triggered when another unit moves to an adjacent -; tile and the autoattack server setting is enabled. The following details -; are ruleset controlled. -; will_never - units with this unit type flag will never auto attack. - -; Not a good idea to nuke our own area. -will_never = "Nuclear" - -[actions] -; If force_trade_route is set to TRUE it is illegal for an actor unit to -; enter the marketplace of a city if it can establish a trade route to it -; in stead. -force_trade_route = FALSE - -; If force_capture_units is set to TRUE it is illegal for an actor unit to -; bombard, explode nuclear or perform a regular attack against a tile if -; it can capture units on it in stead. -force_capture_units = FALSE - -; If force_bombard is set to TRUE it is illegal for an actor unit to -; explode nuclear or perform a regular attack against a tile if it can -; bombard it in stead. -force_bombard = FALSE - -; If force_explode_nuclear is set to TRUE it is illegal for an actor unit -; to perform a regular attack against a tile if it can do explode nuclear -; in stead. -force_explode_nuclear = TRUE - -; If poison_empties_food_stock is set to TRUE a successful "Poison City" -; or "Poison City Escape" will empty the food stock. -poison_empties_food_stock = FALSE - -; The maximum distance from the actor unit to the target of the "Bombard" -; action. The value 1 means that the targets must be on a tile adjacent to -; the actor unit. The special value "unlimited" lifts the maximum distance -; restriction. The maximum distance can`t be smaller than the minimum -; distance. -bombard_max_range = 1 - -; What each action should be called when showing them to the player. -; The first %s should be before the mnemonic of the action. A Freeciv client -; that supports mnemonics will replace it with the in-band signal that marks -; the following character as a mnemonic in its graphical toolkit. -; The second %s marks where extra details should be inserted. - -; /* TRANS: _Poison City (3% chance of success). */ -ui_name_poison_city_escape = _("%sPoison City%s") - -; /* TRANS: _Sabotage Enemy Unit (3% chance of success). */ -ui_name_sabotage_unit_escape = _("%sSabotage Enemy Unit%s") - -; /* TRANS: _Bribe Enemy Unit (3% chance of success). */ -ui_name_bribe_unit = _("%sBribe Enemy Unit%s") - -; /* TRANS: _Sabotage City (3% chance of success). */ -ui_name_sabotage_city = _("%sSabotage City%s") - -; /* TRANS: _Sabotage City Escape (3% chance of success). */ -ui_name_sabotage_city_escape = _("%sSabotage City Escape%s") - -; /* TRANS: Industrial _Sabotage (3% chance of success). */ -ui_name_targeted_sabotage_city_escape = _("Industrial %sSabotage%s") - -; /* TRANS: Incite a _Revolt (3% chance of success). */ -ui_name_incite_city = _("Incite a %sRevolt%s") - -; /* TRANS: Incite a _Revolt and Escape (3% chance of success). */ -ui_name_incite_city_escape = _("Incite a Re%svolt and Escape%s") - -; /* TRANS: Establish _Embassy (100% chance of success). */ -ui_name_establish_embassy = _("Establish %sEmbassy%s") - -; /* TRANS: Becom_e Ambassador (100% chance of success). */ -ui_name_establish_embassy_stay = _("Becom%se Ambassador%s") - -; /* TRANS: Steal _Technology (3% chance of success). */ -ui_name_steal_tech = _("Steal %sTechnology%s") - -; /* TRANS: Steal _Technology and Escape (3% chance of success). */ -ui_name_steal_tech_escape = _("Steal %sTechnology and Escape%s") - -; /* TRANS: Indus_trial Espionage (3% chance of success). */ -ui_name_targeted_steal_tech_escape = _("Indus%strial Espionage%s") - -; /* TRANS: Steal _Map Fragments and Escape (3% chance of success). */ -ui_name_steal_maps_escape = _("Steal %sMap Fragments and Escape%s") - -; /* TRANS: Steal _Map Fragments (3% chance of success). */ -ui_name_steal_maps = _("Steal %sMap Fragments%s") - -; /* TRANS: _Investigate City (100% chance of success). */ -ui_name_investigate_city = _("%sInvestigate City%s") - -; /* TRANS: _Investigate City (spends the unit) (100% chance of success). */ -ui_name_investigate_city_spend_unit = _("%sInvestigate City (spends the unit)%s") - -; /* TRANS: Help _build Wonder (100% chance of success). */ -ui_name_help_wonder = _("Help %sbuild Wonder%s") - -; /* TRANS: Rec_ycle Unit (100% chance of success). */ -ui_name_recycle_unit = _("Rec%sycle Unit%s") - -; /* TRANS: _You're Fired (100% chance of success). */ -ui_name_disband_unit = _("%sYou're Fired%s") - -; /* TRANS: _Capture Units (100% chance of success). */ -ui_name_capture_units = _("%sCapture Units%s") - -; /* TRANS: _Build City (100% chance of success). */ -ui_name_found_city = _("%sBuild City%s") - -; /* TRANS: _Add to City (100% chance of success). */ -ui_name_join_city = _("%sAdd to City%s") - -; /* TRANS: Explode _Nuclear (100% chance of success). */ -ui_name_explode_nuclear = _("Explode %sNuclear%s") - -; /* TRANS: Destroy _City (100% chance of success). */ -;ui_name_destroy_city = _("Destroy %sCity%s") ;ready to be enabled if we think of how - -; /* TRANS: Set _Home City (100% chance of success). */ -ui_name_home_city = _("Set %sHome City%s") - -; /* TRANS: _Upgrade Unit (100% chance of success). */ -ui_name_upgrade_unit = _("%sUpgrade Unit%s") - -; /* TRANS: Drop _Paratrooper (100% chance of success). */ -ui_name_paradrop_unit = _("Drop %sParatrooper%s") - -; /* TRANS: _Airlift to City (100% chance of success). */ -ui_name_airlift_unit = _("%sAirlift to City%s") - -; /* TRANS: _Attack (100% chance of success). */ -ui_name_attack = _("%sAttack%s") - -;UPGRADE -; /* TRANS: _Explode Missile (100% chance of success). */ -;ui_name_suicide_attack = _("%sExplode Missile%s") - -; /* TRANS: _Conquer City (100% chance of success). */ -ui_name_conquer_city = _("%sConquer City%s") - -; /* TRANS: _Transform Terrain (3% chance of success). */ - ui_name_transform_terrain = _("%sTransform Terrain%s") - -; /* TRANS: Transform by _Irrigate (3% chance of success). */ - ui_name_irrigate_tf = _("Transform by %sIrrigate%s") - -; /* TRANS: Transform by _Mine (3% chance of success). */ - ui_name_mine_tf = _("Transform by %sMine%s") - -; /* TRANS: Pilla_ge (100% chance of success). */ - ui_name_pillage = _("Pilla%sge%s") - -; /* TRANS: _Fortify (100% chance of success). */ - ui_name_fortify = _("%sFortify%s") - -; /* TRANS: Build _Road (100% chance of success). */ - ui_name_road = _("Build %sRoad%s") - -; /* TRANS: Build _Canal (100% chance of success). */ - ui_name_canal = _("Build %Canal%s") - -; /* TRANS: _Build Base (100% chance of success). */ - ui_name_build_base = _("%sBuild Base%s") - -; /* TRANS: Build _Mine (100% chance of success). */ - ui_name_build_mine = _("Build %sMine%s") - -; /* TRANS: Build _Irrigation (100% chance of success). */ - ui_name_irrigate = _("Build %sIrrigation%s") - -; Suppress automatic help text generation about what enables and/or -; disables the following actions. -; -; Can make the help text less redundant when you document it your self. -;quiet_actions = "Targeted Sabotage City", "Targeted Steal Tech" - -; /* <-- avoid gettext warnings -; -; Action enablers: -; -; action = the action to enable. -; actor_reqs = requirements that apply to the actor. -; target_reqs = requirements that apply to the target. -; -; README.actions lists the possible actions and their hard coded -; requirements. -; -; An action enabler is active when its actor_reqs AND its target_reqs are -; satisfied. -; -; */ <-- avoid gettext warnings - -[actionenabler_sabotage_city] -action = "Sabotage City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Diplomat", "Local", TRUE - "DiplRel", "War", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "UnitFlag", "Spy", "Local", FALSE - } - -[actionenabler_sabotage_city_spy] -action = "Sabotage City Escape" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "Spy", "Local" - "DiplRel", "War", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - } - -[actionenabler_sabotage_city_target] -action = "Targeted Sabotage City Escape" -actor_reqs = - { "type", "name", "range" - "DiplRel", "War", "Local" - "UnitFlag", "Spy", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - } - -[actionenabler_establish_embassy] -action = "Establish Embassy Stay" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Diplomat", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "UnitFlag", "Spy", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - } - -[actionenabler_establish_embassy_spy] -action = "Establish Embassy" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "Spy", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - "DiplRel", "Foreign", "Local" - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - } - -[actionenabler_investigate_city] -action = "Investigate City Spend Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Diplomat", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "UnitFlag", "Spy", "Local", FALSE - } - -[actionenabler_investigate_city_spy] -action = "Investigate City" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "Spy", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - "DiplRel", "Foreign", "Local" - } - -[actionenabler_poison_city] -action = "Poison City Escape" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "Spy", "Local" - "DiplRel", "War", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - } -target_reqs = - { "type", "name", "range" - "MinSize", "2", "City" - } - -[actionenabler_steal_maps_escape] -action = "Steal Maps Escape" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "Spy", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - "DiplRel", "Foreign", "Local" - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - } -[actionenabler_steal_maps] -action = "Steal Maps" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "Diplomat", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - "DiplRel", "Foreign", "Local" - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - } - - -[actionenabler_steal_tech_random] -action = "Steal Tech" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Spy", "Local", FALSE - "UnitFlag", "Diplomat", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - } - -[actionenabler_steal_tech_random_esc] -action = "Steal Tech Escape Expected" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "Spy", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - "DiplRel", "Foreign", "Local" - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - } - -[actionenabler_steal_tech_target] -action = "Targeted Steal Tech Escape Expected" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "Spy", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - "DiplRel", "Foreign", "Local" - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - } - -[actionenabler_incite_city] -action = "Incite City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Diplomat", "Local", TRUE - "DiplRel", "Alliance", "Local", FALSE - "DiplRel", "Team", "Local", FALSE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "UnitFlag", "Spy", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "Gov", "Democracy", "Player", FALSE - "Building", "Palace", "City", FALSE - "Building", "Ecclesiastical Palace", "City", FALSE - "Building", "Mausoleum of Mausolos", "Player", FALSE - } - -[actionenabler_incite_city_spy] -action = "Incite City Escape" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Spy", "Local", TRUE - "DiplRel", "Alliance", "Local", FALSE - "DiplRel", "Team", "Local", FALSE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "Gov", "Democracy", "Player", FALSE - "Building", "Palace", "City", FALSE - "Building", "Ecclesiastical Palace", "City", FALSE - "Building", "Mausoleum of Mausolos", "Player", FALSE - } - -[actionenabler_bribe_unit] -action = "Bribe Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Diplomat", "Local", TRUE - "DiplRel", "Alliance", "Local", FALSE - "DiplRel", "Team", "Local", FALSE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Unbribable", "Local", FALSE - "CityTile", "Center", "Local", FALSE - "Gov", "Democracy", "Player", FALSE - "MaxUnitsOnTile", "1", "Local", TRUE - } - -[actionenabler_sabotage_unit] -action = "Sabotage Unit Escape" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "Spy", "Local" - "DiplRel", "War", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - } -target_reqs = - { "type", "name", "range", "present" - "CityTile", "Center", "Local", FALSE - "UnitClassFlag", "Unreachable", "Local", FALSE - "UnitClass", "Helicopter", "Local", FALSE - "MinHitPoints", "2", "Local", TRUE - "MaxUnitsOnTile", "1", "Local", TRUE - } - -[actionenabler_help_build_wonder] -action = "Help Wonder" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "HelpWonder", "Local", TRUE -; "DiplRel", "Foreign", "Local", FALSE - } -target_reqs = - { "type", "name", "range" - "BuildingGenus", "GreatWonder", "Local" - } - -[actionenabler_help_build_small_wonder] -action = "Help Wonder" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "HelpWonder", "Local", TRUE -; "DiplRel", "Foreign", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "BuildingGenus", "SmallWonder", "Local", TRUE -; "Building", "Palace", "Local", FALSE - } - -[actionenabler_recycle_unit] -action = "Recycle Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "EvacuateFirst", "Local", FALSE - "DiplRel", "War", "Local", FALSE - "DiplRel", "Cease-fire", "Local", FALSE - "DiplRel", "Armistice", "Local", FALSE - "DiplRel", "Peace", "Local", FALSE - } - -[actionenabler_disband_unit] -action = "Disband Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "EvacuateFirst", "Local", FALSE - } - -;CAPTURING LAND UNITS a "Capturer" must get a "Capturable" but not on a mountain. -[actionenabler_capture] -action = "Capture Units" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Capturer", "Local", TRUE -; "DiplRel", "War", "Local", TRUE ;NAH - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "DiplRel", "Alliance", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Capturable", "Local", TRUE - "CityTile", "Center", "Local", FALSE - "Terrain", "Mountains", "Local", FALSE - "MaxUnitsOnTile", "1", "Local", TRUE - } - -[actionenabler_bombard] -action = "Bombard" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Bombarder", "Local", TRUE - "UnitState", "Transported", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "War", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "TerrainClass", "Oceanic", "Local", FALSE - } - -[actionenabler_build_city_pioneer] -action = "Found City" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "Cities", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - } -target_reqs = - { "type", "name", "range", "present" - "CityTile", "Claimed", "Local", FALSE - } - -[actionenabler_build_city_domestic] -action = "Found City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Cities", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", FALSE - } - -[actionenabler_join_city] -action = "Join City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "AddToCity", "Local", TRUE - "DiplRel", "Foreign", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - } - -;Land expel: must be not on a mountain nor an air expeller/expellee -[actionenabler_border_police] -action = "Expel Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "BorderPolice", "Local", TRUE - "UnitClass", "Air", "Local", FALSE - "UnitFlag", "NonMil", "Local", FALSE ;Non-Military land class can't expel - "UnitType", "Warriors", "Local", FALSE ;Warriors are too weak to expel - "UnitState", "OnDomesticTile", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "DiplRel", "Team", "Local", FALSE - "DiplRel", "Alliance", "Local", FALSE -; "DiplRel", "War", "Local", FALSE ;NAH, you could expel anyone if you wanted. - "MinMoveFrags", "1", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Expellable", "Local", TRUE - "UnitClass", "Air", "Local", FALSE ;LAND UNITS CAN'T EXPEL AWACS - "UnitState", "OnDomesticTile", "Local", FALSE - "Terrain", "Mountains", "Local", FALSE ;Can't expel people hiding in the mountains - "MaxUnitsOnTile", "1", "Local", TRUE - } - -;Air expel: must be be air-to-air expelling from an aggressor air unit. -[actionenabler_air_border_police] -action = "Expel Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "BorderPolice", "Local", TRUE - "UnitFlag", "AirAttacker", "Local", TRUE ;some air class might not be expellers (AWACS) - "UnitFlag", "FieldUnit", "Local", FALSE ;bombers can't expel - "UnitState", "OnDomesticTile", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "DiplRel", "Team", "Local", FALSE - "DiplRel", "Alliance", "Local", FALSE -; "DiplRel", "War", "Local", FALSE ;NAH, you could expel anyone if you wanted. - "MinMoveFrags", "1", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Expellable", "Local", TRUE ;Has to be 1-expellable and 2-an air unit, in order for an air-expeller... - "UnitClass", "Air", "Local", TRUE ;...to be able to do border police action - "UnitState", "OnDomesticTile", "Local", FALSE - "MaxUnitsOnTile", "1", "Local", TRUE - } - -[actionenabler_nuke] -action = "Explode Nuclear" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Nuclear", "Local", TRUE - } - -;DESTROY CITY - original reqs are in sandbox rules -; The GameLoss unit requirement makes sending units on a suicide mission to -; capture and destroy cities deep inside enemy terrain national suicide. -; The risk of moving a GameLoss unit to the target city increases the cost -; of the action. Rationalization for the requirement: the physical presence -; of the Leader makes it easier to comply with the order to destroy the -; city. (See the "orders by phone" Milgram experiment variation) -; -; The domestic city requirement forces the player to invade a city before -; he can destroy it. If this limit is weakened by allowing the destruction -; of undefended (MaxUnitsOnTile) foreign cities during war it will lead to -; situations where a player can destroy a city but is unable to occupy it. -; Rationalization: the resistance must be crushed before the destruction. -; -; TODO: create an international incident (set the Casus_Belli_Success -; effect value to 1000) if "Destroy City" still is overpowered. -; -;[actionenabler_scorched_earth] -;action = "Destroy City" -;actor_reqs = -; { "type", "name", "range", "present" -; "UnitClass", "Land", "Local", TRUE -; "UnitFlag", "NonMil", "Local", FALSE -;;;; "DiplRel", "Foreign", "Local", FALSE -; "MinMoveFrags", "1", "Local", TRUE -; "UnitState", "OnLivableTile", "Local", TRUE -; } -;target_reqs = -; { "type", "name", "range", "present" -; "MaxUnitsonTile","0", "Local", TRUE -; } - -;UPGRADE -[actionenabler_attack_native] -action = "Attack" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE -; "UnitClassFlag","Missile", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - "UnitState", "OnNativeTile", "Local", TRUE - "DiplRel", "War", "Local", TRUE - } - -;UPGRADE -[actionenabler_attack_marines] -action = "Attack" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE -; "UnitClassFlag","Missile", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - "UnitFlag", "Marines", "Local", TRUE - "DiplRel", "War", "Local", TRUE - } - -;UPGRADE -[actionenabler_attack_att_from_non_native] -action = "Attack" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE -; "UnitClassFlag", "Missile", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - "UnitClassFlag", "AttFromNonNative", "Local", TRUE - "DiplRel", "War", "Local", TRUE - } - -;/* UPGRADE -;[actionenabler_explode_missile] -;action = "Suicide Attack" -;actor_reqs = -; { "type", "name", "range", "present" -; "UnitFlag", "NonMil", "Local", FALSE -; "UnitClassFlag", "Missile", "Local", TRUE -; "MinMoveFrags", "1", "Local", TRUE -; "DiplRel", "War", "Local", TRUE -; } -;*/ - -[actionenabler_conquer_city_native] -action = "Conquer City" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "CanOccupyCity", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "DiplRel", "War", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - } - -[actionenabler_conquer_city_marines] -action = "Conquer City" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "CanOccupyCity", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "DiplRel", "War", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "UnitFlag", "Marines", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - } - -[actionenabler_conquer_city_att_from_non_native] -action = "Conquer City" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "CanOccupyCity", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "DiplRel", "War", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "UnitClassFlag", "AttFromNonNative", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - } - -[actionenabler_change_home_city] -action = "Home City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "NoHome", "Local", FALSE - "UnitState", "HasHomeCity", "Local", TRUE -; REMOVE LINE BELOW TO ALLOW GIVING UNITS TO ALLIES THROUGH HOME CITY COMMAND - "DiplRel", "Foreign", "Local", FALSE - } - -[actionenabler_paradrop_base] -action = "Paradrop Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Paratroopers", "Local", TRUE - "UnitState", "Transporting", "Local", FALSE - "Extra", "Airbase", "Local", TRUE - } - -[actionenabler_paradrop_city] -action = "Paradrop Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Paratroopers", "Local", TRUE - "UnitState", "Transporting", "Local", FALSE - "CityTile", "Center", "Local", TRUE - } - -[actionenabler_upgrade_unit] -action = "Upgrade Unit" -actor_reqs = - { "type", "name", "range", "present" - "DiplRel", "Foreign", "Local", FALSE - } - -[actionenabler_airlift_unit] -action = "Airlift Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "Airliftable", "Local", TRUE - "UnitState", "Transporting", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - } - -[actionenabler_transform_terrain] -action = "Transform Terrain" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "Transform", "Local" - } - -[actionenabler_irrigate_tf] -action = "Irrigate TF" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Legion", "Local", FALSE - } - -[actionenabler_mine_tf] -action = "Mine TF" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Legion", "Local", FALSE - } - -[actionenabler_pillage] -action = "Pillage" -actor_reqs = - { "type", "name", "range" - "UnitClassFlag", "CanPillage", "Local" - } - -[actionenabler_fortify] -action = "Fortify" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "CanFortify", "Local", TRUE - "UnitFlag", "Cant_Fortify", "Local", FALSE - } - -[actionenabler_road] -action = "Road" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Legion", "Local", FALSE - } - -; Legions can make roads if not in domestic territory. -[actionenabler_legion_road] -action = "Road" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Legion", "Local", TRUE - "UnitState", "OnDomesticTile", "Local", FALSE - } - -[actionenabler_base] -action = "Build Base" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "CanFortress", "Local" - } - -[actionenabler_mining] -action = "Build Mine" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Legion", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "TerrainFlag", "Oil", "Local", FALSE - } - -[actionenabler_desert_oil] -action = "Build Mine" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Legion", "Local", FALSE - "Tech", "Construction", "Player", TRUE - } -target_reqs = - { "type", "name", "range" - "Terrain", "Desert", "Local" - } - -[actionenabler_glacier_oil] -action = "Build Mine" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Legion", "Local", FALSE - "Tech", "Refining", "Player", TRUE - } -target_reqs = - { "type", "name", "range" - "Terrain", "Glacier", "Local" - } - -[actionenabler_irrigate_src_ocean] -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitFlag", "Well-Digger", "Local", FALSE - "UnitType", "Legion", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "TerrainClass", "Oceanic", "CAdjacent", TRUE - } - -[actionenabler_irrigate_src_river] -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Legion", "Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "Extra", "River", "CAdjacent", TRUE - } - -[actionenabler_irrigate_src_irrigation] -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitFlag", "Well-Digger", "Local", FALSE - "UnitType", "Legion", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "Extra", "Irrigation", "CAdjacent", TRUE - } - -;Well-Digger can irrigate before Pottery and Alphabet. -[actionenabler_irrigate_welldigger] -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "Well-Digger", "Local" - } -target_reqs = - { "type", "name", "range", "present" - "TerrainFlag", "Low Land", "Local", TRUE - "Tech", "Pottery", "Player", FALSE - "Tech", "Alphabet", "Player", FALSE - } - -[borders] -; Base border radius from city. -radius_sq_city = 17 - -; Border radius square increased by this amount / point of city size -size_effect = 1 - -; Difference between city workable area and area permanently claimed by -; city (these tiles cannot be stolen by stronger border sources). -; 0 means exactly city workable area is immune to border stealing. -; Negative value means outer workable tiles can be stolen; highly negative -; value (more than max city radius_sq) means any workable tile can be stolen. -; If City_Radius_Sq is variable, so is the set of locked tiles; this is -; a squared value, so the radius of the ring of tiles which are workable -; but not locked (or vice versa) varies but the area is constant. -radius_sq_city_permanent = 0 - -[research] -; Method of calculating technology costs -; "Civ I|II" - Civ (I|II) style. Every new tech add base_tech_cost to -; cost of next tech. -; "Classic" - Cost of technology is: -; base_tech_cost * (1 + reqs) * sqrt(1 + reqs) / 2 -; where reqs == number of requirement for tech, counted -; recursively. -; "Classic+" - Cost are read from tech.ruleset. Missing costs are -; generated by style "Classic". -; "Experimental" - Cost of technology is: -; base_tech_cost * (reqs^2 / (1 + sqrt(sqrt(reqs + 1))) -; - 0.5) -; where reqs == number of requirement for tech, counted -; recursively. Initial techs` cost will be base_tech_cost. -; "Experimental+" - Cost are read from tech.ruleset. Missing costs are -; generated by style "Experimental". -; "Linear" - Cost of technology is: -; base_tech_cost * reqs -; where reqs == number of requirement for tech, counted -; recursively. -tech_cost_style = "Classic+" - -; Base research cost. Used in tech cost styles where tech cost is generated. -; In other words: used everywhere unless the cost of *all* techs are -; specified and the tech cost style is "Experimental+" or "Classic+". -base_tech_cost = 20 - -; Technology leak from other civilizations -; "None" - No reduction of the technology cost. -; "Embassies" - Technology cost is reduced depending on the number of -; players which already know the tech and you have an -; embassy with. -; "All Players" - Technology cost is reduced depending on the number of -; all players (human, AI and barbarians) which already -; know the tech. -; "Normal Players" - Technology cost is reduced depending on the number of -; normal players (human and AI) which already know the -; tech. -tech_leakage = "None" - -; Method of paying tech upkeep -; "None" - no upkeep -; "Basic" - upkeep is calculated as: -; / tech_upkeep_divider - tech_upkeep_free -; "Cities" - upkeep is calculated like "Basic", but multiplied by number of cities -tech_upkeep_style = "None" - -; upkeep cost is divided by this value -tech_upkeep_divider = 2000 - -; Method of selecting techs given for free -; "Goal" - Towards player`s goal, random if no goal -; "Random" - Random researchable tech -; "Cheapest" - Cheapest researchable tech, random among equal cost ones -free_tech_method = "Goal" - -[culture] -; Minimum culture points for cultural domination victory -victory_min_points = 1000 - -; How big lead relative to second best player is needed for victory -victory_lead_pct = 200 - -; How much each culture point affects the migration -; from/to the city. Each culture point count as this many permilles -; of a migration point. -migration_pml = 50 - -[calendar] -; Year in the beginning of the game -start_year = -4000 - -; Year 1 instead of 0. -skip_year_0 = TRUE - -; How many fragments each year has. In addition to this, "Turn_Fragments" effects are -; needed to control fragment accumulation. -; Value 0 here disables year advancement by fragment accumulation. -fragments = 0 - -; Calendar fragment names. If name is missing, only a fragment number +1 (so human readable -; numbers begin from 1 and not 0) is shown. - -;fragment_name0 = "Jan" -;fragment_name1 = "Feb" -; ... - -; What labels are used for positive and negative years. -; /* TRANS: year label (Anno Domini, Common Era) */ -positive_label = _("AD") -; /* TRANS: year label (BC was before Common Era became PC) */ -negative_label = _("BC") - -; /* <-- avoid gettext warnings -; -; Disaster types: -; -; name = translatable name as seen by user -; reqs = requirements for disaster to happen (see effects.ruleset -; and README.effects for help on requirements) -; frequency = how likely disaster is to occur -; effects -; - "DestroyBuilding" = Random building is destroyed -; - "ReducePopulation" = Reduce city size by one unless it's already 1 -; - "ReducePopDestroy" = Reduce city size by one, possibly destroying the city -; - "EmptyFoodStock" = Remove all food from food stock -; - "EmptyProdStock" = Destroy current production -; - "Pollution" = One tile surrounding city polluted -; - "Fallout" = One tile surrounding city polluted with fallout -; -; */ <-- avoid gettext warnings - -; No disasters in multiplayer ruleset - -; /* <-- avoid gettext warnings -; -; Achievement types: -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets -; etc; if not present, "name" is used for this -; purpose too. Since the name used in savegames must -; not change, if you want to rename an item after a -; ruleset has been released, you should set -; "rule_name" to the original value of "name". -; type = What event grants the achievement to player. -; See README.achievements for list of these types. -; unique = If TRUE, only first one reaching the achievement will -; get it. Defaults to TRUE. -; value = Value to reach. Exact meaning of this depends on -; achievement type. -; culture = Amount of culture granted to player who gets achievement -; granted. -; first_msg = Message shown to first player gaining the achievement -; cons_msg = Message shown to consecutive players gaining the achievement -; -; */ <-- avoid gettext warnings - -; No achievements in multiplayer ruleset - -; -; Trade settings -; -; IN = international, IC = intercontinental. -; For each of the trade route types: -; "pct" - Trade income %. If this is 0, trade route cannot be -; established at all -; "cancelling" - What to do to previously established traderoutes when they -; turn illegal -; "Active" - Keep them active (although they will only -; provide nonzero income if illegal due to -; trademindist rather than pct==0) -; "Inactive" - Keep them inactive -; "Cancel" - Cancel them altogether -; "bonus" - One-time bonuses granted when traderoute established -; "None" - No one-time bonus -; "Gold" - Bonus to gold -; "Science" - Bonus to research -; "Both" - Bonus to gold and research -; -[trade] -settings = - { "type", "pct", "cancelling", "bonus" - "National", 0, "Cancel", "Both" - "NationalIC", 0, "Cancel", "Both" - "IN", 0, "Cancel", "Both" - "INIC", 0, "Cancel", "Both" - "Ally", 0, "Cancel", "Both" - "AllyIC", 0, "Cancel", "Both" - "Enemy", 0, "Cancel", "Both" - "EnemyIC", 0, "Cancel", "Both" - "Team", 0, "Cancel", "Both" - "TeamIC", 0, "Cancel", "Both" - } - -; When are goods for the trade route chosen. -; "Leaving" - Goods to carry are assigned to unit when it`s built, or it changes homecity -; "Arrival" - Goods are chosen when trade route is established, when unit arrives to destination -goods_selection = "Arrival" - -; /* <-- avoid gettext warnings -; -; Goods types: -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets -; etc; if not present, "name" is used for this -; purpose too. Since the name used in savegames must -; not change, if you want to rename an item after a -; ruleset has been released, you should set -; "rule_name" to the original value of "name". -; reqs = requirements for a city to provide goods (see effects.ruleset -; and README.effects for help on requirements) -; from_pct = Income for the sending end of the trade route. Default is 100% -; This value is applied to both ends of bidirectional routes. -; to_pct = Income for the receiving end of the trade route. Default is 100% -; This value is not used at all in case of bidirectional routes. -; onetime_pct = Onetime bonuses when traderoute is established. Default is 100% -; flags -; - "Bidirectional" = Trade route carrying the goods does not have "from" and "to" -; ends, but both ends are considered the same. -; - "Depletes" = Trade route gets cancelled when the source city cannot provide -; goods any more. Bidirectional routes gets cancelled if either -; one of the involved cities cannot provide goods. -; helptext = Optional help text string; should escape all raw -; newlines so that xgettext parsing works -; -; */ <-- avoid gettext warnings - -[goods_good] -name = _("Goods") - - -; /* <-- avoid gettext warnings -; -; Clause types -; -; Clause types that are not listed here, are not enabled at all. -; -; type = Type of the clause, one of "Advance", "Gold", "Map", "Seamap", -; "City", "Ceasefire", "Peace", "Alliance", "Vision", "Embassy" -; -; */ <-- avoid gettext warnings - -[clause_advance] -type = "Advance" - -[clause_gold] -type = "Gold" - -[clause_map] -type = "Map" - -[clause_seamap] -type = "Seamap" - -[clause_city] -type = "City" - -[clause_ceasefire] -type = "Ceasefire" - -[clause_peace] -type = "Peace" - -[clause_alliance] -type = "Alliance" - -[clause_vision] -type = "Vision" - -[clause_embassy] -type = "Embassy" - - -[playercolors] -background.r = 86 -background.g = 86 -background.b = 86 - -; Player colors for 32 players are defined below. -; Avoid greens, blues, and white / very pale colors (too easy to confuse -; with terrain). -; Avoid dark colors. -colorlist = - { "r", "g", "b" - 255, 0, 0 ; Red - 255, 255, 0 ; Yellow - 0, 255, 255 ; Blue - 138, 43, 226 ; Purple - 255, 165, 0 ; Orange - 255, 0, 255 ; Magenta - 173, 216, 230 ; Cornflower - 0, 255, 127 ; Emerald - 250, 128, 114 ; Salmon - 124, 252, 0 ; Green - 139, 0, 0 ; Burgundy - 255, 192, 203 ; Pink - 211, 211, 211 ; Silver - 218, 112, 214 ; Heliotrope - 255, 20, 147 ; Fuchsia - 100, 149, 237 ; Azure - 255, 215, 0 ; Gold - 245, 222, 179 ; Khaki - 255, 255, 128 ; Butter - 192, 255, 128 ; Mint - 204, 255, 0 ; Lime - 255, 211, 140 ; Peach - 255, 79, 0 ; Vermilion - 240, 145, 169 ; Puce - 255, 219, 88 ; Mustard - 153, 17, 153 ; Aubergine - 184, 134, 11 ; Brown - 255, 102, 0 ; Pumpkin - 102, 205, 170 ; Turquoise - 195, 33, 72 ; Crimson - 168, 153, 230 ; Lavender - 255, 250, 205 ; Cream - } - -[teams] -; Team names correspond roughly to colors defined above, so that -; plrcolormode=TEAM_ORDER is not gratuitously confusing. -names = -; /* TRANS: Name of a color; used as unique identifier for a team */ -; /* TRANS: With this and other color team names, uniqueness is more */ -; /* TRANS: important than precise translation. To see the colors, start a */ -; /* TRANS: multiplayer game with 32 players and look at the Nations report. */ - _("?team name:Red"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Yellow"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Blue"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Purple"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Orange"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Magenta"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Cornflower"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Emerald"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Salmon"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Green"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Burgundy"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Pink"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Silver"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Heliotrope"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Fuchsia"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Azure"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Gold"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Khaki"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Butter"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Mint"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Lime"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Peach"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Vermilion"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Puce"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Mustard"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Aubergine"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Brown"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Pumpkin"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Turquoise"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Crimson"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Lavender"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Cream") - - -; RESTRICTINFRA ENABLED ONLY RESTRICTS ENEMY RAILS TO FUNCTION AS ROADS -[settings] -; TO DISABLE SPACERACE INCLUDE THESE LINES BELOW: -; "endspaceship", DISABLED, FALSE -; "victories", "ALLIED", FALSE - -set = - { "name", "value", "lock" - "mapsize", "PLAYER", FALSE - "tilesperplayer", 300, FALSE - "netwait", 20, FALSE - "nettimeout", 120, FALSE - "pingtime", 30, FALSE - "pingtimeout", 240, FALSE - "restrictinfra", "ENABLED", FALSE - "alltemperate", TRUE, FALSE - "aifill", 6, FALSE - "airliftingstyle", "FROM_ALLIES|TO_ALLIES", FALSE - "contactturns", 0, FALSE - "barbarians", "DISABLED", FALSE - "borders", "SEE_INSIDE", FALSE - "diplomacy", "HUMAN", FALSE - "dispersion", 2, FALSE - "endturn", 365, FALSE - "foggedborders", TRUE, FALSE - "generator", "RANDOM", FALSE - "gold", 100, FALSE - "huts", 0, FALSE - "landmass", 63, FALSE - "minplayers", 0, FALSE - "nationset", "all", FALSE - "nuclearwinter_percent", 20, FALSE - "revolen", 1, FALSE - "separatepoles", FALSE, FALSE - "specials", 350, FALSE - "startpos", "SINGLE", FALSE - "startunits", "cccwwwxxa", FALSE - "techpenalty", 0, FALSE - "tinyisles", FALSE, FALSE - "topology", "WRAPX", FALSE - "trading_city", "DISABLED", FALSE - "unreachableprotects", "ENABLED", FALSE - } diff --git a/freeciv/freeciv/data/.historic/mp2-May2019-historic/governments.ruleset b/freeciv/freeciv/data/.historic/mp2-May2019-historic/governments.ruleset deleted file mode 100644 index e44730365..000000000 --- a/freeciv/freeciv/data/.historic/mp2-May2019-historic/governments.ruleset +++ /dev/null @@ -1,238 +0,0 @@ - -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -; Note that the freeciv AI may not cope well with anything more -; than minor changes. - -[datafile] -description="Multiplayer governments data for Freeciv (as Civ2, minus fundamentalism)" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -[governments] -during_revolution="Anarchy" - -; /* <-- avoid gettext warnings -; -; Below: The individual government types, one per section. -; -; The actual tag used (the * in [government_*]) does not matter, except -; it must be unique within this file, and it may be used in debug -; output when reading this file. -; -; For the "official" rulesets, the order of these sections should not -; be changed because that would break backward compatability with -; savegames. (In particular, if Fundamentalism is added to default -; ruleset, should be added at end.) -; -; Notes on fields: -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; if -; not present, "name" is used for this purpose too. Since -; the name used in savegames must not change, if you want -; to rename an item after a ruleset has been released, you -; should set "rule_name" to the original value of "name". -; reqs = requirements for this government (see README.effects) -; graphic = tag specifing preferred graphic -; graphic_alt = alternate graphics tag if preferred is not found; -; should be a standard tag if preferred is not; -; otherwise may be "-" -; ai_better = AI will not consider this government for use if the -; government listed here is available -; ruler_titles = ruler titles by nation, "-" is default, and non-matched -; nations are ignored -; helptext = optional help text string; should escape all raw newlines -; so that xgettext parsing works -; -; */ <-- avoid gettext warnings - -;------------------------------------------------------------------------ -[government_anarchy] - -name = _("Anarchy") -; No reqs -graphic = "gov.anarchy" -graphic_alt = "-" - -ruler_male_title = _("Warlord %s") -ruler_female_title = _("Warlady %s") - -helptext = _("\ -Anarchy is simply the absence of any recognizable government.\ - Citizens are disorganized and unproductive, and will spend all\ - income as quickly as possible, rather than paying taxes or\ - conducting research.\ -"), _("\ -Anarchy offers slightly less corruption than Despotism,\ - but slightly more unhappiness.\ -") - -;------------------------------------------------------------------------ -[government_despotism] - -name = _("Despotism") -; No reqs -graphic = "gov.despotism" -graphic_alt = "-" -ai_better = "Monarchy" - -ruler_male_title = _("Chief %s") -ruler_female_title = _("?female:Chief %s") - -helptext = _("\ -Under Despotism, you are the absolute ruler of your people. Your\ - control over your citizens is maintained largely by martial law.\ -"), _("\ -Despotism suffers the highest level of corruption of all\ - forms of government.\ -") - -;------------------------------------------------------------------------ -[government_monarchy] - -name = _("Monarchy") -reqs = { "type", "name", "range" - "tech", "Monarchy", "Player" - } -graphic = "gov.monarchy" -graphic_alt = "-" -ai_better = "Communism" - -ruler_male_title = _("King %s") -ruler_female_title = _("Queen %s") - -helptext = _("\ -Under Monarchy, a king or queen serves as a hereditary figurehead\ - for your government.\ -"), _("\ -Monarchy suffers the same small amount of corruption that\ - the Republic does.\ -") - -;------------------------------------------------------------------------ -[government_communism] - -name = _("Communism") -reqs = { "type", "name", "range" - "tech", "Communism", "Player" - } -graphic = "gov.communism" -graphic_alt = "-" - -ruler_male_title = _("Comrade %s") -ruler_female_title = _("?female:Comrade %s") - -helptext = _("\ -A Communist government is based on the ideal that all people are\ - equal. All goods are owned by the state, rather than by private\ - citizens. Communism gives a balance between military and commercial\ - styles of government.\ -"), _("\ -Under Communism, corruption does not vary by distance from\ - the capital; all cities (including the capital) have a modest amount\ - of corruption.\ -") - -;------------------------------------------------------------------------ -[government_republic] - -name = _("Republic") -reqs = { "type", "name", "range" - "tech", "The Republic", "Player" - } -graphic = "gov.republic" -graphic_alt = "-" - -ruler_male_title = _("President %s") -ruler_female_title = _("?female:President %s") - -helptext = _("\ -Under a Republican government, citizens hold an election to select a\ - representative who will govern them; since elected leaders must\ - remain popular to remain in control, citizens are given a greater\ - degree of freedom. Citizens under the Republic become unhappy\ - easily, but the self-sufficiency of your citizens allows high levels\ - of trade.\ -") - -;------------------------------------------------------------------------ -[government_democracy] - -name = _("Democracy") -reqs = { "type", "name", "range" - "tech", "Democracy", "Player" - } -graphic = "gov.democracy" -graphic_alt = "-" - -ruler_male_title = _("Prime Minister %s") -ruler_female_title = _("?female:Prime Minister %s") - -helptext = _("\ -Under Democracy, citizens govern directly by voting on issues.\ - Democracy offers the highest possible level of trade, but also\ - offers the most potential for unhappiness. There is no corruption\ - during Democracy, but citizens become very upset during\ - wars.\ -") - -;------------------------------------------------------------------------ -[government_fundamentalism] - -name = _("Fundamentalism") -reqs = { "type", "name", "range" - "tech", "Fundamentalism", "Player" - } -graphic = "gov.fundamentalism" -graphic_alt = "-" - -ruler_male_title = _("High Priest %s") -ruler_female_title = _("High Priestess %s") - -helptext = _("\ -Fundamentalism is a form of government organized around a central\ - set of beliefs. The beliefs, usually religious in nature, form\ - a rigid guideline for actions and reactions of both the rulers\ - and the people.\ -"), _("\ -In a fundamentalist society, the people and the rulers are entirely\ - devoted to their beliefs, and are usually willing to die to\ - preserve them.\ -"), _("\ -Improvements that normally convert unhappy citizens to content\ - citizens, produce `tithes' (gold) equivalent to the number\ - of people they would convert, and require no maintenance.\ -") - -; /* <-- avoid gettext warnings -; -; Multipliers (aka policies) -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets -; etc; if not present, "name" is used for this -; purpose too. Since the name used in savegames must -; not change, if you want to rename an item after a -; ruleset has been released, you should set -; "rule_name" to the original value of "name". -; default = default value (as presented in UI) -; start = minimum value (as presented in UI) -; stop = maximum value (as presented in UI) -; step = minimum increase/decrease (as presented in UI) -; offset = offset/factor control how UI values are turned -; factor = into effect values for use in effects.ruleset. -; effect_value = (ui_value + offset) * (factor/100) -; Optional; by default offset=0, factor=100, so -; that UI values are used as-is. -; reqs = requirements for adjusting this policy (see README.effects) -; helptext = optional help text string; should escape all raw -; newlines so that xgettext parsing works -; -; */ <-- avoid gettext warnings diff --git a/freeciv/freeciv/data/.historic/mp2-May2019-historic/nations.ruleset b/freeciv/freeciv/data/.historic/mp2-May2019-historic/nations.ruleset deleted file mode 100644 index b59b60a46..000000000 --- a/freeciv/freeciv/data/.historic/mp2-May2019-historic/nations.ruleset +++ /dev/null @@ -1,62 +0,0 @@ - -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -[datafile] -description="Multiplayer nations data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -; This section contains meta information for freeciv-ruledit to recreate the ruleset -; file in a form wanted. These have no in-game effect whatsoever -[ruledit] - -; Nationlist to add include statement for. If this entry is omitted, all the nations -; will be saved to nations.ruleset itself. -nationlist = "default/nationlist.ruleset" - -; List of nations to embed to main nations.ruleset despite separate nationlist -; being used for other nations. -embedded_nations = "barbarian", "pirate" - -[compatibility] -; Initial government for all the nations that do not -; have it explicitly defined -default_government = "Despotism" - -[default_traits] -; Default values for the AI traits. These are used if nation specific -; value for some trait has not been used. If these default too are -; not defined, the ultimate default is 50. -; _min and _max give the range from which the trait value -; is randomly chosen for a given AI player unless 'traitdistribution' -; server setting is 'FIXED' -; _default is the exaxt trait value used when 'traitdistribution' -; is 'FIXED'. If _default has not been given, it's set to the -; midpoint between _min and _max. - -; Value of trait "expansionist" defines how much AI wants to settle new territory. -expansionist_min = 30 -expansionist_max = 90 -expansionist_default = 50 - -; Value of trait "trader" defines how much AI wants to establish trade routes. -trader_min = 30 -trader_max = 90 -trader_default = 50 - -; Value of trait "aggressive" defines how easily AI declares war. -aggressive_min = 30 -aggressive_max = 90 -aggressive_default = 50 - -; Please keep [ruledit] section in sync with these includes -*include "default/nationlist.ruleset" -; This ruleset uses model of two separate barbarian nations -*include "nation/barbarian.ruleset" -*include "nation/pirate.ruleset" diff --git a/freeciv/freeciv/data/.historic/mp2-May2019-historic/script.lua b/freeciv/freeciv/data/.historic/mp2-May2019-historic/script.lua deleted file mode 100644 index b77606f22..000000000 --- a/freeciv/freeciv/data/.historic/mp2-May2019-historic/script.lua +++ /dev/null @@ -1,145 +0,0 @@ --- Freeciv - Copyright (C) 2007 - The Freeciv Project --- This program is free software; you can redistribute it and/or modify --- it under the terms of the GNU General Public License as published by --- the Free Software Foundation; either version 2, or (at your option) --- any later version. --- --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU General Public License for more details. - --- This file is for lua-functionality that is specific to a given --- ruleset. When freeciv loads a ruleset, it also loads script --- file called 'default.lua'. The one loaded if your ruleset --- does not provide an override is default/default.lua. - - --- This flags whether philosophy awards a bonus advance, and gets set to off (0) after T85. -philosophy_possible = 1 - ---Give players custom messages on certain years. Currently at 400BC (T85), Philosophy expires. Let them know. -function history_turn_notifications(turn, year) - if turn > 78 and turn < 85 then - notify.all("Philosophy will no longer award a bonus tech after turn 85.") - end - - if turn == 85 then - -- Philosophy no longer gives advances after 400BC - notify.all("Philosophers around the world mourn the execution of Socrates. Philosophy no longer gives a bonus advance.") - philosophy_possible = 0 - end - - return false -end -signal.connect("turn_begin", "history_turn_notifications") -- *************** turn_started deprecated in 3.1, renamed turn_begin - --- Place Ruins at the location of the destroyed city. -function city_destroyed_callback(city, loser, destroyer) - city.tile:create_extra("Ruins", NIL) - -- continue processing - return false -end - -signal.connect("city_destroyed", "city_destroyed_callback") - - --- Hack: record which players already got Philosophy, to avoid --- teams getting it multiple times with team_pooled_research. --- Stored as a string as this is a type simple enough to be included --- in savefiles. --- (It`s probably not necessary to test for existence as savefile --- data is loaded after this script is executed.) -if philo_players == nil then - philo_players = "" -end - --- Record that a player got Philosophy in our hacky string. -function record_philo(player) - local pos = player.id + 1 - philo_players = string.sub(philo_players, 1, pos-1) .. - string.rep(" ", math.max(0, pos - 1 - #philo_players)) .. - "." .. string.sub(philo_players, pos+1) -end - --- Grant one tech when the tech Philosophy is researched. -function tech_researched_handler(tech, player, how) - local id - local gained - - if tech == nil then - -- no tech was researched. - return - end - - id = tech.id - if id == find.tech_type("Philosophy").id and how == "researched" then - - -- Check potential teammates. - for p in players_iterate() do - if player:shares_research(p) - and string.sub(philo_players, p.id+1, p.id+1) == "." then - -- Another player in the same team already got Philosophy. - record_philo(player) - return - end - end - - record_philo(player) - - - -- Philosophy does not give a bonus tech under certain conditions. Check for those conditions ------------------- - if philosophy_possible == 0 then - -- No Philosophy advance after turn 85 (400 BCE) - return - end - - -- Philosophy can't give advances that come after Industrialization, Electricity, and Conscription -------------- - -- Even knowing any of these techs makes an advance impossible ! - - local researcher = player - local forbidden_tech = find.tech_type("Industrialization") - - if researcher:knows_tech(forbidden_tech) then - return - end - - forbidden_tech = find.tech_type("Electricity") - - if researcher:knows_tech(forbidden_tech) then - return - end - - forbidden_tech = find.tech_type("Conscription") - - if researcher:knows_tech(forbidden_tech) then - return - end - - -- Give the player a free advance. - -- This will give a free advance for each player that shares research. - gained = player:give_tech(nil, -1, false, "researched") - - -- Notify the player. Include the tech names in a way that makes it - -- look natural no matter if each tech is announced or not. - notify.event(player, NIL, E.TECH_GAIN, - _("Great philosophers from all the world join your civilization: you get the immediate advance %s."), - gained:name_translation()) - - -- Notify research partners - notify.research(player, false, E.TECH_GAIN, - _("Great philosophers from all the world join the %s: you get the immediate advance %s."), - player.nation:plural_translation(), - gained:name_translation()) - - -- default.lua informs the embassies when the tech source is a hut. - -- They should therefore be informed about the source here too. - notify.research_embassies(player, E.TECH_EMBASSY, - -- /* TRANS: first %s is leader or team name */ - _("Great philosophers from all the world join %s: they get %s as an immediate advance."), - player:research_name_translation(), - gained:name_translation()) - end -end - -signal.connect("tech_researched", "tech_researched_handler") diff --git a/freeciv/freeciv/data/.historic/mp2-May2019-historic/techs.ruleset b/freeciv/freeciv/data/.historic/mp2-May2019-historic/techs.ruleset deleted file mode 100644 index 8b5e26265..000000000 --- a/freeciv/freeciv/data/.historic/mp2-May2019-historic/techs.ruleset +++ /dev/null @@ -1,945 +0,0 @@ - -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes, -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -[datafile] -description="Multiplayer-Evolution technology data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -[control] -; Names for custom tech flags. There can be up to 8 of these. -; name = rule name; In some circumstances user may see this -; as part of some sentences, so try to make it descriptive -; and sensible. -; helptxt = displayed in the help for advances with this flag (optional) -;flags = -; { "name", "helptxt" -; } - -; /* <-- avoid gettext warnings -; -; Tech classes: -; -; First one is the default one. -; If there is none, tech classes feature is disabled -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets -; etc; if not present, "name" is used for this -; purpose too. Since the name used in savegames must -; not change, if you want to rename an item after a -; ruleset has been released, you should set -; "rule_name" to the original value of "name". -; cost_pct = how much techs of the class cost compared -; to normal. Default is 100%. -; -; */ <-- avoid gettext warnings - -;[techclass_default] -;name = - -; /* <-- avoid gettext warnings -; -; Below: The individual advances, one per section. -; The number can be variable, up to 250. -; -; The actual tag used (the * in [advance_*]) does not matter, except -; it must be unique within this file, and it may be used in debug -; output when reading this file. -; -; Notes: -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; if -; not present, "name" is used for this purpose too. Since -; the name used in savegames must not change, if you want -; to rename an item after a ruleset has been released, you -; should set "rule_name" to the original value of "name". -; class = tech class this tech belongs to, if they have been defined. -; Default is first one defined above. -; req1, req2 = advances required before researching this one -; root_req = tech required before acquiring this tech, by any means. -; All techs with any direct or indirect dependency on this -; one will *also* have this root_req, as well as their own -; and any others they inherit. -; Giving "None" explicitly here prevents a tech from -; inheriting root_reqs in this way, and stops root_req -; inheritance through that tech. -; Specifying a tech's root_req as itself means that the tech -; can only be acquired by special means (nation's init_techs, -; scripting, etc). -; research_reqs = requirements before researching this one. Can have non -; tech requirements because it is a requirement vector. -; See doc/README.effects to learn more about requirement -; vectors. -; Requireing a tech here in stead of in req1, req2 or -; root_req is not supported yet. -; Requirements that may become fulfilled during the game -; when they weren't at the start of the game is not -; supported yet. -; flags = special flag strings -; graphic = icon for technology -; graphic_alt = alternate icon -; helptext = optional help text string (set units ruleset for examples) -; bonus_message = text seen when a player is the first to discover -; an bonus tech. Must contain '%s' to mark place of the tech -; gained. -; cost = if tech_cost_style is set to "Classic+" or "Experimental+", -; this field is read for information on how much a tech -; costs. -; -; Special values for req1 and req2 are "None" (first section below) -; and "Never" (never available). If only one tech is required, -; it should be listed as req1. -; -; As well as custom flags defined above, the following flag strings are -; possible: -; -; "Bonus_Tech" = player gets extra tech if reached first -; "Bridge" = "Settler" unit types can build roads with -; "RequiresBridge" flag over roads with -; "PreventsOtherRoads" flag (rivers) -; "Build_Airborne" = from now on can build air units (for use by AI) -; "Claim_Ocean" = Player claims ocean tiles even if they are not -; adjacent to border source -; "Claim_Ocean_Limited" = Oceanic border sources claim ocean tiles even if -; they are not adjacent to border source -; -; */ <-- avoid gettext warnings - -[advance_advanced_flight] -name = _("Advanced Flight") -req1 = "Radio" -req2 = "Machine Tools" -flags = "" -graphic = "a.advanced_flight" -graphic_alt = "-" -cost = 6630 - -[advance_alphabet] -name = _("Alphabet") -req1 = "None" -req2 = "None" -flags = "" -graphic = "a.alphabet" -graphic_alt = "-" -cost = 24 - -[advance_amphibious_warfare] -name = _("Amphibious Warfare") -req1 = "Navigation" -req2 = "Tactics" -flags = "" -graphic = "a.amphibious_warfare" -graphic_alt = "-" -cost = 3280 - -[advance_astronomy] -name = _("Astronomy") -req1 = "Mysticism" -req2 = "Mathematics" -flags = "" -graphic = "a.astronomy" -graphic_alt = "-" -cost = 146 - -[advance_atomic_theory] -name = _("Atomic Theory") -req1 = "Theory of Gravity" -req2 = "Physics" -flags = "" -graphic = "a.atomic_theory" -graphic_alt = "-" -cost = 1080 - -[advance_automobile] -name = _("Automobile") -req1 = "Combustion" -req2 = "Steel" -graphic = "a.automobile" -graphic_alt = "-" -helptext = _("Obsoletes Leonardo's Workshop, Colossus. Increases population pollution 25%.") -cost = 4230 - -[advance_banking] -name = _("Banking") -req1 = "Trade" -req2 = "The Republic" -flags = "" -graphic = "a.banking" -graphic_alt = "-" - -[advance_bridge_building] -name = _("Bridge Building") -req1 = "Iron Working" -req2 = "Construction" -flags = "Bridge" -graphic = "a.bridge_building" -graphic_alt = "-" -helptext = _("Allows roads to be built on river tiles.") - -[advance_bronze_working] -name = _("Bronze Working") -req1 = "None" -req2 = "None" -flags = "" -graphic = "a.bronze_working" -graphic_alt = "-" -cost = 24 - -[advance_ceremonial_burial] -name = _("Ceremonial Burial") -req1 = "None" -req2 = "None" -flags = "" -graphic = "a.ceremonial_burial" -graphic_alt = "-" -cost = 24 - -[advance_chemistry] -name = _("Chemistry") -req1 = "University" -req2 = "Medicine" -flags = "" -graphic = "a.chemistry" -graphic_alt = "-" -cost = 800 - -[advance_chivalry] -name = _("Chivalry") -req1 = "Feudalism" -req2 = "Horseback Riding" -flags = "" -graphic = "a.chivalry" -graphic_alt = "-" -helptext = _("Obsoletes Horsemen and Chariots.") -cost = 226 - -[advance_code_of_laws] -name = _("Code of Laws") -req1 = "Alphabet" -req2 = "None" -flags = "" -graphic = "a.code_of_laws" -graphic_alt = "-" - -[advance_combined_arms] -name = _("Combined Arms") -req1 = "Mobile Warfare" -req2 = "Advanced Flight" -flags = "" -graphic = "a.combined_arms" -graphic_alt = "-" -cost = 6970 - -[advance_combustion] -name = _("Combustion") -req1 = "Refining" -req2 = "Explosives" -flags = "" -graphic = "a.combustion" -graphic_alt = "-" -cost = 3810 - -[advance_communism] -name = _("Communism") -req1 = "Philosophy" -req2 = "Industrialization" -flags = "" -graphic = "a.communism" -graphic_alt = "-" -helptext = _("Reduces the effect of Cathedrals & Michelangelo's Chapel.") - -[advance_computers] -name = _("Computers") -req1 = "Mass Production" -req2 = "Miniaturization" -flags = "" -graphic = "a.computers" -graphic_alt = "-" -helptext = _("Obsoletes Temple of Artemis.") -cost = 5650 - -[advance_conscription] -name = _("Conscription") -req1 = "Democracy" -req2 = "Metallurgy" -flags = "" -graphic = "a.conscription" -graphic_alt = "-" -helptext = _("Obsoletes Musketeers.") -cost = 1890 - -[advance_construction] -name = _("Construction") -req1 = "Masonry" -req2 = "Currency" -flags = "" -graphic = "a.construction" -graphic_alt = "-" -helptext = _("\ -Allows Settlers, Workers and Engineers to build fortresses, and \ -build Oil Wells on Desert tiles.") - -[advance_currency] -name = _("Currency") -req1 = "Bronze Working" -req2 = "None" -flags = "" -graphic = "a.currency" -graphic_alt = "-" - -[advance_democracy] -name = _("Democracy") -req1 = "Banking" -req2 = "Invention" -flags = "" -graphic = "a.democracy" -graphic_alt = "-" -cost = 875 - -[advance_economics] -name = _("Economics") -req1 = "Banking" -req2 = "University" -flags = "" -graphic = "a.economics" -graphic_alt = "-" -cost = 875 - -[advance_electricity] -name = _("Electricity") -req1 = "Metallurgy" -req2 = "Magnetism" -flags = "" -graphic = "a.electricity" -graphic_alt = "-" -helptext = _("Adds +1 to the effect of Amphitheaters. Obsoletes Ironclad.") -cost = 2220 - -[advance_electronics] -name = _("Electronics") -req1 = "The Corporation" -req2 = "Electricity" -flags = "" -graphic = "a.electronics" -graphic_alt = "-" -cost = 3630 - -[advance_engineering] -name = _("Engineering") -req1 = "The Wheel" -req2 = "Construction" -flags = "" -graphic = "a.engineering" -graphic_alt = "-" -helptext = _("\ -Allows Settlers, Workers and Engineers to dig canals.") - -[advance_environmentalism] -name = _("Environmentalism") -req1 = "Recycling" -req2 = "Space Flight" -flags = "" -graphic = "a.environmentalism" -graphic_alt = "-" -helptext = _("Having this advance decreases pollution\ - in all your cities by 50%.") -cost = 8040 - -[advance_espionage] -name = _("Espionage") -req1 = "Communism" -req2 = "Democracy" -flags = "" -graphic = "a.espionage" -graphic_alt = "-" -helptext = _("Obsoletes Diplomat.") -cost = 2900 - -[advance_explosives] -name = _("Explosives") -req1 = "Gunpowder" -req2 = "Chemistry" -flags = "" -graphic = "a.explosives" -graphic_alt = "-" -helptext = _("Obsoletes Workers.") -cost = 1560 - -[advance_feudalism] -name = _("Feudalism") -req1 = "Warrior Code" -req2 = "Monarchy" -flags = "" -graphic = "a.feudalism" -graphic_alt = "-" -cost = 146 - -[advance_flight] -name = _("Flight") -req1 = "Combustion" -req2 = "Theory of Gravity" -flags = "Build_Airborne" -graphic = "a.flight" -graphic_alt = "-" -cost = 4680 - -[advance_fundamentalism] -name = _("Fundamentalism") -req1 = "Theology" -req2 = "Conscription" -flags = "" -graphic = "a.fundamentalism" -graphic_alt = "-" - -[advance_fusion_power] -name = _("Fusion Power") -req1 = "Nuclear Power" -req2 = "Superconductors" -flags = "" -graphic = "a.fusion_power" -graphic_alt = "-" -cost = 6120 - -[advance_genetic_engineering] -name = _("Genetic Engineering") -req1 = "Medicine" -req2 = "The Corporation" -flags = "" -graphic = "a.genetic_engineering" -graphic_alt = "-" -cost = 3150 - -[advance_guerilla_warfare] -name = _("Guerilla Warfare") -req1 = "Communism" -req2 = "Tactics" -flags = "" -graphic = "a.guerilla_warfare" -graphic_alt = "-" -helptext = _("Obsoletes Explorer.") -cost = 3985 - -[advance_gunpowder] -name = _("Gunpowder") -req1 = "Invention" -req2 = "Iron Working" -flags = "" -graphic = "a.gunpowder" -graphic_alt = "-" -cost = 800 -helptext = _("Obsoletes Barracks, Warriors, Phalanx, Legion, Archers, Pikemen.") - -[advance_horseback_riding] -name = _("Horseback Riding") -req1 = "None" -req2 = "None" -flags = "" -graphic = "a.horseback_riding" -graphic_alt = "-" -cost = 24 - -[advance_industrialization] -name = _("Industrialization") -req1 = "Railroad" -req2 = "Banking" -graphic = "a.industrialization" -graphic_alt = "-" -helptext = _("Population will start contributing to pollution.") -cost = 2330 - -[advance_invention] -name = _("Invention") -req1 = "Engineering" -req2 = "Literacy" -flags = "" -graphic = "a.invention" -graphic_alt = "-" -helptext = _("Increases Fortress vision +2.") - -[advance_iron_working] -name = _("Iron Working") -req1 = "Bronze Working" -req2 = "Warrior Code" -flags = "" -graphic = "a.iron_working" -graphic_alt = "-" - -[advance_labor_union] -name = _("Labor Union") -req1 = "Mass Production" -req2 = "Guerilla Warfare" -flags = "" -graphic = "a.labor_union" -graphic_alt = "-" -cost = 6630 - -[advance_laser] -name = _("Laser") -req1 = "Mass Production" -req2 = "Nuclear Power" -flags = "" -graphic = "a.laser" -graphic_alt = "-" -cost = 5790 - -[advance_leadership] -name = _("Leadership") -req1 = "Chivalry" -req2 = "Gunpowder" -flags = "" -graphic = "a.leadership" -graphic_alt = "-" -helptext = _("Obsoletes Horsemen, Chariot, Elephant, Knight, Crusader.") -cost = 1250 - -[advance_literacy] -name = _("Literacy") -req1 = "Writing" -req2 = "Code of Laws" -flags = "" -graphic = "a.literacy" -graphic_alt = "-" - -[advance_machine_tools] -name = _("Machine Tools") -req1 = "Steel" -req2 = "Tactics" -flags = "" -graphic = "a.machine_tools" -graphic_alt = "-" -helptext = _("Obsoletes Cannon, Great Wall.") -cost = 3985 - -[advance_magnetism] -name = _("Magnetism") -req1 = "Iron Working" -req2 = "Physics" -flags = "" -graphic = "a.magnetism" -graphic_alt = "-" -helptext = _("Obsoletes Caravel.") -cost = 950 - -[advance_map_making] -name = _("Map Making") -req1 = "Alphabet" -req2 = "None" -flags = "" -graphic = "a.map_making" -graphic_alt = "-" -cost = 40 - -[advance_masonry] -name = _("Masonry") -req1 = "None" -req2 = "None" -flags = "" -graphic = "a.masonry" -graphic_alt = "-" -cost = 24 - -[advance_mass_production] -name = _("Mass Production") -req1 = "Automobile" -req2 = "The Corporation" -graphic = "a.mass_production" -graphic_alt = "-" -helptext = _("Increases population pollution 25%.") -cost = 4680 - -[advance_mathematics] -name = _("Mathematics") -req1 = "Alphabet" -req2 = "Masonry" -flags = "" -graphic = "a.mathematics" -graphic_alt = "-" - -[advance_medicine] -name = _("Medicine") -req1 = "Philosophy" -req2 = "Trade" -flags = "" -graphic = "a.medicine" -graphic_alt = "-" - -[advance_metallurgy] -name = _("Metallurgy") -req1 = "Gunpowder" -req2 = "University" -flags = "" -graphic = "a.metallurgy" -graphic_alt = "-" -chelptext = _("Obsoletes Catapult.") -ost = 1340 - -[advance_miniaturization] -name = _("Miniaturization") -req1 = "Machine Tools" -req2 = "Electronics" -flags = "" -graphic = "a.miniaturization" -graphic_alt = "-" -helptext = _("Obsoletes Lighthouse.") -cost = 4490 - -[advance_mobile_warfare] -name = _("Mobile Warfare") -req1 = "Automobile" -req2 = "Tactics" -flags = "" -graphic = "a.mobile_warfare" -graphic_alt = "-" -helptext = _("Obsoletes Barracks II, Cavalry, Sun Tzu's War Academy, Genghis Khan's Equestrian School.") -cost = 5650 - -[advance_monarchy] -name = _("Monarchy") -req1 = "Ceremonial Burial" -req2 = "Code of Laws" -flags = "" -graphic = "a.monarchy" -graphic_alt = "-" - -[advance_monotheism] -name = _("Monotheism") -req1 = "Philosophy" -req2 = "Polytheism" -flags = "" -graphic = "a.monotheism" -helptext = _("Obsoletes Elephants.") -graphic_alt = "-" - -[advance_mysticism] -name = _("Mysticism") -req1 = "Ceremonial Burial" -req2 = "None" -flags = "" -graphic = "a.mysticism" -graphic_alt = "-" -helptext = _("Improves the effect of Temples.") - -[advance_navigation] -name = _("Navigation") -req1 = "Seafaring" -req2 = "Astronomy" -flags = "" -graphic = "a.navigation" -graphic_alt = "-" -helptext = _("Obsoletes Trireme.") -cost = 226 - -[advance_nuclear_fission] -name = _("Nuclear Fission") -req1 = "Mass Production" -req2 = "Atomic Theory" -flags = "" -graphic = "a.nuclear_fission" -graphic_alt = "-" -cost = 5300 - -[advance_nuclear_power] -name = _("Nuclear Power") -req1 = "Nuclear Fission" -req2 = "Electronics" -flags = "" -graphic = "a.nuclear_power" -graphic_alt = "-" -helptext = _("Gives sea units two extra moves.") -cost = 5650 - -[advance_philosophy] -name = _("Philosophy") -req1 = "Mysticism" -req2 = "Literacy" -flags = "" -graphic = "a.philosophy" -graphic_alt = "-" -helptext = _("When you research this technology before 400 BC and\ - before knowing Industrialization or Electricity or\ - Conscription, you get one other immediate technology advance.") - -[advance_physics] -name = _("Physics") -req1 = "Literacy" -req2 = "Navigation" -flags = "" -graphic = "a.physics" -graphic_alt = "-" -cost = 468 - -[advance_plastics] -name = _("Plastics") -req1 = "Refining" -req2 = "Space Flight" -graphic = "a.plastics" -graphic_alt = "-" -helptext = _("Increases population pollution 25%.") -cost = 7860 - -[advance_polytheism] -name = _("Polytheism") -req1 = "Horseback Riding" -req2 = "Ceremonial Burial" -flags = "" -graphic = "a.polytheism" -graphic_alt = "-" - -[advance_pottery] -name = _("Pottery") -req1 = "None" -req2 = "None" -flags = "" -graphic = "a.pottery" -graphic_alt = "-" -cost = 24 - -[advance_radio] -name = _("Radio") -req1 = "Flight" -req2 = "Electricity" -flags = "" -graphic = "a.radio" -graphic_alt = "-" -helptext = _("Allows Workers and Engineers to build airbases and buoys. Obsoletes Mausoleum.") -cost = 5430 - -[advance_railroad] -name = _("?tech:Railroad") -req1 = "Steam Engine" -req2 = "Bridge Building" -flags = "" -graphic = "a.railroad" -graphic_alt = "-" -helptext = _("\ -Allows Settlers, Workers and Engineers to upgrade roads to railroads. \ -Obsoletes Hanging Gardens.") -cost = 1820 - -[advance_recycling] -name = _("Recycling") -req1 = "Mass Production" -req2 = "Democracy" -flags = "" -graphic = "a.recycling" -graphic_alt = "-" -cost = 4460 - -[advance_refining] -name = _("Refining") -req1 = "Chemistry" -req2 = "Steel" -flags = "" -graphic = "a.refining" -graphic_alt = "-" -helptext = _("\ -Allows Settlers, Workers and Engineers to build oil wells on \ -Glacier tiles.") -cost = 3630 - -[advance_refrigeration] -name = _("Refrigeration") -req1 = "Sanitation" -req2 = "Electricity" -flags = "" -graphic = "a.refrigeration" -graphic_alt = "-" -helptext = _("\ -Allows Settlers, Workers and Engineers to upgrade irrigation systems to farmland.") -cost = 2775 - -[advance_robotics] -name = _("Robotics") -req1 = "Mobile Warfare" -req2 = "Computers" -flags = "" -graphic = "a.robotics" -graphic_alt = "-" -helptext = _("Obsoletes Artillery, King Richard's Crusade.") -cost = 7860 - -[advance_rocketry] -name = _("Rocketry") -req1 = "Advanced Flight" -req2 = "Electronics" -flags = "" -graphic = "a.rocketry" -graphic_alt = "-" -helptext = _("Obsoletes Destroyer, Cruiser.") -cost = 7040 - -[advance_sanitation] -name = _("Sanitation") -req1 = "Engineering" -req2 = "Medicine" -flags = "" -graphic = "a.sanitation" -graphic_alt = "-" -cost = 950 - -[advance_seafaring] -name = _("Seafaring") -req1 = "Pottery" -req2 = "Map Making" -flags = "" -graphic = "a.seafaring" -graphic_alt = "-" - -[advance_space_flight] -name = _("Space Flight") -req1 = "Computers" -req2 = "Rocketry" -flags = "" -graphic = "a.space_flight" -graphic_alt = "-" -cost = 7680 - -[advance_stealth] -name = _("Stealth") -req1 = "Superconductors" -req2 = "Space Flight" -flags = "" -graphic = "a.stealth" -graphic_alt = "-" -cost = 11920 - -[advance_steam_engine] -name = _("Steam Engine") -req1 = "Physics" -req2 = "Invention" -flags = "" -graphic = "a.steam_engine" -graphic_alt = "-" -helptext = _("Obsoletes Frigate.") -cost = 1240 - -[advance_steel] -name = _("Steel") -req1 = "Electricity" -req2 = "Industrialization" -flags = "" -graphic = "a.steel" -graphic_alt = "-" -cost = 3280 - -[advance_superconductors] -name = _("Superconductors") -req1 = "Nuclear Power" -req2 = "Laser" -flags = "" -graphic = "a.superconductors" -graphic_alt = "-" -cost = 5950 -helptext = _("Allows Settlers, Workers and Engineers to upgrade railroads with Maglev.") - -[advance_tactics] -name = _("Tactics") -req1 = "Conscription" -req2 = "Leadership" -flags = "" -graphic = "a.tactics" -graphic_alt = "-" -helptext = _("Obsoletes Dragoons, Statue of Zeus.") -cost = 2530 - -[advance_the_corporation] -name = _("The Corporation") -req1 = "Economics" -req2 = "Industrialization" -flags = "" -graphic = "a.the_corporation" -graphic_alt = "-" -helptext = _("Obsoletes Caravan.") -cost = 2900 - -[advance_the_republic] -name = _("The Republic") -req1 = "Code of Laws" -req2 = "Literacy" -flags = "" -graphic = "a.the_republic" -graphic_alt = "-" - -[advance_the_wheel] -name = _("The Wheel") -req1 = "Horseback Riding" -req2 = "None" -flags = "" -graphic = "a.the_wheel" -graphic_alt = "-" - -[advance_theology] -name = _("Theology") -req1 = "Feudalism" -req2 = "Monotheism" -flags = "" -graphic = "a.theology" -graphic_alt = "-" -helptext = _("Obsoletes Oracle. Adds +1 to the effect of Cathedrals & Michelangelo's Chapel.") -cost = 725 - -[advance_theory_of_gravity] -name = _("Theory of Gravity") -req1 = "Astronomy" -req2 = "University" -flags = "" -graphic = "a.theory_of_gravity" -graphic_alt = "-" -cost = 585 - -[advance_trade] -name = _("Trade") -req1 = "Currency" -req2 = "Code of Laws" -flags = "" -graphic = "a.trade" -graphic_alt = "-" - -[advance_university] -name = _("University") -req1 = "Mathematics" -req2 = "Philosophy" -flags = "" -graphic = "a.university" -graphic_alt = "-" - -[advance_warrior_code] -name = _("Warrior Code") -req1 = "None" -req2 = "None" -flags = "" -graphic = "a.warrior_code" -graphic_alt = "-" -cost = 24 - -[advance_writing] -name = _("Writing") -req1 = "Alphabet" -req2 = "None" -flags = "" -graphic = "a.writing" -graphic_alt = "-" - -; A placeholder tech used to ensure that when -; a game is reloaded, a player can`t rebuild -; the "Darwin's Voyage" small wonder and get -; two free advances again. -; THIS RULESET DOES NOT USE OLD DARWIN'S VOYAGE BEHAVIOUR OR THEORY OF EVOLUTION. -[advance_theory_of_evolution] -name = _("Theory of Evolution") -req1 = "None" -req2 = "None" -root_req = "Theory of Evolution" -flags = "" -graphic = "b.darwins_voyage" -graphic_alt = "-" -helptext = _("This technology is only acquired the first\ - time you build Darwin's Voyage.") diff --git a/freeciv/freeciv/data/.historic/mp2-May2019-historic/terrain.ruleset b/freeciv/freeciv/data/.historic/mp2-May2019-historic/terrain.ruleset deleted file mode 100644 index 9a2366eeb..000000000 --- a/freeciv/freeciv/data/.historic/mp2-May2019-historic/terrain.ruleset +++ /dev/null @@ -1,2011 +0,0 @@ - -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes, -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -; Note that the freeciv AI may not cope well with anything more -; than minor changes. - -[datafile] -description="Multiplayer-Evolution (MP2) terrain data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -[control] -; Names for custom terrain flags. There can be up to 8 of these. -; name = rule name; In some circumstances user may see this -; as part of some sentences, so try to make it descriptive -; and sensible. -; helptxt = displayed in the help for terrains with this flag (optional) -flags = - { "name", "helptxt" - _("Oil"), _("Has Oil Well instead of Mine.") - _("NoPollution"), _("No Pollution nor Fallout appear here.") - _("Low Land"), _("Terrain suitable for canal digging.") - } - -; Names for custom extra flags. There can be up to 8 of these. -; name = rule name; In some circumstances user may see this -; as part of some sentences, so try to make it descriptive -; and sensible. -; helptxt = displayed in the help for extra types with this flag -; (optional) -;extra_flags = -; { "name", "helptxt" -; } - -[parameters] - -; Percentage of "land" tiles required to be adjacent to a water tile before -; it may be "reclaimed" into a land tile (0-101; 0=anywhere, default 101=nowhere) -ocean_reclaim_requirement = 30 - -; Percentage of "water" tiles required to be adjacent to a land tile before -; it may be "channeled" into a water tile (0-101; 0=anywhere, default 101=nowhere) -land_channel_requirement = 10 - -; Percentage of unfrozen tiles (no "Frozen" flag) required to be adjacent -; to a frozen tile before it can thaw (0-101; 0=anywhere, default 101=nowhere) -thaw_requirement = 0 - -; Percentage of frozen tiles ("Frozen" flag) required to be adjacent to an -; unfrozen tile before it can freeze (0-101; 0=anywhere, default 101=nowhere) -freeze_requirement = 0 - -; Bodies of water up to this size are considered freshwater lakes, if there is -; also terrain type(s) with flag "FreshWater" in the ruleset. -lake_max_size = 14 - -; How many native tiles first startunit must be able to reach. -; 0 to disable check. -min_start_native_area = 0 - -; How many fragments each movement point has. -; For example road movement costs are relative to this. -move_fragments = 9 - -; How many move_fragments IgTer unit movement costs -igter_cost = 3 - -; Whether diagonal movement has increased cost (no effect with hex topology) -; The cost increase is more accurate with larger values for move_fragments -pythagorean_diagonal = FALSE - -; There is no resources in the middle of the oceans, only near coast -ocean_resources = FALSE - -; /* <-- avoid gettext warnings -; -; The individual terrain types, one per section. -; Roughly sorted by identifier. -; The actual tag used (the * in [terrain_*]) must be unique for each terrain, -; and may be used in debug output when reading this file. -; -; Notes: -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; -; if not present, "name" is used for this purpose too. -; Since the name used in savegames must not change, if -; you want to rename an item after a ruleset has been -; released, you should set "rule_name" to the original -; value of "name". -; graphic = preferred graphic; Tilespec [tile_*] section -; with 'tag' matching this will be used. -; graphic_alt = alternate graphic. When no tilespec 'tag' matching -; preferred graphic is not found, this will be used. -; Otherwise may be "-" -; identifier = single-character identifier used in savegames. This -; must be unique for each terrain. -; class = Terrain class terrain belongs to: "Land" or "Oceanic" -; movement_cost = in whole movement points, not move_fragments; -; typically 1 to 3 -; defense_bonus = percent added to defense; typically 0% to 200% -; food = normal food production -; shield = normal shield production -; trade = normal trade production -; resources = list of possible resources on this terrain -; road_food_incr_pct = percent of road food_incr applied to this terrain -; road_shield_incr_pct = percent of road shield_incr applied to this terrain -; road_trade_incr_pct = percent of road trade_incr applied to this terrain -; base_time = time to build bases; if 0, cannot build any bases. -; Nonzero values only affect extras with build_time 0. -; road_time = time to build roads; if 0, cannot build any roads. -; Nonzero values only affect extras with build_time 0. -; irrigation_result = result of 'irrigate' activity; one of: -; "no" -- cannot irrigate -; "yes" -- can build extra -; terrain section -- irrigation changes to that terrain -; irrigation_food_incr = increment to food if tile is 100% irrigated -; (actual bonus controlled by Irrigation_Pct effect) -; irrigation_time = time for 'irrigate' activity; if 0, cannot irrigate -; Nonzero values only affect extras with build_time 0. -; Such extras can modify time with build_time_factor. -; mining_result = result of 'mine' activity; one of: -; "no" -- cannot mine -; "yes" -- can build extra -; terrain section -- mining changes to that terrain -; mining_shield_incr = increment to shields if tile is 100% mined -; (actual bonus controlled by Mining_Pct effect) -; mining_time = time for 'mine' activity; if 0, cannot mine -; Nonzero values only affect extras with build_time 0. -; Such extras can modify time with build_time_factor. -; transform_result = result of transformation; one of: -; "no" -- cannot transform -; terrain section -- transformation changes to that -; terrain -; transform_time = time to transform; if 0, cannot transform -; pillage_time = time to pillage extra from the tile (0 = impossible) -; Nonzero values only affect extras with removal_time 0. -; clean_pollution_time = time for 'clean pollution' activity (0 = impossible) -; Nonzero values only affect extras with removal_time 0. -; clean_fallout_time = time for 'clean fallout' activity (0 = impossible) -; Nonzero values only affect extras with removal_time 0. -; animal = unit type that can appear as animal on the terrain -; warmer_wetter_result = result of global warming for wet terrains; one of: -; "no" -- no change; does not count for warming -; "yes" -- no change; counts for warming -; terrain section -- warming changes to that terrain -; warmer_drier_result = result of global warming for dry terrains; -; see warmer_wetter_result -; cooler_wetter_result = result of nuclear winter for wet terrains; -; see warmer_wetter_result -; cooler_drier_result = result of nuclear winter for dry terrains; -; see warmer_wetter_result -; native_to = List of unit classes that can move here -; flags = General flags for this terrain. List taken from the -; following, and/or any user flags defined above: -; - NoBarbs = Barbarians will not be spawned here. -; - NoCities = Cities may not be built or found on this terrain. -; - Starter = Players will only be started on "Starter" terrain. -; (Currently this cannot be Oceanic terrain.) -; - CanHaveRiver = Set to 1 if this terrain can have river on it (the -; actual chance of river generation is controlled -; separately). -; - UnsafeCoast = This terrain does not provide a safe voyage for -; units with flag "Trireme" -; - FreshWater = This terrain is used for small bodies of water. -; If this becomes adjacent to non-FreshWater terrain, -; the whole contiguous FreshWater area will be flooded -; with the non-FreshWater terrain. -; - NotGenerated = Map generator never places this terrain type. It can -; be added from editor only, or by ingame events -; (lua scripting) -; - NoZoc = Units on this terrain are not generating or subject -; to zoc -; - NoFortify = Units cannot fortify on this terrain -; - Frozen = Frozen/polar terrain. For water tiles, Frozen terrain -; is generated near poles. Conversion between frozen -; and unfrozen terrain can be controlled with -; thaw_requirement/freeze_requirement, and Frozen -; terrain is shown differently on the overview map. -; property_* = specific property % values used by mapgen. Most -; terrains will have 0 for most values. Properties -; other than ocean_depth are only used for land tiles. -; - mountainous = degree to which this terrain is mountainous -; - green = how much life this terrain has -; - foliage = how much thick undergrowth the terrain has -; - tropical = how "tropical" the terrain is (high temperature) -; - temperate = how "temperate" the terrain is (med temperature) -; - cold = how "cold" the terrain is (low temperature) -; - frozen = how "frozen" the terrain is (very low temperature) -; (does not necessarily have to have the "Frozen" flag) -; - wet = how "wet" the terrain is (moisture) -; - dry = how "dry" the terrain is (moisture) -; - ocean_depth = the depth of an ocean, as an average level -; color.r = color of the terrain (red value) -; color.g = color of the terrain (green value) -; color.b = color of the terrain (blue value) -; helptext = optional help text string; should escape all raw -; newlines so that xgettext parsing works -; -; */ <-- avoid gettext warnings - -[terrain_inaccesible] -name = _("Inaccessible") -graphic = "inaccessible" -graphic_alt = "arctic" -identifier = "i" -class = "Land" -movement_cost = 0 -defense_bonus = 0 -food = 0 -shield = 0 -trade = 0 -road_food_incr_pct = 0 -road_shield_incr_pct = 0 -road_trade_incr_pct = 0 -base_time = 0 -road_time = 0 -irrigation_result = "no" -irrigation_food_incr = 0 -irrigation_time = 0 -mining_result = "no" -mining_shield_incr = 0 -mining_time = 0 -transform_result = "no" -transform_time = 0 -pillage_time = 0 -clean_pollution_time = 0 -clean_fallout_time = 0 -animal = "None" -warmer_wetter_result = "no" -warmer_drier_result = "no" -cooler_wetter_result = "no" -cooler_drier_result = "no" -flags = "NotGenerated", "NoPollution", "NoCities", "UnsafeCoast", "Frozen" -color.r = 25 -color.g = 25 -color.b = 25 -helptext = _("\ -No unit can enter this terrain, nor can any city work its tiles.\ -") - -[terrain_lake] -name = _("Lake") -graphic = "lake" -graphic_alt = "coast" -identifier = "+" -class = "Oceanic" -movement_cost = 1 -defense_bonus = 0 -food = 1 -shield = 0 -trade = 2 -resources = "Fish" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 0 -irrigation_result = "no" -irrigation_food_incr = 0 -irrigation_time = 0 -mining_result = "no" -mining_shield_incr = 0 -mining_time = 0 -transform_result = "Swamp" -transform_time = 36 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "no" -warmer_drier_result = "Swamp" -cooler_wetter_result = "Glacier" -cooler_drier_result = "Tundra" -native_to = "Sea", "Air", "Balloon", "Missile", "Helicopter", "Trireme", "RiverShip", "Submarine", "AirProtect", "AirPillage", "Bomb" -flags = "NoCities", "NoBarbs", "NoPollution", "FreshWater", "NoZoc", "NoFortify" -property_ocean_depth = 0 -color.r = 46 -color.g = 120 -color.b = 182 -helptext = _("\ -Lakes are substantial bodies of fresh water.\ -") - -[terrain_ocean] -name = _("Ocean") -graphic = "coast" -graphic_alt = "-" -identifier = " " -class = "Oceanic" -movement_cost = 1 -defense_bonus = 0 -food = 1 -shield = 0 -trade = 2 -resources = "Fish", "Whales" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 0 -irrigation_result = "no" -irrigation_food_incr = 0 -irrigation_time = 0 -mining_result = "no" -mining_shield_incr = 0 -mining_time = 0 -transform_result = "Swamp" -transform_time = 36 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "no" -warmer_drier_result = "Swamp" -cooler_wetter_result = "Glacier" -cooler_drier_result = "Glacier" -native_to = "Sea", "Air", "Balloon", "Missile", "Helicopter", "Trireme", "RiverShip", "Submarine", "AirProtect", "AirPillage", "Bomb" -flags = "NoCities", "NoPollution", "UnsafeCoast", "NoZoc", "NoFortify" -property_ocean_depth = 32 -color.r = 0 -color.g = 46 -color.b = 137 -helptext = _("\ -Shallow oceans are mostly found near coastlines, and are often rich\ - sources of food and other resources.\ -") - -[terrain_deep_ocean] -name = _("Deep Ocean") -graphic = "floor" -graphic_alt = "coast" -identifier = ":" -class = "Oceanic" -movement_cost = 1 -defense_bonus = 0 -food = 1 -shield = 0 -trade = 2 -;resources = "none" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 0 -irrigation_result = "no" -irrigation_food_incr = 0 -irrigation_time = 0 -mining_result = "no" -mining_shield_incr = 0 -mining_time = 0 -transform_result = "no" -transform_time = 0 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "no" -warmer_drier_result = "no" -cooler_wetter_result = "no" -cooler_drier_result = "no" -native_to = "Sea", "Air", "Balloon", "Missile", "Helicopter", "RiverShip", "Submarine", "AirProtect", "AirPillage", "Bomb" -flags = "NoCities", "NoPollution", "UnsafeCoast", "NoZoc", "NoFortify" -property_ocean_depth = 87 -color.r = 0 -color.g = 33 -color.b = 129 -helptext = _("\ -Deep oceans cover much of the world away from coastlines, and only\ - seaworthy units (not including Triremes) can travel on them.\ -") - -[terrain_glacier] -name = _("Glacier") -graphic = "arctic" -graphic_alt = "-" -identifier = "a" -class = "Land" -movement_cost = 2 -defense_bonus = 0 -food = 0 -shield = 0 -trade = 0 -resources = "Ivory", "Oil" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 4 -irrigation_result = "no" -irrigation_food_incr = 0 -irrigation_time = 0 -mining_result = "yes" -mining_shield_incr = 1 -mining_time = 10 -transform_result = "Tundra" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Tundra" -warmer_drier_result = "Tundra" -cooler_wetter_result = "no" -cooler_drier_result = "no" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "NoBarbs", "NoCities", "CanHaveRiver", "Oil", "Frozen" -property_frozen = 100 -color.r = 232 -color.g = 232 -color.b = 232 -helptext = _("\ -Glaciers are found only in the most northerly or southerly\ - reaches of the world. They are very cold, and hence difficult to\ - work with.\ -"), _("\ -Oil wells can be built when Refining is known.\ -") - -[terrain_desert] -name = _("Desert") -graphic = "desert" -graphic_alt = "-" -identifier = "d" -class = "Land" -movement_cost = 1 -defense_bonus = 0 -food = 0 -shield = 1 -trade = 0 -resources = "Oasis", "Oil" -road_trade_incr_pct = 100 -base_time = 1 -road_time = 2 -irrigation_result = "yes" -irrigation_food_incr = 1 -irrigation_time = 5 -mining_result = "yes" -mining_shield_incr = 1 -mining_time = 5 -transform_result = "Plains" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Grassland" -warmer_drier_result = "no" -cooler_wetter_result = "Plains" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "CanHaveRiver", "Oil", "Low Land" -property_dry = 100 -property_tropical = 50 -property_temperate = 20 -color.r = 214 -color.g = 185 -color.b = 106 -helptext = _("\ -Deserts are regions of extreme dryness, making agriculture and\ - trade very difficult.\ -"), _("\ -Oil wells can be built when Construction is known.\ -") - -[terrain_forest] -name = _("Forest") -graphic = "forest" -graphic_alt = "-" -identifier = "f" -class = "Land" -movement_cost = 2 -defense_bonus = 50 -food = 1 -shield = 2 -trade = 0 -resources = "Pheasant", "Silk" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 4 -irrigation_result = "Plains" -irrigation_food_incr = 0 -irrigation_time = 5 -mining_result = "Swamp" -mining_shield_incr = 0 -mining_time = 15 -transform_result = "Grassland" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Jungle" -warmer_drier_result = "Plains" -cooler_wetter_result = "Swamp" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "Starter", "CanHaveRiver", "Low Land" -property_cold = 20 -property_wet = 20 -property_foliage = 50 -property_temperate = 50 -color.r = 43 -color.g = 107 -color.b = 19 -helptext = _("\ -Forests are densely wooded, making agriculture somewhat\ - problematic.\ -") - -[terrain_grassland] -name = _("Grassland") -graphic = "grassland" -graphic_alt = "-" -identifier = "g" -class = "Land" -movement_cost = 1 -defense_bonus = 0 -food = 2 -shield = 0 -trade = 0 -resources = "Resources" -road_trade_incr_pct = 100 -base_time = 1 -road_time = 2 -irrigation_result = "yes" -irrigation_food_incr = 1 -irrigation_time = 5 -mining_result = "Forest" -mining_shield_incr = 0 -mining_time = 10 -transform_result = "Hills" -transform_time = 30 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Lake" -warmer_drier_result = "Desert" -cooler_wetter_result = "Glacier" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "Starter", "CanHaveRiver", "Low Land" -property_green = 50 -property_temperate = 50 -color.r = 11 -color.g = 138 -color.b = 4 -helptext = _("\ -Grasslands afford exceptional agricultural opportunities.\ -") - -[terrain_hills] -name = _("Hills") -graphic = "hills" -graphic_alt = "-" -identifier = "h" -class = "Land" -movement_cost = 2 -defense_bonus = 100 -food = 1 -shield = 0 -trade = 0 -resources = "Coal", "Wine" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 4 -irrigation_result = "yes" -irrigation_food_incr = 1 -irrigation_time = 10 -mining_result = "yes" -mining_shield_incr = 3 -mining_time = 10 -transform_result = "Plains" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "no" -warmer_drier_result = "no" -cooler_wetter_result = "no" -cooler_drier_result = "no" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "Starter", "CanHaveRiver" -property_green = 50 -property_mountainous = 30 -color.r = 24 -color.g = 97 -color.b = 5 -helptext = _("\ -In addition to being amenable to agriculture, Hills are frequently\ - rich in resources.\ -") - -[terrain_jungle] -name = _("Jungle") -graphic = "jungle" -graphic_alt = "-" -identifier = "j" -class = "Land" -movement_cost = 2 -defense_bonus = 50 -food = 1 -shield = 0 -trade = 0 -resources = "Gems", "Fruit" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 4 -irrigation_result = "Grassland" -irrigation_food_incr = 0 -irrigation_time = 15 -mining_result = "Forest" -mining_shield_incr = 0 -mining_time = 15 -transform_result = "Plains" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Lake" -warmer_drier_result = "Desert" -cooler_wetter_result = "Swamp" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "CanHaveRiver", "Low Land" -property_foliage = 50 -property_tropical = 50 -property_wet = 50 -color.r = 55 -color.g = 156 -color.b = 38 -helptext = _("\ -Jungles are densely overgrown, making agriculture somewhat\ - problematic.\ -") - -[terrain_mountains] -name = _("Mountains") -graphic = "mountains" -graphic_alt = "-" -identifier = "m" -class = "Land" -movement_cost = 3 -defense_bonus = 200 -food = 0 -shield = 1 -trade = 0 -resources = "Gold", "Iron" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 6 -irrigation_result = "no" -irrigation_food_incr = 0 -irrigation_time = 0 -mining_result = "yes" -mining_shield_incr = 1 -mining_time = 10 -transform_result = "Hills" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "no" -warmer_drier_result = "no" -cooler_wetter_result = "no" -cooler_drier_result = "no" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "CanHaveRiver" -property_mountainous = 70 -color.r = 129 -color.g = 127 -color.b = 118 -helptext = _("\ -Mountains are regions of extreme altitude, making agriculture and\ - trade very difficult.\ -") - -[terrain_plains] -name = _("Plains") -graphic = "plains" -graphic_alt = "-" -identifier = "p" -class = "Land" -movement_cost = 1 -defense_bonus = 0 -food = 1 -shield = 1 -trade = 0 -resources = "Buffalo", "Wheat" -road_trade_incr_pct = 100 -base_time = 1 -road_time = 2 -irrigation_result = "yes" -irrigation_food_incr = 1 -irrigation_time = 5 -mining_result = "Forest" -mining_shield_incr = 0 -mining_time = 15 -transform_result = "Grassland" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Lake" -warmer_drier_result = "Desert" -cooler_wetter_result = "Glacier" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "Starter", "CanHaveRiver", "Low Land" -property_green = 50 -property_temperate = 50 -color.r = 122 -color.g = 156 -color.b = 46 -helptext = _("\ -Plains are very broad, sparse regions, which makes trade slightly\ - inconvenient.\ -") - -[terrain_swamp] -name = _("Swamp") -graphic = "swamp" -graphic_alt = "-" -identifier = "s" -class = "Land" -movement_cost = 2 -defense_bonus = 50 -food = 1 -shield = 0 -trade = 0 -resources = "Peat", "Spice" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 4 -irrigation_result = "Grassland" -irrigation_food_incr = 0 -irrigation_time = 15 -mining_result = "Forest" -mining_shield_incr = 0 -mining_time = 15 -transform_result = "Lake" -transform_time = 12 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Lake" -warmer_drier_result = "Desert" -cooler_wetter_result = "Glacier" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "CanHaveRiver", "Low Land" -property_wet = 100 -property_tropical = 10 -property_temperate = 10 -property_cold = 10 -color.r = 48 -color.g = 85 -color.b = 97 -helptext = _("\ -Swamps suffer from an over-abundance of water, making agriculture\ - somewhat problematic.\ -") - -[terrain_tundra] -name = _("Tundra") -graphic = "tundra" -graphic_alt = "-" -identifier = "t" -class = "Land" -movement_cost = 1 -defense_bonus = 0 -food = 1 -shield = 0 -trade = 0 -resources = "Game", "Furs" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 2 -irrigation_result = "yes" -irrigation_food_incr = 1 -irrigation_time = 5 -mining_result = "no" -mining_shield_incr = 0 -mining_time = 0 -transform_result = "Desert" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Lake" -warmer_drier_result = "Desert" -cooler_wetter_result = "Glacier" -cooler_drier_result = "no" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "Starter", "NoBarbs", "CanHaveRiver", "Low Land" -property_cold = 50 -color.r = 188 -color.g = 188 -color.b = 188 -helptext = _("\ -Tundra are broad, cold regions, fit for some agriculture and little\ - else.\ -") - -; /* <-- avoid gettext warnings -; -; Resource types: -; -; The actual tag used (the * in [resource_*]) must be unique for each resource, -; and may be used in debug output when reading this file. -; -; Notes: -; -; extra = name of the extra this resource section is part of -; (must have "Resource" in its causes) -; identifier = single-character identifier used in old savegames. This -; must be unique for each resource, and changing it will -; break loading those old savegames. -; food = increased food production -; shield = increased shield production -; trade = increased trade production -; -; */ <-- avoid gettext warnings - -[resource_gold] -extra = "Gold" -identifier = "$" -trade = 8 -# glacier, hills, mountains. - -[resource_iron] -extra = "Iron" -identifier = "/" -shield = 3 -# mountains. - -[resource_game] -extra = "Game" -identifier = "e" -food = 2 -shield = 1 -# tundra. - -[resource_furs] -extra = "Furs" -identifier = "u" -food = 1 -trade = 3 -# tundra-only (beaver pelts). - -[resource_coal] -extra = "Coal" -identifier = "c" -shield = 2 -# hills. - -[resource_fish] -extra = "Fish" -identifier = "y" -food = 2 -# ocean. - -[resource_fruit] -extra = "Fruit" -identifier = "f" -food = 3 -trade = 1 -# jungle. - -[resource_gems] -extra = "Gems" -identifier = "g" -trade = 4 -# jungle. - -; "h" reserved for strategic horses - -[resource_buffalo] -extra = "Buffalo" -identifier = "b" -shield = 2 -# plains (horses => buffalo => cattle). - -[resource_wheat] -extra = "Wheat" -identifier = "j" -food = 2 -# plains. - -; "k" reserved for (cane) sugar - -; "l" reserved for tobacco - -; "m" reserved for marble - -[resource_oasis] -extra = "Oasis" -identifier = "o" -food = 3 -# desert. - -[resource_peat] -extra = "Peat" -identifier = "a" -shield = 4 -# swamp (petroleum => peat => petroleum). - -[resource_pheasant] -extra = "Pheasant" -identifier = "p" -food = 2 -# forest, forested. - -; "r" reserved for rubber - -[resource_bonus] -extra = "Resources" -identifier = "r" -shield = 1 -# grassland. - -[resource_icy_ivory] -extra = "Ivory" -identifier = "i" -food = 1 -shield = 1 -trade = 4 -# glacier (seals => walrus). - -[resource_silk] -extra = "Silk" -identifier = "s" -trade = 3 -# forest, wooded. - -[resource_spice] -extra = "Spice" -identifier = "t" -food = 2 -trade = 4 -# swamp-only. - -; "u" reserved for uranium - -[resource_whales] -extra = "Whales" -identifier = "v" -food = 1 -shield = 1 -# ocean (sea). - -[resource_wine] -extra = "Wine" -identifier = "w" -trade = 4 -# hills-only. - -[resource_oil] -extra = "Oil" -identifier = "x" -shield = 3 ; glacier used to have 4 -# glacier, desert - - -[extraui] - -; Player visible names of the base gui types. -ui_name_base_fortress = _("?gui_type:Build Fortress/Buoy") -ui_name_base_airbase = _("?gui_type:Build Airbase") - -; /* <-- avoid gettext warnings -; -; Each extra, including bases, roads, and resource, must have a section here. -; Bases, roads, and resources have additional sections for their specific features. -; -; -; Extra types: -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets -; etc; if not present, "name" is used for this -; purpose too. Since the name used in savegames must -; not change, if you want to rename an item after a -; ruleset has been released, you should set -; "rule_name" to the original value of "name". -; category = How UI should categorize this extra. One of -; "Infra", "Natural", "Nuisance", "Resource", -; or "Bonus" -; causes = events that can create extra type. -; "Irrigation", "Mine", "Hut", "Pollution", "Fallout", -; "Appear", "Resource", "Base", or "Road" -; (the last three require a corresponding -; [resource_*] / [base_*] / [road_*] section) -; rmcauses = events that can remove extra type. -; "CleanPollution", "CleanFallout", "Pillage", or -; "Disappear" -; graphic = tag specifying preferred graphic -; graphic_alt = tag for alternate graphic if preferred graphic is -; not present. Can use eg "-" for no alternate -; graphic -; activity_gfx = tag specifying graphic for unit building extra -; This can be "None" to indicate that graphic sprite -; is not needed. -; act_gfx_alt = tag for alternative graphic for unit building extra -; act_gfx_alt2 = tag for second alternative graphic for unit building extra -; rmact_gfx = tag specifying graphic for unit removing extra -; This can be "None" to indicate that graphic sprite -; is not needed. -; rmact_gfx_alt = tag for alternative graphic for unit removing extra -; reqs = requirements to build the extra (see effects.ruleset -; and README.effects for help on requirements) -; rmreqs = requirements to remove the extra -; appearance_reqs = spontaneous appearance requirements -; disappearance_reqs = spontaneous disappearance requirements -; visibility_req = Tech a player needs to have to see the extra -; This affects visibility only, for all the rules -; extra is still there even if player can't see it. -; buildable = Can extra be built? Defaults to TRUE if extra has -; any causes indicating it can result from worker -; activity. -; generated = Can map generator place the extra? Applicable -; for Hut, Resource, and River extras. -; build_time = how long it takes a unit to build this extra. -; Value of 0 (default) means that terrain- and -; build activity specific time is used instead. -; build_time_factor = This setting take effect only if build_time is 0. -; Terrain and activity specific build time will be -; multiplied by this value (default 1) -; removal_time = how long it takes a unit to remove this extra. -; Value of 0 (default) means that terrain- and -; removal activity specific time is used instead. -; removal_time_factor = This setting take effect only if removal_time is 0. -; Terrain and activity specific removal time will be -; multiplied by this value (default 1) -; defense_bonus = Percent added to defense when tile has the extra -; (default none) -; unit_seen = How opponents see units inside this extra -; "Normal" - Units are seen normally (default) -; "Hidden" - Units are hidden from opponents -; appearance_chance = If extra has cause "Appear" and other requirements -; for its appearance are fulfilled, this tells how big -; chance it has to appear each turn. The chance is 1/10000 -; times this value. -; disappearance_chance = If extra has rmcause "Disappear" and other requirements -; for its disappearance are fulfilled, this tells how big -; chance it has to disappear each turn. The chance is 1/10000 -; times this value. -; native_to = List of unit classes that are considered to -; be inside the extra when they are on same tile -; conflicts = List of extras that cannot be on the same tile. -; Bases with non-zero border_sq automatically conflict -; with each other. -; hidden_by = List of extra types that will make this extra -; type not to show on UI if both present. -; bridged_over = List of extra types that, if present in tile, will prevent -; building this extra if can't be bridged over -; flags -; - "NativeTile" = Native units consider tile native regardless of -; terrain -; - "Refuel" = Native units can use tile as refuel point -; - "TerrChangeRemoves" = Extra gets removed when ever terrain changes even -; if target terrain could support it -; - "AlwaysOnCityCenter" = City center tiles always have this extra type -; regardless of its other requirements -; - "AutoOnCityCenter" = City center tiles will automatically have this -; extra type if the player can build it -; - "ConnectLand" = Road style gfx on Oceanic tiles are drawn to -; connect to adjacent Land tiles even if they have -; no extra. This affects appearance only -; - "GlobalWarming" = Instances of this extra on map count towards -; Global Warming -; - "NuclearWinter" = Instances of this extra on map count towards -; Nuclear Winter -; - "ShowFlag" = Draw owner's flag -; - "NaturalDefense" = Extra's defense bonus will be counted to "Natural" -; defense layer. The defense bonus of all the extras -; located at the tile, native to defending unit, -; is calculated as a 1 + sum of bonuses from the extras -; on the default "Fortification" defense layer multiplied -; by the 1 + sum of bonuses from the extras on the -; "Natural" layer. -; - "NoStackDeath" = Units inside do not die all at once when attacked -; helptext = optional help text string; should escape all raw -; newlines so that xgettext parsing works -; -; */ <-- avoid gettext warnings - -[extra_irrigation] -name = _("Irrigation") -category = "Infra" -causes = "Irrigation" -rmcauses = "Pillage" -graphic = "tx.irrigation" -graphic_alt = "-" -activity_gfx = "unit.irrigation" -act_gfx_alt = "unit.irrigate" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -build_time = 0 -removal_time = 0 -conflicts = "Mine", "Oil Well" -hidden_by = "Farmland" -helptext = _("\ -Building an irrigation system on a suitable tile causes it to \ -produce one extra food each turn. This requires a nearby source of \ -water: an ocean, lake, or river tile, or another tile with an \ -irrigation system, must share an edge (not just a corner) with the \ -target tile. However, once irrigated, land remains so even if the \ -water source is removed.\ -"), _("\ -Building irrigation on a tile with a mine or oil well will destroy it.\ -"), _("\ -City center tiles get their terrain's irrigation bonus automatically, \ -if there is no conflicting mine or oil well on the tile; however, \ -this does not make cities count as a water source for further \ -irrigation. Irrigation can be built on the city tile simply to allow \ -building further irrigation elsewhere, but will not give the tile any \ -further bonus.\ -") - -[extra_mine] -name = _("Mine") -category = "Infra" -causes = "Mine" -rmcauses = "Pillage" -graphic = "tx.mine" -graphic_alt = "-" -activity_gfx = "unit.mine" -act_gfx_alt = "unit.plant" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "TerrainFlag", "Oil", "Local", FALSE, TRUE - } -build_time = 0 -removal_time = 0 -conflicts = "Irrigation", "Farmland" -helptext = _("\ -Mines can be built on some types of terrain, which increases the \ -number of production points produced by that tile. Hills get an extra \ -3 production points per tile; other terrains get 1 extra production \ -point.\ -"), _("\ -Building a mine on an irrigated tile will destroy the irrigation.\ -") - -[extra_oil_well] -name = _("Oil Well") -category = "Infra" -causes = "Mine" -rmcauses = "Pillage" -graphic = "tx.oil_mine" -graphic_alt = "tx.mine" -activity_gfx = "unit.oil_mine" -act_gfx_alt = "unit.mine" -act_gfx_alt2 = "unit.plant" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "quiet" - "TerrainFlag", "Oil", "Local", TRUE - } -build_time = 0 -removal_time = 0 -conflicts = "Irrigation", "Farmland" -helptext = _("\ -Oil wells behave like mines (giving an extra production point), but \ -require more technology. Oil wells can be built on Desert with knowledge \ -of Construction, and on Glacier with knowledge of Refining.\ -"), _("\ -Building an oil well on an irrigated tile will destroy the irrigation.\ -") - -[extra_pollution] -name = _("Pollution") -category = "Nuisance" -causes = "Pollution" -rmcauses = "CleanPollution" -graphic = "tx.pollution" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "unit.pollution" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "TerrainFlag", "NoPollution", "Local", FALSE, TRUE - } -removal_time = 0 -flags = "GlobalWarming" -helptext = _("\ -Pollution appears on land tiles around cities with high production or \ -population. \ -It halves all output from its tile, and contributes to the risk of \ -global warming.\ -"), _("\ -The pollution can only be cleared by dispatching Workers, \ -Settlers, or Engineers with the \"clean pollution\" order.\ -"), _("\ -Pollution from production is likely to start becoming important as \ -your civilization becomes more industrialized, giving you buildings \ -such as Factory and Power Plant which boost production. Replacing a \ -Power Plant with cleaner forms of energy -- a Hydro Plant / Hoover \ -Dam, Nuclear Plant, or Solar Plant -- will reduce pollution from \ -production, as will a Recycling Center or knowledge of \ -Environmentalism.\ -"), _("\ -The city's population starts adding to pollution with the discovery of \ -Industrialization, and Automobile, Mass Production, and Plastics make \ -this worse. Building a Mass Transit in a city eliminates the \ -population's contribution to pollution.\ -"), _("\ -The contribution of these factors can be seen in the city dialog; once \ -it exceeds a threshold, the excess is the percent chance of pollution \ -appearing each turn.\ -"), _("\ -When an unused tile becomes polluted, there is the temptation to avoid \ -the effort of cleaning it; but the spread of pollution has far more \ -terrible results than the immediate economic impact -- every polluted \ -tile increases the chance of global warming. Each time global warming \ -advances, the entire world loses coastal land to the sea and to jungles \ -and swamps, and inland tiles are lost to desert. This tends to \ -devastate cities and leads to global impoverishment.\ -"), _("\ -The risk of global warming is cumulative; the longer polluted tiles \ -are left uncleaned, the higher the risk becomes, and the risk can \ -linger for some time even after all pollution has been cleaned. If a \ -long time passes with an elevated risk of warming, its effects will be \ -all the more severe when it does occur.\ -") - -[extra_hut] -name = _("Minor Tribe Village") -rule_name = "Hut" -category = "Bonus" -causes = "Hut" -;rmcauses = "" -graphic = "tx.village" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range" - "TerrainClass", "Land", "Local" - } -helptext = _("\ -Villages (also called \"huts\") are primitive communities spread \ -across the world at the beginning of the game. Any land unit can enter \ -a village, making the village disappear and deliver a random response. \ -If the village proves hostile, it could produce barbarians or the unit \ -entering may simply be destroyed. If they are friendly, the player \ -could receive gold, a new technology, a military unit (occasionally a \ -settler; and sometimes a unit that the player cannot yet create), or \ -even a new city.\ -"), _("\ -Later in the game, helicopters may also enter villages, but overflight \ -by other aircraft will cause the villagers to take fright and disband.\ -") - -[extra_farmland] -name = _("Farmland") -category = "Infra" -causes = "Irrigation" -rmcauses = "Pillage" -graphic = "tx.farmland" -graphic_alt = "-" -activity_gfx = "unit.farmland" -act_gfx_alt = "unit.irrigation" -act_gfx_alt2 = "unit.irrigate" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range" - "Tech", "Refrigeration", "Player" - "Extra", "Irrigation", "Local" - } -build_time = 0 -removal_time = 0 -conflicts = "Mine", "Oil Well" -helptext = _("\ -Once Refrigeration is known, irrigation systems can be upgraded to \ -farmland by irrigating them a second time; if the city working the tile \ -has a Supermarket, a farmland tile provides twice as much food.\ -"), _("\ -Like irrigation, farmland is incompatible with mines and oil wells.\ -") - -[extra_fallout] -name = _("Fallout") -category = "Nuisance" -causes = "Fallout" -rmcauses = "CleanFallout" -graphic = "tx.fallout" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "unit.fallout" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "TerrainFlag", "NoPollution", "Local", FALSE, TRUE - } -removal_time = 0 -flags = "NuclearWinter" -helptext = _("\ -Nuclear fallout can appear on land tiles when a Nuclear unit is \ -detonated. It halves all output from its tile.\ -"), _("\ -Every tile with nuclear fallout also increases the risk of global \ -nuclear winter. If nuclear winter occurs, land across the globe \ -changes into desert, tundra, and ice, and lakes and oceans freeze.\ -"), _("\ -Settlers, Workers, and Engineers can clean up nuclear fallout.\ -") - -[extra_fortress] -name = _("Fortress") -category = "Infra" -causes = "Base" -rmcauses = "Pillage" -graphic = "base.fortress" -graphic_alt = "-" -activity_gfx = "unit.fortress" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Construction", "Player", TRUE, FALSE - "TerrainClass", "Land", "Local", TRUE, FALSE - "UnitFlag", "CanFortress", "Local", TRUE, FALSE - "CityTile", "Center", "Local", FALSE, TRUE - } -build_time = 3 -removal_time = 0 -defense_bonus = 100 -native_to = "Land", "LandAirSea", "LandNoKill", "Helicopter", "Balloon" -flags = "Refuel", "NoStackDeath" -helptext = _("\ -Fortresses improve defense for land units outside cities. Among other \ -effects, a land unit remaining in a fortress for a whole turn without \ -moving recovers a quarter of its hit points. With Invention, fortresses \ -gain watchtowers from which land units can see further afield.\ -"), _("\ -Diplomatic units get a 25% defense bonus in diplomatic fights.\ -") - -[extra_airbase] -name = _("Airbase") -category = "Infra" -causes = "Base" -rmcauses = "Pillage" -graphic = "base.airbase" -graphic_alt = "-" -activity_gfx = "unit.airbase" -act_gfx_alt = "unit.fortress" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Radio", "Player", TRUE, FALSE - "TerrainClass", "Land", "Local", TRUE, FALSE - "UnitFlag", "Airbase", "Local", TRUE, FALSE - "CityTile", "Center", "Local", FALSE, TRUE - } -build_time = 3 -removal_time = 0 -native_to = "Air", "Balloon", "Helicopter", "Missile", "AirProtect", "AirPillage" -flags = "Refuel", "NoStackDeath" -helptext = _("\ -Airbases allow your air units to land and refuel outside cities. \ -Air units in an airbase may be attacked by land units.\ -"), _("\ -Units can paradrop from this tile.\ -") - -[extra_buoy] -name = _("Buoy") -category = "Infra" -causes = "Base" -rmcauses = "Pillage" -graphic = "base.buoy" -graphic_alt = "base.fortress" -activity_gfx = "unit.buoy" -act_gfx_alt = "unit.fortress" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Radio", "Player", TRUE, FALSE - "TerrainClass", "Oceanic", "Local", TRUE, FALSE - "UnitFlag", "Airbase", "Local", TRUE, FALSE - "CityTile", "Center", "Local", FALSE, TRUE - } -build_time = 3 -removal_time = 0 -flags = "ShowFlag" -helptext = _("\ -Buoys may be built in the ocean (by units on a sea-going vessel) to \ -allow their owner to see the surrounding tiles.\ -") - -[extra_ruins] -name = _("Ruins") -category = "Bonus" -;causes = "" -rmcauses = "Pillage" -graphic = "extra.ruins" -graphic_alt = "base.ruins" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "TerrainClass", "Land", "Local", TRUE, FALSE - "CityTile", "Center", "Local", FALSE, TRUE - } -buildable = FALSE -removal_time = 0 -flags = "TerrChangeRemoves" -helptext = _("\ -Ruins mark the former site of a city that was destroyed or abandoned. \ -They have no effect on gameplay.\ -") - -[extra_road] -name = _("Road") -category = "Infra" -causes = "Road" -rmcauses = "Pillage" -graphic = "road.road" -graphic_alt = "-" -activity_gfx = "unit.road" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range" - "UnitFlag", "CanRoad", "Local" - "TerrainClass", "Land", "Local" - } -build_time = 0 -removal_time = 0 -native_to = "Land", "LandNoKill", "LandAirSea" -hidden_by = "Railroad", "Maglev" -flags = "AutoOnCityCenter" -bridged_over = "River" -helptext = _("\ -Roads allow your land units to move more quickly, and on some terrain,\ - also provide a trade bonus.\ -"), _("\ -Building roads on river tiles requires knowledge of Bridge Building.\ - City center tiles automatically get roads (unless they are on a river\ - tile and you do not yet know Bridge Building).\ -") - -[extra_railroad] -name = _("Railroad") -category = "Infra" -causes = "Road" -rmcauses = "Pillage" -graphic = "road.rail" -graphic_alt = "-" -activity_gfx = "unit.rail" -act_gfx_alt = "unit.road" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range" - "Tech", "Railroad", "Player" - "Extra", "Road", "Local" - "UnitFlag", "CanRoad", "Local" - "TerrainClass", "Land", "Local" - } -build_time = 3 -removal_time = 0 -native_to = "Land", "LandNoKill", "LandAirSea" -hidden_by = "Maglev" -flags = "AutoOnCityCenter" -bridged_over = "River" -helptext = _("\ -Once you learn Railroad technology, you may upgrade your roads to\ - railroads. Units travel three times faster along railroads than\ - along roads.\ -"), _("\ -A railroad also increases any shield resources produced by a tile.\ - A tile whose road is upgraded to a railroad retains any trade bonus\ - from the road as well.\ -"), _("\ -City center tiles with roads are automatically upgraded to railroads\ - when you learn the Railroad technology.\ -") - -[extra_maglev] -name = _("Maglev") -category = "Infra" -causes = "Road" -rmcauses = "Pillage" -graphic = "road.maglev" -graphic_alt = "road.rail" -activity_gfx = "unit.maglev" -act_gfx_alt = "unit.road" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Superconductors", "Player", TRUE, FALSE -; "Extra", "Railroad", "Local", TRUE, FALSE - "UnitFlag", "CanRoad", "Local", TRUE, FALSE -; "UnitClass", "Sea", "Local", FALSE, TRUE -; "TerrainClass", "Land", "Local", TRUE, FALSE - } -build_time = 3 -removal_time = 0 -native_to = "Land", "LandNoKill", "LandAirSea" -flags = "NativeTile", "AutoOnCityCenter" -helptext = _("\ -With Superconductors, you may build MAGnetic LEVitation tracks\ - on your railroad routes. Land units expend no movement points\ - when riding a maglev; you may ride indefinitely.\ -"), _("\ -City center tiles with railroads are automatically upgraded to MagLev\ - when you learn about Superconductors.\ -") - -[extra_river] -name = _("River") -category = "Infra" ;TEST for well-digger -causes = "Road" -;rmcauses = "" -graphic = "road.river" -graphic_alt = "-" -activity_gfx = "unit.canal" -act_gfx_alt = "unit.oil_mine" -act_gfx_alt2 = "unit.road" -rmact_gfx = "None" -rmact_gfx_alt = "-" -buildable = TRUE -generated = TRUE -defense_bonus = 50 -reqs = - { "type", "name", "range", "present" - "TerrainClass", "Land", "Local", TRUE - "Tech", "Pottery", "Player", FALSE - "UnitFlag", "Well-Digger", "Local", TRUE - } -build_time = 2 -removal_time = 0 -flags = "NativeTile" -native_to = "Land", "LandNoKill", "LandAirSea", "Trireme", "RiverShip" -helptext = _("\ -Any land terrain type may have a River on it. A River adds 1\ - trade to the resources produced by that tile. It also increases a tile's\ - defense factor by 50%. Finally, land units may move along a River (but\ - not diagonally) for fast travel.\ -"), _("\ -Roads, railroads and MagLev can only be built on River tiles if your\ - civilization has learned Bridge Building technology.\ -") - -[extra_canal] -name = _("Canal") -category = "Infra" -causes = "Road" -rmcauses = "Pillage" -graphic = "road.canal" -graphic_alt = "road.river" -activity_gfx = "unit.canal" -act_gfx_alt = "unit.convert" -act_gfx_alt2 = "unit.airstrip" -rmact_gfx = "None" -rmact_gfx_alt = "-" -generated = FALSE -reqs = - { "type", "name", "range", "present" - "TerrainFlag", "Low Land", "Local", TRUE - "TerrainClass", "Oceanic", "Adjacent", TRUE - "Tech", "Engineering", "Player", TRUE - "UnitFlag", "Settlers", "Local", TRUE - } -build_time = 10 -removal_time = 0 -native_to = "Trireme", "Sea", "RiverShip", "Land", "LandAirSea", "LandNoKill", "Helicopter", "Submarine" -flags = "NativeTile" -helptext = _("\ -Canals allow ships to travel through land tiles. Canals can be built on \ -low land tiles only, and not far inland.\ -") - -[extra_gold] -name = _("Gold") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.gold" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_iron] -name = _("Iron") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.iron" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_game] -name = _("?animals:Game") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.tundra_game" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_furs] -name = _("Furs") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.furs" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_coal] -name = _("Coal") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.coal" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_fish] -name = _("Fish") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.fish" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_fruit] -name = _("Fruit") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.fruit" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_gems] -name = _("Gems") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.gems" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_buffalo] -name = _("Buffalo") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.buffalo" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_wheat] -name = _("Wheat") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.wheat" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_oasis] -name = _("Oasis") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.oasis" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_peat] -name = _("Peat") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.peat" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_pheasant] -name = _("Pheasant") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.pheasant" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_bonus] -name = _("Resources") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.grassland_resources" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_ivory] -name = _("Ivory") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.arctic_ivory" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_silk] -name = _("Silk") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.silk" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_spice] -name = _("Spice") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.spice" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_whales] -name = _("Whales") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.whales" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_wine] -name = _("Wine") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.wine" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_oil] -name = _("Oil") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.oil" -graphic_alt = "-" -act_gfx_alt2 = "-" -activity_gfx = "None" -act_gfx_alt = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -; /* <-- avoid gettext warnings -; -; Base types: -; -; extra = name of the extra this base section is part of -; (must have "Base" in its causes) -; gui_type = How gui should handle this base. -; Value can be "Fortress", "Airbase", or "Other" -; border_sq = Base will claim land ownership up to this radius, -; -1 to disable. If enabled, base cannot exist in city tile. -; vision_main_sq = Base will have main layer vision to this radius -; vision_invis_sq = Base will have invisible layer vision to this radius -; vision_subs_sq = Base will have subsurface layer vision to this radius -; flags -; - "NoAggressive" = Units inside are not considered aggressive if there`s -; friendly city within 3 tiles -; -; */ <-- avoid gettext warnings - -[base_fortress] -extra = "Fortress" -gui_type = "Fortress" -border_sq = 5 -flags = "NoAggressive" - -[base_airbase] -extra = "Airbase" -gui_type = "Airbase" - -[base_buoy] -extra = "Buoy" -gui_type = "Fortress" -vision_main_sq = 5 - -; /* <-- avoid gettext warnings -; -; Road types: -; -; extra = name of the extra this road section is part of -; (must have "Road" in its causes) -; first_reqs = additional requirements to build the first part of -; the road, when none of the adjacent tiles have any -; integrating roads (see effects.ruleset and -; README.effects for help on requirements) -; move_cost = how much movement it takes to travel -; via this road (in fractional move points, as -; defined by move_fragments) -; -1 means that road provides no speed bonus. -; move_mode = how movement costs are applied -; - "Cardinal" = Road cost applies only on cardinal moves -; - "Relaxed" = Road cost is normal for cardinal, double for diagonal moves -; - "FastAlways" = Road cost applies always between two tiles with the roads -; (default) -; food_incr_const = food production added to tile regardless of terrain -; shield_incr_const = shield production added to tile regardless of -; terrain -; trade_incr_const = trade production added to tile regardless of -; terrain -; food_incr = food production added to tile; multiplied by -; terrain-specific road_food_incr_pct -; shield_incr = shield production added to tile; multiplied by -; terrain-specific road_shield_incr_pct -; trade_incr = trade production added to tile; multiplied by -; terrain-specific road_trade_incr_pct -; food_bonus = percent added to food production -; shield_bonus = percent added to shield production -; trade_bonus = percent added to trade production -; In summary, output bonuses from roads are given by the formula: -; (base_prod + roads.incr_const + roads.incr*terrain.incr_pct) * roads.bonus -; compat_special = what kind of pre-2.5 special this road corresponds -; to, if any: "Road", "Railroad", "River", or "None". -; Used for UI and loading old savegames -; integrates = list of road types that are suitable next steps -; for travel from this road type -; flags -; - "River" = Automatically generated by map generator, always -; flowing from land tiles to ocean -; - "UnrestrictedInfra" = Use of the enemy owned road is not restricted -; even if server setting 'restrictinfra' is set -; - "JumpFrom" = Move to a tile nativity providing "JumpTo" -; road is considered native -; - "JumpTo" = Move from a tile nativity providing "JumpFrom" -; road is considered native -; -; */ <-- avoid gettext warnings - -[road_road] -extra = "Road" -move_cost = 3 -food_incr = 0 -shield_incr = 0 -trade_incr = 1 -food_bonus = 0 -shield_bonus = 0 -trade_bonus = 0 -compat_special = "Road" -flags = "UnrestrictedInfra" - -[road_railroad] -extra = "Railroad" -move_cost = 1 -food_incr = 0 -shield_incr = 0 -trade_incr = 0 -food_bonus = 0 -shield_bonus = 50 -trade_bonus = 0 -compat_special = "Railroad" - -[road_maglev] -extra = "Maglev" -move_cost = 0 -food_incr = 0 -shield_incr = 0 -trade_incr = 0 -food_bonus = 0 -shield_bonus = 0 -trade_bonus = 0 - -[road_river] -extra = "River" -move_cost = 3 -move_mode = "Cardinal" -trade_incr_const = 1 -compat_special = "River" -flags = "River", "UnrestrictedInfra" - -[road_canal] -extra = "Canal" -move_cost = 9 -move_mode = "Cardinal" -food_incr_const = 0 -shield_incr_const = 0 -trade_incr_const = 0 -food_incr = 0 -shield_incr = 0 -trade_incr = 0 -food_bonus = 0 -shield_bonus = 0 -trade_bonus = 0 -compat_special = "None" diff --git a/freeciv/freeciv/data/.historic/mp2-May2019-historic/units.ruleset b/freeciv/freeciv/data/.historic/mp2-May2019-historic/units.ruleset deleted file mode 100644 index edd64ba42..000000000 --- a/freeciv/freeciv/data/.historic/mp2-May2019-historic/units.ruleset +++ /dev/null @@ -1,3272 +0,0 @@ -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes, -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. -; -; You should sort role units from worst to better, as often the best -; available role unit of a given sort will be picked by choosing -; the first available (not obsolete) such unit, or by picking the last -; such unit directly. When determining starting units, the first -; unit with the relevant role that the player can build will be chosen. -; If no such unit can be found (eg Explorers that require Seafaring), -; then the first unit with this role will be chosen. - -[datafile] -description="Unit definitions for the Multiplayer-Evo ruleset." -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -[control] -; Names for custom unit type flags. There can be up to 45 of these. -; name = rule name; In some circumstances user may see this -; as part of some sentences, so try to make it descriptive -; and sensible. -; helptxt = displayed in the help for unit types with this flag (optional) -flags = - { "name", "helptxt" - _("Airbase") - _("Transform") - _("CanRoad") - _("CanFortress") - _("Bombarder") - _("AirAttacker"), _("AEGIS Cruiser has 3x defense against this unit.") - _("Horse"), _("Attack value halved when attacking Pikemen.\ Knights defend at 3 when attacked by this unit.") - _("FootSoldier"), _("Knights defend at 2 when attacked by this unit.") - _("Helicopter"), _("Defends very badly against Fighters.") - _("Submarine"), _("Attack value reduced against some ships.") - _("Unbribable") - _("HelpWonder") - _("Capturer"), _("Can capture some enemy units.") - _("Capturable"), _("Can be captured by some enemy units.") - _("Cities") - _("AddToCity") - _("Nuclear") - _("Well-Digger"), _("Can dig a well and irrigate tiles with no water.") - _("Infra"), _("Can build infrastructure.") - _("Paratroopers"), _("Can be paradropped from a friendly city or suitable base.") - _("Marines"), _("Can launch attack from non-native tiles.") - _("Expellable"), _("Can be peacefully expelled from foreign tiles.") - _("AirProtector"), _("Is Unreachable AND can protect its tile from units unable to attack this unit.") - _("CantReachAir"), _("Unable to attack air units.") - ; _("NeverProtects"), _("Does not protect other units on its tile.") ; UNCOMMENT THIS IF NOT USING SCL'S PATCH FOR THIS FLAG - } - -; Names for custom unit class flags. There can be up to 8 of these. -; name = rule name; In some circumstances user may see this -; as part of some sentences, so try to make it descriptive -; and sensible. -; helptxt = displayed in the help for unit types belonging to a class -; with this flag (optional) -class_flags = - { "name", "helptxt" - _("Airliftable"), _("Can be airlifted if it has remaining moves.") - _("BorderPolice"), _("Can peacefully expel certain foreign units.") - _("AttFromNonNative"), _("Can launch attack from non-native tiles.") - } - -[veteran_system] -; What are the names of the levels? -veteran_names = _("green"), _("veteran"), _("hardened"), _("elite"), _("crack"), _("master"), _("champion") - -; The percentage chance of increasing level through combat -veteran_raise_chance = 50, 33, 20, 15, 15, 15, 0 - -; The percentage chance of a settler/engineer increasing level through -; performing useful work (per turn) -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 - -; Power factors are as a percentage. -; +50% is represented by 150 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 - -; The additional number of movement points granted for different veteran -; levels. These are fractional move points as defined by move_fragments in -; terrain.ruleset. -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 - -; /* <-- avoid gettext warnings -; -; Unit classes -; The number can be variable, up to 32 -; When adding new classes, remember to check effects.ruleset also. -; Eg. if you divide class 'Land' to two separate classes, you may -; want add effect giving City Walls defence bonus against new class -; too. -; -; The actual tag used (the * in [unitclass_*]) does not matter, except -; it must be unique within this file, and it may be used in debug -; output when reading this file. -; -; ** Fields ** -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; -; if not present, "name" is used for this purpose too. -; Since the name used in savegames must not change, if -; you want to rename an item after a ruleset has been -; released, you should set "rule_name" to the original -; value of "name". -; min_speed = Minimum speed after damage and effects (whole movement points) -; hp_loss_pct = Hitpoints lost each turn if unit not in city or native base -; non_native_def_pct = Defense power percentage applying when defending on -; non-native terrain (such as ship in harbour) -; hut_behavior = What happens to huts when unit enters tile: -; "Normal", "Nothing", or "Frighten" -; flags = List of unit class flags (from the following list; you -; cannot add custom unit class flags) -; helptext = optional help text string; should escape all raw newlines -; so that xgettext parsing works -; -; ** Unit class Flags ** -; -; "TerrainSpeed" = Unit Class uses terrain specific speed -; "TerrainDefense" = Unit Class gains defense bonus from terrain -; "DamageSlows" = Damaged units are slowed down -; "CanOccupyCity" = Military units of this class can occupy enemy cities -; "Missile" = Unit Class is destroyed when it attacks -; "BuildAnywhere" = Unit Class can be built even in the middle of non-native terrain -; "Unreachable" = Unit Class can be attacked only by units explicitly listing this -; class in its 'targets', unless on a city or native base. -; For class members which are transports, cargo cannot load/ -; unload except in a city or native base, unless that unit -; explicitly lists this class in its 'embarks'/'disembarks'. -; "CollectRansom" = Unit Class can collect ransom when killing lone barbarian leader -; "ZOC" = Unit Class is subject to ZOC rules. Unit type flag "IgZOC" can -; override this -; "CanFortify" = Unit can fortify at land tiles. Unit type flag -; "Cant_Fortify" can override this -; "CanPillage" = Unit Class can pillage tile infrastructure -; "DoesntOccupyTile" = Even if this class of enemy unit is on tile, cities can -; still work that tile -; "AttackNonNative" = Unit Class can attack units on non-native tiles. Unit type -; flag "Only_Native_Attack" can override this -; "AttFromNonNative" = Unit Class can launch attack from non-native tile (against -; native one) -; This applies for both attacking from transport or -; cities. If only some unit types of the class should -; get this property, use type flag "Marines" -; "KillCitizen" = Upon successful attack against a city, unit kills one -; citizen. The effect "Unit_No_Lose_Pop" and the server -; setting 'killcitizen' can disable this. - -; "Airliftable" = This Unit Class may be airlifted -; */ <-- avoid gettext warnings - -[unitclass_missile] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Missile") -min_speed = 1 -hp_loss_pct = 0 -hut_behavior = "Frighten" -flags = "Missile", "Unreachable", "DoesntOccupyTile", "Airliftable" - -; missile flag not class, indicates suicide explosion and possibly other things. -[unitclass_bomb] -name = _("?unitclass:Bomb") -min_speed = 1 -hp_loss_pct = 0 -hut_behavior = "Frighten" -flags = "Unreachable", "DoesntOccupyTile", "Airliftable" - -[unitclass_land] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Land") -min_speed = 1 -hp_loss_pct = 0 -flags = "TerrainSpeed", "DamageSlows", "CanOccupyCity", "BuildAnywhere", - "CollectRansom", "ZOC", "CanFortify", "CanPillage", - "TerrainDefense", "KillCitizen", "Airliftable", "BorderPolice" -helptext = _("\ - * Can be airlifted from a suitable city.\ -") - -[unitclass_landnokill] -name = _("?unitclass:LandNoKill") -min_speed = 1 -hp_loss_pct = 0 -flags = "TerrainSpeed", "DamageSlows", "CanOccupyCity", "BuildAnywhere", - "CollectRansom", "ZOC", "CanFortify", "CanPillage", - "TerrainDefense", "Airliftable", "BorderPolice" -helptext = _("\ - * Does not reduce population when attacking city.\ -") - -;Land units that are multipurpose for land/air/sea attacks (i.e., anti-aircraft, marines) -;include "Unreachable" in the targets for individual units -[unitclass_landairsea] -name = _("?unitclass:LandAirSea") -min_speed = 1 -hp_loss_pct = 0 -flags = "TerrainSpeed", "DamageSlows", "CanOccupyCity", "BuildAnywhere", - "CollectRansom", "ZOC", "CanFortify", "CanPillage", - "TerrainDefense", "KillCitizen", "Airliftable", - "AttackNonNative", "AttFromNonNative", "BorderPolice" -helptext = _("\ - * Can attack air and sea targets.\ -") - -[unitclass_sea] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Sea") -min_speed = 2 -hp_loss_pct = 0 -flags = "DamageSlows", "AttackNonNative", "AttFromNonNative", "CanPillage" - -; Separating the Submarine class finally allows it to be unreachable by Air. The old Submarine was -; far too offensively overpowered while simultaneously almost useless from ultra-vulnerability to Air units. -; Because it is now Unreachable, any unit able to attack it needs this class in its targets. -[unitclass_submarine] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Submarine") -min_speed = 2 -hp_loss_pct = 0 -flags = "DamageSlows", "AttackNonNative", "AttFromNonNative", "CanPillage", "Unreachable" - -[unitclass_trireme] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Trireme") -min_speed = 2 -hp_loss_pct = 0 -flags = "DamageSlows", "AttFromNonNative" - -[unitclass_rivership] -; /* Extra class providing ability to travel rivers */ -name = _("?unitclass:RiverShip") -min_speed = 2 -hp_loss_pct = 0 -flags = "DamageSlows", "AttackNonNative", "AttFromNonNative" - -[unitclass_heli] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Helicopter") -min_speed = 1 -hp_loss_pct = 10 -flags = "Unreachable", "CanOccupyCity", "CollectRansom", "Airliftable" - -; This class is for air units that are unreachable but do not protect a stack. -[unitclass_air] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Air") -min_speed = 1 -hp_loss_pct = 0 -hut_behavior = "Frighten" -flags = "Unreachable", "DoesntOccupyTile", "Airliftable" - -; This class is for air units that can pillage terrain (i.e. Jet Bomber) -[unitclass_airpillage] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:AirPillage") -min_speed = 1 -hp_loss_pct = 0 -hut_behavior = "Frighten" -flags = "Unreachable", "DoesntOccupyTile", "Airliftable", "CanPillage" - -; This class is for air units that can also protect a stack. -; (Fighters) -- technically a separate AirProtect class is not needed, but -; Fighters also have Border Police abilities, and a separate class -; facilitates future adjustments and balancing in an isolated class. -[unitclass_air_protect] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:AirProtect") -min_speed = 1 -hp_loss_pct = 0 -hut_behavior = "Frighten" -flags = "Unreachable", "DoesntOccupyTile", "Airliftable", "BorderPolice" - -[unitclass_balloon] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Balloon") -min_speed = 1 -hp_loss_pct = 0 -hut_behavior = "Frighten" -flags = "Unreachable", "DoesntOccupyTile", "Airliftable" - - -; /* <-- avoid gettext warnings -; -; Below: The individual unit types, one per section. -; -; The number can be variable, up to 200. -; However for the "official" rulesets, units should not be removed -; because that would break backward compatability with savegames. -; -; The order here matters: later units are considered "better" for -; a given flag or role. -; -; The actual tag used (the * in [unit_*]) does not matter, except -; it must be unique within this file, and it may be used in debug -; output when reading this file. -; -; ** Fields ** -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; if -; not present, "name" is used for this purpose too. Since -; the name used in savegames must not change, if you want -; to rename an item after a ruleset has been released, you -; should set "rule_name" to the original value of "name". -; graphic = tag specifying preferred graphic -; graphic_alt = tag for alternate graphic if preferred graphic is not -; present; especially if preferred graphic is non-standard, -; this should be a standard tag. Otherwise can use eg "-" -; for no alternate graphic. -; tech_req = required advance, names from techs.ruleset, or special: -; "None" => available from start -; impr_req = required city improvement, names from buildings.ruleset -; gov_req = required government, names from governments.ruleset -; obsolete_by = can be upgraded to and made obsolete by another unit by name -; build_cost = production shields required to build -; pop_cost = population removed from city when built; for 'Join City' -; units this is also the population added to the destination -; attack = base attack strength (0 = cannot attack) -; defense = base defense strength (0 = cannot defend) -; hitpoints = how much damage unit can withstand -; firepower = number of hitpoints removed per round of combat; at least 1 -; move_rate = base move rate (whole movement points) -; vision_radius_sq = base vision of unit: unit can see tile up to the square -; root of this value away -; convert_to = can be converted to another type of unit by name -; convert_time = number of movement points it takes to convert to -; another unit type -; class = One of the classes listed above -; transport_cap = Number of units (ground, or air/missiles, depending on flags) -; fuel = Number of turns unit can spend outside refuel points. -; If more time passes without unit refueling over turn change, -; they are lost. If this is zero, unit has no need to refuel -; Units with "Coast" flag set consider any tile next to coast -; refuel point -; uk_* = upkeep costs, these are used as base values in the game -; cargo = Unit classes this unit can transport -; city_slots = How many of homecity's unit maintenance slots unit takes -; city_size = Initial size of the cities built by 'Found City' type units -; (but 'Join City' uses pop_cost) -; targets = list of unit classes this unit can attack against even -; if they have Unreachable unit class flag -; embarks = list of unit classes this unit may load into while not in -; native base or city even if transporter has Unreachable unit -; class flag -; disembarks = list of unit classes this unit may unload from while not in -; native base or city even if transporter has Unreachable unit -; class flag -; vision_layer = At which layer this unit is visible; "Main", "Stealth", -; or "Subsurface" -; bonuses = definitions of combat bonuses against specific other units -; bonuses.flag = flag of the unit that bonus applies against -; bonuses.type = type of the bonus. See below -; bonuses.value = value of the bonus. Sum of these is used if multiple apply. -; bonuses.quiet = don't auto generate help text for this bonus. Use this if -; the bonus is documented in the unit type's help text. -; This is useful when the combination of a unit's bonuses -; becomes complex enough to make the auto generated help -; ugly or inaccurate. -; flags = special flag strings; list of built-in flags described below -; and/or user flags defined above -; -; veteran_names = Special veteran level for this unit. See the definitions in -; game.ruleset. All of the veteran_* entries have to have the -; same length! -; veteran_raise_chance = -; veteran_work_raise_chance = -; veteran_power_fact = -; veteran_move_bonus = -; -; roles = special role strings -; sound_move = optional sound effect when the unit moves -; sound_move_alt = optional alternative sound effect if above not -; supported in client -; sound_fight = optional sound effect when the unit fights -; sound_fight_alt = optional alternative sound effect if above not -; supported in client -; helptext = optional help text string; should escape all raw newlines -; so that xgettext parsing works -; -; -; ** Bonuses ** -; -; "DefenseMultiplier" = Multiply defense value (1 + 'value') times. -; Value of 1 means multiplication by 2, value 2 by 3... -; Bonus is defined in defenders entry. -; "DefenseDivider" = Divide defense value with (1 + 'value'). -; Bonus is defined in attackers entry. -; "FirePower1" = Defender firepower is reduced to value 1 when -; ever this has non-zero value. -; Bonus is defined in attackers entry. -; -; -; ** Flags ** -; -; "IgZOC" = ignore Zones of Control (ZOC) even if unit class has -; "ZOC" flag -; "HasNoZOC" = unit has no Zone of Control (ZOC), thus any unit can move -; around it freely -; "NonMil" = a non-military unit: no attacks; no martial law; can enter -; peaceful borders; DoesntOccupyTile -; "IgTer" = use constant move cost defined in igter_cost (terrain.ruleset) -; rather than terrain/road etc cost, unless terrain cost is -; less -; "OneAttack" = can only make a single attack, regardless of movement points -; "FieldUnit" = cause unhappiness even when not being aggressive -; "BeachLander" = won't lose all its movement when moving from non-native -; terrain to native terrain even if slow_invasions is on. -; "Settlers" = can irrigate and build roads -; "Diplomat" = can defend against diplomat actions (see diplchance -; server option) -; "Spy" = strong in diplomatic battles. _Must_ be "Diplomat" also -; "CoastStrict" = (sea only) cannot leave coast -; "Coast" = (sea only) can refuel on coast. Set fuel to force unit -; to regularly end turn on coast -; "Only_Native_Attack" = cannot attack targets on non-native tiles even if -; unit class can -; "Cant_Fortify" = cannot fortify even if unit class has "CanFortify" flag -; "Fanatic" = can only be built by governments that allow them -; (see civ2/governments.ruleset, Fundamentalism government) -; "Unique" = a player can only have one of these units in the game at -; the same time; barbarians cannot use this at present -; "GameLoss" = losing one of these units means you lose the game, but it -; is produced without homecity and upkeep -; "EvacuateFirst" = the game will try to rescue units with this flag before -; it tries to rescue units without it when their transport -; is destroyed. Think of the Birkenhead drill ("women and -; children first"). Replace "women and children" with -; "units with the EvacuateFirst unit type flag". -; "SuperSpy" = this unit always wins diplomatic contests, that is, unless -; it encounters another SuperSpy, in which case defender wins; -; can also be used on non-diplomat units, in which case it can -; protect cities from diplomats; also 100% spy survival chance -; "NoHome" = this unit has no homecity and will be free of all upkeep, and -; therefore will not revolt along with its city of origin should -; it be incited -; "NoVeteran" = this unit cannot gain veteran levels through experience -; (as if both raise_chance and work_raise_chance were zero); -; it can still gain veterancy through Veteran_Build, etc -; "CityBuster" = this unit has double firepower against cities -; "NoBuild" = this unit cannot be built -; "BadWallAttacker" = the firepower of this unit is set to 1 if -; attacking a city -; defended by a city wall (or other city building defense) -; "BadCityDefender" = if attacked while in a city, firepower is set to 1 -; and firepower of attacker is doubled (the Pearl Harbour -; rule) -; "BarbarianOnly" = only barbarians can build this unit -; "Shield2Gold" = Switch from shield upkeep to gold upkeep possible -; "NewCityGamesOnly" = unit can't be built on scenarios where founding new cities -; is not allowed. Give this flag to units that would make no sense -; to have in a game with such a scenario -; "CanEscape" = this unit has, given that certain conditions are -; fulfilled, a 50% chance to escape rather than being -; killed when killstack is enabled and the defender of its -; tile is defeated. The conditions are that it has more move -; points than required to move to an adjacent tile plus the -; attackers move points and that the attacker doesn't have -; the "CanKillEscaping" unit type flag. -; "CanKillEscaping" = an attack from this unit ignores the "CanEscape" unit -; type flag. -; "Provoking" = a unit considering to auto attack this unit will choose to -; do so even if has better odds when defending against it -; then when attacking it. Applies when the autoattack server -; setting is enabled. -; "NeverProtects" = doesn't protect reachable units on its tile from enemy -; attackers, even if the unreachableprotects server setting -; is enabled and the unit class is unreachable -; -; Following actions require extra fields: -; "Attack" -; attack = base attack strength -; "Bombard" -; attack = base attack strength -; bombard_rate = the number of shots fired at enemy units when attacking -; "Join City" -; pop_cost = the number of population added to the target city -; "Paradrop Unit" -; paratroopers_range = the maximal range the unit can be paradropped to. -; Max range is 65534. -; paratroopers_mr_req = the move rate which is required at least for -; paradropping (whole movement points) -; paratroopers_mr_sub = the move rate which is subtracted after paradropping -; (whole movement points) -; "Upgrade Unit" -; obsolete_by = the unit type upgraded to. -; "Convert Unit" -; convert_to = the unit type converted to. -; -; ** Roles ** -; -; "FirstBuild" = first to be built when city founded -; "Explorer" = unit to use for exploring -; "Hut" = can be found in a hut -; "HutTech" = can be found in a hut, but its techs required -; "Partisan" = can be created as a partisan (only one unit can have this -; flag), see end of this file for its tech requirements option -; "DefendOk" = AI hint: ok for defending with -; "DefendGood" = AI hint: good for defending with -; "Ferryboat" = AI hint: useful for ferrying -; "Barbarian" = can be created as land barbarian -; "BarbarianTech" = can be created as land barbarian, if someone has -; researched its tech requirements -; "BarbarianBoat" = can be created as boat for sea barbarian -; "BarbarianBuild" = can be built by barbarians -; "BarbarianBuildTech" = can be built by barbarians if someone has -; researched its tech requirements -; "BarbarianLeader" = this unit is the barbarian leader (only one) -; "BarbarianSea" = can be created as a barbarian that disembarks from a barbarian boat -; "BarbarianSeaTech" = can be created as a barbarian that disembarks from a barbarian boat -; if someone has researched its tech requirements -; "Settlers" = can irrigate and build roads -; "Hunter" = AI hint: good for hunting other units -; "CitiesStartUnit" = Gets granted as 'c' startunit -; "WorkerStartUnit" = Gets granted as 'w' startunit -; "ExplorerStartUnit" = Gets granted as 'x' startunit -; "KingStartUnit" = Gets granted as 'k' startunit -; "DiplomatStartUnit" = Gets granted as 's' startunit -; "FerryStartUnit" = Gets granted as 'f' startunit -; "DefendOkStartUnit" = Gets granted as 'd' startunit -; "DefendGoodStartUnit" = Gets granted as 'D' startunit -; "AttackFastStartUnit" = Gets granted as 'a' startunit -; "AttackStrongStartUnit" = Gets granted as 'A' startunit -; -; */ <-- avoid gettext warnings - -[unit_settlers] -name = _("Settlers") -class = "Land" -tech_req = "None" -obsolete_by = "None" -graphic = "u.settlers" -graphic_alt = "-" -sound_move = "m_settlers" -sound_move_alt = "m_generic" -sound_fight = "f_settlers" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 1 -attack = 0 -defense = 1 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 1 -uk_food = 1 -uk_gold = 0 -flags = "Settlers", "Infra", "CanRoad", "CanFortress", "NonMil", "HasNoZOC", "AddToCity", "Cities", "Cant_Fortify", "Expellable" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "CitiesStartUnit" -helptext = _("\ -Settlers are a key unit: they are your only\ - means of founding new cities.\ -"), _("\ -Settlers can perform most of the terrain alterations as\ - Workers (but cannot build Airbases or Buoys).\ -"), _("\ -Upkeep for Settlers costs food as well as production. A Settler\ - can die if its supporting city runs out of food. Settlers in a\ - Republic or Democracy require twice as much food per turn, and\ - three times as much in Fundamentalism.\ -") - -;A unique patch unit to provide fair starts regardless of lack of nearby water. -;to make as a start unit, use the letter "a": for example, cccwwwxxa -[unit_welldigger] -name = _("Well-Digger") -class = "Land" -tech_req = "None" -obsolete_by = "Workers" -graphic = "u.well_digger" -graphic_alt = "u.migrants" -sound_move = "m_worker" -sound_move_alt = "m_generic" -sound_fight = "f_worker" -sound_fight_alt = "f_generic" -build_cost = 5 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 3 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 5 -uk_food = 2 -uk_gold = 2 -flags = "Settlers", "Infra", "NonMil", "HasNoZOC", "Cant_Fortify", "Unique", "Well-Digger", "Expellable" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "AttackFastStartUnit" ;this role taken over for well-digger -helptext = _("\ -THE WELL-DIGGER'S ONLY PURPOSE IS TO FIX A BAD START WITH NO NEARBY\ - WATER. As a unique unit, you can only make one. This unit\ - can 'dig a well' to irrigate any Low Land tile INSIDE your borders,\ - but only before you know Alphabet or Pottery. Upkeep\ - is 2F+5P+2G. (Despotism has 3 Upkeep free per city.)\ -"), _("\ -TIP: If you lack nearby water, make a Well-Digger in a city that can\ - support 2 food and 2 shields upkeep. Irrigate a tile or two, then disband to avoid\ - costly upkeep.\ -"), _("\ -FURTHER HELP: \ - A Well-Digger can irrigate any Low-Land tile (not Hills or Mountains), or dig a well\ - (a river) on any tile. To dig a well simply instruct the well-digger to \ - Build Road. (You will know if it succeeded if the activity icon resembles\ - a shovel.) A Despotic city will need at least +2 Food and +2 Production\ - to support a Well-Digger. THE WELL-DIGGER WILL NOT WORK IF: 1) He is outside your borders.\ - 2) He dies off from the city not having enough surplus for his upkeep, 3) You discovered\ - Alphabet or Pottery. This is not a careless unit to fool around with. It requires careful\ - thought and is carefully designed to only be useful to a nation with no water, in its first\ - turns of existence.\ -") - -[unit_worker] -name = _("?unit:Workers") -class = "Land" -tech_req = "Pottery" -obsolete_by = "Engineers" -graphic = "u.worker" -graphic_alt = "u.engineers" ; for compatibility -sound_move = "m_worker" -sound_move_alt = "m_generic" -sound_fight = "f_worker" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "Settlers", "Infra", "CanRoad", "CanFortress", "NonMil", "HasNoZOC", "Airbase", "Cant_Fortify", "Capturable", "Expellable" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "Settlers", "WorkerStartUnit" -helptext = _("\ -Workers can improve terrain tiles. See the help on \ -Terrain and Terrain Alterations for details.\ -"), _("\ -After discovering Engineering, Workers can build Canals. After \ -discovering Construction, Workers can build Fortresses and Oil Wells. \ -Workers can build Airbases and Buoys, which Settlers cannot. \ -Workers must be on board a ship to build Buoys.\ -") - -[unit_engineers] -name = _("Engineers") -class = "Land" -tech_req = "Explosives" -obsolete_by = "None" -graphic = "u.engineers" -graphic_alt = "-" -sound_move = "m_engineers" -sound_move_alt = "m_generic" -sound_fight = "f_engineers" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 0 -defense = 2 -hitpoints = 20 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "Settlers", "Infra", "CanRoad", "CanFortress", "NonMil", "HasNoZOC", "Transform", "Airbase", "Cant_Fortify", "Expellable" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "Settlers", "WorkerStartUnit" -helptext = _("\ -Engineers are similar to Workers, but move and work twice as\ - fast. Unlike Workers, Engineers can perform terrain Transformation,\ - such as converting Desert to Plains,\ - or Ocean to Swamp (when on a ship on an Ocean tile\ - which borders enough existing land). See the\ - Terrain Alterations section for more details.\ - After discovering Engineering, this unit can build canals.\ -"), _("\ -TIP 1: Upgrade Workers to Engineers when possible.\ -"), _("\ -TIP 2: If you manage to build Leonardo's Workshop, research\ - Explosives before the Workshop becomes obsolete, so that\ - your Workers will get upgraded for free.\ -") - -[unit_warriors] -name = _("Warriors") -class = "Land" -tech_req = "None" -obsolete_by = "Pikemen" -graphic = "u.warriors" -graphic_alt = "-" -sound_move = "m_warriors" -sound_move_alt = "m_generic" -sound_fight = "f_warriors" -sound_fight_alt = "f_generic" -build_cost = 10 -pop_cost = 0 -attack = 1 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "FootSoldier", "CantReachAir" -roles = "DefendOk", "DefendOkStartUnit", "FirstBuild" -helptext = _("\ -This unit may be built from the start of the game. It is the\ - weakest offensive unit.\ -") - -[unit_phalanx] -name = _("Phalanx") -class = "Land" -tech_req = "Bronze Working" -obsolete_by = "Pikemen" -graphic = "u.phalanx" -graphic_alt = "-" -sound_move = "m_phalanx" -sound_move_alt = "m_generic" -sound_fight = "f_phalanx" -sound_fight_alt = "f_generic" -build_cost = 20 -pop_cost = 0 -attack = 1 -defense = 2 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "FootSoldier", "CantReachAir" -roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild" -helptext = _("\ -The Phalanx is armored infantry, suitable for defending your cities.\ -") - -[unit_archers] -name = _("Archers") -class = "Land" -tech_req = "Warrior Code" -obsolete_by = "Musketeers" -graphic = "u.archers" -graphic_alt = "-" -sound_move = "m_archers" -sound_move_alt = "m_generic" -sound_fight = "f_archers" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 3 -defense = 2 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "FootSoldier", "Capturer","CantReachAir" -roles = "DefendOk", "DefendOkStartUnit" -helptext = _("\ -Archers fight with bows and arrows and have a good offensive\ - value as well as decent defense.\ -") - -[unit_legion] -name = _("Legion") -class = "Land" -tech_req = "Iron Working" -obsolete_by = "Musketeers" -graphic = "u.legion" -graphic_alt = "-" -sound_move = "m_legion" -sound_move_alt = "m_generic" -sound_fight = "f_legion" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 4 -defense = 2 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "FootSoldier", "Settlers", "Infra", "CanRoad", "CanFortress", "Capturer", "CantReachAir" -roles = "DefendOk", "DefendOkStartUnit", "Hut", "BarbarianBuild", "BarbarianSea" -helptext = _("\ -Legions are heavily armed and well disciplined infantry\ - units with an excellent offensive value.\ -") - -[unit_pikemen] -name = _("Pikemen") -class = "Land" -tech_req = "Feudalism" -obsolete_by = "Musketeers" -graphic = "u.pikemen" -graphic_alt = "-" -sound_move = "m_pikemen" -sound_move_alt = "m_generic" -sound_fight = "f_pikemen" -sound_fight_alt = "f_generic" -build_cost = 20 -pop_cost = 0 -attack = 1 -defense = 2 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -bonuses = - { "flag", "type", "value" - "Horse", "DefenseMultiplier", 1 - } -flags = "FootSoldier", "CantReachAir" -roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild" -helptext = _("\ -Equipped with long pikes and a 2x defence bonus against\ - mounted units, Pikemen replace the Phalanx as the\ - preferred city defender.\ -") - -[unit_musketeers] -name = _("Musketeers") -class = "Land" -tech_req = "Gunpowder" -obsolete_by = "Riflemen" -graphic = "u.musketeers" -graphic_alt = "-" -sound_move = "m_musketeers" -sound_move_alt = "m_generic" -sound_fight = "f_musketeers" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 3 -defense = 3 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "FootSoldier", "Capturer", "CantReachAir" -roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild", "HutTech", - "BarbarianTech", "BarbarianBuildTech", "BarbarianSeaTech" -helptext = _("\ -Musketeers are infantry equipped with early\ - firearms and replace Pikemen as the preferred\ - city defender, and replace Archers and Legions\ - for offensive foot soldiers.\ -") - -[unit_fanatics] -name = _("Fanatics") -class = "Land" -tech_req = "Fundamentalism" -gov_req = "Fundamentalism" -obsolete_by = "None" -graphic = "u.fanatics" -graphic_alt = "-" -sound_move = "m_fanatics" -sound_move_alt = "m_generic" -sound_fight = "f_fanatics" -sound_fight_alt = "f_generic" -build_cost = 20 -pop_cost = 0 -attack = 4 -defense = 4 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -flags = "Fanatic", "FootSoldier", "Capturer", "CantReachAir" -roles = "DefendGood", "DefendGoodStartUnit" -helptext = _("\ -Fanatics are warriors extremely devoted to a higher cause.\ -"), _("\ -Fundamentalist nations can maintain Fanatic units without\ - having to pay any shields for upkeep.\ -") - -[unit_partisan] -name = _("Partisan") -class = "Land" -tech_req = "Guerilla Warfare" -obsolete_by = "None" -graphic = "u.partisan" -graphic_alt = "-" -sound_move = "m_partisan" -sound_move_alt = "m_generic" -sound_fight = "f_partisan" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 4 -defense = 4 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -flags = "IgTer", "IgZOC", "NoHome", "FootSoldier", "Capturer", "CantReachAir" -roles = "DefendGood", "DefendGoodStartUnit", "Partisan", "BarbarianTech" -helptext = _("\ -Partisans are guerilla fighters who are experts\ - at using the terrain to their advantage. Like the Explorer\ - that they upgrade, they can slip through ZOC and live off\ - the land with no upkeep.\ -"), _("\ -A number of Partisans are granted free when an enemy conquers your\ - city -- they automatically assume defensive positions in the\ - surrounding countryside -- but only under these conditions:\n\ - - Guerilla Warfare must be known by at least one player.\n\ - - You must be the player who originally built the city.\n\ - - You must know about Communism and Gunpowder.\n\ - - You must run either a Democracy or a Communist government.\ -") - -[unit_alpine_troops] -name = _("Alpine Troops") -class = "Land" -tech_req = "Tactics" -obsolete_by = "None" -graphic = "u.alpine_troops" -graphic_alt = "-" -sound_move = "m_alpine_troops" -sound_move_alt = "m_generic" -sound_fight = "f_alpine_troops" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 5 -defense = 5 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -flags = "IgTer", "FootSoldier", "Capturer", "CantReachAir" -roles = "DefendGood", "DefendGoodStartUnit" -helptext = _("\ -Alpine Troops are highly mobile units as well as\ - excellent defenders. Similar to an Explorer, they\ - treat every land tile as if it had a road on it.\ -") - -[unit_riflemen] -name = _("Riflemen") -class = "Land" -tech_req = "Conscription" -obsolete_by = "None" -graphic = "u.riflemen" -graphic_alt = "-" -sound_move = "m_riflemen" -sound_move_alt = "m_generic" -sound_fight = "f_riflemen" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 5 -defense = 4 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -flags = "FootSoldier", "Capturer", "CantReachAir" -roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild" -helptext = _("\ -Riflemen are World War-era infantry, very good\ - at defending your cities, and with decent attack\ - capabilities.\ -") - -[unit_marines] -name = _("Marines") -class = "LandAirSea" -tech_req = "Amphibious Warfare" -obsolete_by = "None" -graphic = "u.marines" -graphic_alt = "-" -sound_move = "m_marines" -sound_move_alt = "m_generic" -sound_fight = "f_marines" -sound_fight_alt = "f_generic" -build_cost = 60 -pop_cost = 0 -attack = 8 -defense = 5 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 8 ; hard-coded the +4 extra for effect_physics_vision since it's a pre-req anyway -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter", "Land", "Sea" -disembarks = "Helicopter", "Land", "Sea" -targets = "Sea", "Air", "AirProtect", "Balloon", "Helicopter" -flags = "Marines", "FootSoldier", "BeachLander", "Capturer" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:Ranger"), - _("?vet_rank:Commando"), - _("?vet_rank:Green Beret"), - _("?vet_rank:Navy SEAL") -veteran_raise_chance = 60, 50, 40, 30, 20, 15, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 250, 300, 350, 400 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "DefendOk", "DefendOkStartUnit", "BarbarianSeaTech" -helptext = _("\ -Marines are infantry who are experts at amphibious war. \ -They are the most capable foot unit in the game and are \ -heavily armed with a variety of powerful weaponry. \ -"), _("\ -Marines can attack any Land, Air, or Sea unit from anywhere, \ -including from Transports and Helicopters. Marines promoted \ -to three veteran levels and beyond become commandos suitable for \ -special ops.\ -") - -[unit_paratroopers] -name = _("Paratroopers") -class = "Land" -tech_req = "Combined Arms" -obsolete_by = "None" -graphic = "u.paratroopers" -graphic_alt = "-" -sound_move = "m_paratroopers" -sound_move_alt = "m_generic" -sound_fight = "f_paratroopers" -sound_fight_alt = "f_generic" -build_cost = 60 -pop_cost = 0 -attack = 6 -defense = 4 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -flags = "Paratroopers", "FootSoldier", "Capturer", "CantReachAir" -roles = "DefendOk", "DefendOkStartUnit" -helptext = _("\ -Paratroopers are experts at airborne attacks. \ -From a friendly city or airbase, Paratroopers who have not expended any \ -movement points can paradrop directly to any tile in range, and be \ -immediately ready to act there. (Beware dropping into unseen territory, \ -as Paratroopers landing on a tile occupied by enemy units are easy \ -targets!)\ -") -paratroopers_range = 14 -paratroopers_mr_req = 1 -paratroopers_mr_sub = 0 - -[unit_mech_inf] -name = _("Mech. Inf.") -class = "Land" -tech_req = "Labor Union" -obsolete_by = "None" -graphic = "u.mech_inf" -graphic_alt = "-" -sound_move = "m_mech_inf" -sound_move_alt = "m_generic" -sound_fight = "f_mech_inf" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 6 -defense = 6 -hitpoints = 30 -firepower = 1 -move_rate = 6 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -flags = "CantReachAir" -roles = "DefendGood", "DefendGoodStartUnit" -helptext = _("\ -The Mechanized Infantry has the strongest defensive strength\ - of any land unit, decent attack strength for open field - engagements, and excellent mobility.\ -") - -[unit_horsemen] -name = _("Horsemen") -class = "Land" -tech_req = "Horseback Riding" -obsolete_by = "Knights" -graphic = "u.horsemen" -graphic_alt = "-" -sound_move = "m_horsemen" -sound_move_alt = "m_generic" -sound_fight = "f_horsemen" -sound_fight_alt = "f_generic" -build_cost = 20 -pop_cost = 0 -attack = 2 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "Horse", "CantReachAir" -roles = "AttackFastStartUnit", "Hut", "Barbarian", "Hunter" -helptext = _("\ -Horsemen are mounted warriors and an early\ - shock-troop that can penetrate deep into\ - enemy territory.\ -") - -[unit_chariot] -name = _("Chariot") -class = "Land" -tech_req = "The Wheel" -obsolete_by = "Knights" -graphic = "u.chariot" -graphic_alt = "-" -sound_move = "m_chariot" -sound_move_alt = "m_generic" -sound_fight = "f_chariot" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 3 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "Horse", "Capturer", "CantReachAir" -roles = "AttackFastStartUnit", "Hut", "Hunter" -helptext = _("\ -Chariots are horse-pulled war wagons, stronger\ - but more expensive than horsemen.\ -") - -[unit_elephants] -name = _("Elephants") -class = "Land" -tech_req = "Polytheism" -obsolete_by = "Crusaders" -graphic = "u.elephants" -graphic_alt = "-" -sound_move = "m_elephants" -sound_move_alt = "m_generic" -sound_fight = "f_elephants" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 4 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "Horse", "Capturer", "CantReachAir" -roles = "AttackFastStartUnit" -helptext = _("\ -Elephants are towering animals trained for war that are often used as\ - powerful shock troops, but defend poorly against most other units.\ -") - -[unit_crusaders] -name = _("Crusaders") -class = "Land" -tech_req = "Monotheism" -obsolete_by = "Dragoons" -graphic = "u.crusaders" -graphic_alt = "-" -sound_move = "m_crusaders" -sound_move_alt = "m_generic" -sound_fight = "f_crusaders" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 5 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "Horse", "Capturer", "CantReachAir" -roles = "AttackFastStartUnit" -helptext = _("\ -Crusaders are highly disciplined mounted\ - warriors driven by a higher cause.\ -") - -[unit_knights] -name = _("Knights") -class = "LandNoKill" -tech_req = "Chivalry" -obsolete_by = "Dragoons" -graphic = "u.knights" -graphic_alt = "-" -sound_move = "m_knights" -sound_move_alt = "m_generic" -sound_fight = "f_knights" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 4 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -bonuses = - { "flag", "type", "value" - "Horse", "DefenseMultiplier", 2 - "FootSoldier", "DefenseMultiplier", 1 - } -flags = "Horse", "Capturer", "CantReachAir" -roles = "AttackFastStartUnit", "HutTech", "BarbarianTech", - "BarbarianBuildTech", "BarbarianSeaTech", "Hunter" -helptext = _("\ -Knights are mounted and heavily armored warriors. They defend at \ -D:3 against mounted units. They defend at D:2 against \ -foot soldier units. They defend at D:1 against everything \ -else. Their noble status allows them to attack cities without population reduction.\ -") - -[unit_dragoons] -name = _("Dragoons") -class = "Land" -tech_req = "Leadership" -obsolete_by = "Cavalry" -graphic = "u.dragoons" -graphic_alt = "-" -sound_move = "m_dragoons" -sound_move_alt = "m_generic" -sound_fight = "f_dragoons" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 5 -defense = 2 -hitpoints = 20 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "Horse", "Capturer", "CantReachAir" -roles = "AttackFastStartUnit", "BarbarianBuildTech", "BarbarianSeaTech", "Hunter" -helptext = _("\ -Dragoons are mounted warriors carrying early firearms.\ - Being the first highly mobile gunpowder unit, they are\ - formidable for offensive campaigns.\ -") - -[unit_cavalry] -name = _("Cavalry") -class = "Land" -tech_req = "Tactics" -obsolete_by = "Armor" -graphic = "u.cavalry" -graphic_alt = "-" -sound_move = "m_cavalry" -sound_move_alt = "m_generic" -sound_fight = "f_cavalry" -sound_fight_alt = "f_generic" -build_cost = 60 -pop_cost = 0 -attack = 8 -defense = 3 -hitpoints = 20 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -flags = "Capturer", "CantReachAir" -roles = "AttackFastStartUnit", "Hunter" -helptext = _("\ -Cavalry are mounted and highly trained soldiers.\ -") - -[unit_armor] -name = _("Armor") -class = "Land" -tech_req = "Mobile Warfare" -obsolete_by = "None" -graphic = "u.armor" -graphic_alt = "-" -sound_move = "m_armor" -sound_move_alt = "m_generic" -sound_fight = "f_armor" -sound_fight_alt = "f_generic" -build_cost = 80 -pop_cost = 0 -attack = 10 -defense = 5 -hitpoints = 30 -firepower = 1 -move_rate = 6 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -flags = "CantReachAir" -roles = "AttackFastStartUnit", "Hunter" -helptext = _("\ -Armors are motorized war wagons that are faster,\ - stronger, and can take more damage than any\ - mounted unit.\ -") - -[unit_catapult] -name = _("Catapult") -class = "Land" -tech_req = "Mathematics" -obsolete_by = "Cannon" -graphic = "u.catapult" -graphic_alt = "-" -sound_move = "m_catapult" -sound_move_alt = "m_generic" -sound_fight = "f_catapult" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 6 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "CantReachAir" -roles = "AttackStrongStartUnit" -helptext = _("\ -Catapults are large rock-throwing machines of war.\ - They are very strong attackers but equally weak\ - defenders and will need an escort to be effective.\ -") - -[unit_cannon] -name = _("Cannon") -class = "Land" -tech_req = "Metallurgy" -obsolete_by = "Artillery" -graphic = "u.cannon" -graphic_alt = "-" -sound_move = "m_cannon" -sound_move_alt = "m_generic" -sound_fight = "f_cannon" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 8 -defense = 1 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "CantReachAir" -roles = "AttackStrongStartUnit", "BarbarianTech", "BarbarianBuildTech" -helptext = _("\ -Cannons are large firearms that can fire heavy\ - projectiles over long distances. They are very\ - strong attackers but equally weak defenders and\ - will need an escort to be effective.\ -") - -[unit_artillery] -name = _("Artillery") -class = "Land" -tech_req = "Machine Tools" -obsolete_by = "Howitzer" -graphic = "u.artillery" -graphic_alt = "-" -sound_move = "m_artillery" -sound_move_alt = "m_generic" -sound_fight = "f_artillery" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 10 -defense = 1 -hitpoints = 20 -firepower = 2 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -flags = "CantReachAir" -roles = "AttackStrongStartUnit" -helptext = _("\ -The artillery is an upgraded cannon. It is a very\ - strong attacker but equally weak defender and\ - will need an escort to be effective.\ -") - -[unit_anti_aircraft] -name = _("Anti-Aircraft Artillery") -class = "LandAirSea" -tech_req = "Flight" -obsolete_by = "None" -graphic = "u.anti_aircraft" -graphic_alt = "u.howitzer" -sound_move = "m_howitzer" -sound_move_alt = "m_generic" -sound_fight = "f_howitzer" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 1 -defense = 1 -hitpoints = 20 -firepower = 2 -move_rate = 2 -vision_radius_sq = 8; hard-coding in physics bonus here since its a req, lets us cut making a new effect -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter" -disembarks = "Helicopter" -targets = "Air", "AirProtect", "AirPillage", "Sea", "Balloon", "Helicopter" -bonuses = - { "flag", "type", "value" - "AirAttacker", "DefenseDivider", 2 - "AirAttacker", "DefenseMultiplier", 3 - } -flags = "" -roles = "" -helptext = _("\ -Anti-Aircraft Artillery (AAA) are light-weight\ - guns which can attack anything from anywhere.\ - They are primarily used to give ground units a\ - better chance of defending against aircraft.\ - Against Air units they have 3x attack and 4x\ - defence.\ -") - -[unit_howitzer] -name = _("Howitzer") -class = "Land" -tech_req = "Robotics" -obsolete_by = "None" -graphic = "u.howitzer_o" -graphic_alt = "u.howitzer" -sound_move = "m_howitzer" -sound_move_alt = "m_generic" -sound_fight = "f_howitzer" -sound_fight_alt = "f_generic" -build_cost = 70 -pop_cost = 0 -attack = 12 -defense = 2 -hitpoints = 30 -firepower = 2 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -flags = "CantReachAir" -roles = "AttackStrongStartUnit" -helptext = _("\ -Howitzers are upgraded artillery with improved\ - defensive as well as offensive capabilities.\ - They can shoot over city walls, ignoring their effect.\ -") - -[unit_balloon] -name = _("Balloon") -class = "Balloon" -tech_req = "Chemistry" -obsolete_by = "None" -graphic = "u.balloon" -graphic_alt = "u.trireme" -sound_move = "m_trireme" -sound_move_alt = "m_generic" -sound_fight = "f_warrior" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 0 -defense = 0 -hitpoints = 10 -firepower = 1 -move_rate = 5 -vision_radius_sq = 15 -transport_cap = 0 -fuel = 2 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "Unbribable", "HasNoZOC", "NeverProtects", "NonMil" -roles = "" -helptext = _("\ -Balloons are the first air unit. They are excellent for\ - scouting. They have great vision and are unreachable by\ - units prior to Riflemen and Ironclads. Balloons can't\ - travel over mountains. They may remain in the air for one\ - extra turn before needing to land in a city, fortress, or\ - airbase. Though this unit is unreachable by more primitive\ - land and sea units, it does not prevent them from attacking\ - other units on the same tile.\ -") - -[unit_fighter] -name = _("Fighter") -class = "AirProtect" -tech_req = "Flight" -obsolete_by = "Jet Fighter" -graphic = "u.fighter" -graphic_alt = "-" -sound_move = "m_fighter" -sound_move_alt = "m_generic" -sound_fight = "f_fighter" -sound_fight_alt = "f_generic" -build_cost = 60 -pop_cost = 0 -attack = 4 -defense = 3 -hitpoints = 20 -firepower = 2 -move_rate = 20 -vision_radius_sq = 12 -transport_cap = 0 -fuel = 1 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Air", "AirProtect", "AirPillage", "Missile", "Balloon", "Helicopter" -bonuses = - { "flag", "type", "value" - "Helicopter", "DefenseDivider", 1 - "Helicopter", "Firepower1", 1 - "Marines", "DefenseMultiplier", 1 - } -flags = "AirAttacker", "Unbribable", "HasNoZOC", "CanEscape", "AirProtector" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -Fighters are your first offensive Air units. They can\ - move anywhere and attack any unit (except Submarines.)\ -") - -[unit_escort_fighter] -name = _("Escort Fighter") -class = "AirProtect" -tech_req = "Radio" -obsolete_by = "Jet Fighter" -graphic = "u.escort_fighter" -graphic_alt = "u.fighter" -sound_move = "m_fighter" -sound_move_alt = "m_generic" -sound_fight = "f_fighter" -sound_fight_alt = "f_generic" -build_cost = 80 -pop_cost = 0 -attack = 3 -defense = 5 -hitpoints = 20 -firepower = 2 -move_rate = 18 -vision_radius_sq = 12 -transport_cap = 0 -fuel = 2 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Air", "AirProtect", "AirPillage", "Missile", "Balloon", "Helicopter" -bonuses = - { "flag", "type", "value" - "Helicopter", "DefenseDivider", 1 - "Helicopter", "Firepower1", 1 - "Marines", "DefenseMultiplier", 1 - } -flags = "AirAttacker", "Unbribable", "HasNoZOC", "CanEscape", "AirProtector" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 50, 33, 20, 15, 15, 15, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -Escort Fighters are larger and carry more fuel for\ - escorting bombers, and they can absorb more damage.\ - Less maneuverable, they don't attack as well as standard\ - fighters, but they can return home on the next turn.\ -") - -[unit_medium_bomber] -name = _("Medium Bomber") -class = "Air" -tech_req = "Radio" -obsolete_by = "Jet Bomber" -graphic = "u.medium_bomber" -graphic_alt = "u.bomber" -sound_move = "m_bomber" -sound_move_alt = "m_generic" -sound_fight = "f_bomber" -sound_fight_alt = "f_generic" -build_cost = 85 -pop_cost = 0 -attack = 6 -defense = 2 -hitpoints = 20 -firepower = 2 -move_rate = 13 -vision_radius_sq = 12 -transport_cap = 0 -fuel = 2 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon" -bonuses = - { "flag", "type", "value" - "Marines", "DefenseMultiplier", 2 - } -flags = "FieldUnit", "Unbribable", "AirAttacker", "HasNoZOC", "CanEscape", "CantReachAir", "NeverProtects" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -Medium Bombers are specialized airborne units that are good for\ - eliminating moderately strong ground targets, or multiple weaker \ - targets with multiple attacks. They may not attack other airborne units.\ -"), _("\ -TIP: Getting bombed is very noticeable to an enemy, and taken very\ - seriously. Make sure you choose targets far from air defences,\ - or be sure to bring adequate escort protection.\ -") - -[unit_bomber] -name = _("Heavy Bomber") -class = "Air" -tech_req = "Advanced Flight" -obsolete_by = "Jet Bomber" -graphic = "u.heavy_bomber_o" -graphic_alt = "u.bomber" -sound_move = "m_bomber" -sound_move_alt = "m_generic" -sound_fight = "f_bomber" -sound_fight_alt = "f_generic" -build_cost = 120 -pop_cost = 0 -attack = 12 -defense = 3 -hitpoints = 20 -firepower = 2 -move_rate = 16 -vision_radius_sq = 12 -transport_cap = 1 -fuel = 2 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon" -cargo = "Bomb" -bonuses = - { "flag", "type", "value" - "Marines", "DefenseMultiplier", 2 - } -flags = "FieldUnit", "Unbribable", "AirAttacker", "HasNoZOC", "CanEscape", "CantReachAir", "NeverProtects" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -Heavy Bombers are specialized airborne units that are good for\ - eliminating strong and well-defended ground targets, or multiple\ - weaker targets with multiple attacks. They can't attack airborne units.\ - May carry one Bomb.\ -"), _("\ -TIP: Getting bombed is very noticeable to an enemy, and taken very\ - seriously. Make sure you choose targets far from any air defences,\ - or be sure to bring adequate escort protection.\ -") - -[unit_ultra_heavy_bomber] -name = _("Strategic Bomber") -class = "Air" -tech_req = "Rocketry" -obsolete_by = "Jet Bomber" -graphic = "u.ultra_heavy_bomber_o" -graphic_alt = "u.bomber" -sound_move = "m_bomber" -sound_move_alt = "m_generic" -sound_fight = "f_bomber" -sound_fight_alt = "f_generic" -build_cost = 135 -pop_cost = 0 -attack = 13 -defense = 4 -hitpoints = 20 -firepower = 2 -move_rate = 16 -vision_radius_sq = 12 -transport_cap = 2 -fuel = 3 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon" -cargo = "Bomb" -bombard_rate = 10 -bonuses = - { "flag", "type", "value" - "Marines", "DefenseMultiplier", 2 - } -flags = "FieldUnit", "Unbribable", "AirAttacker", "HasNoZOC", "CanEscape", "CantReachAir", "NeverProtects" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -The Strategic Bomber offers only slight improvement in attack, but higher altitude - offers considerable improvement in defense. Its most notable feature,\ - however, is its considerably greater range. May carry two Bombs.\ -"), _("\ -TIP: Getting bombed is very noticeable to an enemy, and taken very\ - seriously. Make sure you choose targets far from any air defences,\ - or be sure to bring adequate escort protection.\ -") - -[unit_awacs] -name = _("AWACS") -class = "Air" -tech_req = "Advanced Flight" -obsolete_by = "None" -graphic = "u.awacs" -graphic_alt = "u.bomber" ; backwards compatibility -sound_move = "m_awacs" -sound_move_alt = "m_generic" -sound_fight = "f_awacs" -sound_fight_alt = "f_generic" -build_cost = 140 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 20 -firepower = 1 -move_rate = 32 -vision_radius_sq = 46 -transport_cap = 0 -fuel = 2 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "HasNoZOC", "Unbribable", "Expellable", "NeverProtects" -roles = "" -helptext = _("\ -The AWACS (Airborne Warning and Control System) is an airplane with an \ -advanced radar that can determine the location of enemy units over a \ -wide area.\ -") - -[unit_helicopter] -; /* TRANS: unit type */ -name = _("Helicopter") -class = "Helicopter" -tech_req = "Combined Arms" -obsolete_by = "None" -graphic = "u.helicopter" -graphic_alt = "-" -sound_move = "m_helicopter" -sound_move_alt = "m_generic" -sound_fight = "f_helicopter" -sound_fight_alt = "f_generic" -build_cost = 100 -pop_cost = 0 -attack = 10 -defense = 5 -hitpoints = 20 -firepower = 2 -move_rate = 12 -vision_radius_sq = 12 -transport_cap = 1 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -cargo = "LandAirSea" -flags = "FieldUnit", "Helicopter", "AirAttacker", "Unbribable" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -The Helicopter is a very powerful unit, as it can fly far and attack \ - multiple targets, and even conquer cities. Be careful, because Helicopters lose\ - a small amount of health for every turn not spent in a city, fortress, airbase\ - or Carrier. Helicopters can be attacked by ground units from Riflemen onward.\ - They can be attacked by sea units from Ironclad onward.\ -"), _("\ -Helicopters can transport one Marines or AAA unit.\ -") - -[unit_jet_fighter] -name = _("Jet Fighter") -class = "AirProtect" -tech_req = "Space Flight" -obsolete_by = "None" -graphic = "u.jet_fighter" -graphic_alt = "u.stealth_fighter" -sound_move = "m_stealth_fighter" -sound_move_alt = "m_generic" -sound_fight = "f_stealth_fighter" -sound_fight_alt = "f_generic" -build_cost = 70 -pop_cost = 0 -attack = 6 -defense = 5 -hitpoints = 20 -firepower = 2 -move_rate = 24 -vision_radius_sq = 12 -transport_cap = 0 -fuel = 1 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Air", "AirProtect", "AirPillage", "Missile", "Balloon", "Helicopter" -bonuses = - { "flag", "type", "value" - "Helicopter", "DefenseDivider", 1 - "Helicopter", "Firepower1", 1 - "Marines", "DefenseMultiplier", 1 - } -flags = "AirAttacker", "Unbribable", "HasNoZOC", "CanEscape", "AirProtector" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -Jet Fighters upgrade the Fighter with improved attack and defense, plus a higher movement radius.\ -") - -[unit_jet_bomber] -name = _("Jet Bomber") -class = "AirPillage" -tech_req = "Space Flight" -obsolete_by = "None" -graphic = "u.jet_bomber_o" -graphic_alt = "u.bomber" -sound_move = "m_bomber" -sound_move_alt = "m_generic" -sound_fight = "f_bomber" -sound_fight_alt = "f_generic" -build_cost = 145 -pop_cost = 0 -attack = 15 -defense = 1 -hitpoints = 20 -firepower = 2 -move_rate = 19 -vision_radius_sq = 12 -transport_cap = 3 -fuel = 3 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -bonuses = - { "flag", "type", "value" - "Marines", "DefenseMultiplier", 6 - } -cargo = "Bomb" -flags = "FieldUnit", "Unbribable", "AirAttacker", "HasNoZOC", "CanEscape", "CantReachAir", "NeverProtects" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -Jet Bombers are high-altitude long-range air units that are good for\ - hitting distant targets. They can attack multiple targets per turn.\ - They have three turns of fuel, meaning they\ - can be airborne for two turn-changes. Their impressive range makes\ - them serviceable after more advanced Bombers become available.\ - Defenseless to Fighter types, they are difficult to safely escort,\ - and have challenges in finding safe flight paths.\ - Jet Bombers can carry very heavy payloads, allowing carpet-bombing to\ - pillage enemy tiles from the air.\ - May carry three Bombs.\ -"), _("\ -TIP: Getting bombed is very noticeable to an enemy, and taken very\ - seriously. Make sure you choose targets far from any air defences,\ - or be sure to bring adequate escort protection.\ -") - -[unit_stealth_fighter] -name = _("Stealth Fighter") -class = "AirProtect" -tech_req = "Stealth" -obsolete_by = "None" -graphic = "u.stealth_fighter" -graphic_alt = "-" -sound_move = "m_stealth_fighter" -sound_move_alt = "m_generic" -sound_fight = "f_stealth_fighter" -sound_fight_alt = "f_generic" -build_cost = 80 -pop_cost = 0 -attack = 8 -defense = 4 -hitpoints = 20 -firepower = 2 -move_rate = 28 -vision_radius_sq = 12 -transport_cap = 0 -fuel = 1 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Air", "AirProtect", "AirPillage", "Missile", "Balloon", "Helicopter" -bonuses = - { "flag", "type", "value" - "Helicopter", "DefenseDivider", 1 - "Helicopter", "Firepower1", 1 - "Marines", "DefenseMultiplier", 1 - } -vision_layer = "Stealth" -flags = "AirAttacker", "Unbribable", "HasNoZOC", "CanEscape", "AirProtector" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -An improved Fighter, with improved attack and a higher movement\ - radius. Stealth Fighters can't be seen unless directly adjacent\ - to an enemy.\ -") - -[unit_stealth_bomber] -name = _("Stealth Bomber") -class = "Air" -tech_req = "Stealth" -obsolete_by = "None" -graphic = "u.stealth_bomber_o" -graphic_alt = "u.stealth_bomber" -sound_move = "m_stealth_bomber" -sound_move_alt = "m_generic" -sound_fight = "f_stealth_bomber" -sound_fight_alt = "f_generic" -build_cost = 160 -pop_cost = 0 -attack = 18 -defense = 5 -hitpoints = 20 -firepower = 2 -move_rate = 24 -vision_radius_sq = 12 -transport_cap = 2 -fuel = 2 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon" -bonuses = - { "flag", "type", "value" - "Marines", "DefenseMultiplier", 2 - } -vision_layer = "Stealth" -cargo = "Bomb" -flags = "FieldUnit", "AirAttacker", - "HasNoZOC", "Unbribable", "CanEscape", "CantReachAir", "NeverProtects" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -The strongest Bomber, with improved attack and a higher movement\ - radius. Stealth Bombers can't be seen unless adjacent to an\ - enemy, and may slip through the air to return home on the same\ - turn. May carry two Bombs.\ -") - -[unit_trireme] -name = _("Trireme") -class = "Trireme" -tech_req = "Map Making" -obsolete_by = "Caravel" -graphic = "u.trireme" -graphic_alt = "-" -sound_move = "m_trireme" -sound_move_alt = "m_generic" -sound_fight = "f_trireme" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 1 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 6 -vision_radius_sq = 4 -transport_cap = 2 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea" -flags = "BadCityDefender", "Provoking", "CantReachAir" -roles = "Ferryboat", "FerryStartUnit" -helptext = _("\ -The Trireme is your first boat unit. It can act\ - as a transport ship and has rudimentary offensive\ - capabilities, but may not enter deep ocean tiles.\ - Triremes can travel on rivers.\ -") - -[unit_caravel] -name = _("Caravel") -class = "RiverShip" -tech_req = "Navigation" -obsolete_by = "Galleon" -graphic = "u.caravel" -graphic_alt = "-" -sound_move = "m_caravel" -sound_move_alt = "m_generic" -sound_fight = "f_caravel" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 2 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 6 -vision_radius_sq = 4 -transport_cap = 3 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea" -flags = "BadCityDefender", "Provoking", "CantReachAir" -roles = "Ferryboat", "FerryStartUnit", "BarbarianBoat" -helptext = _("\ -The Caravel replaces the Trireme and can enter\ - any ocean tile. Caravels can travel on rivers.\ -") - -[unit_galleon] -name = _("Galleon") -class = "RiverShip" -tech_req = "Magnetism" -obsolete_by = "Transport" -graphic = "u.galleon" -graphic_alt = "-" -sound_move = "m_galleon" -sound_move_alt = "m_generic" -sound_fight = "f_galleon" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 1 -defense = 2 -hitpoints = 20 -firepower = 1 -move_rate = 8 -vision_radius_sq = 4 -transport_cap = 4 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Submarine" -cargo = "Land", "LandNoKill", "LandAirSea" -flags = "BadCityDefender", "Provoking", "CanEscape", "CantReachAir" -roles = "Ferryboat", "FerryStartUnit", "BarbarianBoat" -helptext = _("\ -The Galleon is a lightly armed transport ship that can\ - carry up to 4 land units. Galleons can travel on rivers.\ -") - -[unit_frigate] -name = _("Frigate") -class = "RiverShip" -tech_req = "Magnetism" -obsolete_by = "Ironclad" -graphic = "u.frigate" -graphic_alt = "-" -sound_move = "m_frigate" -sound_move_alt = "m_generic" -sound_fight = "f_frigate" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 4 -defense = 2 -hitpoints = 20 -firepower = 1 -move_rate = 8 -vision_radius_sq = 4 -transport_cap = 2 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Submarine" -cargo = "Land", "LandNoKill", "LandAirSea" -bonuses = - { "flag", "type", "value" - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "Provoking", "CanEscape", "CantReachAir" -roles = "Hunter" -helptext = _("\ -The Frigate is a highly versatile boat unit,\ - that is both a strong offensive unit as well\ - as a decent transport ship. Frigates can travel\ - on rivers.\ -") - -[unit_ironclad] -name = _("Ironclad") -class = "Sea" -tech_req = "Steam Engine" -obsolete_by = "Destroyer" -graphic = "u.ironclad" -graphic_alt = "-" -sound_move = "m_ironclad" -sound_move_alt = "m_generic" -sound_fight = "f_ironclad" -sound_fight_alt = "f_generic" -build_cost = 60 -pop_cost = 0 -attack = 4 -defense = 4 -hitpoints = 30 -firepower = 1 -move_rate = 8 -vision_radius_sq = 8 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter" -bonuses = - { "flag", "type", "value" - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "CanEscape", "CantReachAir" -roles = "Hunter" -helptext = _("\ -The Ironclad is an armored ship that is\ - much more sturdy than the Frigate but\ - loses the transport capability and the\ - ability to navigate rivers.\ -") - -[unit_destroyer] -name = _("Destroyer") -class = "Sea" -tech_req = "Electricity" -obsolete_by = "Missile Destroyer" -graphic = "u.destroyer" -graphic_alt = "-" -sound_move = "m_destroyer" -sound_move_alt = "m_generic" -sound_fight = "f_destroyer" -sound_fight_alt = "f_generic" -build_cost = 60 -pop_cost = 0 -attack = 5 -defense = 5 -hitpoints = 30 -firepower = 1 -move_rate = 12 -vision_radius_sq = 15 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter" -bonuses = - { "flag", "type", "value" - "Submarine", "DefenseMultiplier", 3 - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "CanEscape", "CantReachAir" -roles = "Hunter" -helptext = _("\ -First of the modern ships to start building your modern navy.\ - Destroyers' main roles are fast scouting, seek-and-destroy,\ - anti-submarine warfare, shore bombardment of lighter targets,\ - and supporting the needs of larger fleets for those abilities.\ - 4x ASW defence gives a 35% chance defending vs Submarines.\ -"), _("\ -TIP: A very fast unit with good vision. Very useful for scouting\ - and hunting down enemy Transports and Submarines.\ -") - -[unit_cruiser] -name = _("Cruiser") -class = "Sea" -tech_req = "Steel" -obsolete_by = "AEGIS Cruiser" -graphic = "u.cruiser" -graphic_alt = "-" -sound_move = "m_cruiser" -sound_move_alt = "m_generic" -sound_fight = "f_cruiser" -sound_fight_alt = "f_generic" -build_cost = 80 -pop_cost = 0 -attack = 6 -defense = 6 -hitpoints = 30 -firepower = 2 -move_rate = 11 -vision_radius_sq = 13 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter" -bonuses = - { "flag", "type", "value" - "Submarine", "DefenseMultiplier", 1 - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "CanEscape", "CantReachAir" -roles = "DefendGood", "DefendGoodStartUnit" -helptext = _("\ -The Cruiser is a large surface warship with equally strong\ - offensive and defensive capabilities. 2x ASW defence\ - allows it to survive a single Submarine attack\ - more often than not.\ -"), _("\ -TIP: A Cruiser's main duties are offensive strikes against\ - lesser ships, and to absorb the first attack from most\ - attacking units. This lets Cruisers protect weaker ships.\ -") - -[unit_missile_destroyer] -name = _("Missile Destroyer") -class = "Sea" -tech_req = "Rocketry" -obsolete_by = "None" -graphic = "u.missile_destroyer" -graphic_alt = "u.destroyer" -sound_move = "m_destroyer" -sound_move_alt = "m_generic" -sound_fight = "f_destroyer" -sound_fight_alt = "f_generic" -build_cost = 60 -pop_cost = 0 -attack = 5 -defense = 5 -hitpoints = 30 -firepower = 2 -move_rate = 12 -vision_radius_sq = 16 -transport_cap = 1 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter" -cargo = "Missile" -bonuses = - { "flag", "type", "value" - "Submarine", "DefenseMultiplier", 1 - "Marines", "DefenseMultiplier", 1 - "AirAttacker", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "CanEscape", "CantReachAir" -roles = "Hunter" -helptext = _("\ -An modern Destroyer with more firepower. It shares all\ - the same roles as its ancestor.\ - 2x defence against Air and Missile units.\ - 2x ASW defence gives a 38% chance defending vs Submarines.\ - A Missile Destroyer may carry one Cruise Missile.\ -") - -[unit_aegis_cruiser] -name = _("AEGIS Cruiser") -class = "Sea" -tech_req = "Rocketry" -obsolete_by = "None" -graphic = "u.aegis_cruiser" -graphic_alt = "-" -sound_move = "m_aegis_cruiser" -sound_move_alt = "m_generic" -sound_fight = "f_aegis_cruiser" -sound_fight_alt = "f_generic" -build_cost = 100 -pop_cost = 0 -attack = 8 -defense = 8 -hitpoints = 30 -firepower = 2 -move_rate = 11 -vision_radius_sq = 19 -transport_cap = 2 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Air", "AirProtect", "AirPillage", "Missile", "Helicopter", "Balloon", "Submarine" -cargo = "Missile" -bonuses = - { "flag", "type", "value" - "AirAttacker", "DefenseMultiplier", 2 - "Submarine", "DefenseMultiplier", 1 - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "CanEscape" -roles = "DefendGood", "DefendGoodStartUnit" -helptext = _("\ -The AEGIS Cruiser is an upgraded Cruiser equipped with\ - an advanced missile system, advanced radar\ - and vision, and a 2x defense bonus against Submarines.\ - An AEGIS Cruiser may also carry two Cruise Missiles.\ -"), _("\ -TIP: This unit's vision and 3x anti-air defence are\ - excellent for scouting and for escorting other ships.\ -") - -[unit_battleship] -name = _("Battleship") -class = "Sea" -tech_req = "Refining" -obsolete_by = "None" -graphic = "u.battleship" -graphic_alt = "u.battleship" -sound_move = "m_battleship" -sound_move_alt = "m_generic" -sound_fight = "f_battleship" -sound_fight_alt = "f_generic" -build_cost = 160 -pop_cost = 0 -attack = 12 -defense = 12 -hitpoints = 40 -firepower = 2 -move_rate = 10 -vision_radius_sq = 12 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter" -bonuses = - { "flag", "type", "value" - "Submarine", "DefenseMultiplier", 1 - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "CanEscape", "CantReachAir" -roles = "" -helptext = _("\ -The Battleship is the supreme naval unit with\ - excellent offensive and defensive values. They\ - have a bonus defending against Submarines.\ -") - -[unit_submarine] -name = _("Submarine") -class = "Submarine" -tech_req = "Automobile" -obsolete_by = "None" -graphic = "u.submarine" -graphic_alt = "-" -sound_move = "m_submarine" -sound_move_alt = "m_generic" -sound_fight = "f_submarine" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 12 -defense = 2 -hitpoints = 28 -firepower = 2 -move_rate = 10 -vision_radius_sq = 12 -transport_cap = 8 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Submarine" -cargo = "Missile" -vision_layer = "Subsurface" -bonuses = - { "flag", "type", "value" - "Submarine", "DefenseMultiplier", 1 - } -flags = "NeverProtects", "BadCityDefender", "Provoking", "Only_Native_Attack", "Submarine", "CanEscape", "CantReachAir" -roles = "Hunter" -helptext = _("\ -Submarines have strong offensive power but weak\ - defense if caught off guard. They can carry Nuclear\ - and Cruise Missiles.\ -"), _("\ -TIP: Against stronger ships, Submarines enjoy superior\ - attrition rates when they attack in numbers. They are also\ - excellent at hit-and-run to scare away unwanted sea traffic.\ -") - -[unit_carrier] -name = _("Carrier") -class = "Sea" -tech_req = "Advanced Flight" -obsolete_by = "None" -graphic = "u.carrier" -graphic_alt = "-" -sound_move = "m_carrier" -sound_move_alt = "m_generic" -sound_fight = "f_carrier" -sound_fight_alt = "f_generic" -build_cost = 160 -pop_cost = 0 -attack = 1 -defense = 9 -hitpoints = 40 -firepower = 2 -move_rate = 10 -vision_radius_sq = 12 -transport_cap = 8 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter" -cargo = "Air", "AirProtect", "AirPillage", "Missile", "Helicopter", "Balloon", "LandAirSea" -bonuses = - { "flag", "type", "value" - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "Only_Native_Attack", "Provoking", "CanEscape", "CantReachAir" -roles = "" -helptext = _("\ -The Carrier is a mobile airport that can carry aircraft,\ - helicopters, balloons, AAA, marines, and missiles.\ -"), _("\ -TIP: Guard Carriers with a handful of fast-moving ships and a\ - battleship, as losing a fully-equipped Carrier is VERY\ - painful and expensive.\ -") - -[unit_transport] -name = _("Transport") -class = "Sea" -tech_req = "Industrialization" -obsolete_by = "None" -graphic = "u.transport" -graphic_alt = "-" -sound_move = "m_transport" -sound_move_alt = "m_generic" -sound_fight = "f_transport" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 0 -defense = 3 -hitpoints = 30 -firepower = 1 -move_rate = 10 -vision_radius_sq = 12 -transport_cap = 8 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea" -bonuses = - { "flag", "type", "value" - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "Provoking", "CanEscape" -roles = "Ferryboat", "FerryStartUnit" -helptext = _("\ -The Transport cannot attack on its own but\ - may defend itself when under attack.\ - Marines and Anti-Aircraft Artillery can\ - directly attack from a Transport.\ -") - -[unit_cruise_missile] -name = _("Cruise Missile") -class = "Missile" -tech_req = "Rocketry" -obsolete_by = "None" -graphic = "u.cruise_missile" -graphic_alt = "-" -sound_move = "m_cruise_missile" -sound_move_alt = "m_generic" -sound_fight = "f_cruise_missile" -sound_fight_alt = "f_generic" -build_cost = 60 -pop_cost = 0 -attack = 18 -defense = 0 -hitpoints = 10 -firepower = 3 -move_rate = 24 -vision_radius_sq = 2 -transport_cap = 0 -fuel = 1 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -flags = "FieldUnit", "OneAttack", "AirAttacker", "HasNoZOC", "Unbribable", "CantReachAir" -roles = "" -helptext = _("\ -The Cruise Missile is a long-distance missile\ - that can strike deep into enemy territory.\ -"), _("\ -TIP: A handful of these can successfully keep the waters around\ - your treasured homeland free of enemy ships.\ -") - -[unit_atom_bomb] -name = _("Atom Bomb") -class = "Bomb" -tech_req = "Nuclear Fission" -obsolete_by = "None" -graphic = "u.atom_bomb" -graphic_alt = "-" -sound_move = "m_nuclear" -sound_move_alt = "m_generic" -sound_fight = "f_nuclear" -sound_fight_alt = "f_generic" -build_cost = 150 -pop_cost = 0 -attack = 99 -defense = 0 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 0 -transport_cap = 0 -fuel = 1 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -disembarks = "Air", "AirPillage" -flags = "FieldUnit", "OneAttack", "Nuclear", "HasNoZOC", "Unbribable", "AirAttacker" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "" -helptext = _("\ -You can build Atom Bombs when you have Nuclear Fission, and\ - the Manhattan Project wonder has been built by any player.\ -"), _("\ -Careful logistics are needed for a Bomber to drop an Atom Bomb and survive the\ - blast. A Bomber may 'drop' the bomb within two tiles of\ - its location. First, 'drop' the bomb by making it leave the aircraft\ - to an adjacent tile. Next, fly the Bomber out of range. Finally, attack\ - the target or execute a Detonate command by pressing D twice.\ - On impact, the blast will destroy any unit in an area 3 tiles wide\ - (3x3 squares for rectangular grids), including friendly units.\ - Any city within the blast area loses half its population, and\ - land tiles within the blast area are subject to nuclear fallout.\ -"), _("\ -Nuclear fallout reduces tile output and increases the risk of global\ - nuclear winter; see the help on Fallout.\ -") - -[unit_nuclear] -name = _("Nuclear") -class = "Missile" -tech_req = "Space Flight" -obsolete_by = "None" -graphic = "u.nuclear" -graphic_alt = "-" -sound_move = "m_nuclear" -sound_move_alt = "m_generic" -sound_fight = "f_nuclear" -sound_fight_alt = "f_generic" -build_cost = 160 -pop_cost = 0 -attack = 99 -defense = 0 -hitpoints = 10 -firepower = 1 -move_rate = 24 -vision_radius_sq = 2 -transport_cap = 0 -fuel = 1 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "FieldUnit", "OneAttack", "Nuclear", "HasNoZOC", "Unbribable" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "" -helptext = _("\ -You can build Nuclear units when you have the required advance, and\ - the Manhattan Project wonder has been built by any player.\ -"), _("\ -On impact, the blast will destroy any unit in an area 3 tiles wide\ - (3x3 squares for rectangular grids), including friendly units.\ - Any city within the blast area loses half its population, and\ - land tiles within the blast area are subject to nuclear fallout.\ -"), _("\ -Nuclear fallout reduces tile output and increases the risk of global\ - nuclear winter; see the help on Fallout.\ -"), _("\ -TIP 1: Nuking the ocean will not generate fallout, and is a most\ - effective (but expensive!!) way of getting rid of enemy\ - ships.\ -"), _("\ -TIP 2: You may be involved in a situation where you've invaded an\ - enemy country en masse, but the enemy cities are too strong.\ - Before using a Nuclear unit, assemble a gang of Settlers, Workers,\ - and/or Engineers next to the city and have them ready to fix\ - the fallout on the same turn it occurs! This minimizes the\ - chance of nuclear winter. Eco-friendly nukes!\ -") - -[unit_diplomat] -name = _("Diplomat") -class = "Land" -tech_req = "Writing" -obsolete_by = "Spy" -graphic = "u.diplomat" -graphic_alt = "-" -sound_move = "m_diplomat" -sound_move_alt = "m_generic" -sound_fight = "f_diplomat" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 0 -defense = 0 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -flags = "Diplomat", "IgZOC", "NonMil", "HasNoZOC", "Provoking", "Expellable" -veteran_names = - _("?diplomatic_rank:attaché"), - _("?diplomatic_rank:secretary"), - _("?diplomatic_rank:envoy"), - _("?diplomatic_rank:ambassador"), - _("?diplomatic_rank:emissary"), - _("?diplomatic_rank:statesman"), - _("?diplomatic_rank:plenipotentiary") - -veteran_raise_chance = 50, 33, 20, 15, 15, 15, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 105, 110, 115, 120, 125, 130 -veteran_move_bonus = 0, 0, 0, 0, 0, 0, 0 -roles = "DiplomatStartUnit" -helptext = _("\ -A Diplomat deals with foreign dignitaries. He may\ - undertake various covert operations to\ - harm opponents. Diplomats inside cities defend\ - against such actions.\ -"), _("\ -Many covert actions may be attempted in peacetime, but\ - may cause diplomatic incidents,\ - which can allow Republics and Democracies to break treaties.\ -"), _("\ -If a foreign unit is alone on a tile, you may attempt to bribe it\ - with your Diplomat. The unit immediately\ - becomes yours: the cost depends on unit status and\ - the civilization owning it. Bribery creates a diplomatic incident.\ -"), _("\ -Diplomats can act on another player's\ - city. Most actions have a chance of failure. Diplomats and\ - Spies in the city defend against these actions. In this case, one of the\ - units will die. If\ - the attacker wins, it may try the action again if it has moves left.\ -"), _("\ -A Diplomat can:\ -"), _("\ - - \"Establish Embassy\": Gives\ - permanent contact with the city's owner, tax rates, technology, and foreign relations.\ -"), _("\ - - \"Investigate City\": Attempts to acquire detailed\ - information about the city.\ -"), _("\ - - \"Sabotage City\": Attempts to disrupt\ - city production or destroy a\ - random building. Existing Palaces and\ - Wonders cannot be sabotaged. Attempts to sabotage City Walls\ - or capitals have half the chance of success.\ - Sabotage may only be attempted during war.\ -"), _("\ - - \"Steal Technology\": Attempts to steal a\ - random technology. Technology\ - may only be stolen once from a particular city by Diplomats. This\ - action may be attempted in peace or war and causes a\ - diplomatic incident.\ -"), _("\ - - \"Incite a Revolt\": For a high cost, a foreign city will change\ - allegiance and join your empire, also acquiring the units the\ - city supports. Units in other cities\ - remain in the enemy's control. Units outside cities are disbanded. It is not possible to incite\ - a capital or any city in a Democracy.\ -"), _("\ -Diplomats built under Communism start at the first\ - veteran level (secretary).\ -") - -[unit_spy] -name = _("Spy") -class = "Land" -tech_req = "Espionage" -obsolete_by = "None" -graphic = "u.spy" -graphic_alt = "-" -sound_move = "m_spy" -sound_move_alt = "m_generic" -sound_fight = "f_spy" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 0 -defense = 0 -hitpoints = 10 -firepower = 1 -move_rate = 6 -vision_radius_sq = 8 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -flags = "Diplomat", "IgZOC", "NonMil", "HasNoZOC", "Spy", - "Provoking", "Expellable" -veteran_names = - _("?spy_level:informant"), - _("?spy_level:handler"), - _("?spy_level:agent"), - _("?spy_level:operative"), - _("?spy_level:secret agent"), - _("?spy_level:neutralizer"), - _("?spy_level:spymaster") - -veteran_raise_chance = 50, 33, 20, 15, 15, 15, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 105, 110, 115, 120, 125, 130 -veteran_move_bonus = 0, 0, 0, 0, 0, 0, 0 -roles = "DiplomatStartUnit" -helptext = _("\ -A Spy is more skilled in the arts of espionage than her Diplomat predecessor.\ -"), _("\ -She can perform all the functions of the Diplomat.\ - Unlike a Diplomat, a Spy may survive an\ - operation and become more experienced.\ - Spies are more effective at defending cities.\ -"), _("\ -A Spy can be used to:\n\ - - sabotage an enemy unit if it is\ - alone on a tile (reduces hit points to half)\n\ - - poison a city's water supply of an enemy city (-1 population)\n\ - - steal specific technology (reduced chance of success)\n\ - - steal map fragments\n\ - - steal technologies from a city which has already been\ - stolen from (cities are more resistant each time they\ - are stolen from)\n\ - - sabotage specific city targets (reduced chance success).\ -"), _("\ -A Spy that survives sabotage, theft,\ - inciting rebellion, and poisoning, will escape to the safety of the\ - nearest friendly city.\ -"), _("\ -Spies built under a Communist government start at the first\ - veteran level (handler).\ -") - -[unit_caravan] -name = _("Caravan") -class = "Land" -tech_req = "Trade" -obsolete_by = "Freight" -graphic = "u.caravan" -graphic_alt = "-" -sound_move = "m_caravan" -sound_move_alt = "m_generic" -sound_fight = "f_caravan" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -flags = "HelpWonder", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Expellable" -roles = "" -helptext = _("\ -A Caravan carries goods or material to help build wonders in your\ - cities.\ -"), _("\ -Every Caravan that is used to build a wonder will add 30 shields\ - towards the production of the wonder.\ -"), _("\ -TIP: You can stockpile a stack of Caravans in advance and bring\ - them all into a city where you have started to build a wonder,\ - and finish it in only one turn!\ -") - -[unit_freight] -name = _("Freight") -class = "Land" -tech_req = "The Corporation" -obsolete_by = "None" -graphic = "u.freight" -graphic_alt = "-" -sound_move = "m_freight" -sound_move_alt = "m_generic" -sound_fight = "f_freight" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -flags = "HelpWonder", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Expellable" -roles = "" -helptext = _("\ -The Freight unit replaces the Caravan, and moves at twice the speed.\ - Each Freight used to build a wonder will add 50 shields.\ -") - -[unit_explorer] -name = _("Explorer") -class = "Land" -tech_req = "Seafaring" -obsolete_by = "Partisan" -graphic = "u.explorer" -graphic_alt = "-" -sound_move = "m_explorer" -sound_move_alt = "m_generic" -sound_fight = "f_explorer" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -flags = "IgTer", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Expellable" -roles = "Explorer", "ExplorerStartUnit" -helptext = _("\ -Explorers are brave individuals that are very useful for\ - mapping unknown territory. They can slip through ZOC\ - and have no unit upkeep.\ -") - -[unit_leader] -name = _("?unit:Leader") -class = "Land" -tech_req = "None" -obsolete_by = "None" -graphic = "u.leader" -graphic_alt = "u.explorer" -sound_move = "m_leader" -sound_move_alt = "m_generic" -sound_fight = "f_leader" -sound_fight_alt = "f_generic" -build_cost = 10 -pop_cost = 0 -attack = 0 -defense = 2 -hitpoints = 20 -firepower = 1 -move_rate = 4 -vision_radius_sq = 8 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -flags = "IgZOC", "NonMil", "HasNoZOC", "NoBuild", "NoHome", "SuperSpy", - "EvacuateFirst", "Unbribable", "GameLoss", "Unique", - "Provoking" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "KingStartUnit" -helptext = _("\ -This is you. If you lose this unit, you lose the game. So don't.\ -"), _("\ -Won't unleash barbarians from huts.\ -") - -[unit_barbarian_leader] -name = _("Barbarian Leader") -class = "Land" -tech_req = "None" -obsolete_by = "None" -graphic = "u.barbarian_leader" -graphic_alt = "u.diplomat" -sound_move = "m_barbarian_leader" -sound_move_alt = "m_generic" -sound_fight = "f_barbarian_leader" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 0 -defense = 0 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -flags = "IgZOC", "NonMil", "HasNoZOC", "Unbribable", - "EvacuateFirst", "SuperSpy", "NoHome", "NoBuild" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "BarbarianLeader" -helptext = _("\ -One Barbarian Leader appears every time there is a barbarian uprising\ - somewhere in the world.\ -"), _("\ -When a Barbarian Leader is killed on a tile without any defending units,\ - the 100 gold ransom is paid, but only to land units and helicopters.\ -") - - diff --git a/freeciv/freeciv/data/.historic/mp2-preArctic/README.mp2 b/freeciv/freeciv/data/.historic/mp2-preArctic/README.mp2 deleted file mode 100644 index 8b8c7bfba..000000000 --- a/freeciv/freeciv/data/.historic/mp2-preArctic/README.mp2 +++ /dev/null @@ -1,175 +0,0 @@ -MP2: Multiplayer II Evolution ruleset -------------------------------------- -LINKS: -Full Game Manual -Multiplayer II Summary -Design Log -... -Terrain -Bases -Combat -Governments -Economy -Diplomacy -... -Terrain+Base Defense Bonus Quick-Reference -Hotkeys and Mouse Control - -The Multiplayer-Evolution ruleset is a fully modernized ruleset to take advantage of cutting-edge advancements in Freeciv Server development. -Compared to original Multiplayer, the most notable changes will be new early-game sea units, new late-game air units, and the wholescale improvement -of balance and tactical possibility in late-game Air and Sea units. A large number of contributors over an almost two year period helped add and -balance many other changes whose aim was to increase playability, strategic depth and creativity, realism, and overall richness. -Enjoy! - ------------------------------ -Changes from Multiplayer 1.0: ------------------------------ -TECH -1. Tech costs equalize pace of discovery for all game stages. -2. Darwin's Voyage is now similar to Colossus. -3. No Philosophy bonus after Conscription, Industrialization, Electricity, or T85 (1600AD). -4. Space Flight gives a Satellite Vision Bonus to cities and units. -5. Space race tuned as a viable option. 6.25x component cost, 225% default travel time (server option) -6. Electricity removes Fog of War inside your own borders. (If BORDERS aren't set to SEE_INSIDE). - -UNITS -1. Vision:Movement ratio fixed for 2x movement: starts at 1.4x:2x then is 2x:2x after Physics. -2. Restrictinfra=ON makes enemy rails act only like roads. (Default=ON) -3. Railroad move speed changed to 9x, MagLevs available with Superconductors for unlimited moves. -4. Non-military Bribe cost fixed to work on all non-military units. -5. Land units on mountains get +1 vision. -6. Knights defend at D3 vs mounted, D2 vs foot, D1 vs everything else, and do not kill city population. -7. Legions can build Forts/Fortresses; and they can build roads on non-domestic tiles. -8. Archers can do a (limited) Range Attack. -9. Armor: no penalty vs Fort; 1.67 penalty vs Fortress (was 2x). -10. Armor II: upgrades Armor with Plastics. Cost:80 A16 D6 FP1 M6. No penalty vs Fort/ress, 2x defense - ... against missiles, never blocked from attacking reachable units by unreachable units. -11. No bribe/sabotage on Air and Missile units. -12. “OneAttack” flag deprecated since version 2.3 onward had made them dysfunctional. These units do NOT lose all - ... moves after making one attack: Bomber types, Helicopters. -13. Air Units exert no ZoC over adjacent tiles. -14. Para-drop for Paratroopers adjusted to 2x area coverage (1.4x range). -15. Marines are multipurpose. Can attack sea units (2x penalty), are never blocked from attacking a reachable - ... unit by an unreachable unit; can attack from Helicopters. Get improved veteran multipliers. -16. Escort Fighters added. Cost: 80. A3 D5 FP2. Moves:18. Fuel: 2 turns. -17. Medium Bombers added. Cost: 85. A6 D2 FP2. Moves:13. Fuel: 2 turns. -18. Bomber renamed 'Heavy Bomber'. Cost: 120. A12 D3 FP2. Moves:15. Fuel: 2 turns. Carries 1 Bomb. -19. Strategic Bomber added: Cost: 135 A13 D4 FP2 M16 Fuel: 3 turns. Carries 2 Bombs. Requires Rocketry. -20. Anti-aircraft Artillery added. Cost: 50. A1 D1 FP2. Moves:2. 4X bonus vs. Air units. -21. Air units can airlift themselves. -22. Balloon added. Cost: 25. Ao D0 M5 Fuel:2. Has good vision but can't fly over mountains. -23. Jet Fighter added. Cost: 70. A6 D5 FP2 M24. Requires Space Flight, so does: -24. Jet Bomber added. Cost: 145. A15 D1 FP2 M19 Fuel:3. Can Pillage. Unreachable to propeller Fighters. -25. Stealth Bomber, A19 (was 18), SAM Battery only 25% bonus (was 2x) -26. Stealth Fighter, SAM Battery only 25% Bonus (was 2x) -27. Spies cost 35 (was 30.) -28. Atom Bomb available with Nuclear Fission + Manhattan Project. -29. Nuclear Missiles get 1.5x moves and 2.25x target area over 1x rates. Available with Space Flight. -30. Rare post-Elite veteran levels obtainable. (See manual under Combat.) - -PROJECT POSEIDON: GLORIFYING THE ANCIENT SEAS -1. Combat Rounds: Ancient ships have 15 combat rounds when attacking. It may or may not result in a winner. -2. River-worthy ships. Most ancient ships can travel on rivers. -3. Trireme changes: Cost:20, Combat Rounds:15 Alphabet, Can do commerce functions (same as Caravan). -4. Longboat added. Cost:25 A2 D1 M6 CR:15, Cargo:1, Map Making, can do shore attack. -5. Galley added. Cost:30 A2 D2 M6 CR:15, Cargo:2, Sea Faring, can do Commerce functions like a Caravan. -6. War Galley. Cost: 40. A3 D3 M6 CR:15 Cargo:3, Astronomy, can do shore attack. -7. Ram Ship. Cost:35 A4 D2 M6 CR:standard Cargo:0, Engineering, no rivers, no shore, no commerce, bad vision. -8. Caravel changes: A4 D4 M7 CR:15, can establish traderoutes. -9. Galleon changes: A2 D3 M8 CR:15, 50% chance to escape from a defeated stack (see below) -10. Frigate changes: D3, can travel rivers like the rest, 50% chance to escape defeated stack (see below) - -PROJECT NEPTUNE: MODERN NAVAL RE-BALANCE -1. Stack-Escape: modern ships (and Aircraft) have 50% chance to escape a defeated stack if they have more remaining - ... moves than the attacking unit. -2. Submarine changes: HP28 (was 30), Unreachable by Air units, req:Automobile. -3. Destroyer changes: A5 D5, 4x defense vs. Subs -4. Cruiser changes: M11 (was 10), 2x defense vs. Subs -5. Battleship: M10 (was 8), 2x defense vs. Subs req: Refining. -6. AEGIS Cruiser: M11 (was 10), better vision, Carry:2 missiles, can attack Air/Missiles, 2x defense vs Subs, - ... 3x defense vs. Air attackers. -7. Missile Destroyer added, upgrades Destroyer. A5 D5 FP2 HP30 M12. Carry:1 missile, 2x vs Subs, 2x vs. Air. Rocketry. - -WONDERS - ReWonder 2.0 -1. Pyramids: Added Classic effect of +25% food storage in every city. Still raptures in home city. -2. Copernicus' Observatory cost changed to 100 shields. -3. Great Wall. Cost: 275. Obsolete by: Machine Tools. -4. Supreme Court is the new name for Great Library, to avoid confusion for players coming from Classic. -5. Hanging Garden gains +2 luxury to the home city it's built in. -6. Colossus obsolete by Automobile, not Flight. -7. Lighthouse: +2 moves, +1 vision, obsolete by Miniaturization. -8. Adam Smith Trading Co.: same but enables 3 new specialists - ... a. Farmer: adds 1/0/0 to output - ... b. Merchant: adds 0/0/2 + 1 gold to output - ... c. Laborer: adds 0/1/0 to output -9. Ecclesiastical Palace added. Mysticism. Reduces corruption as a second capital. Gives same bonuses as Palace except - ... any capital prod bonuses become capital gold bonuses. -10. Temple of Artemis added. Mysticism. Cost 250. +1 gold,luxury,bulb,and shield in every city. -11. Mausoleum of Mausolus added. Ceremonial Burial. +1 content for each City Walls or Courthouse. -12. Statue of Zeus. 1 unhappy form military made content in all cities, +1 happy in home city, +4 free upkeep in - ... home city. Polytheism. -13. Genghis Khan's Equestrian School. Cost:150 +1 move for ALL mounted units except Cavalry. Horeseback Riding. -14. Tesla's Laboratory. Electricity. Cost:200. Upgrades 1 obsolete unit per turn, no expiration. -15. Gibraltar Fortress. Cost:350. Metallurgy. Coastal Defense in all cities. - -BUILDINGS -1. Courthouse overhauled to be useful again and better assist non-rapture governments. - ... a. Cost 45. This reflects its loss of over half its Classic value, which was prevention of incitations. - ... b. Corruption reduction changed to 60%. (Rounding turned 50% to 41%. 60% renders real 53%.) - ... c. Gives 1 free unit upkeep (law and order bonus) - ... d. Decreases hostile espionage chances by ~20%. Read manual for full details. - ... e. Nullifies tile penalties in Anarchy and Despotism. -2. Granary cost 35 shields: slightly aids non-rapture governments. -3. Mass Transit: 60 shields, +2T. Recycling Center: 70 shields, +2P. This fixed 2 totally broken buildings. -4. Palace makes +1 happy to support capital having higher population. -5. Police station adds 10% bonus against diplomatic combat and Steal Tech, and prevents enemies from establishing an - ... embassy without first agreeing to cease-fire, armistice, or peace. - -TERRAIN AND BASES -1. Tile resource “Gold” goes from 0/1/6 to 0/1/8. (Formerly it had the lowest F/P/T score of all resources.) -2. Jungle, Tundra: Micro-adjustments to stats so they can integrate into the game again instead of always be turned off. -3. Oasis is a water source for irrigation. -4. Swamp Transform reduced to 12 worker-turns: aids fairness and naval balance in continental games. -5. Transform time for Grasslands to Hills changed from 12 to 15. -6. Engineering lets Infra units dig Canal tile improvement. The only effect of a Canal is it lets ships pass through. -7. Terrain Defense changes: Forest/Swamp/River go to 1.33x (was 1.5x). -8. Can't plant forest or "build a hill" under an existing city. -9. Fort added. requires Masonry. 1.33x defense vs Land/Sea EXCEPT Armor. Building a Fortress requires a Fort to be there first. - -NEW FEATURES / GAME MECHANICS -1. Traderoutes are back: - ... a. 1 per city - ... b. Must be foreign city 12+ tiles distance - ... c. Revenue is lower, based only on combined trade of both cities, no logarithms, etc. - ... ... Equitable with a slightly below average building investment. - ... d. Turned off during war but reactivate in peace. - ... e. -25% (approx.) to revenue from Flight or Railroad discovery. - ... f. Enter Marketplace for one-time bonus can be done, possible to get better investment - ... ... than Coinage if and only if both cities are high trade. -2. Diplomacy Fix: Cease-fire and Peace can be done without embassy if players' units have met in last 10 turns. -3. Resource gold is 0/1/8. (Formerly it had the lowest F/P/T score of any resource.) -4. Jungle,Tundra,Glacier, and their resources return to the game. Micro-rebalance so that "all-temperate" setting - ... is no longer necessary. -5. Oasis is a water source for irrigation. Nile Effect gives extra +1 food to irrigated desert rivers. -6. Illegal Action movement penalty removed. -7. Transform time from Swamp to Ocean is 12 worker-turns, not 36. (patches geographic balance and fairness) -8. Transform time for Grass to Hills is 15 worker-turns, not 12. (balances some exploits) -9. The new Well-digger is a "patch" unit that gives fair balance to nations who have no nearby water. -10. Canals: Workers/Engineers can make Canals after Engineering: allows ships to pass through. -11. Caravans and Freight can help build Foreign Wonders. This increases diplomatic negotiation possibilities. -12. Helicopters may use Fortresses as bases to rest and repair. -13. Expelling: All land military except warriors can expel a non-military unit from your territory IF it is not on a mountain. - ... a. Fighter types can also expel an AWACS. Units must be alone on the tile to be expelled. -14. Capturing: Workers/Explorers/Caravans/Freight can be captured by a Foot soldier or Mounted soldier whose attack is - ... A3 or higher. But not if they are on Mountains or other units are on the tile. -15. Steal Map Fragments - Diplomats and Spies can steal map fragments of the explored world map. -16. Maximum Granary food store capped at 70. Give some balance to non-rapture governments. -17. Forest, Swamp, River 1.33x defense bonus (was 1.5). Can't transform City Centre to Forest or Hill. -18. Fort added. Defense bonuses smoothed. See Bases -19. Naval Base added. Layers over Fortress. Gives 1.33x defense and +20% HP regeneration for ships. -20. Timeline changed to match technological pace of the game. No cannons in 100 BC ! -21. Incite cost changed. Goes from impossibly high to extremely high (but theoretically possible: e.g., 120000 might go to 4500) - - - -END. \ No newline at end of file diff --git a/freeciv/freeciv/data/.historic/mp2-preArctic/buildings.ruleset b/freeciv/freeciv/data/.historic/mp2-preArctic/buildings.ruleset deleted file mode 100644 index 4696f2940..000000000 --- a/freeciv/freeciv/data/.historic/mp2-preArctic/buildings.ruleset +++ /dev/null @@ -1,2034 +0,0 @@ -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes, -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -; Note that the freeciv AI may not cope well with anything more -; than minor changes. - -[datafile] -description="Multiplayer-Evo buildings data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -; /* <-- avoid gettext warnings -; -; Below: The individual buildings, one per section. -; (Buildings = City Improvements and Wonders) -; -; The actual tag used (the * in [building_*]) does not matter, except -; it must be unique within this file, and it may be used in debug -; output when reading this file. -; -; Notes: -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; if -; not present, "name" is used for this purpose too. Since -; the name used in savegames must not change, if you want -; to rename an item after a ruleset has been released, you -; should set "rule_name" to the original value of "name". -; genus = genus; one of: -; "GreatWonder", "SmallWonder", "Improvement", "Special". -; reqs = requirements to build the building (see effects.ruleset -; and README.effects for help on requirements) -; graphic = icon of improvement (used in city dialog) -; graphic_alt = alternate icon of improvement -; obsolete_by = requirements for the building to become obsolete -; build_cost = production shields required to build -; upkeep = monetary upkeep value -; sabotage = percent chance of diplomat sabotage being successful -; flags = special flag strings -; -; ** Building flags ** -; "VisibleByOthers" = Anyone who can see your city knows whether it has -; this improvement. (Great and small wonders are -; always visible.) -; "SaveSmallWonder" = If you lose the city with this building in, and the -; "savepalace" server setting is enabled, another will -; be built for free in a random city. -; Should only be used with genus "SmallWonder". -; "Gold" = Not a real building; production turned into gold -; indefinitely (capitalization/coinage). -; Genus should be "Special". -; "DisasterProof" = Disasters never destroy this building. Is meaningful -; only for genus "Improvement" buildings as others are -; automatically disaster proof. -; -; */ <-- avoid gettext warnings - -[building_airport] -name = _("Airport") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Radio", "Player" - } -graphic = "b.airport" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 120 -upkeep = 3 -sabotage = 100 -sound = "b_airport" -sound_alt = "b_generic" -helptext = _("\ -Allows a city to produce veteran Air units, Helicopters, and Missiles.\ - Damaged Air units and Helicopters which stay in town for one full turn\ - without moving are completely repaired.\ -"), _("\ -Two cities with Airports can airlift units. Airlifting instantly transports\ - the unit from one city to another and will use up all movement\ - points. A unit must have some movement points left to be airlifted.\ -") - -[building_amphitheatre] -name = _("Amphitheater") -rule_name = "Amphitheatre" ; en_GB used originally -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Construction", "Player" - } -graphic = "b.colosseum" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 4 -sabotage = 100 -sound = "b_colosseum" -sound_alt = "b_generic" -helptext = _("\ -Entertains the citizens of a city, making 3 unhappy citizens content. \ - (Four after the discovery of Electricity.) However, it does not\ - affect citizens made unhappy by military activity.\ -") - -[building_aqueduct] -name = _("Aqueduct") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Construction", "Player" - } -graphic = "b.aqueduct" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 2 -sabotage = 100 -sound = "b_aqueduct" -sound_alt = "b_generic" -helptext = _("\ -Allows a city to grow larger than size 8. A Sewer System is also\ - required for a city to grow larger than size 12.\ -") -; There is also an effect to reduce the chance of plague, but you have to -; enable illness in game.ruleset for that to be relevant. - -[building_bank] -name = _("Bank") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Banking", "Player" - "Building", "Marketplace", "City" - } -graphic = "b.bank" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 80 -upkeep = 2 -sabotage = 100 -sound = "b_bank" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Together, a Bank and Marketplace double the tax and luxury production in a city.\ - That is, the Bank adds another +50% to the +50% of the Marketplace.\ -") - -[building_barracks] -name = _("Barracks") -genus = "Improvement" -reqs = - { "type", "name", "range" - - } -graphic = "b.barracks_i" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Gunpowder", "Player" - "Building", "Barracks II", "City" - "Building", "Barracks III", "City" - } -build_cost = 30 -upkeep = 1 -sabotage = 100 -sound = "b_barracks_i" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -With a Barracks I, each new land unit built in a city will\ - automatically have Veteran V1 status, which means that its attack and\ - defense strengths are increased by 50%. Also, damaged land units\ - which stay in town for one full turn without moving are completely\ - healed. Obsolete by: Gunpowder.\ -") - -[building_barracks_ii] -name = _("Barracks II") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Gunpowder", "Player" - } -graphic = "b.barracks_ii" -graphic_alt = "b.barracks_i" -obsolete_by = - { "type", "name", "range" - "Tech", "Mobile Warfare", "Player" - "Building", "Barracks III", "City" - } -build_cost = 30 -upkeep = 1 -sabotage = 100 -sound = "b_barracks_ii" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -With a Barracks II, each new land unit built in a city will\ - automatically have Veteran V1 status, which means that its attack and\ - defense strengths are increased by 50%. Also, damaged land units\ - which stay in town for one full turn without moving are completely\ - restored. Obsolete by: Mobile Warfare.\ -") - -[building_barracks_iii] -name = _("Barracks III") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Mobile Warfare", "Player" - } -graphic = "b.barracks_iii" -graphic_alt = "b.barracks_i" -obsolete_by = - { "type", "name", "range" - } -build_cost = 30 -upkeep = 1 -sabotage = 100 -sound = "b_barracks_iii" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -With a Barracks III, each new land unit built in a city will\ - automatically have Veteran V1 status, which means that its attack and\ - defense strengths are increased by 50%. Also, damaged land units\ - which stay in town for one full turn without moving are completely\ - restored.\ -"), _("\ -When combined with an Airport and Port Facility, Marines built in the city\ - will automatically have Hardened V2 status.\ -") - -[building_cathedral] -name = _("Cathedral") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Monotheism", "Player" - "Building", "Temple", "City" - } -graphic = "b.cathedral" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 75 -upkeep = 3 -sabotage = 100 -sound = "b_cathedral" -sound_alt = "b_generic" -helptext = _("\ -A Cathedral makes 3 unhappy citizens content, but does not affect citizens\ - made unhappy by military activity. Theology increases the effect by +1.\ - Communist government decreases the effect by -1. (Michelangelos Chapel enhances\ - the effect of Cathedrals by +1 happy citizen and +1 forced content citizen.)\ -") - -[building_city_walls] -name = _("City Walls") -genus = "Improvement" -flags = "VisibleByOthers" -reqs = - { "type", "name", "range" - "Tech", "Masonry", "Player" - } -graphic = "b.city_walls" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 0 -sabotage = 50 -sound = "b_city_walls" -sound_alt = "b_generic" -helptext = _("\ -City Walls increase the 1.5x bonus for Land units in a city to 3x, effectively\ - doubling the strength of Land units against attacks from other Land units (and\ - Helicopters.) City Walls are ineffective against Air units, Sea units, Missiles,\ - and Howitzers; in which case the normal 1.5x bonus is given. City Walls prevent\ - population loss when a defending unit is destroyed by a Land unit.\ -") - -[building_coastal_defense] -name = _("Coastal Defense") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Gunpowder", "Player" - "TerrainClass", "Oceanic", "Adjacent" - } -graphic = "b.coastal_defense" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 1 -sabotage = 100 -sound = "b_coastal_defense" -sound_alt = "b_generic" -helptext = _("\ -Doubles the defense strength of all units in a city when defending against\ - against enemy ships.\ -") - -[building_courthouse] -name = _("Courthouse") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Code of Laws", "Player" - } -graphic = "b.courthouse" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 45 -upkeep = 1 -sabotage = 100 -sound = "b_courthouse" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Reduces corruption in a city by roughly half (60% but rounded down.)\ - Provides law and order to support +1 unit free of upkeep. Eliminates\ - tile corruption under Anarchy and Despotism.\ -"), _("\ -Diplomatic attacks on your diplomatic units are 15% less effective.\ - (50%-15%=35%). The basic Steal Tech action is 35% less effective.\ - (80%-35%=45%). All other hostile diplomatic actions are 20% less effective.\ -"), _("\ -In a Democracy, a Courthouse makes 1 unhappy citizen content (unless that\ - citizen is unhappy about military activity).\ -"), _("\ -Cost to incite revolt in the city is 2x if empty and 4x if occupied.\ -") - -[building_factory] -name = _("Factory") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Industrialization", "Player" - } -graphic = "b.factory" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 140 -upkeep = 4 -sabotage = 100 -sound = "b_factory" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Increases the shield production in a city by +50%. This increase may\ - contribute to pollution.\ -") - -[building_granary] -name = _("Granary") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Pottery", "Player" - } -graphic = "b.granary" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 35 -upkeep = 1 -sabotage = 100 -sound = "b_granary" -sound_alt = "b_generic" -helptext = _("\ -The amount of stored food will be set to half full whenever a city\ - with a Granary 1) grows in size, or 2) loses size from starvation.\ - This helps a city to grow faster and more easily withstand famine.\ -") - -[building_harbour] -name = _("Harbor") -rule_name = "Harbour" ; en_GB spelling used originally -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Seafaring", "Player" - "TerrainClass", "Oceanic", "Adjacent" - } -graphic = "b.harbour" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 40 -upkeep = 1 -sabotage = 100 -sound = "b_harbour" -sound_alt = "b_generic" -helptext = _("\ -Gives one extra food resource on all Oceanic tiles. The city needs\ - to be coastal to build this improvement.\ -") - -[building_hydro_plant] -name = _("Hydro Plant") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Electronics", "Player" - "Building", "Factory", "City" - "Extra", "River", "Adjacent" - } -graphic = "b.hydro_plant" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 180 -upkeep = 4 -sabotage = 100 -sound = "b_hydro_plant" -sound_alt = "b_generic" -helptext = _("\ -For each Factory or Mfg. Plant in a city, a Hydro Plant adds +25% to\ - base production, and reduces pollution from production by -25%.\ -"), _("\ -*If a city has either a Factory or Mfg. Plant, this makes a combined +75%\ - production bonus with a 25% decrease in pollution from production.\ -"), _("\ -*In a city with both a Factory and Mfg. Plant, this makes a combined +150%\ - production bonus with a 50% decrease in pollution from production.\ -"), _("\ -*Only one Power Plant, Hydro Plant, Nuclear Plant, or\ - Solar Plant can have an active effect in a city.\ -") - -[building_library] -name = _("Library") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Writing", "Player" - } -graphic = "b.library" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 1 -sabotage = 100 -sound = "b_library" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Increases the science output in a city by +100%.\ -") - -[building_marketplace] -name = _("Marketplace") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Currency", "Player" - } -graphic = "b.marketplace" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 0 -sabotage = 100 -sound = "b_marketplace" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Increases the luxury and tax output in a city by +50%.\ -") - -[building_mass_transit] -name = _("Mass Transit") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Mass Production", "Player" - } -graphic = "b.mass_transit" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 0 -sabotage = 100 -sound = "b_mass_transit" -sound_alt = "b_generic" -helptext = _("\ -Eliminates the pollution generated by population.\ - Production becomes the only source of pollution in\ - the city.\ -"), _("\ -Increased citizen mobility and ticket revenues\ - increase base trade on city centre tile by +2\ -") - -[building_mfg_plant] -name = _("Mfg. Plant") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Robotics", "Player" - "Building", "Factory", "City" - } -graphic = "b.mfg_plant" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 220 -upkeep = 6 -sabotage = 100 -sound = "b_mfg_plant" -sound_alt = "b_generic" -helptext = _("\ -A Manufacturing Plant increases base production by +50%.\ -"), _("\ -A Mfg. Plant & Factory together double the production in a city.\ - That is, the Mfg. Plant adds another +50% to the +50% of the Factory.\ -"), _("\ -A Mfg. Plant with a Factory AND a Power/Hydro/Nuclear/Solar Plant\ - will combine for a total +150% increase over base production.\ -"), _("\ -The pollution reduction of a Hydro/Nuclear/Solar Plant is applied one more time\ - to cities with Mfg. Plants, effectively doubling the bonus percentage.\ -") - -[building_nuclear_plant] -name = _("Nuclear Plant") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Nuclear Power", "Player" - "Building", "Factory", "City" - } -graphic = "b.nuclear_plant" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 120 -upkeep = 2 -sabotage = 100 -sound = "b_nuclear_plant" -sound_alt = "b_generic" -helptext = _("\ -For each Factory or Mfg. Plant in a city, a Nuclear Plant adds +25% to\ - base production, and reduces pollution from production by -25%.\ -"), _("\ -*If a city has either a Factory or Mfg. Plant, this makes a combined +75%\ - production bonus with a 25% decrease in pollution from production.\ -"), _("\ -*In a city with both a Factory and Mfg. Plant, this makes a combined +150%\ - production bonus with a 50% decrease in pollution from production.\ -"), _("\ -*Only one Power Plant, Hydro Plant, Nuclear Plant, or\ - Solar Plant can have an active effect in a city.\ -") - -[building_offshore_platform] -name = _("Offshore Platform") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Miniaturization", "Player" - "TerrainClass", "Oceanic", "Adjacent" - } -graphic = "b.offshore_platform" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 120 -upkeep = 3 -sabotage = 100 -sound = "b_offshore_platform" -sound_alt = "b_generic" -helptext = _("\ -Adds 1 extra production to all Oceanic tiles worked by a city. The\ - city needs to be coastal to build this improvement.\ -") - -[building_palace] -name = _("Palace") -genus = "SmallWonder" -flags = "SaveSmallWonder" -reqs = - { "type", "name", "range" - "Tech", "Masonry", "Player" - } -graphic = "b.palace" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 70 -upkeep = 0 -sabotage = 0 -sound = "b_palace" -sound_alt = "b_generic" -helptext = _("\ -Makes a city the capital of your nation.\ - Corruption in cities increases with distance\ - from the capital (except under Democracy or\ - Communism.) A Palace reduces corruption in your capital\ - by roughly half.\ -"), _("\ -The cost of inciting a revolt decreases with distance from the\ - capital. The capital cannot be incited to revolt, and reduces the chance\ - of enemy agents defeating your agents by 50%. Attempts to sabotage buildings\ - in your capital are also reduced by 50%.\ -"), _("\ -Take good care of your capital, as its loss may result in your\ - empire plunging into civil war. Losing your current palace also\ - results in losing whatever spaceship you might have.\ -"), _("\ -If the capital is in a dangerous location, or a more central capital\ - would give a better corruption distribution, you can move your palace\ - by rebuilding it in another city.\ -"), -_("\ -The city containing the Palace receives a production bonus of +75% under Despotism,\ - +50% under Monarchy, and +25% under Communism. Under Fundamentalism, it receives\ - a +50% gold bonus.\ -") - -[building_ecclesiastical_palace] -name = _("Ecclesiastical Palace") -genus = "SmallWonder" -reqs = - { "type", "name", "range" - "Tech", "Mysticism", "Player" - } -graphic = "b.ecclesiastical_palace" -graphic_alt = "b.palace" -obsolete_by = - { "type", "name", "range" - } -build_cost = 110 -upkeep = 0 -sabotage = 0 -sound = "b_palace" -sound_alt = "b_generic" -helptext = _("\ -Makes a city the religious capital that acts as a second center of government.\ -"), _("\ -This building is a second Palace and gives all effects of a Palace,\ - including reduction of corruption, which is based on which capital a city\ - is closest to. Under Despotism, the city containing the Palace gains a\ - +75% gold bonus. Under Monarchy and Fundamentalism, a +50% gold bonus. \ -"), _("\ -The city where this Palace is located cannot be incited to revolt,\ - and enjoys a bonus when enemy agents try to evade your own agents\ - stationed in the city, or sabotage your buildings.\ -"), _("\ -Under Fundamentalism, Fanatics produced in the city with this building\ - are inspired by fervorous faith to +1 higher veteran level.\ -") - -[building_police_station] -name = _("Police Station") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Communism", "Player" - } -graphic = "b.police_station" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 50 -upkeep = 2 -sabotage = 100 -sound = "b_police_station" -sound_alt = "b_generic" -helptext = _("\ -Neutralizes the unhappiness caused by two military units. Assists domestic diplomatic\ - units against hostile diplomatic attacks with a 10% bonus. Decreases the chance of\ - the basic Steal Tech action by 10%. Prevents enemies from establishing an embassy\ - without first agreeing to cease-fire, armistice, or peace.\ -") - -[building_port_facility] -name = _("Port Facility") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Amphibious Warfare", "Player" - "TerrainClass", "Oceanic", "Adjacent" - } -graphic = "b.port_facility" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 3 -sabotage = 100 -sound = "b_port_facility" -sound_alt = "b_generic" -helptext = _("\ -Allows a city to build veteran sea units. Damaged sea units\ - which stay in town for one full turn without moving are completely\ - restored.\ -") - -[building_power_plant] -name = _("Power Plant") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Refining", "Player" - "Building", "Factory", "City" - } -graphic = "b.power_plant" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 130 -upkeep = 4 -sabotage = 100 -sound = "b_power_plant" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -For each Factory or Mfg. Plant in a city, a Power Plant adds +25% to\ - base production. The extra production may lead to more pollution.\ -"), _("\ -*If a city has either a Factory or Mfg. Plant, this makes a combined +75%\ - production bonus.\ -"), _("\ -*In a city with both a Factory and Mfg. Plant, this makes a combined +150%\ - production bonus.\ -"), _("\ -*Only one Power Plant, Hydro Plant, Nuclear Plant, or\ - Solar Plant can have an active effect in a city.\ -") - -[building_recycling_center] -name = _("Recycling Center") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Recycling", "Player" - } -graphic = "b.recycling_center" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 70 -upkeep = 1 -sabotage = 100 -sound = "b_recycling_center" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -A Recycling Center reduces the pollution\ - generated by production in a city by -66%. Supply of raw\ - recycled materials adds +2 producton to the city\ - center tile.\ -") - -[building_research_lab] -name = _("Research Lab") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Computers", "Player" - "Building", "University", "City" - } -graphic = "b.research_lab" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 120 -upkeep = 3 -sabotage = 100 -sound = "b_research_lab" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Adds +100% to base science output for each Library and University\ - in a city.\ -*In a city with a Library or University, the combined increase to science\ - output is +200%. \ -*In a city with a Library and a University, the combined increase\ - is +450%.\ -") - -[building_sam_battery] -name = _("SAM Battery") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Rocketry", "Player" - } -graphic = "b.sam_battery" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 70 -upkeep = 2 -sabotage = 100 -sound = "b_sam_battery" -sound_alt = "b_generic" -helptext = _("\ -Doubles the defense of all units inside the city when attacked by\ - aircraft (not including Helicopters or Missiles). Stealth aircraft\ - reduce the bonus to 25%.\ -") - -[building_sdi_defense] -name = _("SDI Defense") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Laser", "Player" - } -graphic = "b.sdi_defense" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 140 -upkeep = 4 -sabotage = 100 -sound = "b_sdi_defense" -sound_alt = "b_generic" -helptext = _("\ -Protects a city and its environs (up to 2 tiles away) from attacks\ - by Nuclear units. A Nuclear unit not owned by you or a teammate will\ - be shot down and have no effect if it tries to detonate in this area.\ - Nuclear units detonating outside this area will still affect all tiles\ - adjacent to ground zero, including tiles within the protected area.\ - SDI also doubles defense for units in the city against non-nuclear missiles.\ -") - -[building_sewer_system] -name = _("Sewer System") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Sanitation", "Player" - "Building", "Aqueduct", "City" - } -graphic = "b.sewer_system" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 80 -upkeep = 2 -sabotage = 100 -sound = "b_sewer_system" -sound_alt = "b_generic" -helptext = _("\ -Allows a city to grow larger than size 12. An Aqueduct is first\ - required for a city to grow larger than size 8.\ -") -; There is also an effect to reduce the chance of plague, but you have to -; enable illness in game.ruleset for that to be relevant. - -[building_solar_plant] -name = _("Solar Plant") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Environmentalism", "Player" - "Building", "Factory", "City" - } -graphic = "b.solar_plant" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 140 -upkeep = 4 -sabotage = 100 -sound = "b_solar_plant" -sound_alt = "b_generic" -helptext = _("\ -For each Factory or Mfg. Plant in a city, a Solar Plant adds +25% to\ - base production, and reduces pollution from production by -50%.\ -"), _("\ -*If a city has either a Factory or Mfg. Plant, this makes a combined +75%\ - production bonus with a 50% decrease in pollution from production.\ -"), _("\ -*In a city with both a Factory and Mfg. Plant, this makes a combined +150%\ - production bonus with 100% elimination of all pollution from production.\ -"), _("\ -*Only one Power Plant, Hydro Plant, Nuclear Plant, or\ - Solar Plant can have an active effect in a city.\ -") - -[building_space_component] -name = _("Space Component") -genus = "Special" -reqs = - { "type", "name", "range" - "Tech", "Plastics", "Player" - "Building", "Factory", "City" - } -graphic = "b.space_component" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 1000 -upkeep = 0 -sabotage = 100 -sound = "b_space_component" -sound_alt = "b_generic" -helptext = _("\ -Space Components can be differentiated into Propulsion and Fuel Components.\ - Each pair of them reduces spaceship travel time. You can build up to 8 pairs.\ -"), _("\ -Before you can build any spaceship parts, any nation must have built the\ - Apollo Program.\ -") - -[building_space_module] -name = _("Space Module") -genus = "Special" -reqs = - { "type", "name", "range" - "Tech", "Superconductors", "Player" - "Building", "Factory", "City" - } -graphic = "b.space_modules" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 2000 -upkeep = 0 -sabotage = 100 -sound = "b_space_module" -sound_alt = "b_generic" -helptext = _("\ -Space Modules are the most expensive parts of spaceships. There\ - are three different types of Space Module:\ -"), _("\ -- Habitation Module: provides living space for 10,000 people.\ -"), _("\ -- Life Support Module: provides food and water for the population of\ - one Habitation Module.\ -"), _("\ -- Solar Panels: provides the energy needed for any two of the other\ - Modules.\ -"), _("\ -You can build up to 4 Space Modules of each kind.\ -"), _("\ -Before you can build any spaceship parts, any nation must have built the\ - Apollo Program.\ -") - -[building_space_structural] -name = _("Space Structural") -genus = "Special" -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "Building", "Factory", "City" - } -graphic = "b.space_structural" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 500 -upkeep = 0 -sabotage = 100 -sound = "b_space_structural" -sound_alt = "b_generic" -helptext = _("\ -Space Structurals form the base of your spaceship. All other\ - spaceship parts need to be connected to Structurals in order to\ - function. You can build up to 32 Space Structurals.\ -"), _("\ -Before you can build any spaceship parts, a nation must have built the\ - Apollo Program.\ -") - -[building_stock_exchange] -name = _("Stock Exchange") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Economics", "Player" - "Building", "Bank", "City" - } -graphic = "b.stock_exchange" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 120 -upkeep = 3 -sabotage = 100 -sound = "b_stock_exchange" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -In cities with a Bank, a Stock Exchange boosts tax and luxury\ - production by an additional +50%.\ -"), _("\ -*A Bank and Stock Exchange together boost\ - tax and luxury production by +100%.\ -"), _("\ -*A Marketplace, Bank, and Stock Exchange together boost\ - tax and luxury production by +150%.\ -") - -[building_super_highways] -name = _("Super Highways") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Automobile", "Player" - } -graphic = "b.super_highways" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 120 -upkeep = 3 -sabotage = 100 -sound = "b_super_highways" -sound_alt = "b_generic" -helptext = _("\ -Increases trade by +50% on all tiles with roads, railroads, or MagLev (rounded down.) Improves transportation\ - logistics to an Airport, giving +1 airlift capacity to cities over size 12.\ -") - -[building_supermarket] -name = _("Supermarket") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Refrigeration", "Player" - } -graphic = "b.supermarket" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 80 -upkeep = 3 -sabotage = 100 -sound = "b_supermarket" -sound_alt = "b_generic" -helptext = _("\ -Increases the food resources by +100% on each farmland tile which\ - is being used around the city. An irrigable city centre tile receives a\ - +50% bonus immediately, but cannot receive a benefit from farmland.\ - Farmland tiles are those which have been irrigated a second time.\ -") - -[building_temple] -name = _("Temple") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Ceremonial Burial", "Player" - } -graphic = "b.temple" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 30 -upkeep = 1 -sabotage = 100 -sound = "b_temple" -sound_alt = "b_generic" -helptext = _("\ -Makes one unhappy citizen content. Mysticism doubles\ - this effect. With both Mysticism and the Oracle, +4 citizens are\ - made content. Does not affect citizens made unhappy by military\ - activity.\ -") - -[building_university] -name = _("University") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "University", "Player" - "Building", "Library", "City" - } -graphic = "b.university" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 120 -upkeep = 3 -sabotage = 100 -sound = "b_university" -sound_alt = "b_generic" -helptext = _("\ -Adds +150% to science output in a city with a Library.\ -"), _("\ -*A University and Library combine for a +250% increase\ - in science output.\ -") - -[building_apollo_program] -name = _("Apollo Program") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Space Flight", "Player", TRUE, FALSE - "Building", "Apollo Program", "Player", FALSE, TRUE - } -graphic = "b.apollo_program" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 600 -upkeep = 0 -sabotage = 0 -sound = "w_apollo_program" -sound_alt = "w_generic" -helptext = _("\ -Allows you to start building spaceship parts in cities\ - with factories (assuming you have researched the necessary\ - technologies).\ -") - -[building_asmiths_trading_co] -name = _("A.Smith's Trading Co.") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Economics", "Player", TRUE, FALSE - "Building", "A.Smith's Trading Co.", "Player", FALSE, TRUE - } -graphic = "b.asmiths_trading_co" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 300 -upkeep = 0 -sabotage = 0 -sound = "w_asmiths_trading_co" -sound_alt = "w_generic" -helptext = _("\ -In all your cities, Buildings with upkeep of 1 gold become free.\ - (This bonus co-exists and accumulates with other upkeep bonuses.)\ - This Wonder also allows three new specialists:\ -"), _(" - * Each Laborer produces one production point for their city per turn;\ - the same as an unmined mountain.\ -"), _(" - * Each Merchant produces one gold and two trade points per turn.\ - Trade is then distributed by your national tax rates.\ -"), _(" - * Each Farmer provides one food for their city per turn;\ - the same output as a blank hill or swamp.\ -"), _(" - This wonder is never obsolete.\ -") - -[building_colossus] -name = _("Colossus") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Bronze Working", "Player", TRUE, FALSE - "Building", "Colossus", "Player", FALSE, TRUE - } -graphic = "b.colossus" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Automobile", "Player" - } -build_cost = 100 -upkeep = 0 -sabotage = 0 -sound = "w_colossus" -sound_alt = "w_generic" -helptext = _("\ -In the city where this wonder is built, +1 trade is added to every tile\ - that generates trade on its own.\ - Obsolete by: Automobile.\ -") - - -[building_copernicus_observatory] -name = _("Copernicus' Observatory") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Astronomy", "Player", TRUE, FALSE - "Building", "Copernicus' Observatory", "Player", FALSE, TRUE - } -graphic = "b.copernicus_observatory" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 100 -upkeep = 0 -sabotage = 0 -sound = "w_copernicus_observatory" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Boosts science production by 100% in the city where it is built.\ - That is, the base science level before any improvements were made,\ - is added to the total science. This wonder is never obsolete.\ -") - -[building_cure_for_cancer] -name = _("Cure For Cancer") -genus = "GreatWonder" -reqs = - { "type", "name", "range" - "Tech", "Genetic Engineering", "Player" - } -graphic = "b.cure_for_cancer" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 400 -upkeep = 0 -sabotage = 0 -sound = "w_cure_for_cancer" -sound_alt = "w_generic" -helptext = _("\ -This stunning technological achievement makes two content citizens\ - happy in all cities of all players who know Genetic\ - Engineering. In the event where there are not enough\ - content citizens to benefit from this effect, the wonder\ - applies to unhappy citizens (including those unhappy about military\ - activity), making each content then happy. This wonder is never obsolete.\ -") - -[building_eiffel_tower] -name = _("Eiffel Tower") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Steam Engine", "Player", TRUE, FALSE - "Building", "Eiffel Tower", "Player", FALSE, TRUE - } -graphic = "b.eiffel_tower" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 100 -upkeep = 0 -sabotage = 0 -sound = "w_eiffel_tower" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -All your cities support one unit free of\ - shield upkeep. This wonder is never obsolete.\ -") - -[building_genghis_khans_equestrian_school] -name = _("Genghis Khan's Equestrian School") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Horseback Riding", "Player", TRUE, FALSE - "Building", "Genghis Khan's Equestrian School", "Player", FALSE, TRUE - "Building", "Barracks", "City", TRUE, FALSE - } -graphic = "b.genghis_khans_equestrian_school" -graphic_alt = "b.sun_tzus_war_academy" -obsolete_by = - { "type", "name", "range" - "Tech", "Mobile Warfare", "Player" - } -build_cost = 150 -upkeep = 0 -sabotage = 0 -sound = "w_sun_tzus_war_academy" -sound_alt = "w_generic" -helptext = _("\ -Gives all mounted units +1 movement point, except for Cavalry. Must be\ - built in a city with Barracks I (not II). Obsolete by: Mobile Warfare.\ -") - -[building_gibraltar_fortress] -name = _("Gibraltar Fortress") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Metallurgy", "Player", TRUE, FALSE - "Building", "Gibraltar Fortress", "Player", FALSE, TRUE - "TerrainClass", "Oceanic", "Adjacent", TRUE, FALSE - } -graphic = "b.gibraltar_fortress" -graphic_alt = "b.great_wall" -obsolete_by = - { "type", "name", "range" - } -build_cost = 350 -upkeep = 0 -sabotage = 0 -sound = "w_gibraltar_fortress" -sound_alt = "w_generic" -helptext = _("\ -Gives a Coastal Defense in all your coastal cities. This has no effect\ - when Coastal Defense is already present. This Wonder must be built\ - in a coastal city. It does not become obsolete.\ -") - -[building_great_wall] -name = _("Great Wall") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Masonry", "Player", TRUE, FALSE - "Building", "Great Wall", "Player", FALSE, TRUE - } -graphic = "b.great_wall" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Machine Tools", "Player" - } -build_cost = 275 -upkeep = 0 -sabotage = 0 -sound = "w_great_wall" -sound_alt = "w_generic" -helptext = _("\ -Gives a City Wall in all your cities. This has no effect\ - when City Walls are already present. This Wonder is made\ - obsolete when you discover Machine Tools.\ -") - -[building_hanging_gardens] -name = _("Hanging Gardens") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Pottery", "Player", TRUE, FALSE - "Building", "Hanging Gardens", "Player", FALSE, TRUE - } -graphic = "b.hanging_gardens" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Railroad", "Player" - } -build_cost = 200 -upkeep = 0 -sabotage = 0 -sound = "w_hanging_gardens" -sound_alt = "w_generic" -helptext = _("\ -Makes two content citizens happy in every city in your nation.\ - In the event where there are no content citizens to get the\ - effect of Hanging Gardens, the wonder applies to unhappy citizens\ - (including those unhappy about military activity), making each content\ - then happy. Gives +2 luxury in the city where it is built.\ - Obsolete by: Railroad.\ -") - -[building_hoover_dam] -name = _("Hoover Dam") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Electronics", "Player", TRUE, FALSE - "Extra", "River", "Adjacent", TRUE, FALSE - "Building", "Hoover Dam", "Player", FALSE, TRUE - } -graphic = "b.hoover_dam" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 600 -upkeep = 0 -sabotage = 0 -sound = "w_hoover_dam" -sound_alt = "w_generic" -helptext = _("\ -Works exactly as a Hydro Plant in all your cities.\ - (This reduces pollution and increases the effects\ - of Factories and Mfg. Plants.) This wonder is never obsolete.\ -") - -[building_isaac_newtons_college] -name = _("Isaac Newton's College") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Theory of Gravity", "Player", TRUE, FALSE - "Building", "Isaac Newton's College", "Player", FALSE, TRUE - } -graphic = "b.isaac_newtons_college" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 400 -upkeep = 0 -sabotage = 0 -sound = "w_isaac_newtons_college" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Adds 100% of base science production to every city in your\ - nation that has a University. That is, the boost that a\ - Library gives with no other science improvements is added\ - to the total science output in each city with a University.\ - This wonder is never obsolete.\ -") - -[building_js_bachs_cathedral] -name = _("J.S. Bach's Cathedral") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Theology", "Player", TRUE, FALSE - "Building", "J.S. Bach's Cathedral", "Player", FALSE, TRUE - } -graphic = "b.js_bachs_cathedral" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 300 -upkeep = 0 -sabotage = 0 -sound = "w_js_bachs_cathedral" -sound_alt = "w_generic" -helptext = _("\ -Makes two unhappy citizens content in every city in your nation\ - (including citizens unhappy about military activity).\ - This wonder is never obsolete.\ -") - -[building_king_richards_crusade] -name = _("King Richard's Crusade") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Engineering", "Player", TRUE, FALSE - "Building", "King Richard's Crusade", "Player", FALSE, TRUE - } -graphic = "b.king_richards_crusade" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Robotics", "Player" - } -build_cost = 150 -upkeep = 0 -sabotage = 0 -sound = "w_king_richards_crusade" -sound_alt = "w_generic" -helptext = _("\ -Adds one extra shield resource on every tile in and around\ - the city where it is built. Obsolete by: Robotics.\ -") - -[building_leonardos_workshop] -name = _("Leonardo's Workshop") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Invention", "Player", TRUE, FALSE - "Building", "Leonardo's Workshop", "Player", FALSE, TRUE - } -graphic = "b.leonardos_workshop" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Automobile", "Player" - } -build_cost = 300 -upkeep = 0 -sabotage = 0 -sound = "w_leonardos_workshop" -sound_alt = "w_generic" -helptext = _("\ -Upgrades two obsolete units per game turn. Obsolete by:\ - Automobile.\ -") - -[building_lighthouse] -name = _("Lighthouse") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Map Making", "Player", TRUE, FALSE - "TerrainClass", "Oceanic", "Adjacent", TRUE, FALSE - "Building", "Lighthouse", "Player", FALSE, TRUE - } -graphic = "b.lighthouse" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Miniaturization", "Player" - } -build_cost = 170 -upkeep = 0 -sabotage = 0 -sound = "w_lighthouse" -sound_alt = "w_generic" -helptext = _("\ -Gives all your sea units 2 additional movement points,\ - while increasing their vision. Obsolete by: Miniaturization.\ -") - -[building_magellans_expedition] -name = _("Magellan's Expedition") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Navigation", "Player", TRUE, FALSE - "TerrainClass", "Oceanic", "Adjacent", TRUE, FALSE - "Building", "Magellan's Expedition", "Player", FALSE, TRUE - } -graphic = "b.magellans_expedition" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 400 -upkeep = 0 -sabotage = 0 -sound = "w_magellans_expedition" -sound_alt = "w_generic" -helptext = _("\ -All your new sea units built in cities in your nation start with an\ - additional veteran level (this is cumulative with any Port Facility.)\ - This wonder is never obsolete.\ -") - -[building_manhattan_project] -name = _("Manhattan Project") -genus = "GreatWonder" -reqs = - { "type", "name", "range" - "Tech", "Nuclear Fission", "Player" - } -graphic = "b.manhattan_project" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 600 -upkeep = 0 -sabotage = 0 -sound = "w_manhattan_project" -sound_alt = "w_generic" -;helptext is set in client/helpdata.c:helptext_wonder() -helptext = _("\ -Allows all nations who know Nuclear Fission to make nuclear weapons.\ - This Wonder does not become obsolete.\ -") - -[building_marco_polos_embassy] -name = _("Marco Polo's Embassy") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Trade", "Player", TRUE, FALSE - "Building", "Marco Polo's Embassy", "Player", FALSE, TRUE - } -graphic = "b.marco_polos_embassy" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 400 -upkeep = 0 -sabotage = 0 -sound = "w_marco_polos_embassy" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -This Wonder increases Trade, the very lifeblood of your tax income, science output,\ - and luxury for happiness. With this Wonder, Trade in each city increases by 40%.\ - This Wonder does not become obsolete.\ -") - -[building_michelangelos_chapel] -name = _("Michelangelo's Chapel") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Monotheism", "Player", TRUE, FALSE - "Building", "Michelangelo's Chapel", "Player", FALSE, TRUE - } -graphic = "b.michelangelos_chapel" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 300 -upkeep = 0 -sabotage = 0 -sound = "w_michelangelos_chapel" -sound_alt = "w_generic" -helptext = _("\ -This Wonder counts as a Cathedral in all cities which lack one.\ - That is, it makes 3 unhappy citizens content in each city,\ - but does not affect citizens unhappy about military activity.\ - (Theology increases the effect by +1. Communist government\ - reduces the effect by -1.)\ -"), _(" -In cities which already have a Cathedral, this Wonder enhances the\ - effects of the Cathedral, adding +1 happy citizen and +1 forced content.\ - This Wonder is never obsolete.\ -") - -;this is wonder #61 -[building_mausoleum_of_mausolos] -name = _("Mausoleum of Mausolos") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Ceremonial Burial", "Player", TRUE, FALSE - "Building", "Mausoleum of Mausolos", "Player", FALSE, TRUE - } -graphic = "b.mausoleum" -graphic_alt = "b.oracle" -obsolete_by = - { "type", "name", "range", "survives" - "Tech", "Radio", "Player", FALSE - } -build_cost = 200 -upkeep = 0 -sabotage = 0 -sound = "w_oracle" -sound_alt = "w_generic" -helptext = _("\ -With this wonder, City Walls and Courthouses each make one unhappy citizen\ - content in their city, unless that citizen is unhappy about aggression.\ - Also, no cities in the empire with this Wonder can be incited to revolt.\ - The discovery of Radio makes the Mausoleum obsolete.\ -") - -[building_oracle] -name = _("Oracle") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Mysticism", "Player", TRUE, FALSE - "Building", "Oracle", "Player", FALSE, TRUE - } -graphic = "b.oracle" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Theology", "Player" - } -build_cost = 100 -upkeep = 0 -sabotage = 0 -sound = "w_oracle" -sound_alt = "w_generic" -helptext = _("\ -Makes two of your unhappy citizens content in every city\ - with a Temple in your nation. Does not affect citizens made\ - unhappy by military activity. Obsolete by: Theology.\ -") - -[building_pyramids] -name = _("Pyramids") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Masonry", "Player", TRUE, FALSE - "Building", "Pyramids", "Player", FALSE, TRUE - } -graphic = "b.pyramids" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 160 -upkeep = 0 -sabotage = 0 -sound = "w_pyramids" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Every city will gain +25% to its food storage when population changes.\ - In addition, the city with the Pyramids can rapture when celebrating.\ - This Wonder does not become obsolete.\ -") - -[building_shakespeares_theatre] -name = _("Shakespeare's Theater") -rule_name = "Shakespeare's Theatre" ; en_GB used originally -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Medicine", "Player", TRUE, FALSE - "Building", "Shakespeare's Theatre", "Player", FALSE, TRUE - } -graphic = "b.shakespeares_theatre" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 200 -upkeep = 0 -sabotage = 0 -sound = "w_shakespeares_theatre" -sound_alt = "w_generic" -helptext = _("\ -Makes all angry and unhappy citizens content in the city where it\ - is located, including citizens unhappy about military activity.\ - This Wonder does not become obsolete.\ -") - -;this should be wonder #65 if we counted correctly and need it for the "statue hack" to determine if player can get gov. -[building_statue_of_liberty] -name = _("Statue of Liberty") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Democracy", "Player", TRUE, FALSE - "Building", "Statue of Liberty", "Player", FALSE, TRUE - } -graphic = "b.statue_of_liberty" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 400 -upkeep = 0 -sabotage = 0 -sound = "w_statue_of_liberty" -sound_alt = "w_generic" -helptext = _("\ -Allows you to instantly change government, including governments\ - not yet researched by your civilization, and without\ - the transition period of Anarchy.\ - This Wonder does not become obsolete.\ -") - -[building_statue_of_zeus] -name = _("Statue of Zeus") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Polytheism", "Player", TRUE, FALSE - "Building", "Statue of Zeus", "Player", FALSE, TRUE - } -graphic = "b.statue_of_zeus" -graphic_alt = "b.oracle" -obsolete_by = - { "type", "name", "range", "survives" - } -build_cost = 100 -upkeep = 0 -sabotage = 0 -sound = "w_oracle" -sound_alt = "w_generic" -helptext = _("\ -The powerful Zeus gives order and organization to both city and nation.\ - One citizen is made content about military activity in every city in\ - your nation. In the city the statue is located, it makes one citizen\ - happy and provides free upkeep to 4 units. Except for one permanent\ - happy citizen, the discovery of Tactics makes the Statue of Zeus obsolete.\ -") - -[building_supreme_court] -name = _("Supreme Court") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Literacy", "Player", TRUE, FALSE - "Building", "Supreme Court", "Player", FALSE, TRUE - } -graphic = "b.great_library" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 200 -upkeep = 0 -sabotage = 0 -sound = "w_great_library" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -The Supreme Court gives the same effect as an extra Courthouse in all your cities.\ - If a Courthouse is already present, the additional bonus for diplomatic combat and\ - Steal Tech is 10%. This Wonder is never obsolete.\ -") - -[building_sun_tzus_war_academy] -name = _("Sun Tzu's War Academy") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Feudalism", "Player", TRUE, FALSE - "Building", "Sun Tzu's War Academy", "Player", FALSE, TRUE - } -graphic = "b.sun_tzus_war_academy" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Mobile Warfare", "Player" - } -build_cost = 300 -upkeep = 0 -sabotage = 0 -sound = "w_sun_tzus_war_academy" -sound_alt = "w_generic" -helptext = _("\ -All your new military land units produced in cities in your nation\ - start with an additional veteran level (this is cumulative with any\ - Barracks in a city: with both, units are created as Hardened).\ - Obsolete by: Mobile Warfare.\ -") - -[building_temple_of_artemis] -name = _("Temple of Artemis") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Mysticism", "Player", TRUE, FALSE - "Building", "Temple", "City", TRUE, FALSE - "Building", "Temple of Artemis", "Player", FALSE, TRUE - - } -graphic = "b.temple_of_artemis" -graphic_alt = "b.oracle" -obsolete_by = - { "type", "name", "range", "survives" - "Tech", "Computers", "Player", FALSE - } -build_cost = 250 -upkeep = 0 -sabotage = 0 -sound = "w_oracle" -sound_alt = "w_generic" -helptext = _("\ -The bounteous Artemis bestows a multitudinous benefaction to all cities\ - with Temples: +1 production, +1 luxury, +1 science, and +1 gold.\ - Requires a Temple in the city where it will be built. (This wonder also\ - recovers the lost bonus shield in cities built on resources of +1 shield:\ - i.e. Grassland shield resource, Tundra fur.) Obsolete by: Computers.\ -") - -[building_teslas_laboratory] -name = _("Tesla's Laboratory") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Electricity", "Player", TRUE, FALSE - "Building", "Tesla's Laboratory", "Player", FALSE, TRUE - } -graphic = "b.teslas_laboratory" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 200 -upkeep = 0 -sabotage = 0 -sound = "w_teslas_laboratory" -sound_alt = "w_generic" -helptext = _("\ -Upgrades one obsolete unit per turn. This Wonder\ - does not become obsolete.\ -") - -[building_internet] -name = _("The Internet") -genus = "SmallWonder" - reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Computers", "Player", TRUE, FALSE - "Building", "The Internet", "Player", FALSE, TRUE - } -graphic = "b.internet" -graphic_alt = "b.seti_program" -obsolete_by = - { "type", "name", "range" - } -build_cost = 600 -upkeep = 0 -sabotage = 0 -sound = "w_internet" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Adds to science production in all your cities with\ - a Research Lab, 100% of base output.\ - This Wonder does not become obsolete.\ -") - -[building_united_nations] -name = _("United Nations") -genus = "GreatWonder" -reqs = - { "type", "name", "range" - "Tech", "Communism", "Player" - } -graphic = "b.united_nations" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 600 -upkeep = 0 -sabotage = 0 -sound = "w_united_nations" -sound_alt = "w_generic" -helptext = _("\ -Creates a World Senate that may prevent declarations of war in some circumstances. If\ - any city in the world is in revolt for more than two turns, its whole government falls.\ - This Wonder does not become obsolete.\ -") - -[building_voyage_of_darwin] -name = _("Voyage of Darwin") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Railroad", "Player", TRUE, FALSE - "Building", "Voyage of Darwin", "Player", FALSE, TRUE - } -graphic = "b.darwins_voyage" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 200 -upkeep = 0 -sabotage = 0 -sound = "w_darwins_voyage" -sound_alt = "w_generic" -helptext = _("\ -In the city where this wonder is built, +1 trade is added to every tile\ - that generates trade on its own.\ - This Wonder is never obsolete.\ -") - -[building_womens_suffrage] -name = _("Women's Suffrage") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Industrialization", "Player", TRUE, FALSE - "Building", "Women's Suffrage", "Player", FALSE, TRUE - } -graphic = "b.womens_suffrage" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 300 -upkeep = 0 -sabotage = 0 -sound = "w_womens_suffrage" -sound_alt = "w_generic" -helptext = _("\ -In the capacity of reducing Military Unhappiness, this Wonder neutralizes the\ - unhappiness caused by two military units. This Wonder has no other\ - effect. It does not confer bonuses against hostile diplomats like a Police\ - Station. It gives no bonus to cities which already have a Police Station.\ - This Wonder does not become obsolete.\ -") - -[building_capitalization] -name = _("Coinage") -genus = "Special" -flags = "Gold" -reqs = - { "type", "name", "range" - - } -graphic = "b.capitalization" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 999 -upkeep = 0 -sabotage = 0 -helptext = _("\ -This is not a normal improvement. Setting production to Coinage converts\ - normal output into tax output (money, coins!)\ -") diff --git a/freeciv/freeciv/data/.historic/mp2-preArctic/cities.ruleset b/freeciv/freeciv/data/.historic/mp2-preArctic/cities.ruleset deleted file mode 100644 index 9a4ee3bf8..000000000 --- a/freeciv/freeciv/data/.historic/mp2-preArctic/cities.ruleset +++ /dev/null @@ -1,186 +0,0 @@ -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -[datafile] -description="Cities data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -; /* <-- avoid gettext warnings -; -; A specialist is a city citizen who is not a tile worker. Usually the -; player can control what specialist each citizen is, so long as the -; requirements for that specialist are met. -; -; Below are the entries for the specialists, one per specialist type. -; The tag name (in [specialist_*]) doesn't matter so long as it's unique. -; For each specialist the following fields may be set: -; -; -; name = translatable (plural) name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; if -; not present, "name" is used for this purpose too. Since -; the name used in savegames must not change, if you want -; to rename an item after a ruleset has been released, you -; should set "rule_name" to the original value of "name". -; short_name = one-character "short name" used (for instance) in cityrep; -; should be first character/abbrevation of "name" -; graphic = tag specifying preferred graphic -; Different images based on citizen number are supported. -; If no such images indexed with citizen number are found, -; plain tag is used instead. -; graphic_alt = fallback graphic tag in case the specialist graphic isn't -; found. -; reqs = requirements to have the specialist pick (see -; effects.ruleset and README.effects for help on requirements) -; helptext = optional help text string; should escape all raw newlines -; so that xgettext parsing works -; -; */ <-- avoid gettext warnings - -[specialist_elvis] -name = _("Entertainers") -; (The original specialist names in the classic ruleset and derivatives were -; not designed to be user-visible.) -rule_name = "elvis" -short_name = _("?Elvis:E") -graphic = "specialist.entertainer" -reqs = - { "type", "name", "range" -; Nothing - } -helptext = _("\ -Each Entertainer produces two luxury points for their city per turn. \ -See the section on Happiness for the effects of luxury points.\ -") - -[specialist_scientist] -name = _("Scientists") -rule_name = "scientist" -short_name = _("?Scientist:S") -graphic = "specialist.scientist" -reqs = - { "type", "name", "range" -; Nothing - } -helptext = _("\ -Each Scientist adds three points to your empire's research output \ -per turn.\ -") - -[specialist_taxman] -name = _("Taxmen") -rule_name = "taxman" -short_name = _("?Taxman:T") -graphic = "specialist.taxman" -reqs = - { "type", "name", "range" -; Nothing - } -helptext = _("\ -Each tax collector produces three extra gold for your treasury \ -per turn.\ -") - -[specialist_worker] -name = _("Laborer") -; (The original specialist names in the classic ruleset and derivatives were -; not designed to be user-visible.) -rule_name = "worker" -short_name = _("?Laborer:L") -graphic = "specialist.worker" -reqs = - { "type", "name", "range" -; Nothing - } -helptext = _("\ -Each Laborer produces one production point for their city per turn. \ -") - -[specialist_merchant] -name = _("Merchant") -; (The original specialist names in the classic ruleset and derivatives were -; not designed to be user-visible.) -rule_name = "merchant" -short_name = _("?Merchant:M") -graphic = "specialist.merchant" -reqs = - { "type", "name", "range" -; Nothing - } -helptext = _("\ -Each Merchant produces two trade points for their city per turn.\ - Trade will then be partioned by your nation's tax rates into\ - Gold, Science, and Luxury.\ -") - -[specialist_farmer] -name = _("Farmer") -; (The original specialist names in the classic ruleset and derivatives were -; not designed to be user-visible.) -rule_name = "farmer" -short_name = _("?Farmer:F") -graphic = "specialist.farmer" -reqs = - { "type", "name", "range" -; Nothing - } -helptext = _("\ -Each Farmer provides one food for their city per turn. Yet each\ - citizen consumes 2 food/turn. Assigning a farmer may be useful\ - for a citizen who otherwise produces no food.\ -") - - - -[parameters] -add_to_size_limit = 40 ; cities >= this cannot be added to. -angry_citizens = TRUE ; set to FALSE to disable angry citizens -celebrate_size_limit = 3 ; cities >= can celebrate - -changable_tax = TRUE ; set to FALSE to disallow changing of tax rates -;forced_science = 0 ; set these fields when changeable_tax is turned off -;forced_luxury = 100 -;forced_gold = 0 - -vision_reveal_tiles = TRUE ; civ1 & 2 default FALSE - -pop_report_zeroes = 4 ; Population in reports in tens of thousands - -[citizen] -nationality = TRUE ; account for the nationality of the citizens -convert_speed = 1000 ; base probability 333/1000 -> once every 3 turns -partisans_pct = 0 ; percentage of own nationality to inspire partisans - ; if 0, original city owner information is used instead -conquest_convert_pct = 34 ; percentage which converts to the new nation - ; after a city was conquered. Applied separately for each - ; nationality present in the city, and number of - ; converted people rounded up - -[missing_unit_upkeep] -; Get rid of a unit the city is unable to pay the X upkeep of. -; X_protected - never get rid of a unit with any of the listed unit type -; flags. -; X_unit_act - have the unit perform the listed actions until success, -; death or the list ends. -; X_wipe - wipe the unit if it survived performing the actions listed -; above. - -food_protected = "EvacuateFirst" -; food_unit_act = -food_wipe = TRUE - -; TODO: Should missing gold upkeep really be able to kill units with the -; EvacuateFirst unit type flag? -; gold_protected = -; gold_unit_act = -gold_wipe = TRUE - -shield_protected = "EvacuateFirst" -shield_unit_act = "Help Wonder", "Recycle Unit", "Disband Unit" -shield_wipe = FALSE diff --git a/freeciv/freeciv/data/.historic/mp2-preArctic/default.lua b/freeciv/freeciv/data/.historic/mp2-preArctic/default.lua deleted file mode 100644 index 5cb455c75..000000000 --- a/freeciv/freeciv/data/.historic/mp2-preArctic/default.lua +++ /dev/null @@ -1,203 +0,0 @@ --- When creating new ruleset, you should copy this file only if you --- need to override default one. Usually you should implement your --- own scripts in ruleset specific script.lua. This way maintaining --- ruleset is easier as you do not need to keep your own copy of --- default.lua updated when ever it changes in Freeciv distribution. - --- Get gold from entering a hut. -function _deflua_hut_get_gold(unit, gold) - local owner = unit.owner - - notify.event(owner, unit.tile, E.HUT_GOLD, PL_("You found %d gold.", - "You found %d gold.", gold), - gold) - owner:change_gold(gold) -end - --- Default if intended hut behavior wasn`t possible. -function _deflua_hut_consolation_prize(unit) - _deflua_hut_get_gold(unit, 2) -end - --- Get a tech from entering a hut. -function _deflua_hut_get_tech(unit) - local owner = unit.owner - local tech = owner:give_tech(nil, -1, false, "hut") - - if tech then - notify.event(owner, unit.tile, E.HUT_TECH, - _("You found %s in ancient scrolls of wisdom."), - tech:name_translation()) - notify.research(owner, false, E.TECH_GAIN, - -- /* TRANS: One player got tech for the whole team. */ - _("The %s found %s in ancient scrolls of wisdom for you."), - owner.nation:plural_translation(), - tech:name_translation()) - notify.research_embassies(owner, E.TECH_EMBASSY, - -- /* TRANS: first %s is leader or team name */ - _("%s has acquired %s from ancient scrolls of wisdom."), - owner:research_name_translation(), - tech:name_translation()) - return true - else - return false - end -end - --- Get a mercenary unit from entering a hut. -function _deflua_hut_get_mercenaries(unit) - local owner = unit.owner - local type = find.role_unit_type('HutTech', owner) - - if not type or not type:can_exist_at_tile(unit.tile) then - type = find.role_unit_type('Hut', nil) - if not type or not type:can_exist_at_tile(unit.tile) then - type = nil - end - end - - if type then - notify.event(owner, unit.tile, E.HUT_MERC, - _("A band of friendly mercenaries joins your cause.")) - owner:create_unit(unit.tile, type, 0, unit:get_homecity(), -1) - return true - else - return false - end -end - --- Get new city from hut, or settlers (nomads) if terrain is poor. -function _deflua_hut_get_city(unit) - local owner = unit.owner - local settlers = find.role_unit_type('Cities', owner) - - if unit:is_on_possible_city_tile() then - owner:create_city(unit.tile, "") - notify.event(owner, unit.tile, E.HUT_CITY, - _("You found a friendly city.")) - return true - else - if settlers and settlers:can_exist_at_tile(unit.tile) then - notify.event(owner, unit.tile, E.HUT_SETTLER, - _("Friendly nomads are impressed by you, and join you.")) - owner:create_unit(unit.tile, settlers, 0, unit:get_homecity(), -1) - return true - else - return false - end - end -end - --- Get barbarians from hut, unless close to a city, king enters, or --- barbarians are disabled --- Unit may die: returns true if unit is alive -function _deflua_hut_get_barbarians(unit) - local tile = unit.tile - local type = unit.utype - local owner = unit.owner - - if server.setting.get("barbarians") == "DISABLED" - or unit.tile:city_exists_within_max_city_map(true) - or type:has_flag('Gameloss') then - notify.event(owner, unit.tile, E.HUT_BARB_CITY_NEAR, - _("An abandoned village is here.")) - return true - end - - local alive = tile:unleash_barbarians() - if alive then - notify.event(owner, tile, E.HUT_BARB, - _("You have unleashed a horde of barbarians!")); - else - notify.event(owner, tile, E.HUT_BARB_KILLED, - _("Your %s has been killed by barbarians!"), - type:name_translation()); - end - return alive -end - --- Randomly choose a hut event -function _deflua_hut_enter_callback(unit) - local chance = random(0, 7) - local alive = true - - if chance == 0 or chance == 1 then - _deflua_hut_get_gold(unit, 1) - elseif chance == 2 or chance == 3 then - _deflua_hut_get_gold(unit, 2) - elseif chance == 4 then - _deflua_hut_get_gold(unit, 5) - elseif chance == 5 then - _deflua_hut_get_gold(unit, 10) - elseif chance == 6 then - if not _deflua_hut_get_mercenaries(unit) then - _deflua_hut_consolation_prize(unit) - end - elseif chance == 7 then - alive = _deflua_hut_get_barbarians(unit) - end - - -- continue processing if unit is alive - return (not alive) -end - -signal.connect("hut_enter", "_deflua_hut_enter_callback") - - ---[[ - Make partisans around conquered city - - if requirements to make partisans when a city is conquered is fulfilled - this routine makes a lot of partisans based on the city`s size. - To be candidate for partisans the following things must be satisfied: - 1) The loser of the city is the original owner. - 2) The Inspire_Partisans effect must be larger than zero. - - If these conditions are ever satisfied, the ruleset must have a unit - with the Partisan role. - - In the default ruleset, the requirements for inspiring partisans are: - a) Guerilla warfare must be known by atleast 1 player - b) The player must know about Communism and Gunpowder - c) The player must run either a democracy or a communist society. -]]-- - --- Informs that the tribe has run away seeing your plane -function _deflua_hut_frighten_callback(unit, extra) - local owner = unit.owner - notify.event(owner, unit.tile, E.HUT_BARB, - _("Your overflight frightens the tribe;" - .. " they scatter in terror.")) - return true -end -signal.connect("hut_frighten", "_deflua_hut_frighten_callback") - -function _deflua_make_partisans_callback(city, loser, winner, reason) - if reason ~= 'conquest' or city:inspire_partisans(loser) <= 0 then - return - end - - local partisans = random(0, 1 + (city.size + 1) / 2) + 1 - if partisans > 8 then - partisans = 8 - end - city.tile:place_partisans(loser, partisans, city:map_sq_radius()) - notify.event(loser, city.tile, E.CITY_LOST, - _("The loss of %s has inspired partisans!"), city.name) - notify.event(winner, city.tile, E.UNIT_WIN_ATT, - _("The loss of %s has inspired partisans!"), city.name) -end - -signal.connect("city_transferred", "_deflua_make_partisans_callback") - - --- Notify player about the fact that disaster had no effect if that is --- the case -function _deflua_harmless_disaster_message(disaster, city, had_internal_effect) - if not had_internal_effect then - notify.event(city.owner, city.tile, E.DISASTER, - _("We survived the disaster without serious damage.")) - end -end - -signal.connect("disaster_occurred", "_deflua_harmless_disaster_message") diff --git a/freeciv/freeciv/data/.historic/mp2-preArctic/effects.ruleset b/freeciv/freeciv/data/.historic/mp2-preArctic/effects.ruleset deleted file mode 100644 index 9587bf131..000000000 --- a/freeciv/freeciv/data/.historic/mp2-preArctic/effects.ruleset +++ /dev/null @@ -1,4201 +0,0 @@ -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes, -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -; Note that the freeciv AI may not cope well with anything more -; than minor changes. - -[datafile] -description="Multiplayer-Evolution effects data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -; /* <-- avoid gettext warnings -; -; Effects -; -; type = What the effect does. Values of multiple active effects -; of the same type get summed for the total. -; See README.effects for list of possible types -; value = Value added for the effect type when this effect is active, -; i.e., all requirements are fulfilled -; multiplier = Name of the policy that gives a multiplier for effect's value -; reqs = Requirements for the effect to be active. -; See README.effects for help on requirements -; -; */ <-- avoid gettext warnings - -; /* <-- avoid gettext warnings -; Combat_rounds test as a way to fine tune Bomber balance: -;[effect_combat_rounds_medium_bomber] -;type = "Combat_Rounds" -;value = 20 -;reqs = -; { "type", "name", "range", "present" -; "UnitType", "Medium Bomber", "Local", TRUE -; } -;[effect_combat_rounds_heavy_bomber] -;type = "Combat_Rounds" -;value = 20 -;reqs = -; { "type", "name", "range", "present" -; "UnitType", "Heavy Bomber", "Local", TRUE -; } -;[effect_combat_rounds_stealth_bomber] -;type = "Combat_Rounds" -;value = 20 -;reqs = -; { "type", "name", "range", "present" -; "UnitType", "Stealth Bomber", "Local", TRUE -; } -; */ <-- avoid gettext warnings - -; Combat_rounds for ancient ships -[effect_combat_rounds_riverships] -type = "Combat_Rounds" -value = 15 -reqs = - { "type", "name", "range", "present" - "UnitClass", "RiverShip", "Local", TRUE - "UnitType", "Frigate", "Local", FALSE - } -[effect_combat_rounds_trireme] -type = "Combat_Rounds" -value = 15 -reqs = - { "type", "name", "range", "present" - "UnitType", "Trireme", "Local", TRUE - } - -; Cheating AI effects are in separate file -*include "default/ai_effects.ruleset" - -[effect_unhappysize] -type = "City_Unhappy_Size" -value = 4 - -; Percent foreign citizens who are unhappy if at war -; with their original nation -[effect_angry_conquered] -type = "Enemy_Citizen_Unhappy_Pct" -value = 34 ; handles proper rounding for 1/3 - - -;[effect_happy_foreigners] ; major happy is only a test to see how the Nationality flag works in test games. -;type = "Make_Happy" -;value = 30 -;reqs = -; { "type", "name", "range" -; "Nationality", "War", "City" -; } - - -; Barbarian effects - -[effect_barb1] -type = "No_Diplomacy" -value = 1 -reqs = - { "type", "name", "range" - "NationGroup", "Barbarian", "Player" - } - -; Barbarian disappearance - -[effect_barb_disappear] -type = "Retire_Pct" -value = 10 -reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", TRUE - "Age", "5", "Local", TRUE - "CityTile", "Center", "Local", FALSE - } - -; Lone Leader might escape on coast (33% chance) -; Complement of the two effects should be 0.9 * 0.66 = 0.594 -; (100 - 59) - 10 = 31 -[effect_leader_escape] -type = "Retire_Pct" -value = 31 -reqs = - { "type", "name", "range" - "UnitType", "Barbarian Leader", "Local" - "Age", "5", "Local" - "TerrainClass", "Oceanic", "Adjacent" - "MaxUnitsOnTile", "1", "Local" - } - -; Specialist output bonuses -[effect_elvis] -type = "Specialist_Output" -value = 2 -reqs = - { "type", "name", "range" - "Specialist", "elvis", "Local" - "OutputType", "luxury", "Local" - } - -[effect_scientist] -type = "Specialist_Output" -value = 3 -reqs = - { "type", "name", "range" - "Specialist", "scientist", "Local" - "OutputType", "science", "Local" - } - -[effect_taxman] -type = "Specialist_Output" -value = 3 -reqs = - { "type", "name", "range" - "Specialist", "taxman", "Local" - "OutputType", "gold", "Local" - } - -[effect_merchant] -type = "Specialist_Output" -value = 2 -reqs = - { "type", "name", "range" - "Specialist", "merchant", "Local" - "OutputType", "trade", "Local" - "Building", "A.Smith's Trading Co.", "Player" - } -[effect_merchant2] -type = "Specialist_Output" -value = 1 -reqs = - { "type", "name", "range" - "Specialist", "merchant", "Local" - "OutputType", "gold", "Local" - "Building", "A.Smith's Trading Co.", "Player" - } - -[effect_worker] -type = "Specialist_Output" -value = 1 -reqs = - { "type", "name", "range" - "Specialist", "worker", "Local" - "OutputType", "shield", "Local" - "Building", "A.Smith's Trading Co.", "Player" - } - -[effect_farmer] -type = "Specialist_Output" -value = 1 -reqs = - { "type", "name", "range" - "Specialist", "farmer", "Local" - "OutputType", "food", "Local" - "Building", "A.Smith's Trading Co.", "Player" - } - -; Vision benefit from mountains (for every land unit) -[effect_mountains_vision] -type = "Unit_Vision_Radius_Sq" -value = 5 -reqs = - { "type", "name", "range" - "Terrain", "Mountains", "Local" - "UnitClass", "Land", "Local" - } -[effect_mountains_vision_1] -type = "Unit_Vision_Radius_Sq" -value = 5 -reqs = - { "type", "name", "range" - "Terrain", "Mountains", "Local" - "UnitClass", "LandAirSea", "Local" - } -[effect_mountains_vision_2] -type = "Unit_Vision_Radius_Sq" -value = 5 -reqs = - { "type", "name", "range" - "Terrain", "Mountains", "Local" - "UnitClass", "LandNoKill", "Local" - } - -; basic free tech upkeep -[effect_upkeep_tech_free] -type = "Tech_Upkeep_Free" -value = 3 - -; ******************* TRADE ******************** - -[effect_trade_routes] -type = "Max_Trade_Routes" -value = 1 - -;pow(2, value/1000) -> Base = 50% -[effect_base_trade_revenue_reduce] -type = "Trade_Revenue_Bonus" -value = -1000 - -;Total = 25% -[effect_railroad_trade_revenue_reduce] -type = "Trade_Revenue_Bonus" -value = -1000 -reqs = - { "type", "name", "range" - "Tech", "Railroad", "Player" - } -;Total = 25% -[effect_flight_trade_revenue_reduce] -type = "Trade_Revenue_Bonus" -value = -1000 -reqs = - { "type", "name", "range" - "Tech", "Flight", "Player" - } - - -;If you don't acquire ongoing trade revenue from a trade route, -;a DECREASE in one-time bonus made NO SENSE AT ALL, -;Now it's a one time bonus with potentially slight ROI. -[effect_enter_marketplace_bonus_increase] -type = "Trade_Revenue_Bonus" -value = 2000 -reqs = - { "type", "name", "range" - "Action", "Enter Marketplace", "Local" - } -;TO-DO: pay x more than gold value of vessel entering marketplace, with ROI being somewhat inferior to most -;investments but hinting toward same order of magnitude. - -[effect_establish_traderoute_bonus] -type = "Trade_Revenue_Bonus" -value = -2400 -;this -2400 should go into base effect above -;then reqs action = "Establish Trade Route" can be an increase to counter both the -2400 subtracted above then to -;further tune upward any one time bonus to what it needs to be. reqs can look at unit type also to compensate higher cost -;of making certain units, since route-creating units now vary from 20 shields to 50 shields in cost. - -; *********************************** BASES ******************************* - -; **** FORT ***** -[effect_fort_defense] -type = "Defend_Bonus" -value = 33 -reqs = - { "type", "name", "range", "present" - "Extra", "Fort", "Local", TRUE - "Extra", "Fortress", "Local", FALSE ; Fortress calculated separately even if a fort is under it. - "UnitClass", "Helicopter", "Local", FALSE ; ... these attackers do not activate Fort defense bonus - "UnitClass", "Air", "Local", FALSE ; ... " " " " " " " " - "UnitClass", "AirPillage", "Local", FALSE ; ... " " " " " " " " - "UnitClass", "AirProtect", "Local", FALSE ; ... " " " " " " " " - "UnitClass", "Missile", "Local", FALSE ; ... " " " " " " " " - "UnitType", "Armor", "Local", FALSE ; ... " " " " " " " " - "UnitType", "Armor II", "Local", FALSE ; ... " " " " " " " " - } -; Fort HP regen -[effect_fort_hp_regen] -type = "HP_Regen" -value = 10 -reqs = - { "type", "name", "range" - "Extra", "Fort", "Tile" - "UnitClass", "Land", "Local" - } -[effect_fort_hp_regen_1] -type = "HP_Regen" -value = 10 -reqs = - { "type", "name", "range" - "Extra", "Fort", "Tile" - "UnitClass", "LandAirSea", "Local" - } -[effect_fort_hp_regen_2] -type = "HP_Regen" -value = 10 -reqs = - { "type", "name", "range" - "Extra", "Fort", "Tile" - "UnitClass", "LandNoKill", "Local" - } - -; **** FORTRESS ************************************************************** - -; Adjust the 1.67xdefense_bonus in terrain.ruleset for some attackers: -; **************************************************************************** -[effect_fortress_nonfortbuster] -type = "Defend_Bonus" -value = 20 ;increase 1.67x to 2x except when defending against FortBuster types. -;note: 1.20*1.67=2.0 (this bonus is multiplied after terrain defense_bonus was multiplied) -reqs = - { "type", "name", "range", "present" - "Extra", "Fortress", "Local", TRUE - "UnitFlag", "FortBuster", "Local", FALSE - "UnitFlag", "FortressBuster", "Local", FALSE - "UnitFlag", "AirAttacker", "Local", FALSE - } -[effect_fortressbuster] -type = "Attack_Bonus" -value = 67 ;Cancel defender's 1.67x with attacker getting 1.67x -reqs = - { "type", "name", "range", "present" - "Extra", "Fortress", "Local", TRUE - "UnitFlag", "FortressBuster", "Local", TRUE - } - -; ****** ^^ defense_bonus_correctives ^^ ************************************* - -; Vision benefit from fortress watchtowers -[effect_fortress_vision] -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "tile" - "Tech", "Invention", "Player" - "UnitClass", "Land", "Local" - } -[effect_fortress_vision_1] ;Marines, AAA -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "tile" - "Tech", "Invention", "Player" - "UnitClass", "LandAirSea", "Local" - } -[effect_fortress_vision_2] ;Knights -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "tile" - "Tech", "Invention", "Player" - "UnitClass", "LandNoKill", "Local" - } - -; Fortress HP regen -[effect_fortress_hp_regen] -; Cumulative with fort: 10+15=25 -type = "HP_Regen" -value = 15 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "Tile" - "UnitClass", "Land", "Local" - } -[effect_fortress_hp_regen_1] -type = "HP_Regen" -value = 15 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "Tile" - "UnitClass", "LandAirSea", "Local" - } -[effect_fortress_hp_regen_2] -type = "HP_Regen" -value = 15 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "Tile" - "UnitClass", "LandNoKill", "Local" - } -[effect_fortress_hp_regen_3] -type = "HP_Regen" -value = 25 ;25 because not cumulative with Fort -reqs = - { "type", "name", "range" - "Extra", "Fortress", "Tile" - "UnitClass", "Helicopter", "Local" - } - -[effect_airbase_hp_regen] -type = "HP_Regen" -value = 25 -reqs = - { "type", "name", "range" - "Extra", "Airbase", "Tile" - "UnitClass", "Helicopter", "Local" - } -; ****************** NAVAL BASE ****************************** -[effect_navbase_vision] -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "tile" - "Tech", "Invention", "Player" - "UnitClass", "Trireme", "Local" - } -[effect_navbase_vision1] -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "tile" - "Tech", "Invention", "Player" - "UnitClass", "RiverShip", "Local" - } -[effect_navbase_vision2] -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "tile" - "Tech", "Invention", "Player" - "UnitClass", "Sea", "Local" - } -; Naval Base HP regen -[effect_navbase_hp_regen] -type = "HP_Regen" -value = 20 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "Tile" - "UnitClass", "Sea", "Local" - } -[effect_navbase_hp_regen_1] -type = "HP_Regen" -value = 20 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "Tile" - "UnitClass", "RiverShip", "Local" - } -[effect_navbase_hp_regen_2] -type = "HP_Regen" -value = 20 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "Tile" - "UnitClass", "Trireme", "Local" - } -[effect_navbase_hp_regen_3] -type = "HP_Regen" -value = 20 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "Tile" - "UnitClass", "Submarine", "Local" - } -; *********************************************************** - -; Base vision range - radius of vision is sqrt(5) = 2.24 -[effect_city_vision] -type = "City_Vision_Radius_Sq" -value = 5 - -;PERCENTAGE CHANCE OF STEALING A TECH WHEN CONQUERING A CITY. -[effect_conquest_tech] -type = "Conquest_Tech_Pct" -value = 100 - -; Nuclear power gives +1 moves to sea units (+2 under 2x) -[effect_nuclear_powered_boats] -type = "Move_Bonus" -value = 2 -reqs = - { "type", "name", "range" - "Tech", "Nuclear Power", "Player" - "UnitClass", "Sea", "Local" - } -; Nuclear power gives +1 moves to sea units (+2 under 2x) -[effect_nuclear_powered_subs] -type = "Move_Bonus" -value = 2 -reqs = - { "type", "name", "range" - "Tech", "Nuclear Power", "Player" - "UnitClass", "Submarine", "Local" - } - -[effect_anarchy_upkeep] -type = "Upkeep_Free" -value = 99 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } -[effect_upkeep_communism] -type = "Upkeep_Free" -value = 1 -reqs = - { "type", "name", "range", "quiet" - "Gov", "Communism", "Player", TRUE - } - -[effect_anarchy_upkeep_tech_free] -type = "Tech_Upkeep_Free" -value = 9999 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_republic] -type = "Make_Content_Mil" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_corruption_anarchy0] -type = "Output_Waste" -value = 25 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_anarchy1] -type = "Output_Waste_By_Distance" -value = 200 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_despotism0] -type = "Output_Waste" -value = 37 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_despotism1] -type = "Output_Waste_By_Distance" -value = 400 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_monarchy0] -type = "Output_Waste" -value = 15 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_monarchy1] -type = "Output_Waste_By_Distance" -value = 200 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_communism0] -type = "Output_Waste" -value = 20 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_republic0] -type = "Output_Waste" -value = 15 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_republic1] -type = "Output_Waste_By_Distance" -value = 200 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - "OutputType", "Trade", "Local" - } - -[effect_base_unit_upkeep] -type = "Upkeep_Factor" -value = 1 - -[effect_republic_unit_upkeep] -type = "Upkeep_Factor" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - "OutputType", "Food", "Local" - } - -[effect_democracy_unit_upkeep] -type = "Upkeep_Factor" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - "OutputType", "Food", "Local" - } - -[effect_republic_unit_unhappiness] -type = "Unhappy_Factor" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_democracy_unit_unhappiness] -type = "Unhappy_Factor" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_upkeep_free_units_anarchy] -type = "Unit_Upkeep_Free_Per_City" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - "OutputType", "Shield", "Local" - } - -[effect_upkeep_free_units_despotism] -type = "Unit_Upkeep_Free_Per_City" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - "OutputType", "Shield", "Local" - } - -[effect_upkeep_free_units_monarchy] -type = "Unit_Upkeep_Free_Per_City" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - "OutputType", "Shield", "Local" - } - -[effect_upkeep_free_units_communism] -type = "Unit_Upkeep_Free_Per_City" -value = 4 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - "OutputType", "Shield", "Local" - } - -[effect_civil_war_0] -type = "Civil_War_Chance" -value = 90 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_civil_war_1] -type = "Civil_War_Chance" -value = 80 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_civil_war_2] -type = "Civil_War_Chance" -value = 70 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -[effect_civil_war_3] -type = "Civil_War_Chance" -value = 50 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - } - -[effect_civil_war_4] -type = "Civil_War_Chance" -value = 40 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_civil_war_5] -type = "Civil_War_Chance" -value = 30 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_empire_size_base_0] -type = "Empire_Size_Base" -value = 9 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_empire_size_base_1] -type = "Empire_Size_Base" -value = 10 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_empire_size_base_2] -type = "Empire_Size_Base" -value = 11 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -[effect_empire_size_base_3] -type = "Empire_Size_Base" -value = 12 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - } - -[effect_empire_size_base_4] -type = "Empire_Size_Base" -value = 13 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_empire_size_base_5] -type = "Empire_Size_Base" -value = 14 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_empire_size_base_6] -type = "Empire_Size_Base" -value = 14 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_empire_size_step_0] -type = "Empire_Size_Step" -value = 6 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_empire_size_step_1] -type = "Empire_Size_Step" -value = 10 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_empire_size_step_2] -type = "Empire_Size_Step" -value = 12 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -; Empire_Size_Step disabled for Communism - -[effect_empire_size_step_3] -type = "Empire_Size_Step" -value = 14 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_empire_size_step_4] -type = "Empire_Size_Step" -value = 16 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_empire_size_step_5] -type = "Empire_Size_Step" -value = 15 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_max_rates_0] -type = "Max_Rates" -value = 100 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_max_rates_1] -type = "Max_Rates" -value = 60 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_max_rates_2] -type = "Max_Rates" -value = 70 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -[effect_max_rates_3] -type = "Max_Rates" -value = 80 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - } - -[effect_max_rates_4] -type = "Max_Rates" -value = 80 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_max_rates_5] -type = "Max_Rates" -value = 100 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_martial_law_each_0] -type = "Martial_Law_Each" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_martial_law_each_1] -type = "Martial_Law_Each" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_martial_law_each_2] -type = "Martial_Law_Each" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -[effect_martial_law_each_3] -type = "Martial_Law_Each" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - } - -[effect_martial_law_each_4] -type = "Martial_Law_Each" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_martial_law_max_0] -type = "Martial_Law_Max" -value = 100 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_martial_law_max_1] -type = "Martial_Law_Max" -value = 100 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_martial_law_max_2] -type = "Martial_Law_Max" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -[effect_martial_law_max_3] -type = "Martial_Law_Max" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - } - -[effect_martial_law_max_4] -type = "Martial_Law_Max" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_rapture_grow_0] -type = "Rapture_Grow" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_rapture_grow_1] -type = "Rapture_Grow" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_communism_0] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - "UnitFlag", "Diplomat", "Local" - } - -[effect_gov_tile_bonus_0] -type = "Output_Penalty_Tile" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_gov_tile_bonus_1] -type = "Output_Penalty_Tile" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_gov_tile_bonus_2] -type = "Output_Inc_Tile_Celebrate" -value = 1 -reqs = - { "type", "name", "range" - "OutputType", "Trade", "Local" - "Gov", "Monarchy", "Player" - } - -[effect_gov_tile_bonus_3] -type = "Output_Inc_Tile_Celebrate" -value = 1 -reqs = - { "type", "name", "range" - "OutputType", "Trade", "Local" - "Gov", "Communism", "Player" - } - -[effect_gov_tile_bonus_4] -type = "Output_Inc_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - "OutputType", "Trade", "Local" - } - -[effect_gov_tile_bonus_5] -type = "Output_Inc_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_gov_tile_bonus_6] -type = "Output_Inc_Tile_Celebrate" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Trade", "Local" - } - -[effect_revolution_0] -type = "Revolution_Unhappiness" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_senate_0] -type = "Has_Senate" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_senate_1] -type = "Has_Senate" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_partisans_communism] -type = "Inspire_Partisans" -value = 1 -reqs = - { "type", "name", "range", "present" - "Gov", "Communism", "Player", TRUE - "Tech", "Communism", "Player", TRUE - "Tech", "Gunpowder", "Player", TRUE - "Tech", "Guerilla Warfare", "World", TRUE - "NationGroup", "Barbarian", "Player", FALSE - } - -[effect_partisans_democracy] -type = "Inspire_Partisans" -value = 1 -reqs = - { "type", "name", "range", "present" - "Gov", "Democracy", "Player", TRUE - "Tech", "Communism", "Player", TRUE - "Tech", "Gunpowder", "Player", TRUE - "Tech", "Guerilla Warfare", "World", TRUE - "NationGroup", "Barbarian", "Player", FALSE - } - -[effect_airport_2] -type = "Airlift" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Airport", "City" - } - -[effect_airport_v0] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Airport", "City", TRUE - "UnitClass", "Air", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_airport_v1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Airport", "City", TRUE - "UnitClass", "AirProtect", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_airport_v2] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Airport", "City", TRUE - "UnitClass", "AirPillage", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_airport_v3] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Airport", "City", TRUE - "UnitClass", "Helicopter", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_airport_v4] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Airport", "City", TRUE - "UnitClass", "Missile", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } - -[effect_airport_h1] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Airport", "City" - "UnitClass", "Air", "Local" - } -[effect_airport_h2] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Airport", "City" - "UnitClass", "AirProtect", "Local" - } -[effect_airport_h3] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Airport", "City" - "UnitClass", "AirPillage", "Local" - } -[effect_airport_h4] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Airport", "City" - "UnitClass", "Helicopter", "Local" - } - -; Base max city size of 8 -[effect_aqueduct_size] -type = "Size_Adj" -value = 8 - -[effect_aqueduct] -type = "Size_Adj" -value = 4 -reqs = - { "type", "name", "range" - "Building", "Aqueduct", "City" - } - -[effect_aqueduct_health] -type = "Health_Pct" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Aqueduct", "City" - } - -[effect_bank] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - "Building", "Bank", "City" - "OutputType", "Gold", "Local" - } - -[effect_bank_1] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - "Building", "Bank", "City" - "OutputType", "Luxury", "Local" - } - -[effect_barracks] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "Land", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_a] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "Land", "Local", TRUE - } -[effect_barracks_b] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE ; might be resting in allied city with Barracks I - } -[effect_barracks_c] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - } - -[effect_barracks_ii] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "Land", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_ii_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_ii_2] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_ii_a] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "Land", "Local", TRUE - } -[effect_barracks_ii_b] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - } -[effect_barracks_ii_c] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - } - -[effect_barracks_iii] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "Land", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_iii_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_iii_2] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_iii_a] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Barracks III", "City" - "UnitClass", "Land", "Local" - } -[effect_barracks_iii_b] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - } -[effect_barracks_iii_c] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - } - -;prolongs time-window relevance of amphibious invasions later in game -[effect_triple_training_marines] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "Building", "Port Facility", "City", TRUE - "Building", "Airport", "City", TRUE - "UnitType", "Marines", "Local", TRUE - } - -;--- STANDARD CATHEDRAL sans Michelangelo ------------------------ -[effect_cathedral] -type = "Make_Content" -value = 3 -reqs = - { "type", "name", "range", "present" - "Building", "Cathedral", "City", TRUE - "Building", "Michelangelo's Chapel", "Player", FALSE - } -[effect_cathedral_1] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range", "present" - "Tech", "Theology", "Player", TRUE - "Building", "Cathedral", "City", TRUE - "Building", "Michelangelo's Chapel", "Player", FALSE - } -[effect_cathedral_2] -type = "Make_Content" -value = -1 -reqs = - { "type", "name", "range", "present" - "Gov", "Communism", "Player", TRUE - "Building", "Cathedral", "City", TRUE - "Building", "Michelangelo's Chapel", "Player", FALSE - } -;--- ENHANCED CATHEDRAL with Michelangelo: *** -[effect_cathedral_ma] -type = "Make_Happy" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Cathedral", "City", TRUE - "Building", "Michelangelo's Chapel", "Player", TRUE - } -[effect_cathedral_ma2] -type = "Force_Content" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Cathedral", "City", TRUE - "Building", "Michelangelo's Chapel", "Player", TRUE - } -;------------------------------------------------------------ - -[effect_city_walls] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "UnitClass", "Land", "Local", TRUE - "Building", "Great Wall", "Player", FALSE - "UnitType", "Howitzer", "Local", FALSE - } - -[effect_city_walls_0] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "UnitClass", "Helicopter", "Local", TRUE - "Building", "Great Wall", "Player", FALSE - } -[effect_city_walls_0a] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - "Building", "Great Wall", "Player", FALSE - "UnitType", "Howitzer", "Local", FALSE - } -[effect_city_walls_0b] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - "Building", "Great Wall", "Player", FALSE - "UnitType", "Howitzer", "Local", FALSE - } - -[effect_city_walls_1] -type = "Unit_No_Lose_Pop" -value = 1 -reqs = - { "type", "name", "range" - "Building", "City Walls", "City" - } - -[effect_city_walls_visible] -type = "Visible_Walls" -value = 1 -reqs = - { "type", "name", "range" - "Building", "City Walls", "City" - } - -[effect_coastal_defense] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Coastal Defense", "City" - "UnitClass", "Sea", "Local" - } -[effect_coastal_defense_1] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Coastal Defense", "City" - "UnitClass", "RiverShip", "Local" - } -[effect_coastal_defense_2] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Coastal Defense", "City" - "UnitClass", "Submarine", "Local" - } -[effect_coastal_defense_trireme] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Coastal Defense", "City" - "UnitClass", "Trireme", "Local" - } - -[effect_gibraltar_fortress] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Gibraltar Fortress", "Player", TRUE - "Building", "Coastal Defense", "City", FALSE - "UnitClass", "Sea", "Local" - } -[effect_gibraltar_fortress_1] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Gibraltar Fortress", "Player", TRUE - "Building", "Coastal Defense", "City", FALSE - "UnitClass", "RiverShip", "Local" - } -[effect_gibraltar_fortress_2] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Gibraltar Fortress", "Player", TRUE - "Building", "Coastal Defense", "City", FALSE - "UnitClass", "Submarine", "Local" - } -[effect_gibraltar_fortress_trireme] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Gibraltar Fortress", "Player", TRUE - "Building", "Coastal Defense", "City", FALSE - "UnitClass", "Trireme", "Local" - } - -[effect_amphitheatre] -type = "Make_Content" -value = 3 -reqs = - { "type", "name", "range" - "Building", "Amphitheatre", "City" - } - -[effect_amphitheatre_1] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Tech", "Electricity", "Player" - "Building", "Amphitheatre", "City" - } - -; BECAUSE OF ROUNDING, AVERAGE EFFECT OF 50 ENDS UP BEING 41%, WHEREAS 60 YIELDS ABOUT 53% WHICH IS CLOSER TO ADVERTISED -[effect_courthouse] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "OutputType", "Trade", "Local", TRUE -; "Building", "Palace", "City", FALSE ; Courthouse is not advertised to be useless in cities with a Palace - } - -[effect_courthouse_1] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "OutputType", "shield", "local", TRUE -; "Building", "Palace", "City", FALSE ; Courthouse is not advertised to be useless in cities with a Palace - } - -[effect_courthouse_2] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - "Building", "Courthouse", "City" - } - -[effect_courthouse_3] -type = "Incite_Cost_Pct" -value = 300 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "MaxUnitsOnTile", "0", "Local", FALSE - } - -[effect_courthouse_upkeep] ; Law and order provides +1 upkeep -type = "Unit_Upkeep_Free_Per_City" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Courthouse", "City", TRUE - "OutputType", "Shield", "Local" - } - -[effect_courthouse_tile_corruption] ; Removes output penalties (Despotism/Anarchy) for cities with courthouses -type = "Output_Penalty_Tile" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Courthouse", "City", TRUE - } - -[effect_courthouse_spy_resistance] -type = "Spy_Resistant" -value = 15 ;50-15=35% success rate -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - } - -[effect_courthouse_theft_resistance] -type = "Action_Odds_Pct" -value = -35 ;80-35=45% success rate -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Steal Tech", "Local", TRUE - } - -[effect_courthouse_hostile_diplomat_7] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Steal Tech Escape Expected", "Local", TRUE - } - -[effect_courthouse_hostile_diplomat_8] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Targeted Steal Tech", "Local", TRUE - } - -[effect_courthouse_hostile_diplomat_9] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE - } - -[effect_courthouse_hostile_diplomat_1] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Sabotage City", "Local", TRUE - } - -[effect_courthouse_hostile_diplomat_2] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Sabotage City Escape", "Local", TRUE - } - -[effect_courthouse_hostile_diplomat_3] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Targeted Sabotage City", "Local", TRUE - } - -[effect_courthouse_hostile_diplomat_4] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Targeted Sabotage City Escape", "Local", TRUE - } - -[effect_incite_cost_empty_courthouse] -type = "Incite_Cost_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - "Building", "Courthouse", "City", TRUE - } - -[effect_diplomat_defense_fortress] -type = "Spy_Resistant" -value = 25 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "Local" - } - -[effect_incite_cost_empty] -type = "Incite_Cost_Pct" -value = -50 -reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - "Building", "Courthouse", "City", FALSE - "Building", "Supreme Court", "Player", FALSE - } - -[effect_factory] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Factory", "City" - "OutputType", "Shield", "Local" - } - -[effect_granary] -type = "Growth_Food" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Granary", "City" - } - -[effect_harbour] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "TerrainClass", "Oceanic", "Local" - "Building", "Harbour", "City" - "OutputType", "Food", "Local" - } - -[effect_hydro_plant] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Hydro Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_hydro_plant_1] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Hydro Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_hydro_plant_2] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Hydro Plant", "City", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_hydro_plant_3] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Hydro Plant", "City", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_library] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Library", "City" - "OutputType", "Science", "Local" - } - -[effect_marketplace] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - "OutputType", "Gold", "Local" - } - -[effect_marketplace_1] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - "OutputType", "Luxury", "Local" - } - -; No population pollution until certain techs researched -[effect_pollu_pop_base] -type = "Pollu_Pop_Pct_2" -value = -100 - -[effect_pollu_pop_automobile] -type = "Pollu_Pop_Pct_2" -value = 25 -reqs = - { "type", "name", "range" - "Tech", "Automobile", "Player" - } - -[effect_pollu_pop_industrialization] -type = "Pollu_Pop_Pct_2" -value = 25 -reqs = - { "type", "name", "range" - "Tech", "Industrialization", "Player" - } - -[effect_pollu_pop_mass_production] -type = "Pollu_Pop_Pct_2" -value = 25 -reqs = - { "type", "name", "range" - "Tech", "Mass Production", "Player" - } - -[effect_pollu_pop_plastics] -type = "Pollu_Pop_Pct_2" -value = 25 -reqs = - { "type", "name", "range" - "Tech", "Plastics", "Player" - } - -[effect_mass_transit] -type = "Pollu_Pop_Pct" -value = -100 -reqs = - { "type", "name", "range" - "Building", "Mass Transit", "City" - } -; Increased citizen mobility and ticket revenues increase city base trade by +2 -[effect_mass_transit_1] -type = "Output_Add_Tile" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Mass Transit", "City" - "CityTile", "Center", "Local" - "OutputType", "Trade", "Local" - } - -[effect_mfg_plant] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Mfg. Plant", "City" - "OutputType", "Shield", "Local" - } - -[effect_nuclear_plant] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Nuclear Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_nuclear_plant_1] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Nuclear Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_nuclear_plant_2] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Nuclear Plant", "City", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_nuclear_plant_3] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Nuclear Plant", "City", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_offshore_platform] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "TerrainClass", "Oceanic", "Local" - "Building", "Offshore Platform", "City" - "OutputType", "Shield", "Local" - } - -[effect_palace] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - "OutputType", "Trade", "Local" - } -[effect_palace_1] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - "OutputType", "shield", "local" - } -[effect_palace_2] -type = "Spy_Resistant" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - } -[effect_palace_2_sabotage] -type = "Building_Saboteur_Resistant" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - } -[effect_palace_3] -type = "Capital_City" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - } -[effect_palace_gov_center] -type = "Gov_Center" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - } -[effect_palace_5] -type = "Output_Bonus" -value = 75 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - "Building", "Palace", "City" - "OutputType", "Shield", "Local" - } - -[effect_palace_6] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - "Building", "Palace", "City" - "OutputType", "Shield", "Local" - } -[effect_palace_6a] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - "Building", "Palace", "City" - "OutputType", "Shield", "Local" - } -[effect_palace_7] -type = "Make_Happy" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - } -[effect_palace_fundamentalism] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range", "present", "quiet" - "Gov", "Fundamentalism", "Player", TRUE, TRUE - "Building", "Palace", "City", TRUE, FALSE - "OutputType", "Gold", "Local", TRUE, FALSE - } - -[effect_ecclesiastical_palace] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "OutputType", "Trade", "Local", TRUE - "Building", "Palace", "City", FALSE - } -[effect_ecclesiastical_palace_1] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "OutputType", "Shield", "local", TRUE - "Building", "Palace", "City", FALSE - } -[effect_ecclesiastical_palace_2] -type = "Spy_Resistant" -value = 50 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "Building", "Palace", "City", FALSE - } -[effect_ecclestiastical_palace_3] -type = "Make_Happy" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Ecclesiastical Palace", "City" - } -[effect_ecclesiastical_palace_4] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "UnitType", "Fanatics", "Local", TRUE - } -[effect_ecclesiastical_palace_gov_center] -type = "Gov_Center" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "Building", "Palace", "City", FALSE - } -[effect_ecclesiastical_palace_despotism] -type = "Output_Bonus" -value = 75 -reqs = - { "type", "name", "range", "present", "quiet" - "Gov", "Despotism", "Player", TRUE, TRUE - "Building", "Ecclesiastical Palace", "City", TRUE, FALSE - "OutputType", "Gold", "Local", TRUE, FALSE -; "Building", "Palace", "City", FALSE, FALSE - } -[effect_ecclesiastical_palace_monarchy] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range", "present", "quiet" - "Gov", "Monarchy", "Player", TRUE, TRUE - "Building", "Ecclesiastical Palace", "City", TRUE, FALSE - "OutputType", "Gold", "Local", TRUE, FALSE -; "Building", "Palace", "City", FALSE, FALSE - } -[effect_ecclesiastical_palace_fundamentalism] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range", "present", "quiet" - "Gov", "Fundamentalism", "Player", TRUE, TRUE - "Building", "Ecclesiastical Palace", "City", TRUE, FALSE - "OutputType", "Gold", "Local", TRUE, FALSE - ; "Building", "Palace", "City", FALSE, FALSE - } -[effect_ecclesiastical_palace_communism] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present", "quiet" - "Gov", "Communism", "Player", TRUE, TRUE - "Building", "Ecclesiastical Palace", "City", TRUE, FALSE - "OutputType", "Gold", "Local", TRUE, FALSE - ; "Building", "Palace", "City", FALSE, FALSE - } - -[effect_ecclesiastical_palace_culture] -type = "History" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "Building", "Palace", "City", FALSE - } -[effect_ecclesiastical_palace_2_sabotage] -type = "Building_Saboteur_Resistant" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Ecclesiastical Palace", "City" - } - -[effect_police_station] -type = "Make_Content_Mil" -value = 2 -reqs = - { "type", "name", "range", "present" - "Gov", "Republic", "Player", TRUE - "Building", "Police Station", "City", TRUE - "Building", "Women's Suffrage", "Player", FALSE - } -[effect_police_station_1] -type = "Make_Content_Mil" -value = 4 -reqs = - { "type", "name", "range", "present" - "Gov", "Democracy", "Player", TRUE - "Building", "Police Station", "City", TRUE - "Building", "Women's Suffrage", "Player", FALSE - } -[effect_police_station_spy_resistant] -type = "Spy_Resistant" -value = 10 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - } -[effect_police_station_theft_resistant] -type = "Action_Odds_Pct" -value = -10 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Steal Tech", "Local", TRUE - } - -[effect_port_facility] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Port Facility", "City", TRUE - "UnitClass", "Sea", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_port_facility_a] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Port Facility", "City", TRUE - "UnitClass", "RiverShip", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_port_facility_b] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Port Facility", "City", TRUE - "UnitClass", "Submarine", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_port_facility_1] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Port Facility", "City" - "UnitClass", "Sea", "Local" - } -[effect_port_facility_1a] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Port Facility", "City" - "UnitClass", "RiverShip", "Local" - } -[effect_port_facility_1b] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Port Facility", "City" - "UnitClass", "Submarine", "Local" - } -[effect_port_facility_trireme] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Port Facility", "City", TRUE - "UnitClass", "Trireme", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_port_facility_trireme_1] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Port Facility", "City" - "UnitClass", "Trireme", "Local" - } - -[effect_power_plant] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Power Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Hydro Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_power_plant_1] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Power Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Hydro Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_recycling_center] -type = "Pollu_Prod_Pct" -value = -66 -reqs = - { "type", "name", "range", "present" - "Building", "Recycling Center", "City", TRUE -; A Solar Plant can give a stronger effect than a Recycling Center, in which -; case we want only the Solar Plant's effect (not the addition of the two). - "Building", "Solar Plant", "City", FALSE - } - -; Nasty special cases: where a Solar Plant is present but its effect is less -; than that of a Recycling Center, top up so that the net effect is that of the -; Recycling Center. -; (This would be so much easier if effects could be combined by functions -; other than addition...) - -; Factory and no Mfg. Plant: Solar Plant saves 50%, less than 66%; add 16% -[effect_recycling_center_1] -type = "Pollu_Prod_Pct" -value = -16 -reqs = - { "type", "name", "range", "present" - "Building", "Recycling Center", "City", TRUE - "Building", "Solar Plant", "City", TRUE - "Building", "Factory", "City", TRUE - "Building", "Mfg. Plant", "City", FALSE - } - -; Mfg. Plant and no Factory: Solar Plant saves 50%, less than 66%; add 16% -[effect_recycling_center_2] -type = "Pollu_Prod_Pct" -value = -16 -reqs = - { "type", "name", "range", "present" - "Building", "Recycling Center", "City", TRUE - "Building", "Solar Plant", "City", TRUE - "Building", "Mfg. Plant", "City", TRUE - "Building", "Factory", "City", FALSE - } - -; Neither Factory nor Mfg. Plant: Solar Plant saves 0%; add 66% -[effect_recycling_center_3] -type = "Pollu_Prod_Pct" -value = -66 -reqs = - { "type", "name", "range", "present" - "Building", "Recycling Center", "City", TRUE - "Building", "Solar Plant", "City", TRUE - "Building", "Factory", "City", FALSE - "Building", "Mfg. Plant", "City", FALSE - } - -; Raw materials generated from Recycling add +2 base shields to city production. -[effect_recycling_center_4] -type = "Output_Add_Tile" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Recycling Center", "City" - "CityTile", "Center", "Local" - "OutputType", "Shield", "Local" - } - - -[effect_research_lab] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Library", "City" - "Building", "Research Lab", "City" - "OutputType", "Science", "Local" - } - -[effect_research_lab_1] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "University", "City" - "Building", "Research Lab", "City" - "OutputType", "Science", "Local" - } - -[effect_sam_battery] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "SAM Battery", "City" - "UnitClass", "Air", "Local" - "UnitType", "Stealth Bomber", "Local", FALSE - } -[effect_sam_battery_1] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "SAM Battery", "City" - "UnitClass", "AirProtect", "Local" - "UnitType", "Stealth Fighter", "Local", FALSE - } -[effect_sam_battery_2] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "SAM Battery", "City" - "UnitClass", "AirPillage", "Local" - "UnitType", "Stealth Fighter", "Local", FALSE - } -[effect_sam_battery_stealth_bomber] -type = "Defend_Bonus" -value = 25 -reqs = - { "type", "name", "range" - "Building", "SAM Battery", "City" - "UnitType", "Stealth Bomber", "Local", TRUE - } -[effect_sam_battery_stealth_fighter] -type = "Defend_Bonus" -value = 25 -reqs = - { "type", "name", "range" - "Building", "SAM Battery", "City" - "UnitType", "Stealth Fighter", "Local", TRUE - } - -[effect_sdi_defense] -type = "Nuke_Proof" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "SDI Defense", "City", TRUE - "DiplRel", "Foreign", "Local", TRUE - "DiplRel", "Team", "Local", FALSE - } - -[effect_sdi_defense_1] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "SDI Defense", "City" - "UnitClass", "Missile", "Local" - } - -[effect_sewer_system] -type = "Size_Unlimit" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Aqueduct", "City" - "Building", "Sewer System", "City" - } - -[effect_sewer_system_health] -type = "Health_Pct" -value = 30 -reqs = - { "type", "name", "range" - "Building", "Aqueduct", "City" - "Building", "Sewer System", "City" - } - -[effect_solar_plant] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range" - "Building", "Factory", "City" - "Building", "Solar Plant", "City" - "OutputType", "Shield", "Local" - } - -[effect_solar_plant_1] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range" - "Building", "Mfg. Plant", "City" - "Building", "Solar Plant", "City" - "OutputType", "Shield", "Local" - } - -[effect_solar_plant_2] -type = "Pollu_Prod_Pct" -value = -50 -reqs = - { "type", "name", "range" - "Building", "Factory", "City" - "Building", "Solar Plant", "City" - } - -[effect_solar_plant_3] -type = "Pollu_Prod_Pct" -value = -50 -reqs = - { "type", "name", "range" - "Building", "Mfg. Plant", "City" - "Building", "Solar Plant", "City" - } - -[effect_space_component] -type = "SS_Component" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Space Component", "City" - } - -[effect_space_module] -type = "SS_Module" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Space Module", "City" - } - -[effect_space_structural] -type = "SS_Structural" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Space Structural", "City" - } - -;Timeline is already way behind and too slow, REMOVE: -;[effect_plastics_slowdown] -;type = "Slow_Down_Timeline" -;value = 1 -;reqs = -; { "type", "name", "range", "survives" -; "Tech", "Plastics", "World", TRUE -; } - -;[effect_superconductor_slowdown] -;type = "Slow_Down_Timeline" -;value = 1 -;reqs = -; { "type", "name", "range", "survives" -; "Tech", "Superconductors", "World", TRUE -; } -;1 year per turn ensures spaceship travel time calibrated. -;this can be removed after game.info.spacerace bug of not changing -;timeline gets fixed in server. -[effect_spaceflight_slowdown] -type = "Turn_Years" -value = 1 -reqs = - { "type", "name", "range", "survives" - "Tech", "Space Flight", "World", TRUE - } - -[effect_stock_exchange] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Bank", "City" - "Building", "Stock Exchange", "City" - "OutputType", "Gold", "Local" - } - -[effect_stock_exchange_1] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Bank", "City" - "Building", "Stock Exchange", "City" - "OutputType", "Luxury", "Local" - } - -[effect_super_highways] -type = "Output_Per_Tile" -value = 50 -reqs = - { "type", "name", "range" - "Extra", "Road", "Local" - "Building", "Super Highways", "City" - "OutputType", "Trade", "Local" - } - -; Super Highways increase logistical efficiency to -; get more use out of an airport in size 12+ city. -[effect_super_highways_airlift_facilitation] -type = "Airlift" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Super Highways", "City" - "Building", "Airport", "City" - "Building", "Sewer System", "City" - } - -[effect_mine] -type = "Mining_Pct" -value = 100 -reqs = - { "type", "name", "range" - "Extra", "Mine", "Local" - } - -[effect_oil_well] -type = "Mining_Pct" -value = 100 -reqs = - { "type", "name", "range" - "Extra", "Oil Well", "Local" - } - -[effect_irrigation] -type = "Irrigation_Pct" -value = 100 -reqs = - { "type", "name", "range" - "Extra", "Irrigation", "Local" - } -; Desert with river (and no Oasis) gets 1 extra food from irrigation (total 2) -; ("Nile floods" effect) -[effect_irrigation_2] -type = "Irrigation_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "Terrain", "Desert", "Local", TRUE - "Extra", "River", "Local", TRUE - "Extra", "Oasis", "Local", FALSE - "Extra", "Irrigation", "Local", TRUE - } -; ...same for city centers -[effect_irrigation_3] -type = "Irrigation_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "Terrain", "Desert", "Local", TRUE - "Extra", "River", "Local", TRUE - "Extra", "Oasis", "Local", FALSE - "CityTile", "Center", "Local", TRUE -; "Extra", "Irrigation", "Local", FALSE - "TerrainAlter", "CanIrrigate", "Local", TRUE - "Extra", "Mine", "Local", FALSE - "Extra", "Oil Well", "Local", FALSE - } - -[effect_irrigation_center] -type = "Irrigation_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "CityTile", "Center", "Local", TRUE - "Extra", "Irrigation", "Local", FALSE - "TerrainAlter", "CanIrrigate", "Local", TRUE - "Extra", "Mine", "Local", FALSE - "Extra", "Oil Well", "Local", FALSE - } - -[effect_supermarket] -type = "Output_Per_Tile" -value = 100 -reqs = - { "type", "name", "range" - "Extra", "Farmland", "Local" - "Building", "Supermarket", "City" - "OutputType", "Food", "Local" - } - -[effect_supermarket_center] -type = "Output_Per_Tile" -value = 50 -reqs = - { "type", "name", "range", "present" - "CityTile", "Center", "Local", TRUE - "Extra", "Farmland", "Local", FALSE - "TerrainAlter", "CanIrrigate", "Local", TRUE - "Building", "Supermarket", "City", TRUE - "OutputType", "Food", "Local", TRUE - "Extra", "Mine", "Local", FALSE - "Extra", "Oil Well", "Local", FALSE - } - -[effect_temple] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - } - -[effect_temple_1] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Tech", "Mysticism", "Player" - "Building", "Temple", "City" - } - -[effect_university] -type = "Output_Bonus" -value = 150 -reqs = - { "type", "name", "range" - "Building", "Library", "City" - "Building", "University", "City" - "OutputType", "Science", "Local" - } - -[effect_apollo_program] -type = "Enable_Space" -value = 1 -reqs = - { "type", "name", "range", "survives" - "Building", "Apollo Program", "Player", TRUE - } - -[effect_telegraph_border_vision] -type = "Border_Vision" -value = 1 -reqs = - { "type", "name", "range" - "Tech", "Electricity", "Player" - } - - ; Air+Sea+LandAirSea CLASS units REQUIRE PHYSICS so their BONUS is in their stats to AVOID more [effect_] entries. -[effect_physics_vision] -type = "Unit_Vision_Radius_Sq" -value = 4 -reqs = - { "type", "name", "range" - "Tech", "Physics", "Player" - "UnitClass", "Land", "Local" - } -[effect_physics_vision_1] -type = "Unit_Vision_Radius_Sq" -value = 4 -reqs = - { "type", "name", "range" - "Tech", "Physics", "Player" - "UnitClass", "LandNoKill", "Local" - } -[effect_physics_vision_2] -type = "Unit_Vision_Radius_Sq" -value = 4 -reqs = - { "type", "name", "range" - "Tech", "Physics", "Player" - "UnitClass", "Trireme", "Local" - } -[effect_physics_vision_3] -type = "Unit_Vision_Radius_Sq" -value = 4 -reqs = - { "type", "name", "range" - "Tech", "Physics", "Player" - "UnitClass", "RiverShip", "Local" - } - -[effect_satellite_vision] ;Vision benefit from satellite communication to land units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "Land", "Local" - } -[effect_satellite_vision_1] ;Vision benefit from satellite communication to land units (Marines) -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "LandAirSea", "Local" - } -[effect_satellite_vision_2] ;Vision benefit from satellite communication to sea units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "Sea", "Local" - } -[effect_satellite_vision_2a] ;Vision benefit from satellite communication to sea units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "Submarine", "Local" - } -[effect_satellite_vision_3] ;Vision benefit from satellite communication to sea units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "Air", "Local" - } -[effect_satellite_vision_3a] ;Vision benefit from satellite communication to sea units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "AirProtect", "Local" - } -[effect_satellite_vision_4] ;Vision benefit from satellite communication to cities -type = "City_Vision_Radius_Sq" -value = 36 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - } - -[effect_asmiths_trading_co] -type = "Upkeep_Free" -value = 1 -reqs = - { "type", "name", "range" - "Building", "A.Smith's Trading Co.", "Player" - } - -[effect_colossus] -type = "Output_Inc_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Colossus", "City" - "OutputType", "Trade", "Local" - } - -[effect_copernicus_observatory] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Copernicus' Observatory", "City" - "OutputType", "Science", "Local" - } - -[effect_cure_for_cancer] -type = "Make_Happy" -value = 2 - reqs = - { "type", "name", "range" - "Building", "Cure For Cancer", "World" - "Tech", "Genetic Engineering", "Player" - } - -; HACK: there's all kinds of nasty hard-coded stuff to this Wonder, so it had to be -; given a different name (Voyage of Darwin) to avoid potential messyness -[effect_darwins_voyage] -type = "Output_Inc_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Voyage of Darwin", "City" - "OutputType", "Trade", "Local" - } - -[effect_eiffel_tower] -type = "Unit_Upkeep_Free_Per_City" -value = 1 - reqs = - { "type", "name", "range" - "Building", "Eiffel Tower", "Player" - "OutputType", "Shield", "Local" - } - -[effect_supreme_court] -type = "Output_Waste_Pct" -value = 60 - reqs = - { "type", "name", "range" - "Building", "Supreme Court", "Player" - "OutputType", "Trade", "Local" - } - -;The following effects make Supreme Court count as Courthouse in every city, as advertised -[effect_supreme_court_1] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player", TRUE - "OutputType", "Shield", "local", TRUE - } - -[effect_supreme_court_2] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - "Building", "Supreme Court", "Player" - } - -[effect_supreme_court_3] -type = "Incite_Cost_Pct" -value = 300 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player", TRUE - "MaxUnitsOnTile", "0", "Local", FALSE - } -[effect_incite_cost_empty_supremecourt] -type = "Incite_Cost_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - "Building", "Supreme Court", "Player", TRUE - } - -[effect_supreme_court_upkeep] ; Law and order provides +1 upkeep -type = "Unit_Upkeep_Free_Per_City" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Supreme Court", "Player" - "OutputType", "Shield", "Local" - } - -[effect_supreme_court_tile_corruption] ; Removes output penalties (Despotism/Anarchy) for cities with courthouses -type = "Output_Penalty_Tile" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Supreme Court", "Player" - } - -;35% success on spy-attack-spy with one court effect, 25% with both: -;35% hostile diplomatic combat success rate with only 1 of Courthouse / Supreme Court -[effect_only_supreme_court_spy_resistance] -type = "Spy_Resistant" -value = 15 ;50%-15%=35% success rate -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player", TRUE - "Building", "Courthouse", "City", FALSE - } -;25% hostile diplomatic combat success rate with both Supreme Court + Courthouse -[effect_only_supreme_court_spy_resistance_stacked] -type = "Spy_Resistant" -value = 10 ;10+15 for Courthouse = 25%. 50%-25%=25% success rate -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player", TRUE - "Building", "Courthouse", "City", TRUE - } - -;45% success on theft with one court, 35% with both courts: -[effect_supreme_court_only_steal_tech] -type = "Action_Odds_Pct" -value = -35 ; 80% base rate - 35% = 45% final rate -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player", TRUE - "Building", "Courthouse", "City", FALSE - "Action", "Steal Tech", "Local", TRUE - } -[effect_supreme_court_only_steal_tech_stacked] -type = "Action_Odds_Pct" -value = -10 ; 45% base rate after courthouse - 10% = 35% final rate -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player", TRUE - "Building", "Courthouse", "City", TRUE - "Action", "Steal Tech", "Local", TRUE - } - -[effect_supreme_court_hostile_diplomat_7] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player", TRUE - "Action", "Steal Tech Escape Expected", "Local", TRUE - } - -[effect_supreme_court_hostile_diplomat_8] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player", TRUE - "Action", "Targeted Steal Tech", "Local", TRUE - } - -[effect_supreme_court_hostile_diplomat_9] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player", TRUE - "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE - } - -[effect_supreme_court_hostile_diplomat_1] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player", TRUE - "Action", "Sabotage City", "Local", TRUE - } - -[effect_supreme_court_hostile_diplomat_2] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player", TRUE - "Action", "Sabotage City Escape", "Local", TRUE - } - -[effect_supreme_court_hostile_diplomat_3] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player", TRUE - "Action", "Targeted Sabotage City", "Local", TRUE - } - -[effect_supreme_court_hostile_diplomat_4] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player", TRUE - "Action", "Targeted Sabotage City Escape", "Local", TRUE - } - -[effect_great_wall] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "UnitClass", "Land", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "UnitType", "Howitzer", "Local", FALSE - } -[effect_great_wall_0] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range" - "Building", "Great Wall", "Player" - "UnitClass", "Helicopter", "Local" - "CityTile", "Center", "Local" - } -[effect_great_wall_0a] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "UnitType", "Howitzer", "Local", FALSE - } -[effect_great_wall_0b] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "UnitType", "Howitzer", "Local", FALSE - } - -[effect_great_wall_1] -type = "Unit_No_Lose_Pop" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Great Wall", "Player" - } - -[effect_great_wall_visible] -type = "Visible_Walls" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Great Wall", "Player" - } - -[effect_hanging_gardens] -type = "Make_Happy" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Hanging Gardens", "Player" - } - -[effect_hanging_gardens_1] -type = "Output_Add_Tile" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Hanging Gardens", "City" - "CityTile", "Center", "Local" - "OutputType", "Luxury", "Local" - } - -[effect_hoover_dam] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Hoover Dam", "Player", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Solar Plant", "City", FALSE - } - -[effect_hoover_dam_1] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Hoover Dam", "Player", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Solar Plant", "City", FALSE - } - -[effect_hoover_dam_2] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Hoover Dam", "Player", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_hoover_dam_3] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Hoover Dam", "Player", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_isaac_newtons_college] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "University", "City" - "Building", "Isaac Newton's College", "Player" - "OutputType", "Science", "Local" - } - -[effect_js_bachs_cathedral] -type = "Force_Content" -value = 2 -reqs = - { "type", "name", "range" - "Building", "J.S. Bach's Cathedral", "Player" - } - -[effect_king_richards_crusade] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "King Richard's Crusade", "City" - "OutputType", "Shield", "Local" - } - -[effect_leonardos_workshop] -type = "Upgrade_Unit" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Leonardo's Workshop", "Player" - } - -[effect_genghis_khans_equestrian_school] -type = "Move_Bonus" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Genghis Khan's Equestrian School", "Player", TRUE - "UnitFlag", "Horse", "Local", TRUE - } -[effect_genghis_khans_equestrian_school2] -type = "Move_Bonus" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Genghis Khan's Equestrian School", "Player", TRUE - "UnitType", "Explorer", "Local", TRUE - } - -[effect_lighthouse] -type = "Move_Bonus" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Sea", "Local" - } - -[effect_lighthouse_a] -type = "Move_Bonus" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Submarine", "Local" - } - -[effect_lighthouse_1] -type = "Move_Bonus" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Trireme", "Local" - } - -[effect_lighthouse_2] -type = "Move_Bonus" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "RiverShip", "Local" - } - -[effect_lighthouse_3] -type = "Unit_Vision_Radius_Sq" -value = 6 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Sea", "Local" - } - -[effect_lighthouse_3a] -type = "Unit_Vision_Radius_Sq" -value = 6 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Submarine", "Local" - } - -[effect_lighthouse_4] -type = "Unit_Vision_Radius_Sq" -svalue = 6 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Trireme", "Local" - } - -[effect_lighthouse_5] -type = "Unit_Vision_Radius_Sq" -svalue = 6 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "RiverShip", "Local" - } - -[effect_magellans_expedition] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Magellan's Expedition", "Player" - "UnitClass", "Sea", "Local" - } -[effect_magellans_expedition_a] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Magellan's Expedition", "Player" - "UnitClass", "RiverShip", "Local" - } -[effect_magellans_expedition_b] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Magellan's Expedition", "Player" - "UnitClass", "Submarine", "Local" - } -; Should be quite useless, just in case: -[effect_magellans_expedition_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Magellan's Expedition", "Player" - "UnitClass", "Trireme", "Local" - } - -[effect_manhattan_project] -type = "Enable_Nuke" -value = 1 -reqs = - { "type", "name", "range", "survives" - "Building", "Manhattan Project", "World", TRUE - } - -[effect_marco_polos_embassy] -type = "Output_Bonus" -value = 40 -reqs = - { "type", "name", "range" - "Building", "Marco Polo's Embassy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_michelangelos_chapel] -type = "Make_Content" -value = 3 -reqs = - { "type", "name", "range" - "Building", "Michelangelo's Chapel", "Player" - } -[effect_michelangelos_chapel_1] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Tech", "Theology", "Player" - "Building", "Michelangelo's Chapel", "Player" - } -[effect_michelangelos_chapel_2] -type = "Make_Content" -value = -1 -reqs = - { "type", "name", "range" - "Building", "Michelangelo's Chapel", "Player" - "Gov", "Communism", "Player" - } - -[effect_mausoleum_of_mausolos_1] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "Building", "Great Wall", "Player", FALSE - "Building", "Mausoleum of Mausolos", "Player", TRUE - } - -;Great Wall counts as City Walls in every city. -[effect_mausoleum_of_mausolos_1a] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Great Wall", "Player" - "Building", "Mausoleum of Mausolos", "Player" - } - -[effect_mausoleum_of_mausolos_2] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Building", "Supreme Court", "Player", FALSE - "Building", "Mausoleum of Mausolos", "Player", TRUE - } - -;Mausoleum respects that Supreme Court counts as Courthouse in every city. -[effect_mausoleum_of_mausolos_2a] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Supreme Court", "Player" - "Building", "Mausoleum of Mausolos", "Player" - } - -[effect_mausoleum_of_mausolos_culture] -type = "History" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Mausoleum of Mausolos", "City" - } - -[effect_statue_of_zeus] -type = "Make_Content_Mil_Per" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Statue of Zeus", "Player", TRUE - "Tech", "Tactics", "Player", FALSE - } -[effect_statue_of_zeus_1] -type = "Unit_Upkeep_Free_Per_City" -value = 4 -reqs = - { "type", "name", "range", "present" - "Building", "Statue of Zeus", "City", TRUE - "Tech", "Tactics", "Player", FALSE - "OutputType", "Shield", "Local", TRUE - } -[effect_statue_of_zeus_2] -type = "Make_Happy" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Statue of Zeus", "City" - } - -[effect_temple_of_artemis] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Luxury", "Local" - } -;Note: the city applies +1 to 0-shield city tiles on grass,swamp,hills,tundra -;Thus this bonus negates the condition of getting that +1 and needs a -;compensating +1 further below -[effect_temple_of_artemis_1] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Shield", "Local" - } -;-------- -;Give the city its extra shield if it was built on a 0-shield (grass/hills/swamp/tundra) -;tile or +1-shield resource (grass-shield,fur) -[effect_temple_of_artemis_1a] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Terrain", "Grassland", "Local" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Shield", "Local" - } -[effect_temple_of_artemis_1b] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range", "present" - "Terrain", "Hills", "Local", TRUE - "Extra", "Coal", "Local", FALSE ; only apply to 0 shield tile - "Extra", "Mine", "Local", FALSE ; only apply to 0 shield tile - "Building", "Temple", "City", TRUE - "Building", "Temple of Artemis", "Player", TRUE - "CityTile", "Center", "Local", TRUE - "OutputType", "Shield", "Local", TRUE - } -[effect_temple_of_artemis_1d] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range", "present" - "Terrain", "Swamp", "Local", TRUE - "Extra", "Peat", "Local", FALSE ; only apply to 0 shield tile - "Building", "Temple", "City", TRUE - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local", TRUE - "OutputType", "Shield", "Local", TRUE - } -[effect_temple_of_artemis_1e] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range", "present" - "Terrain", "Tundra", "Local", TRUE - "Extra", "Game", "Local", FALSE ; only apply to 0 shield tile - "Building", "Temple", "City", TRUE - "Building", "Temple of Artemis", "Player", TRUE - "CityTile", "Center", "Local", TRUE - "OutputType", "Shield", "Local", TRUE - } -;------ - -[effect_temple_of_artemis_2] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Gold", "Local" - } - -[effect_temple_of_artemis_3] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Science", "Local" - } - - -[effect_teslas_laboratory] -type = "Upgrade_Unit" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Tesla's Laboratory", "Player" - } -;[effect_tesla_laboratory2] or do this for Mass Production? -;type = "Upgrade_Price_Pct" -;value = -20 -;reqs = -; { "type", "name", "range" -; "Building", "Tesla's Laboratory", "Player" -; } - -[effect_oracle] -type = "Make_Content" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - "Building", "Oracle", "Player" - } - -[effect_pyramids] -type = "Growth_Food" -value = 25 -reqs = - { "type", "name", "range" - "Building", "Pyramids", "Player" - } - -[effect_pyramids_1] -type = "Rapture_Grow" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Pyramids", "City" - } - -[effect_internet] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Research Lab", "City" - "Building", "The Internet", "Player" - "OutputType", "Science", "Local" - } - -[effect_shakespeares_theatre] -type = "No_Unhappy" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Shakespeare's Theatre", "City" - } - -[effect_statue_of_liberty] -type = "Any_Government" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Statue of Liberty", "Player" - } - -[effect_statue_of_liberty_1] -type = "No_Anarchy" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Statue of Liberty", "Player" - } - -[effect_sun_tzus_war_academy] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Sun Tzu's War Academy", "Player", TRUE - "UnitClass", "Land", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_sun_tzus_war_academy_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Sun Tzu's War Academy", "Player", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - } -[effect_sun_tzus_war_academy_2] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Sun Tzu's War Academy", "Player", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - } - -[effect_united_nations] -type = "Has_Senate" -value = 1 -reqs = - { "type", "name", "range" - "Building", "United Nations", "World" - } - -[effect_united_nations_1] -type = "Revolution_Unhappiness" -value = 2 -reqs = - { "type", "name", "range", "present" - "Building", "United Nations", "World", TRUE -; Without !present UN would make revolution less likely instead -; of enabling it with Democracy (value 2 -> 4 instead of 0 -> 2) - "Gov", "Democracy", "Player", FALSE - } - -[effect_womens_suffrage] -type = "Make_Content_Mil" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - "Building", "Women's Suffrage", "Player" - } - -[effect_womens_suffrage_1] -type = "Make_Content_Mil" -value = 4 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - "Building", "Women's Suffrage", "Player" - } - -[effect_fanatics_fundamentalism] -type = "Fanatics" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_corruption_fundamentalism0] -type = "Output_Waste" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_fundamentalism1] -type = "Output_Waste_By_Distance" -value = 200 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Trade", "Local" - } - -;Shield waste is not a proper feature of mp rulesets -;[effect_waste_fundamentalism0] -;type = "Output_Waste" -;value = 2 -;reqs = -; { "type", "name", "range" -; "Gov", "Fundamentalism", "Player" -; "OutputType", "Shield", "Local" -; } - -;[effect_waste_fundamentalism1] -;type = "Output_Waste_By_Distance" -;value = 100 -;reqs = -; { "type", "name", "range" -; "Gov", "Fundamentalism", "Player" -; "OutputType", "Shield", "Local" -; } - -[effect_fundamentalism_unit_upkeep] -type = "Upkeep_Factor" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Food", "Local" - } - -[effect_upkeep_free_units_fundamentalism] -type = "Unit_Upkeep_Free_Per_City" -value = 10 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Shield", "Local" - } - -[effect_bad_sci_fundamentalism] -type = "Output_Bonus_2" -value = -50 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "science", "local" - } - -[effect_tithes_fundamentalism] -type = "Happiness_To_Gold" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_sabotage_bonus_fundamentalism1] -type = "Action_Odds_Pct" -value = 10 -reqs = - { "type", "name", "range", "present" - "Gov", "Fundamentalism", "Player", TRUE - "Action", "Sabotage City", "Local", TRUE - } -[effect_sabotage_bonus_fundamentalism2] -type = "Action_Odds_Pct" -value = 10 -reqs = - { "type", "name", "range", "present" - "Gov", "Fundamentalism", "Player", TRUE - "Action", "Sabotage City Escape", "Local", TRUE - } -[effect_sabotage_bonus_fundamentalism3] -type = "Action_Odds_Pct" -value = 10 -reqs = - { "type", "name", "range", "present" - "Gov", "Fundamentalism", "Player", TRUE - "Action", "Targeted Sabotage City", "Local", TRUE - } -[effect_sabotage_bonus_fundamentalism4] -type = "Action_Odds_Pct" -value = 10 -reqs = - { "type", "name", "range", "present" - "Gov", "Fundamentalism", "Player", TRUE - "Action", "Targeted Sabotage City Escape", "Local", TRUE - } - -[effect_max_rates_fundamentalism] -type = "Max_Rates" -value = 80 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_enviromentalism] -type = "Pollu_Prod_Pct" -value = -50 -reqs = - { "type", "name", "range" - "Tech", "Environmentalism", "Player" - } - -[effect_calendar_base] -type = "Turn_Years" -value = 100 - -; 100 - 50 = 50 -[effect_calendar_1] -type = "Turn_Years" -value = -50 -reqs = - { "type", "name", "range" - "MinYear", "0", "World" - } - -; 50 - 25 = 25 -[effect_calendar_2] -type = "Turn_Years" -value = -25 -reqs = - { "type", "name", "range" - "MinYear", "1000", "World" - } - -; 25 - 15 = 10 -[effect_calendar_3] -type = "Turn_Years" -value = -15 -reqs = - { "type", "name", "range" - "MinYear", "1800", "World" - } - -; 10 - 5 = 5 -[effect_calendar_4] -type = "Turn_Years" -value = -5 -reqs = - { "type", "name", "range" - "MinYear", "1900", "World" - } - -; 5 - 3 = 2 -[effect_calendar_5] -type = "Turn_Years" -value = -3 -reqs = - { "type", "name", "range" - "MinYear", "1950", "World" - } - -; 2 - 1 = 1 -[effect_calendar_6] -type = "Turn_Years" -value = -1 -reqs = - { "type", "name", "range" - "MinYear", "2012", "World" - } - -[effect_tech_cost_base] -type = "Tech_Cost_Factor" -value = 1 - -; Cities can always work tiles -[effect_tile_workable] -type = "Tile_Workable" -value = 1 -reqs = - { "type", "name", "range", "present" - "Terrain", "Inaccessible", "Local", FALSE - } - -; each city has at least one slot to build units -[effect_city_build_slots_basic] -type = "City_Build_Slots" -value = 1 - -[effect_city_image_1] -type = "City_Image" -value = 1 -reqs = - { "type", "name", "range" - "MinSize", "4", "City" - } - -[effect_city_image_2] -type = "City_Image" -value = 1 -reqs = - { "type", "name", "range" - "MinSize", "8", "City" - } - -[effect_city_image_3] -type = "City_Image" -value = 1 -reqs = - { "type", "name", "range" - "MinSize", "12", "City" - } - -[effect_city_image_4] -type = "City_Image" -value = 1 -reqs = - { "type", "name", "range" - "MinSize", "16", "City" - } - -[effect_pollution] -type = "Output_Tile_Punish_Pct" -value = 50 -reqs = - { "type", "name", "range", "present" - "Extra", "Pollution", "Local", TRUE - "Extra", "Fallout", "Local", FALSE - } - -[effect_fallout] -type = "Output_Tile_Punish_Pct" -value = 50 -reqs = - { "type", "name", "range", "present" - "Extra", "Fallout", "Local", TRUE - "Extra", "Pollution", "Local", FALSE - } - -[effect_pollution_fallout] -type = "Output_Tile_Punish_Pct" -value = 75 -reqs = - { "type", "name", "range" - "Extra", "Fallout", "Local" - "Extra", "Pollution", "Local" - } - -[effect_incident_caught_steal_maps] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Maps Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_steal_maps] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Maps Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_half_chance_steal_maps] -type = "Action_Odds_Pct" -value = -30 ;80 minus 30 is 50% or half chance, but who knows if it's really 80-.3*8=56% -reqs = - { "type", "name", "range", "present" - "Action", "Steal Maps Escape", "Local", TRUE - } - -; FIXED flag from "Cities" to "NonMil" to have proper effect. -[effect_unit_bribe_cost_settlers] -type = "Unit_Bribe_Cost_Pct" -value = -50 -reqs = - { "type", "name", "range" - "UnitFlag", "NonMil", "Local" - } - -;LOSING MOVES FROM ILLEGAL ACTION NEVER MADE SENSE. JUST FORBID IT AND LET THEM PICK A LEGAL ACTION. -;[effect_illegal_action_move_cost_base] -;type = "Illegal_Action_Move_Cost" -;value = 0 -;reqs = -; { "type", "name", "range", "present" -; "Action", "Found City", "Local", FALSE -; "Action", "Join City", "Local", FALSE -; } - -[effect_incident_caught_steal_tech] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Tech", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_steal_tech] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Tech", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_caught_steal_tech_esc] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Tech Escape Expected", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_steal_tech_esc] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Tech Escape Expected", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_caught_tgt_steal_tech] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_tgt_steal_tech] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_bribe_unit] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Bribe Unit", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_capture_unit] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Capture Units", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_sabotage_unit] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Sabotage Unit Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_incite] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Incite City", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_incite_esc] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Incite City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_poison] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Poison City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_sabotage_city] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Sabotage City", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_sabotage_city_esc] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Sabotage City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_tgt_sabotage_city] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Targeted Sabotage City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_tgt_sabotage_city_half_chance] -type = "Action_Odds_Pct" -value = -50 -reqs = - { "type", "name", "range", "present" - "Action", "Targeted Sabotage City Escape", "Local", TRUE - } - -[effect_incident_success_explode_nuke] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Explode Nuclear", "Local", TRUE - } - -; Double (+100%) buy cost for Great Wonders -[effect_great_wonder_buy_cost] -type = "Building_Buy_Cost_Pct" -value = 100 -reqs = - { "type", "name", "range" - "BuildingGenus", "GreatWonder", "Local" - } - -; Double buy cost for Small Wonders except Palaces -[effect_small_wonder_buy_cost] -type = "Building_Buy_Cost_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "BuildingGenus", "SmallWonder", "Local", TRUE - "Building", "Palace", "Local", FALSE - "Building", "Ecclesiastical Palace", "Local", FALSE - } - -; The Well-Digger can move 3 before you know Pottery or Alphabet. -[effect_welldigger_movement] -type = "Move_Bonus" -value = -3 -reqs = - { - "type", "name", "range", "present" - "UnitFlag", "Well-Digger", "Local", TRUE - "Tech", "Alphabet", "Player", TRUE - } -[effect_welldigger_movement_1] -type = "Move_Bonus" -value = -3 -reqs = - { - "type", "name", "range", "present" - "UnitFlag", "Well-Digger", "Local", TRUE - "Tech", "Pottery", "Player", TRUE - } - -;Can't give orders to Proletarians unless communist. -[effect_proletarian_movement] -type = "Move_Bonus" -value = -2 -reqs = - { - "type", "name", "range", "present" - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player", FALSE - } diff --git a/freeciv/freeciv/data/.historic/mp2-preArctic/game.ruleset b/freeciv/freeciv/data/.historic/mp2-preArctic/game.ruleset deleted file mode 100644 index fd9042c71..000000000 --- a/freeciv/freeciv/data/.historic/mp2-preArctic/game.ruleset +++ /dev/null @@ -1,1953 +0,0 @@ -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes, -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -; Note that the freeciv AI may not cope well with anything more -; than minor changes. - -[datafile] -description="Multiplayer-Evolution game rules for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -; This section contains meta information for freeciv-ruledit to recreate the ruleset -; file in a form wanted. These have no in-game effect whatsoever -[ruledit] - -; Which file to read description in from. -description_file = "mp2/README.mp2" - -[about] -; Ruleset name -; DO NOT CHANGE, FCW unfortunately has to hard-code certain special cases for this. -name = _("Multiplayer-Evolution ruleset") - -; There`s no separate versioning in rulesets part of main freeciv distribution -;version = "" - -; Summary of the ruleset -; /* TRANS: In the client, this is displayed alongside the contents of -; README.multiplayer, which are not localized. */ -summary = _("") - -; Detailed description -; When updating this, update also desciption_file in [ruledit] section to match -description = *mp2/README.mp2* - -; What capabilities ruleset provides for the scenarios. -; mimimum-default-sets - Default units, terrains, buildings, etc -capabilities = "minimum-default-sets" - -[options] -global_init_techs="" -global_init_buildings="Palace" - -[civstyle] -; Value added to city pollution -base_pollution = -20 - -; Cost in luxuries of making one citizen happier -happy_cost = 2 - -; Cost in food of upkeeping a single citizen -food_cost = 2 - -; Parameters used to generalize the calculation of city granary size: -; if city_size <= num_inis: -; city_granary_size = (granary_food_ini[city_size] * foodbox / 100) -; if city_size > num_inis; -; city_granary_size = (granary_food_ini[num_inis] + -; granary_food_inc * (city_size - num_inis)) * foodbox / 100 -granary_food_ini = 20, 30, 40, 50, 60, 70 -granary_food_inc = 0 - -; City center minimum outputs -min_city_center_food = 1 -min_city_center_shield = 1 -min_city_center_trade = 0 - -; Square of initial city radius -init_city_radius_sq = 5 - -; Square of initially visible radius (true distance). -init_vis_radius_sq = 5 - -; A base bribe cost, modified heavily by other factors -base_bribe_cost = 750 - -; Barbarian leader ransom in gold -ransom_gold = 100 - -; Number of veteran levels lost when upgrading a unit -upgrade_veteran_loss = 0 - -; Number of veteran levels lost when auto-upgrading a unit -autoupgrade_veteran_loss = 0 - -; Whether player gets to select which terrain improvement to pillage. -pillage_select = TRUE - -; Whether one can steal a tech for which prereqs are not known -tech_steal_allow_holes = FALSE -; Whether one can get a tech for which prereqs are not known via -; diplomatic trading -tech_trade_allow_holes = TRUE -; ...and whether one can lose a tech which is prereq for another known -; tech via trade, if techlost_donor is nonzero -tech_trade_loss_allow_holes = TRUE -; Whether one can get a tech for which prereqs are not known via -; parasite effect (classic ruleset's Great Library) -tech_parasite_allow_holes = TRUE -; Whether one can lose a tech which is prereq for another known tech -; due to negative bulbs, if techlossforgiveness allows loss -tech_loss_allow_holes = TRUE - -; Whether civil war is possible at all -civil_war_enabled = TRUE - -; Comma separated list of things to happen, in addition to death -; of owner, when gameloss unit dies -; "CivilWar" - Part of the empire remains, controlled by a new player -; "Barbarians" - Depending on if there`s also "CivilWar", all or part -; or half of the dead players empire gets under barbarian -; control. -; "Loot" - Player who killed the gameloss unit gets loot: -; Partial map, gold, techs, cities -gameloss_style = "" - -; Whether units may safely paradrop to transport on non-native terrain -paradrop_to_transport = FALSE - -; Method of paying unit and improvement gold upkeep -; "City" - The player`s total gold must be non-negative after paying upkeep -; costs associated with each city. If for any city the player`s -; gold is negative, random buildings in the city are sold off. If -; the gold is still negative, then supported units with gold upkeep -; are disbanded. -; "Mixed" - In the first step, the player`s total gold must be non-negative -; after paying upkeep for all buildings within a city. If for any -; city the player`s gold is negative, random buildings in the city -; are sold off. -; In the second step, gold upkeep for all units is paid in a lump -; sum. If the player does not have enough gold, random units with -; gold upkeep are disbanded. -; "Nation" - Gold upkeep for all buildings and units is paid in a lump sum -; after all cities have been processed. If the player does not -; have enough gold, random buildings from random cities are sold. -; If still more gold is needed, then random units with gold -; upkeep are disbanded. -gold_upkeep_style = "City" - -[illness] -; Whether plagues (illness) are possible -; There are some latent building effects in effects.ruleset which affect -; health, if you enable plague here. -illness_on = FALSE - -; the base factor for illness (of percent) -illness_base_factor = 25 - -; minimum city size for illness -illness_min_size = 3 - -; factor for how much trading with a plagued city increases our city`s -; chance for plague (in percent) -illness_trade_infection = 0 - -; factor for how much pollution within a city increases its chance for -; plague (in percent) -illness_pollution_factor = 50 - -[incite_cost] -; city_incite_cost = { [TF * SZ * NF * (BIC+owner_gold) * (2*CON) * (2*CEL) * (BONUS)] + (UF*UC) + (IF*IC) } / (3*DIST) -; See city_incite_cost() for more details -total_factor = 100 ; TF = 100 (effectively makes 100x cost at capital and 1x cost at DIST=32) -;city_size_adjusted ; SZ (happy*2 + content*1 + unhappy*0 - angry*2) -;nationality factor ; NF native=1.0, was_conquered=0.67, originally_belonged_to_inciter=0.5 -base_incite_cost = 1100 ; BIC =1100 (base cost before modifiers) -; content bonus. -;city is content ; CON -;city is celebrating ; CEL -;incite defence bonuses ; BONUS -50% empty + 300% occupied+courthouse OR + 100% empty+courthouse + supreme_court applies courthouse bonuses again -; ; +∞ = democracy/mausoleum/palace/ecclesiastical palace -;total unit shield cost ; UC -;total improvements cost ; IC -;distance to capital ; DIST (max distance penalty=32 tiles) -improvement_factor = 2 ; IF = 2 -unit_factor = 3 ; UF = 3 - -[global_unit_options] -; Shore landing style -; FALSE - normal movement -; TRUE - (default) slow invasions by removing all -; movement points from ground units moving -; from ocean tile to land -slow_invasions = TRUE - -[combat_rules] -; If tired_attack is set to TRUE, units that attack with less than a single -; move point (per move_fragments in terrain.ruleset) will have their attack -; power reduced accordingly. For instance, if move_fragments=3, a unit with -; 2/3 move points will have attack power 2/3 of normal. -; If this is set to FALSE units will attack with full strength even if they -; have only fractional moves left. -tired_attack = TRUE - -[auto_attack] -; An auto attack may be triggered when another unit moves to an adjacent -; tile and the autoattack server setting is enabled. The following details -; are ruleset controlled. -; will_never - units with this unit type flag will never auto attack. - -; Not a good idea to nuke our own area. -will_never = "Nuclear" - -[actions] -; If force_trade_route is set to TRUE it is illegal for an actor unit to -; enter the marketplace of a city if it can establish a trade route to it -; instead. -force_trade_route = FALSE - -; If force_capture_units is set to TRUE it is illegal for an actor unit to -; bombard, explode nuclear or perform a regular attack against a tile if -; it can capture units on it in stead. -force_capture_units = FALSE - -; If force_bombard is set to TRUE it is illegal for an actor unit to -; explode nuclear or perform a regular attack against a tile if it can -; bombard it in stead. -force_bombard = FALSE - -; If force_explode_nuclear is set to TRUE it is illegal for an actor unit -; to perform a regular attack against a tile if it can do explode nuclear -; in stead. -force_explode_nuclear = TRUE - -; If poison_empties_food_stock is set to TRUE a successful "Poison City" -; or "Poison City Escape" will empty the food stock. -poison_empties_food_stock = FALSE - -; The maximum distance from the actor unit to the target of the "Bombard" -; action. The value 1 means that the targets must be on a tile adjacent to -; the actor unit. The special value "unlimited" lifts the maximum distance -; restriction. The maximum distance can`t be smaller than the minimum -; distance. -bombard_max_range = 1 - -; What each action should be called when showing them to the player. -; The first %s should be before the mnemonic of the action. A Freeciv client -; that supports mnemonics will replace it with the in-band signal that marks -; the following character as a mnemonic in its graphical toolkit. -; The second %s marks where extra details should be inserted. - -; /* TRANS: _Deploy (3% chance of success). */ -ui_name_convert_unit = _("%sConvert Unit%s") - -; /* TRANS: _Poison City (3% chance of success). */ -ui_name_poison_city_escape = _("%sPoison City%s") - -; /* TRANS: _Sabotage Enemy Unit (3% chance of success). */ -ui_name_sabotage_unit_escape = _("%sSabotage Enemy Unit%s") - -; /* TRANS: _Bribe Enemy Unit (3% chance of success). */ -ui_name_bribe_unit = _("%sBribe Enemy Unit%s") - -; /* TRANS: _Sabotage City (3% chance of success). */ -ui_name_sabotage_city = _("%sSabotage City%s") - -; /* TRANS: _Sabotage City Escape (3% chance of success). */ -ui_name_sabotage_city_escape = _("%sSabotage City Escape%s") - -; /* TRANS: Industrial _Sabotage (3% chance of success). */ -ui_name_targeted_sabotage_city_escape = _("Industrial %sSabotage%s") - -; /* TRANS: Incite a _Revolt (3% chance of success). */ -ui_name_incite_city = _("Incite a %sRevolt%s") - -; /* TRANS: Incite a _Revolt and Escape (3% chance of success). */ -ui_name_incite_city_escape = _("Incite a Re%svolt and Escape%s") - -; /* TRANS: Establish Trade _Route (100% chance of success). */ -ui_name_establish_trade_route = _("Establish Trade %sRoute%s") - -; /* TRANS: Enter _Marketplace (100% chance of success). */ -ui_name_enter_marketplace = _("Enter %sMarketplace%s") - -; /* TRANS: Establish _Embassy (100% chance of success). */ -ui_name_establish_embassy = _("Establish %sEmbassy%s") - -; /* TRANS: Becom_e Ambassador (100% chance of success). */ -ui_name_establish_embassy_stay = _("Becom%se Ambassador%s") - -; /* TRANS: Steal _Technology (3% chance of success). */ -ui_name_steal_tech = _("Steal %sTechnology%s") - -; /* TRANS: Steal _Technology and Escape (3% chance of success). */ -ui_name_steal_tech_escape = _("Steal %sTechnology and Escape%s") - -; /* TRANS: Indus_trial Espionage (3% chance of success). */ -ui_name_targeted_steal_tech_escape = _("Indus%strial Espionage%s") - -; /* TRANS: Steal _Map Fragments and Escape (3% chance of success). */ -ui_name_steal_maps_escape = _("Steal %sMap Fragments and Escape%s") - -; /* TRANS: Steal _Map Fragments (3% chance of success). */ -ui_name_steal_maps = _("Steal %sMap Fragments%s") - -; /* TRANS: _Investigate City (100% chance of success). */ -ui_name_investigate_city = _("%sInvestigate City%s") - -; /* TRANS: _Investigate City (spends the unit) (100% chance of success). */ -ui_name_investigate_city_spend_unit = _("%sInvestigate City (spends the unit)%s") - -; /* TRANS: Help _build Wonder (100% chance of success). */ -ui_name_help_wonder = _("Help %sbuild Wonder%s") - -; /* TRANS: Rec_ycle Unit (100% chance of success). */ -ui_name_recycle_unit = _("Rec%sycle Unit%s") - -; /* TRANS: _You're Fired (100% chance of success). */ -ui_name_disband_unit = _("%sYou're Fired%s") - -; /* TRANS: _Capture Units (100% chance of success). */ -ui_name_capture_units = _("%sCapture Units%s") - -; /* TRANS: _Build City (100% chance of success). */ -ui_name_found_city = _("%sBuild City%s") - -; /* TRANS: _Add to City (100% chance of success). */ -ui_name_join_city = _("%sAdd to City%s") - -; /* TRANS: Explode _Nuclear (100% chance of success). */ -ui_name_explode_nuclear = _("Explode %sNuclear%s") - -; /* TRANS: Destroy _City (100% chance of success). */ -;ui_name_destroy_city = _("Destroy %sCity%s") ;ready to be enabled if we think of how - -; /* TRANS: Set _Home City (100% chance of success). */ -ui_name_home_city = _("Set %sHome City%s") - -; /* TRANS: _Upgrade Unit (100% chance of success). */ -ui_name_upgrade_unit = _("%sUpgrade Unit%s") - -; /* TRANS: Drop _Paratrooper (100% chance of success). */ -ui_name_paradrop_unit = _("Drop %sParatrooper%s") - -; /* TRANS: _Airlift to City (100% chance of success). */ -ui_name_airlift_unit = _("%sAirlift to City%s") - -; /* TRANS: _Attack (100% chance of success). */ -ui_name_attack = _("%sAttack%s") - -; /* TRANS: _Bombard (100% chance of success). */ -ui_name_bombard = _("Range%sd Attack%s") - -;UPGRADE -; /* TRANS: _Explode Missile (100% chance of success). */ -;ui_name_suicide_attack = _("%sExplode Missile%s") - -; /* TRANS: _Conquer City (100% chance of success). */ -ui_name_conquer_city = _("%sConquer City%s") - -; /* TRANS: _Transform Terrain (3% chance of success). */ - ui_name_transform_terrain = _("%sTransform Terrain%s") - -; /* TRANS: Transform by _Irrigate (3% chance of success). */ - ui_name_irrigate_tf = _("Transform by %sIrrigate%s") - -; /* TRANS: Transform by _Mine (3% chance of success). */ - ui_name_mine_tf = _("Transform by %sMine%s") - -; /* TRANS: Pilla_ge (100% chance of success). */ - ui_name_pillage = _("Pilla%sge%s") - -; /* TRANS: _Fortify (100% chance of success). */ - ui_name_fortify = _("%sFortify%s") - -; /* TRANS: Build _Road (100% chance of success). */ - ui_name_road = _("Build %sRoad%s") - -; /* TRANS: Build _Canal (100% chance of success). */ - ui_name_canal = _("Build %Canal%s") - -; /* TRANS: _Build Base (100% chance of success). */ - ui_name_build_base = _("%sBuild Base%s") - -; /* TRANS: Build _Mine (100% chance of success). */ - ui_name_build_mine = _("Build %sMine%s") - -; /* TRANS: Build _Irrigation (100% chance of success). */ - ui_name_irrigate = _("Build %sIrrigation%s") - -; Suppress automatic help text generation about what enables and/or -; disables the following actions. -; -; Can make the help text less redundant when you document it your self. -;quiet_actions = "Targeted Sabotage City", "Targeted Steal Tech" - -; /* <-- avoid gettext warnings -; -; Action enablers: -; -; action = the action to enable. -; actor_reqs = requirements that apply to the actor. -; target_reqs = requirements that apply to the target. -; -; README.actions lists the possible actions and their hard coded -; requirements. -; -; An action enabler is active when its actor_reqs AND its target_reqs are -; satisfied. -; -; */ <-- avoid gettext warnings - -[actionenabler_convert_leader] -action = "Convert Unit" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "GameLoss", "Local" - } - -[actionenabler_communist_rifles_to_plows] -action = "Convert Unit" -actor_reqs = - { "type", "name", "range" - "UnitType", "Riflemen", "Local" - "Gov", "Communism", "Player" - "Tech", "Communism", "Player" - "Tech", "Pottery", "Player" - "UnitState","OnDomesticTile","Local" - } -[actionenabler_communist_plows_to_rifles] -action = "Convert Unit" -actor_reqs = - { "type", "name", "range" - "UnitType", "Workers", "Local" - "Gov", "Communism", "Player" - "Tech", "Communism", "Player" - "Tech", "Conscription", "Player" - "UnitState","OnDomesticTile","Local" - } -;**Mobile SAM is an upgrade to AAA but does not obsolete it, -; since AAA retains special uses. Instead, AAA can convert -; to Mobile SAM under special conditions. -[actionenabler_convert_AAA_in_capital] -action = "Convert Unit" -actor_reqs = - { "type", "name", "range" - "UnitType", "Anti-Aircraft Artillery", "Local" - "UnitState","OnDomesticTile", "Local" - "CityTile", "Center", "Local" - "Building", "Palace", "City" - "Tech", "Space Flight", "Player" - "Age", "10", "Local" - } -[actionenabler_convert_AAA_in_capital_2] -action = "Convert Unit" -actor_reqs = - { "type", "name", "range" - "UnitType", "Anti-Aircraft Artillery", "Local" - "UnitState","OnDomesticTile", "Local" - "CityTile", "Center", "Local" - "Building", "Ecclesiastical Palace", "City" - "Tech", "Space Flight", "Player" - "Age", "10", "Local" - } - -[actionenabler_sabotage_city] -action = "Sabotage City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Diplomat", "Local", TRUE - "DiplRel", "War", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "UnitFlag", "Spy", "Local", FALSE - } - -[actionenabler_sabotage_city_spy] -action = "Sabotage City Escape" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "Spy", "Local" - "DiplRel", "War", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - } - -[actionenabler_sabotage_city_target] -action = "Targeted Sabotage City Escape" -actor_reqs = - { "type", "name", "range" - "DiplRel", "War", "Local" - "UnitFlag", "Spy", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - } - -; ************************ ESTABLISH EMBASSY *********************** -; normal establish embassy--if not at war -[actionenabler_establish_embassy] -action = "Establish Embassy Stay" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Diplomat", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "UnitFlag", "Spy", "Local", FALSE - "DiplRel", "War", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - } -;if at war, police station/fundie will block embassy: do a cease-fire first! -[actionenabler_establish_embassy_war] -action = "Establish Embassy Stay" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Diplomat", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "UnitFlag", "Spy", "Local", FALSE - "DiplRel", "War", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - "Building", "Police Station", "City", FALSE ; to do: when we can check for spy present to stop it - "Gov", "Fundamentalism", "Player", FALSE - } - -; normal establish embassy--if not at war -[actionenabler_establish_embassy_spy] -action = "Establish Embassy" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Spy", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - } -;if at war, police station or fundie will block embassy: do a cease-fire first! -[actionenabler_establish_embassy_spy_war] -action = "Establish Embassy" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Spy", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "DiplRel", "War", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - "Building", "Police Station", "City", FALSE ; to do: when we can check for spy present to stop it - "Gov", "Fundamentalism", "Player", FALSE - } -; *************************************************** - -[actionenabler_investigate_city] -action = "Investigate City Spend Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Diplomat", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "UnitFlag", "Spy", "Local", FALSE - } - -[actionenabler_investigate_city_spy] -action = "Investigate City" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "Spy", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - "DiplRel", "Foreign", "Local" - } - -[actionenabler_poison_city] -action = "Poison City Escape" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "Spy", "Local" - "DiplRel", "War", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - } -target_reqs = - { "type", "name", "range" - "MinSize", "2", "City" - } - -[actionenabler_steal_maps_escape] -action = "Steal Maps Escape" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "Spy", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - "DiplRel", "Foreign", "Local" - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - } -[actionenabler_steal_maps] -action = "Steal Maps" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "Diplomat", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - "DiplRel", "Foreign", "Local" - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - } - -[actionenabler_steal_tech_random] -action = "Steal Tech" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Spy", "Local", FALSE - "UnitFlag", "Diplomat", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - } - -[actionenabler_steal_tech_random_esc] -action = "Steal Tech Escape Expected" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "Spy", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - "DiplRel", "Foreign", "Local" - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - } - -[actionenabler_steal_tech_target] -action = "Targeted Steal Tech Escape Expected" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "Spy", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - "DiplRel", "Foreign", "Local" - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - } - -[actionenabler_incite_city] -action = "Incite City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Diplomat", "Local", TRUE - "DiplRel", "Alliance", "Local", FALSE - "DiplRel", "Team", "Local", FALSE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "UnitFlag", "Spy", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "Gov", "Democracy", "Player", FALSE - "Building", "Palace", "City", FALSE - "Building", "Ecclesiastical Palace", "City", FALSE - "Building", "Mausoleum of Mausolos", "Player", FALSE - } - -[actionenabler_incite_city_spy] -action = "Incite City Escape" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Spy", "Local", TRUE - "DiplRel", "Alliance", "Local", FALSE - "DiplRel", "Team", "Local", FALSE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "Gov", "Democracy", "Player", FALSE - "Building", "Palace", "City", FALSE - "Building", "Ecclesiastical Palace", "City", FALSE - "Building", "Mausoleum of Mausolos", "Player", FALSE - } - -[actionenabler_bribe_unit] -action = "Bribe Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Diplomat", "Local", TRUE - "DiplRel", "Alliance", "Local", FALSE - "DiplRel", "Team", "Local", FALSE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Unbribable", "Local", FALSE - "CityTile", "Center", "Local", FALSE - "Gov", "Democracy", "Player", FALSE - "MaxUnitsOnTile", "1", "Local", TRUE - } - -[actionenabler_sabotage_unit] -action = "Sabotage Unit Escape" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "Spy", "Local" - "DiplRel", "War", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - } -target_reqs = - { "type", "name", "range", "present" - "CityTile", "Center", "Local", FALSE - "UnitClassFlag", "Unreachable", "Local", FALSE - "UnitClass", "Helicopter", "Local", FALSE - "MinHitPoints", "2", "Local", TRUE - "MaxUnitsOnTile", "1", "Local", TRUE - } - -[actionenabler_traderoute] -action = "Establish Trade Route" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "TradeRoute", "Local", TRUE - "Tech", "Trade", "Player", TRUE - "MinMoveFrags", "1", "Local", TRUE -; "DiplRel", "War", "Local", FALSE ; allows establishing during war then awaiting diplomatic relation to activate trade income. - } - -[actionenabler_traderoute_boat] -action = "Establish Trade Route" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "TradeRoute", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "UnitType", "Boat", "Local", TRUE -; "DiplRel", "War", "Local", FALSE ; allows establishing during war then awaiting diplomatic relation to activate trade income. - } - -[actionenabler_marketplace] -action = "Enter Marketplace" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "TradeRoute", "Local", TRUE - "Tech", "Trade", "Player", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -target_reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - } - -[actionenabler_help_build_wonder] -action = "Help Wonder" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "HelpWonder", "Local", TRUE - "Tech", "Trade", "Player", TRUE - "DiplRel", "War", "Local", FALSE - "UnitType", "Caravel", "Local", FALSE - } -target_reqs = - { "type", "name", "range" - "BuildingGenus", "GreatWonder", "Local" - } - -[actionenabler_help_build_small_wonder] -action = "Help Wonder" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "HelpWonder", "Local", TRUE - "Tech", "Trade", "Player", TRUE - "DiplRel", "War", "Local", FALSE - "UnitType", "Caravel", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "BuildingGenus", "SmallWonder", "Local", TRUE -; "Building", "Palace", "Local", FALSE - } - -[actionenabler_help_build_wonder_boat] -action = "Help Wonder" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "HelpWonder", "Local", TRUE - "Tech", "Currency", "Player", TRUE - "DiplRel", "War", "Local", FALSE - "UnitType", "Boat", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "BuildingGenus", "SmallWonder", "Local", TRUE - "Building", "Palace", "Local", FALSE - } - - -[actionenabler_recycle_unit] -action = "Recycle Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "EvacuateFirst", "Local", FALSE - "DiplRel", "War", "Local", FALSE - "DiplRel", "Cease-fire", "Local", FALSE - "DiplRel", "Armistice", "Local", FALSE - "DiplRel", "Peace", "Local", FALSE - } - -[actionenabler_disband_unit] -action = "Disband Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "EvacuateFirst", "Local", FALSE - } - -;CAPTURING LAND UNITS a "Capturer" must get a "Capturable" but not on a mountain. -[actionenabler_capture] -action = "Capture Units" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Capturer", "Local", TRUE -; "DiplRel", "War", "Local", TRUE ;NAH - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "DiplRel", "Alliance", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Capturable", "Local", TRUE - "CityTile", "Center", "Local", FALSE - "Terrain", "Mountains", "Local", FALSE - "MaxUnitsOnTile", "1", "Local", TRUE - "Extra", "Fort", "Local", FALSE - "Extra", "Fortress", "Local", FALSE - } - -;Archers can strafe/soften every unit on a tile for one -;round of combat only, iff it is not a city, fortress, -;or sea tile: -[actionenabler_archer_bombard] ;**** -action = "Bombard" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Bombarder", "Local", TRUE - "UnitType", "Archers", "Local", TRUE - "UnitState", "Transported", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "War", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "CityTile", "Center", "Local", FALSE - "Extra", "Fortress", "Local", FALSE - "TerrainClass", "Oceanic", "Local", FALSE - } - -;Fanatics can strafe/soften every unit on a tile for one -;round of combat only, iff it is in domestic territory. -[actionenabler_fanatic_bombard] ;**** -action = "Bombard" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Bombarder", "Local", TRUE - "UnitType", "Fanatics", "Local", TRUE - "UnitState", "Transported", "Local", FALSE - "UnitState", "OnDomesticTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "War", "Local", TRUE - "Gov", "Fundamentalism", "Player", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "CityTile", "Center", "Local", FALSE - "Extra", "Fortress", "Local", FALSE - "TerrainClass", "Oceanic", "Local", FALSE - } - - -[actionenabler_build_city_pioneer] -action = "Found City" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "Cities", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - } -target_reqs = - { "type", "name", "range", "present" - "CityTile", "Claimed", "Local", FALSE - } - -[actionenabler_build_city_domestic] -action = "Found City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Cities", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", FALSE - } - -[actionenabler_build_city_fort] -action = "Found City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Cities", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "Extra", "Fort", "Local", TRUE - } - -[actionenabler_join_city] -action = "Join City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "AddToCity", "Local", TRUE - "DiplRel", "Foreign", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - } - -[actionenabler_join_city_pilgrims_domestic] -action = "Join City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "AddToCity", "Local", TRUE - "UnitType", "Pilgrims", "Local", TRUE - "DiplRel", "Foreign", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - } - -;Land expel: must be not on a mountain nor an air expeller/expellee -[actionenabler_border_police] -action = "Expel Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "BorderPolice", "Local", TRUE - "UnitClass", "Air", "Local", FALSE - "UnitClass", "AirProtect", "Local", FALSE - "UnitFlag", "NonMil", "Local", FALSE ;Non-Military land class can't expel - "UnitType", "Warriors", "Local", FALSE ;Warriors are too weak to expel - "UnitState", "OnDomesticTile", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "DiplRel", "Team", "Local", FALSE - "DiplRel", "Alliance", "Local", FALSE -; "DiplRel", "War", "Local", FALSE ;NAH, you could expel anyone if you wanted. - "MinMoveFrags", "1", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Expellable", "Local", TRUE - "UnitClass", "Air", "Local", FALSE ;LAND UNITS CAN'T EXPEL AWACS - "UnitState", "OnDomesticTile", "Local", FALSE - "Terrain", "Mountains", "Local", FALSE ;Can't expel people hiding in the mountains - "MaxUnitsOnTile", "1", "Local", TRUE - } - -;Air expel: must be be air-to-air expelling from an aggressor air unit. -[actionenabler_air_border_police] -action = "Expel Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "BorderPolice", "Local", TRUE - "UnitFlag", "AirAttacker", "Local", TRUE ;some air class might not be expellers (AWACS) - "UnitFlag", "FieldUnit", "Local", FALSE ;bombers can't expel - "UnitState", "OnDomesticTile", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "DiplRel", "Team", "Local", FALSE - "DiplRel", "Alliance", "Local", FALSE -; "DiplRel", "War", "Local", FALSE ;NAH, you could expel anyone if you wanted. - "MinMoveFrags", "1", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Expellable", "Local", TRUE ;Has to be 1-expellable and 2-an air unit, in order for an air-expeller... - "UnitClass", "Air", "Local", TRUE ;...to be able to do border police action - "UnitState", "OnDomesticTile", "Local", FALSE - "MaxUnitsOnTile", "1", "Local", TRUE - } - -[actionenabler_nuke] -action = "Explode Nuclear" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Nuclear", "Local", TRUE - } - -;DESTROY CITY -; The GameLoss unit requirement makes sending units on a suicide mission to -; capture and destroy cities deep inside enemy terrain national suicide. -; The risk of moving a GameLoss unit to the target city increases the cost -; of the action. Rationalization for the requirement: the physical presence -; of the Leader makes it easier to comply with the order to destroy the -; city. (See the "orders by phone" Milgram experiment variation) -; -; The domestic city requirement forces the player to invade a city before -; he can destroy it. If this limit is weakened by allowing the destruction -; of undefended (MaxUnitsOnTile) foreign cities during war it will lead to -; situations where a player can destroy a city but is unable to occupy it. -; Rationalization: the resistance must be crushed before the destruction. -; -; TODO: create an international incident (set the Casus_Belli_Success -; effect value to 1000) if "Destroy City" still is overpowered. -[actionenabler_scorched_earth] -action = "Destroy City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "GameLoss", "Local", TRUE - "DiplRel", "Foreign", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "MaxUnitsonTile","0", "Local", TRUE - } - - - -;UPGRADE -[actionenabler_attack_native] -action = "Attack" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE -; "UnitClassFlag","Missile", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - "UnitState", "OnNativeTile", "Local", TRUE - "DiplRel", "War", "Local", TRUE - } - -;UPGRADE -[actionenabler_attack_marines] -action = "Attack" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE -; "UnitClassFlag","Missile", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - "UnitFlag", "Marines", "Local", TRUE - "DiplRel", "War", "Local", TRUE - } - -;UPGRADE -[actionenabler_attack_att_from_non_native] -action = "Attack" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE -; "UnitClassFlag", "Missile", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - "UnitClassFlag", "AttFromNonNative", "Local", TRUE - "DiplRel", "War", "Local", TRUE - } - -;/* UPGRADE -;[actionenabler_explode_missile] -;action = "Suicide Attack" -;actor_reqs = -; { "type", "name", "range", "present" -; "UnitFlag", "NonMil", "Local", FALSE -; "UnitClassFlag", "Missile", "Local", TRUE -; "MinMoveFrags", "1", "Local", TRUE -; "DiplRel", "War", "Local", TRUE -; } -;*/ - -[actionenabler_conquer_city_native] -action = "Conquer City" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "CanOccupyCity", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "DiplRel", "War", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - } - -[actionenabler_conquer_city_marines] -action = "Conquer City" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "CanOccupyCity", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "DiplRel", "War", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "UnitFlag", "Marines", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - } - -[actionenabler_conquer_city_att_from_non_native] -action = "Conquer City" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "CanOccupyCity", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "DiplRel", "War", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "UnitClassFlag", "AttFromNonNative", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - } - -[actionenabler_change_home_city] -action = "Home City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "NoHome", "Local", FALSE - "UnitState", "HasHomeCity", "Local", TRUE -; REMOVE LINE BELOW TO ALLOW GIVING UNITS TO ALLIES THROUGH HOME CITY COMMAND - "DiplRel", "Foreign", "Local", FALSE - } - -[actionenabler_paradrop_base] -action = "Paradrop Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Paratroopers", "Local", TRUE - "UnitState", "Transporting", "Local", FALSE - "Extra", "Airbase", "Local", TRUE - } - -[actionenabler_paradrop_city] -action = "Paradrop Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Paratroopers", "Local", TRUE - "UnitState", "Transporting", "Local", FALSE - "CityTile", "Center", "Local", TRUE - } - -[actionenabler_upgrade_unit] -action = "Upgrade Unit" -actor_reqs = - { "type", "name", "range", "present" - "DiplRel", "Foreign", "Local", FALSE - } - -[actionenabler_airlift_unit] -action = "Airlift Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "Airliftable", "Local", TRUE - "UnitState", "Transporting", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - } - -[actionenabler_transform_terrain_outside_city] -action = "Transform Terrain" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Transform", "Local", TRUE - "CityTile", "Center", "Local", FALSE - } -[actionenabler_transform_terrain_inside_city] ;can't change grass to hills inside a city -action = "Transform Terrain" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Transform", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "Terrain", "Grassland", "Local", FALSE - } - -[actionenabler_irrigate_tf] -action = "Irrigate TF" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Legion", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - } -[actionenabler_irrigate_tf_prole] -action = "Irrigate TF" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player", TRUE - } - -[actionenabler_mine_tf_outside_city] -action = "Mine TF" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Legion", "Local", FALSE - "UnitType", "Proletarians","Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE - "CityTile", "Center", "Local", FALSE - } -[actionenabler_mine_tf_outside_city_prole] -action = "Mine TF" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians","Local", TRUE - "Gov", "Communism", "Player", TRUE - "CityTile", "Center", "Local", FALSE - } -[actionenabler_mine_tf_inside_city] ;you can't plant a forest in an existing city -action = "Mine TF" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Legion", "Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - "CityTile", "Center", "Local", TRUE - "Terrain", "Grassland", "Local", FALSE - "Terrain", "Plains", "Local", FALSE - } - -[actionenabler_pillage] -action = "Pillage" -actor_reqs = - { "type", "name", "range" - "UnitClassFlag", "CanPillage", "Local" - } - -[actionenabler_fortify] -action = "Fortify" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "CanFortify", "Local", TRUE - "UnitFlag", "Cant_Fortify", "Local", FALSE - } - -[actionenabler_road] -action = "Road" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Legion", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - } -[actionenabler_road_prole] -action = "Road" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player", TRUE - } -[actionenabler_legion_road] -action = "Road" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Legion", "Local", TRUE - "UnitState", "OnDomesticTile","Local", FALSE - } -; Don't force legions to road BEFORE making a fortress -; from fortress being "domestic national territory" -[actionenabler_legion_road2] -action = "Road" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Legion", "Local", TRUE - "Extra", "Fort", "Local", TRUE - } - -[actionenabler_base] -action = "Build Base" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "CanFortress", "Local", TRUE - "UnitType", "Proletarians", "Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE - } -[actionenabler_base_prole] -action = "Build Base" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "CanFortress", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player", TRUE - } - -[actionenabler_mining] -action = "Build Mine" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitFlag", "Well-Digger", "Local", FALSE - "UnitType", "Legion", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "TerrainFlag", "Oil", "Local", FALSE - } -[actionenabler_mining_prole] -action = "Build Mine" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "TerrainFlag", "Oil", "Local", FALSE - } - -[actionenabler_desert_oil] -action = "Build Mine" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Legion", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE - "Tech", "Construction", "Player", TRUE - } -target_reqs = - { "type", "name", "range" - "Terrain", "Desert", "Local" - } -[actionenabler_desert_oil_prole] -action = "Build Mine" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player", TRUE - "Tech", "Construction", "Player", TRUE - } -target_reqs = - { "type", "name", "range" - "Terrain", "Desert", "Local" - } - -[actionenabler_glacier_oil] -action = "Build Mine" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Legion", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE - "Tech", "Refining", "Player", TRUE - } -target_reqs = - { "type", "name", "range" - "Terrain", "Glacier", "Local" - } -[actionenabler_glacier_oil_prole] -action = "Build Mine" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "Gov", "Communism", "Player", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Tech", "Refining", "Player", TRUE - } -target_reqs = - { "type", "name", "range" - "Terrain", "Glacier", "Local" - } - -[actionenabler_irrigate_welldigger] -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitFlag", "Well-Digger", "Local", TRUE - "Age", "10", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "TerrainFlag", "Low Land", "Local", TRUE - "Tech", "Pottery", "Player", FALSE - "Tech", "Alphabet","Player", FALSE - "Tech", "Writing", "World", FALSE - } - -[actionenabler_irrigate_src_ocean] -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitFlag", "Well-Digger", "Local", FALSE - "UnitType", "Legion", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "TerrainClass", "Oceanic", "CAdjacent", TRUE - } -[actionenabler_irrigate_src_ocean_prole] -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player",TRUE - } -target_reqs = - { "type", "name", "range", "present" - "TerrainClass", "Oceanic", "CAdjacent", TRUE - } - -[actionenabler_irrigate_src_river] -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Legion", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "Extra", "River", "CAdjacent", TRUE - } -[actionenabler_irrigate_src_river_prole] -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player",TRUE - } -target_reqs = - { "type", "name", "range", "present" - "Extra", "River", "CAdjacent", TRUE - } - -[actionenabler_irrigate_src_oasis] -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Legion", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "Extra", "Oasis", "CAdjacent", TRUE - } -[actionenabler_irrigate_src_oasis_prole] -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player",TRUE - } -target_reqs = - { "type", "name", "range", "present" - "Extra", "Oasis", "CAdjacent", TRUE - } - -[actionenabler_irrigate_src_irrigation] -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitFlag", "Well-Digger", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - "UnitType", "Legion", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "Extra", "Irrigation", "CAdjacent", TRUE - } -[actionenabler_irrigate_src_irrigation_prole] -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player",TRUE - } -target_reqs = - { "type", "name", "range", "present" - "Extra", "Irrigation", "CAdjacent", TRUE - } - -[borders] -; Base border radius from city. -radius_sq_city = 17 - -; Border radius square increased by this amount / point of city size -size_effect = 1 - -; Difference between city workable area and area permanently claimed by -; city (these tiles cannot be stolen by stronger border sources). -; 0 means exactly city workable area is immune to border stealing. -; Negative value means outer workable tiles can be stolen; highly negative -; value (more than max city radius_sq) means any workable tile can be stolen. -; If City_Radius_Sq is variable, so is the set of locked tiles; this is -; a squared value, so the radius of the ring of tiles which are workable -; but not locked (or vice versa) varies but the area is constant. -radius_sq_city_permanent = 0 - -[research] -; Method of calculating technology costs -; "Civ I|II" - Civ (I|II) style. Every new tech add base_tech_cost to -; cost of next tech. -; "Classic" - Cost of technology is: -; base_tech_cost * (1 + reqs) * sqrt(1 + reqs) / 2 -; where reqs == number of requirement for tech, counted -; recursively. -; "Classic+" - Cost are read from tech.ruleset. Missing costs are -; generated by style "Classic". -; "Experimental" - Cost of technology is: -; base_tech_cost * (reqs^2 / (1 + sqrt(sqrt(reqs + 1))) -; - 0.5) -; where reqs == number of requirement for tech, counted -; recursively. Initial techs` cost will be base_tech_cost. -; "Experimental+" - Cost are read from tech.ruleset. Missing costs are -; generated by style "Experimental". -; "Linear" - Cost of technology is: -; base_tech_cost * reqs -; where reqs == number of requirement for tech, counted -; recursively. -tech_cost_style = "Classic+" - -; Base research cost. Used in tech cost styles where tech cost is generated. -; In other words: used everywhere unless the cost of *all* techs are -; specified and the tech cost style is "Experimental+" or "Classic+". -base_tech_cost = 20 - -; Technology leak from other civilizations -; "None" - No reduction of the technology cost. -; "Embassies" - Technology cost is reduced depending on the number of -; players which already know the tech and you have an -; embassy with. -; "All Players" - Technology cost is reduced depending on the number of -; all players (human, AI and barbarians) which already -; know the tech. -; "Normal Players" - Technology cost is reduced depending on the number of -; normal players (human and AI) which already know the -; tech. -tech_leakage = "None" - -; Method of paying tech upkeep -; "None" - no upkeep -; "Basic" - upkeep is calculated as: -; / tech_upkeep_divider - tech_upkeep_free -; "Cities" - upkeep is calculated like "Basic", but multiplied by number of cities -tech_upkeep_style = "None" - -; upkeep cost is divided by this value -tech_upkeep_divider = 2000 - -; Method of selecting techs given for free -; "Goal" - Towards player`s goal, random if no goal -; "Random" - Random researchable tech -; "Cheapest" - Cheapest researchable tech, random among equal cost ones -free_tech_method = "Goal" - -[culture] -; Minimum culture points for cultural domination victory -victory_min_points = 1000 - -; How big lead relative to second best player is needed for victory -victory_lead_pct = 200 - -; How much each culture point affects the migration -; from/to the city. Each culture point count as this many permilles -; of a migration point. -migration_pml = 50 - -[calendar] -; Year in the beginning of the game -start_year = -4000 - -; Year 1 instead of 0. -skip_year_0 = TRUE - -; How many fragments each year has. In addition to this, "Turn_Fragments" effects are -; needed to control fragment accumulation. -; Value 0 here disables year advancement by fragment accumulation. -fragments = 0 - -; Calendar fragment names. If name is missing, only a fragment number +1 (so human readable -; numbers begin from 1 and not 0) is shown. - -;fragment_name0 = "Jan" -;fragment_name1 = "Feb" -; ... - -; What labels are used for positive and negative years. -; /* TRANS: year label (Anno Domini, Common Era) */ -positive_label = _("AD") -; /* TRANS: year label (BC was before Common Era became PC) */ -negative_label = _("BC") - -; /* <-- avoid gettext warnings -; -; Disaster types: -; -; name = translatable name as seen by user -; reqs = requirements for disaster to happen (see effects.ruleset -; and README.effects for help on requirements) -; frequency = how likely disaster is to occur -; effects -; - "DestroyBuilding" = Random building is destroyed -; - "ReducePopulation" = Reduce city size by one unless it's already 1 -; - "ReducePopDestroy" = Reduce city size by one, possibly destroying the city -; - "EmptyFoodStock" = Remove all food from food stock -; - "EmptyProdStock" = Destroy current production -; - "Pollution" = One tile surrounding city polluted -; - "Fallout" = One tile surrounding city polluted with fallout -; -; */ <-- avoid gettext warnings - -; No disasters in multiplayer ruleset - -; /* <-- avoid gettext warnings -; -; Achievement types: -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets -; etc; if not present, "name" is used for this -; purpose too. Since the name used in savegames must -; not change, if you want to rename an item after a -; ruleset has been released, you should set -; "rule_name" to the original value of "name". -; type = What event grants the achievement to player. -; See README.achievements for list of these types. -; unique = If TRUE, only first one reaching the achievement will -; get it. Defaults to TRUE. -; value = Value to reach. Exact meaning of this depends on -; achievement type. -; culture = Amount of culture granted to player who gets achievement -; granted. -; first_msg = Message shown to first player gaining the achievement -; cons_msg = Message shown to consecutive players gaining the achievement -; -; */ <-- avoid gettext warnings - -; No achievements in multiplayer ruleset - -; -; Trade settings -; -; IN = international, IC = intercontinental. -; For each of the trade route types: -; "pct" - Trade income %. If this is 0, trade route cannot be -; established at all -; "cancelling" - What to do to previously established traderoutes when they -; turn illegal -; "Active" - Keep them active (although they will only -; provide nonzero income if illegal due to -; trademindist rather than pct==0) -; "Inactive" - Keep them inactive -; "Cancel" - Cancel them altogether -; "bonus" - One-time bonuses granted when traderoute established -; "None" - No one-time bonus -; "Gold" - Bonus to gold -; "Science" - Bonus to research -; "Both" - Bonus to gold and research -; -[trade] -settings = - { "type", "pct", "cancelling", "bonus" - "National", 0, "Cancel", "None" - "NationalIC", 0, "Cancel", "None" - "IN", 35, "Inactive", "Gold" - "INIC", 35, "Inactive", "Gold" - "Ally", 35, "Inactive", "Gold" - "AllyIC", 35, "Inactive", "Gold" - "Enemy", 0, "Inactive", "Gold" - "EnemyIC", 0, "Inactive", "Gold" - "Team", 35, "Inactive", "Gold" - "TeamIC", 35, "Inactive", "Gold" - } - -; When are goods for the trade route chosen. -; "Leaving" - Goods to carry are assigned to unit when it`s built, or it changes homecity -; "Arrival" - Goods are chosen when trade route is established, when unit arrives to destination -goods_selection = "Arrival" - -; /* <-- avoid gettext warnings -; -; Goods types: -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets -; etc; if not present, "name" is used for this -; purpose too. Since the name used in savegames must -; not change, if you want to rename an item after a -; ruleset has been released, you should set -; "rule_name" to the original value of "name". -; reqs = requirements for a city to provide goods (see effects.ruleset -; and README.effects for help on requirements) -; from_pct = Income for the sending end of the trade route. Default is 100% -; This value is applied to both ends of bidirectional routes. -; to_pct = Income for the receiving end of the trade route. Default is 100% -; This value is not used at all in case of bidirectional routes. -; onetime_pct = Onetime bonuses when traderoute is established. Default is 100% -; flags -; - "Bidirectional" = Trade route carrying the goods does not have "from" and "to" -; ends, but both ends are considered the same. -; - "Depletes" = Trade route gets cancelled when the source city cannot provide -; goods any more. Bidirectional routes gets cancelled if either -; one of the involved cities cannot provide goods. -; helptext = Optional help text string; should escape all raw -; newlines so that xgettext parsing works -; -; */ <-- avoid gettext warnings - -[goods_good] -name = _("Goods") - - -; /* <-- avoid gettext warnings -; -; Clause types -; -; Clause types that are not listed here, are not enabled at all. -; -; type = Type of the clause, one of "Advance", "Gold", "Map", "Seamap", -; "City", "Ceasefire", "Peace", "Alliance", "Vision", "Embassy" -; -; */ <-- avoid gettext warnings - -[clause_advance] -type = "Advance" - -[clause_gold] -type = "Gold" - -[clause_map] -type = "Map" - -[clause_seamap] -type = "Seamap" - -[clause_city] -type = "City" - -[clause_ceasefire] -type = "Ceasefire" - -[clause_peace] -type = "Peace" - -[clause_alliance] -type = "Alliance" - -[clause_vision] -type = "Vision" - -[clause_embassy] -type = "Embassy" - - -[playercolors] -background.r = 86 -background.g = 86 -background.b = 86 - -; Player colors for 32 players are defined below. -; Avoid greens, blues, and white / very pale colors (too easy to confuse -; with terrain). -; Avoid dark colors. -colorlist = - { "r", "g", "b" - 255, 0, 0 ; Red - 255, 255, 0 ; Yellow - 0, 255, 255 ; Blue - 138, 43, 226 ; Purple - 255, 165, 0 ; Orange - 255, 0, 255 ; Magenta - 173, 216, 230 ; Cornflower - 0, 255, 127 ; Emerald - 250, 128, 114 ; Salmon - 124, 252, 0 ; Green - 139, 0, 0 ; Burgundy - 255, 192, 203 ; Pink - 211, 211, 211 ; Silver - 218, 112, 214 ; Heliotrope - 255, 20, 147 ; Fuchsia - 100, 149, 237 ; Azure - 255, 215, 0 ; Gold - 245, 222, 179 ; Khaki - 255, 255, 128 ; Butter - 192, 255, 128 ; Mint - 204, 255, 0 ; Lime - 255, 211, 140 ; Peach - 255, 79, 0 ; Vermilion - 240, 145, 169 ; Puce - 255, 219, 88 ; Mustard - 153, 17, 153 ; Aubergine - 184, 134, 11 ; Brown - 255, 102, 0 ; Pumpkin - 102, 205, 170 ; Turquoise - 195, 33, 72 ; Crimson - 168, 153, 230 ; Lavender - 255, 250, 205 ; Cream - } - -[teams] -; Team names correspond roughly to colors defined above, so that -; plrcolormode=TEAM_ORDER is not gratuitously confusing. -names = -; /* TRANS: Name of a color; used as unique identifier for a team */ -; /* TRANS: With this and other color team names, uniqueness is more */ -; /* TRANS: important than precise translation. To see the colors, start a */ -; /* TRANS: multiplayer game with 32 players and look at the Nations report. */ - _("?team name:Red"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Yellow"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Blue"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Purple"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Orange"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Magenta"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Cornflower"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Emerald"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Salmon"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Green"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Burgundy"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Pink"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Silver"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Heliotrope"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Fuchsia"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Azure"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Gold"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Khaki"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Butter"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Mint"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Lime"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Peach"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Vermilion"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Puce"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Mustard"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Aubergine"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Brown"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Pumpkin"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Turquoise"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Crimson"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Lavender"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Cream") - - -; RESTRICTINFRA ENABLED ONLY RESTRICTS ENEMY RAILS TO FUNCTION AS ROADS -[settings] -; TO DISABLE SPACERACE INCLUDE THESE LINES BELOW: -; "endspaceship", DISABLED, FALSE -; "victories", "ALLIED", FALSE - -set = - { "name", "value", "lock" - "mapsize", "PLAYER", FALSE - "tilesperplayer", 300, FALSE - "netwait", 20, FALSE - "nettimeout", 120, FALSE - "pingtime", 30, FALSE - "pingtimeout", 240, FALSE - "restrictinfra", "ENABLED", FALSE - "alltemperate", FALSE, FALSE - "aifill", 6, FALSE - "airliftingstyle", "FROM_ALLIES|TO_ALLIES", FALSE - "airliftdestdivisor", 3, FALSE - "barbarians", "DISABLED", FALSE - "borders", "SEE_INSIDE", FALSE - "contactturns", 10, FALSE - "diplomacy", "ALL", FALSE - "dispersion", 2, FALSE - "endturn", 365, FALSE - "foggedborders", TRUE, FALSE - "generator", "RANDOM", FALSE - "gold", 100, FALSE - "huts", 0, FALSE - "landmass", 63, FALSE - "minplayers", 0, FALSE - "nationset", "all", FALSE - "nuclearwinter_percent", 20, FALSE - "revolen", 1, FALSE - "separatepoles", FALSE, FALSE - "spaceship_travel_time", 225, FALSE - "specials", 350, FALSE - "startpos", "SINGLE", FALSE - "startunits", "cccwwwxxa", FALSE - "techpenalty", 0, FALSE - "tinyisles", FALSE, FALSE - "trademindist", 12, FALSE - "trade_revenue_style", "SIMPLE", FALSE ;"simple" formula based on average trade in both cities (sans distance etc.) - "topology", "WRAPX", FALSE - "trading_city", "DISABLED", FALSE - "universal_unload", "ENABLED", FALSE - "unload_override", 0, FALSE ;0=native unloading same as non-native. 1+ = move_fragment cost for unloading. - "unreachableprotects", "ENABLED", FALSE - } diff --git a/freeciv/freeciv/data/.historic/mp2-preArctic/governments.ruleset b/freeciv/freeciv/data/.historic/mp2-preArctic/governments.ruleset deleted file mode 100644 index 9fe233f4d..000000000 --- a/freeciv/freeciv/data/.historic/mp2-preArctic/governments.ruleset +++ /dev/null @@ -1,242 +0,0 @@ - -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -; Note that the freeciv AI may not cope well with anything more -; than minor changes. - -[datafile] -description="Multiplayer governments data for Freeciv (as Civ2, minus fundamentalism)" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -[governments] -during_revolution="Anarchy" - -; /* <-- avoid gettext warnings -; -; Below: The individual government types, one per section. -; -; The actual tag used (the * in [government_*]) does not matter, except -; it must be unique within this file, and it may be used in debug -; output when reading this file. -; -; For the "official" rulesets, the order of these sections should not -; be changed because that would break backward compatability with -; savegames. (In particular, if Fundamentalism is added to default -; ruleset, should be added at end.) -; -; Notes on fields: -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; if -; not present, "name" is used for this purpose too. Since -; the name used in savegames must not change, if you want -; to rename an item after a ruleset has been released, you -; should set "rule_name" to the original value of "name". -; reqs = requirements for this government (see README.effects) -; graphic = tag specifing preferred graphic -; graphic_alt = alternate graphics tag if preferred is not found; -; should be a standard tag if preferred is not; -; otherwise may be "-" -; ai_better = AI will not consider this government for use if the -; government listed here is available -; ruler_titles = ruler titles by nation, "-" is default, and non-matched -; nations are ignored -; helptext = optional help text string; should escape all raw newlines -; so that xgettext parsing works -; -; */ <-- avoid gettext warnings - -;------------------------------------------------------------------------ -[government_anarchy] - -name = _("Anarchy") -; No reqs -graphic = "gov.anarchy" -graphic_alt = "-" - -ruler_male_title = _("Warlord %s") -ruler_female_title = _("Warlady %s") - -helptext = _("\ -Anarchy is simply the absence of any recognizable government.\ - Citizens are disorganized and unproductive, and will spend all\ - income as quickly as possible, rather than paying taxes or\ - conducting research.\ -"), _("\ -Anarchy offers slightly less corruption than Despotism,\ - but slightly more unhappiness.\ -") - -;------------------------------------------------------------------------ -[government_despotism] - -name = _("Despotism") -; No reqs -graphic = "gov.despotism" -graphic_alt = "-" -ai_better = "Monarchy" - -ruler_male_title = _("Chief %s") -ruler_female_title = _("?female:Chief %s") - -helptext = _("\ -Under Despotism, you are the absolute ruler of your people. Your\ - control over your citizens is maintained largely by martial law.\ -"), _("\ -Despotism suffers the highest level of corruption of all\ - forms of government.\ -") - -;------------------------------------------------------------------------ -[government_monarchy] - -name = _("Monarchy") -reqs = { "type", "name", "range" - "tech", "Monarchy", "Player" - } -graphic = "gov.monarchy" -graphic_alt = "-" -ai_better = "Communism" - -ruler_male_title = _("King %s") -ruler_female_title = _("Queen %s") - -helptext = _("\ -Under Monarchy, a king or queen serves as a hereditary figurehead\ - for your government.\ -"), _("\ -Monarchy suffers the same small amount of corruption that\ - the Republic does.\ -") - -;------------------------------------------------------------------------ -[government_communism] - -name = _("Communism") -reqs = { "type", "name", "range" - "tech", "Communism", "Player" - } -graphic = "gov.communism" -graphic_alt = "-" - -ruler_male_title = _("Comrade %s") -ruler_female_title = _("?female:Comrade %s") - -helptext = _("\ -In Communism, all work, output, and goods are owned by the state.\ -"), _("\ -Corruption does not vary by distance from the capital;\ - all cities have the same base level of corruption. Each city gets 4\ - units free of upkeep. Buildings with 1 upkeep are free.\ - The capital city with Palace gets a +25% production bonus.\ -"), _("\ -Communist states can transfer Proletarians between cities to\ - re-distribute population. Large numbers of Proletarians can be\ - used to finish State projects. The Communism tech allows a\ - Communist government to conscript Workers to Riflemen and vice - versa, if inside national territory and if possessing the necessary\ - technologies.\ -") - -;------------------------------------------------------------------------ -[government_republic] - -name = _("Republic") -reqs = { "type", "name", "range" - "tech", "The Republic", "Player" - } -graphic = "gov.republic" -graphic_alt = "-" - -ruler_male_title = _("President %s") -ruler_female_title = _("?female:President %s") - -helptext = _("\ -Under a Republican government, citizens hold an election to select a\ - representative who will govern them; since elected leaders must\ - remain popular to remain in control, citizens are given a greater\ - degree of freedom. Citizens under the Republic become unhappy\ - easily, but the self-sufficiency of your citizens allows high levels\ - of trade.\ -") - -;------------------------------------------------------------------------ -[government_democracy] - -name = _("Democracy") -reqs = { "type", "name", "range" - "tech", "Democracy", "Player" - } -graphic = "gov.democracy" -graphic_alt = "-" - -ruler_male_title = _("Prime Minister %s") -ruler_female_title = _("?female:Prime Minister %s") - -helptext = _("\ -Under Democracy, citizens govern directly by voting on issues.\ - Democracy offers the highest possible level of trade, but also\ - offers the most potential for unhappiness. There is no corruption\ - during Democracy, but citizens become very upset during\ - wars.\ -") - -;------------------------------------------------------------------------ -[government_fundamentalism] - -name = _("Fundamentalism") -reqs = { "type", "name", "range" - "tech", "Fundamentalism", "Player" - } -graphic = "gov.fundamentalism" -graphic_alt = "-" - -ruler_male_title = _("High Priest %s") -ruler_female_title = _("High Priestess %s") - -helptext = _("\ -Fundamentalism is organized around central beliefs, usually religious. These form\ - rigid guidelines for the actions of the rulers and the people.\ -"), _("\ -The people are entirely devoted to their beliefs, and are often willing to die to\ - preserve them.\ -"), _("\ -Improvements that convert unhappy citizens to content produce gold tithes equal to\ - the number of citizens they would convert. Fanatics cannot be bribed. Palace\ - gives +50% to gold income in its city. In each city, two military units may impose\ - martial law, making one citizen each content. Pilgrims can be used to migrate and\ - grow the population in the cities directed by the ruling High Priest.\ -") - -; /* <-- avoid gettext warnings -; -; Multipliers (aka policies) -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets -; etc; if not present, "name" is used for this -; purpose too. Since the name used in savegames must -; not change, if you want to rename an item after a -; ruleset has been released, you should set -; "rule_name" to the original value of "name". -; default = default value (as presented in UI) -; start = minimum value (as presented in UI) -; stop = maximum value (as presented in UI) -; step = minimum increase/decrease (as presented in UI) -; offset = offset/factor control how UI values are turned -; factor = into effect values for use in effects.ruleset. -; effect_value = (ui_value + offset) * (factor/100) -; Optional; by default offset=0, factor=100, so -; that UI values are used as-is. -; reqs = requirements for adjusting this policy (see README.effects) -; helptext = optional help text string; should escape all raw -; newlines so that xgettext parsing works -; -; */ <-- avoid gettext warnings diff --git a/freeciv/freeciv/data/.historic/mp2-preArctic/nations.ruleset b/freeciv/freeciv/data/.historic/mp2-preArctic/nations.ruleset deleted file mode 100644 index b59b60a46..000000000 --- a/freeciv/freeciv/data/.historic/mp2-preArctic/nations.ruleset +++ /dev/null @@ -1,62 +0,0 @@ - -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -[datafile] -description="Multiplayer nations data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -; This section contains meta information for freeciv-ruledit to recreate the ruleset -; file in a form wanted. These have no in-game effect whatsoever -[ruledit] - -; Nationlist to add include statement for. If this entry is omitted, all the nations -; will be saved to nations.ruleset itself. -nationlist = "default/nationlist.ruleset" - -; List of nations to embed to main nations.ruleset despite separate nationlist -; being used for other nations. -embedded_nations = "barbarian", "pirate" - -[compatibility] -; Initial government for all the nations that do not -; have it explicitly defined -default_government = "Despotism" - -[default_traits] -; Default values for the AI traits. These are used if nation specific -; value for some trait has not been used. If these default too are -; not defined, the ultimate default is 50. -; _min and _max give the range from which the trait value -; is randomly chosen for a given AI player unless 'traitdistribution' -; server setting is 'FIXED' -; _default is the exaxt trait value used when 'traitdistribution' -; is 'FIXED'. If _default has not been given, it's set to the -; midpoint between _min and _max. - -; Value of trait "expansionist" defines how much AI wants to settle new territory. -expansionist_min = 30 -expansionist_max = 90 -expansionist_default = 50 - -; Value of trait "trader" defines how much AI wants to establish trade routes. -trader_min = 30 -trader_max = 90 -trader_default = 50 - -; Value of trait "aggressive" defines how easily AI declares war. -aggressive_min = 30 -aggressive_max = 90 -aggressive_default = 50 - -; Please keep [ruledit] section in sync with these includes -*include "default/nationlist.ruleset" -; This ruleset uses model of two separate barbarian nations -*include "nation/barbarian.ruleset" -*include "nation/pirate.ruleset" diff --git a/freeciv/freeciv/data/.historic/mp2-preArctic/script.lua b/freeciv/freeciv/data/.historic/mp2-preArctic/script.lua deleted file mode 100644 index ea114495c..000000000 --- a/freeciv/freeciv/data/.historic/mp2-preArctic/script.lua +++ /dev/null @@ -1,163 +0,0 @@ --- Freeciv - Copyright (C) 2007 - The Freeciv Project --- This program is free software; you can redistribute it and/or modify --- it under the terms of the GNU General Public License as published by --- the Free Software Foundation; either version 2, or (at your option) --- any later version. --- --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU General Public License for more details. - --- This file is for lua-functionality that is specific to a given --- ruleset. When freeciv loads a ruleset, it also loads script --- file called 'default.lua'. The one loaded if your ruleset --- does not provide an override is default/default.lua. - - --- This flags whether philosophy awards a bonus advance, and gets set to off (0) after T85. -philosophy_possible = 1 -game_turn = 0 - ---Give players custom messages on certain years. Currently at 1600 AD (T85), Philosophy expires. Let them know. -function history_turn_notifications(turn, year) - game_turn = turn - - if turn > 78 and turn < 85 then - notify.all("Philosophy will no longer award a bonus tech after turn 85.") - end - - if turn == 85 then - -- Philosophy no longer gives advances after 1600 AD - notify.all("Philosophers around the world mourn the execution of Giordano Bruno. Philosophy no longer gives a bonus advance.") - philosophy_possible = 0 - end - - return false -end -signal.connect("turn_begin", "history_turn_notifications") -- *************** turn_started deprecated in 3.1, renamed turn_begin - --- Place Ruins at the location of the destroyed city. -function city_destroyed_callback(city, loser, destroyer) - city.tile:create_extra("Ruins", NIL) - -- continue processing - return false -end - -signal.connect("city_destroyed", "city_destroyed_callback") - - --- Hack: record which players already got Philosophy, to avoid --- teams getting it multiple times with team_pooled_research. --- Stored as a string as this is a type simple enough to be included --- in savefiles. --- (It`s probably not necessary to test for existence as savefile --- data is loaded after this script is executed.) -if philo_players == nil then - philo_players = "" -end - --- Record that a player got Philosophy in our hacky string. -function record_philo(player) - local pos = player.id + 1 - philo_players = string.sub(philo_players, 1, pos-1) .. - string.rep(" ", math.max(0, pos - 1 - #philo_players)) .. - "." .. string.sub(philo_players, pos+1) -end - --- Grant one tech when the tech Philosophy is researched. -function tech_researched_handler(tech, player, how) - local id - local gained - - if tech == nil then - -- no tech was researched. - return - end - - id = tech.id --- Report early Horseback riding. - if id == find.tech_type("Horseback Riding").id and how == "researched" then - if game_turn < 15 then - for c in player:cities_iterate() do - if c:has_building(find.building_type("Palace")) then - notify.event(NIL, c.tile, E.TECH_GAIN, - _("Travellers tell stories of the amazing skills of the %s, who ride wild beasts near %s! (%i,%i)"), - player.nation:plural_translation(), c.name, c.tile.x, c.tile.y ) - - notify.all( _("Tribesmen have learned to ride wild beasts near %s (%i,%i)"), c.name, c.tile.x, c.tile.y) - end - end - end - end -------------------------- - if id == find.tech_type("Philosophy").id and how == "researched" then - - -- Check potential teammates. - for p in players_iterate() do - if player:shares_research(p) - and string.sub(philo_players, p.id+1, p.id+1) == "." then - -- Another player in the same team already got Philosophy. - record_philo(player) - return - end - end - - record_philo(player) - - - -- Philosophy does not give a bonus tech under certain conditions. Check for those conditions ------------------- - if philosophy_possible == 0 then - -- No Philosophy advance after turn 85 (1600 CE) - return - end - - -- Philosophy can't give advances that come after Industrialization, Electricity, and Conscription -------------- - -- Even knowing any of these techs makes an advance impossible ! - - local researcher = player - local forbidden_tech = find.tech_type("Industrialization") - - if researcher:knows_tech(forbidden_tech) then - return - end - - forbidden_tech = find.tech_type("Electricity") - - if researcher:knows_tech(forbidden_tech) then - return - end - - forbidden_tech = find.tech_type("Conscription") - - if researcher:knows_tech(forbidden_tech) then - return - end - - -- Give the player a free advance. - -- This will give a free advance for each player that shares research. - gained = player:give_tech(nil, -1, false, "researched") - - -- Notify the player. Include the tech names in a way that makes it - -- look natural no matter if each tech is announced or not. - notify.event(player, NIL, E.TECH_GAIN, - _("Great philosophers from all the world join your civilization: you get the immediate advance %s."), - gained:name_translation()) - - -- Notify research partners - notify.research(player, false, E.TECH_GAIN, - _("Great philosophers from all the world join the %s: you get the immediate advance %s."), - player.nation:plural_translation(), - gained:name_translation()) - - -- default.lua informs the embassies when the tech source is a hut. - -- They should therefore be informed about the source here too. - notify.research_embassies(player, E.TECH_EMBASSY, - -- /* TRANS: first %s is leader or team name */ - _("Great philosophers from all the world join %s: they get %s as an immediate advance."), - player:research_name_translation(), - gained:name_translation()) - end -end - -signal.connect("tech_researched", "tech_researched_handler") diff --git a/freeciv/freeciv/data/.historic/mp2-preArctic/techs.ruleset b/freeciv/freeciv/data/.historic/mp2-preArctic/techs.ruleset deleted file mode 100644 index 829da440e..000000000 --- a/freeciv/freeciv/data/.historic/mp2-preArctic/techs.ruleset +++ /dev/null @@ -1,946 +0,0 @@ - -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes, -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -[datafile] -description="Multiplayer-Evolution technology data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -[control] -; Names for custom tech flags. There can be up to 8 of these. -; name = rule name; In some circumstances user may see this -; as part of some sentences, so try to make it descriptive -; and sensible. -; helptxt = displayed in the help for advances with this flag (optional) -;flags = -; { "name", "helptxt" -; } - -; /* <-- avoid gettext warnings -; -; Tech classes: -; -; First one is the default one. -; If there is none, tech classes feature is disabled -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets -; etc; if not present, "name" is used for this -; purpose too. Since the name used in savegames must -; not change, if you want to rename an item after a -; ruleset has been released, you should set -; "rule_name" to the original value of "name". -; cost_pct = how much techs of the class cost compared -; to normal. Default is 100%. -; -; */ <-- avoid gettext warnings - -;[techclass_default] -;name = - -; /* <-- avoid gettext warnings -; -; Below: The individual advances, one per section. -; The number can be variable, up to 250. -; -; The actual tag used (the * in [advance_*]) does not matter, except -; it must be unique within this file, and it may be used in debug -; output when reading this file. -; -; Notes: -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; if -; not present, "name" is used for this purpose too. Since -; the name used in savegames must not change, if you want -; to rename an item after a ruleset has been released, you -; should set "rule_name" to the original value of "name". -; class = tech class this tech belongs to, if they have been defined. -; Default is first one defined above. -; req1, req2 = advances required before researching this one -; root_req = tech required before acquiring this tech, by any means. -; All techs with any direct or indirect dependency on this -; one will *also* have this root_req, as well as their own -; and any others they inherit. -; Giving "None" explicitly here prevents a tech from -; inheriting root_reqs in this way, and stops root_req -; inheritance through that tech. -; Specifying a tech's root_req as itself means that the tech -; can only be acquired by special means (nation's init_techs, -; scripting, etc). -; research_reqs = requirements before researching this one. Can have non -; tech requirements because it is a requirement vector. -; See doc/README.effects to learn more about requirement -; vectors. -; Requireing a tech here in stead of in req1, req2 or -; root_req is not supported yet. -; Requirements that may become fulfilled during the game -; when they weren't at the start of the game is not -; supported yet. -; flags = special flag strings -; graphic = icon for technology -; graphic_alt = alternate icon -; helptext = optional help text string (set units ruleset for examples) -; bonus_message = text seen when a player is the first to discover -; an bonus tech. Must contain '%s' to mark place of the tech -; gained. -; cost = if tech_cost_style is set to "Classic+" or "Experimental+", -; this field is read for information on how much a tech -; costs. -; -; Special values for req1 and req2 are "None" (first section below) -; and "Never" (never available). If only one tech is required, -; it should be listed as req1. -; -; As well as custom flags defined above, the following flag strings are -; possible: -; -; "Bonus_Tech" = player gets extra tech if reached first -; "Bridge" = "Settler" unit types can build roads with -; "RequiresBridge" flag over roads with -; "PreventsOtherRoads" flag (rivers) -; "Build_Airborne" = from now on can build air units (for use by AI) -; "Claim_Ocean" = Player claims ocean tiles even if they are not -; adjacent to border source -; "Claim_Ocean_Limited" = Oceanic border sources claim ocean tiles even if -; they are not adjacent to border source -; -; */ <-- avoid gettext warnings - -[advance_advanced_flight] -name = _("Advanced Flight") -req1 = "Radio" -req2 = "Machine Tools" -flags = "" -graphic = "a.advanced_flight" -graphic_alt = "-" -cost = 6630 - -[advance_alphabet] -name = _("Alphabet") -req1 = "None" -req2 = "None" -flags = "" -graphic = "a.alphabet" -graphic_alt = "-" -cost = 24 - -[advance_amphibious_warfare] -name = _("Amphibious Warfare") -req1 = "Navigation" -req2 = "Tactics" -flags = "" -graphic = "a.amphibious_warfare" -graphic_alt = "-" -cost = 3280 - -[advance_astronomy] -name = _("Astronomy") -req1 = "Mysticism" -req2 = "Mathematics" -flags = "" -graphic = "a.astronomy" -graphic_alt = "-" -cost = 146 - -[advance_atomic_theory] -name = _("Atomic Theory") -req1 = "Theory of Gravity" -req2 = "Physics" -flags = "" -graphic = "a.atomic_theory" -graphic_alt = "-" -cost = 1080 - -[advance_automobile] -name = _("Automobile") -req1 = "Combustion" -req2 = "Steel" -graphic = "a.automobile" -graphic_alt = "-" -helptext = _("Obsoletes Leonardos Workshop, Colossus. +25% population pollution.") -cost = 4230 - -[advance_banking] -name = _("Banking") -req1 = "Trade" -req2 = "The Republic" -flags = "" -graphic = "a.banking" -graphic_alt = "-" -cost = 364 - -[advance_bridge_building] -name = _("Bridge Building") -req1 = "Iron Working" -req2 = "Construction" -flags = "Bridge" -graphic = "a.bridge_building" -graphic_alt = "-" -helptext = _("Allows roads on rivers.") - -[advance_bronze_working] -name = _("Bronze Working") -req1 = "None" -req2 = "None" -flags = "" -graphic = "a.bronze_working" -graphic_alt = "-" -cost = 24 - -[advance_ceremonial_burial] -name = _("Ceremonial Burial") -req1 = "None" -req2 = "None" -flags = "" -graphic = "a.ceremonial_burial" -graphic_alt = "-" -cost = 24 - -[advance_chemistry] -name = _("Chemistry") -req1 = "University" -req2 = "Medicine" -flags = "" -graphic = "a.chemistry" -graphic_alt = "-" -cost = 800 - -[advance_chivalry] -name = _("Chivalry") -req1 = "Feudalism" -req2 = "Horseback Riding" -flags = "" -graphic = "a.chivalry" -graphic_alt = "-" -helptext = _("Obsoletes Horsemen, Chariots.") -cost = 226 - -[advance_code_of_laws] -name = _("Code of Laws") -req1 = "Alphabet" -req2 = "None" -flags = "" -graphic = "a.code_of_laws" -graphic_alt = "-" - -[advance_combined_arms] -name = _("Combined Arms") -req1 = "Mobile Warfare" -req2 = "Advanced Flight" -flags = "" -graphic = "a.combined_arms" -graphic_alt = "-" -cost = 6970 - -[advance_combustion] -name = _("Combustion") -req1 = "Refining" -req2 = "Explosives" -flags = "" -graphic = "a.combustion" -graphic_alt = "-" -cost = 3810 - -[advance_communism] -name = _("Communism") -req1 = "Philosophy" -req2 = "Industrialization" -flags = "" -graphic = "a.communism" -graphic_alt = "-" -helptext = _("-1 Effect for Cathedral, Michelangelos Chapel.") - -[advance_computers] -name = _("Computers") -req1 = "Mass Production" -req2 = "Miniaturization" -flags = "" -graphic = "a.computers" -graphic_alt = "-" -helptext = _("Obsoletes Temple of Artemis.") -cost = 5650 - -[advance_conscription] -name = _("Conscription") -req1 = "Democracy" -req2 = "Metallurgy" -flags = "" -graphic = "a.conscription" -graphic_alt = "-" -helptext = _("Obsoletes Musketeers.") -cost = 1890 - -[advance_construction] -name = _("Construction") -req1 = "Masonry" -req2 = "Currency" -flags = "" -graphic = "a.construction" -graphic_alt = "-" -helptext = _("Allows Fortresses, Oil Wells.") - -[advance_currency] -name = _("Currency") -req1 = "Bronze Working" -req2 = "None" -flags = "" -graphic = "a.currency" -graphic_alt = "-" - -[advance_democracy] -name = _("Democracy") -req1 = "Banking" -req2 = "Invention" -flags = "" -graphic = "a.democracy" -graphic_alt = "-" -cost = 875 - -[advance_economics] -name = _("Economics") -req1 = "Banking" -req2 = "University" -flags = "" -graphic = "a.economics" -graphic_alt = "-" -cost = 875 - -[advance_electricity] -name = _("Electricity") -req1 = "Metallurgy" -req2 = "Magnetism" -flags = "" -graphic = "a.electricity" -graphic_alt = "-" -helptext = _("Obsoletes Ironclad. +1 Effect for Amphitheaters.") -cost = 2220 - -[advance_electronics] -name = _("Electronics") -req1 = "The Corporation" -req2 = "Electricity" -flags = "" -graphic = "a.electronics" -graphic_alt = "-" -cost = 3630 - -[advance_engineering] -name = _("Engineering") -req1 = "The Wheel" -req2 = "Construction" -flags = "" -graphic = "a.engineering" -graphic_alt = "-" -helptext = _("Allows Canals and Naval Bases.") - -[advance_environmentalism] -name = _("Environmentalism") -req1 = "Recycling" -req2 = "Space Flight" -flags = "" -graphic = "a.environmentalism" -graphic_alt = "-" -helptext = _("-50% Pollution in all cities.") -cost = 8040 - -[advance_espionage] -name = _("Espionage") -req1 = "Communism" -req2 = "Democracy" -flags = "" -graphic = "a.espionage" -graphic_alt = "-" -helptext = _("Obsoletes Diplomat.") -cost = 2900 - -[advance_explosives] -name = _("Explosives") -req1 = "Gunpowder" -req2 = "Chemistry" -flags = "" -graphic = "a.explosives" -graphic_alt = "-" -helptext = _("Obsoletes Workers.") -cost = 1560 - -[advance_feudalism] -name = _("Feudalism") -req1 = "Warrior Code" -req2 = "Monarchy" -flags = "" -graphic = "a.feudalism" -graphic_alt = "-" -cost = 146 - -[advance_flight] -name = _("Flight") -req1 = "Combustion" -req2 = "Theory of Gravity" -flags = "Build_Airborne" -graphic = "a.flight" -graphic_alt = "-" -helptext = _("Less Traderoute revenue.") -cost = 4680 - -[advance_fundamentalism] -name = _("Fundamentalism") -req1 = "Theology" -req2 = "Conscription" -flags = "" -graphic = "a.fundamentalism" -graphic_alt = "-" - -[advance_fusion_power] -name = _("Fusion Power") -req1 = "Nuclear Power" -req2 = "Superconductors" -flags = "" -graphic = "a.fusion_power" -graphic_alt = "-" -cost = 6120 - -[advance_genetic_engineering] -name = _("Genetic Engineering") -req1 = "Medicine" -req2 = "The Corporation" -flags = "" -graphic = "a.genetic_engineering" -graphic_alt = "-" -cost = 3150 - -[advance_guerilla_warfare] -name = _("Guerilla Warfare") -req1 = "Communism" -req2 = "Tactics" -flags = "" -graphic = "a.guerilla_warfare" -graphic_alt = "-" -helptext = _("Obsoletes Explorer. Globally unlocks defensive partisans.") -cost = 3985 - -[advance_gunpowder] -name = _("Gunpowder") -req1 = "Invention" -req2 = "Iron Working" -flags = "" -graphic = "a.gunpowder" -graphic_alt = "-" -cost = 800 -helptext = _("Obsoletes Barracks, earlier foot soldiers.") - -[advance_horseback_riding] -name = _("Horseback Riding") -req1 = "None" -req2 = "None" -flags = "" -graphic = "a.horseback_riding" -graphic_alt = "-" -cost = 24 - -[advance_industrialization] -name = _("Industrialization") -req1 = "Railroad" -req2 = "Banking" -graphic = "a.industrialization" -graphic_alt = "-" -helptext = _("Obsoletes Galleon. Population begins polluting.") -cost = 2330 - -[advance_invention] -name = _("Invention") -req1 = "Engineering" -req2 = "Literacy" -flags = "" -graphic = "a.invention" -graphic_alt = "-" -helptext = _("Increased vision for Fortress and ships in Naval Base.") - -[advance_iron_working] -name = _("Iron Working") -req1 = "Bronze Working" -req2 = "Warrior Code" -flags = "" -graphic = "a.iron_working" -graphic_alt = "-" - -[advance_labor_union] -name = _("Labor Union") -req1 = "Mass Production" -req2 = "Guerilla Warfare" -flags = "" -graphic = "a.labor_union" -graphic_alt = "-" -cost = 6630 - -[advance_laser] -name = _("Laser") -req1 = "Mass Production" -req2 = "Nuclear Power" -flags = "" -graphic = "a.laser" -graphic_alt = "-" -cost = 5790 - -[advance_leadership] -name = _("Leadership") -req1 = "Chivalry" -req2 = "Gunpowder" -flags = "" -graphic = "a.leadership" -graphic_alt = "-" -helptext = _("Obsoletes Horsemen, Chariot, Elephant, Knight, Crusader.") -cost = 1250 - -[advance_literacy] -name = _("Literacy") -req1 = "Writing" -req2 = "Code of Laws" -flags = "" -graphic = "a.literacy" -graphic_alt = "-" - -[advance_machine_tools] -name = _("Machine Tools") -req1 = "Steel" -req2 = "Tactics" -flags = "" -graphic = "a.machine_tools" -graphic_alt = "-" -helptext = _("Obsoletes Cannon, Great Wall.") -cost = 3985 - -[advance_magnetism] -name = _("Magnetism") -;req1 = "Iron Working" -;req2 = "Physics" -req1 = "Navigation" -req2 = "Invention" -flags = "" -graphic = "a.magnetism" -graphic_alt = "-" -helptext = _("Obsoletes Caravel.") -cost = 950 - -[advance_map_making] -name = _("Map Making") -req1 = "Alphabet" -req2 = "None" -flags = "" -graphic = "a.map_making" -graphic_alt = "-" -cost = 51 - -[advance_masonry] -name = _("Masonry") -req1 = "None" -req2 = "None" -flags = "" -graphic = "a.masonry" -graphic_alt = "-" -helptext = _("Allows Forts.") -cost = 24 - -[advance_mass_production] -name = _("Mass Production") -req1 = "Automobile" -req2 = "The Corporation" -graphic = "a.mass_production" -graphic_alt = "-" -helptext = _("+25% population pollution.") -cost = 4680 - -[advance_mathematics] -name = _("Mathematics") -req1 = "Alphabet" -req2 = "Masonry" -flags = "" -graphic = "a.mathematics" -graphic_alt = "-" - -[advance_medicine] -name = _("Medicine") -req1 = "Philosophy" -req2 = "Trade" -flags = "" -graphic = "a.medicine" -graphic_alt = "-" -cost = 468 - -[advance_metallurgy] -name = _("Metallurgy") -req1 = "Gunpowder" -req2 = "University" -flags = "" -graphic = "a.metallurgy" -graphic_alt = "-" -helptext = _("Obsoletes Catapult.") -cost = 1340 - -[advance_miniaturization] -name = _("Miniaturization") -req1 = "Machine Tools" -req2 = "Electronics" -flags = "" -graphic = "a.miniaturization" -graphic_alt = "-" -helptext = _("Obsoletes Lighthouse.") -cost = 4490 - -[advance_mobile_warfare] -name = _("Mobile Warfare") -req1 = "Automobile" -req2 = "Tactics" -flags = "" -graphic = "a.mobile_warfare" -graphic_alt = "-" -helptext = _("Obsoletes Barracks II, Cavalry, Sun Tzu, Genghis Khan.") -cost = 5650 - -[advance_monarchy] -name = _("Monarchy") -req1 = "Ceremonial Burial" -req2 = "Code of Laws" -flags = "" -graphic = "a.monarchy" -graphic_alt = "-" - -[advance_monotheism] -name = _("Monotheism") -req1 = "Philosophy" -req2 = "Polytheism" -flags = "" -graphic = "a.monotheism" -helptext = _("Obsoletes Elephants.") -graphic_alt = "-" -cost = 415 - -[advance_mysticism] -name = _("Mysticism") -req1 = "Ceremonial Burial" -req2 = "None" -flags = "" -graphic = "a.mysticism" -graphic_alt = "-" -helptext = _("Doubles the effect of Temples.") - -[advance_navigation] -name = _("Navigation") -req1 = "Seafaring" -req2 = "Astronomy" -flags = "" -graphic = "a.navigation" -graphic_alt = "-" -helptext = _("Obsoletes Galley, Longboat, War Galley, Ram Ship.") -cost = 486 - -[advance_nuclear_fission] -name = _("Nuclear Fission") -req1 = "Mass Production" -req2 = "Atomic Theory" -flags = "" -graphic = "a.nuclear_fission" -graphic_alt = "-" -cost = 5300 - -[advance_nuclear_power] -name = _("Nuclear Power") -req1 = "Nuclear Fission" -req2 = "Electronics" -flags = "" -graphic = "a.nuclear_power" -graphic_alt = "-" -helptext = _("+2 moves for Sea units.") -cost = 5650 - -[advance_philosophy] -name = _("Philosophy") -req1 = "Mysticism" -req2 = "Literacy" -flags = "" -graphic = "a.philosophy" -graphic_alt = "-" -helptext = _("Bonus tech if before 1600AD, Industrialization, Electricity, Conscription.") -cost = 276 - -[advance_physics] -name = _("Physics") -req1 = "Literacy" -req2 = "Navigation" -flags = "" -graphic = "a.physics" -graphic_alt = "-" - -[advance_plastics] -name = _("Plastics") -req1 = "Refining" -req2 = "Space Flight" -graphic = "a.plastics" -graphic_alt = "-" -helptext = _("Obsoletes Armor. +25% population pollution.") -cost = 7860 - -[advance_polytheism] -name = _("Polytheism") -req1 = "Horseback Riding" -req2 = "Ceremonial Burial" -flags = "" -graphic = "a.polytheism" -graphic_alt = "-" - -[advance_pottery] -name = _("Pottery") -req1 = "None" -req2 = "None" -flags = "" -graphic = "a.pottery" -graphic_alt = "-" -cost = 24 - -[advance_radio] -name = _("Radio") -req1 = "Flight" -req2 = "Electricity" -flags = "" -graphic = "a.radio" -graphic_alt = "-" -helptext = _("Obsoletes Mausoleum. Allows Airbase, Buoy.") -cost = 5430 - -[advance_railroad] -name = _("?tech:Railroad") -req1 = "Steam Engine" -req2 = "Bridge Building" -flags = "" -graphic = "a.railroad" -graphic_alt = "-" -helptext = _("Obsoletes Hanging Gardens. Less Traderoute revenue. Allows Railroads.") -cost = 1820 - -[advance_recycling] -name = _("Recycling") -req1 = "Mass Production" -req2 = "Democracy" -flags = "" -graphic = "a.recycling" -graphic_alt = "-" -cost = 4460 - -[advance_refining] -name = _("Refining") -req1 = "Chemistry" -req2 = "Steel" -flags = "" -graphic = "a.refining" -graphic_alt = "-" -helptext = _("Allows Oil Wells on Glaciers.") -cost = 3630 - -[advance_refrigeration] -name = _("Refrigeration") -req1 = "Sanitation" -req2 = "Electricity" -flags = "" -graphic = "a.refrigeration" -graphic_alt = "-" -helptext = _("Allows Farmland.") -cost = 2775 - -[advance_robotics] -name = _("Robotics") -req1 = "Mobile Warfare" -req2 = "Computers" -flags = "" -graphic = "a.robotics" -graphic_alt = "-" -helptext = _("Obsoletes Artillery, King Richards Crusade.") -cost = 7860 - -[advance_rocketry] -name = _("Rocketry") -req1 = "Advanced Flight" -req2 = "Electronics" -flags = "" -graphic = "a.rocketry" -graphic_alt = "-" -helptext = _("Obsoletes Destroyer, Cruiser.") -cost = 7040 - -[advance_sanitation] -name = _("Sanitation") -req1 = "Engineering" -req2 = "Medicine" -flags = "" -graphic = "a.sanitation" -graphic_alt = "-" -cost = 950 - -[advance_seafaring] -name = _("Seafaring") -req1 = "Pottery" -req2 = "Map Making" -flags = "" -graphic = "a.seafaring" -helptext = _("Obsoletes Trireme.") -graphic_alt = "-" - -[advance_space_flight] -name = _("Space Flight") -req1 = "Computers" -req2 = "Rocketry" -flags = "" -graphic = "a.space_flight" -graphic_alt = "-" -helptext = _("Obsoletes prior Bombers/Fighters") -cost = 7680 - -[advance_stealth] -name = _("Stealth") -req1 = "Superconductors" -req2 = "Space Flight" -flags = "" -graphic = "a.stealth" -graphic_alt = "-" -cost = 11920 - -[advance_steam_engine] -name = _("Steam Engine") -;req1 = "Physics" -;req2 = "Invention" -req1 = "Physics" -req2 = "University" -flags = "" -graphic = "a.steam_engine" -graphic_alt = "-" -helptext = _("Obsoletes Frigate.") -cost = 1240 - -[advance_steel] -name = _("Steel") -req1 = "Electricity" -req2 = "Industrialization" -flags = "" -graphic = "a.steel" -graphic_alt = "-" -cost = 3280 - -[advance_superconductors] -name = _("Superconductors") -req1 = "Nuclear Power" -req2 = "Laser" -flags = "" -graphic = "a.superconductors" -graphic_alt = "-" -cost = 5950 -helptext = _("Allows MagLev.") - -[advance_tactics] -name = _("Tactics") -req1 = "Conscription" -req2 = "Leadership" -flags = "" -graphic = "a.tactics" -graphic_alt = "-" -helptext = _("Obsoletes Dragoons, Statue of Zeus.") -cost = 2530 - -[advance_the_corporation] -name = _("The Corporation") -req1 = "Economics" -req2 = "Industrialization" -flags = "" -graphic = "a.the_corporation" -graphic_alt = "-" -helptext = _("Obsoletes Caravan.") -cost = 2900 - -[advance_the_republic] -name = _("The Republic") -req1 = "Code of Laws" -req2 = "Literacy" -flags = "" -graphic = "a.the_republic" -graphic_alt = "-" - -[advance_the_wheel] -name = _("The Wheel") -req1 = "Horseback Riding" -req2 = "None" -flags = "" -graphic = "a.the_wheel" -graphic_alt = "-" - -[advance_theology] -name = _("Theology") -req1 = "Feudalism" -req2 = "Monotheism" -flags = "" -graphic = "a.theology" -graphic_alt = "-" -helptext = _("Obsoletes Oracle. +1 Effect on Cathedral, Michelangelos Chapel.") -cost = 725 - -[advance_theory_of_gravity] -name = _("Theory of Gravity") -req1 = "Astronomy" -req2 = "University" -flags = "" -graphic = "a.theory_of_gravity" -graphic_alt = "-" -cost = 585 - -[advance_trade] -name = _("Trade") -req1 = "Currency" -req2 = "Code of Laws" -flags = "" -graphic = "a.trade" -graphic_alt = "-" -helptext = _("Lets Commerce units make Wonders, Traderoutes.") - -[advance_university] -name = _("University") -req1 = "Mathematics" -req2 = "Philosophy" -flags = "" -graphic = "a.university" -graphic_alt = "-" -cost = 415 - -[advance_warrior_code] -name = _("Warrior Code") -req1 = "None" -req2 = "None" -flags = "" -graphic = "a.warrior_code" -graphic_alt = "-" -cost = 24 - -[advance_writing] -name = _("Writing") -req1 = "Alphabet" -req2 = "None" -flags = "" -graphic = "a.writing" -graphic_alt = "-" - -; A placeholder tech used to ensure that when -; a game is reloaded, a player can`t rebuild -; the "Darwin's Voyage" small wonder and get -; two free advances again. -; THIS RULESET DOES NOT USE OLD DARWIN'S VOYAGE BEHAVIOUR OR THEORY OF EVOLUTION. -[advance_theory_of_evolution] -name = _("Theory of Evolution") -req1 = "None" -req2 = "None" -root_req = "Theory of Evolution" -flags = "" -graphic = "b.darwins_voyage" -graphic_alt = "-" -helptext = _("This technology is not researchable and has no effect.") diff --git a/freeciv/freeciv/data/.historic/mp2-preArctic/terrain.ruleset b/freeciv/freeciv/data/.historic/mp2-preArctic/terrain.ruleset deleted file mode 100644 index 5633ffd28..000000000 --- a/freeciv/freeciv/data/.historic/mp2-preArctic/terrain.ruleset +++ /dev/null @@ -1,2145 +0,0 @@ - -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes, -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -; Note that the freeciv AI may not cope well with anything more -; than minor changes. - -[datafile] -description="Multiplayer-Evolution (MP2) terrain data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -[control] -; Names for custom terrain flags. There can be up to 8 of these. -; name = rule name; In some circumstances user may see this -; as part of some sentences, so try to make it descriptive -; and sensible. -; helptxt = displayed in the help for terrains with this flag (optional) -flags = - { "name", "helptxt" - _("Oil"), _("Has Oil Well instead of Mine.") - _("NoPollution"), _("No Pollution nor Fallout appear here.") - _("Low Land"), _("Terrain suitable for canal digging.") - } - -; Names for custom extra flags. There can be up to 8 of these. -; name = rule name; In some circumstances user may see this -; as part of some sentences, so try to make it descriptive -; and sensible. -; helptxt = displayed in the help for extra types with this flag -; (optional) -;extra_flags = -; { "name", "helptxt" -; } - -[parameters] - -; Percentage of "land" tiles required to be adjacent to a water tile before -; it may be "reclaimed" into a land tile (0-101; 0=anywhere, default 101=nowhere) -ocean_reclaim_requirement = 30 - -; Percentage of "water" tiles required to be adjacent to a land tile before -; it may be "channeled" into a water tile (0-101; 0=anywhere, default 101=nowhere) -land_channel_requirement = 10 - -; Percentage of unfrozen tiles (no "Frozen" flag) required to be adjacent -; to a frozen tile before it can thaw (0-101; 0=anywhere, default 101=nowhere) -thaw_requirement = 0 - -; Percentage of frozen tiles ("Frozen" flag) required to be adjacent to an -; unfrozen tile before it can freeze (0-101; 0=anywhere, default 101=nowhere) -freeze_requirement = 0 - -; Bodies of water up to this size are considered freshwater lakes, if there is -; also terrain type(s) with flag "FreshWater" in the ruleset. -lake_max_size = 14 - -; How many native tiles first startunit must be able to reach. -; 0 to disable check. -min_start_native_area = 0 - -; How many fragments each movement point has. -; For example road movement costs are relative to this. -move_fragments = 9 - -; How many move_fragments IgTer unit movement costs -igter_cost = 3 - -; Whether diagonal movement has increased cost (no effect with hex topology) -; The cost increase is more accurate with larger values for move_fragments -pythagorean_diagonal = FALSE - -; There is no resources in the middle of the oceans, only near coast -ocean_resources = FALSE - -; /* <-- avoid gettext warnings -; -; The individual terrain types, one per section. -; Roughly sorted by identifier. -; The actual tag used (the * in [terrain_*]) must be unique for each terrain, -; and may be used in debug output when reading this file. -; -; Notes: -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; -; if not present, "name" is used for this purpose too. -; Since the name used in savegames must not change, if -; you want to rename an item after a ruleset has been -; released, you should set "rule_name" to the original -; value of "name". -; graphic = preferred graphic; Tilespec [tile_*] section -; with 'tag' matching this will be used. -; graphic_alt = alternate graphic. When no tilespec 'tag' matching -; preferred graphic is not found, this will be used. -; Otherwise may be "-" -; identifier = single-character identifier used in savegames. This -; must be unique for each terrain. -; class = Terrain class terrain belongs to: "Land" or "Oceanic" -; movement_cost = in whole movement points, not move_fragments; -; typically 1 to 3 -; defense_bonus = percent added to defense; typically 0% to 200% -; food = normal food production -; shield = normal shield production -; trade = normal trade production -; resources = list of possible resources on this terrain -; road_food_incr_pct = percent of road food_incr applied to this terrain -; road_shield_incr_pct = percent of road shield_incr applied to this terrain -; road_trade_incr_pct = percent of road trade_incr applied to this terrain -; base_time = time to build bases; if 0, cannot build any bases. -; Nonzero values only affect extras with build_time 0. -; road_time = time to build roads; if 0, cannot build any roads. -; Nonzero values only affect extras with build_time 0. -; irrigation_result = result of 'irrigate' activity; one of: -; "no" -- cannot irrigate -; "yes" -- can build extra -; terrain section -- irrigation changes to that terrain -; irrigation_food_incr = increment to food if tile is 100% irrigated -; (actual bonus controlled by Irrigation_Pct effect) -; irrigation_time = time for 'irrigate' activity; if 0, cannot irrigate -; Nonzero values only affect extras with build_time 0. -; Such extras can modify time with build_time_factor. -; mining_result = result of 'mine' activity; one of: -; "no" -- cannot mine -; "yes" -- can build extra -; terrain section -- mining changes to that terrain -; mining_shield_incr = increment to shields if tile is 100% mined -; (actual bonus controlled by Mining_Pct effect) -; mining_time = time for 'mine' activity; if 0, cannot mine -; Nonzero values only affect extras with build_time 0. -; Such extras can modify time with build_time_factor. -; transform_result = result of transformation; one of: -; "no" -- cannot transform -; terrain section -- transformation changes to that -; terrain -; transform_time = time to transform; if 0, cannot transform -; pillage_time = time to pillage extra from the tile (0 = impossible) -; Nonzero values only affect extras with removal_time 0. -; clean_pollution_time = time for 'clean pollution' activity (0 = impossible) -; Nonzero values only affect extras with removal_time 0. -; clean_fallout_time = time for 'clean fallout' activity (0 = impossible) -; Nonzero values only affect extras with removal_time 0. -; animal = unit type that can appear as animal on the terrain -; warmer_wetter_result = result of global warming for wet terrains; one of: -; "no" -- no change; does not count for warming -; "yes" -- no change; counts for warming -; terrain section -- warming changes to that terrain -; warmer_drier_result = result of global warming for dry terrains; -; see warmer_wetter_result -; cooler_wetter_result = result of nuclear winter for wet terrains; -; see warmer_wetter_result -; cooler_drier_result = result of nuclear winter for dry terrains; -; see warmer_wetter_result -; native_to = List of unit classes that can move here -; flags = General flags for this terrain. List taken from the -; following, and/or any user flags defined above: -; - NoBarbs = Barbarians will not be spawned here. -; - NoCities = Cities may not be built or found on this terrain. -; - Starter = Players will only be started on "Starter" terrain. -; (Currently this cannot be Oceanic terrain.) -; - CanHaveRiver = Set to 1 if this terrain can have river on it (the -; actual chance of river generation is controlled -; separately). -; - UnsafeCoast = This terrain does not provide a safe voyage for -; units with flag "Trireme" -; - FreshWater = This terrain is used for small bodies of water. -; If this becomes adjacent to non-FreshWater terrain, -; the whole contiguous FreshWater area will be flooded -; with the non-FreshWater terrain. -; - NotGenerated = Map generator never places this terrain type. It can -; be added from editor only, or by ingame events -; (lua scripting) -; - NoZoc = Units on this terrain are not generating or subject -; to zoc -; - NoFortify = Units cannot fortify on this terrain -; - Frozen = Frozen/polar terrain. For water tiles, Frozen terrain -; is generated near poles. Conversion between frozen -; and unfrozen terrain can be controlled with -; thaw_requirement/freeze_requirement, and Frozen -; terrain is shown differently on the overview map. -; property_* = specific property % values used by mapgen. Most -; terrains will have 0 for most values. Properties -; other than ocean_depth are only used for land tiles. -; - mountainous = degree to which this terrain is mountainous -; - green = how much life this terrain has -; - foliage = how much thick undergrowth the terrain has -; - tropical = how "tropical" the terrain is (high temperature) -; - temperate = how "temperate" the terrain is (med temperature) -; - cold = how "cold" the terrain is (low temperature) -; - frozen = how "frozen" the terrain is (very low temperature) -; (does not necessarily have to have the "Frozen" flag) -; - wet = how "wet" the terrain is (moisture) -; - dry = how "dry" the terrain is (moisture) -; - ocean_depth = the depth of an ocean, as an average level -; color.r = color of the terrain (red value) -; color.g = color of the terrain (green value) -; color.b = color of the terrain (blue value) -; helptext = optional help text string; should escape all raw -; newlines so that xgettext parsing works -; -; */ <-- avoid gettext warnings - -[terrain_inaccesible] -name = _("Inaccessible") -graphic = "inaccessible" -graphic_alt = "arctic" -identifier = "i" -class = "Land" -movement_cost = 0 -defense_bonus = 0 -food = 0 -shield = 0 -trade = 0 -road_food_incr_pct = 0 -road_shield_incr_pct = 0 -road_trade_incr_pct = 0 -base_time = 0 -road_time = 0 -irrigation_result = "no" -irrigation_food_incr = 0 -irrigation_time = 0 -mining_result = "no" -mining_shield_incr = 0 -mining_time = 0 -transform_result = "no" -transform_time = 0 -pillage_time = 0 -clean_pollution_time = 0 -clean_fallout_time = 0 -animal = "None" -warmer_wetter_result = "no" -warmer_drier_result = "no" -cooler_wetter_result = "no" -cooler_drier_result = "no" -flags = "NotGenerated", "NoPollution", "NoCities", "UnsafeCoast", "Frozen" -color.r = 25 -color.g = 25 -color.b = 25 -helptext = _("\ -No unit can enter this terrain, nor can any city work its tiles.\ -") - -[terrain_lake] -name = _("Lake") -graphic = "lake" -graphic_alt = "coast" -identifier = "+" -class = "Oceanic" -movement_cost = 1 -defense_bonus = 0 -food = 1 -shield = 0 -trade = 2 -resources = "Fish" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 0 -irrigation_result = "no" -irrigation_food_incr = 0 -irrigation_time = 0 -mining_result = "no" -mining_shield_incr = 0 -mining_time = 0 -transform_result = "Swamp" -transform_time = 36 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "no" -warmer_drier_result = "Swamp" -cooler_wetter_result = "Glacier" -cooler_drier_result = "Tundra" -native_to = "Sea", "Air", "Balloon", "Missile", "Helicopter", "Trireme", "RiverShip", "Submarine", "AirProtect", "AirPillage", "Bomb" -flags = "NoCities", "NoBarbs", "NoPollution", "FreshWater", "NoZoc", "NoFortify" -property_ocean_depth = 0 -color.r = 46 -color.g = 120 -color.b = 182 -helptext = _("\ -Lakes are substantial bodies of fresh water.\ -") - -[terrain_ocean] -name = _("Ocean") -graphic = "coast" -graphic_alt = "-" -identifier = " " -class = "Oceanic" -movement_cost = 1 -defense_bonus = 0 -food = 1 -shield = 0 -trade = 2 -resources = "Fish", "Whales" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 0 -irrigation_result = "no" -irrigation_food_incr = 0 -irrigation_time = 0 -mining_result = "no" -mining_shield_incr = 0 -mining_time = 0 -transform_result = "Swamp" -transform_time = 36 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "no" -warmer_drier_result = "Swamp" -cooler_wetter_result = "Glacier" -cooler_drier_result = "Glacier" -native_to = "Sea", "Air", "Balloon", "Missile", "Helicopter", "Trireme", "RiverShip", "Submarine", "AirProtect", "AirPillage", "Bomb" -flags = "NoCities", "NoPollution", "UnsafeCoast", "NoZoc", "NoFortify" -property_ocean_depth = 32 -color.r = 0 -color.g = 46 -color.b = 137 -helptext = _("\ -Shallow oceans are mostly found near coastlines, and are often rich\ - sources of food and other resources.\ -") - -[terrain_deep_ocean] -name = _("Deep Ocean") -graphic = "floor" -graphic_alt = "coast" -identifier = ":" -class = "Oceanic" -movement_cost = 1 -defense_bonus = 0 -food = 1 -shield = 0 -trade = 2 -;resources = "none" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 0 -irrigation_result = "no" -irrigation_food_incr = 0 -irrigation_time = 0 -mining_result = "no" -mining_shield_incr = 0 -mining_time = 0 -transform_result = "no" -transform_time = 0 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "no" -warmer_drier_result = "no" -cooler_wetter_result = "no" -cooler_drier_result = "no" -native_to = "Trireme", "Sea", "Air", "Balloon", "Missile", "Helicopter", "RiverShip", "Submarine", "AirProtect", "AirPillage", "Bomb" -flags = "NoCities", "NoPollution", "UnsafeCoast", "NoZoc", "NoFortify" -property_ocean_depth = 87 -color.r = 0 -color.g = 33 -color.b = 129 -helptext = _("\ -Deep oceans cover much of the world away from coastlines, and only\ - seaworthy units (not including Triremes) can travel on them.\ -") - -[terrain_glacier] -name = _("Glacier") -graphic = "arctic" -graphic_alt = "-" -identifier = "a" -class = "Land" -movement_cost = 2 -defense_bonus = 0 -food = 0 -shield = 0 -trade = 0 -resources = "Ivory", "Oil" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 4 -irrigation_result = "no" -irrigation_food_incr = 0 -irrigation_time = 0 -mining_result = "yes" -mining_shield_incr = 2 -mining_time = 10 -transform_result = "Desert" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Tundra" -warmer_drier_result = "Tundra" -cooler_wetter_result = "no" -cooler_drier_result = "no" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "NoBarbs", "NoCities", "CanHaveRiver", "Oil", "Frozen" -property_frozen = 23 -color.r = 232 -color.g = 232 -color.b = 232 -helptext = _("\ -Glaciers are found only in the most northerly or southerly\ - reaches of the world. They are very cold, and hence difficult to\ - work with.\ -"), _("\ -Oil wells can be built when Refining is known.\ -") - -[terrain_desert] -name = _("Desert") -graphic = "desert" -graphic_alt = "-" -identifier = "d" -class = "Land" -movement_cost = 1 -defense_bonus = 0 -food = 0 -shield = 1 -trade = 0 -resources = "Oasis", "Oil" -road_trade_incr_pct = 100 -base_time = 1 -road_time = 2 -irrigation_result = "yes" -irrigation_food_incr = 1 -irrigation_time = 5 -mining_result = "yes" -mining_shield_incr = 1 -mining_time = 5 -transform_result = "Plains" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Grassland" -warmer_drier_result = "no" -cooler_wetter_result = "Plains" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "CanHaveRiver", "Oil", "Low Land" -property_dry = 75 -property_tropical = 40 -property_temperate = 26 -color.r = 214 -color.g = 185 -color.b = 106 -helptext = _("\ -Deserts are regions of extreme dryness, making agriculture and\ - trade very difficult.\ -"), _("\ -Oil wells can be built when Construction is known.\ -") - -[terrain_forest] -name = _("Forest") -graphic = "forest" -graphic_alt = "-" -identifier = "f" -class = "Land" -movement_cost = 2 -defense_bonus = 33 -food = 1 -shield = 2 -trade = 0 -resources = "Pheasant", "Silk" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 4 -irrigation_result = "Plains" -irrigation_food_incr = 0 -irrigation_time = 5 -mining_result = "Swamp" -mining_shield_incr = 0 -mining_time = 15 -transform_result = "Grassland" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Jungle" -warmer_drier_result = "Plains" -cooler_wetter_result = "Swamp" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "Starter", "CanHaveRiver", "Low Land" -property_cold = 35 -property_frozen = 7 -property_mountainous = 15 -property_wet = 30 -property_foliage = 50 -property_temperate = 50 -color.r = 43 -color.g = 107 -color.b = 19 -helptext = _("\ -Forests are densely wooded, making agriculture somewhat\ - problematic.\ -") - -[terrain_grassland] -name = _("Grassland") -graphic = "grassland" -graphic_alt = "-" -identifier = "g" -class = "Land" -movement_cost = 1 -defense_bonus = 0 -food = 2 -shield = 0 -trade = 0 -resources = "Resources" -road_trade_incr_pct = 100 -base_time = 1 -road_time = 2 -irrigation_result = "yes" -irrigation_food_incr = 1 -irrigation_time = 5 -mining_result = "Forest" -mining_shield_incr = 0 -mining_time = 10 -transform_result = "Hills" -transform_time = 30 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Lake" -warmer_drier_result = "Desert" -cooler_wetter_result = "Glacier" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "Starter", "CanHaveRiver", "Low Land" -property_green = 50 -property_temperate = 50 -property_cold = 12 -property_dry = 10 -property_tropical = 20 -color.r = 11 -color.g = 138 -color.b = 4 -helptext = _("\ -Grasslands afford exceptional agricultural opportunities.\ -") - -[terrain_hills] -name = _("Hills") -graphic = "hills" -graphic_alt = "-" -identifier = "h" -class = "Land" -movement_cost = 2 -defense_bonus = 100 -food = 1 -shield = 0 -trade = 0 -resources = "Coal", "Wine" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 4 -irrigation_result = "yes" -irrigation_food_incr = 1 -irrigation_time = 10 -mining_result = "yes" -mining_shield_incr = 3 -mining_time = 10 -transform_result = "Plains" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "no" -warmer_drier_result = "no" -cooler_wetter_result = "no" -cooler_drier_result = "no" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "Starter", "CanHaveRiver" -property_green = 50 -property_mountainous = 35 -property_cold = 35 -property_frozen = 20 -property_dry = 15 -color.r = 24 -color.g = 97 -color.b = 5 -helptext = _("\ -In addition to being amenable to agriculture, Hills are frequently\ - rich in resources.\ -") - -[terrain_jungle] -name = _("Jungle") -graphic = "jungle" -graphic_alt = "-" -identifier = "j" -class = "Land" -movement_cost = 2 -defense_bonus = 50 -food = 1 -shield = 1 -trade = 0 -resources = "Gems", "Fruit", "Rubber" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 4 -irrigation_result = "Grassland" -irrigation_food_incr = 0 -irrigation_time = 8 -mining_result = "Forest" -mining_shield_incr = 0 -mining_time = 10 -transform_result = "Plains" -transform_time = 12 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Lake" -warmer_drier_result = "Desert" -cooler_wetter_result = "Swamp" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "CanHaveRiver", "Low Land" -property_foliage = 45 -property_tropical = 50 -property_wet = 45 -color.r = 55 -color.g = 156 -color.b = 38 -helptext = _("\ -Jungles are densely overgrown, making agriculture somewhat\ - problematic.\ -") - -[terrain_mountains] -name = _("Mountains") -graphic = "mountains" -graphic_alt = "-" -identifier = "m" -class = "Land" -movement_cost = 3 -defense_bonus = 200 -food = 0 -shield = 1 -trade = 0 -resources = "Gold", "Iron" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 6 -irrigation_result = "no" -irrigation_food_incr = 0 -irrigation_time = 0 -mining_result = "yes" -mining_shield_incr = 1 -mining_time = 10 -transform_result = "Hills" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "no" -warmer_drier_result = "no" -cooler_wetter_result = "no" -cooler_drier_result = "no" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "CanHaveRiver" -property_mountainous = 65 -property_cold = 50 -color.r = 129 -color.g = 127 -color.b = 118 -helptext = _("\ -Mountains are regions of extreme altitude, making agriculture and\ - trade very difficult.\ -") - -[terrain_plains] -name = _("Plains") -graphic = "plains" -graphic_alt = "-" -identifier = "p" -class = "Land" -movement_cost = 1 -defense_bonus = 0 -food = 1 -shield = 1 -trade = 0 -resources = "Buffalo", "Wheat" -road_trade_incr_pct = 100 -base_time = 1 -road_time = 2 -irrigation_result = "yes" -irrigation_food_incr = 1 -irrigation_time = 5 -mining_result = "Forest" -mining_shield_incr = 0 -mining_time = 15 -transform_result = "Grassland" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Lake" -warmer_drier_result = "Desert" -cooler_wetter_result = "Glacier" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "Starter", "CanHaveRiver", "Low Land" -property_green = 50 -property_frozen = 5 -property_dry = 16 -property_cold = 28 -property_tropical = 10 -property_temperate = 50 -property_mountainous = 15 -color.r = 122 -color.g = 156 -color.b = 46 -helptext = _("\ -Plains are very broad, sparse regions, which makes trade slightly\ - inconvenient.\ -") - -[terrain_swamp] -name = _("Swamp") -graphic = "swamp" -graphic_alt = "-" -identifier = "s" -class = "Land" -movement_cost = 2 -defense_bonus = 33 -food = 1 -shield = 0 -trade = 0 -resources = "Peat", "Spice" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 4 -irrigation_result = "Grassland" -irrigation_food_incr = 0 -irrigation_time = 15 -mining_result = "Forest" -mining_shield_incr = 0 -mining_time = 15 -transform_result = "Lake" -transform_time = 12 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Lake" -warmer_drier_result = "Desert" -cooler_wetter_result = "Glacier" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "CanHaveRiver", "Low Land" -property_wet = 100 -property_frozen = 3 -property_tropical = 10 -property_temperate = 10 -property_cold = 17 -color.r = 48 -color.g = 85 -color.b = 97 -helptext = _("\ -Swamps suffer from an over-abundance of water, making agriculture\ - somewhat problematic.\ -") - -[terrain_tundra] -name = _("Tundra") -graphic = "tundra" -graphic_alt = "-" -identifier = "t" -class = "Land" -movement_cost = 1 -defense_bonus = 0 -food = 1 -shield = 0 -trade = 0 -resources = "Game", "Furs", "Gold" -road_trade_incr_pct = 100 -base_time = 1 -road_time = 2 -irrigation_result = "yes" -irrigation_food_incr = 1 -irrigation_time = 5 -mining_result = "Desert" -mining_shield_incr = 0 -mining_time = 15 -transform_result = "Plains" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Lake" -warmer_drier_result = "Desert" -cooler_wetter_result = "Glacier" -cooler_drier_result = "no" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "Starter", "NoBarbs", "CanHaveRiver", "Low Land" -property_cold = 38 -property_frozen = 45 -color.r = 188 -color.g = 188 -color.b = 188 -helptext = _("\ -Tundra are broad, cold regions, fit for some agriculture and little\ - else.\ -") - -; /* <-- avoid gettext warnings -; -; Resource types: -; -; The actual tag used (the * in [resource_*]) must be unique for each resource, -; and may be used in debug output when reading this file. -; -; Notes: -; -; extra = name of the extra this resource section is part of -; (must have "Resource" in its causes) -; identifier = single-character identifier used in old savegames. This -; must be unique for each resource, and changing it will -; break loading those old savegames. -; food = increased food production -; shield = increased shield production -; trade = increased trade production -; -; */ <-- avoid gettext warnings - -[resource_gold] -extra = "Gold" -identifier = "$" -trade = 8 -# mountains, tundra - -[resource_iron] -extra = "Iron" -identifier = "/" -shield = 3 -# mountains. - -[resource_game] -extra = "Game" -identifier = "e" -food = 2 -shield = 2 -# tundra. - -[resource_furs] -extra = "Furs" -identifier = "u" -food = 1 -shield = 1 -trade = 3 -# tundra - -[resource_coal] -extra = "Coal" -identifier = "c" -shield = 2 -# hills. - -[resource_fish] -extra = "Fish" -identifier = "y" -food = 2 -# ocean. - -[resource_fruit] -extra = "Fruit" -identifier = "f" -food = 4 -trade = 2 -# jungle. - -[resource_gems] -extra = "Gems" -identifier = "g" -trade = 5 -# jungle. - -[resource_rubber] -extra = "Rubber" -identifier = "^" -shield = 2 -trade = 2 -# jungle. - -; "h" reserved for strategic horses - -[resource_buffalo] -extra = "Buffalo" -identifier = "b" -shield = 2 -# plains (horses => buffalo => cattle). - -[resource_wheat] -extra = "Wheat" -identifier = "j" -food = 2 -# plains. - -; "k" reserved for (cane) sugar - -; "l" reserved for tobacco - -; "m" reserved for marble - -[resource_oasis] -extra = "Oasis" -identifier = "o" -food = 3 -# desert. - -[resource_peat] -extra = "Peat" -identifier = "a" -shield = 4 -# swamp (petroleum => peat => petroleum). - -[resource_pheasant] -extra = "Pheasant" -identifier = "p" -food = 2 -# forest, forested. - -; "r" reserved for rubber - -[resource_bonus] -extra = "Resources" -identifier = "r" -shield = 1 -# grassland. - -[resource_icy_ivory] -extra = "Ivory" -identifier = "i" -food = 1 -shield = 1 -trade = 4 -# glacier - -[resource_silk] -extra = "Silk" -identifier = "s" -trade = 3 -# forest - -[resource_spice] -extra = "Spice" -identifier = "t" -food = 2 -trade = 4 -# swamp-only. - -; "u" reserved for uranium - -[resource_whales] -extra = "Whales" -identifier = "v" -food = 1 -shield = 1 -# ocean (sea). - -[resource_wine] -extra = "Wine" -identifier = "w" -trade = 4 -# hills-only. - -[resource_oil] -extra = "Oil" -identifier = "x" -shield = 3 ; glacier used to have 4 -# glacier, desert - - -[extraui] -; Player visible names of the base gui types. -ui_name_base_fortress = _("?gui_type:Build Fort/Buoy") -ui_name_base_airbase = _("?gui_type:Build Airbase") - -; /* <-- avoid gettext warnings -; -; Each extra, including bases, roads, and resource, must have a section here. -; Bases, roads, and resources have additional sections for their specific features. -; -; -; Extra types: -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets -; etc; if not present, "name" is used for this -; purpose too. Since the name used in savegames must -; not change, if you want to rename an item after a -; ruleset has been released, you should set -; "rule_name" to the original value of "name". -; category = How UI should categorize this extra. One of -; "Infra", "Natural", "Nuisance", "Resource", -; or "Bonus" -; causes = events that can create extra type. -; "Irrigation", "Mine", "Hut", "Pollution", "Fallout", -; "Appear", "Resource", "Base", or "Road" -; (the last three require a corresponding -; [resource_*] / [base_*] / [road_*] section) -; rmcauses = events that can remove extra type. -; "CleanPollution", "CleanFallout", "Pillage", or -; "Disappear" -; graphic = tag specifying preferred graphic -; graphic_alt = tag for alternate graphic if preferred graphic is -; not present. Can use eg "-" for no alternate -; graphic -; activity_gfx = tag specifying graphic for unit building extra -; This can be "None" to indicate that graphic sprite -; is not needed. -; act_gfx_alt = tag for alternative graphic for unit building extra -; act_gfx_alt2 = tag for second alternative graphic for unit building extra -; rmact_gfx = tag specifying graphic for unit removing extra -; This can be "None" to indicate that graphic sprite -; is not needed. -; rmact_gfx_alt = tag for alternative graphic for unit removing extra -; reqs = requirements to build the extra (see effects.ruleset -; and README.effects for help on requirements) -; rmreqs = requirements to remove the extra -; appearance_reqs = spontaneous appearance requirements -; disappearance_reqs = spontaneous disappearance requirements -; visibility_req = Tech a player needs to have to see the extra -; This affects visibility only, for all the rules -; extra is still there even if player can't see it. -; buildable = Can extra be built? Defaults to TRUE if extra has -; any causes indicating it can result from worker -; activity. -; generated = Can map generator place the extra? Applicable -; for Hut, Resource, and River extras. -; build_time = how long it takes a unit to build this extra. -; Value of 0 (default) means that terrain- and -; build activity specific time is used instead. -; build_time_factor = This setting take effect only if build_time is 0. -; Terrain and activity specific build time will be -; multiplied by this value (default 1) -; removal_time = how long it takes a unit to remove this extra. -; Value of 0 (default) means that terrain- and -; removal activity specific time is used instead. -; removal_time_factor = This setting take effect only if removal_time is 0. -; Terrain and activity specific removal time will be -; multiplied by this value (default 1) -; defense_bonus = Percent added to defense when tile has the extra -; (default none) -; unit_seen = How opponents see units inside this extra -; "Normal" - Units are seen normally (default) -; "Hidden" - Units are hidden from opponents -; appearance_chance = If extra has cause "Appear" and other requirements -; for its appearance are fulfilled, this tells how big -; chance it has to appear each turn. The chance is 1/10000 -; times this value. -; disappearance_chance = If extra has rmcause "Disappear" and other requirements -; for its disappearance are fulfilled, this tells how big -; chance it has to disappear each turn. The chance is 1/10000 -; times this value. -; native_to = List of unit classes that are considered to -; be inside the extra when they are on same tile -; conflicts = List of extras that cannot be on the same tile. -; Bases with non-zero border_sq automatically conflict -; with each other. -; hidden_by = List of extra types that will make this extra -; type not to show on UI if both present. -; bridged_over = List of extra types that, if present in tile, will prevent -; building this extra if can't be bridged over -; flags -; - "NativeTile" = Native units consider tile native regardless of -; terrain -; - "Refuel" = Native units can use tile as refuel point -; - "TerrChangeRemoves" = Extra gets removed when ever terrain changes even -; if target terrain could support it -; - "AlwaysOnCityCenter" = City center tiles always have this extra type -; regardless of its other requirements -; - "AutoOnCityCenter" = City center tiles will automatically have this -; extra type if the player can build it -; - "ConnectLand" = Road style gfx on Oceanic tiles are drawn to -; connect to adjacent Land tiles even if they have -; no extra. This affects appearance only -; - "GlobalWarming" = Instances of this extra on map count towards -; Global Warming -; - "NuclearWinter" = Instances of this extra on map count towards -; Nuclear Winter -; - "ShowFlag" = Draw owner's flag -; - "NaturalDefense" = Extra's defense bonus will be counted to "Natural" -; defense layer. The defense bonus of all the extras -; located at the tile, native to defending unit, -; is calculated as a 1 + sum of bonuses from the extras -; on the default "Fortification" defense layer multiplied -; by the 1 + sum of bonuses from the extras on the -; "Natural" layer. -; - "NoStackDeath" = Units inside do not die all at once when attacked -; helptext = optional help text string; should escape all raw -; newlines so that xgettext parsing works -; -; */ <-- avoid gettext warnings - -[extra_irrigation] -name = _("Irrigation") -category = "Infra" -causes = "Irrigation" -rmcauses = "Pillage" -graphic = "tx.irrigation" -graphic_alt = "-" -activity_gfx = "unit.irrigation" -act_gfx_alt = "unit.irrigate" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -build_time = 0 -removal_time = 0 -conflicts = "Mine", "Oil Well" -hidden_by = "Farmland" -helptext = _("\ -Irrigating a suitable tile causes it to produce extra food each turn. Most\ - tiles yield +1 extra food. A desert river that does not already benefit\ - from an oasis will yield +2, or +3 if it is a city on a desert river.\ -"), _("\ -Irrigating a tile with a mine or oil well will destroy it.\ -"), _("\ -City center tiles get their terrain's irrigation bonus automatically, \ -if there is no conflicting mine or oil well on the tile; however, \ -this does not make cities count as a water source for further \ -irrigation. Irrigation can be built on the city tile simply to allow \ -irrigating elsewhere, but will not give the tile any further bonus \ -except in the case of a desert river (see above.)\ -") - -[extra_mine] -name = _("Mine") -category = "Infra" -causes = "Mine" -rmcauses = "Pillage" -graphic = "tx.mine" -graphic_alt = "-" -activity_gfx = "unit.mine" -act_gfx_alt = "unit.plant" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "TerrainFlag", "Oil", "Local", FALSE, TRUE - } -build_time = 0 -removal_time = 0 -conflicts = "Irrigation", "Farmland" -helptext = _("\ -Mines can be built on some types of terrain, which increases the \ -number of production points produced by that tile. Hills get an extra \ -3 production points per tile; other terrains get 1 extra production \ -point.\ -"), _("\ -Building a mine on an irrigated tile will destroy the irrigation.\ -") - -[extra_oil_well] -name = _("Oil Well") -category = "Infra" -causes = "Mine" -rmcauses = "Pillage" -graphic = "tx.oil_mine" -graphic_alt = "tx.mine" -activity_gfx = "unit.oil_mine" -act_gfx_alt = "unit.mine" -act_gfx_alt2 = "unit.plant" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "quiet" - "TerrainFlag", "Oil", "Local", TRUE - } -build_time = 0 -removal_time = 0 -conflicts = "Irrigation", "Farmland" -helptext = _("\ -Oil wells behave like mines (giving an extra production point), but \ -require more technology. Oil wells can be built on Desert with knowledge \ -of Construction, and on Glacier with knowledge of Refining.\ -"), _("\ -Building an oil well on an irrigated tile will destroy the irrigation.\ -") - -[extra_pollution] -name = _("Pollution") -category = "Nuisance" -causes = "Pollution" -rmcauses = "CleanPollution" -graphic = "tx.pollution" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "unit.pollution" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "TerrainFlag", "NoPollution", "Local", FALSE, TRUE - } -removal_time = 0 -flags = "GlobalWarming" -helptext = _("\ -Pollution appears on land tiles around cities with high production or \ -population. \ -It halves all output from its tile, and contributes to the risk of \ -global warming.\ -"), _("\ -The pollution can only be cleared by dispatching Workers, \ -Settlers, or Engineers with the \"clean pollution\" order.\ -"), _("\ -Pollution from production is likely to start becoming important as \ -your civilization becomes more industrialized, giving you buildings \ -such as Factory and Power Plant which boost production. Replacing a \ -Power Plant with cleaner forms of energy -- a Hydro Plant / Hoover \ -Dam, Nuclear Plant, or Solar Plant -- will reduce pollution from \ -production, as will a Recycling Center or knowledge of \ -Environmentalism.\ -"), _("\ -The city's population starts adding to pollution with the discovery of \ -Industrialization, and Automobile, Mass Production, and Plastics make \ -this worse. Building a Mass Transit in a city eliminates the \ -population's contribution to pollution.\ -"), _("\ -The contribution of these factors can be seen in the city dialog; once \ -it exceeds a threshold, the excess is the percent chance of pollution \ -appearing each turn.\ -"), _("\ -When an unused tile becomes polluted, there is the temptation to avoid \ -the effort of cleaning it; but the spread of pollution has far more \ -terrible results than the immediate economic impact -- every polluted \ -tile increases the chance of global warming. Each time global warming \ -advances, the entire world loses coastal land to the sea and to jungles \ -and swamps, and inland tiles are lost to desert. This tends to \ -devastate cities and leads to global impoverishment.\ -"), _("\ -The risk of global warming is cumulative; the longer polluted tiles \ -are left uncleaned, the higher the risk becomes, and the risk can \ -linger for some time even after all pollution has been cleaned. If a \ -long time passes with an elevated risk of warming, its effects will be \ -all the more severe when it does occur.\ -") - -[extra_hut] -name = _("Minor Tribe Village") -rule_name = "Hut" -category = "Bonus" -causes = "Hut" -;rmcauses = "" -graphic = "tx.village" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range" - "TerrainClass", "Land", "Local" - } -helptext = _("\ -Villages (also called \"huts\") are primitive communities spread \ -across the world at the beginning of the game. Any land unit can enter \ -a village, making the village disappear and deliver a random response. \ -If the village proves hostile, it could produce barbarians or the unit \ -entering may simply be destroyed. If they are friendly, the player \ -could receive gold, a new technology, a military unit (occasionally a \ -settler; and sometimes a unit that the player cannot yet create), or \ -even a new city.\ -"), _("\ -Later in the game, helicopters may also enter villages, but overflight \ -by other aircraft will cause the villagers to take fright and disband.\ -") - -[extra_farmland] -name = _("Farmland") -category = "Infra" -causes = "Irrigation" -rmcauses = "Pillage" -graphic = "tx.farmland" -graphic_alt = "-" -activity_gfx = "unit.farmland" -act_gfx_alt = "unit.irrigation" -act_gfx_alt2 = "unit.irrigate" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range" - "Tech", "Refrigeration", "Player" - "Extra", "Irrigation", "Local" - } -build_time = 0 -removal_time = 0 -conflicts = "Mine", "Oil Well" -helptext = _("\ -Once Refrigeration is known, irrigation systems can be upgraded to \ -farmland by irrigating them a second time; if the city working the tile \ -has a Supermarket, a farmland tile provides twice as much food.\ -"), _("\ -Like irrigation, farmland is incompatible with mines and oil wells.\ -") - -[extra_fallout] -name = _("Fallout") -category = "Nuisance" -causes = "Fallout" -rmcauses = "CleanFallout" -graphic = "tx.fallout" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "unit.fallout" -rmact_gfx_alt = "unit.pollution" -reqs = - { "type", "name", "range", "present", "quiet" - "TerrainFlag", "NoPollution", "Local", FALSE, TRUE - } -removal_time = 0 -flags = "NuclearWinter" -helptext = _("\ -Nuclear fallout can appear on land tiles when a Nuclear unit is \ -detonated. It halves all output from its tile.\ -"), _("\ -Every tile with nuclear fallout also increases the risk of global \ -nuclear winter. If nuclear winter occurs, land across the globe \ -changes into desert, tundra, and ice, and lakes and oceans freeze.\ -"), _("\ -Settlers, Workers, and Engineers can clean up nuclear fallout.\ -") - -; ***************************** BASES **************************************** - -[extra_fort] -name = _("Fort") -category = "Infra" -causes = "Base" -rmcauses = "Pillage" -graphic = "base.outpost" -graphic_alt = "base.fortress" -activity_gfx = "unit.outpost" -act_gfx_alt = "unit.fortress" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Masonry", "Player", TRUE, FALSE - "TerrainClass", "Land", "Local", TRUE, FALSE - "UnitFlag", "CanFortress", "Local", TRUE, FALSE - "CityTile", "Center", "Local", FALSE, TRUE - } -build_time = 3 -removal_time = 0 -native_to = "Land", "LandAirSea", "LandNoKill", "Helicopter", "Balloon", "AirProtect" -hidden_by = "Fortress", "Naval Base" -flags = "NativeTile", "NoStackDeath" ;, "Refuel" -;NOTE: effect_fortress_regen should give 25% of 20HP to helicopter, +1hp for being stationary -;thus a fortress should give +6hp -2hp for not being in refuel spot or +4hp/turn. Healing 67% -;as fast as an airbase. MEANWHILE, removing the refuel flag allows us to make Forts native -;to AirProtect so that they can't prevent attacks on forts. This is debatable issue of -;Fort with no Killstack but not Airprotected vs no fort, Killstack and Airprotect, but -;many times fighters over forts have come up as a dynamic. -helptext = _("\ -Forts are rapidly built fortifications which give Land units +33% defense\ - against Land and Sea units. Defending units are lost one at a time instead\ - of the entire stack dying. A fort is necessary to start building a fortress.\ -"), _(" -TIP: Forts make great outposts for keeping watch on your borders. Be careful--\ -an unmanned Fort can be claimed by a foreign unit. -") - -[extra_fortress] -name = _("Fortress") -category = "Infra" -causes = "Base" -rmcauses = "Pillage" -graphic = "base.fortress" -graphic_alt = "-" -activity_gfx = "unit.fortress" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "Extra", "Fort", "Local", TRUE, FALSE - "Tech", "Construction", "Player", TRUE, FALSE - "TerrainClass", "Land", "Local", TRUE, FALSE - "UnitFlag", "CanFortress", "Local", TRUE, FALSE - "CityTile", "Center", "Local", FALSE, TRUE - } -build_time = 5 -removal_time = 0 -defense_bonus = 67 -native_to = "Land", "LandAirSea", "LandNoKill", "Helicopter", "Balloon" -hidden_by = "Fortress", "Naval Base" -flags = "NativeTile", "Refuel", "NoStackDeath" -helptext = _("\ -Fortresses are improvements built on top of Forts which greatly improve defense.\ - A Land unit remaining in a fortress for a whole turn without moving recovers a\ - quarter of its hit points. With Invention, fortresses gain watchtowers from which\ - land units can see farther.\ -"), _("\ -Units in a Fortress die one at a time instead of the entire stack being lost.\ -Diplomatic units get a 25% defense bonus in diplomatic fights.\ -") - -[extra_airbase] -name = _("Airbase") -category = "Infra" -causes = "Base" -rmcauses = "Pillage" -graphic = "base.airbase" -graphic_alt = "-" -activity_gfx = "unit.airbase" -act_gfx_alt = "unit.fortress" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Radio", "Player", TRUE, FALSE - "TerrainClass", "Land", "Local", TRUE, FALSE - "UnitFlag", "Airbase", "Local", TRUE, FALSE - "CityTile", "Center", "Local", FALSE, TRUE - } -build_time = 3 -removal_time = 0 -native_to = "Air", "Balloon", "Helicopter", "Missile", "AirProtect", "AirPillage" -flags = "Refuel", "NoStackDeath" -helptext = _("\ -Airbases allow your air units to land and refuel outside cities. \ -Air units in an airbase may be attacked by land units.\ -"), _("\ -Units can paradrop from this tile.\ -") - -[extra_buoy] -name = _("Buoy") -category = "Infra" -causes = "Base" -rmcauses = "Pillage" -graphic = "base.buoy" -graphic_alt = "base.fortress" -activity_gfx = "unit.buoy" -act_gfx_alt = "unit.fortress" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Radio", "Player", TRUE, FALSE - "TerrainClass", "Oceanic", "Local", TRUE, FALSE - "UnitFlag", "Airbase", "Local", TRUE, FALSE - "CityTile", "Center", "Local", FALSE, TRUE - } -build_time = 3 -removal_time = 0 -flags = "ShowFlag" -helptext = _("\ -Buoys may be built in the ocean (by units on a sea-going vessel) to \ -allow their owner to see the surrounding tiles.\ -") - -[extra_navalbase] -name = _("Naval Base") -category = "Infra" -causes = "Base" -rmcauses = "Pillage" -graphic = "base.navalbase" -graphic_alt = "base.fortress" -activity_gfx = "unit.navalbase" -act_gfx_alt = "unit.fortress" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "Extra", "Fortress", "Local", TRUE, FALSE - "TerrainFlag", "Low Land", "Local", TRUE, FALSE - "TerrainClass", "Oceanic", "CAdjacent", TRUE, FALSE - "Tech", "Engineering", "Player", TRUE, FALSE - "UnitFlag", "CanFortress", "Local", TRUE, FALSE - "CityTile", "Center", "Local", FALSE, TRUE - } -build_time = 3 -removal_time = 0 -conflicts = "Airbase", "Irrigation", "Mine", "Oil Well", "Farmland" -defense_bonus = 33 -native_to = "Trireme", "RiverShip", "Sea", "Submarine", "Balloon" -flags = "NativeTile", "NoStackDeath", "Refuel" -helptext = _("\ -Naval bases are coastal Fortresses with ocean access. They allow ships to enter and\ - receive a 1.33x bonus from superior fortifications and defensive position. Naval\ - Bases are built into Fortresses--all other units get the benefits of a Fortress.\ -"), _(" -NOTE: Naval bases are the only location where ships can be sure to avoid stack death without\ - suffering a defense disadvantage. Besides the Fortress its built on top of, only road- and\ - canal- type tile improvements can co-exist on the same tile.\ -") - -[extra_ruins] -name = _("Ruins") -category = "Bonus" -;causes = "" -rmcauses = "Pillage" -graphic = "extra.ruins" -graphic_alt = "base.ruins" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "TerrainClass", "Land", "Local", TRUE, FALSE - "CityTile", "Center", "Local", FALSE, TRUE - } -buildable = FALSE -removal_time = 0 -flags = "TerrChangeRemoves" -helptext = _("\ -Ruins mark the former site of a city that was destroyed or abandoned. \ -They have no effect on gameplay.\ -") - -[extra_road] -name = _("Road") -category = "Infra" -causes = "Road" -rmcauses = "Pillage" -graphic = "road.road" -graphic_alt = "-" -activity_gfx = "unit.road" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range" - "UnitFlag", "CanRoad", "Local" - "TerrainClass", "Land", "Local" - } -build_time = 0 -removal_time = 0 -native_to = "Land", "LandNoKill", "LandAirSea" -hidden_by = "Railroad", "Maglev", "Naval Base" -flags = "AutoOnCityCenter" -bridged_over = "River" -helptext = _("\ -Roads allow your land units to move more quickly, and on some terrain,\ - also provide a trade bonus.\ -"), _("\ -Building roads on river tiles requires knowledge of Bridge Building.\ - City center tiles automatically get roads (unless they are on a river\ - tile and you do not yet know Bridge Building).\ -") - -[extra_railroad] -name = _("Railroad") -category = "Infra" -causes = "Road" -rmcauses = "Pillage" -graphic = "road.rail" -graphic_alt = "-" -activity_gfx = "unit.rail" -act_gfx_alt = "unit.road" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range" - "Tech", "Railroad", "Player" - "Extra", "Road", "Local" - "UnitFlag", "CanRoad", "Local" - "TerrainClass", "Land", "Local" - } -build_time = 3 -removal_time = 0 -native_to = "Land", "LandNoKill", "LandAirSea" -hidden_by = "Maglev", "Naval Base" -flags = "AutoOnCityCenter" -bridged_over = "River" -helptext = _("\ -Once you learn Railroad technology, you may upgrade your roads to\ - railroads. Units travel three times faster along railroads than\ - along roads.\ -"), _("\ -A railroad also increases any shield resources produced by a tile.\ - A tile whose road is upgraded to a railroad retains any trade bonus\ - from the road as well.\ -"), _("\ -City center tiles with roads are automatically upgraded to railroads\ - when you learn the Railroad technology.\ -") - -[extra_maglev] -name = _("Maglev") -category = "Infra" -causes = "Road" -rmcauses = "Pillage" -graphic = "road.maglev" -graphic_alt = "road.rail" -activity_gfx = "unit.maglev" -act_gfx_alt = "unit.road" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Superconductors", "Player", TRUE, FALSE -; "Extra", "Railroad", "Local", TRUE, FALSE - "UnitFlag", "CanRoad", "Local", TRUE, FALSE -; "UnitClass", "Sea", "Local", FALSE, TRUE -; "TerrainClass", "Land", "Local", TRUE, FALSE - } -build_time = 3 -removal_time = 0 -native_to = "Land", "LandNoKill", "LandAirSea" -hidden_by = "Naval Base" -flags = "NativeTile", "AutoOnCityCenter" -helptext = _("\ -With Superconductors, you may build MAGnetic LEVitation tracks\ - on your railroad routes. Land units expend no movement points\ - when riding a MagLev; you may ride indefinitely.\ -"), _("\ -City center tiles with railroads are automatically upgraded to MagLev\ - when you learn about Superconductors.\ -") - -[extra_river] -name = _("River") -category = "Infra" ;TEST for well-digger -causes = "Road" -;rmcauses = "" -graphic = "road.river" -graphic_alt = "-" -activity_gfx = "unit.canal" -act_gfx_alt = "unit.oil_mine" -act_gfx_alt2 = "unit.road" -rmact_gfx = "None" -rmact_gfx_alt = "-" -buildable = TRUE -generated = TRUE -defense_bonus = 33 -reqs = - { "type", "name", "range", "present" - "TerrainClass", "Land", "Local", TRUE - "Tech", "Pottery", "Player", FALSE - "Tech", "Alphabet","Player", FALSE - "Tech", "Writing", "World", FALSE - "UnitFlag", "Well-Digger", "Local", TRUE - "Age", "10", "Local", FALSE - } -build_time = 2 -removal_time = 0 -flags = "NativeTile" -native_to = "Land", "LandNoKill", "LandAirSea", "Trireme", "RiverShip" -helptext = _("\ -Any land terrain type may have a River on it. A River adds 1\ - trade to the resources produced by that tile. It also increases a tile's\ - defense factor by 50%. Finally, land units may move along a River (but\ - not diagonally) for fast travel.\ -"), _("\ -Roads, railroads and MagLev can only be built on River tiles if your\ - civilization has learned Bridge Building technology.\ -") - -[extra_canal] -name = _("Canal") -category = "Infra" -causes = "Road" -rmcauses = "Pillage" -graphic = "road.canal" -graphic_alt = "road.river" -activity_gfx = "unit.canal" -act_gfx_alt = "unit.convert" -act_gfx_alt2 = "unit.airstrip" -rmact_gfx = "None" -rmact_gfx_alt = "-" -generated = FALSE -reqs = - { "type", "name", "range", "present" - "TerrainFlag", "Low Land", "Local", TRUE - "TerrainClass", "Oceanic", "Adjacent", TRUE - "Tech", "Engineering", "Player", TRUE - "UnitFlag", "Settlers", "Local", TRUE - } -build_time = 10 -removal_time = 0 -native_to = "Trireme", "Sea", "RiverShip", "Land", "LandAirSea", "LandNoKill", "Helicopter", "Submarine" -flags = "NativeTile" -helptext = _("\ -Canals allow ships to travel through land tiles. Canals can be built on \ -low land tiles only, and not far inland.\ -") - -[extra_gold] -name = _("Gold") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.gold" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_iron] -name = _("Iron") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.iron" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_game] -name = _("?animals:Game") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.tundra_game" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_furs] -name = _("Furs") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.furs" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_coal] -name = _("Coal") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.coal" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_fish] -name = _("Fish") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.fish" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_fruit] -name = _("Fruit") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.fruit" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_gems] -name = _("Gems") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.gems" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_rubber] -name = _("Rubber") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.rubber" -graphic_alt = "ts.peat" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_buffalo] -name = _("Buffalo") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.buffalo" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_wheat] -name = _("Wheat") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.wheat" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_oasis] -name = _("Oasis") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.oasis" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_peat] -name = _("Peat") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.peat" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_pheasant] -name = _("Pheasant") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.pheasant" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_bonus] -name = _("Resources") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.grassland_resources" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_ivory] -name = _("Ivory") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.arctic_ivory" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_silk] -name = _("Silk") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.silk" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_spice] -name = _("Spice") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.spice" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_whales] -name = _("Whales") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.whales" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_wine] -name = _("Wine") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.wine" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_oil] -name = _("Oil") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.oil" -graphic_alt = "-" -act_gfx_alt2 = "-" -activity_gfx = "None" -act_gfx_alt = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -; /* <-- avoid gettext warnings -; -; Base types: -; -; extra = name of the extra this base section is part of -; (must have "Base" in its causes) -; gui_type = How gui should handle this base. -; Value can be "Fortress", "Airbase", or "Other" -; border_sq = Base will claim land ownership up to this radius, -; -1 to disable. If enabled, base cannot exist in city tile. -; vision_main_sq = Base will have main layer vision to this radius -; vision_invis_sq = Base will have invisible layer vision to this radius -; vision_subs_sq = Base will have subsurface layer vision to this radius -; flags -; - "NoAggressive" = Units inside are not considered aggressive if there`s -; friendly city within 3 tiles -; -; */ <-- avoid gettext warnings - -[base_fort] -extra = "Fort" -gui_type = "Fortress" -border_sq = -1 -vision_main_sq = 4 - -[base_fortress] -extra = "Fortress" -gui_type = "Fortress" -border_sq = 4 -vision_main_sq = 4 -flags = "NoAggressive" - -[base_airbase] -extra = "Airbase" -gui_type = "Airbase" - -[base_buoy] -extra = "Buoy" -gui_type = "Fortress" -vision_main_sq = 5 - -[base_navalbase] -extra = "Naval Base" -gui_type = "Airbase" -border_sq = 3 ;this may be causing the nationality flip behaviour for allies co-occupying -vision_main_sq = 6 -vision_subs_sq = 4 -flags = "NoAggressive" - - -; /* <-- avoid gettext warnings -; -; Road types: -; -; extra = name of the extra this road section is part of -; (must have "Road" in its causes) -; first_reqs = additional requirements to build the first part of -; the road, when none of the adjacent tiles have any -; integrating roads (see effects.ruleset and -; README.effects for help on requirements) -; move_cost = how much movement it takes to travel -; via this road (in fractional move points, as -; defined by move_fragments) -; -1 means that road provides no speed bonus. -; move_mode = how movement costs are applied -; - "Cardinal" = Road cost applies only on cardinal moves -; - "Relaxed" = Road cost is normal for cardinal, double for diagonal moves -; - "FastAlways" = Road cost applies always between two tiles with the roads -; (default) -; food_incr_const = food production added to tile regardless of terrain -; shield_incr_const = shield production added to tile regardless of -; terrain -; trade_incr_const = trade production added to tile regardless of -; terrain -; food_incr = food production added to tile; multiplied by -; terrain-specific road_food_incr_pct -; shield_incr = shield production added to tile; multiplied by -; terrain-specific road_shield_incr_pct -; trade_incr = trade production added to tile; multiplied by -; terrain-specific road_trade_incr_pct -; food_bonus = percent added to food production -; shield_bonus = percent added to shield production -; trade_bonus = percent added to trade production -; In summary, output bonuses from roads are given by the formula: -; (base_prod + roads.incr_const + roads.incr*terrain.incr_pct) * roads.bonus -; compat_special = what kind of pre-2.5 special this road corresponds -; to, if any: "Road", "Railroad", "River", or "None". -; Used for UI and loading old savegames -; integrates = list of road types that are suitable next steps -; for travel from this road type -; flags -; - "River" = Automatically generated by map generator, always -; flowing from land tiles to ocean -; - "UnrestrictedInfra" = Use of the enemy owned road is not restricted -; even if server setting 'restrictinfra' is set -; - "JumpFrom" = Move to a tile nativity providing "JumpTo" -; road is considered native -; - "JumpTo" = Move from a tile nativity providing "JumpFrom" -; road is considered native -; -; */ <-- avoid gettext warnings - -[road_road] -extra = "Road" -move_cost = 3 -food_incr = 0 -shield_incr = 0 -trade_incr = 1 -food_bonus = 0 -shield_bonus = 0 -trade_bonus = 0 -compat_special = "Road" -flags = "UnrestrictedInfra" - -[road_railroad] -extra = "Railroad" -move_cost = 1 -food_incr = 0 -shield_incr = 0 -trade_incr = 0 -food_bonus = 0 -shield_bonus = 50 -trade_bonus = 0 -compat_special = "Railroad" - -[road_maglev] -extra = "Maglev" -move_cost = 0 -food_incr = 0 -shield_incr = 0 -trade_incr = 0 -food_bonus = 0 -shield_bonus = 0 -trade_bonus = 0 - -[road_river] -extra = "River" -move_cost = 3 -move_mode = "Cardinal" -trade_incr_const = 1 -compat_special = "River" -flags = "River", "UnrestrictedInfra" - -[road_canal] -extra = "Canal" -move_cost = 9 -move_mode = "Cardinal" -food_incr_const = 0 -shield_incr_const = 0 -trade_incr_const = 0 -food_incr = 0 -shield_incr = 0 -trade_incr = 0 -food_bonus = 0 -shield_bonus = 0 -trade_bonus = 0 -compat_special = "None" diff --git a/freeciv/freeciv/data/.historic/mp2-preArctic/units.ruleset b/freeciv/freeciv/data/.historic/mp2-preArctic/units.ruleset deleted file mode 100644 index 4036f7f2d..000000000 --- a/freeciv/freeciv/data/.historic/mp2-preArctic/units.ruleset +++ /dev/null @@ -1,3658 +0,0 @@ -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes, -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. -; -; You should sort role units from worst to better, as often the best -; available role unit of a given sort will be picked by choosing -; the first available (not obsolete) such unit, or by picking the last -; such unit directly. When determining starting units, the first -; unit with the relevant role that the player can build will be chosen. -; If no such unit can be found (eg Explorers that require Seafaring), -; then the first unit with this role will be chosen. - -[datafile] -description="Unit definitions for the Multiplayer-Evo ruleset." -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -[control] -; Names for custom unit type flags. There can be up to 45 of these. -; name = rule name; In some circumstances user may see this -; as part of some sentences, so try to make it descriptive -; and sensible. -; helptxt = displayed in the help for unit types with this flag (optional) -; ************** ANTYHING WHICH CHANGES THE SEQUENCE OR NUMBER OF THE USER CUSTOM FLAGS BELOW SHOULD BE -; ************** MADE COMPATIBLE BETWEEN MP+ AND MP2 RULESETS AND POSSIBLY CLASSIC AND CIV2CIV3 SO THAT -; ************** THERE IS UNIFORMITY IN FCW CLIENT which checks these flags based on index #. Not keeping -; ************** uniformity results in loss of features as ability to check these flags would be lost. -flags = - { "name", "helptxt" - _("Airbase") - _("Transform"), _("Can do advanced Terrain transformations.") - _("CanRoad"), _("Able to build Roads.") - _("CanFortress"), _("Can build Forts and Fortresses") - _("Bombarder"), _("Can safely conduct Ranged Attacks.") - _("AirAttacker"), _("Anti-Air units have a defense bonus against this unit.") - _("Horse"), _("Attack value halved when attacking Pikemen.\n\ -* Knights defend at 3 when attacked by this unit.") - _("FootSoldier"), _("Knights defend at 2 when attacked by this unit.") - _("Helicopter"), _("Defends very badly against Fighters.") - _("Submarine"), _("Attack value reduced against some ships.") - _("Unbribable"), _("Can't be bribed.") - _("TradeRoute"), _("Can establish a foreign trade route (must travel to target city).") - _("HelpWonder"), _("Can help build a Wonder in any non-hostile city.") - _("Capturer"), _("Can capture some enemy units.") - _("Capturable"), _("Can be captured by some enemy units.") - _("Cities") - _("AddToCity"), _("Can add itself to the population of a city.") - _("Nuclear"), _("Can perform a Nuclear Detonation obliterating all adjacent tiles.") - _("Missile"), _("AEGIS and Armor II have a defense bonus against this unit.") - _("Well-Digger"), _("Can dig a well and irrigate tiles with no water.") - _("Infra"), _("Can build infrastructure.") - _("Proletarian"), _("Controllable only by Communist governments.") - _("Paratroopers"), _("Can be paradropped from a friendly city or suitable base.") - _("Marines"), _("Can launch attack from non-native tiles.") - _("Expellable"), _("Can be peacefully expelled from foreign tiles.") - _("AirProtector"), _("Is Unreachable AND can protect its tile from units unable to attack this unit.") - _("CantReachAir"), _("Unable to attack air units.") - _("FortBuster"), _("Defending Forts get no bonus. +33% attack bonus vs. the 2x defense of a Fortress.") - _("FortressBuster"), _("Defending Fortresses get no bonus.") - _("AntiAir"), _("Anti-Air bonus of this unit is less effective against Stealth, which has a 25% bonus against this unit.") -;;; _("NeverProtects"), _("Does not protect other units on its tile.") ; UNCOMMENT THIS IF NOT USING SCL'S PATCH FOR THIS FLAG -;;; _("NeverBlocked"), _("Bypasses unreachable units when attacking a tile.") ; UNCOMMENT THIS IF NOT USING LEXXIE'S PATCH FOR THIS FLAG - } - -; Names for custom unit class flags. There can be up to 8 of these. -; name = rule name; In some circumstances user may see this -; as part of some sentences, so try to make it descriptive -; and sensible. -; helptxt = displayed in the help for unit types belonging to a class -; with this flag (optional) -class_flags = - { "name", "helptxt" - _("Airliftable"), _("Can be airlifted if it has remaining moves.") - _("BorderPolice"), _("Military units from this class can peacefully expel certain foreign units.") - _("AttFromNonNative"), _("Can launch attack from non-native tiles.") - } - -[veteran_system] -; What are the names of the levels? -veteran_names = _("green"), _("veteran"), _("hardened"), _("elite"), _("crack"), _("master"), _("champion") - -; The percentage chance of increasing level through combat -veteran_raise_chance = 50, 33, 20, 15, 15, 15, 0 - -; The percentage chance of a settler/engineer increasing level through -; performing useful work (per turn) -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 - -; Power factors are as a percentage. -; +50% is represented by 150 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 - -; The additional number of movement points granted for different veteran -; levels. These are fractional move points as defined by move_fragments in -; terrain.ruleset. -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 - -; /* <-- avoid gettext warnings -; -; Unit classes -; The number can be variable, up to 32 -; When adding new classes, remember to check effects.ruleset also. -; Eg. if you divide class 'Land' to two separate classes, you may -; want add effect giving City Walls defence bonus against new class -; too. -; -; The actual tag used (the * in [unitclass_*]) does not matter, except -; it must be unique within this file, and it may be used in debug -; output when reading this file. -; -; ** Fields ** -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; -; if not present, "name" is used for this purpose too. -; Since the name used in savegames must not change, if -; you want to rename an item after a ruleset has been -; released, you should set "rule_name" to the original -; value of "name". -; min_speed = Minimum speed after damage and effects (whole movement points) -; hp_loss_pct = Hitpoints lost each turn if unit not in city or native base -; non_native_def_pct = Defense power percentage applying when defending on -; non-native terrain (such as ship in harbour) -; hut_behavior = What happens to huts when unit enters tile: -; "Normal", "Nothing", or "Frighten" -; flags = List of unit class flags (from the following list; you -; cannot add custom unit class flags) -; helptext = optional help text string; should escape all raw newlines -; so that xgettext parsing works -; -; ** Unit class Flags ** -; -; "TerrainSpeed" = Unit Class uses terrain specific speed -; "TerrainDefense" = Unit Class gains defense bonus from terrain -; "DamageSlows" = Damaged units are slowed down -; "CanOccupyCity" = Military units of this class can occupy enemy cities -; "Missile" = Unit Class is destroyed when it attacks -; "BuildAnywhere" = Unit Class can be built even in the middle of non-native terrain -; "Unreachable" = Unit Class can be attacked only by units explicitly listing this -; class in its 'targets', unless on a city or native base. -; For class members which are transports, cargo cannot load/ -; unload except in a city or native base, unless that unit -; explicitly lists this class in its 'embarks'/'disembarks'. -; "CollectRansom" = Unit Class can collect ransom when killing lone barbarian leader -; "ZOC" = Unit Class is subject to ZOC rules. Unit type flag "IgZOC" can -; override this -; "CanFortify" = Unit can fortify at land tiles. Unit type flag -; "Cant_Fortify" can override this -; "CanPillage" = Unit Class can pillage tile infrastructure -; "DoesntOccupyTile" = Even if this class of enemy unit is on tile, cities can -; still work that tile -; "AttackNonNative" = Unit Class can attack units on non-native tiles. Unit type -; flag "Only_Native_Attack" can override this -; "AttFromNonNative" = Unit Class can launch attack from non-native tile (against -; native one) -; This applies for both attacking from transport or -; cities. If only some unit types of the class should -; get this property, use type flag "Marines" -; "KillCitizen" = Upon successful attack against a city, unit kills one -; citizen. The effect "Unit_No_Lose_Pop" and the server -; setting 'killcitizen' can disable this. - -; "Airliftable" = This Unit Class may be airlifted -; */ <-- avoid gettext warnings - - -; ********************************************************************************** -; ********************************************************************************** -; WARNING: ANY CHANGES TO WHAT TYPES OR CLASSES CAN LOAD ONTO WHICH TRANSPORTS MAY -; REQUIRE CHANGES TO FCW function unit_could_possibly_load() in unit.js -; ********************************************************************************** -; ********************************************************************************** -[unitclass_missile] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Missile") -min_speed = 1 -hp_loss_pct = 0 -hut_behavior = "Frighten" -flags = "Missile", "Unreachable", "DoesntOccupyTile", "Airliftable" - -; missile flag not class, indicates suicide explosion and possibly other things. -[unitclass_bomb] -name = _("?unitclass:Bomb") -min_speed = 1 -hp_loss_pct = 0 -hut_behavior = "Frighten" -flags = "Unreachable", "DoesntOccupyTile", "Airliftable" - -[unitclass_land] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Land") -min_speed = 1 -hp_loss_pct = 0 -flags = "TerrainSpeed", "DamageSlows", "CanOccupyCity", "BuildAnywhere", - "CollectRansom", "ZOC", "CanFortify", "CanPillage", - "TerrainDefense", "KillCitizen", "Airliftable", "BorderPolice" -helptext = _("\ - * Can be airlifted from a suitable city.\ -") - -[unitclass_landnokill] -name = _("?unitclass:LandNoKill") -min_speed = 1 -hp_loss_pct = 0 -flags = "TerrainSpeed", "DamageSlows", "CanOccupyCity", "BuildAnywhere", - "CollectRansom", "ZOC", "CanFortify", "CanPillage", - "TerrainDefense", "Airliftable", "BorderPolice" -helptext = _("\ - * Does not reduce population when attacking city.\ -") - -;Land units that are multipurpose for land/air/sea attacks (i.e., anti-aircraft, marines) -;include "Unreachable" in the targets for individual units -[unitclass_landairsea] -name = _("?unitclass:LandAirSea") -min_speed = 1 -hp_loss_pct = 0 -flags = "TerrainSpeed", "DamageSlows", "CanOccupyCity", "BuildAnywhere", - "CollectRansom", "ZOC", "CanFortify", "CanPillage", - "TerrainDefense", "KillCitizen", "Airliftable", - "AttackNonNative", "AttFromNonNative", "BorderPolice" -helptext = _("\ - * Can attack from Ships and Helicopters.\ -") - -[unitclass_sea] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Sea") -min_speed = 2 -hp_loss_pct = 0 -flags = "DamageSlows", "AttackNonNative", "AttFromNonNative", "CanPillage" - -; Separating the Submarine class finally allows it to be unreachable by Air. The old Submarine was -; far too offensively overpowered while simultaneously almost useless from ultra-vulnerability to Air units. -; Because it is now Unreachable, any unit able to attack it needs this class in its targets. -[unitclass_submarine] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Submarine") -min_speed = 2 -hp_loss_pct = 0 -flags = "DamageSlows", "AttackNonNative", "AttFromNonNative", "CanPillage", "Unreachable" - -[unitclass_trireme] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Trireme") -min_speed = 2 -hp_loss_pct = 0 -flags = "DamageSlows", "AttFromNonNative" - -[unitclass_rivership] -; /* Extra class providing ability to travel rivers */ -name = _("?unitclass:RiverShip") -min_speed = 2 -hp_loss_pct = 0 -flags = "DamageSlows", "AttackNonNative", "AttFromNonNative" - -[unitclass_heli] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Helicopter") -min_speed = 1 -hp_loss_pct = 10 -flags = "Unreachable", "CanOccupyCity", "CollectRansom", "Airliftable" - -; This class is for air units that are unreachable but do not protect a stack. -[unitclass_air] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Air") -min_speed = 1 -hp_loss_pct = 0 -hut_behavior = "Frighten" -flags = "Unreachable", "DoesntOccupyTile", "Airliftable" - -; This class is for air units that can pillage terrain (i.e. Jet Bomber) -[unitclass_airpillage] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:AirPillage") -min_speed = 1 -hp_loss_pct = 0 -hut_behavior = "Frighten" -flags = "Unreachable", "DoesntOccupyTile", "Airliftable", "CanPillage" - -; This class is for air units that can also protect a stack. -; (Fighters) -- technically a separate AirProtect class is not needed, but -; Fighters also have Border Police abilities, and a separate class -; facilitates future adjustments and balancing in an isolated class. -[unitclass_air_protect] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:AirProtect") -min_speed = 1 -hp_loss_pct = 0 -hut_behavior = "Frighten" -flags = "Unreachable", "DoesntOccupyTile", "Airliftable", "BorderPolice" - -[unitclass_balloon] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Balloon") -min_speed = 1 -hp_loss_pct = 0 -hut_behavior = "Frighten" -flags = "Unreachable", "DoesntOccupyTile", "Airliftable" - - -; /* <-- avoid gettext warnings -; -; Below: The individual unit types, one per section. -; -; The number can be variable, up to 200. -; However for the "official" rulesets, units should not be removed -; because that would break backward compatability with savegames. -; -; The order here matters: later units are considered "better" for -; a given flag or role. -; -; The actual tag used (the * in [unit_*]) does not matter, except -; it must be unique within this file, and it may be used in debug -; output when reading this file. -; -; ** Fields ** -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; if -; not present, "name" is used for this purpose too. Since -; the name used in savegames must not change, if you want -; to rename an item after a ruleset has been released, you -; should set "rule_name" to the original value of "name". -; graphic = tag specifying preferred graphic -; graphic_alt = tag for alternate graphic if preferred graphic is not -; present; especially if preferred graphic is non-standard, -; this should be a standard tag. Otherwise can use eg "-" -; for no alternate graphic. -; tech_req = required advance, names from techs.ruleset, or special: -; "None" => available from start -; impr_req = required city improvement, names from buildings.ruleset -; gov_req = required government, names from governments.ruleset -; obsolete_by = can be upgraded to and made obsolete by another unit by name -; build_cost = production shields required to build -; pop_cost = population removed from city when built; for 'Join City' -; units this is also the population added to the destination -; attack = base attack strength (0 = cannot attack) -; defense = base defense strength (0 = cannot defend) -; hitpoints = how much damage unit can withstand -; firepower = number of hitpoints removed per round of combat; at least 1 -; move_rate = base move rate (whole movement points) -; vision_radius_sq = base vision of unit: unit can see tile up to the square -; root of this value away -; convert_to = can be converted to another type of unit by name -; convert_time = number of movement points it takes to convert to -; another unit type -; class = One of the classes listed above -; transport_cap = Number of units (ground, or air/missiles, depending on flags) -; fuel = Number of turns unit can spend outside refuel points. -; If more time passes without unit refueling over turn change, -; they are lost. If this is zero, unit has no need to refuel -; Units with "Coast" flag set consider any tile next to coast -; refuel point -; uk_* = upkeep costs, these are used as base values in the game -; cargo = Unit classes this unit can transport -; city_slots = How many of homecity's unit maintenance slots unit takes -; city_size = Initial size of the cities built by 'Found City' type units -; (but 'Join City' uses pop_cost) -; targets = list of unit classes this unit can attack against even -; if they have Unreachable unit class flag -; embarks = list of unit classes this unit may load into while not in -; native base or city even if transporter has Unreachable unit -; class flag -; disembarks = list of unit classes this unit may unload from while not in -; native base or city even if transporter has Unreachable unit -; class flag -; vision_layer = At which layer this unit is visible; "Main", "Stealth", -; or "Subsurface" -; bonuses = definitions of combat bonuses against specific other units -; bonuses.flag = flag of the unit that bonus applies against -; bonuses.type = type of the bonus. See below -; bonuses.value = value of the bonus. Sum of these is used if multiple apply. -; bonuses.quiet = don't auto generate help text for this bonus. Use this if -; the bonus is documented in the unit type's help text. -; This is useful when the combination of a unit's bonuses -; becomes complex enough to make the auto generated help -; ugly or inaccurate. -; flags = special flag strings; list of built-in flags described below -; and/or user flags defined above -; -; veteran_names = Special veteran level for this unit. See the definitions in -; game.ruleset. All of the veteran_* entries have to have the -; same length! -; veteran_raise_chance = -; veteran_work_raise_chance = -; veteran_power_fact = -; veteran_move_bonus = -; -; roles = special role strings -; sound_move = optional sound effect when the unit moves -; sound_move_alt = optional alternative sound effect if above not -; supported in client -; sound_fight = optional sound effect when the unit fights -; sound_fight_alt = optional alternative sound effect if above not -; supported in client -; helptext = optional help text string; should escape all raw newlines -; so that xgettext parsing works -; -; -; ** Bonuses ** -; -; "DefenseMultiplier" = Multiply defense value (1 + 'value') times. -; Value of 1 means multiplication by 2, value 2 by 3... -; Bonus is defined in defenders entry. -; "DefenseMultiplierPct" = Multiply defense by 1 + (value / 100). -; Value of 100 means multiplication by 2, -; value of 50 means multiplication by 1.5, etc. -; Effectively increases defense by value percent. -; Bonus is defined in defenders entry. -; "DefenseDivider" = Divide defense value with (1 + 'value'). -; Bonus is defined in attackers entry. -; "DefenseDividerPct" = Divide defense value by 1 + (value / 100). -; Value of 100 means division by 2, (2x for attacker) -; value of 50 means division by 1.5, (1.5x for attacker) -; i.e.: Effectively increases *attack* by value percent. -; "FirePower1" = Defender firepower is reduced to value 1 when -; ever this has non-zero value. -; Bonus is defined in attackers entry. -; -; ** Flags ** -; -; "IgZOC" = ignore Zones of Control (ZOC) even if unit class has -; "ZOC" flag -; "HasNoZOC" = unit has no Zone of Control (ZOC), thus any unit can move -; around it freely -; "NonMil" = a non-military unit: no attacks; no martial law; can enter -; peaceful borders; DoesntOccupyTile -; "IgTer" = use constant move cost defined in igter_cost (terrain.ruleset) -; rather than terrain/road etc cost, unless terrain cost is -; less -; "OneAttack" = can only make a single attack, regardless of movement points -; "FieldUnit" = cause unhappiness even when not being aggressive -; "BeachLander" = won't lose all its movement when moving from non-native -; terrain to native terrain even if slow_invasions is on. -; "Settlers" = can irrigate and build roads -; "Diplomat" = can defend against diplomat actions (see diplchance -; server option) -; "Spy" = strong in diplomatic battles. _Must_ be "Diplomat" also -; "CoastStrict" = (sea only) cannot leave coast -; "Coast" = (sea only) can refuel on coast. Set fuel to force unit -; to regularly end turn on coast -; "Only_Native_Attack" = cannot attack targets on non-native tiles even if -; unit class can -; "Cant_Fortify" = cannot fortify even if unit class has "CanFortify" flag -; "Fanatic" = can only be built by governments that allow them -; (see civ2/governments.ruleset, Fundamentalism government) -; "Unique" = a player can only have one of these units in the game at -; the same time; barbarians cannot use this at present -; "GameLoss" = losing one of these units means you lose the game, but it -; is produced without homecity and upkeep -; "EvacuateFirst" = the game will try to rescue units with this flag before -; it tries to rescue units without it when their transport -; is destroyed. Think of the Birkenhead drill ("women and -; children first"). Replace "women and children" with -; "units with the EvacuateFirst unit type flag". -; "SuperSpy" = this unit always wins diplomatic contests, that is, unless -; it encounters another SuperSpy, in which case defender wins; -; can also be used on non-diplomat units, in which case it can -; protect cities from diplomats; also 100% spy survival chance -; "NoHome" = this unit has no homecity and will be free of all upkeep, and -; therefore will not revolt along with its city of origin should -; it be incited -; "NoVeteran" = this unit cannot gain veteran levels through experience -; (as if both raise_chance and work_raise_chance were zero); -; it can still gain veterancy through Veteran_Build, etc -; "CityBuster" = this unit has double firepower against cities -; "NoBuild" = this unit cannot be built -; "BadWallAttacker" = the firepower of this unit is set to 1 if -; attacking a city -; defended by a city wall (or other city building defense) -; "BadCityDefender" = if attacked while in a city, firepower is set to 1 -; and firepower of attacker is doubled (the Pearl Harbour -; rule) -; "BarbarianOnly" = only barbarians can build this unit -; "Shield2Gold" = Switch from shield upkeep to gold upkeep possible -; "NewCityGamesOnly" = unit can't be built on scenarios where founding new cities -; is not allowed. Give this flag to units that would make no sense -; to have in a game with such a scenario -; "CanEscape" = this unit has, given that certain conditions are -; fulfilled, a 50% chance to escape rather than being -; killed when killstack is enabled and the defender of its -; tile is defeated. The conditions are that it has more move -; points than required to move to an adjacent tile plus the -; attackers move points and that the attacker doesn't have -; the "CanKillEscaping" unit type flag. -; "CanKillEscaping" = an attack from this unit ignores the "CanEscape" unit -; type flag. -; "Provoking" = a unit considering to auto attack this unit will choose to -; do so even if has better odds when defending against it -; then when attacking it. Applies when the autoattack server -; setting is enabled. -; "NeverProtects" = doesn't protect reachable units on its tile from enemy -; attackers, even if the unreachableprotects server setting -; is enabled and the unit class is unreachable -; "NeverBlocked" = isn't blocked by unreachable units on targeted tile, -; even if the unreachableprotects server setting -; is enabled and the unit class is unreachable -; -; Following actions require extra fields: -; "Attack" -; attack = base attack strength -; "Bombard" -; attack = base attack strength -; bombard_rate = the number of shots fired at enemy units when attacking -; "Join City" -; pop_cost = the number of population added to the target city -; "Paradrop Unit" -; paratroopers_range = the maximal range the unit can be paradropped to. -; Max range is 65534. -; paratroopers_mr_req = the move rate which is required at least for -; paradropping (whole movement points) -; paratroopers_mr_sub = the move rate which is subtracted after paradropping -; (whole movement points) -; "Upgrade Unit" -; obsolete_by = the unit type upgraded to. -; "Convert Unit" -; convert_to = the unit type converted to. -; -; ** Roles ** -; -; "FirstBuild" = first to be built when city founded -; "Explorer" = unit to use for exploring -; "Hut" = can be found in a hut -; "HutTech" = can be found in a hut, but its techs required -; "Partisan" = can be created as a partisan (only one unit can have this -; flag), see end of this file for its tech requirements option -; "DefendOk" = AI hint: ok for defending with -; "DefendGood" = AI hint: good for defending with -; "Ferryboat" = AI hint: useful for ferrying -; "Barbarian" = can be created as land barbarian -; "BarbarianTech" = can be created as land barbarian, if someone has -; researched its tech requirements -; "BarbarianBoat" = can be created as boat for sea barbarian -; "BarbarianBuild" = can be built by barbarians -; "BarbarianBuildTech" = can be built by barbarians if someone has -; researched its tech requirements -; "BarbarianLeader" = this unit is the barbarian leader (only one) -; "BarbarianSea" = can be created as a barbarian that disembarks from a barbarian boat -; "BarbarianSeaTech" = can be created as a barbarian that disembarks from a barbarian boat -; if someone has researched its tech requirements -; "Settlers" = can irrigate and build roads -; "Hunter" = AI hint: good for hunting other units -; "CitiesStartUnit" = Gets granted as 'c' startunit -; "WorkerStartUnit" = Gets granted as 'w' startunit -; "ExplorerStartUnit" = Gets granted as 'x' startunit -; "KingStartUnit" = Gets granted as 'k' startunit -; "DiplomatStartUnit" = Gets granted as 's' startunit -; "FerryStartUnit" = Gets granted as 'f' startunit -; "DefendOkStartUnit" = Gets granted as 'd' startunit -; "DefendGoodStartUnit" = Gets granted as 'D' startunit -; "AttackFastStartUnit" = Gets granted as 'a' startunit -; "AttackStrongStartUnit" = Gets granted as 'A' startunit -; -; */ <-- avoid gettext warnings - -[unit_settlers] -name = _("Settlers") -class = "Land" -tech_req = "None" -obsolete_by = "None" -graphic = "u.settlers" -graphic_alt = "-" -sound_move = "m_settlers" -sound_move_alt = "m_generic" -sound_fight = "f_settlers" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 1 -attack = 0 -defense = 1 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 1 -uk_food = 1 -uk_gold = 0 -flags = "Settlers", "Infra", "CanRoad", "CanFortress", "NonMil", "HasNoZOC", "AddToCity", "Cities", "Cant_Fortify", "Expellable" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "CitiesStartUnit" -helptext = _("\ -Settlers are your only means of founding new cities.\ -"), _("\ -Settlers can perform most of the terrain alterations as\ - Workers (but cannot build Airbases or Buoys).\ -"), _("\ -Upkeep for Settlers costs food as well as production. A Settler\ - can die if its supporting city runs out of food. Settlers in a\ - Republic, Democracy, or Fundamentalist nation require twice as\ - much food per turn.\ -") - -;A unique patch unit to provide fair starts regardless of lack of nearby water. -;to make as a start unit, use the letter "a": for example, cccwwwxxa -[unit_welldigger] -name = _("Well-Digger") -class = "Land" -tech_req = "None" -obsolete_by = "Workers" -graphic = "u.well_digger" -graphic_alt = "u.migrants" -sound_move = "m_worker" -sound_move_alt = "m_generic" -sound_fight = "f_worker" -sound_fight_alt = "f_generic" -build_cost = 5 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 3 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 5 -uk_food = 2 -uk_gold = 2 -flags = "Settlers", "Infra", "NonMil", "HasNoZOC", "Cant_Fortify", "Unique", "Well-Digger", "Expellable" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "AttackFastStartUnit" ;this role taken over for well-digger -helptext = _("\ -This unit can fix unlucky starts, but has very high upkeep.\ - If you have no water, make a Well-Digger in a city that can\ - support it, create a water source, then disband the unit.\ -"), _("\ - This unit can dig wells or irrigate any lowland tile. It will cost its home city\ - -2 Food -2 Prod. This unit WILL NOT WORK: 1. Outside your borders,\ - 2. After Alphabet or Pottery, 3. After any player discovers Writing, 4. After 10 turns.\ - >> Don't fool around: high upkeep will permanently hinder you. Only make this unit if you\ - lack water when the game starts!\ -") - -[unit_proletarians] -name = _("Proletarians") -class = "Land" -tech_req = "Communism" -obsolete_by = "None" -graphic = "u.proletarian" -graphic_alt = "u.migrants" -sound_move = "m_worker" -sound_move_alt = "m_generic" -sound_fight = "f_worker" -sound_fight_alt = "f_generic" -build_cost = 10 -pop_cost = 1 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 1 -uk_gold = 0 -flags = "Settlers", "Infra", "Cant_Fortify", "NonMil", "HasNoZOC", "AddToCity", "Capturable", "Expellable", "Airbase", "CanFortress", "CanRoad", "Proletarian" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 1 -roles = "Settlers" -helptext = _("\ -Proletarians can only be controlled by Communist governments.\ -"), _("\ -Communist States can assign Proletarians from one city to another, which transfers population\ - from one to the other. They can also be ordered to the same tasks as Workers.\ -"), _("\ -Large numbers of Proletarians can be used to rapidly complete important State projects,\ - which you may organize into Five-turn Plans.\ -") - -[unit_pilgrims] -name = _("Pilgrims") -class = "Land" -tech_req = "Fundamentalism" -obsolete_by = "None" -graphic = "u.pilgrims" -graphic_alt = "u.migrants" -sound_move = "m_worker" -sound_move_alt = "m_generic" -sound_fight = "f_worker" -sound_fight_alt = "f_generic" -build_cost = 10 -pop_cost = 1 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 2 -uk_gold = 0 -flags = "Fanatic", "Cant_Fortify", "NonMil", "HasNoZOC", "AddToCity", "Capturable", "Expellable" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -helptext = _("\ -Pilgrims are wayfaring migrants from Fundamentalist nations. Like Fanatics,\ - they have no upkeep if under a Fundamentalist government. Heeding the call\ - of ecclesiastic authority, Pilgrims can be guided from one city to another in\ - order to transfer population from city to city.\ -") - - -[unit_worker] -name = _("?unit:Workers") -class = "Land" -tech_req = "Pottery" -obsolete_by = "Engineers" -graphic = "u.worker" -graphic_alt = "u.engineers" ; for compatibility -sound_move = "m_worker" -sound_move_alt = "m_generic" -sound_fight = "f_worker" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -convert_to = "Riflemen" -convert_time = 2 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "Settlers", "Infra", "CanRoad", "CanFortress", "NonMil", "HasNoZOC", "Airbase", "Cant_Fortify", "Capturable", "Expellable" -; No veteran levels (level name is never displayed) -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:army worker"), - _("?vet_rank:army engineer"), - _("?vet_rank:chief engineer") -veteran_raise_chance = 0, 0, 0, 0 -veteran_work_raise_chance = 0, 0, 0, 0 -veteran_power_fact = 100, 100, 100, 100 -veteran_move_bonus = 0, 1, 1, 1 -roles = "Settlers", "WorkerStartUnit" -helptext = _("\ -Workers can improve terrain tiles. See the manual on Terrain for details.\ -"), _("\ -Masonry lets Workers build Forts. Construction lets them build Fortresses and\ - Oil Wells. Engineering lets them build Canals and Naval Bases. Radio lets them\ - build Airbases and Buoys, which Settlers cannot. Workers must be on a ship to build Buoys.\ -"), _("\ -Communism tech allows Communist governments to conscript Workers into Riflemen via the\ - Convert order. And vice versa.\ -") - -[unit_engineers] -name = _("Engineers") -class = "Land" -tech_req = "Explosives" -obsolete_by = "None" -graphic = "u.engineers" -graphic_alt = "u.worker" -sound_move = "m_engineers" -sound_move_alt = "m_generic" -sound_fight = "f_engineers" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 0 -defense = 2 -hitpoints = 20 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "Settlers", "Infra", "CanRoad", "CanFortress", "NonMil", "HasNoZOC", "Transform", "Airbase", "Cant_Fortify", "Expellable" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "Settlers", "WorkerStartUnit" -helptext = _("\ -Engineers can do everything Workers can do, at twice the speed.\ - Unlike Workers, Engineers can Transform, such as converting\ - Desert to Plains. Converting Ocean to Swamp requires being on a ship\ - on a tile bordering 3 land tiles.\ -"), _("\ -TIP: If you build Leonardos Workshop, research Explosives before it goes\ - obsolete, so that you upgrade your Workers for free.\ -") - -[unit_warriors] -name = _("Warriors") -class = "Land" -tech_req = "None" -obsolete_by = "Pikemen" -graphic = "u.warriors" -graphic_alt = "-" -sound_move = "m_warriors" -sound_move_alt = "m_generic" -sound_fight = "f_warriors" -sound_fight_alt = "f_generic" -build_cost = 10 -pop_cost = 0 -attack = 1 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "FootSoldier", "CantReachAir" -roles = "DefendOk", "DefendOkStartUnit", "FirstBuild", "Hut" -helptext = _("\ -The Warrior is the weakest military unit, but can also be very cost effective.\ -") - -[unit_phalanx] -name = _("Phalanx") -class = "Land" -tech_req = "Bronze Working" -obsolete_by = "Pikemen" -graphic = "u.phalanx" -graphic_alt = "-" -sound_move = "m_phalanx" -sound_move_alt = "m_generic" -sound_fight = "f_phalanx" -sound_fight_alt = "f_generic" -build_cost = 20 -pop_cost = 0 -attack = 1 -defense = 2 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "FootSoldier", "CantReachAir" -roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild", "HutTech" -helptext = _("\ -The Phalanx is armored infantry, suitable for defending your cities. It offers good value\ - for defending.\ -") - -[unit_archers] -name = _("Archers") -class = "Land" -tech_req = "Warrior Code" -obsolete_by = "Musketeers" -graphic = "u.archers" -graphic_alt = "-" -sound_move = "m_archers" -sound_move_alt = "m_generic" -sound_fight = "f_archers" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 3 -defense = 2 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "FootSoldier", "Capturer", "CantReachAir", "Bombarder" -roles = "DefendOk", "DefendOkStartUnit" -helptext = _("\ -Archers fight with bows and arrows. They have good offense and decent defense.\ - Rather than fight to the death, Archers can also do a Ranged Attack with no risk\ - of retaliatory damage: a single volley of arrows is fired over all enemy units on the tile,\ - causing 1hp of damage to any units who are hit. This is useful for softening\ - enemies prior to battle, or for deterring an approach to a strategic location.\ - (Ranged Attack is not possible on Cities or Fortresses.)\ -") -bombard_rate = 1 - - -[unit_legion] -name = _("Legion") -class = "Land" -tech_req = "Iron Working" -obsolete_by = "Musketeers" -graphic = "u.legion" -graphic_alt = "-" -sound_move = "m_legion" -sound_move_alt = "m_generic" -sound_fight = "f_legion" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 4 -defense = 2 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "FootSoldier", "Settlers", "Infra", "CanRoad", "CanFortress", "Capturer", "CantReachAir" -roles = "DefendOk", "DefendOkStartUnit", "BarbarianBuild", "BarbarianSea" -helptext = _("\ -Legions are heavily armed well disciplined soldiers with excellent offensive strength.\ - They are famous and feared for their engineering abilities: with the required\ - technology they can build Forts and Fortresses. They can build Roads outside domestic\ - national territory and inside Forts and Fortresses.\ -") - -[unit_pikemen] -name = _("Pikemen") -class = "Land" -tech_req = "Feudalism" -obsolete_by = "Musketeers" -graphic = "u.pikemen" -graphic_alt = "-" -sound_move = "m_pikemen" -sound_move_alt = "m_generic" -sound_fight = "f_pikemen" -sound_fight_alt = "f_generic" -build_cost = 20 -pop_cost = 0 -attack = 1 -defense = 2 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -bonuses = - { "flag", "type", "value" - "Horse", "DefenseMultiplier", 1 - } -flags = "FootSoldier", "CantReachAir" -roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild" -helptext = _("\ -Equipped with long pikes and a 2x defence bonus against\ - mounted units, Pikemen replace the Phalanx as the\ - preferred city defender.\ -") - -[unit_musketeers] -name = _("Musketeers") -class = "Land" -tech_req = "Gunpowder" -obsolete_by = "Riflemen" -graphic = "u.musketeers" -graphic_alt = "-" -sound_move = "m_musketeers" -sound_move_alt = "m_generic" -sound_fight = "f_musketeers" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 3 -defense = 3 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "FootSoldier", "Capturer", "CantReachAir" -roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild", - "BarbarianTech", "BarbarianBuildTech", "BarbarianSeaTech" -helptext = _("\ -Musketeers are infantry equipped with early\ - firearms and replace Pikemen as the preferred\ - city defender, and replace Archers and Legions\ - for offensive foot soldiers.\ -") - -[unit_fanatics] -name = _("Fanatics") -class = "Land" -tech_req = "Fundamentalism" -gov_req = "Fundamentalism" -obsolete_by = "None" -graphic = "u.fanatics" -graphic_alt = "-" -sound_move = "m_fanatics" -sound_move_alt = "m_generic" -sound_fight = "f_fanatics" -sound_fight_alt = "f_generic" -build_cost = 20 -pop_cost = 0 -attack = 4 -defense = 4 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -flags = "Fanatic", "FootSoldier", "Capturer", "CantReachAir", "Unbribable", "Bombarder" -roles = "DefendGood", "DefendGoodStartUnit" -helptext = _("\ -Fanatics are warriors extremely devoted to a higher cause. Their faith\ - is strong and they cannot be bribed.\ -"), _("\ - Fundamentalist nations can maintain Fanatics without having to pay\ - any upkeep. Fanatics produced in a city with Ecclesiastical\ - Palace are inspired by fervorous faith to +1 higher veteran level.\ -"), _("\ - Fanatics zealously defend their homeland, and can do surprise assaults\ - and skirmishes to snipe and injure foreign occupants: Each invader\ - on the tile will endure three combat rounds without defense.\ -") -bombard_rate = 3 - -[unit_partisan] -name = _("Partisan") -class = "Land" -tech_req = "Guerilla Warfare" -obsolete_by = "None" -graphic = "u.partisan" -graphic_alt = "-" -sound_move = "m_partisan" -sound_move_alt = "m_generic" -sound_fight = "f_partisan" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 4 -defense = 4 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -flags = "IgTer", "IgZOC", "NoHome", "FootSoldier", "Capturer", "CantReachAir" -roles = "DefendGood", "DefendGoodStartUnit", "Partisan", "BarbarianTech" -helptext = _("\ -Partisans are guerilla fighters who can use the terrain to their advantage. Like the Explorer\ - that they upgrade, they can slip through ZOC and live off the land with no upkeep.\ -"), _("\ -A number of Partisans are granted free when an enemy conquers your\ - city -- they automatically fortify defensive positions in the\ - surrounding countryside -- but only under these conditions:\n\ - - Guerilla Warfare is known by any player.\n\ - - The city was originally built by you.\n\ - - You know Communism and Gunpowder.\n\ - - You must be Democracy or Communist.\ -") - -[unit_alpine_troops] -name = _("Alpine Troops") -class = "Land" -tech_req = "Tactics" -obsolete_by = "None" -graphic = "u.alpine_troops" -graphic_alt = "-" -sound_move = "m_alpine_troops" -sound_move_alt = "m_generic" -sound_fight = "f_alpine_troops" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 5 -defense = 5 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -flags = "IgTer", "FootSoldier", "Capturer", "CantReachAir" -roles = "DefendGood", "DefendGoodStartUnit" -helptext = _("\ -Alpine Troops are highly mobile units as well as\ - excellent defenders. Similar to an Explorer, they\ - treat every land tile as if it had a road on it.\ -") - -[unit_riflemen] -name = _("Riflemen") -class = "Land" -tech_req = "Conscription" -obsolete_by = "None" -graphic = "u.riflemen" -graphic_alt = "-" -sound_move = "m_riflemen" -sound_move_alt = "m_generic" -sound_fight = "f_riflemen" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 5 -defense = 4 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -convert_to = "Workers" -convert_time = 2 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -flags = "FootSoldier", "Capturer", "CantReachAir" -roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild" -helptext = _("\ -Riflemen are World War-era infantry. They are good at defending cities and\ - strategic Fortresses. They also have good attack capability.\ -"), _("\ -Communism tech allows Communist governments to de-commission Riflemen into\ - Workers via the Convert order. And vice versa.\ -") - -[unit_marines] -name = _("Marines") -class = "LandAirSea" -tech_req = "Amphibious Warfare" -obsolete_by = "None" -graphic = "u.marines" -graphic_alt = "-" -sound_move = "m_marines" -sound_move_alt = "m_generic" -sound_fight = "f_marines" -sound_fight_alt = "f_generic" -build_cost = 60 -pop_cost = 0 -attack = 8 -defense = 5 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 8 ; hard-coded the +4 extra for effect_physics_vision since it is a pre-req anyway -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter", "Land", "Sea" -disembarks = "Helicopter", "Land", "Sea" -targets = "Sea", "Balloon", "Helicopter" -flags = "Marines", "FootSoldier", "BeachLander", "Capturer", "NeverBlocked" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:Ranger"), - _("?vet_rank:Commando"), - _("?vet_rank:Green Beret"), - _("?vet_rank:Navy SEAL") -veteran_raise_chance = 60, 50, 40, 30, 20, 15, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 250, 300, 350, 400 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "DefendOk", "DefendOkStartUnit", "BarbarianSeaTech" -helptext = _("\ -Marines are experts at amphibious war. They are the strongest\ - foot unit in the game, and are armed with diverse weaponry.\ -"), _("\ - Unlike other units, Marines can attack Sea units (at a penalty).\ - Air units do not stop them from attacking reachable targets.\ - They can attack from a Transport or Helicopter. Marines promoted to three\ - veteran levels become commandos suitable for special ops.\ -"), _("\ - Marines built in a city with an Airport, Port Facility, and Barracks III\ - receive the second veteran level (hardened.)\ -") - -[unit_paratroopers] -name = _("Paratroopers") -class = "Land" -tech_req = "Combined Arms" -obsolete_by = "None" -graphic = "u.paratroopers" -graphic_alt = "-" -sound_move = "m_paratroopers" -sound_move_alt = "m_generic" -sound_fight = "f_paratroopers" -sound_fight_alt = "f_generic" -build_cost = 60 -pop_cost = 0 -attack = 6 -defense = 4 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -flags = "Paratroopers", "FootSoldier", "Capturer", "CantReachAir" -roles = "DefendOk", "DefendOkStartUnit" -helptext = _("\ -Paratroopers are experts at airborne attacks.\ - From a friendly city or airbase, Paratroopers who have not used any\ - move points can paradrop directly to any tile in range, and be\ - immediately ready to act there. Beware dropping into unseen territory,\ - as Paratroopers landing on a tile occupied by enemy units will be lost.\ -") -paratroopers_range = 14 -paratroopers_mr_req = 1 -paratroopers_mr_sub = 0 - -[unit_mech_inf] -name = _("Mech. Inf.") -class = "Land" -tech_req = "Labor Union" -obsolete_by = "None" -graphic = "u.mech_inf" -graphic_alt = "-" -sound_move = "m_mech_inf" -sound_move_alt = "m_generic" -sound_fight = "f_mech_inf" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 6 -defense = 6 -hitpoints = 30 -firepower = 1 -move_rate = 6 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -flags = "CantReachAir" -roles = "DefendGood", "DefendGoodStartUnit" -helptext = _("\ -Mechanized Infantry have the strongest general defense strength of any land unit.\ - They have decent attack strength in open field engagements, and excellent mobility.\ -") - -[unit_horsemen] -name = _("Horsemen") -class = "Land" -tech_req = "Horseback Riding" -obsolete_by = "Knights" -graphic = "u.horsemen" -graphic_alt = "-" -sound_move = "m_horsemen" -sound_move_alt = "m_generic" -sound_fight = "f_horsemen" -sound_fight_alt = "f_generic" -build_cost = 20 -pop_cost = 0 -attack = 2 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "Horse", "CantReachAir" -roles = "AttackFastStartUnit", "Barbarian", "Hunter" -helptext = _("\ -Horsemen are mounted warriors and an early shock-troop that can penetrate deep into\ - enemy territory.\ -") - -[unit_chariot] -name = _("Chariot") -class = "Land" -tech_req = "The Wheel" -obsolete_by = "Knights" -graphic = "u.chariot" -graphic_alt = "-" -sound_move = "m_chariot" -sound_move_alt = "m_generic" -sound_fight = "f_chariot" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 3 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "Horse", "Capturer", "CantReachAir" -roles = "AttackFastStartUnit", "Hunter" -helptext = _("\ -Chariots are horse-pulled war wagons, stronger but more expensive than horsemen.\ -") - -[unit_elephants] -name = _("Elephants") -class = "Land" -tech_req = "Polytheism" -obsolete_by = "Crusaders" -graphic = "u.elephants" -graphic_alt = "-" -sound_move = "m_elephants" -sound_move_alt = "m_generic" -sound_fight = "f_elephants" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 4 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "Horse", "Capturer", "CantReachAir" -roles = "AttackFastStartUnit" -helptext = _("\ -Elephants are towering animals trained for war. Their mobility and formidable\ - attack strength make them excellent for offensive engagements, but they\ - defend poorly against most units.\ -") - -[unit_crusaders] -name = _("Crusaders") -class = "Land" -tech_req = "Monotheism" -obsolete_by = "Dragoons" -graphic = "u.crusaders" -graphic_alt = "-" -sound_move = "m_crusaders" -sound_move_alt = "m_generic" -sound_fight = "f_crusaders" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 5 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "Horse", "Capturer", "CantReachAir" -roles = "AttackFastStartUnit" -helptext = _("\ -Crusaders are mounted warriors driven by a higher cause.\ - They have superior attack to Knights, but are poor at defending.\ - They are ideally suited for leading the charge in offensive campaigns.\ -") - -[unit_knights] -name = _("Knights") -class = "LandNoKill" -tech_req = "Chivalry" -obsolete_by = "Dragoons" -graphic = "u.knights" -graphic_alt = "-" -sound_move = "m_knights" -sound_move_alt = "m_generic" -sound_fight = "f_knights" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 4 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -bonuses = - { "flag", "type", "value" - "Horse", "DefenseMultiplier", 2 - "FootSoldier", "DefenseMultiplier", 1 - } -flags = "Horse", "Capturer", "CantReachAir" -roles = "AttackFastStartUnit", "BarbarianTech", - "BarbarianBuildTech", "BarbarianSeaTech", "Hunter" -helptext = _("\ -Knights are heavily armored mounted warriors. They defend at D:3 against mounted units.\ - They defend at D:2 against foot units. They defend at D:1 against everything else.\ - Their noble status allows them to attack cities without population reduction.\ -") - -[unit_dragoons] -name = _("Dragoons") -class = "Land" -tech_req = "Leadership" -obsolete_by = "Cavalry" -graphic = "u.dragoons" -graphic_alt = "-" -sound_move = "m_dragoons" -sound_move_alt = "m_generic" -sound_fight = "f_dragoons" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 5 -defense = 2 -hitpoints = 20 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "Horse", "Capturer", "CantReachAir" -roles = "AttackFastStartUnit", "BarbarianBuildTech", "BarbarianSeaTech", "Hunter" -helptext = _("\ -Dragoons are mounted warriors carrying early firearms.\ - Being the first highly mobile gunpowder unit, they are\ - formidable for offensive campaigns.\ -") - -[unit_cavalry] -name = _("Cavalry") -class = "Land" -tech_req = "Tactics" -obsolete_by = "Armor" -graphic = "u.cavalry" -graphic_alt = "-" -sound_move = "m_cavalry" -sound_move_alt = "m_generic" -sound_fight = "f_cavalry" -sound_fight_alt = "f_generic" -build_cost = 60 -pop_cost = 0 -attack = 8 -defense = 3 -hitpoints = 20 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -flags = "Capturer", "CantReachAir" -roles = "AttackFastStartUnit", "Hunter" -helptext = _("\ -The combination of mobility and superior attack strength make Cavalry\ - the most feared offensive unit in their era.\ -") - -[unit_armor] -name = _("Armor") -class = "Land" -tech_req = "Mobile Warfare" -obsolete_by = "Armor II" -graphic = "u.armor" -graphic_alt = "-" -sound_move = "m_armor" -sound_move_alt = "m_generic" -sound_fight = "f_armor" -sound_fight_alt = "f_generic" -build_cost = 80 -pop_cost = 0 -attack = 10 -defense = 5 -hitpoints = 30 -firepower = 1 -move_rate = 6 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -flags = "CantReachAir", "FortBuster" -roles = "AttackFastStartUnit", "Hunter" -helptext = _("\ -Armor is the mechanized equivalent of a Cavalry unit. They have high attack strength,\ - superb mobility, and the highest defense of any offensive unit. They are massive all-terrain\ - vehicles, well-suited for penetrating defensive fortifications: Units inside Forts get no defense\ - bonus against Armor. Units inside Fortresses get a reduced bonus of 1.67x instead of 2x.\ -") - -[unit_armor_ii] -name = _("Armor II") -class = "Land" -tech_req = "Plastics" -obsolete_by = "None" -graphic = "u.armor_ii" -graphic_alt = "u.armor" -sound_move = "m_armor_ii" -sound_move_alt = "m_armor" -sound_fight = "f_armor_ii" -sound_fight_alt = "f_armor" -build_cost = 80 -pop_cost = 0 -attack = 16 -defense = 6 -hitpoints = 30 -firepower = 1 -move_rate = 6 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -bonuses = - { "flag", "type", "value" - "Missile", "DefenseMultiplier", 1 - } -flags = "CantReachAir", "FortressBuster", "NeverBlocked" -roles = "AttackFastStartUnit", "Hunter" -helptext = _("\ -Armor II is the ultra-modern upgrade to Armor. It features high tech composite armor and\ - electronic countermeasures (ECM). Forts and Fortresses gain no bonus against\ - its ability to blast and break through fortifications. ECM and composite armor\ - yielding a 2x defense bonus against Missiles. Unlike most land units,\ - Armor II can attack reachable units regardless of whether unreachable units are protecting the tile.\ -") - -[unit_catapult] -name = _("Catapult") -class = "Land" -tech_req = "Mathematics" -obsolete_by = "Cannon" -graphic = "u.catapult" -graphic_alt = "-" -sound_move = "m_catapult" -sound_move_alt = "m_generic" -sound_fight = "f_catapult" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 6 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "CantReachAir" -roles = "AttackStrongStartUnit" -helptext = _("\ -Catapults are large rock-throwing war machines.\ - They are strong attackers but equally weak\ - defenders, and will need an escort to be effective.\ -") - -[unit_cannon] -name = _("Cannon") -class = "Land" -tech_req = "Metallurgy" -obsolete_by = "Artillery" -graphic = "u.cannon" -graphic_alt = "-" -sound_move = "m_cannon" -sound_move_alt = "m_generic" -sound_fight = "f_cannon" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 8 -defense = 1 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "CantReachAir" -roles = "AttackStrongStartUnit", "BarbarianTech", "BarbarianBuildTech" -helptext = _("\ -Cannons are large firearms that fire heavy projectiles. They are strong attackers but equally weak\ - defenders, so they need an escort to be effective.\ -") - -[unit_artillery] -name = _("Artillery") -class = "Land" -tech_req = "Machine Tools" -obsolete_by = "Howitzer" -graphic = "u.artillery" -graphic_alt = "-" -sound_move = "m_artillery" -sound_move_alt = "m_generic" -sound_fight = "f_artillery" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 10 -defense = 1 -hitpoints = 20 -firepower = 2 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -flags = "CantReachAir" -roles = "AttackStrongStartUnit" -helptext = _("\ -Artillery are a major upgrade to Cannons, with higher attack strength and doubled firepower.\ - They are very strong attackers, but weak defenders. They need an escort to be effective.\ -") - -[unit_anti_aircraft] -name = _("Anti-Aircraft Artillery") -class = "LandAirSea" -tech_req = "Flight" -obsolete_by = "None" -graphic = "u.anti_aircraft" -graphic_alt = "u.howitzer" -sound_move = "m_anti_aircraft" -sound_move_alt = "m_generic" -sound_fight = "f_anti_aircraft" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 2 -defense = 2 -hitpoints = 20 -firepower = 2 -move_rate = 2 -vision_radius_sq = 8; hard-coding in physics bonus here since its a req, lets us cut making a new effect -convert_to = "Mobile SAM" -convert_time = 7 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter" -disembarks = "Helicopter" -targets = "Air", "AirProtect", "Sea", "Balloon", "Helicopter" -bonuses = - { "flag", "type", "value" - "AirAttacker", "DefenseDivider", 1 - "AirAttacker", "DefenseMultiplier", 1 - } -flags = "NeverBlocked", "AntiAir" -roles = "" -helptext = _("\ -Anti-Aircraft Artillery (AAA) can attack almost anything from anywhere. AAA get a\ - 2x bonus against Air units. They are often used by Marines in combined ops because\ - they can be transported on any unit that can carry Marines, can attack from or to non-native\ - tiles, and do not lose a turn when unloading. (AAA cannot attack Submarines, Missiles,\ - or Jet Bombers.)\ -"), _(" -After Space Flight and 10 turns of service, AAA can be retrofitted to\ - Mobile SAM. The Convert order must be done in your capital, and takes 4 turns.\ -") - -[unit_mobile_sam] -name = _("Mobile SAM") -class = "Land" -tech_req = "Space Flight" -obsolete_by = "None" -graphic = "u.mobile_sam" -graphic_alt = "u.howitzer" -sound_move = "m_howitzer" -sound_move_alt = "m_generic" -sound_fight = "f_stealth_fighter" -sound_fight_alt = "f_generic" -build_cost = 75 -pop_cost = 0 -attack = 2 -defense = 2 -hitpoints = 30 -firepower = 2 -move_rate = 6 -vision_radius_sq = 4 -transport_cap = 1 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Air", "AirProtect", "AirPillage", "Balloon", "Helicopter" -cargo = "Missile" -bonuses = - { "flag", "type", "value" - "AirAttacker", "DefenseDivider", 1 - "AirAttacker", "DefenseMultiplier", 1 - } -flags = "NeverBlocked", "AntiAir" -roles = "" -helptext = _("\ -The Mobile SAM is the strongest Anti-Air unit on the ground. It can\ - attack nearby aircraft. It has a 2x bonus against all Air units. The\ - Mobile SAM can also carry one Missile of any type.\ -"), _(" -An AAA can upgrade to Mobile SAM for free on its 10th turn of service.\ - The Convert order must be done in the capital city, and takes 4 turns.\ -") - -[unit_howitzer] -name = _("Howitzer") -class = "Land" -tech_req = "Robotics" -obsolete_by = "None" -graphic = "u.howitzer_o" -graphic_alt = "u.howitzer" -sound_move = "m_howitzer" -sound_move_alt = "m_generic" -sound_fight = "f_howitzer" -sound_fight_alt = "f_generic" -build_cost = 70 -pop_cost = 0 -attack = 12 -defense = 2 -hitpoints = 30 -firepower = 2 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -flags = "CantReachAir" -roles = "AttackStrongStartUnit" -helptext = _("\ -Howitzers are upgraded Artillery with significant increase in mobility and attack strength. They can fire over city walls, ignoring their effect.\ -") - -[unit_balloon] -name = _("Balloon") -class = "Balloon" -tech_req = "Chemistry" -obsolete_by = "None" -graphic = "u.balloon" -graphic_alt = "u.trireme" -sound_move = "m_balloon" -sound_move_alt = "m_trireme" -sound_fight = "f_warrior" -sound_fight_alt = "f_generic" -build_cost = 25 -pop_cost = 0 -attack = 0 -defense = 0 -hitpoints = 10 -firepower = 1 -move_rate = 5 -vision_radius_sq = 17 -transport_cap = 0 -fuel = 2 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -flags = "Unbribable", "HasNoZOC", "NeverProtects", "NonMil" -roles = "" -helptext = _("\ -Balloons gather intel on potential battle areas. They have great vision and\ - are unreachable by units prior to Riflemen and Ironclads. They can stay in\ - the air for one Turn Change before landing in a City, Fortress, Airbase, or\ - ship with cargo capacity of 4+. Balloons do not block units under them\ - from being attacked, and cannot fly over mountains.\ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. At your own risk,\ - you can override this by ordering moves to adjacent tiles.\ -") - - -[unit_fighter] -name = _("Fighter") -class = "AirProtect" -tech_req = "Flight" -obsolete_by = "Jet Fighter" -graphic = "u.fighter" -graphic_alt = "-" -sound_move = "m_fighter" -sound_move_alt = "m_generic" -sound_fight = "f_fighter" -sound_fight_alt = "f_generic" -build_cost = 60 -pop_cost = 0 -attack = 4 -defense = 3 -hitpoints = 20 -firepower = 2 -move_rate = 20 -vision_radius_sq = 12 -transport_cap = 0 -fuel = 1 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Air", "AirProtect", "Missile", "Balloon", "Helicopter" -bonuses = - { "flag", "type", "value" - "Helicopter", "DefenseDivider", 1 - "Helicopter", "Firepower1", 1 - } -flags = "AirAttacker", "Unbribable", "HasNoZOC", "CanEscape", "AirProtector" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -Fighters are the first offensive Air units. Their superior mobility and firepower alter\ - the very nature of warfare. They can move anywhere and attack any unit (except Submarines,\ - Missiles, and Jet Bombers.) \ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. At your own risk,\ - you can override this by ordering movement and attacks to adjacent tiles.\ -") - - -[unit_escort_fighter] -name = _("Escort Fighter") -class = "AirProtect" -tech_req = "Radio" -obsolete_by = "Jet Fighter" -graphic = "u.escort_fighter" -graphic_alt = "u.fighter" -sound_move = "m_escort_fighter" -sound_move_alt = "m_generic" -sound_fight = "f_fighter" -sound_fight_alt = "f_generic" -build_cost = 80 -pop_cost = 0 -attack = 3 -defense = 5 -hitpoints = 20 -firepower = 2 -move_rate = 18 -vision_radius_sq = 12 -transport_cap = 0 -fuel = 2 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Air", "AirProtect", "Missile", "Balloon", "Helicopter" -bonuses = - { "flag", "type", "value" - "Helicopter", "DefenseDivider", 1 - "Helicopter", "Firepower1", 1 - } -flags = "AirAttacker", "Unbribable", "HasNoZOC", "CanEscape", "AirProtector" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 50, 33, 20, 15, 15, 15, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -Escort Fighters are large fighters with high fuel capacity. Higher mass and\ - stronger construction allow them to absorb more damage. They do not attack\ - as well as standard Fighters, but can return home on the next turn. They are\ - good for long-range missions, defensie air support, and escorting bombers. \ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_medium_bomber] -name = _("Medium Bomber") -class = "Air" -tech_req = "Radio" -obsolete_by = "Jet Bomber" -graphic = "u.medium_bomber" -graphic_alt = "u.bomber" -sound_move = "m_medium_bomber" -sound_move_alt = "m_generic" -sound_fight = "f_medium_bomber" -sound_fight_alt = "f_generic" -build_cost = 85 -pop_cost = 0 -attack = 6 -defense = 2 -hitpoints = 20 -firepower = 2 -move_rate = 13 -vision_radius_sq = 12 -transport_cap = 0 -fuel = 2 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon" -bonuses = - { "flag", "type", "value" - } -flags = "FieldUnit", "Unbribable", "AirAttacker", "HasNoZOC", "CanEscape", "CantReachAir", "NeverProtects" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -Medium Bombers are good for eliminating moderately strong ground targets, or multiple weaker targets.\ - They may not attack other Air units. \ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_bomber] -name = _("Heavy Bomber") -class = "Air" -tech_req = "Advanced Flight" -obsolete_by = "Jet Bomber" -graphic = "u.heavy_bomber_o" -graphic_alt = "u.bomber" -sound_move = "m_bomber" -sound_move_alt = "m_generic" -sound_fight = "f_heavy_bomber" -sound_fight_alt = "f_bomber" -build_cost = 120 -pop_cost = 0 -attack = 12 -defense = 3 -hitpoints = 20 -firepower = 2 -move_rate = 16 -vision_radius_sq = 12 -transport_cap = 1 -fuel = 2 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon" -cargo = "Bomb" -bonuses = - { "flag", "type", "value" - } -flags = "FieldUnit", "Unbribable", "AirAttacker", "HasNoZOC", "CanEscape", "CantReachAir", "NeverProtects" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -Heavy Bombers are good for hitting strong and well-defended ground targets, or multiple weaker targets.\ - They cannot attack Air units. May carry one Bomb. \ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_strategic_bomber] -name = _("Strategic Bomber") -class = "Air" -tech_req = "Rocketry" -obsolete_by = "Jet Bomber" -graphic = "u.ultra_heavy_bomber_o" -graphic_alt = "u.bomber" -sound_move = "m_strategic_bomber" -sound_move_alt = "m_bomber" -sound_fight = "f_strategic_bomber" -sound_fight_alt = "f_bomber" -build_cost = 135 -pop_cost = 0 -attack = 13 -defense = 4 -hitpoints = 20 -firepower = 2 -move_rate = 16 -vision_radius_sq = 12 -transport_cap = 2 -fuel = 3 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon" -cargo = "Bomb" -bonuses = - { "flag", "type", "value" - } -flags = "FieldUnit", "Unbribable", "AirAttacker", "HasNoZOC", "CanEscape", "CantReachAir", "NeverProtects" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -The Strategic Bomber offers a small improvement in attack. Higher altitude offers a good upgrade in\ - defense. It has considerably longer range, with one more turn of fuel. May carry two Bombs. \ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_awacs] -name = _("AWACS") -class = "Air" -tech_req = "Advanced Flight" -obsolete_by = "None" -graphic = "u.awacs" -graphic_alt = "u.bomber" ; backwards compatibility -sound_move = "m_awacs" -sound_move_alt = "m_generic" -sound_fight = "f_awacs" -sound_fight_alt = "f_generic" -build_cost = 140 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 20 -firepower = 1 -move_rate = 32 -vision_radius_sq = 46 -transport_cap = 0 -fuel = 2 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "HasNoZOC", "Unbribable", "Expellable", "NeverProtects", "CanEscape" -roles = "" -helptext = _("\ -The AWACS has great fuel capacity for long range flights, and advanced radar that can determine\ - the location of enemy units over a wide area. \ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_helicopter] -; /* TRANS: unit type */ -name = _("Helicopter") -class = "Helicopter" -tech_req = "Combined Arms" -obsolete_by = "None" -graphic = "u.helicopter" -graphic_alt = "-" -sound_move = "m_helicopter" -sound_move_alt = "m_generic" -sound_fight = "f_helicopter" -sound_fight_alt = "f_generic" -build_cost = 100 -pop_cost = 0 -attack = 10 -defense = 5 -hitpoints = 20 -firepower = 2 -move_rate = 12 -vision_radius_sq = 12 -transport_cap = 1 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -cargo = "LandAirSea" -flags = "Helicopter", "AirAttacker", "Unbribable", "CanEscape" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 50, 33, 20, 15, 15, 15, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -The Helicopter has good range and can attack multiple targets, and even conquer cities. Helicopters lose\ - a small amount of health for every turn not spent in a City, Fort, Fortress, Airbase or Carrier. Helicopters\ - can be attacked by ground units from Riflemen onward, or by Sea from Ironclad onward.\ -"), _("\ - Helicopters can transport one Marines or AAA unit.\ -") - -[unit_jet_fighter] -name = _("Jet Fighter") -class = "AirProtect" -tech_req = "Space Flight" -obsolete_by = "None" -graphic = "u.jet_fighter" -graphic_alt = "u.stealth_fighter" -sound_move = "m_jet_fighter" -sound_move_alt = "m_stealth_fighter" -sound_fight = "f_jet_fighter" -sound_fight_alt = "f_stealth_fighter" -build_cost = 70 -pop_cost = 0 -attack = 6 -defense = 5 -hitpoints = 20 -firepower = 2 -move_rate = 24 -vision_radius_sq = 12 -transport_cap = 0 -fuel = 1 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Air", "AirProtect", "AirPillage", "Missile", "Balloon", "Helicopter" -bonuses = - { "flag", "type", "value" - "Helicopter", "DefenseDivider", 1 - "Helicopter", "Firepower1", 1 - } -flags = "AirAttacker", "Unbribable", "HasNoZOC", "CanEscape", "AirProtector" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -Jet Fighters upgrade the Fighter with improved attack, defense, and range. \ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_jet_bomber] -name = _("Jet Bomber") -class = "AirPillage" -tech_req = "Space Flight" -obsolete_by = "None" -graphic = "u.jet_bomber_o" -graphic_alt = "u.bomber" -sound_move = "m_jet_bomber" -sound_move_alt = "m_bomber" -sound_fight = "f_jet_bomber" -sound_fight_alt = "f_bomber" -build_cost = 145 -pop_cost = 0 -attack = 15 -defense = 1 -hitpoints = 20 -firepower = 2 -move_rate = 19 -vision_radius_sq = 12 -transport_cap = 3 -fuel = 3 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -cargo = "Bomb" -flags = "FieldUnit", "Unbribable", "AirAttacker", "HasNoZOC", "CanEscape", "CantReachAir", "NeverProtects" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -Jet Bombers are stratospheric long-range bombers with 3 turns of fuel: they can be airborne for two\ - turn-changes. Their range makes them useful even after Stealth Bombers are available. Stratospheric altitude\ - makes them unreachable to propeller-based Fighters and AAA. Jet Bombers can carpet-bomb,\ - pillaging tiles from the air. May carry three Bombs. \ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_stealth_fighter] -name = _("Stealth Fighter") -class = "AirProtect" -tech_req = "Stealth" -obsolete_by = "None" -graphic = "u.stealth_fighter" -graphic_alt = "-" -sound_move = "m_stealth_fighter" -sound_move_alt = "m_generic" -sound_fight = "f_stealth_fighter" -sound_fight_alt = "f_generic" -build_cost = 80 -pop_cost = 0 -attack = 8 -defense = 4 -hitpoints = 20 -firepower = 2 -move_rate = 28 -vision_radius_sq = 12 -transport_cap = 0 -fuel = 1 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Air", "AirProtect", "AirPillage", "Missile", "Balloon", "Helicopter" -bonuses = - { "flag", "type", "value" - "Helicopter", "DefenseDivider", 1 - "Helicopter", "Firepower1", 1 - "AntiAir", "DefenseDividerPct", 25 - } -vision_layer = "Stealth" -flags = "AirAttacker", "Unbribable", "HasNoZOC", "CanEscape", "AirProtector" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -The most advanced Fighter, with improved attack and longer range. Stealth Fighters cannot be seen unless adjacent\ - to an enemy. Stealth evasion gives a 25% bonus against all Anti-Air units, and reduces\ - SAM Batteries down to a smaller 25% bonus. \ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_stealth_bomber] -name = _("Stealth Bomber") -class = "Air" -tech_req = "Stealth" -obsolete_by = "None" -graphic = "u.stealth_bomber_o" -graphic_alt = "u.stealth_bomber" -sound_move = "m_stealth_bomber" -sound_move_alt = "m_generic" -sound_fight = "f_stealth_bomber" -sound_fight_alt = "f_generic" -build_cost = 160 -pop_cost = 0 -attack = 19 -defense = 5 -hitpoints = 20 -firepower = 2 -move_rate = 24 -vision_radius_sq = 12 -transport_cap = 2 -fuel = 2 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon" -bonuses = - { "flag", "type", "value" - "AntiAir", "DefenseDividerPct", 25 - } -vision_layer = "Stealth" -cargo = "Bomb" -flags = "FieldUnit", "AirAttacker", - "HasNoZOC", "Unbribable", "CanEscape", "CantReachAir", "NeverProtects" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -The deadliest Bomber, with improved attack and speed. Stealth Bombers cannot be seen\ - unless adjacent to an enemy. Stealth evasion gives a 25% bonus against all Anti-Air\ - units, and reduces SAM Batteries down to only a 25% bonus. May carry two Bombs. \ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_boat] -name = _("Boat") -class = "RiverShip" -tech_req = "None" -obsolete_by = "Trireme" -graphic = "u.boat" -graphic_alt = "-" -sound_move = "m_trireme" -sound_move_alt = "m_generic" -sound_fight = "f_trireme" -sound_fight_alt = "f_generic" -build_cost = 10 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 1 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea" -flags = "BadCityDefender", "CantReachAir", "HelpWonder", "TradeRoute", "CoastStrict", "NonMil", "HasNoZOC" -roles = "Ferryboat", "FerryStartUnit" -helptext = _("\ -Boats were used pre-historically for exploration,\ - transport, and interaction with other tribes. They\ - can travel rivers and oceans, but must always stay\ - near shore. Boats can carry one unit and do ancient\ - commerce: building Wonders or setting up Traderoutes\ - without Trade tech. Primitive bartering generates little\ - or no extra trade, but could help you advance faster or\ - set good relations with ancient neighbors. To build\ - Wonders with Boats, Currency is required.\ -") - -[unit_trireme] -name = _("Trireme") -class = "Trireme" -tech_req = "Alphabet" -obsolete_by = "Galley" -graphic = "u.trireme" -graphic_alt = "-" -sound_move = "m_trireme" -sound_move_alt = "m_generic" -sound_fight = "f_trireme" -sound_fight_alt = "f_generic" -build_cost = 20 -pop_cost = 0 -attack = 1 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 6 -vision_radius_sq = 4 -transport_cap = 2 -fuel = 2 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea" -flags = "BadCityDefender", "Provoking", "CantReachAir", "HelpWonder", "TradeRoute", "Coast" -roles = "Ferryboat", "FerryStartUnit" -helptext = _("\ -Triremes are used for exploration, transport, and Commerce.\ - The entry on Caravan explains what Commerce units may do.\ -"), _(" - Triremes can enter Deep Ocean, but there is risk: they must end every second\ - turn on river, coastline, or a city--or else be lost at sea. They can travel\ - and attack on rivers, but cannot attack the shore.\ -"), _(" - Like most ancient sea units, when it initiates combat there will be 15 rounds\ - of combat and 15 total hp lost between both units. This may or may not\ - result in a victor. Triremes do not cause unhappiness.\ -") - -[unit_longboat] -name = _("Longboat") -class = "RiverShip" -tech_req = "Map Making" -obsolete_by = "Caravel" -graphic = "u.longboat" -graphic_alt = "u.trireme" -sound_move = "m_longboat" -sound_move_alt = "m_trireme" -sound_fight = "f_trireme" -sound_fight_alt = "f_generic" -build_cost = 25 -pop_cost = 0 -attack = 2 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 6 -vision_radius_sq = 4 -transport_cap = 1 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea" -flags = "BadCityDefender", "Provoking", "CantReachAir" -roles = "Ferryboat", "Hunter" -helptext = _("\ -The Longboat is a warship. It can attack at sea, attack the shore, and carry one land\ - unit. It is useful for ancient sea campaigns. Longboats can travel on rivers.\ -"), _(" -Like most early sea units, when it initiates combat there will be 15 rounds\ - of combat and 15 total hp lost between both units. This may or may not\ - result in the loss of one of the units.\ -") - -[unit_galley] -name = _("Galley") -class = "RiverShip" -tech_req = "Seafaring" -obsolete_by = "Caravel" -graphic = "u.galley" -graphic_alt = "u.trireme" -sound_move = "m_galley" -sound_move_alt = "m_trireme" -sound_fight = "f_trireme" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 2 -defense = 2 -hitpoints = 10 -firepower = 1 -move_rate = 6 -vision_radius_sq = 4 -transport_cap = 2 -fuel = 0 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea" -flags = "BadCityDefender", "Provoking", "CantReachAir", "HelpWonder", "Traderoute", "Only_Native_Attack" -roles = "Ferryboat", "FerryStartUnit", "BarbarianBoat" -helptext = _("\ -The Galley is an all-purpose sea unit and upgrades the Trireme. It has decent\ - combat strength, can transport, and is a Commerce unit. The entry on Caravan\ - explains what Commerce units may do. Galleys can travel and attack on rivers,\ - but cannot attack the shore. Galleys do not cause unhappiness.\ -"), _(" -Like most early sea units, when it initiates an attack, there will be 15 rounds\ - of combat and 15 total hp lost between both units. This may or may not\ - result in the loss of one of the units.\ -") - -[unit_war_galley] -name = _("War Galley") -class = "RiverShip" -tech_req = "Astronomy" -obsolete_by = "Caravel" -graphic = "u.war_galley" -graphic_alt = "u.trireme" -sound_move = "m_war_galley" -sound_move_alt = "m_trireme" -sound_fight = "f_trireme" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 3 -defense = 3 -hitpoints = 10 -firepower = 1 -move_rate = 6 -vision_radius_sq = 4 -transport_cap = 3 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea" -flags = "BadCityDefender", "Provoking", "CantReachAir" -roles = "Ferryboat", "FerryStartUnit", "BarbarianBoat", "Hunter" -helptext = _("\ -The War Galley has improved offense, defense, and cargo capacity, but lacks commerce\ - ability. War Galleys can travel and attack on rivers, and do shore attacks from the sea.\ -"), _(" -Like most ancient sea units, when it initiates combat there will be 15 rounds\ - of combat and 15 total hitpoints lost between both units. This may or may not\ - result in the loss of one of the units.\ -") - -[unit_ram_ship] -name = _("Ram Ship") -class = "Sea" -tech_req = "Engineering" -obsolete_by = "Caravel" -graphic = "u.ram_ship" -graphic_alt = "u.trireme" -sound_move = "m_ram_ship" -sound_move_alt = "m_trireme" -sound_fight = "f_ram_ship" -sound_fight_alt = "f_catapult" -build_cost = 35 -pop_cost = 0 -attack = 4 -defense = 2 -hitpoints = 10 -firepower = 1 -move_rate = 6 -vision_radius_sq = 1 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea" -flags = "BadCityDefender", "Provoking", "CantReachAir", "Only_Native_Attack" -roles = "Hunter" -helptext = _("\ -The Ram Ship has one purpose: to destroy other ships. It has poor vision, no transport or\ - commerce ability, and cannot travel rivers. Unlike other early ships, there will always be\ - a winner and a loser when Ram Ships attack. They are good for first-strike, and are good\ - counter units for nations not invested into sea tech. Ram Ships cannot do shore attacks.\ -") - -[unit_caravel] -name = _("Caravel") -class = "RiverShip" -tech_req = "Navigation" -obsolete_by = "Galleon" -graphic = "u.caravel" -graphic_alt = "u.trireme" -sound_move = "m_caravel" -sound_move_alt = "m_generic" -sound_fight = "f_caravel" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 4 -defense = 4 -hitpoints = 10 -firepower = 1 -move_rate = 7 -vision_radius_sq = 4 -transport_cap = 3 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea" -flags = "BadCityDefender", "Provoking", "CantReachAir", "Traderoute", "HelpWonder" -roles = "Ferryboat", "FerryStartUnit", "BarbarianBoat", "Hunter" -helptext = _("\ -Caravels upgrade older sea units, and are a big advance in combat, speed, range, and transport capacity. They have\ - the commerce ability of the Galley, but cannot build Wonders. Caravels can travel and attack on rivers and do shore attacks.\ -"), _(" -Like most early sea units, when it initiates an attack, there will be 15 rounds\ - of combat and 15 total hitpoints lost between both units. This may or may not\ - result in the loss of one of the units.\ -") - -[unit_galleon] -name = _("Galleon") -class = "RiverShip" -tech_req = "Magnetism" -obsolete_by = "Transport" -graphic = "u.galleon" -graphic_alt = "-" -sound_move = "m_galleon" -sound_move_alt = "m_generic" -sound_fight = "f_galleon" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 2 -defense = 3 -hitpoints = 20 -firepower = 1 -move_rate = 8 -vision_radius_sq = 4 -transport_cap = 4 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Submarine" -cargo = "Land", "LandNoKill", "LandAirSea", "Balloon" -flags = "BadCityDefender", "Provoking", "CanEscape", "CantReachAir" -roles = "Ferryboat", "FerryStartUnit", "BarbarianBoat" -helptext = _("\ -The Galleon is a heavily armed transport ship that can carry up to 4 units. Galleons can travel and attack on rivers,\ - and also do shore attacks.\ -"), _(" -Like most early sea units, when it initiates combat there will be 15 rounds\ - of combat and 15 total hitpoints lost between both units. This may or may not\ - result in the loss of one of the units.\ -"), _(" -Galleons can Stack-Escape: a 50% chance to escape a killed stack if they have more remaining moves than the attacker.\ -") - -[unit_frigate] -name = _("Frigate") -class = "RiverShip" -tech_req = "Magnetism" -obsolete_by = "Ironclad" -graphic = "u.frigate" -graphic_alt = "-" -sound_move = "m_frigate" -sound_move_alt = "m_generic" -sound_fight = "f_frigate" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 4 -defense = 3 -hitpoints = 20 -firepower = 1 -move_rate = 8 -vision_radius_sq = 4 -transport_cap = 2 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Submarine" -cargo = "Land", "LandNoKill", "LandAirSea" -bonuses = - { "flag", "type", "value" - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "Provoking", "CanEscape", "CantReachAir" -roles = "Hunter" -helptext = _("\ -The Frigate is versatile -- it's a superior offensive unit and also\ - a decent transport ship. Frigates can travel and attack on rivers, or make shore attacks\ - from sea.\ -"), _(" -From Frigates onward, all sea attacks end with a single victor.\ - Frigates can Stack-Escape: a 50% chance to escape a killed stack if they have more remaining move points than the attacker.\ -") - -[unit_ironclad] -name = _("Ironclad") -class = "Sea" -tech_req = "Steam Engine" -obsolete_by = "Destroyer" -graphic = "u.ironclad" -graphic_alt = "-" -sound_move = "m_ironclad" -sound_move_alt = "m_generic" -sound_fight = "f_ironclad" -sound_fight_alt = "f_generic" -build_cost = 60 -pop_cost = 0 -attack = 4 -defense = 4 -hitpoints = 30 -firepower = 1 -move_rate = 8 -vision_radius_sq = 8 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter" -bonuses = - { "flag", "type", "value" - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "CanEscape", "CantReachAir" -roles = "Hunter" -helptext = _("\ -The Ironclad is an armored ship that is much more sturdy than the Frigate but\ - loses transport capability and the ability to navigate rivers. From the Ironclad\ - onward, warships are excellent at attacking shore targets.\ -"), _(" -Ironclads and all modern ships can Stack-Escape: a 50% chance to escape a killed stack if they have more remaining move points than the attacker.\ -") - -[unit_destroyer] -name = _("Destroyer") -class = "Sea" -tech_req = "Electricity" -obsolete_by = "Missile Destroyer" -graphic = "u.destroyer" -graphic_alt = "-" -sound_move = "m_missile_destroyer" -sound_move_alt = "m_destroyer" -sound_fight = "f_missile_destroyer" -sound_fight_alt = "f_destroyer" -build_cost = 60 -pop_cost = 0 -attack = 5 -defense = 5 -hitpoints = 30 -firepower = 1 -move_rate = 12 -vision_radius_sq = 15 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter" -bonuses = - { "flag", "type", "value" - "Submarine", "DefenseMultiplier", 3 - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "CanEscape", "CantReachAir" -roles = "Hunter" -helptext = _("\ -Destroyers are the first of the modern ships to start your modern\ - navy. Their main roles are fast scouting, seek-and-destroy,\ - anti-submarine warfare, shore bombardment of lighter targets,\ - and supporting the needs of larger fleets. 4x ASW defence gives a\ - 35% chance defending vs Submarines.\ -") - -[unit_cruiser] -name = _("Cruiser") -class = "Sea" -tech_req = "Steel" -obsolete_by = "AEGIS Cruiser" -graphic = "u.cruiser" -graphic_alt = "-" -sound_move = "m_cruiser" -sound_move_alt = "m_generic" -sound_fight = "f_cruiser" -sound_fight_alt = "f_generic" -build_cost = 80 -pop_cost = 0 -attack = 6 -defense = 6 -hitpoints = 30 -firepower = 2 -move_rate = 11 -vision_radius_sq = 13 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter" -bonuses = - { "flag", "type", "value" - "Submarine", "DefenseMultiplier", 1 - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "CanEscape", "CantReachAir" -roles = "Hunter" -helptext = _("\ -The Cruiser is a large and fast surface warship with equally strong offensive and defensive strength. More often than not, its\ - 2x ASW defence allows it to survive a Submarine attack.\ -"), _("\ -The main duties of the Cruiser are offensive strikes against lesser ships, and escorting weaker ships.\ -") - -[unit_missile_destroyer] -name = _("Missile Destroyer") -class = "Sea" -tech_req = "Rocketry" -obsolete_by = "None" -graphic = "u.missile_destroyer" -graphic_alt = "u.destroyer" -sound_move = "m_destroyer" -sound_move_alt = "m_generic" -sound_fight = "f_destroyer" -sound_fight_alt = "f_generic" -build_cost = 60 -pop_cost = 0 -attack = 5 -defense = 5 -hitpoints = 30 -firepower = 2 -move_rate = 12 -vision_radius_sq = 16 -transport_cap = 1 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter" -cargo = "Missile" -bonuses = - { "flag", "type", "value" - "Submarine", "DefenseMultiplier", 1 - "Marines", "DefenseMultiplier", 1 - "AirAttacker", "DefenseMultiplier", 1 - "Missile", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "CanEscape", "CantReachAir" -roles = "Hunter" -helptext = _("\ -The Missile Destroyer has double the firepower of a Destroyer, and shares the same roles\ - as its ancestor. It gains 2x defense against Air and Missile units. It has a 2x ASW bonus\ - and can can carry one Missile.\ -") - -[unit_aegis_cruiser] -name = _("AEGIS Cruiser") -class = "Sea" -tech_req = "Rocketry" -obsolete_by = "None" -graphic = "u.aegis_cruiser" -graphic_alt = "-" -sound_move = "m_aegis_cruiser" -sound_move_alt = "m_generic" -sound_fight = "f_aegis_cruiser" -sound_fight_alt = "f_generic" -build_cost = 100 -pop_cost = 0 -attack = 8 -defense = 8 -hitpoints = 30 -firepower = 2 -move_rate = 11 -vision_radius_sq = 19 -transport_cap = 2 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Air", "AirProtect", "AirPillage", "Missile", "Helicopter", "Balloon", "Submarine" -cargo = "Missile" -bonuses = - { "flag", "type", "value" - "AirAttacker", "DefenseMultiplier", 2 - "Submarine", "DefenseMultiplier", 1 - "Marines", "DefenseMultiplier", 1 - "Missile", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "CanEscape", "AntiAir" -roles = "Hunter" -helptext = _("\ -The AEGIS Cruiser equipped with an Anti-Air missile system. Radar\ - gives superior vision and a 2x defense bonus against Submarines.\ - The AEGIS can carry two Missiles, and is the only ship that can attack\ - Air and Missile units.\ -"), _("\ - Superior vision and 3x Anti-Air bonus are ideal for scouting and escorting.\ -") - -[unit_battleship] -name = _("Battleship") -class = "Sea" -tech_req = "Refining" -obsolete_by = "None" -graphic = "u.battleship" -graphic_alt = "u.battleship" -sound_move = "m_battleship" -sound_move_alt = "m_generic" -sound_fight = "f_battleship" -sound_fight_alt = "f_generic" -build_cost = 160 -pop_cost = 0 -attack = 12 -defense = 12 -hitpoints = 40 -firepower = 2 -move_rate = 10 -vision_radius_sq = 12 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter" -bonuses = - { "flag", "type", "value" - "Submarine", "DefenseMultiplier", 1 - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "CanEscape", "CantReachAir" -roles = "" -helptext = _("\ -The Battleship is the supreme naval unit with excellent offensive and defensive strength. It has a 2x defense bonus vs Submarines.\ -") - -[unit_submarine] -name = _("Submarine") -class = "Submarine" -tech_req = "Automobile" -obsolete_by = "None" -graphic = "u.submarine" -graphic_alt = "-" -sound_move = "m_submarine" -sound_move_alt = "m_generic" -sound_fight = "f_submarine" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 12 -defense = 2 -hitpoints = 28 -firepower = 2 -move_rate = 10 -vision_radius_sq = 12 -transport_cap = 8 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Submarine" -cargo = "Missile" -vision_layer = "Subsurface" -bonuses = - { "flag", "type", "value" - "Submarine", "DefenseMultiplier", 1 - } -flags = "NeverProtects", "BadCityDefender", "Provoking", "Only_Native_Attack", "Submarine", "CanEscape", "CantReachAir" -roles = "Hunter" -helptext = _("\ -Submarines are strong attackers but weak defenders. They can carry 8 Missiles.\ - They are unreachable by Air units, but do not block air attacks on surface ships.\ - Submarines cannot attack units on shore.\ -"), _("\ -Submarines have superior attrition rates when attacking in numbers. They excel\ - at hit-and-run against weaker ships.\ -") - -[unit_carrier] -name = _("Carrier") -class = "Sea" -tech_req = "Advanced Flight" -obsolete_by = "None" -graphic = "u.carrier" -graphic_alt = "-" -sound_move = "m_carrier" -sound_move_alt = "m_generic" -sound_fight = "f_carrier" -sound_fight_alt = "f_generic" -build_cost = 160 -pop_cost = 0 -attack = 1 -defense = 9 -hitpoints = 40 -firepower = 2 -move_rate = 10 -vision_radius_sq = 12 -transport_cap = 8 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter" -cargo = "Air", "AirProtect", "AirPillage", "Missile", "Helicopter", "Balloon", "LandAirSea" -bonuses = - { "flag", "type", "value" - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "Only_Native_Attack", "Provoking", "CanEscape", "CantReachAir" -roles = "" -helptext = _("\ -The Carrier is a mobile airport that can carry Air units, Helicopters, AAA, Marines, and Missiles.\ -"), _("\ - Carriers are very expensive and thus, usually protected by a fleet of scouts and escorts.\ -") - -[unit_cargo_ship] -name = _("Cargo Ship") -class = "RiverShip" -tech_req = "Industrialization" -obsolete_by = "None" -graphic = "u.cargo_ship" -graphic_alt = "u.transport" -sound_move = "m_transport" -sound_move_alt = "m_transport" -sound_fight = "f_trireme" -sound_fight_alt = "f_generic" -build_cost = 45 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 30 -firepower = 1 -move_rate = 7 -vision_radius_sq = 4 -transport_cap = 4 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea", "Balloon" -flags = "BadCityDefender", "HelpWonder", "Traderoute", "NonMil", "HasNoZOC" -roles = "" -helptext = _("\ -Cargo ships are Commerce units: they can establish Trade Routes and help\ - build Wonders. They can travel rivers and oceans. Cargo ships can also carry\ - four land units: thus, they are useful for transporting units by river or sea.\ -") - -[unit_transport] -name = _("Transport") -class = "Sea" -tech_req = "Industrialization" -obsolete_by = "None" -graphic = "u.transport" -graphic_alt = "-" -sound_move = "m_transport" -sound_move_alt = "m_generic" -sound_fight = "f_transport" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 0 -defense = 3 -hitpoints = 30 -firepower = 1 -move_rate = 10 -vision_radius_sq = 12 -transport_cap = 8 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea", "Balloon" -bonuses = - { "flag", "type", "value" - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "Provoking", "CanEscape" -roles = "Ferryboat", "FerryStartUnit" -helptext = _("\ -The Transport cannot attack but can defend itself when under attack.\ - Marines and Anti-Aircraft Artillery can directly attack from a Transport. Its\ - large cargo capacity makes it a significant logistical upgrade in\ - sea transportation.\ -") - -[unit_cruise_missile] -name = _("Cruise Missile") -class = "Missile" -tech_req = "Rocketry" -obsolete_by = "None" -graphic = "u.cruise_missile" -graphic_alt = "-" -sound_move = "m_cruise_missile" -sound_move_alt = "m_generic" -sound_fight = "f_cruise_missile" -sound_fight_alt = "f_generic" -build_cost = 60 -pop_cost = 0 -attack = 18 -defense = 0 -hitpoints = 10 -firepower = 3 -move_rate = 24 -vision_radius_sq = 2 -transport_cap = 0 -fuel = 1 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -flags = "NeverProtects", "FieldUnit", "OneAttack", "HasNoZOC", "Unbribable", "CantReachAir", "Missile", "NeverBlocked" -roles = "" -helptext = _("\ -A Cruise Missile can strike distant targets. It\ - cannot attack Air units, but Air units never block\ - a strike on reachable surface units. Cruise Missiles\ - can be relocated by ending their turn on a city,\ - airbase, Submarine, Missile Destroyer, AEGIS Cruiser,\ - Carrier, or Mobile SAM. A Cruise Missile cannot\ - block attacks on other units on its tile.\ -") - -[unit_atom_bomb] -name = _("Atom Bomb") -class = "Bomb" -tech_req = "Nuclear Fission" -obsolete_by = "None" -graphic = "u.atom_bomb" -graphic_alt = "u.nuclear" -sound_move = "m_atomb_bomb" -sound_move_alt = "m_generic" -sound_fight = "f_atomb_bomb" -sound_fight_alt = "f_nuclear" -build_cost = 150 -pop_cost = 0 -attack = 99 -defense = 0 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 0 -transport_cap = 0 -fuel = 1 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter", "Air", "AirProtect", "AirPillage", "Missile", "Submarine" -disembarks = "Air", "AirPillage" -flags = "NeverProtects", "FieldUnit", "OneAttack", "Nuclear", "HasNoZOC", "Unbribable", "AirAttacker", "NeverBlocked" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "" -helptext = _("\ -If you have Nuclear Fission and the Manhattan Project has been built by any player, you can make Atom Bombs.\ - A Bomber can drop it within two tiles of its location. Unload the bomb and fly the Bomber out of range, then\ - attack the target (or detonate by pressing D twice.) The blast destroys ALL units in a 3x3 area. City population\ - is reduced by half. Land tiles may get nuclear fallout.\ -"), _("\ - Fallout reduces tile output and increases risk of nuclear winter.\ -") - -[unit_nuclear] -name = _("Nuclear Missile") -class = "Missile" -tech_req = "Space Flight" -obsolete_by = "None" -graphic = "u.nuclear" -graphic_alt = "-" -sound_move = "m_nuclear" -sound_move_alt = "m_generic" -sound_fight = "f_nuclear" -sound_fight_alt = "f_generic" -build_cost = 160 -pop_cost = 0 -attack = 99 -defense = 0 -hitpoints = 10 -firepower = 1 -move_rate = 24 -vision_radius_sq = 2 -transport_cap = 0 -fuel = 1 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter", "Air", "AirProtect", "AirPillage", "Missile", "Submarine" -flags = "NeverProtects", "FieldUnit", "OneAttack", "Nuclear", "HasNoZOC", "Unbribable", "NeverBlocked" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "" -helptext = _("\ -If you have Nuclear Fission and the Manhattan Project has been built by any player, you can make Nuclear Missiles.\ - Nuclear blasts destroy ALL units in a 3x3 area. City population is reduced by half. Land tiles may get nuclear fallout.\ - Fallout reduces tile output and increases risk of nuclear winter.\ -"), _("\ -If Fallout is cleaned on the turn it appears, the chance of nuclear winter is reduced.\ -") - -[unit_diplomat] -name = _("Diplomat") -class = "Land" -tech_req = "Writing" -obsolete_by = "Spy" -graphic = "u.diplomat" -graphic_alt = "-" -sound_move = "m_diplomat" -sound_move_alt = "m_generic" -sound_fight = "f_diplomat" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 0 -defense = 0 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -flags = "Diplomat", "IgZOC", "NonMil", "HasNoZOC", "Provoking", "Expellable" -veteran_names = - _("?diplomatic_rank:attaché"), - _("?diplomatic_rank:secretary"), - _("?diplomatic_rank:envoy"), - _("?diplomatic_rank:ambassador"), - _("?diplomatic_rank:emissary"), - _("?diplomatic_rank:statesman"), - _("?diplomatic_rank:plenipotentiary") - -veteran_raise_chance = 50, 33, 20, 15, 15, 15, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 105, 110, 115, 120, 125, 130 -veteran_move_bonus = 0, 0, 0, 0, 0, 0, 0 -roles = "DiplomatStartUnit" -helptext = _("\ -A Diplomat performs official or covert actions. Covert\ - acts make incidents which let\ - Senates break treaties. Diplomats in cities defend\ - such acts with combat. Diplomats can 1)Bribe a lone unit\ - 2)Establish embassy 3)Investigate City\ - 4)Sabotage production/buildings 5)Steal tech\ - 6)Steal maps 7)Incite city revolt.\n\ -"), _("\ -Full rules for Diplomats are in the Manual.\ -") - -[unit_spy] -name = _("Spy") -class = "Land" -tech_req = "Espionage" -obsolete_by = "None" -graphic = "u.spy" -graphic_alt = "-" -sound_move = "m_spy" -sound_move_alt = "m_generic" -sound_fight = "f_spy" -sound_fight_alt = "f_generic" -build_cost = 35 -pop_cost = 0 -attack = 0 -defense = 0 -hitpoints = 10 -firepower = 1 -move_rate = 6 -vision_radius_sq = 8 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -flags = "Diplomat", "IgZOC", "NonMil", "HasNoZOC", "Spy", - "Provoking", "Expellable" -veteran_names = - _("?spy_level:informant"), - _("?spy_level:handler"), - _("?spy_level:agent"), - _("?spy_level:operative"), - _("?spy_level:secret agent"), - _("?spy_level:neutralizer"), - _("?spy_level:spymaster") - -veteran_raise_chance = 50, 33, 20, 15, 15, 15, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 105, 110, 115, 120, 125, 130 -veteran_move_bonus = 0, 0, 0, 0, 0, 0, 0 -roles = "DiplomatStartUnit" -helptext = _("\ -Spies can do what a Diplomat can, and can also 1)Survive ops\ - 2)Sabotage lone units 3)Poison city water 4)Steal specific tech\ - 5)Steal tech from cities more than once 6)Sabotage specific targets.\ -"), _("\ - Spies who survive ops escape to the nearest friendly city.\ - Full rules are in the Manual.\ -") - -[unit_caravan] -name = _("Caravan") -class = "Land" -tech_req = "Trade" -obsolete_by = "Freight" -graphic = "u.caravan" -graphic_alt = "-" -sound_move = "m_caravan" -sound_move_alt = "m_generic" -sound_fight = "f_caravan" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -flags = "HelpWonder", "TradeRoute", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Expellable" -roles = "" -helptext = _("\ -Caravans are Commerce units. In cities with whom you are not at war, Commerce units\ - help build Wonders or set up Traderoutes, increasing net trade in both cities\ - relative to combined trade (minimum city distance: 12 tiles.) Routes are inactive in\ - war but renew if war ends. Caravans can enter the Marketplace of foreign cities to sell\ - goods: revenue derives from total trade in both cities. Commerce units can finish a Wonder\ - on the same turn it starts.\ -") - -[unit_freight] -name = _("Freight") -class = "Land" -tech_req = "The Corporation" -obsolete_by = "None" -graphic = "u.freight" -graphic_alt = "-" -sound_move = "m_freight" -sound_move_alt = "m_generic" -sound_fight = "f_freight" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -flags = "HelpWonder", "TradeRoute", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Expellable" -roles = "" -helptext = _("\ -The Freight unit replaces the Caravan as the basic Commerce unit on Land. It moves at\ - twice the speed. Each Freight used to build a wonder will add 50 shields. See the\ - entry on Caravan to read what Commerce units may do.\ -") - -[unit_explorer] -name = _("Explorer") -class = "Land" -tech_req = "Seafaring" -obsolete_by = "Partisan" -graphic = "u.explorer" -graphic_alt = "-" -sound_move = "m_explorer" -sound_move_alt = "m_generic" -sound_fight = "f_explorer" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -flags = "IgTer", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Expellable" -roles = "Explorer", "ExplorerStartUnit" -helptext = _("\ -Explorers are brave individuals who map unknown territory. They can slip through enemy\ - ZOC, and have no unit upkeep.\ -") - -[unit_leader] -name = _("?unit:Leader") -class = "Land" -tech_req = "None" -obsolete_by = "None" -graphic = "u.leader" -graphic_alt = "u.explorer" -sound_move = "m_leader" -sound_move_alt = "m_generic" -sound_fight = "f_leader" -sound_fight_alt = "f_generic" -build_cost = 10 -pop_cost = 0 -attack = 0 -defense = 2 -hitpoints = 20 -firepower = 1 -move_rate = 4 -vision_radius_sq = 8 -convert_to = "Queen" -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -flags = "IgZOC", "NonMil", "HasNoZOC", "NoBuild", "NoHome", "SuperSpy", - "EvacuateFirst", "Unbribable", "GameLoss", "Unique", - "Provoking" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "KingStartUnit" -helptext = _("\ -This is you. If you lose this unit, you lose the game.\ -"), _("\ -Will not unleash barbarians from huts.\ -"), _("\ -You can use the DO command to change the gender of the Leader.\ -") - -[unit_queen] -name = _("?unit:Queen") -class = "Land" -tech_req = "None" -obsolete_by = "None" -graphic = "u.queen" -graphic_alt = "u.leader" -sound_move = "m_leader" -sound_move_alt = "m_generic" -sound_fight = "f_leader" -sound_fight_alt = "f_generic" -build_cost = 10 -pop_cost = 0 -attack = 0 -defense = 2 -hitpoints = 20 -firepower = 1 -move_rate = 4 -vision_radius_sq = 8 -convert_to = "Leader" -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -flags = "IgZOC", "NonMil", "HasNoZOC", "NoBuild", "NoHome", "SuperSpy", - "EvacuateFirst", "Unbribable", "GameLoss", "Unique", - "Provoking" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "KingStartUnit" -helptext = _("\ -(Alternate form of Leader. Behaves identically in-game.)\ - This is you. If you lose this unit, you lose the game.\ -"), _("\ -Will not unleash barbarians from huts.\ -"), _("\ -You can use the DO command to change the gender of the Leader.\ -") - - -[unit_barbarian_leader] -name = _("Barbarian Leader") -class = "Land" -tech_req = "None" -obsolete_by = "None" -graphic = "u.barbarian_leader" -graphic_alt = "u.diplomat" -sound_move = "m_barbarian_leader" -sound_move_alt = "m_generic" -sound_fight = "f_barbarian_leader" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 0 -defense = 0 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -flags = "IgZOC", "NonMil", "HasNoZOC", "Unbribable", - "EvacuateFirst", "SuperSpy", "NoHome", "NoBuild" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "BarbarianLeader" -helptext = _("\ -One Barbarian Leader appears every time there is a barbarian uprising\ - somewhere in the world.\ -"), _("\ -When a Barbarian Leader is killed on a tile without any defending units,\ - the 100 gold ransom is paid, but only to land units and helicopters.\ -") diff --git a/freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/README.brava b/freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/README.brava deleted file mode 100644 index eab60b55a..000000000 --- a/freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/README.brava +++ /dev/null @@ -1,31 +0,0 @@ -AG: Avant-garde ruleset -------------------------------------- -LINKS: -Full Game Manual -Multiplayer II Summary -Design Log -... -Terrain -Bases -Combat -Governments -Economy -Diplomacy -Diplomatic Odds Charts -... -Terrain+Base Defense Bonus Quick-Reference -Hotkeys and Mouse Control - -The Avant-garde ruleset is a modernized ruleset to take advantage of cutting-edge advancements in Freeciv Server development. -Compared to Multiplayer-Evolution (MP2), the differences are that it is less restrained to keep the same "DNA" as the other -MP-branch rulesets, and allows itself to import features, improvements, and novel ideas from all other versions of Freeciv, -later versions of the commercial series, as well as original ideas from players. - -This ruleset began using MP2 as its base and added to it. Enjoy! - ------------------------------ -Changelog for MP2: ------------------------------ -Changelog - -END. \ No newline at end of file diff --git a/freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/changelog.txt b/freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/changelog.txt deleted file mode 100644 index 5c0ecafce..000000000 --- a/freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/changelog.txt +++ /dev/null @@ -1,28 +0,0 @@ -1. Spy Plane upgrades AWACS -2. Airplane can carry diplomatic units. - a. can be expelled by fighter types -3. Train - a. capturable - b. foot units can embark/disembark - c. unreachable to pre-gunpowder - d. cargo: any unit with <=2 moves, also balloons -4. Transporting units can't fortify until unloaded -5. Trade is no longer a requirement for making wonders. - Having the required tech for a Wonder is the defacto minimalist/elegant control over this. - Availability and ease of commerce units is another control on this anyway. - Removes the artificial impossibility of making Bronze Age wonders in Bronze Age -6. Commerce units with military abilities can enter waters of nations with whom they are at Peace, but still cannot attack until a war declaration. -7. Stone Age herds of wild game appear in forests for first 15 turns 2500BC), during the age before they are overhunted and learn to be wary of humans. - a. this smooths effect of luck on starting position; micro-accelerates the slower starting turns -8. Robotics needed for Plastics, forces Armor I to be required before Armor II -9. On average, Fallout lasts 5 turns before randomly disappearing. -10. Clean pollution can be done by foot soldiers and also while transported -11. New server setting killcitizen_pct defaults to 60% (doc it) -12. Ecclesiastical Palace price drop to 90. Like a Palace, relocates when the city is lost. -13. Pre-civilized tribes enjoy a +1/3 move bonus. Building your first city increases sedentary culture and eliminates the bonus. -14. Tribesmen -- allows defending a city, early exploring, but mostly, a better unit than Explorer for giving the ability to disband for early shield acceleration. -15. Explorer -- cost reduced to 25, req changed to Map Making (was Seafaring), slight vision boost from sqrt(4) to sqrt(5) -16. Sea Bridge -- can be built with Steel tech, requires Worker type on sea transport, 6 turns. MagLevs can also be made over them. - Trains on Sea Bridge use 1/3 move instead of 1/9. - - diff --git a/freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/default.lua b/freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/default.lua deleted file mode 100644 index 2145db452..000000000 --- a/freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/default.lua +++ /dev/null @@ -1,203 +0,0 @@ --- When creating new ruleset, you should copy this file only if you --- need to override default one. Usually you should implement your --- own scripts in ruleset specific script.lua. This way maintaining --- ruleset is easier as you do not need to keep your own copy of --- default.lua updated when ever it changes in Freeciv distribution. - --- Get gold from entering a hut. -function _deflua_hut_get_gold(unit, gold) - local owner = unit.owner - - notify.event(owner, unit.tile, E.HUT_GOLD, PL_("You found %d gold.", - "You found %d gold.", gold), - gold) - owner:change_gold(gold) -end - --- Default if intended hut behavior wasn`t possible. -function _deflua_hut_consolation_prize(unit) - _deflua_hut_get_gold(unit, 2) -end - --- Get a tech from entering a hut. -function _deflua_hut_get_tech(unit) - local owner = unit.owner - local tech = owner:give_tech(nil, -1, false, "hut") - - if tech then - notify.event(owner, unit.tile, E.HUT_TECH, - _("You found %s in ancient scrolls of wisdom."), - tech:name_translation()) - notify.research(owner, false, E.TECH_GAIN, - -- /* TRANS: One player got tech for the whole team. */ - _("The %s found %s in ancient scrolls of wisdom for you."), - owner.nation:plural_translation(), - tech:name_translation()) - notify.research_embassies(owner, E.TECH_EMBASSY, - -- /* TRANS: first %s is leader or team name */ - _("%s has acquired %s from ancient scrolls of wisdom."), - owner:research_name_translation(), - tech:name_translation()) - return true - else - return false - end -end - --- Get a mercenary unit from entering a hut. -function _deflua_hut_get_mercenaries(unit) - local owner = unit.owner - local type = find.role_unit_type('HutTech', owner) - - if not type or not type:can_exist_at_tile(unit.tile) then - type = find.role_unit_type('Hut', nil) - if not type or not type:can_exist_at_tile(unit.tile) then - type = nil - end - end - - if type then - notify.event(owner, unit.tile, E.HUT_MERC, - _("A band of friendly mercenaries joins your cause.")) - owner:create_unit(unit.tile, type, 0, unit:get_homecity(), -1) - return true - else - return false - end -end - --- Get new city from hut, or settlers (nomads) if terrain is poor. -function _deflua_hut_get_city(unit) - local owner = unit.owner - local settlers = find.role_unit_type('Cities', owner) - - if unit:is_on_possible_city_tile() then - owner:create_city(unit.tile, "") - notify.event(owner, unit.tile, E.HUT_CITY, - _("You found a friendly city.")) - return true - else - if settlers and settlers:can_exist_at_tile(unit.tile) then - notify.event(owner, unit.tile, E.HUT_SETTLER, - _("Friendly nomads are impressed by you, and join you.")) - owner:create_unit(unit.tile, settlers, 0, unit:get_homecity(), -1) - return true - else - return false - end - end -end - --- Get barbarians from hut, unless close to a city, king enters, or --- barbarians are disabled --- Unit may die: returns true if unit is alive -function _deflua_hut_get_barbarians(unit) - local tile = unit.tile - local type = unit.utype - local owner = unit.owner - - if server.setting.get("barbarians") == "DISABLED" - or unit.tile:city_exists_within_max_city_map(true) - or type:has_flag('Gameloss') then - notify.event(owner, unit.tile, E.HUT_BARB_CITY_NEAR, - _("An abandoned village is here.")) - return true - end - - local alive = tile:unleash_barbarians() - if alive then - notify.event(owner, tile, E.HUT_BARB, - _("You have unleashed a horde of barbarians!")); - else - notify.event(owner, tile, E.HUT_BARB_KILLED, - _("Your %s has been killed by barbarians!"), - type:name_translation()); - end - return alive -end - --- Randomly choose a hut event -function _deflua_hut_enter_callback(unit) - local chance = random(0, 6) - local alive = true - - if chance == 0 or chance == 1 then - _deflua_hut_get_gold(unit, 1) - elseif chance == 2 or chance == 3 then - _deflua_hut_get_gold(unit, 2) - elseif chance == 4 then - _deflua_hut_get_gold(unit, 5) - elseif chance == 5 then - _deflua_hut_get_gold(unit, 10) - elseif chance == 6 then - if not _deflua_hut_get_mercenaries(unit) then - _deflua_hut_consolation_prize(unit) - end - elseif chance == 7 then - alive = _deflua_hut_get_barbarians(unit) - end - - -- continue processing if unit is alive - return (not alive) -end - -signal.connect("hut_enter", "_deflua_hut_enter_callback") - --- Informs that the tribe has run away seeing your plane -function _deflua_hut_frighten_callback(unit, extra) - local owner = unit.owner - notify.event(owner, unit.tile, E.HUT_BARB, - _("Your overflight frightens the tribe;" - .. " they scatter in terror.")) - return true -end -signal.connect("hut_frighten", "_deflua_hut_frighten_callback") - - ---[[ - Make partisans around conquered city - - if requirements to make partisans when a city is conquered is fulfilled - this routine makes a lot of partisans based on the city`s size. - To be candidate for partisans the following things must be satisfied: - 1) The loser of the city is the original owner. - 2) The Inspire_Partisans effect must be larger than zero. - - If these conditions are ever satisfied, the ruleset must have a unit - with the Partisan role. - - In the default ruleset, the requirements for inspiring partisans are: - a) Guerilla warfare must be known by atleast 1 player - b) The player must know about Communism and Gunpowder - c) The player must run either a democracy or a communist society. -]]-- - -function _deflua_make_partisans_callback(city, loser, winner, reason) - if reason ~= 'conquest' or city:inspire_partisans(loser) <= 0 then - return - end - - local partisans = random(0, 1 + (city.size + 1) / 2) + 1 - if partisans > 8 then - partisans = 8 - end - city.tile:place_partisans(loser, partisans, city:map_sq_radius()) - notify.event(loser, city.tile, E.CITY_LOST, - _("The loss of %s has inspired partisans!"), city.name) - notify.event(winner, city.tile, E.UNIT_WIN_ATT, - _("The loss of %s has inspired partisans!"), city.name) -end - -signal.connect("city_transferred", "_deflua_make_partisans_callback") - - --- Notify player about the fact that disaster had no effect if that is --- the case -function _deflua_harmless_disaster_message(disaster, city, had_internal_effect) - if not had_internal_effect then - notify.event(city.owner, city.tile, E.DISASTER, - _("We survived the disaster without serious damage.")) - end -end - -signal.connect("disaster_occurred", "_deflua_harmless_disaster_message") diff --git a/freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/effects.ruleset b/freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/effects.ruleset deleted file mode 100644 index 9f27ac754..000000000 --- a/freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/effects.ruleset +++ /dev/null @@ -1,4941 +0,0 @@ -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes, -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -; Note that the freeciv AI may not cope well with anything more -; than minor changes. - -[datafile] -description="Avant-garde effects data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -; /* <-- avoid gettext warnings -; -; Effects -; -; type = What the effect does. Values of multiple active effects -; of the same type get summed for the total. -; See README.effects for list of possible types -; value = Value added for the effect type when this effect is active, -; i.e., all requirements are fulfilled -; multiplier = Name of the policy that gives a multiplier for effect's value -; reqs = Requirements for the effect to be active. -; See README.effects for help on requirements -; -; */ <-- avoid gettext warnings - -; Med. Bomber is a "Soft Field Unit." If non-aggressively deployed, 0 unhappy in Republic, -; 1 unhappy in Democracy: -[effect_medium_bomber_field_unit_minus_one] -type = "Peaceful_Field_Unit_Bonus" -value = 1 -reqs = - { "type", "name", "range", "present" - "UnitType", "Medium Bomber", "Local", TRUE - } - -; EXAMPLE OF HOW TO USE NEW Unit_Unhappy_Cost EFFECT, almost same -; as the above effect (don't use both!) -;[effect_medium_bomber_field_unit_minus_one] -;type = "Unit_Unhappy_Cost" -;value = -1 -;reqs = -; { "type", "name", "range", "present" -; "UnitType", "Medium Bomber", "Local", TRUE -; "UnitState","OnDomesticTile","Local", TRUE -; } - -; Combat_rounds for ancient ships -[effect_combat_rounds_riverships] -type = "Combat_Rounds" -value = 15 -reqs = - { "type", "name", "range", "present" - "UnitClass", "RiverShip", "Local", TRUE - "UnitType", "Frigate", "Local", FALSE - } -[effect_combat_rounds_trireme] -type = "Combat_Rounds" -value = 15 -reqs = - { "type", "name", "range", "present" - "UnitType", "Trireme", "Local", TRUE - } - -; Cheating AI effects are in separate file -*include "default/ai_effects.ruleset" - -[effect_unhappysize] -type = "City_Unhappy_Size" -value = 4 - -; Percent foreign citizens who are unhappy if at war -; with their original nation -[effect_angry_conquered] -type = "Enemy_Citizen_Unhappy_Pct" -value = 34 ; handles proper rounding for 1/3 - -; Barbarian effects -[effect_barb1] -type = "No_Diplomacy" -value = 1 -reqs = - { "type", "name", "range" - "NationGroup", "Barbarian", "Player" - } - -; Barbarian disappearance -[effect_barb_disappear] -type = "Retire_Pct" -value = 10 -reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", TRUE - "Age", "5", "Local", TRUE - "CityTile", "Center", "Local", FALSE - } - -; Lone Leader might escape on coast (33% chance) -; Complement of the two effects should be 0.9 * 0.66 = 0.594 -; (100 - 59) - 10 = 31 -[effect_leader_escape] -type = "Retire_Pct" -value = 31 -reqs = - { "type", "name", "range" - "UnitType", "Barbarian Leader", "Local" - "Age", "5", "Local" - "TerrainClass", "Oceanic", "Adjacent" - "MaxUnitsOnTile", "1", "Local" - } - -; Specialist output bonuses -[effect_elvis] -type = "Specialist_Output" -value = 2 -reqs = - { "type", "name", "range" - "Specialist", "elvis", "Local" - "OutputType", "luxury", "Local" - } - -[effect_scientist] -type = "Specialist_Output" -value = 3 -reqs = - { "type", "name", "range" - "Specialist", "scientist", "Local" - "OutputType", "science", "Local" - } - -[effect_taxman] -type = "Specialist_Output" -value = 3 -reqs = - { "type", "name", "range" - "Specialist", "taxman", "Local" - "OutputType", "gold", "Local" - } - -[effect_merchant] -type = "Specialist_Output" -value = 2 -reqs = - { "type", "name", "range" - "Specialist", "merchant", "Local" - "OutputType", "trade", "Local" - "Building", "A.Smith's Trading Co.", "Player" - } -[effect_merchant2] -type = "Specialist_Output" -value = 1 -reqs = - { "type", "name", "range" - "Specialist", "merchant", "Local" - "OutputType", "gold", "Local" - "Building", "A.Smith's Trading Co.", "Player" - } - -[effect_worker] -type = "Specialist_Output" -value = 1 -reqs = - { "type", "name", "range" - "Specialist", "worker", "Local" - "OutputType", "shield", "Local" - "Building", "A.Smith's Trading Co.", "Player" - } - -[effect_farmer] -type = "Specialist_Output" -value = 1 -reqs = - { "type", "name", "range" - "Specialist", "farmer", "Local" - "OutputType", "food", "Local" - "Building", "A.Smith's Trading Co.", "Player" - } - -; Vision benefit from mountains (for every land unit) -[effect_mountains_vision] -type = "Unit_Vision_Radius_Sq" -value = 5 -reqs = - { "type", "name", "range" - "Terrain", "Mountains", "Local" - "UnitClass", "Land", "Local" - } -[effect_mountains_vision_1] -type = "Unit_Vision_Radius_Sq" -value = 5 -reqs = - { "type", "name", "range" - "Terrain", "Mountains", "Local" - "UnitClass", "LandAirSea", "Local" - } -[effect_mountains_vision_2] -type = "Unit_Vision_Radius_Sq" -value = 5 -reqs = - { "type", "name", "range" - "Terrain", "Mountains", "Local" - "UnitClass", "LandNoKill", "Local" - } - -; basic free tech upkeep -[effect_upkeep_tech_free] -type = "Tech_Upkeep_Free" -value = 3 -; *************************** TRADE ROUTES **************************** -[effect_trade_routes] -type = "Max_Trade_Routes" -value = 1 - -;pow(2, value/1000) -> Base = 50% -; ------------ ESTABLISH TRADE ROUTE, ONE TIME BONUS ----------------- -;pow(2, value/1000) = 19% or about 1/5 of normal -[effect_base_trade_revenue_reduce] -type = "Trade_Revenue_Bonus" -value = -1000 - -;Total = 25% -[effect_railroad_trade_revenue_reduce] -type = "Trade_Revenue_Bonus" -value = -1000 -reqs = - { "type", "name", "range" - "Tech", "Railroad", "Player" - } -;Total = 25% -[effect_flight_trade_revenue_reduce] -type = "Trade_Revenue_Bonus" -value = -1000 -reqs = - { "type", "name", "range" - "Tech", "Flight", "Player" - } - - -;If you don't acquire ongoing trade revenue from a trade route, -;a DECREASE in one-time bonus made NO SENSE AT ALL, -;Now it's a one time bonus with potentially slight ROI. -[effect_enter_marketplace_bonus_increase] -type = "Trade_Revenue_Bonus" -value = 2000 -reqs = - { "type", "name", "range" - "Action", "Enter Marketplace", "Local" - } -;TO-DO: pay x more than gold value of vessel entering marketplace, with ROI being somewhat inferior to most -;investments but hinting toward same order of magnitude. - -[effect_establish_traderoute_bonus] -type = "Trade_Revenue_Bonus" -value = -2400 -;this -2400 should go into base effect above -;then reqs action = "Establish Trade Route" can be an increase to counter both the -2400 subtracted above then to -;further tune upward any one time bonus to what it needs to be. reqs can look at unit type also to compensate higher cost -;of making certain units, since route-creating units now vary from 20 shields to 50 shields in cost. - -; ***************************** SEA UNIT REPAIR ******************************* -; Sea units have crews which pro-actively repair damage regardless of movement. -; This is almost comparable to land unit healing. Sea units being "Use once -; and dispose", and/or unable to re-enter action for literally centuries, had -; created issues in realism, playability, and balance. 8% repair/turn effect: -; 10hp units: +0 hp/turn 20hp units: +1 hp/turn -; 30hp units: +2 hp/turn 40hp units: +3 hp/turn -;[effect_sea_hp_regen] -;type = "Unit_Recover_Pct" -;value = 8 -;reqs = -; { "type", "name", "range" -; "UnitClass", "Sea", "Local" -; } -;[effect_sub_hp_regen] -;type = "Unit_Recover_Pct" -;value = 8 -;reqs = -; { "type", "name", "range" -; "UnitClass", "Submarine", "Local" -; } -;[effect_rivership_hp_regen] -;type = "Unit_Recover_Pct" -;value = 8 -;reqs = -; { "type", "name", "range" -; "UnitClass", "RiverShip", "Local" -; } -; The effects above replace the effects below after Unit_Recover_Pct is up -; The effects below substitute if Unit_Recover_Pct is missing from server -[effect_sea_hp_regen] -type = "Unit_Recover" ;30 hp units get + 2 -value = 2 -reqs = - { "type", "name", "range" - "UnitClass", "Sea", "Local" - } -[effect_sub_hp_regen] ;30 hp units get + 2 -type = "Unit_Recover" -value = 2 -reqs = - { "type", "name", "range" - "UnitClass", "Submarine", "Local" - } -[effect_rivership_hp_regen] ;20 hp units get + 1 -type = "Unit_Recover" -value = 1 -reqs = - { "type", "name", "range", "present" - "UnitClass", "RiverShip", "Local", TRUE - "UnitType", "Boat", "Local", FALSE ;have to exclude all 10hp ships - "UnitType", "Galley", "Local", FALSE - "UnitType", "War Galley", "Local", FALSE - "UnitType", "Longboat", "Local", FALSE - "UnitType", "Caravel", "Local", FALSE - "UnitType", "Ram Ship", "Local", FALSE - } -[effect_battleship_hp_regen] ;40 hp units get + 3 -type = "Unit_Recover" -value = 1 ; 2+1=3 -reqs = - { "type", "name", "range" - "UnitType", "Battleship", "Local" - } -[effect_carrier_hp_regen] ;40 hp units get + 3 -type = "Unit_Recover" -value = 1 ; 2+1=3 -reqs = - { "type", "name", "range" - "UnitType", "Carrier", "Local" - } - -; *********************************** BASES ******************************* - -; **** FORT ***** -[effect_fort_defense] -type = "Defend_Bonus" -value = 33 -reqs = - { "type", "name", "range", "present" - "Extra", "Fort", "Local", TRUE - "Extra", "Fortress", "Local", FALSE ; Fortress calculated separately even if a fort is under it. - "Extra", "Naval Base", "Local", FALSE ; Naval base calculated separately even if a fort is under it. - "UnitClass", "Helicopter", "Local", FALSE ; ... these attackers do not activate Fort defense bonus - "UnitClass", "Air", "Local", FALSE ; ... " " " " " " " " - "UnitClass", "AirPillage", "Local", FALSE ; ... " " " " " " " " - "UnitClass", "AirProtect", "Local", FALSE ; ... " " " " " " " " - "UnitType", "Armor", "Local", FALSE ; ... " " " " " " " " - "UnitType", "Armor II", "Local", FALSE ; ... " " " " " " " " - } -; Fort HP regen -[effect_fort_hp_regen] -type = "HP_Regen" -value = 10 -reqs = - { "type", "name", "range" - "Extra", "Fort", "Tile" - "UnitClass", "Land", "Local" - } -[effect_fort_hp_regen_1] -type = "HP_Regen" -value = 10 -reqs = - { "type", "name", "range" - "Extra", "Fort", "Tile" - "UnitClass", "LandAirSea", "Local" - } -[effect_fort_hp_regen_2] -type = "HP_Regen" -value = 10 -reqs = - { "type", "name", "range" - "Extra", "Fort", "Tile" - "UnitClass", "LandNoKill", "Local" - } - -; **** FORTRESS/NAVAL BASE *************************************************** - -; Adjust the 1.67xdefense_bonus in terrain.ruleset for some attackers: -; **************************************************************************** -[effect_nonfortbuster_vs_fortress] -type = "Defend_Bonus" -value = 20 ;increase 1.67x to 2x except when defending against FortBuster types. -;note: 1.20*1.67=2.0 (this bonus is multiplied after terrain defense_bonus was multiplied) -reqs = - { "type", "name", "range", "present" - "Extra", "Fortress", "Local", TRUE - "UnitFlag", "FortBuster", "Local", FALSE - "UnitFlag", "FortressBuster", "Local", FALSE - "UnitFlag", "AirAttacker", "Local", FALSE - } -[effect_nonfortbuster_vs_navalbase] ;same as above but for naval base -type = "Defend_Bonus" -value = 20 ;increase 1.67x to 2x except when defending against FortBuster types. -;note: 1.20*1.67=2.0 (this bonus is multiplied after terrain defense_bonus was multiplied) -reqs = - { "type", "name", "range", "present" - "Extra", "Naval Base", "Local", TRUE - "UnitFlag", "FortBuster", "Local", FALSE - "UnitFlag", "FortressBuster", "Local", FALSE - "UnitFlag", "AirAttacker", "Local", FALSE - } -[effect_fortressbuster_fortress] -type = "Attack_Bonus" -value = 67 ;Cancel defender's 1.67x with attacker getting 1.67x -reqs = - { "type", "name", "range", "present" - "Extra", "Fortress", "Local", TRUE - "UnitFlag", "FortressBuster", "Local", TRUE - } -[effect_fortressbuster_navalbase] -type = "Attack_Bonus" -value = 67 ;Cancel defender's 1.67x with attacker getting 1.67x -reqs = - { "type", "name", "range", "present" - "Extra", "Naval Base", "Local", TRUE - "UnitFlag", "FortressBuster", "Local", TRUE - } - -; ****** ^^ defense_bonus_correctives ^^ ************************************* - -; Vision benefit from fortress watchtowers -[effect_fortress_vision] -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "tile" - "Tech", "Invention", "Player" - "UnitClass", "Land", "Local" - } -[effect_fortress_vision_1] ;Marines, AAA -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "tile" - "Tech", "Invention", "Player" - "UnitClass", "LandAirSea", "Local" - } -[effect_fortress_vision_2] ;Knights -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "tile" - "Tech", "Invention", "Player" - "UnitClass", "LandNoKill", "Local" - } - -; Fortress HP regen -[effect_fortress_hp_regen] -; Cumulative with fort: 10+15=25 -type = "HP_Regen" -value = 15 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "Tile" - "UnitClass", "Land", "Local" - } -[effect_fortress_hp_regen_1] -type = "HP_Regen" -value = 15 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "Tile" - "UnitClass", "LandAirSea", "Local" - } -[effect_fortress_hp_regen_2] -type = "HP_Regen" -value = 15 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "Tile" - "UnitClass", "LandNoKill", "Local" - } -[effect_fortress_hp_regen_3] -type = "HP_Regen" -value = 25 ;25 because not cumulative with Fort -reqs = - { "type", "name", "range" - "Extra", "Fortress", "Tile" - "UnitClass", "Helicopter", "Local" - } - -[effect_airbase_hp_regen] -type = "HP_Regen" -value = 25 -reqs = - { "type", "name", "range" - "Extra", "Airbase", "Tile" - "UnitClass", "Helicopter", "Local" - } -[effect_airbase_hp_regen1] -type = "HP_Regen" -value = 15 -reqs = - { "type", "name", "range" - "Extra", "Airbase", "Tile" - "UnitClass", "AirProtect", "Local" - } -[effect_airbase_hp_regen2] -type = "HP_Regen" -value = 15 -reqs = - { "type", "name", "range" - "Extra", "Airbase", "Tile" - "UnitClass", "Air", "Local" - } -[effect_airbase_hp_regen3] -type = "HP_Regen" -value = 15 -reqs = - { "type", "name", "range" - "Extra", "Airbase", "Tile" - "UnitClass", "AirPillage", "Local" - } - -; ****************** NAVAL BASE ****************************** -[effect_navbase_vision] -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "tile" - "Tech", "Invention", "Player" - "UnitClass", "Trireme", "Local" - } -[effect_navbase_vision1] -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "tile" - "Tech", "Invention", "Player" - "UnitClass", "RiverShip", "Local" - } -[effect_navbase_vision2] -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "tile" - "Tech", "Invention", "Player" - "UnitClass", "Sea", "Local" - } -; Naval Base HP regen -[effect_navbase_hp_regen] -type = "HP_Regen" -value = 20 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "Tile" - "UnitClass", "Sea", "Local" - } -[effect_navbase_hp_regen_1] -type = "HP_Regen" -value = 20 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "Tile" - "UnitClass", "RiverShip", "Local" - } -[effect_navbase_hp_regen_2] -type = "HP_Regen" -value = 20 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "Tile" - "UnitClass", "Trireme", "Local" - } -[effect_navbase_hp_regen_3] -type = "HP_Regen" -value = 20 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "Tile" - "UnitClass", "Submarine", "Local" - } -; *********************************************************** - -; Base vision range - radius of vision is sqrt(5) = 2.24 -[effect_city_vision] -type = "City_Vision_Radius_Sq" -value = 5 - -;PERCENTAGE CHANCE OF STEALING A TECH WHEN CONQUERING A CITY. -[effect_conquest_tech] -type = "Conquest_Tech_Pct" -value = 100 - -;Freshly fueled full hp helicopters get +1 move per turn -[effect_fresh_helicopter] -type = "Move_Bonus" -value = 9 -reqs = - { "type", "name", "range" - "UnitClass", "Helicopter", "Local" - "Extra", "Airbase", "Local" - } -;Freshly fueled full hp helicopters get +1 move per turn -[effect_fresh_helicopter2] -type = "Move_Bonus" -value = 9 -reqs = - { "type", "name", "range" - "UnitClass", "Helicopter", "Local" - "CityTile", "Center", "Local" - } - -; Nuclear power gives +1 moves to sea units (+2 under 2x) -[effect_nuclear_powered_boats] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Tech", "Nuclear Power", "Player" - "UnitClass", "Sea", "Local" - } -; Nuclear power gives +1 moves to sea units (+2 under 2x) -[effect_nuclear_powered_subs] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Tech", "Nuclear Power", "Player" - "UnitClass", "Submarine", "Local" - } - -[effect_anarchy_upkeep] -type = "Upkeep_Free" -value = 99 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } -[effect_upkeep_communism] -type = "Upkeep_Free" -value = 1 -reqs = - { "type", "name", "range", "quiet" - "Gov", "Communism", "Player", TRUE - } - -[effect_anarchy_upkeep_tech_free] -type = "Tech_Upkeep_Free" -value = 9999 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_republic] -type = "Make_Content_Mil" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_corruption_anarchy0] -type = "Output_Waste" -value = 25 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_anarchy1] -type = "Output_Waste_By_Distance" -value = 200 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_despotism0] -type = "Output_Waste" -value = 37 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_despotism1] -type = "Output_Waste_By_Distance" -value = 400 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_monarchy0] -type = "Output_Waste" -value = 15 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_monarchy1] -type = "Output_Waste_By_Distance" -value = 200 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_communism0] -type = "Output_Waste" -value = 20 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_republic0] -type = "Output_Waste" -value = 15 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_republic1] -type = "Output_Waste_By_Distance" -value = 200 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - "OutputType", "Trade", "Local" - } - -[effect_base_unit_upkeep] -type = "Upkeep_Factor" -value = 1 - -[effect_republic_unit_upkeep] -type = "Upkeep_Factor" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - "OutputType", "Food", "Local" - } - -[effect_democracy_unit_upkeep] -type = "Upkeep_Factor" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - "OutputType", "Food", "Local" - } - -[effect_republic_unit_unhappiness] -type = "Unhappy_Factor" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_democracy_unit_unhappiness] -type = "Unhappy_Factor" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_upkeep_free_units_anarchy] -type = "Unit_Upkeep_Free_Per_City" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - "OutputType", "Shield", "Local" - } - -[effect_upkeep_free_units_despotism] -type = "Unit_Upkeep_Free_Per_City" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - "OutputType", "Shield", "Local" - } - -[effect_upkeep_free_units_monarchy] -type = "Unit_Upkeep_Free_Per_City" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - "OutputType", "Shield", "Local" - } - -[effect_upkeep_free_units_communism] -type = "Unit_Upkeep_Free_Per_City" -value = 4 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - "OutputType", "Shield", "Local" - } - -[effect_civil_war_0] -type = "Civil_War_Chance" -value = 90 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_civil_war_1] -type = "Civil_War_Chance" -value = 80 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_civil_war_2] -type = "Civil_War_Chance" -value = 70 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -[effect_civil_war_3] -type = "Civil_War_Chance" -value = 50 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - } - -[effect_civil_war_4] -type = "Civil_War_Chance" -value = 40 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_civil_war_5] -type = "Civil_War_Chance" -value = 30 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_empire_size_base_0] -type = "Empire_Size_Base" -value = 9 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_empire_size_base_1] -type = "Empire_Size_Base" -value = 10 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_empire_size_base_2] -type = "Empire_Size_Base" -value = 11 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -[effect_empire_size_base_3] -type = "Empire_Size_Base" -value = 12 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - } - -[effect_empire_size_base_4] -type = "Empire_Size_Base" -value = 13 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_empire_size_base_5] -type = "Empire_Size_Base" -value = 14 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_empire_size_base_6] -type = "Empire_Size_Base" -value = 14 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_empire_size_step_0] -type = "Empire_Size_Step" -value = 6 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_empire_size_step_1] -type = "Empire_Size_Step" -value = 10 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_empire_size_step_2] -type = "Empire_Size_Step" -value = 12 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -; Empire_Size_Step disabled for Communism - -[effect_empire_size_step_3] -type = "Empire_Size_Step" -value = 14 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_empire_size_step_4] -type = "Empire_Size_Step" -value = 16 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_empire_size_step_5] -type = "Empire_Size_Step" -value = 15 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_max_rates_0] -type = "Max_Rates" -value = 100 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_max_rates_1] -type = "Max_Rates" -value = 60 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_max_rates_2] -type = "Max_Rates" -value = 70 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -[effect_max_rates_3] -type = "Max_Rates" -value = 80 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - } - -[effect_max_rates_4] -type = "Max_Rates" -value = 80 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_max_rates_5] -type = "Max_Rates" -value = 100 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_martial_law_each_0] -type = "Martial_Law_Each" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_martial_law_each_1] -type = "Martial_Law_Each" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_martial_law_each_2] -type = "Martial_Law_Each" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -[effect_martial_law_each_3] -type = "Martial_Law_Each" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - } - -[effect_martial_law_each_4] -type = "Martial_Law_Each" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_martial_law_max_0] -type = "Martial_Law_Max" -value = 100 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_martial_law_max_1] -type = "Martial_Law_Max" -value = 100 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_martial_law_max_2] -type = "Martial_Law_Max" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -[effect_martial_law_max_3] -type = "Martial_Law_Max" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - } - -[effect_martial_law_max_4] -type = "Martial_Law_Max" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_rapture_grow_0] -type = "Rapture_Grow" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_rapture_grow_1] -type = "Rapture_Grow" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_communism_0] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - "UnitFlag", "Diplomat", "Local" - } - -[effect_gov_tile_bonus_anarchy] -type = "Output_Penalty_Tile" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_gov_tile_bonus_despotism] -type = "Output_Penalty_Tile" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_gov_tile_bonus_2] -type = "Output_Inc_Tile_Celebrate" -value = 1 -reqs = - { "type", "name", "range" - "OutputType", "Trade", "Local" - "Gov", "Monarchy", "Player" - } - -[effect_gov_tile_bonus_3] -type = "Output_Inc_Tile_Celebrate" -value = 1 -reqs = - { "type", "name", "range" - "OutputType", "Trade", "Local" - "Gov", "Communism", "Player" - } - -[effect_gov_tile_bonus_4] -type = "Output_Inc_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - "OutputType", "Trade", "Local" - } - -[effect_gov_tile_bonus_5] -type = "Output_Inc_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_gov_tile_bonus_6] -type = "Output_Inc_Tile_Celebrate" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Trade", "Local" - } - -[effect_revolution_0] -type = "Revolution_Unhappiness" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_senate_0] -type = "Has_Senate" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_senate_1] -type = "Has_Senate" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_partisans_communism] -type = "Inspire_Partisans" -value = 1 -reqs = - { "type", "name", "range", "present" - "Gov", "Communism", "Player", TRUE - "Tech", "Communism", "Player", TRUE - "Tech", "Gunpowder", "Player", TRUE - "Tech", "Guerilla Warfare", "World", TRUE - "NationGroup", "Barbarian", "Player", FALSE - } - -[effect_partisans_democracy] -type = "Inspire_Partisans" -value = 1 -reqs = - { "type", "name", "range", "present" - "Gov", "Democracy", "Player", TRUE - "Tech", "Communism", "Player", TRUE - "Tech", "Gunpowder", "Player", TRUE - "Tech", "Guerilla Warfare", "World", TRUE - "NationGroup", "Barbarian", "Player", FALSE - } - -[effect_airport_2] -type = "Airlift" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Airport", "City" - } - -[effect_airport_v0] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Airport", "City", TRUE - "UnitClass", "Air", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_airport_v1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Airport", "City", TRUE - "UnitClass", "AirProtect", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_airport_v2] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Airport", "City", TRUE - "UnitClass", "AirPillage", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_airport_v3] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Airport", "City", TRUE - "UnitClass", "Helicopter", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_airport_v4] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Airport", "City", TRUE - "UnitClass", "Missile", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } - -[effect_airport_h1] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Airport", "City" - "UnitClass", "Air", "Local" - } -[effect_airport_h2] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Airport", "City" - "UnitClass", "AirProtect", "Local" - } -[effect_airport_h3] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Airport", "City" - "UnitClass", "AirPillage", "Local" - } -[effect_airport_h4] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Airport", "City" - "UnitClass", "Helicopter", "Local" - } - -; Base max city size of 8 -[effect_aqueduct_size] -type = "Size_Adj" -value = 8 - -[effect_aqueduct] -type = "Size_Adj" -value = 4 -reqs = - { "type", "name", "range" - "Building", "Aqueduct", "City" - } - -[effect_aqueduct_health] -type = "Health_Pct" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Aqueduct", "City" - } - -[effect_bank] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - "Building", "Bank", "City" - "OutputType", "Gold", "Local" - } - -[effect_bank_1] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - "Building", "Bank", "City" - "OutputType", "Luxury", "Local" - } - -[effect_barracks] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "Land", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_a] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "Land", "Local", TRUE - } -[effect_barracks_b] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE ; might be resting in allied city with Barracks I - } -[effect_barracks_c] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - } - -[effect_barracks_ii] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "Land", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_ii_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_ii_2] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_ii_a] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "Land", "Local", TRUE - } -[effect_barracks_ii_b] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - } -[effect_barracks_ii_c] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - } - -[effect_barracks_iii] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "Land", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_iii_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_iii_2] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_iii_a] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Barracks III", "City" - "UnitClass", "Land", "Local" - } -[effect_barracks_iii_b] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - } -[effect_barracks_iii_c] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - } - -;prolongs time-window relevance of amphibious invasions later in game -[effect_triple_training_marines] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "Building", "Port Facility", "City", TRUE - "Building", "Airport", "City", TRUE - "UnitType", "Marines", "Local", TRUE - } - -;--- STANDARD CATHEDRAL sans Michelangelo ------------------------ -[effect_cathedral] -type = "Make_Content" -value = 3 -reqs = - { "type", "name", "range", "present" - "Building", "Cathedral", "City", TRUE - "Building", "Michelangelo's Chapel", "Player", FALSE - } -[effect_cathedral_1] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range", "present" - "Tech", "Theology", "Player", TRUE - "Building", "Cathedral", "City", TRUE - "Building", "Michelangelo's Chapel", "Player", FALSE - } -[effect_cathedral_2] -type = "Make_Content" -value = -1 -reqs = - { "type", "name", "range", "present" - "Gov", "Communism", "Player", TRUE - "Building", "Cathedral", "City", TRUE - "Building", "Michelangelo's Chapel", "Player", FALSE - } -;--- ENHANCED CATHEDRAL with Michelangelo: *** -[effect_cathedral_ma] -type = "Make_Happy" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Cathedral", "City", TRUE - "Building", "Michelangelo's Chapel", "Player", TRUE - } -[effect_cathedral_ma2] -type = "Force_Content" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Cathedral", "City", TRUE - "Building", "Michelangelo's Chapel", "Player", TRUE - } -;------------------------------------------------------------ -[effect_city_walls] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "UnitClass", "Land", "Local", TRUE -; "Building", "Great Wall", "Player", FALSE - "UnitType", "Howitzer", "Local", FALSE - } -[effect_city_walls_0] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "UnitClass", "Helicopter", "Local", TRUE -; "Building", "Great Wall", "Player", FALSE - } -[effect_city_walls_0a] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE -; "Building", "Great Wall", "Player", FALSE - "UnitType", "Howitzer", "Local", FALSE - } -[effect_city_walls_0b] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE -; "Building", "Great Wall", "Player", FALSE - "UnitType", "Howitzer", "Local", FALSE - } -[effect_city_walls_1] -type = "Unit_No_Lose_Pop" -value = 1 -reqs = - { "type", "name", "range" - "Building", "City Walls", "City" - } -[effect_city_walls_visible] -type = "Visible_Walls" -value = 1 -reqs = - { "type", "name", "range" - "Building", "City Walls", "City" - } - -[effect_coastal_defense] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Coastal Defense", "City" - "UnitClass", "Sea", "Local" - } -[effect_coastal_defense_1] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Coastal Defense", "City" - "UnitClass", "RiverShip", "Local" - } -[effect_coastal_defense_2] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Coastal Defense", "City" - "UnitClass", "Submarine", "Local" - } -[effect_coastal_defense_trireme] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Coastal Defense", "City" - "UnitClass", "Trireme", "Local" - } - -[effect_gibraltar_fortress] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Gibraltar Fortress", "Player", TRUE - "Building", "Coastal Defense", "City", FALSE - "UnitClass", "Sea", "Local" - } -[effect_gibraltar_fortress_1] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Gibraltar Fortress", "Player", TRUE - "Building", "Coastal Defense", "City", FALSE - "UnitClass", "RiverShip", "Local" - } -[effect_gibraltar_fortress_2] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Gibraltar Fortress", "Player", TRUE - "Building", "Coastal Defense", "City", FALSE - "UnitClass", "Submarine", "Local" - } -[effect_gibraltar_fortress_trireme] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Gibraltar Fortress", "Player", TRUE - "Building", "Coastal Defense", "City", FALSE - "UnitClass", "Trireme", "Local" - } - -[effect_amphitheatre] -type = "Make_Content" -value = 3 -reqs = - { "type", "name", "range" - "Building", "Amphitheatre", "City" - } - -[effect_amphitheatre_1] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Tech", "Electricity", "Player" - "Building", "Amphitheatre", "City" - } - -; BECAUSE OF ROUNDING, AVERAGE EFFECT OF 50 ENDS UP BEING 41%, WHEREAS 60 YIELDS ABOUT 53% WHICH IS CLOSER TO ADVERTISED -[effect_courthouse_corruption1] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "OutputType", "Trade", "Local", TRUE - } -[effect_courthouse_corruption2] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "OutputType", "shield", "local", TRUE - } -[effect_courthouse_tile_corruption] ; Removes output penalties (Despotism/Anarchy) for cities with courthouses -type = "Output_Penalty_Tile" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Courthouse", "City", TRUE - } -[effect_courthouse_democracy] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - "Building", "Courthouse", "City" - } -[effect_courthouse_incite_cost_occupied] -type = "Incite_Cost_Pct" -value = 300 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "MaxUnitsOnTile", "0", "Local", FALSE - } -[effect_courthouse_incite_cost_empty] -type = "Incite_Cost_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - "Building", "Courthouse", "City", TRUE - } -[effect_courthouse_upkeep] ; Law and order provides +1 upkeep -type = "Unit_Upkeep_Free_Per_City" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Courthouse", "City", TRUE - "OutputType", "Shield", "Local" - } -[effect_courthouse_spy_resistance] -type = "Spy_Resistant" -value = 25 ;25% reduction of 50% base chance is 12.5% bonus. 50%-12.5%=37.5% success rate - ; No protection= 1/2, HL = 3/8, CH+HL = 1/4, CH+HL+PS = 1/8 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - } -[effect_courthouse_hostile_diplomat0] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Steal Tech", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_1] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Steal Tech Escape Expected", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_2] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Targeted Steal Tech", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_3] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_4] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Sabotage City", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_5] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Sabotage City Escape", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_6] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Targeted Sabotage City", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_7] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Targeted Sabotage City Escape", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_8] -type = "Action_Odds_Pct" -value = -25 ;40 minus 25%*80 = 20% -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Steal Maps Escape", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_9] -type = "Action_Odds_Pct" -value = -25 ;40 minus 25%*80 = 20% -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Steal Maps", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_10] -type = "Action_Odds_Pct" -value = -25 ;40 minus 25%*80 = 20% -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Poison City Escape", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_11] -type = "Action_Odds_Pct" -value = -25 ;40 minus 25%*80 = 20% -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Incite City", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_12] -type = "Action_Odds_Pct" -value = -25 ;40 minus 25%*80 = 20% -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Incite City Escape", "Local", TRUE - } - -[effect_diplomat_defense_fortress] -type = "Spy_Resistant" -value = 25 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "Local" - } - -[effect_incite_cost_empty] -type = "Incite_Cost_Pct" -value = -50 -reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - "Building", "Courthouse", "City", FALSE - "Building", "Supreme Court", "Player", FALSE - } - -[effect_factory] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Factory", "City" - "OutputType", "Shield", "Local" - } - -[effect_fusion_reactor] -type = "Output_Bonus" -value = 75 -reqs = - { "type", "name", "range" - "Building", "Fusion Reactor", "City" - "OutputType", "Shield", "Local" - } -[effect_fusion_reactor1] -type = "Unit_Upkeep_Free_Per_City" -value = 5 -reqs = - { "type", "name", "range" - "Building", "Fusion Reactor", "City", TRUE - "OutputType", "Shield", "Local" - } -[effect_fusion_reactor2] -type = "City_Build_Slots" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Fusion Reactor", "City", TRUE - } - -[effect_granary] -type = "Growth_Food" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Granary", "City" - } - -[effect_harbour] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "TerrainClass", "Oceanic", "Local" - "Building", "Harbour", "City" - "OutputType", "Food", "Local" - } - -[effect_deer] -type = "Output_Add_Tile" -value = 3 -reqs = - { "type", "name", "range" - "Extra", "Deer", "Local" - "OutputType", "Food", "Local" - } - -[effect_wild_boar] -type = "Output_Add_Tile" -value = 3 -reqs = - { "type", "name", "range" - "Extra", "Wild Boar", "Local" - "OutputType", "Food", "Local" - } - -[effect_hydro_plant] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Hydro Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_hydro_plant_1] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Hydro Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_hydro_plant_2] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Hydro Plant", "City", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_hydro_plant_3] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Hydro Plant", "City", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_library] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Library", "City" - "OutputType", "Science", "Local" - } - -[effect_marketplace] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - "OutputType", "Gold", "Local" - } - -[effect_marketplace_1] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - "OutputType", "Luxury", "Local" - } - -; No population pollution until certain techs researched -[effect_pollu_pop_base] -type = "Pollu_Pop_Pct_2" -value = -100 - -[effect_pollu_pop_automobile] -type = "Pollu_Pop_Pct_2" -value = 25 -reqs = - { "type", "name", "range" - "Tech", "Automobile", "Player" - } - -[effect_pollu_pop_industrialization] -type = "Pollu_Pop_Pct_2" -value = 25 -reqs = - { "type", "name", "range" - "Tech", "Industrialization", "Player" - } - -[effect_pollu_pop_mass_production] -type = "Pollu_Pop_Pct_2" -value = 25 -reqs = - { "type", "name", "range" - "Tech", "Mass Production", "Player" - } - -[effect_pollu_pop_plastics] -type = "Pollu_Pop_Pct_2" -value = 25 -reqs = - { "type", "name", "range" - "Tech", "Plastics", "Player" - } - -[effect_mass_transit] -type = "Pollu_Pop_Pct" -value = -100 -reqs = - { "type", "name", "range" - "Building", "Mass Transit", "City" - } -; Increased citizen mobility and ticket revenues increase city base trade by +2 -[effect_mass_transit_1] -type = "Output_Add_Tile" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Mass Transit", "City" - "CityTile", "Center", "Local" - "OutputType", "Trade", "Local" - } - -[effect_mfg_plant] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Mfg. Plant", "City" - "OutputType", "Shield", "Local" - } - -[effect_nuclear_plant] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Nuclear Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_nuclear_plant_1] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Nuclear Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_nuclear_plant_2] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Nuclear Plant", "City", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_nuclear_plant_3] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Nuclear Plant", "City", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_offshore_platform] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "TerrainClass", "Oceanic", "Local" - "Building", "Offshore Platform", "City" - "OutputType", "Shield", "Local" - } - -;Having a Palace means having a city, the beginning of -;sedentary culture and loss of game-start move bonus. -[effect_sedentary_people_are_slow] -type = "Move_Bonus" -value = 3 -reqs = - { - "type", "name", "range", "present" - "Building", "Palace", "Player", FALSE - "UnitClass", "Land", "Local", TRUE - } -[effect_palace] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - "OutputType", "Trade", "Local" - } -[effect_palace_1] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - "OutputType", "shield", "local" - } -[effect_palace_2] -type = "Spy_Resistant" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - } -[effect_palace_2_sabotage] -type = "Building_Saboteur_Resistant" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - } -[effect_palace_3] -type = "Capital_City" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - } -[effect_palace_gov_center] -type = "Gov_Center" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - } -[effect_palace_5] -type = "Output_Bonus" -value = 75 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - "Building", "Palace", "City" - "OutputType", "Shield", "Local" - } - -[effect_palace_6] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - "Building", "Palace", "City" - "OutputType", "Shield", "Local" - } -[effect_palace_6a] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - "Building", "Palace", "City" - "OutputType", "Shield", "Local" - } -[effect_palace_7] -type = "Make_Happy" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - } -[effect_palace_fundamentalism] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range", "present", "quiet" - "Gov", "Fundamentalism", "Player", TRUE, TRUE - "Building", "Palace", "City", TRUE, FALSE - "OutputType", "Gold", "Local", TRUE, FALSE - } - -[effect_ecclesiastical_palace] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "OutputType", "Trade", "Local", TRUE - "Building", "Palace", "City", FALSE - } -[effect_ecclesiastical_palace_1] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "OutputType", "Shield", "local", TRUE - "Building", "Palace", "City", FALSE - } -[effect_ecclesiastical_palace_2] -type = "Spy_Resistant" -value = 50 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "Building", "Palace", "City", FALSE - } -[effect_ecclestiastical_palace_3] -type = "Make_Happy" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Ecclesiastical Palace", "City" - } -[effect_ecclesiastical_palace_4] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "UnitType", "Fanatics", "Local", TRUE - } -[effect_ecclesiastical_palace_gov_center] -type = "Gov_Center" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "Building", "Palace", "City", FALSE - } -[effect_ecclesiastical_palace_despotism] -type = "Output_Bonus" -value = 75 -reqs = - { "type", "name", "range", "present", "quiet" - "Gov", "Despotism", "Player", TRUE, TRUE - "Building", "Ecclesiastical Palace", "City", TRUE, FALSE - "OutputType", "Gold", "Local", TRUE, FALSE -; "Building", "Palace", "City", FALSE, FALSE - } -[effect_ecclesiastical_palace_monarchy] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range", "present", "quiet" - "Gov", "Monarchy", "Player", TRUE, TRUE - "Building", "Ecclesiastical Palace", "City", TRUE, FALSE - "OutputType", "Gold", "Local", TRUE, FALSE -; "Building", "Palace", "City", FALSE, FALSE - } -[effect_ecclesiastical_palace_fundamentalism] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range", "present", "quiet" - "Gov", "Fundamentalism", "Player", TRUE, TRUE - "Building", "Ecclesiastical Palace", "City", TRUE, FALSE - "OutputType", "Gold", "Local", TRUE, FALSE - ; "Building", "Palace", "City", FALSE, FALSE - } -[effect_ecclesiastical_palace_communism] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present", "quiet" - "Gov", "Communism", "Player", TRUE, TRUE - "Building", "Ecclesiastical Palace", "City", TRUE, FALSE - "OutputType", "Gold", "Local", TRUE, FALSE - ; "Building", "Palace", "City", FALSE, FALSE - } - -[effect_ecclesiastical_palace_culture] -type = "History" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "Building", "Palace", "City", FALSE - } -[effect_ecclesiastical_palace_2_sabotage] -type = "Building_Saboteur_Resistant" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Ecclesiastical Palace", "City" - } - -[effect_police_station] -type = "Make_Content_Mil" -value = 2 -reqs = - { "type", "name", "range", "present" - "Gov", "Republic", "Player", TRUE - "Building", "Police Station", "City", TRUE - "Building", "Women's Suffrage", "Player", FALSE - } -[effect_police_station_1] -type = "Make_Content_Mil" -value = 4 -reqs = - { "type", "name", "range", "present" - "Gov", "Democracy", "Player", TRUE - "Building", "Police Station", "City", TRUE - "Building", "Women's Suffrage", "Player", FALSE - } -[effect_police_station_vet_diplo] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "UnitFlag", "NoVeteran", "Local", FALSE - "UnitFlag", "Diplomat", "Local", TRUE - } -[effect_police_station_spy_resistant] -type = "Spy_Resistant" -value = 25 ; 25% of 50% = -12.5% 4/8-1/8 = 3/8 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - } -[effect_police_station_hostile_diplomat_0] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Steal Tech", "Local", TRUE - } -[effect_police_station_hostile_diplomat_1] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Steal Tech Escape Expected", "Local", TRUE - } -[effect_police_station_hostile_diplomat_2] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Targeted Steal Tech", "Local", TRUE - } -[effect_police_station_hostile_diplomat_3] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE - } -[effect_police_station_hostile_diplomat_4] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Sabotage City", "Local", TRUE - } -[effect_police_station_hostile_diplomat_5] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Sabotage City Escape", "Local", TRUE - } -[effect_police_station_hostile_diplomat_6] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Targeted Sabotage City", "Local", TRUE - } -[effect_police_station_hostile_diplomat_7] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Targeted Sabotage City Escape", "Local", TRUE - } -[effect_police_station_hostile_diplomat_8] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Steal Maps Escape", "Local", TRUE - } -[effect_police_station_hostile_diplomat_9] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Steal Maps", "Local", TRUE - } -[effect_police_station_hostile_diplomat_10] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Poison City Escape", "Local", TRUE - } -[effect_police_station_hostile_diplomat_11] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Incite City", "Local", TRUE - } -[effect_police_station_hostile_diplomat_12] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Incite City Escape", "Local", TRUE - } - -[effect_port_facility] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Port Facility", "City", TRUE - "UnitClass", "Sea", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_port_facility_a] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Port Facility", "City", TRUE - "UnitClass", "RiverShip", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_port_facility_b] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Port Facility", "City", TRUE - "UnitClass", "Submarine", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_port_facility_1] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Port Facility", "City" - "UnitClass", "Sea", "Local" - } -[effect_port_facility_1a] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Port Facility", "City" - "UnitClass", "RiverShip", "Local" - } -[effect_port_facility_1b] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Port Facility", "City" - "UnitClass", "Submarine", "Local" - } -[effect_port_facility_trireme] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Port Facility", "City", TRUE - "UnitClass", "Trireme", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_port_facility_trireme_1] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Port Facility", "City" - "UnitClass", "Trireme", "Local" - } - -[effect_power_plant] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Power Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Hydro Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_power_plant_1] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Power Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Hydro Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_recycling_center] -type = "Pollu_Prod_Pct" -value = -66 -reqs = - { "type", "name", "range", "present" - "Building", "Recycling Center", "City", TRUE -; A Solar Plant can give a stronger effect than a Recycling Center, in which -; case we want only the Solar Plant's effect (not the addition of the two). - "Building", "Solar Plant", "City", FALSE - } - -; Nasty special cases: where a Solar Plant is present but its effect is less -; than that of a Recycling Center, top up so that the net effect is that of the -; Recycling Center. -; (This would be so much easier if effects could be combined by functions -; other than addition...) - -; Factory and no Mfg. Plant: Solar Plant saves 50%, less than 66%; add 16% -[effect_recycling_center_1] -type = "Pollu_Prod_Pct" -value = -16 -reqs = - { "type", "name", "range", "present" - "Building", "Recycling Center", "City", TRUE - "Building", "Solar Plant", "City", TRUE - "Building", "Factory", "City", TRUE - "Building", "Mfg. Plant", "City", FALSE - } - -; Mfg. Plant and no Factory: Solar Plant saves 50%, less than 66%; add 16% -[effect_recycling_center_2] -type = "Pollu_Prod_Pct" -value = -16 -reqs = - { "type", "name", "range", "present" - "Building", "Recycling Center", "City", TRUE - "Building", "Solar Plant", "City", TRUE - "Building", "Mfg. Plant", "City", TRUE - "Building", "Factory", "City", FALSE - } - -; Neither Factory nor Mfg. Plant: Solar Plant saves 0%; add 66% -[effect_recycling_center_3] -type = "Pollu_Prod_Pct" -value = -66 -reqs = - { "type", "name", "range", "present" - "Building", "Recycling Center", "City", TRUE - "Building", "Solar Plant", "City", TRUE - "Building", "Factory", "City", FALSE - "Building", "Mfg. Plant", "City", FALSE - } - -; Raw materials generated from Recycling add +2 base shields to city production. -[effect_recycling_center_4] -type = "Output_Add_Tile" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Recycling Center", "City" - "CityTile", "Center", "Local" - "OutputType", "Shield", "Local" - } - - -[effect_research_lab] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Library", "City" - "Building", "Research Lab", "City" - "OutputType", "Science", "Local" - } - -[effect_research_lab_1] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "University", "City" - "Building", "Research Lab", "City" - "OutputType", "Science", "Local" - } - -[effect_sam_battery] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "SAM Battery", "City", TRUE - "UnitClass", "Air", "Local", TRUE - "UnitType", "Stealth Bomber", "Local", FALSE - } -[effect_sam_battery_1] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "SAM Battery", "City", TRUE - "UnitClass", "AirProtect", "Local", TRUE - "UnitType", "Stealth Fighter", "Local", FALSE - } -[effect_sam_battery_2] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "SAM Battery", "City" - "UnitClass", "AirPillage", "Local" - } -[effect_sam_battery_stealth_bomber] -type = "Defend_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "SAM Battery", "City", TRUE - "UnitType", "Stealth Bomber", "Local", TRUE - } -[effect_sam_battery_stealth_fighter] -type = "Defend_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "SAM Battery", "City", TRUE - "UnitType", "Stealth Fighter", "Local", TRUE - } - -[effect_sdi_defense] -type = "Nuke_Proof" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "SDI Defense", "City", TRUE - "DiplRel", "Foreign", "Local", TRUE - "DiplRel", "Team", "Local", FALSE - } - -[effect_sdi_defense_1] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "SDI Defense", "City" - "UnitClass", "Missile", "Local" - } - -[effect_sewer_system] -type = "Size_Unlimit" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Aqueduct", "City" - "Building", "Sewer System", "City" - } - -[effect_sewer_system_health] -type = "Health_Pct" -value = 30 -reqs = - { "type", "name", "range" - "Building", "Aqueduct", "City" - "Building", "Sewer System", "City" - } - -[effect_solar_plant] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range" - "Building", "Factory", "City" - "Building", "Solar Plant", "City" - "OutputType", "Shield", "Local" - } - -[effect_solar_plant_1] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range" - "Building", "Mfg. Plant", "City" - "Building", "Solar Plant", "City" - "OutputType", "Shield", "Local" - } - -[effect_solar_plant_2] -type = "Pollu_Prod_Pct" -value = -50 -reqs = - { "type", "name", "range" - "Building", "Factory", "City" - "Building", "Solar Plant", "City" - } - -[effect_solar_plant_3] -type = "Pollu_Prod_Pct" -value = -50 -reqs = - { "type", "name", "range" - "Building", "Mfg. Plant", "City" - "Building", "Solar Plant", "City" - } - -[effect_space_component] -type = "SS_Component" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Space Component", "City" - } - -[effect_space_module] -type = "SS_Module" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Space Module", "City" - } - -[effect_space_structural] -type = "SS_Structural" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Space Structural", "City" - } - -;Timeline is already way behind and too slow, REMOVE: -;[effect_plastics_slowdown] -;type = "Slow_Down_Timeline" -;value = 1 -;reqs = -; { "type", "name", "range", "survives" -; "Tech", "Plastics", "World", TRUE -; } - -;[effect_superconductor_slowdown] -;type = "Slow_Down_Timeline" -;value = 1 -;reqs = -; { "type", "name", "range", "survives" -; "Tech", "Superconductors", "World", TRUE -; } -;1 year per turn ensures spaceship travel time calibrated. -;this can be removed after game.info.spacerace bug of not changing -;timeline gets fixed in server. -[effect_spaceflight_slowdown] -type = "Turn_Years" -value = 1 -reqs = - { "type", "name", "range", "survives" - "Tech", "Space Flight", "World", TRUE - } - -[effect_stock_exchange] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Bank", "City" - "Building", "Stock Exchange", "City" - "OutputType", "Gold", "Local" - } - -[effect_stock_exchange_1] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Bank", "City" - "Building", "Stock Exchange", "City" - "OutputType", "Luxury", "Local" - } - -[effect_super_highways] -type = "Output_Per_Tile" -value = 50 -reqs = - { "type", "name", "range" - "Extra", "Road", "Local" - "Building", "Super Highways", "City" - "OutputType", "Trade", "Local" - } - -; Super Highways increase logistical efficiency to -; get more use out of an airport in size 12+ city. -[effect_super_highways_airlift_facilitation] -type = "Airlift" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Super Highways", "City" - "Building", "Airport", "City" - "Building", "Sewer System", "City" - } - -[effect_mine] -type = "Mining_Pct" -value = 100 -reqs = - { "type", "name", "range" - "Extra", "Mine", "Local" - } - -[effect_oil_well] -type = "Mining_Pct" -value = 100 -reqs = - { "type", "name", "range" - "Extra", "Oil Well", "Local" - } - -[effect_irrigation] -type = "Irrigation_Pct" -value = 100 -reqs = - { "type", "name", "range" - "Extra", "Irrigation", "Local" - } -; Desert with river (and no Oasis) gets 1 extra food from irrigation (total 2) -; ("Nile floods" effect) -[effect_irrigation_2] -type = "Irrigation_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "Terrain", "Desert", "Local", TRUE - "Extra", "River", "Local", TRUE - "Extra", "Oasis", "Local", FALSE - "Extra", "Irrigation", "Local", TRUE - } -; ...same for city centers -[effect_irrigation_3] -type = "Irrigation_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "Terrain", "Desert", "Local", TRUE - "Extra", "River", "Local", TRUE - "Extra", "Oasis", "Local", FALSE - "CityTile", "Center", "Local", TRUE -; "Extra", "Irrigation", "Local", FALSE - "TerrainAlter", "CanIrrigate", "Local", TRUE - "Extra", "Mine", "Local", FALSE - "Extra", "Oil Well", "Local", FALSE - } - -[effect_irrigation_center] -type = "Irrigation_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "CityTile", "Center", "Local", TRUE - "Extra", "Irrigation", "Local", FALSE - "TerrainAlter", "CanIrrigate", "Local", TRUE - "Extra", "Mine", "Local", FALSE - "Extra", "Oil Well", "Local", FALSE - } - -[effect_supermarket] -type = "Output_Per_Tile" -value = 100 -reqs = - { "type", "name", "range" - "Extra", "Farmland", "Local" - "Building", "Supermarket", "City" - "OutputType", "Food", "Local" - } - -[effect_supermarket_center] -type = "Output_Per_Tile" -value = 50 -reqs = - { "type", "name", "range", "present" - "CityTile", "Center", "Local", TRUE - "Extra", "Farmland", "Local", FALSE - "TerrainAlter", "CanIrrigate", "Local", TRUE - "Building", "Supermarket", "City", TRUE - "OutputType", "Food", "Local", TRUE - "Extra", "Mine", "Local", FALSE - "Extra", "Oil Well", "Local", FALSE - } - -[effect_temple] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - } - -[effect_temple_1] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Tech", "Mysticism", "Player" - "Building", "Temple", "City" - } - -[effect_university] -type = "Output_Bonus" -value = 150 -reqs = - { "type", "name", "range" - "Building", "Library", "City" - "Building", "University", "City" - "OutputType", "Science", "Local" - } - -[effect_apollo_program] -type = "Enable_Space" -value = 1 -reqs = - { "type", "name", "range", "survives" - "Building", "Apollo Program", "Player", TRUE - } - -[effect_telegraph_border_vision] -type = "Border_Vision" -value = 1 -reqs = - { "type", "name", "range" - "Tech", "Electricity", "Player" - } - - ; Air+Sea+LandAirSea CLASS units REQUIRE PHYSICS so their BONUS is in their stats to AVOID more [effect_] entries. -[effect_physics_vision] -type = "Unit_Vision_Radius_Sq" -value = 4 -reqs = - { "type", "name", "range" - "Tech", "Physics", "Player" - "UnitClass", "Land", "Local" - } -[effect_physics_vision_1] -type = "Unit_Vision_Radius_Sq" -value = 4 -reqs = - { "type", "name", "range" - "Tech", "Physics", "Player" - "UnitClass", "LandNoKill", "Local" - } -[effect_physics_vision_2] -type = "Unit_Vision_Radius_Sq" -value = 4 -reqs = - { "type", "name", "range" - "Tech", "Physics", "Player" - "UnitClass", "Trireme", "Local" - } -[effect_physics_vision_3] -type = "Unit_Vision_Radius_Sq" -value = 4 -reqs = - { "type", "name", "range" - "Tech", "Physics", "Player" - "UnitClass", "RiverShip", "Local" - } - -[effect_satellite_vision] ;Vision benefit from satellite communication to land units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "Land", "Local" - } -[effect_satellite_vision_1] ;Vision benefit from satellite communication to land units (Marines) -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "LandAirSea", "Local" - } -[effect_satellite_vision_2] ;Vision benefit from satellite communication to sea units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "Sea", "Local" - } -[effect_satellite_vision_2a] ;Vision benefit from satellite communication to sea units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "Submarine", "Local" - } -[effect_satellite_vision_3] ;Vision benefit from satellite communication to sea units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "Air", "Local" - } -[effect_satellite_vision_3a] ;Vision benefit from satellite communication to sea units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "AirProtect", "Local" - } -[effect_satellite_vision_4] ;Vision benefit from satellite communication to cities -type = "City_Vision_Radius_Sq" -value = 36 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - } -[effect_radar_vision] -type = "City_Vision_Radius_Sq" -value = 50 ;7 cardinal, 5 diagonal -reqs = - { "type", "name", "range" - "Tech", "Radar", "Player" - "Building", "Radar Tower", "City" - } -;[effect_radar_vision2] -;type = "Unit_Vision_Radius_Sq" -;value = 16 -;reqs = -; { "type", "name", "range", "present" -; "Extra", "Airbase", "tile", TRUE -; "Tech", "Radar", "Player", TRUE -; "MaxUnitsOnTile", "0", "Local", FALSE ;occupied base -; } - -[effect_agoge_move_bonus_1] -type = "Move_Bonus" -value = 3 -reqs = - { "type", "name", "range", "present" - "Building", "Agōgē of Sparta", "Player", TRUE - "UnitFlag", "FootSoldier", "Local", TRUE - } -[effect_agoge_move_bonus_2] -type = "Move_Bonus" -value = 6 ; 3/9 + 6/9 = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Agōgē of Sparta", "City", TRUE - "UnitFlag", "FootSoldier", "Local", TRUE - } -[effect_agoge_phalanx] -type = "Attack_Bonus" -value = 50 -reqs = - { "type", "name", "range", "present" - "Building", "Agōgē of Sparta", "Player", TRUE - "UnitType", "Phalanx", "Local", TRUE - } -[effect_agoge_pikemen] -type = "Attack_Bonus" -value = 50 -reqs = - { "type", "name", "range", "present" - "Building", "Agōgē of Sparta", "Player", TRUE - "UnitType", "Pikemen", "Local", TRUE - } - -[effect_asmiths_trading_co] -type = "Upkeep_Free" -value = 1 -reqs = - { "type", "name", "range" - "Building", "A.Smith's Trading Co.", "Player" - } - -[effect_colossus] -type = "Output_Inc_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Colossus", "City" - "OutputType", "Trade", "Local" - } - -[effect_copernicus_observatory] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Copernicus' Observatory", "City" - "OutputType", "Science", "Local" - } - -[effect_cure_for_cancer] -type = "Make_Happy" -value = 2 - reqs = - { "type", "name", "range" - "Building", "Cure For Cancer", "World" - "Tech", "Genetic Engineering", "Player" - } - -; HACK: there's all kinds of nasty hard-coded stuff to this Wonder, so it had to be -; given a different name (Voyage of Darwin) to avoid potential messyness -[effect_darwins_voyage] -type = "Output_Inc_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Voyage of Darwin", "City" - "OutputType", "Trade", "Local" - } - -[effect_eiffel_tower] -type = "Unit_Upkeep_Free_Per_City" -value = 1 - reqs = - { "type", "name", "range" - "Building", "Eiffel Tower", "Player" - "OutputType", "Shield", "Local" - } - -[effect_supreme_court_corruption1] -type = "Output_Waste_Pct" -value = 60 - reqs = - { "type", "name", "range" - "Building", "Supreme Court", "Player" - "OutputType", "Trade", "Local" - } -[effect_supreme_court_corruption2] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player", TRUE - "OutputType", "Shield", "local", TRUE - } -[effect_supreme_court_democracy] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - "Building", "Supreme Court", "Player" - } -[effect_supreme_court_incite_occupied] -type = "Incite_Cost_Pct" -value = 300 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player", TRUE - "MaxUnitsOnTile", "0", "Local", FALSE - } -[effect_supreme_court_incite_empty] -type = "Incite_Cost_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - "Building", "Supreme Court", "Player", TRUE - } -[effect_supreme_court_upkeep] -type = "Unit_Upkeep_Free_Per_City" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Supreme Court", "Player" - "OutputType", "Shield", "Local" - } -; Removes penalties (Despotism/Anarchy) for tiles >3 output -[effect_supreme_court_tile_corruption] -type = "Output_Penalty_Tile" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Supreme Court", "Player" - } -; HOMELAND SECURITY EFFECTS -; ********************************************************** -[effect_homeland_security_spy_resistance] -type = "Spy_Resistant" -value = 25 ;25% reduction of 50% base chance is 12.5% bonus. 50%-12.5%=37.5% success rate - ; No protection= 1/2, HL = 3/8, CH+HL = 1/4, CH+HL+PS = 1/8 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - } -[effect_homeland_security_hostile_diplomat0] -type = "Action_Odds_Pct" -value = -25 ; 25% of 80% base rate = 20% - ; No protection = 4/5, HL = 3/5, CH+HL = 2/5, CH+HL+PS = 1/5 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Steal Tech", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_1] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Steal Tech Escape Expected", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_2] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Targeted Steal Tech", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_3] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_4] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Sabotage City", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_5] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Sabotage City Escape", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_6] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Targeted Sabotage City", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_7] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Targeted Sabotage City Escape", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_8] -type = "Action_Odds_Pct" -value = -25 ;40 minus 25%*80 = 20% -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Steal Maps Escape", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_9] -type = "Action_Odds_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Steal Maps", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_10] -type = "Action_Odds_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Poison City Escape", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_11] -type = "Action_Odds_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Incite City", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_12] -type = "Action_Odds_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Incite City Escape", "Local", TRUE - } - -;============================================================== -; GREAT Wall -;============================================================== -[effect_great_wall_0_original] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", TRUE - "UnitClass", "Land", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "UnitType", "Howitzer", "Local", FALSE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_0_assimilated] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", FALSE - "MinForeignPct", "19", "City", FALSE - "UnitClass", "Land", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "UnitType", "Howitzer", "Local", FALSE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_1_original] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range" - "Building", "Great Wall", "Player" - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", TRUE - "UnitClass", "Helicopter", "Local" - "CityTile", "Center", "Local" - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_1_assimilated] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range" - "Building", "Great Wall", "Player" - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", FALSE - "MinForeignPct", "19", "City", FALSE - "UnitClass", "Helicopter", "Local" - "CityTile", "Center", "Local" - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_2_original] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "UnitType", "Howitzer", "Local", FALSE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_2_assimilated] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", FALSE - "MinForeignPct", "19", "City", FALSE - "UnitClass", "LandNoKill", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "UnitType", "Howitzer", "Local", FALSE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_3_original] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "UnitType", "Howitzer", "Local", FALSE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_3_assimilated] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", FALSE - "MinForeignPct", "19", "City", FALSE - "UnitClass", "LandAirSea", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "UnitType", "Howitzer", "Local", FALSE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_poploss_original] -type = "Unit_No_Lose_Pop" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", TRUE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_poploss_assimilated] -type = "Unit_No_Lose_Pop" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", FALSE - "MinForeignPct", "19", "City", FALSE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_visible_original] -type = "Visible_Walls" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", TRUE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_visible_assimilated] -type = "Visible_Walls" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", FALSE - "MinForeignPct", "19", "City", FALSE - "Tech", "Machine Tools", "World", FALSE - } -;============================================================== - -[effect_hanging_gardens] -type = "Make_Happy" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Hanging Gardens", "Player" - } -[effect_hanging_gardens_1] -type = "Output_Add_Tile" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Hanging Gardens", "City" - "CityTile", "Center", "Local" - "OutputType", "Luxury", "Local" - } - -[effect_hoover_dam] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Hoover Dam", "Player", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Solar Plant", "City", FALSE - } -[effect_hoover_dam_1] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Hoover Dam", "Player", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Solar Plant", "City", FALSE - } -[effect_hoover_dam_2] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Hoover Dam", "Player", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } -[effect_hoover_dam_3] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Hoover Dam", "Player", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_isaac_newtons_college] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "University", "City" - "Building", "Isaac Newton's College", "Player" - "OutputType", "Science", "Local" - } - -[effect_jtids] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "JTIDS", "Player", TRUE - "UnitFlag", "FootSoldier", "Local", TRUE - } -[effect_jtids_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "JTIDS", "Player", TRUE - "UnitType", "Mech. Inf.", "Local", TRUE ; uses rule_name - } -[effect_jtids_2] -type = "Veteran_Combat" -value = 75 ; 87 57::35 26 26 26 -reqs = - { "type", "name", "range", "present" - "Building", "JTIDS", "Player", TRUE - "UnitFlag", "FootSoldier", "Local", TRUE - "UnitType", "Marines", "Local", FALSE - } -[effect_jtids_3] -type = "Veteran_Combat" -value = 60 ; 80 52::32 24 24 24 -reqs = - { "type", "name", "range", "present" - "Building", "JTIDS", "Player", TRUE - "UnitType", "Mech. Inf.", "Local", TRUE ; uses rule_name - } -[effect_jtids_4] -type = "Veteran_Combat" -value = 40 ;84 70::56 42 28 21 -reqs = - { "type", "name", "range", "present" - "Building", "JTIDS", "Player", TRUE - "UnitFlag", "FootSoldier", "Local", TRUE - "UnitType", "Marines", "Local", TRUE - } - -[effect_js_bachs_cathedral] -type = "Force_Content" -value = 2 -reqs = - { "type", "name", "range" - "Building", "J.S. Bach's Cathedral", "Player" - } - -[effect_king_richards_crusade] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "King Richard's Crusade", "City" - "OutputType", "Shield", "Local" - } -[effect_city_build_slots_kr] -type = "City_Build_Slots" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "King Richard's Crusade", "City", TRUE - } - -[effect_leonardos_workshop] -type = "Upgrade_Unit" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Leonardo's Workshop", "Player" - } - -[effect_genghis_khans_equestrian_school] -type = "Move_Bonus" -value = 9 -reqs = - { "type", "name", "range", "present" - "Building", "Genghis Khan's Equestrian School", "Player", TRUE - "UnitFlag", "Horse", "Local", TRUE - } -[effect_genghis_khans_equestrian_school2] -type = "Move_Bonus" -value = 9 -reqs = - { "type", "name", "range", "present" - "Building", "Genghis Khan's Equestrian School", "Player", TRUE - "UnitType", "Explorer", "Local", TRUE - } - -[effect_airplane_range_1] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Tech", "Radio", "Player" - "UnitType", "Airplane", "Local" - } -[effect_airplane_range_2] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Tech", "Advanced Flight", "Player" - "UnitType", "Airplane", "Local" - } -[effect_airplane_range_3] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Tech", "Radar", "Player" - "UnitType", "Airplane", "Local" - } -[effect_airplane_range_4] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Tech", "Rocketry", "Player" - "UnitType", "Airplane", "Local" - } -[effect_airplane_range_5] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitType", "Airplane", "Local" - } -[effect_airplane_range_6] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Tech", "Avionics", "Player" - "UnitType", "Airplane", "Local" - } - -[effect_rail_electricity] -type = "Move_Bonus" -value = 9 -reqs = - { "type", "name", "range" - "Tech", "Electricity", "Player" - "UnitClass", "LandRail", "Local" - } -[effect_rail_combustion] -type = "Move_Bonus" -value = 9 -reqs = - { "type", "name", "range" - "Tech", "Combustion", "Player" - "UnitClass", "LandRail", "Local" - } - -[effect_lighthouse] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Sea", "Local" - } -[effect_lighthouse_a] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Submarine", "Local" - } -[effect_lighthouse_1] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Trireme", "Local" - } -[effect_lighthouse_2] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "RiverShip", "Local" - } -[effect_lighthouse_3] -type = "Unit_Vision_Radius_Sq" -value = 6 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Sea", "Local" - } -[effect_lighthouse_3a] -type = "Unit_Vision_Radius_Sq" -value = 6 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Submarine", "Local" - } -[effect_lighthouse_4] -type = "Unit_Vision_Radius_Sq" -svalue = 6 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Trireme", "Local" - } -[effect_lighthouse_5] -type = "Unit_Vision_Radius_Sq" -svalue = 6 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "RiverShip", "Local" - } - -[effect_magellans_expedition] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Magellan's Expedition", "Player", TRUE - "UnitClass", "Sea", "Local", TRUE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_magellans_expedition_a] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Magellan's Expedition", "Player", TRUE - "UnitClass", "RiverShip", "Local", TRUE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_magellans_expedition_b] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Magellan's Expedition", "Player", TRUE - "UnitClass", "Submarine", "Local", TRUE - "UnitFlag", "NoVeteran", "Local", FALSE - } - -[effect_manhattan_project] -type = "Enable_Nuke" -value = 1 -reqs = - { "type", "name", "range", "survives" - "Building", "Manhattan Project", "World", TRUE - } - -[effect_marco_polos_embassy] -type = "Output_Bonus" -value = 40 -reqs = - { "type", "name", "range" - "Building", "Marco Polo's Embassy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_michelangelos_chapel] -type = "Make_Content" -value = 3 -reqs = - { "type", "name", "range" - "Building", "Michelangelo's Chapel", "Player" - } -[effect_michelangelos_chapel_1] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Tech", "Theology", "Player" - "Building", "Michelangelo's Chapel", "Player" - } -[effect_michelangelos_chapel_2] -type = "Make_Content" -value = -1 -reqs = - { "type", "name", "range" - "Building", "Michelangelo's Chapel", "Player" - "Gov", "Communism", "Player" - } - -[effect_mausoleum_of_mausolos_1] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "Building", "Great Wall", "Player", FALSE - "Building", "Mausoleum of Mausolos", "Player", TRUE - } - -;Great Wall counts as City Walls in every city. -[effect_mausoleum_of_mausolos_1a] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Great Wall", "Player" - "Building", "Mausoleum of Mausolos", "Player" - } -[effect_mausoleum_of_mausolos_2] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Building", "Mausoleum of Mausolos", "Player", TRUE - } -;Mausoleum respects that Supreme Court counts as extra Courthouse in every city. -[effect_mausoleum_of_mausolos_2a] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Supreme Court", "Player" - "Building", "Mausoleum of Mausolos", "Player" - } -[effect_mausoleum_of_mausolos_culture] -type = "History" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Mausoleum of Mausolos", "City" - } - -[effect_statue_of_zeus_content_republic] -type = "Make_Content_Mil" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Statue of Zeus", "Player", TRUE - "Gov", "Republic", "Player", TRUE - "Tech", "Tactics", "Player", FALSE - } -[effect_statue_of_zeus_content_democracy] -type = "Make_Content_Mil" -value = 2 -reqs = - { "type", "name", "range", "present" - "Building", "Statue of Zeus", "Player", TRUE - "Gov", "Democracy", "Player", TRUE - "Tech", "Tactics", "Player", FALSE - } -[effect_statue_of_zeus_1] -type = "Unit_Upkeep_Free_Per_City" -value = 4 -reqs = - { "type", "name", "range", "present" - "Building", "Statue of Zeus", "City", TRUE - "Tech", "Tactics", "Player", FALSE - "OutputType", "Shield", "Local", TRUE - } -[effect_statue_of_zeus_2] -type = "Make_Happy" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Statue of Zeus", "City" - } - -[effect_temple_of_artemis] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Luxury", "Local" - } -;Note: the city applies +1 to 0-shield city tiles on grass,swamp,hills,tundra -;Thus this bonus negates the condition of getting that +1 and needs a -;compensating +1 further below -[effect_temple_of_artemis_1] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Shield", "Local" - } -;-------- -;Give the city its extra shield if it was built on a 0-shield (grass/hills/swamp/tundra) -;tile or +1-shield resource (grass-shield,fur) -[effect_temple_of_artemis_1a] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Terrain", "Grassland", "Local" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Shield", "Local" - } -[effect_temple_of_artemis_1b] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range", "present" - "Terrain", "Hills", "Local", TRUE - "Extra", "Coal", "Local", FALSE ; only apply to 0 shield tile - "Extra", "Mine", "Local", FALSE ; only apply to 0 shield tile - "Building", "Temple", "City", TRUE - "Building", "Temple of Artemis", "Player", TRUE - "CityTile", "Center", "Local", TRUE - "OutputType", "Shield", "Local", TRUE - } -[effect_temple_of_artemis_1d] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range", "present" - "Terrain", "Swamp", "Local", TRUE - "Extra", "Peat", "Local", FALSE ; only apply to 0 shield tile - "Building", "Temple", "City", TRUE - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local", TRUE - "OutputType", "Shield", "Local", TRUE - } -[effect_temple_of_artemis_1e] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range", "present" - "Terrain", "Tundra", "Local", TRUE - "Extra", "Game", "Local", FALSE ; only apply to 0 shield tile - "Building", "Temple", "City", TRUE - "Building", "Temple of Artemis", "Player", TRUE - "CityTile", "Center", "Local", TRUE - "OutputType", "Shield", "Local", TRUE - } -;------ - -[effect_temple_of_artemis_2] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Gold", "Local" - } - -[effect_temple_of_artemis_3] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Science", "Local" - } - - -[effect_teslas_laboratory] -type = "Upgrade_Unit" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Tesla's Laboratory", "Player" - } -[effect_tesla_laboratory2] -type = "Upgrade_Price_Pct" -value = -20 -reqs = - { "type", "name", "range" - "Building", "Tesla's Laboratory", "Player" - } - -[effect_oracle] -type = "Make_Content" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - "Building", "Oracle", "Player" - } - -[effect_pyramids] -type = "Growth_Food" -value = 25 -reqs = - { "type", "name", "range" - "Building", "Pyramids", "Player" - } - -[effect_pyramids_1] -type = "Rapture_Grow" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Pyramids", "City" - } - -[effect_internet] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Research Lab", "City" - "Building", "The Internet", "Player" - "OutputType", "Science", "Local" - } - -[effect_shakespeares_theatre] -type = "No_Unhappy" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Shakespeare's Theatre", "City" - } - -[effect_statue_of_liberty] -type = "Any_Government" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Statue of Liberty", "Player" - } - -[effect_statue_of_liberty_1] -type = "No_Anarchy" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Statue of Liberty", "Player" - } - -[effect_sun_tzus_war_academy] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Sun Tzu's War Academy", "Player", TRUE - "UnitClass", "Land", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_sun_tzus_war_academy_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Sun Tzu's War Academy", "Player", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - } -[effect_sun_tzus_war_academy_2] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Sun Tzu's War Academy", "Player", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - } - -[effect_united_nations] -type = "Has_Senate" -value = 1 -reqs = - { "type", "name", "range" - "Building", "United Nations", "World" - } - -[effect_united_nations_1] -type = "Revolution_Unhappiness" -value = 2 -reqs = - { "type", "name", "range", "present" - "Building", "United Nations", "World", TRUE -; Without !present UN would make revolution less likely instead -; of enabling it with Democracy (value 2 -> 4 instead of 0 -> 2) - "Gov", "Democracy", "Player", FALSE - } - -[effect_womens_suffrage] -type = "Make_Content_Mil" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - "Building", "Women's Suffrage", "Player" - } - -[effect_womens_suffrage_1] -type = "Make_Content_Mil" -value = 4 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - "Building", "Women's Suffrage", "Player" - } - -[effect_fanatics_fundamentalism] -type = "Fanatics" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_corruption_fundamentalism0] -type = "Output_Waste" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_fundamentalism1] -type = "Output_Waste_By_Distance" -value = 200 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Trade", "Local" - } - -;Shield waste is not a proper feature of mp rulesets -;[effect_waste_fundamentalism0] -;type = "Output_Waste" -;value = 2 -;reqs = -; { "type", "name", "range" -; "Gov", "Fundamentalism", "Player" -; "OutputType", "Shield", "Local" -; } - -;[effect_waste_fundamentalism1] -;type = "Output_Waste_By_Distance" -;value = 100 -;reqs = -; { "type", "name", "range" -; "Gov", "Fundamentalism", "Player" -; "OutputType", "Shield", "Local" -; } - -[effect_fundamentalism_unit_upkeep] -type = "Upkeep_Factor" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Food", "Local" - } - -[effect_upkeep_free_units_fundamentalism] -type = "Unit_Upkeep_Free_Per_City" -value = 10 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Shield", "Local" - } - -[effect_bad_sci_fundamentalism] -type = "Output_Bonus_2" -value = -50 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "science", "local" - } - -[effect_tithes_fundamentalism] -type = "Happiness_To_Gold" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_sabotage_bonus_fundamentalism1] -type = "Action_Odds_Pct" -value = 13 ;// 13%*80% = 10.4% -reqs = - { "type", "name", "range", "present" - "Gov", "Fundamentalism", "Player", TRUE - "Action", "Sabotage City", "Local", TRUE - } -[effect_sabotage_bonus_fundamentalism2] -type = "Action_Odds_Pct" -value = 13 ;// 13%*80% = 10.4% -reqs = - { "type", "name", "range", "present" - "Gov", "Fundamentalism", "Player", TRUE - "Action", "Sabotage City Escape", "Local", TRUE - } -[effect_sabotage_bonus_fundamentalism3] -type = "Action_Odds_Pct" -value = 13 ;// 13%*80% = 10.4% (int rounds to 10%) -reqs = - { "type", "name", "range", "present" - "Gov", "Fundamentalism", "Player", TRUE - "Action", "Targeted Sabotage City", "Local", TRUE - } -[effect_sabotage_bonus_fundamentalism4] -type = "Action_Odds_Pct" -value = 13 ;// 13%*80% = 10.4% (int rounds to 10%) -reqs = - { "type", "name", "range", "present" - "Gov", "Fundamentalism", "Player", TRUE - "Action", "Targeted Sabotage City Escape", "Local", TRUE - } - -[effect_max_rates_fundamentalism] -type = "Max_Rates" -value = 80 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_enviromentalism] -type = "Pollu_Prod_Pct" -value = -50 -reqs = - { "type", "name", "range" - "Tech", "Environmentalism", "Player" - } - -[effect_calendar_base] -type = "Turn_Years" -value = 100 - -; 100 - 50 = 50 -[effect_calendar_1] -type = "Turn_Years" -value = -50 -reqs = - { "type", "name", "range" - "MinYear", "0", "World" - } - -; 50 - 25 = 25 -[effect_calendar_2] -type = "Turn_Years" -value = -25 -reqs = - { "type", "name", "range" - "MinYear", "1000", "World" - } - -; 25 - 15 = 10 -[effect_calendar_3] -type = "Turn_Years" -value = -15 -reqs = - { "type", "name", "range" - "MinYear", "1800", "World" - } - -; 10 - 5 = 5 -[effect_calendar_4] -type = "Turn_Years" -value = -5 -reqs = - { "type", "name", "range" - "MinYear", "1900", "World" - } - -; 5 - 3 = 2 -[effect_calendar_5] -type = "Turn_Years" -value = -3 -reqs = - { "type", "name", "range" - "MinYear", "1950", "World" - } - -; 2 - 1 = 1 -[effect_calendar_6] -type = "Turn_Years" -value = -1 -reqs = - { "type", "name", "range" - "MinYear", "2012", "World" - } - -[effect_tech_cost_base] -type = "Tech_Cost_Factor" -value = 1 - -; Cities can always work tiles -[effect_tile_workable] -type = "Tile_Workable" -value = 1 -reqs = - { "type", "name", "range", "present" - "Terrain", "Inaccessible", "Local", FALSE - } - -; Each city has at least one slot to build units -[effect_city_build_slots_basic] -type = "City_Build_Slots" -value = 1 - -; Capital has two slots -[effect_city_build_slots_capital] -type = "City_Build_Slots" -value = 1 -reqs = - { "type", "name", "range", "present" - "Tech", "Conscription", "Player", TRUE - "Building", "Palace", "City", TRUE - } -[effect_city_build_slots_capital2] -type = "City_Build_Slots" -value = 1 -reqs = - { "type", "name", "range", "present" - "Tech", "Conscription", "Player", TRUE - "Building", "Ecclesiastical Palace", "City", TRUE - } -[effect_city_build_slots_factory] -type = "City_Build_Slots" -value = 1 -reqs = - { "type", "name", "range", "present" - "Tech", "Conscription", "Player", TRUE - "Building", "Factory", "City", TRUE - } -[effect_city_build_slots_mfg_plant] -type = "City_Build_Slots" -value = 1 -reqs = - { "type", "name", "range", "present" - "Tech", "Conscription", "Player", TRUE - "Building", "Mfg. Plant", "City", TRUE - } - -[effect_city_image_1] -type = "City_Image" -value = 1 -reqs = - { "type", "name", "range" - "MinSize", "4", "City" - } - -[effect_city_image_2] -type = "City_Image" -value = 1 -reqs = - { "type", "name", "range" - "MinSize", "8", "City" - } - -[effect_city_image_3] -type = "City_Image" -value = 1 -reqs = - { "type", "name", "range" - "MinSize", "12", "City" - } - -[effect_city_image_4] -type = "City_Image" -value = 1 -reqs = - { "type", "name", "range" - "MinSize", "16", "City" - } - -[effect_pollution] -type = "Output_Tile_Punish_Pct" -value = 50 -reqs = - { "type", "name", "range", "present" - "Extra", "Pollution", "Local", TRUE - "Extra", "Fallout", "Local", FALSE - } - -[effect_fallout] -type = "Output_Tile_Punish_Pct" -value = 50 -reqs = - { "type", "name", "range", "present" - "Extra", "Fallout", "Local", TRUE - "Extra", "Pollution", "Local", FALSE - } - -; This would bring back bridges in cities without Bridge Building, -; but not get the trade bonus until BB discovered. Not needed now -; since Quay was added. -; collect trade from them until Bridge Building. -;[effect_bridge_without_bridge_building] -;type = "Output_Add_Tile" -;value = -1 -;reqs = -; { "type", "name", "range", "present" -; "Tech", "Bridge Building", "Player", FALSE -; "CityTile", "Center", "Local", TRUE -; "Extra", "River", "Local", TRUE -; "OutputType","Trade", "Local", TRUE -; -; ;Don't subtract a non-existent bonus. -; "Terrain", "Arctic", "Local", FALSE -; "Terrain", "Forest", "Local", FALSE -; "Terrain", "Hills", "Local", FALSE -; "Terrain", "Jungle", "Local", FALSE -; "Terrain", "Mountains", "Local", FALSE -; "Terrain", "Swamp", "Local", FALSE -; } - -[effect_pollution_fallout] -type = "Output_Tile_Punish_Pct" -value = 75 -reqs = - { "type", "name", "range" - "Extra", "Fallout", "Local" - "Extra", "Pollution", "Local" - } - -; **** Action Odds for Hostile Diplomatic Actions ******* -;******************************************************** -[effect_reduced_chance_steal_maps_escape] -type = "Action_Odds_Pct" -value = -32 ;80 minus 31%*80 = 55% -reqs = - { "type", "name", "range", "present" - "Action", "Steal Maps Escape", "Local", TRUE - } -[effect_reduced_chance_steal_maps] -type = "Action_Odds_Pct" -value = -13 ;80 minus 13%*80 = 70% -reqs = - { "type", "name", "range", "present" - "Action", "Steal Maps", "Local", TRUE - } -[effect_reduced_targeted_sabotage_city] -type = "Action_Odds_Pct" -value = -32 ;80 minus 31%*80 = 55% -reqs = - { "type", "name", "range", "present" - "Action", "Targeted Sabotage City Escape", "Local", TRUE - } -[effect_reduced_poison_city_escape] -type = "Action_Odds_Pct" -value = -13 ;80 minus 13%*80 = 70% -reqs = - { "type", "name", "range", "present" - "Action", "Poison City Escape", "Local", TRUE - } -;********************************************************* -; Bribe and Incite Costs ********************************* -[effect_unit_bribe_cost_settlers] -type = "Unit_Bribe_Cost_Pct" -value = -50 -reqs = - { "type", "name", "range" - "UnitFlag", "NonMil", "Local" - } -;********************************************************* - - -;LOSING MOVES FROM ILLEGAL ACTION NEVER MADE SENSE. JUST FORBID IT AND LET THEM PICK A LEGAL ACTION. -;[effect_illegal_action_move_cost_base] -;type = "Illegal_Action_Move_Cost" -;value = 0 -;reqs = -; { "type", "name", "range", "present" -; "Action", "Found City", "Local", FALSE -; "Action", "Join City", "Local", FALSE -; } - -;CASUS BELLI INCIDENTS -;******************************************************** -[effect_incident_success_pillage] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Pillage", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_caught_steal_maps1] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Maps Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_steal_maps1] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Maps Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_steal_maps2] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Maps", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_steal_maps2] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Maps", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_steal_tech] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Tech", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_steal_tech] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Tech", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_steal_tech_esc] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Tech Escape Expected", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_steal_tech_esc] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Tech Escape Expected", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_tgt_steal_tech] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_tgt_steal_tech] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_bribe_unit] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Bribe Unit", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_capture_unit] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Capture Units", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_sabotage_unit] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Sabotage Unit Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_sabotage_unit] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Sabotage Unit Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_incite] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Incite City", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_incite] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Incite City", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_incite_esc] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Incite City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_incite_esc] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Incite City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_poison] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Poison City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_poison] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Poison City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_sabotage_city] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Sabotage City", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_sabotage_city] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Sabotage City", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_sabotage_city_esc] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Sabotage City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_sabotage_city_esc] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Sabotage City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_tgt_sabotage_city] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Targeted Sabotage City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_tgt_sabotage_city] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Targeted Sabotage City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_explode_nuke] -type = "Casus_Belli_Success" -value = 1000 -reqs = - { "type", "name", "range", "present" - "Action", "Explode Nuclear", "Local", TRUE - } -;******************************************************************** - -; Double (+100%) buy cost for Great Wonders -[effect_great_wonder_buy_cost] -type = "Building_Buy_Cost_Pct" -value = 100 -reqs = - { "type", "name", "range" - "BuildingGenus", "GreatWonder", "Local" - } - -; Double buy cost for Small Wonders except Palaces -[effect_small_wonder_buy_cost] -type = "Building_Buy_Cost_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "BuildingGenus", "SmallWonder", "Local", TRUE - "Building", "Palace", "Local", FALSE - "Building", "Ecclesiastical Palace", "Local", FALSE - } - -; The Well-Digger can move 3 before you know Pottery or Alphabet. -[effect_welldigger_movement] -type = "Move_Bonus" -value = -27 -reqs = - { - "type", "name", "range", "present" - "UnitFlag", "Well-Digger", "Local", TRUE - "Tech", "Alphabet", "Player", TRUE - } -[effect_welldigger_movement_1] -type = "Move_Bonus" -value = -27 -reqs = - { - "type", "name", "range", "present" - "UnitFlag", "Well-Digger", "Local", TRUE - "Tech", "Pottery", "Player", TRUE - } - -;Can't give orders to Proletarians unless communist. -[effect_proletarian_movement] -type = "Move_Bonus" -value = -18 -reqs = - { - "type", "name", "range", "present" - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player", FALSE - } - -;5 shield discount Riflemen -[effect_communist_riflemen] -type = "Unit_Build_Cost_Pct" -value = -12 -reqs = - { - "type", "name", "range", "present" - "UnitType", "Riflemen", "Local", TRUE - "Gov", "Communism", "Player", TRUE - } - -;10 shield discount "Sturmovik Effect". -[effect_communist_dive_bombers] -type = "Unit_Build_Cost_Pct" -value = -16 -reqs = - { - "type", "name", "range", "present" - "UnitType", "Dive Bomber", "Local", TRUE - "Gov", "Communism", "Player", TRUE - } - -;Labor Union changes upkeep of foot units and mech.inf to gold -[effect_labor_union_upkeep] -type = "Shield2Gold_Factor" -value = 100 -reqs = - { - "type", "name", "range", "present" - "Tech", "Labor Union", "Player", TRUE - } diff --git a/freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/parser.lua b/freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/parser.lua deleted file mode 100644 index ea4bf8c53..000000000 --- a/freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/parser.lua +++ /dev/null @@ -1,13 +0,0 @@ --- Freeciv - Copyright (C) 2007 - The Freeciv Project --- This program is free software; you can redistribute it and/or modify --- it under the terms of the GNU General Public License as published by --- the Free Software Foundation; either version 2, or (at your option) --- any later version. --- --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU General Public License for more details. - --- This file is for lua-functionality for parsing luadata.txt --- of this ruleset. diff --git a/freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/styles.ruleset b/freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/styles.ruleset deleted file mode 100644 index cc690357f..000000000 --- a/freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/styles.ruleset +++ /dev/null @@ -1,265 +0,0 @@ - -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -[datafile] -description="Nation theme data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -; /* <-- avoid gettext warnings -; -; Nation styles -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; if -; not present, "name" is used for this purpose too. Since -; the name used in savegames must not change, if you want -; to rename an item after a ruleset has been released, you -; should set "rule_name" to the original value of "name". -; -; */ <-- avoid gettext warnings - -[style_european] -name = _("?style:European") - -[style_classical] -name = _("?style:Classical") - -[style_tropical] -name = _("?style:Tropical") - -[style_asian] -name = _("?style:Asian") - -[style_babylonian] -name = _("?style:Babylonian") - -[style_celtic] -name = _("?style:Celtic") - -; /* <-- avoid gettext warnings -; -; City styles define the way cities are drawn -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; if -; not present, "name" is used for this purpose too. Since -; the name used in savegames must not change, if you want -; to rename an item after a ruleset has been released, you -; should set "rule_name" to the original value of "name". -; graphic = group of tiles to use, see cities spec for -; more info on city tiles -; citizens_graphic = group of citizens tiles to use, see citizens/small -; spec for more info on citizens tiles -; FIXME: this and _alt not currently used! -; reqs = requirements for this city style (see README.effects) -; -; */ <-- avoid gettext warnings - -[citystyle_european] -name = _("?citystyle:European") -graphic = "city.european" -graphic_alt = "-" -citizens_graphic = "ancient" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "Style", "European", "Player" - } - -[citystyle_classical] -name = _("?citystyle:Classical") -graphic = "city.classical" -graphic_alt = "-" -citizens_graphic = "ancient" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "Style", "Classical", "Player" - } - -[citystyle_tropical] -name = _("?citystyle:Tropical") -graphic = "city.tropical" -graphic_alt = "city.european" -citizens_graphic = "ancient" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "Style", "Tropical", "Player" - } - -[citystyle_asian] -name = _("?citystyle:Asian") -graphic = "city.asian" -graphic_alt = "city.classical" -citizens_graphic = "ancient" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "Style", "Asian", "Player" - } - -[citystyle_babylonian] -name = _("?citystyle:Babylonian") -graphic = "city.babylonian" -graphic_alt = "city.classical" -citizens_graphic = "ancient" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "Style", "Babylonian", "Player" - } - -[citystyle_celtic] -name = _("?citystyle:Celtic") -graphic = "city.celtic" -graphic_alt = "city.european" -citizens_graphic = "ancient" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "Style", "Celtic", "Player" - } - -[citystyle_industrial] -name = _("?citystyle:Industrial") -graphic = "city.industrial" -graphic_alt = "-" -citizens_graphic = "industrial" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "tech", "Railroad", "Player" - } - -[citystyle_electric] -name = _("?citystyle:ElectricAge") -graphic = "city.electricage" -graphic_alt = "city.modern" -citizens_graphic = "electricage" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "tech", "Automobile", "Player" - } - -[citystyle_modern] -name = _("?citystyle:Modern") -graphic = "city.modern" -graphic_alt = "-" -citizens_graphic = "modern" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "tech", "Rocketry", "Player" - } - -[citystyle_postmodern] -name = _("?citystyle:PostModern") -graphic = "city.postmodern" -graphic_alt = "-" -citizens_graphic = "postmodern" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "tech", "Superconductors", "Player" - } - -; /* <-- avoid gettext warnings -; -; Music styles -; -; Order is important. The last one for which activation requirements -; are fulfilled is the one that plays. -; -; music_peaceful = Music to play when nation in peaceful mood -; music_combat = Music to play when nation in combat mood -; reqs = requirements to activate the style (see effects.ruleset -; and README.effects for help on requirements) -; -; */ <-- avoid gettext warnings - -[musicstyle_european] -music_peaceful = "music_european_peace" -music_combat = "music_european_combat" -reqs = - { "type", "name", "range" - "Style", "European", "Player" - } - -[musicstyle_classical] -music_peaceful = "music_classical_peace" -music_combat = "music_classical_combat" -reqs = - { "type", "name", "range" - "Style", "Classical", "Player" - } - -[musicstyle_tropical] -music_peaceful = "music_tropical_peace" -music_combat = "music_tropical_combat" -reqs = - { "type", "name", "range" - "Style", "Tropical", "Player" - } - -[musicstyle_asian] -music_peaceful = "music_asian_peace" -music_combat = "music_asian_combat" -reqs = - { "type", "name", "range" - "Style", "Asian", "Player" - } - -[musicstyle_babylonian] -music_peaceful = "music_babylonian_peace" -music_combat = "music_babylonian_combat" -reqs = - { "type", "name", "range" - "Style", "Babylonian", "Player" - } - -[musicstyle_celtic] -music_peaceful = "music_celtic_peace" -music_combat = "music_celtic_combat" -reqs = - { "type", "name", "range" - "Style", "Celtic", "Player" - } - -[musicstyle_renaissance] -music_peaceful = "music_renaissance_peace" -music_combat = "music_renaissance_combat" -reqs = - { "type", "name", "range" - "Tech", "University", "Player" - } - -[musicstyle_industrial] -music_peaceful = "music_industrial_peace" -music_combat = "music_industrial_combat" -reqs = - { "type", "name", "range" - "Tech", "Railroad", "Player" - } - -[musicstyle_electricage] -music_peaceful = "music_electricage_peace" -music_combat = "music_electricage_combat" -reqs = - { "type", "name", "range" - "Tech", "Automobile", "Player" - } - -[musicstyle_modern] -music_peaceful = "music_modern_peace" -music_combat = "music_modern_combat" -reqs = - { "type", "name", "range" - "Tech", "Rocketry", "Player" - } - -[musicstyle_postmodern] -music_peaceful = "music_postmodern_peace" -music_combat = "music_postmodern_combat" -reqs = - { "type", "name", "range" - "Tech", "Superconductors", "Player" - } diff --git a/freeciv/freeciv/data/.historic/mp2sandbox/README.mp2 b/freeciv/freeciv/data/.historic/mp2sandbox/README.mp2 deleted file mode 100644 index 8b8c7bfba..000000000 --- a/freeciv/freeciv/data/.historic/mp2sandbox/README.mp2 +++ /dev/null @@ -1,175 +0,0 @@ -MP2: Multiplayer II Evolution ruleset -------------------------------------- -LINKS: -Full Game Manual -Multiplayer II Summary -Design Log -... -Terrain -Bases -Combat -Governments -Economy -Diplomacy -... -Terrain+Base Defense Bonus Quick-Reference -Hotkeys and Mouse Control - -The Multiplayer-Evolution ruleset is a fully modernized ruleset to take advantage of cutting-edge advancements in Freeciv Server development. -Compared to original Multiplayer, the most notable changes will be new early-game sea units, new late-game air units, and the wholescale improvement -of balance and tactical possibility in late-game Air and Sea units. A large number of contributors over an almost two year period helped add and -balance many other changes whose aim was to increase playability, strategic depth and creativity, realism, and overall richness. -Enjoy! - ------------------------------ -Changes from Multiplayer 1.0: ------------------------------ -TECH -1. Tech costs equalize pace of discovery for all game stages. -2. Darwin's Voyage is now similar to Colossus. -3. No Philosophy bonus after Conscription, Industrialization, Electricity, or T85 (1600AD). -4. Space Flight gives a Satellite Vision Bonus to cities and units. -5. Space race tuned as a viable option. 6.25x component cost, 225% default travel time (server option) -6. Electricity removes Fog of War inside your own borders. (If BORDERS aren't set to SEE_INSIDE). - -UNITS -1. Vision:Movement ratio fixed for 2x movement: starts at 1.4x:2x then is 2x:2x after Physics. -2. Restrictinfra=ON makes enemy rails act only like roads. (Default=ON) -3. Railroad move speed changed to 9x, MagLevs available with Superconductors for unlimited moves. -4. Non-military Bribe cost fixed to work on all non-military units. -5. Land units on mountains get +1 vision. -6. Knights defend at D3 vs mounted, D2 vs foot, D1 vs everything else, and do not kill city population. -7. Legions can build Forts/Fortresses; and they can build roads on non-domestic tiles. -8. Archers can do a (limited) Range Attack. -9. Armor: no penalty vs Fort; 1.67 penalty vs Fortress (was 2x). -10. Armor II: upgrades Armor with Plastics. Cost:80 A16 D6 FP1 M6. No penalty vs Fort/ress, 2x defense - ... against missiles, never blocked from attacking reachable units by unreachable units. -11. No bribe/sabotage on Air and Missile units. -12. “OneAttack” flag deprecated since version 2.3 onward had made them dysfunctional. These units do NOT lose all - ... moves after making one attack: Bomber types, Helicopters. -13. Air Units exert no ZoC over adjacent tiles. -14. Para-drop for Paratroopers adjusted to 2x area coverage (1.4x range). -15. Marines are multipurpose. Can attack sea units (2x penalty), are never blocked from attacking a reachable - ... unit by an unreachable unit; can attack from Helicopters. Get improved veteran multipliers. -16. Escort Fighters added. Cost: 80. A3 D5 FP2. Moves:18. Fuel: 2 turns. -17. Medium Bombers added. Cost: 85. A6 D2 FP2. Moves:13. Fuel: 2 turns. -18. Bomber renamed 'Heavy Bomber'. Cost: 120. A12 D3 FP2. Moves:15. Fuel: 2 turns. Carries 1 Bomb. -19. Strategic Bomber added: Cost: 135 A13 D4 FP2 M16 Fuel: 3 turns. Carries 2 Bombs. Requires Rocketry. -20. Anti-aircraft Artillery added. Cost: 50. A1 D1 FP2. Moves:2. 4X bonus vs. Air units. -21. Air units can airlift themselves. -22. Balloon added. Cost: 25. Ao D0 M5 Fuel:2. Has good vision but can't fly over mountains. -23. Jet Fighter added. Cost: 70. A6 D5 FP2 M24. Requires Space Flight, so does: -24. Jet Bomber added. Cost: 145. A15 D1 FP2 M19 Fuel:3. Can Pillage. Unreachable to propeller Fighters. -25. Stealth Bomber, A19 (was 18), SAM Battery only 25% bonus (was 2x) -26. Stealth Fighter, SAM Battery only 25% Bonus (was 2x) -27. Spies cost 35 (was 30.) -28. Atom Bomb available with Nuclear Fission + Manhattan Project. -29. Nuclear Missiles get 1.5x moves and 2.25x target area over 1x rates. Available with Space Flight. -30. Rare post-Elite veteran levels obtainable. (See manual under Combat.) - -PROJECT POSEIDON: GLORIFYING THE ANCIENT SEAS -1. Combat Rounds: Ancient ships have 15 combat rounds when attacking. It may or may not result in a winner. -2. River-worthy ships. Most ancient ships can travel on rivers. -3. Trireme changes: Cost:20, Combat Rounds:15 Alphabet, Can do commerce functions (same as Caravan). -4. Longboat added. Cost:25 A2 D1 M6 CR:15, Cargo:1, Map Making, can do shore attack. -5. Galley added. Cost:30 A2 D2 M6 CR:15, Cargo:2, Sea Faring, can do Commerce functions like a Caravan. -6. War Galley. Cost: 40. A3 D3 M6 CR:15 Cargo:3, Astronomy, can do shore attack. -7. Ram Ship. Cost:35 A4 D2 M6 CR:standard Cargo:0, Engineering, no rivers, no shore, no commerce, bad vision. -8. Caravel changes: A4 D4 M7 CR:15, can establish traderoutes. -9. Galleon changes: A2 D3 M8 CR:15, 50% chance to escape from a defeated stack (see below) -10. Frigate changes: D3, can travel rivers like the rest, 50% chance to escape defeated stack (see below) - -PROJECT NEPTUNE: MODERN NAVAL RE-BALANCE -1. Stack-Escape: modern ships (and Aircraft) have 50% chance to escape a defeated stack if they have more remaining - ... moves than the attacking unit. -2. Submarine changes: HP28 (was 30), Unreachable by Air units, req:Automobile. -3. Destroyer changes: A5 D5, 4x defense vs. Subs -4. Cruiser changes: M11 (was 10), 2x defense vs. Subs -5. Battleship: M10 (was 8), 2x defense vs. Subs req: Refining. -6. AEGIS Cruiser: M11 (was 10), better vision, Carry:2 missiles, can attack Air/Missiles, 2x defense vs Subs, - ... 3x defense vs. Air attackers. -7. Missile Destroyer added, upgrades Destroyer. A5 D5 FP2 HP30 M12. Carry:1 missile, 2x vs Subs, 2x vs. Air. Rocketry. - -WONDERS - ReWonder 2.0 -1. Pyramids: Added Classic effect of +25% food storage in every city. Still raptures in home city. -2. Copernicus' Observatory cost changed to 100 shields. -3. Great Wall. Cost: 275. Obsolete by: Machine Tools. -4. Supreme Court is the new name for Great Library, to avoid confusion for players coming from Classic. -5. Hanging Garden gains +2 luxury to the home city it's built in. -6. Colossus obsolete by Automobile, not Flight. -7. Lighthouse: +2 moves, +1 vision, obsolete by Miniaturization. -8. Adam Smith Trading Co.: same but enables 3 new specialists - ... a. Farmer: adds 1/0/0 to output - ... b. Merchant: adds 0/0/2 + 1 gold to output - ... c. Laborer: adds 0/1/0 to output -9. Ecclesiastical Palace added. Mysticism. Reduces corruption as a second capital. Gives same bonuses as Palace except - ... any capital prod bonuses become capital gold bonuses. -10. Temple of Artemis added. Mysticism. Cost 250. +1 gold,luxury,bulb,and shield in every city. -11. Mausoleum of Mausolus added. Ceremonial Burial. +1 content for each City Walls or Courthouse. -12. Statue of Zeus. 1 unhappy form military made content in all cities, +1 happy in home city, +4 free upkeep in - ... home city. Polytheism. -13. Genghis Khan's Equestrian School. Cost:150 +1 move for ALL mounted units except Cavalry. Horeseback Riding. -14. Tesla's Laboratory. Electricity. Cost:200. Upgrades 1 obsolete unit per turn, no expiration. -15. Gibraltar Fortress. Cost:350. Metallurgy. Coastal Defense in all cities. - -BUILDINGS -1. Courthouse overhauled to be useful again and better assist non-rapture governments. - ... a. Cost 45. This reflects its loss of over half its Classic value, which was prevention of incitations. - ... b. Corruption reduction changed to 60%. (Rounding turned 50% to 41%. 60% renders real 53%.) - ... c. Gives 1 free unit upkeep (law and order bonus) - ... d. Decreases hostile espionage chances by ~20%. Read manual for full details. - ... e. Nullifies tile penalties in Anarchy and Despotism. -2. Granary cost 35 shields: slightly aids non-rapture governments. -3. Mass Transit: 60 shields, +2T. Recycling Center: 70 shields, +2P. This fixed 2 totally broken buildings. -4. Palace makes +1 happy to support capital having higher population. -5. Police station adds 10% bonus against diplomatic combat and Steal Tech, and prevents enemies from establishing an - ... embassy without first agreeing to cease-fire, armistice, or peace. - -TERRAIN AND BASES -1. Tile resource “Gold” goes from 0/1/6 to 0/1/8. (Formerly it had the lowest F/P/T score of all resources.) -2. Jungle, Tundra: Micro-adjustments to stats so they can integrate into the game again instead of always be turned off. -3. Oasis is a water source for irrigation. -4. Swamp Transform reduced to 12 worker-turns: aids fairness and naval balance in continental games. -5. Transform time for Grasslands to Hills changed from 12 to 15. -6. Engineering lets Infra units dig Canal tile improvement. The only effect of a Canal is it lets ships pass through. -7. Terrain Defense changes: Forest/Swamp/River go to 1.33x (was 1.5x). -8. Can't plant forest or "build a hill" under an existing city. -9. Fort added. requires Masonry. 1.33x defense vs Land/Sea EXCEPT Armor. Building a Fortress requires a Fort to be there first. - -NEW FEATURES / GAME MECHANICS -1. Traderoutes are back: - ... a. 1 per city - ... b. Must be foreign city 12+ tiles distance - ... c. Revenue is lower, based only on combined trade of both cities, no logarithms, etc. - ... ... Equitable with a slightly below average building investment. - ... d. Turned off during war but reactivate in peace. - ... e. -25% (approx.) to revenue from Flight or Railroad discovery. - ... f. Enter Marketplace for one-time bonus can be done, possible to get better investment - ... ... than Coinage if and only if both cities are high trade. -2. Diplomacy Fix: Cease-fire and Peace can be done without embassy if players' units have met in last 10 turns. -3. Resource gold is 0/1/8. (Formerly it had the lowest F/P/T score of any resource.) -4. Jungle,Tundra,Glacier, and their resources return to the game. Micro-rebalance so that "all-temperate" setting - ... is no longer necessary. -5. Oasis is a water source for irrigation. Nile Effect gives extra +1 food to irrigated desert rivers. -6. Illegal Action movement penalty removed. -7. Transform time from Swamp to Ocean is 12 worker-turns, not 36. (patches geographic balance and fairness) -8. Transform time for Grass to Hills is 15 worker-turns, not 12. (balances some exploits) -9. The new Well-digger is a "patch" unit that gives fair balance to nations who have no nearby water. -10. Canals: Workers/Engineers can make Canals after Engineering: allows ships to pass through. -11. Caravans and Freight can help build Foreign Wonders. This increases diplomatic negotiation possibilities. -12. Helicopters may use Fortresses as bases to rest and repair. -13. Expelling: All land military except warriors can expel a non-military unit from your territory IF it is not on a mountain. - ... a. Fighter types can also expel an AWACS. Units must be alone on the tile to be expelled. -14. Capturing: Workers/Explorers/Caravans/Freight can be captured by a Foot soldier or Mounted soldier whose attack is - ... A3 or higher. But not if they are on Mountains or other units are on the tile. -15. Steal Map Fragments - Diplomats and Spies can steal map fragments of the explored world map. -16. Maximum Granary food store capped at 70. Give some balance to non-rapture governments. -17. Forest, Swamp, River 1.33x defense bonus (was 1.5). Can't transform City Centre to Forest or Hill. -18. Fort added. Defense bonuses smoothed. See Bases -19. Naval Base added. Layers over Fortress. Gives 1.33x defense and +20% HP regeneration for ships. -20. Timeline changed to match technological pace of the game. No cannons in 100 BC ! -21. Incite cost changed. Goes from impossibly high to extremely high (but theoretically possible: e.g., 120000 might go to 4500) - - - -END. \ No newline at end of file diff --git a/freeciv/freeciv/data/.historic/mp2sandbox/buildings.ruleset b/freeciv/freeciv/data/.historic/mp2sandbox/buildings.ruleset deleted file mode 100644 index b95a5b0d0..000000000 --- a/freeciv/freeciv/data/.historic/mp2sandbox/buildings.ruleset +++ /dev/null @@ -1,2062 +0,0 @@ -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes, -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -; Note that the freeciv AI may not cope well with anything more -; than minor changes. - -[datafile] -description="Multiplayer-Evo buildings data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -; /* <-- avoid gettext warnings -; -; Below: The individual buildings, one per section. -; (Buildings = City Improvements and Wonders) -; -; The actual tag used (the * in [building_*]) does not matter, except -; it must be unique within this file, and it may be used in debug -; output when reading this file. -; -; Notes: -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; if -; not present, "name" is used for this purpose too. Since -; the name used in savegames must not change, if you want -; to rename an item after a ruleset has been released, you -; should set "rule_name" to the original value of "name". -; genus = genus; one of: -; "GreatWonder", "SmallWonder", "Improvement", "Special". -; reqs = requirements to build the building (see effects.ruleset -; and README.effects for help on requirements) -; graphic = icon of improvement (used in city dialog) -; graphic_alt = alternate icon of improvement -; obsolete_by = requirements for the building to become obsolete -; build_cost = production shields required to build -; upkeep = monetary upkeep value -; sabotage = percent chance of diplomat sabotage being successful -; flags = special flag strings -; -; ** Building flags ** -; "VisibleByOthers" = Anyone who can see your city knows whether it has -; this improvement. (Great and small wonders are -; always visible.) -; "SaveSmallWonder" = If you lose the city with this building in, and the -; "savepalace" server setting is enabled, another will -; be built for free in a random city. -; Should only be used with genus "SmallWonder". -; "Gold" = Not a real building; production turned into gold -; indefinitely (capitalization/coinage). -; Genus should be "Special". -; "DisasterProof" = Disasters never destroy this building. Is meaningful -; only for genus "Improvement" buildings as others are -; automatically disaster proof. -; -; */ <-- avoid gettext warnings - -[building_airport] -name = _("Airport") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Radio", "Player" - } -graphic = "b.airport" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 120 -upkeep = 3 -sabotage = 100 -sound = "b_airport" -sound_alt = "b_generic" -helptext = _("\ -Allows a city to produce veteran Air units, Helicopters, and Missiles.\ - Damaged Air units and Helicopters which stay in town for one full turn\ - without moving are completely repaired.\ -"), _("\ -Two cities with Airports can airlift units. Airlifting instantly transports\ - the unit from one city to another and will use up all movement\ - points. A unit must have some movement points left to be airlifted.\ -") - -[building_amphitheatre] -name = _("Amphitheater") -rule_name = "Amphitheatre" ; en_GB used originally -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Construction", "Player" - } -graphic = "b.colosseum" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 4 -sabotage = 100 -sound = "b_colosseum" -sound_alt = "b_generic" -helptext = _("\ -Entertains the citizens of a city, making 3 unhappy citizens content. \ - (Four after the discovery of Electricity.) However, it does not\ - affect citizens made unhappy by military activity.\ -") - -[building_aqueduct] -name = _("Aqueduct") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Construction", "Player" - } -graphic = "b.aqueduct" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 2 -sabotage = 100 -sound = "b_aqueduct" -sound_alt = "b_generic" -helptext = _("\ -Allows a city to grow larger than size 8. A Sewer System is also\ - required for a city to grow larger than size 12.\ -") -; There is also an effect to reduce the chance of plague, but you have to -; enable illness in game.ruleset for that to be relevant. - -[building_bank] -name = _("Bank") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Banking", "Player" - "Building", "Marketplace", "City" - } -graphic = "b.bank" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 80 -upkeep = 2 -sabotage = 100 -sound = "b_bank" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Together, a Bank and Marketplace double the tax and luxury production in a city.\ - That is, the Bank adds another +50% to the +50% of the Marketplace.\ -") - -[building_barracks] -name = _("Barracks") -genus = "Improvement" -reqs = - { "type", "name", "range" - - } -graphic = "b.barracks_i" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Gunpowder", "Player" - "Building", "Barracks II", "City" - "Building", "Barracks III", "City" - } -build_cost = 30 -upkeep = 1 -sabotage = 100 -sound = "b_barracks_i" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -With a Barracks I, each new land unit built in a city will\ - automatically have Veteran V1 status, which means that its attack and\ - defense strengths are increased by 50%. Also, damaged land units\ - which stay in town for one full turn without moving are completely\ - healed. Obsolete by: Gunpowder.\ -") - -[building_barracks_ii] -name = _("Barracks II") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Gunpowder", "Player" - } -graphic = "b.barracks_ii" -graphic_alt = "b.barracks_i" -obsolete_by = - { "type", "name", "range" - "Tech", "Mobile Warfare", "Player" - "Building", "Barracks III", "City" - } -build_cost = 30 -upkeep = 1 -sabotage = 100 -sound = "b_barracks_ii" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -With a Barracks II, each new land unit built in a city will\ - automatically have Veteran V1 status, which means that its attack and\ - defense strengths are increased by 50%. Also, damaged land units\ - which stay in town for one full turn without moving are completely\ - restored. Obsolete by: Mobile Warfare.\ -") - -[building_barracks_iii] -name = _("Barracks III") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Mobile Warfare", "Player" - } -graphic = "b.barracks_iii" -graphic_alt = "b.barracks_i" -obsolete_by = - { "type", "name", "range" - } -build_cost = 30 -upkeep = 1 -sabotage = 100 -sound = "b_barracks_iii" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -With a Barracks III, each new land unit built in a city will\ - automatically have Veteran V1 status, which means that its attack and\ - defense strengths are increased by 50%. Also, damaged land units\ - which stay in town for one full turn without moving are completely\ - restored.\ -"), _("\ -When combined with an Airport and Port Facility, Marines built in the city\ - will automatically have Hardened V2 status.\ -") - -[building_cathedral] -name = _("Cathedral") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Monotheism", "Player" - "Building", "Temple", "City" - } -graphic = "b.cathedral" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 75 -upkeep = 3 -sabotage = 100 -sound = "b_cathedral" -sound_alt = "b_generic" -helptext = _("\ -A Cathedral makes 3 unhappy citizens content, but does not affect citizens\ - made unhappy by military activity. Theology increases the effect by +1.\ - Communist government decreases the effect by -1. (Michelangelos Chapel enhances\ - the effect of Cathedrals by +1 happy citizen and +1 forced content citizen.)\ -") - -[building_city_walls] -name = _("City Walls") -genus = "Improvement" -flags = "VisibleByOthers" -reqs = - { "type", "name", "range" - "Tech", "Masonry", "Player" - } -graphic = "b.city_walls" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 0 -sabotage = 50 -sound = "b_city_walls" -sound_alt = "b_generic" -helptext = _("\ -City Walls increase the 1.5x bonus for Land units in a city to 3x, effectively\ - doubling the strength of Land units against attacks from other Land units (and\ - Helicopters.) City Walls are ineffective against Air units, Sea units, Missiles,\ - and Howitzers; in which case the normal 1.5x bonus is given. City Walls prevent\ - population loss when a defending unit is destroyed by a Land unit.\ -") - -[building_coastal_defense] -name = _("Coastal Defense") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Gunpowder", "Player" - "TerrainClass", "Oceanic", "Adjacent" - } -graphic = "b.coastal_defense" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 1 -sabotage = 100 -sound = "b_coastal_defense" -sound_alt = "b_generic" -helptext = _("\ -Doubles the defense strength of all units in a city when defending against\ - against enemy ships.\ -") - -[building_courthouse] -name = _("Courthouse") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Code of Laws", "Player" - } -graphic = "b.courthouse" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 45 -upkeep = 1 -sabotage = 100 -sound = "b_courthouse" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Reduces corruption in a city by roughly half (60% but rounded down.)\ - Provides law and order to support +1 unit free of upkeep. Eliminates\ - tile corruption under Anarchy and Despotism.\ -"), _("\ -Diplomatic attacks on your diplomatic units are 15% less effective.\ - (50%-15%=35%). The basic Steal Tech action is 35% less effective.\ - (80%-35%=45%). All other hostile diplomatic actions are 20% less effective.\ -"), _("\ -In a Democracy, a Courthouse makes 1 unhappy citizen content (unless that\ - citizen is unhappy about military activity).\ -"), _("\ -Cost to incite revolt in the city is 2x if empty and 4x if occupied.\ -") - -[building_factory] -name = _("Factory") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Industrialization", "Player" - } -graphic = "b.factory" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 140 -upkeep = 4 -sabotage = 100 -sound = "b_factory" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Increases the shield production in a city by +50%. This increase may\ - contribute to pollution.\ -") - -[building_granary] -name = _("Granary") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Pottery", "Player" - } -graphic = "b.granary" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 35 -upkeep = 1 -sabotage = 100 -sound = "b_granary" -sound_alt = "b_generic" -helptext = _("\ -The amount of stored food will be set to half full whenever a city\ - with a Granary 1) grows in size, or 2) loses size from starvation.\ - This helps a city to grow faster and more easily withstand famine.\ -") - -[building_harbour] -name = _("Harbor") -rule_name = "Harbour" ; en_GB spelling used originally -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Seafaring", "Player" - "TerrainClass", "Oceanic", "Adjacent" - } -graphic = "b.harbour" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 40 -upkeep = 1 -sabotage = 100 -sound = "b_harbour" -sound_alt = "b_generic" -helptext = _("\ -Gives one extra food resource on all Oceanic tiles. The city needs\ - to be coastal to build this improvement.\ -") - -[building_hydro_plant] -name = _("Hydro Plant") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Electronics", "Player" - "Building", "Factory", "City" - "Extra", "River", "Adjacent" - } -graphic = "b.hydro_plant" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 180 -upkeep = 4 -sabotage = 100 -sound = "b_hydro_plant" -sound_alt = "b_generic" -helptext = _("\ -For each Factory or Mfg. Plant in a city, a Hydro Plant adds +25% to\ - base production, and reduces pollution from production by -25%.\ -"), _("\ -*If a city has either a Factory or Mfg. Plant, this makes a combined +75%\ - production bonus with a 25% decrease in pollution from production.\ -"), _("\ -*In a city with both a Factory and Mfg. Plant, this makes a combined +150%\ - production bonus with a 50% decrease in pollution from production.\ -"), _("\ -*Only one Power Plant, Hydro Plant, Nuclear Plant, or\ - Solar Plant can have an active effect in a city.\ -") - -[building_library] -name = _("Library") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Writing", "Player" - } -graphic = "b.library" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 1 -sabotage = 100 -sound = "b_library" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Increases the science output in a city by +100%.\ -") - -[building_marketplace] -name = _("Marketplace") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Currency", "Player" - } -graphic = "b.marketplace" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 0 -sabotage = 100 -sound = "b_marketplace" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Increases the luxury and tax output in a city by +50%.\ -") - -[building_mass_transit] -name = _("Mass Transit") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Mass Production", "Player" - } -graphic = "b.mass_transit" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 0 -sabotage = 100 -sound = "b_mass_transit" -sound_alt = "b_generic" -helptext = _("\ -Eliminates the pollution generated by population.\ - Production becomes the only source of pollution in\ - the city.\ -"), _("\ -Increased citizen mobility and ticket revenues\ - increase base trade on city centre tile by +2\ -") - -[building_mfg_plant] -name = _("Mfg. Plant") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Robotics", "Player" - "Building", "Factory", "City" - } -graphic = "b.mfg_plant" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 220 -upkeep = 6 -sabotage = 100 -sound = "b_mfg_plant" -sound_alt = "b_generic" -helptext = _("\ -A Manufacturing Plant increases base production by +50%.\ -"), _("\ -A Mfg. Plant & Factory together double the production in a city.\ - That is, the Mfg. Plant adds another +50% to the +50% of the Factory.\ -"), _("\ -A Mfg. Plant with a Factory AND a Power/Hydro/Nuclear/Solar Plant\ - will combine for a total +150% increase over base production.\ -"), _("\ -The pollution reduction of a Hydro/Nuclear/Solar Plant is applied one more time\ - to cities with Mfg. Plants, effectively doubling the bonus percentage.\ -") - -[building_nuclear_plant] -name = _("Nuclear Plant") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Nuclear Power", "Player" - "Building", "Factory", "City" - } -graphic = "b.nuclear_plant" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 120 -upkeep = 2 -sabotage = 100 -sound = "b_nuclear_plant" -sound_alt = "b_generic" -helptext = _("\ -For each Factory or Mfg. Plant in a city, a Nuclear Plant adds +25% to\ - base production, and reduces pollution from production by -25%.\ -"), _("\ -*If a city has either a Factory or Mfg. Plant, this makes a combined +75%\ - production bonus with a 25% decrease in pollution from production.\ -"), _("\ -*In a city with both a Factory and Mfg. Plant, this makes a combined +150%\ - production bonus with a 50% decrease in pollution from production.\ -"), _("\ -*Only one Power Plant, Hydro Plant, Nuclear Plant, or\ - Solar Plant can have an active effect in a city.\ -") - -[building_offshore_platform] -name = _("Offshore Platform") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Miniaturization", "Player" - "TerrainClass", "Oceanic", "Adjacent" - } -graphic = "b.offshore_platform" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 120 -upkeep = 3 -sabotage = 100 -sound = "b_offshore_platform" -sound_alt = "b_generic" -helptext = _("\ -Adds 1 extra production to all Oceanic tiles worked by a city. The\ - city needs to be coastal to build this improvement.\ -") - -[building_police_station] -name = _("Police Station") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Communism", "Player" - } -graphic = "b.police_station" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 50 -upkeep = 2 -sabotage = 100 -sound = "b_police_station" -sound_alt = "b_generic" -helptext = _("\ -Neutralizes the unhappiness caused by two military units. Assists domestic diplomatic\ - units against hostile diplomatic attacks with a 10% bonus. Decreases the chance of\ - tech theft by 10%. Prevents enemies from establishing an embassy without first\ - agreeing to cease-fire, armistice, or peace.\ -") - -[building_port_facility] -name = _("Port Facility") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Amphibious Warfare", "Player" - "TerrainClass", "Oceanic", "Adjacent" - } -graphic = "b.port_facility" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 3 -sabotage = 100 -sound = "b_port_facility" -sound_alt = "b_generic" -helptext = _("\ -Allows a city to build veteran sea units. Damaged sea units\ - which stay in town for one full turn without moving are completely\ - restored.\ -") - -[building_power_plant] -name = _("Power Plant") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Refining", "Player" - "Building", "Factory", "City" - } -graphic = "b.power_plant" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 130 -upkeep = 4 -sabotage = 100 -sound = "b_power_plant" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -For each Factory or Mfg. Plant in a city, a Power Plant adds +25% to\ - base production. The extra production may lead to more pollution.\ -"), _("\ -*If a city has either a Factory or Mfg. Plant, this makes a combined +75%\ - production bonus.\ -"), _("\ -*In a city with both a Factory and Mfg. Plant, this makes a combined +150%\ - production bonus.\ -"), _("\ -*Only one Power Plant, Hydro Plant, Nuclear Plant, or\ - Solar Plant can have an active effect in a city.\ -") - -[building_recycling_center] -name = _("Recycling Center") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Recycling", "Player" - } -graphic = "b.recycling_center" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 70 -upkeep = 1 -sabotage = 100 -sound = "b_recycling_center" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -A Recycling Center reduces the pollution\ - generated by production in a city by -66%. Supply of raw\ - recycled materials adds +2 producton to the city\ - center tile.\ -") - -[building_research_lab] -name = _("Research Lab") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Computers", "Player" - "Building", "University", "City" - } -graphic = "b.research_lab" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 120 -upkeep = 3 -sabotage = 100 -sound = "b_research_lab" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Adds +100% to base science output for each Library and University\ - in a city.\ -*In a city with a Library or University, the combined increase to science\ - output is +200%. \ -*In a city with a Library and a University, the combined increase\ - is +450%.\ -") - -[building_sam_battery] -name = _("SAM Battery") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Rocketry", "Player" - } -graphic = "b.sam_battery" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 70 -upkeep = 2 -sabotage = 100 -sound = "b_sam_battery" -sound_alt = "b_generic" -helptext = _("\ -Doubles the defense of all units inside the city when attacked by\ - aircraft (not including Helicopters or Missiles). Stealth aircraft\ - reduce the bonus to 25%.\ -") - -[building_sdi_defense] -name = _("SDI Defense") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Laser", "Player" - } -graphic = "b.sdi_defense" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 140 -upkeep = 4 -sabotage = 100 -sound = "b_sdi_defense" -sound_alt = "b_generic" -helptext = _("\ -Protects a city and its environs (up to 2 tiles away) from attacks\ - by Nuclear units. A Nuclear unit not owned by you or a teammate will\ - be shot down and have no effect if it tries to detonate in this area.\ - Nuclear units detonating outside this area will still affect all tiles\ - adjacent to ground zero, including tiles within the protected area.\ - SDI also doubles defense for units in the city against non-nuclear missiles.\ -") - -[building_sewer_system] -name = _("Sewer System") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Sanitation", "Player" - "Building", "Aqueduct", "City" - } -graphic = "b.sewer_system" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 80 -upkeep = 2 -sabotage = 100 -sound = "b_sewer_system" -sound_alt = "b_generic" -helptext = _("\ -Allows a city to grow larger than size 12. An Aqueduct is first\ - required for a city to grow larger than size 8.\ -") -; There is also an effect to reduce the chance of plague, but you have to -; enable illness in game.ruleset for that to be relevant. - -[building_solar_plant] -name = _("Solar Plant") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Environmentalism", "Player" - "Building", "Factory", "City" - } -graphic = "b.solar_plant" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 140 -upkeep = 4 -sabotage = 100 -sound = "b_solar_plant" -sound_alt = "b_generic" -helptext = _("\ -For each Factory or Mfg. Plant in a city, a Solar Plant adds +25% to\ - base production, and reduces pollution from production by -50%.\ -"), _("\ -*If a city has either a Factory or Mfg. Plant, this makes a combined +75%\ - production bonus with a 50% decrease in pollution from production.\ -"), _("\ -*In a city with both a Factory and Mfg. Plant, this makes a combined +150%\ - production bonus with 100% elimination of all pollution from production.\ -"), _("\ -*Only one Power Plant, Hydro Plant, Nuclear Plant, or\ - Solar Plant can have an active effect in a city.\ -") - -[building_space_component] -name = _("Space Component") -genus = "Special" -reqs = - { "type", "name", "range" - "Tech", "Plastics", "Player" - "Building", "Factory", "City" - } -graphic = "b.space_component" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 1000 -upkeep = 0 -sabotage = 100 -sound = "b_space_component" -sound_alt = "b_generic" -helptext = _("\ -Space Components can be differentiated into Propulsion and Fuel Components.\ - Each pair of them reduces spaceship travel time. You can build up to 8 pairs.\ -"), _("\ -Before you can build any spaceship parts, any nation must have built the\ - Apollo Program.\ -") - -[building_space_module] -name = _("Space Module") -genus = "Special" -reqs = - { "type", "name", "range" - "Tech", "Superconductors", "Player" - "Building", "Factory", "City" - } -graphic = "b.space_modules" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 2000 -upkeep = 0 -sabotage = 100 -sound = "b_space_module" -sound_alt = "b_generic" -helptext = _("\ -Space Modules are the most expensive parts of spaceships. There\ - are three different types of Space Module:\ -"), _("\ -- Habitation Module: provides living space for 10,000 people.\ -"), _("\ -- Life Support Module: provides food and water for the population of\ - one Habitation Module.\ -"), _("\ -- Solar Panels: provides the energy needed for any two of the other\ - Modules.\ -"), _("\ -You can build up to 4 Space Modules of each kind.\ -"), _("\ -Before you can build any spaceship parts, any nation must have built the\ - Apollo Program.\ -") - -[building_space_structural] -name = _("Space Structural") -genus = "Special" -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "Building", "Factory", "City" - } -graphic = "b.space_structural" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 500 -upkeep = 0 -sabotage = 100 -sound = "b_space_structural" -sound_alt = "b_generic" -helptext = _("\ -Space Structurals form the base of your spaceship. All other\ - spaceship parts need to be connected to Structurals in order to\ - function. You can build up to 32 Space Structurals.\ -"), _("\ -Before you can build any spaceship parts, a nation must have built the\ - Apollo Program.\ -") - -[building_stock_exchange] -name = _("Stock Exchange") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Economics", "Player" - "Building", "Bank", "City" - } -graphic = "b.stock_exchange" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 120 -upkeep = 3 -sabotage = 100 -sound = "b_stock_exchange" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -In cities with a Bank, a Stock Exchange boosts tax and luxury\ - production by an additional +50%.\ -"), _("\ -*A Bank and Stock Exchange together boost\ - tax and luxury production by +100%.\ -"), _("\ -*A Marketplace, Bank, and Stock Exchange together boost\ - tax and luxury production by +150%.\ -") - -[building_super_highways] -name = _("Super Highways") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Automobile", "Player" - } -graphic = "b.super_highways" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 120 -upkeep = 3 -sabotage = 100 -sound = "b_super_highways" -sound_alt = "b_generic" -helptext = _("\ -Increases trade by +50% on all tiles with roads, railroads, or MagLev (rounded down.) Improves transportation\ - logistics to an Airport, giving +1 airlift capacity to cities over size 12.\ -") - -[building_supermarket] -name = _("Supermarket") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Refrigeration", "Player" - } -graphic = "b.supermarket" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 80 -upkeep = 3 -sabotage = 100 -sound = "b_supermarket" -sound_alt = "b_generic" -helptext = _("\ -Increases the food resources by +100% on each farmland tile which\ - is being used around the city. An irrigable city centre tile receives a\ - +50% bonus immediately, but cannot receive a benefit from farmland.\ - Farmland tiles are those which have been irrigated a second time.\ -") - -[building_temple] -name = _("Temple") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Ceremonial Burial", "Player" - } -graphic = "b.temple" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 30 -upkeep = 1 -sabotage = 100 -sound = "b_temple" -sound_alt = "b_generic" -helptext = _("\ -Makes one unhappy citizen content. Mysticism doubles\ - this effect. With both Mysticism and the Oracle, +4 citizens are\ - made content. Does not affect citizens made unhappy by military\ - activity.\ -") - -[building_university] -name = _("University") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "University", "Player" - "Building", "Library", "City" - } -graphic = "b.university" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 120 -upkeep = 3 -sabotage = 100 -sound = "b_university" -sound_alt = "b_generic" -helptext = _("\ -Adds +150% to science output in a city with a Library.\ -"), _("\ -*A University and Library combine for a +250% increase\ - in science output.\ -") - -[building_palace] -name = _("Palace") -genus = "SmallWonder" -flags = "SaveSmallWonder" -reqs = - { "type", "name", "range" - "Tech", "Masonry", "Player" - } -graphic = "b.palace" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 70 -upkeep = 0 -sabotage = 0 -sound = "b_palace" -sound_alt = "b_generic" -helptext = _("\ -Makes a city the capital of your nation.\ - Corruption in cities increases with distance\ - from the capital (except under Democracy or\ - Communism.) A Palace reduces corruption in your capital\ - by roughly half.\ -"), _("\ -The cost of inciting a revolt decreases with distance from the\ - capital. The capital cannot be incited to revolt, and reduces the chance\ - of enemy agents defeating your agents by 50%. Attempts to sabotage buildings\ - in your capital are also reduced by 50%.\ -"), _("\ -Take good care of your capital, as its loss may result in your\ - empire plunging into civil war. Losing your current palace also\ - results in losing whatever spaceship you might have.\ -"), _("\ -If the capital is in a dangerous location, or a more central capital\ - would give a better corruption distribution, you can move your palace\ - by rebuilding it in another city.\ -"), -_("\ -The city containing the Palace receives a production bonus of +75% under Despotism,\ - +50% under Monarchy, and +25% under Communism. Under Fundamentalism, it receives\ - a +50% gold bonus.\ -") - -[building_ecclesiastical_palace] -name = _("Ecclesiastical Palace") -genus = "SmallWonder" -flags = "SaveSmallWonder" -reqs = - { "type", "name", "range" - "Tech", "Mysticism", "Player" - } -graphic = "b.ecclesiastical_palace" -graphic_alt = "b.palace" -obsolete_by = - { "type", "name", "range" - } -build_cost = 110 -upkeep = 0 -sabotage = 0 -sound = "b_palace" -sound_alt = "b_generic" -helptext = _("\ -Makes a city the religious capital that acts as a second center of government.\ -"), _("\ -This building is a second Palace and gives all effects of a Palace,\ - including reduction of corruption (based on the nearest capital.)\ - Unlike the Palace, capital production bonuses are rendered in gold\ - tithes rather than shield output. Fundamentalism gets a +50% tithe\ - gold bonus in tithes, in its ecclesiasitcal capital.\ -"), _("\ -The city where this Palace is located cannot be incited to revolt,\ - and enjoys a bonus when enemy agents try to evade your own agents\ - stationed in the city, or sabotage your buildings.\ -"), _("\ -Under Fundamentalism, Fanatics produced in the city with this building\ - are inspired by fervorous faith to +1 higher veteran level.\ -") - -[building_agoge] -name = _("Agōgē of Sparta") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Bronze Working", "Player", TRUE, FALSE - "Building", "Agōgē of Sparta", "Player", FALSE, TRUE - } -graphic = "b.agoge" -graphic_alt = "b.sun_tzus_war_academy" -obsolete_by = - { "type", "name", "range" - "Tech", "Gunpowder", "Player" - } -build_cost = 100 -upkeep = 0 -sabotage = 0 -sound = "w_agoge" -sound_alt = "w_generic" -helptext = _("\ -The Agōgē creates a culture of extreme fitness and battle readiness.\ - All your foot soldiers get +⅓ move. Phalanx and Pikemen receive a\ - +50% attack bonus.\ -"), _(" -The Agōgē is famous for vigilant patrols, secret shortcut trails, and\ - readiness for battle. Foot units in the city with the Agōgē\ - begin their turn with +1 move. Obsolete by: Gunpowder.\ -") - -[building_apollo_program] -name = _("Apollo Program") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Space Flight", "Player", TRUE, FALSE - "Building", "Apollo Program", "Player", FALSE, TRUE - } -graphic = "b.apollo_program" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 600 -upkeep = 0 -sabotage = 0 -sound = "w_apollo_program" -sound_alt = "w_generic" -helptext = _("\ -Allows you to start building spaceship parts in cities\ - with factories (assuming you have researched the necessary\ - technologies).\ -") - -[building_asmiths_trading_co] -name = _("A.Smith's Trading Co.") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Economics", "Player", TRUE, FALSE - "Building", "A.Smith's Trading Co.", "Player", FALSE, TRUE - } -graphic = "b.asmiths_trading_co" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 300 -upkeep = 0 -sabotage = 0 -sound = "w_asmiths_trading_co" -sound_alt = "w_generic" -helptext = _("\ -In all your cities, Buildings with upkeep of 1 gold become free.\ - This Wonder also allows three new specialists:\ -"), _(" - * Each Laborer produces 1 production point for their city per turn;\ -"), _(" - * Each Merchant produces 1 gold and 2 trade points per turn.\ - Trade is then distributed by your national tax rates.\ -"), _(" - * Each Farmer provides 1 food for their city per turn;\ -"), _(" - This wonder is never obsolete.\ -") - -[building_colossus] -name = _("Colossus") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Bronze Working", "Player", TRUE, FALSE - "Building", "Colossus", "Player", FALSE, TRUE - } -graphic = "b.colossus" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Automobile", "Player" - } -build_cost = 100 -upkeep = 0 -sabotage = 0 -sound = "w_colossus" -sound_alt = "w_generic" -helptext = _("\ -In the city where this wonder is built, +1 trade is added to every tile\ - that generates trade on its own.\ - Obsolete by: Automobile.\ -") - - -[building_copernicus_observatory] -name = _("Copernicus' Observatory") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Astronomy", "Player", TRUE, FALSE - "Building", "Copernicus' Observatory", "Player", FALSE, TRUE - } -graphic = "b.copernicus_observatory" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 100 -upkeep = 0 -sabotage = 0 -sound = "w_copernicus_observatory" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Boosts science production by 100% in the city where it is built.\ - That is, the base science level before any improvements were made,\ - is added to the total science. This wonder is never obsolete.\ -") - -[building_cure_for_cancer] -name = _("Cure For Cancer") -genus = "GreatWonder" -reqs = - { "type", "name", "range" - "Tech", "Genetic Engineering", "Player" - } -graphic = "b.cure_for_cancer" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 400 -upkeep = 0 -sabotage = 0 -sound = "w_cure_for_cancer" -sound_alt = "w_generic" -helptext = _("\ -This stunning technological achievement makes two content citizens\ - happy in all cities of all players who know Genetic\ - Engineering. In the event where there are not enough\ - content citizens to benefit from this effect, the wonder\ - applies to unhappy citizens (including those unhappy about military\ - activity), making each content then happy. This wonder is never obsolete.\ -") - -[building_eiffel_tower] -name = _("Eiffel Tower") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Steam Engine", "Player", TRUE, FALSE - "Building", "Eiffel Tower", "Player", FALSE, TRUE - } -graphic = "b.eiffel_tower" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 100 -upkeep = 0 -sabotage = 0 -sound = "w_eiffel_tower" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -All your cities support one unit free of\ - shield upkeep. This wonder is never obsolete.\ -") - -[building_genghis_khans_equestrian_school] -name = _("Genghis Khan's Equestrian School") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Horseback Riding", "Player", TRUE, FALSE - "Building", "Genghis Khan's Equestrian School", "Player", FALSE, TRUE - "Building", "Barracks", "City", TRUE, FALSE - } -graphic = "b.genghis_khans_equestrian_school" -graphic_alt = "b.sun_tzus_war_academy" -obsolete_by = - { "type", "name", "range" - "Tech", "Mobile Warfare", "Player" - } -build_cost = 150 -upkeep = 0 -sabotage = 0 -sound = "w_sun_tzus_war_academy" -sound_alt = "w_generic" -helptext = _("\ -Gives all mounted units +1 movement point, except for Cavalry. Must be\ - built in a city with Barracks I (not II). Obsolete by: Mobile Warfare.\ -") - -[building_gibraltar_fortress] -name = _("Gibraltar Fortress") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Metallurgy", "Player", TRUE, FALSE - "Building", "Gibraltar Fortress", "Player", FALSE, TRUE - "TerrainClass", "Oceanic", "Adjacent", TRUE, FALSE - } -graphic = "b.gibraltar_fortress" -graphic_alt = "b.great_wall" -obsolete_by = - { "type", "name", "range" - } -build_cost = 350 -upkeep = 0 -sabotage = 0 -sound = "w_gibraltar_fortress" -sound_alt = "w_generic" -helptext = _("\ -Gives a Coastal Defense in all your coastal cities. This has no effect\ - when Coastal Defense is already present. This Wonder must be built\ - in a coastal city. It does not become obsolete.\ -") - -[building_great_wall] -name = _("Great Wall") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Masonry", "Player", TRUE, FALSE - "Building", "Great Wall", "Player", FALSE, TRUE - } -graphic = "b.great_wall" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Machine Tools", "Player" - } -build_cost = 275 -upkeep = 0 -sabotage = 0 -sound = "w_great_wall" -sound_alt = "w_generic" -helptext = _("\ -Gives a City Wall in all your cities. This has no effect\ - when City Walls are already present. This Wonder is made\ - obsolete when any nation discovers Machine Tools.\ -") - -[building_hanging_gardens] -name = _("Hanging Gardens") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Pottery", "Player", TRUE, FALSE - "Building", "Hanging Gardens", "Player", FALSE, TRUE - } -graphic = "b.hanging_gardens" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Railroad", "Player" - } -build_cost = 200 -upkeep = 0 -sabotage = 0 -sound = "w_hanging_gardens" -sound_alt = "w_generic" -helptext = _("\ -Makes two content citizens happy in every city in your nation.\ - In the event where there are no content citizens to get the\ - effect of Hanging Gardens, the wonder applies to unhappy citizens\ - (including those unhappy about military activity), making each content\ - then happy. Gives +2 luxury in the city where it is built.\ - Obsolete by: Railroad.\ -") - -[building_hoover_dam] -name = _("Hoover Dam") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Electronics", "Player", TRUE, FALSE - "Extra", "River", "Adjacent", TRUE, FALSE - "Building", "Hoover Dam", "Player", FALSE, TRUE - } -graphic = "b.hoover_dam" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 600 -upkeep = 0 -sabotage = 0 -sound = "w_hoover_dam" -sound_alt = "w_generic" -helptext = _("\ -Works exactly as a Hydro Plant in all your cities.\ - (This reduces pollution and increases the effects\ - of Factories and Mfg. Plants.) This wonder is never obsolete.\ -") - -[building_isaac_newtons_college] -name = _("Isaac Newton's College") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Theory of Gravity", "Player", TRUE, FALSE - "Building", "Isaac Newton's College", "Player", FALSE, TRUE - } -graphic = "b.isaac_newtons_college" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 400 -upkeep = 0 -sabotage = 0 -sound = "w_isaac_newtons_college" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Adds 100% of base science production to every city in your\ - nation that has a University. That is, the boost that a\ - Library gives with no other science improvements is added\ - to the total science output in each city with a University.\ - This wonder is never obsolete.\ -") - -[building_js_bachs_cathedral] -name = _("J.S. Bach's Cathedral") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Theology", "Player", TRUE, FALSE - "Building", "J.S. Bach's Cathedral", "Player", FALSE, TRUE - } -graphic = "b.js_bachs_cathedral" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 300 -upkeep = 0 -sabotage = 0 -sound = "w_js_bachs_cathedral" -sound_alt = "w_generic" -helptext = _("\ -Makes two unhappy citizens content in every city in your nation\ - (including citizens unhappy about military activity).\ - This wonder is never obsolete.\ -") - -[building_king_richards_crusade] -name = _("King Richard's Crusade") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Engineering", "Player", TRUE, FALSE - "Building", "King Richard's Crusade", "Player", FALSE, TRUE - } -graphic = "b.king_richards_crusade" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Robotics", "Player" - } -build_cost = 150 -upkeep = 0 -sabotage = 0 -sound = "w_king_richards_crusade" -sound_alt = "w_generic" -helptext = _("\ -Adds one extra shield resource on every tile in and around\ - the city where it is built. Obsolete by: Robotics.\ -") - -[building_leonardos_workshop] -name = _("Leonardo's Workshop") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Invention", "Player", TRUE, FALSE - "Building", "Leonardo's Workshop", "Player", FALSE, TRUE - } -graphic = "b.leonardos_workshop" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Automobile", "Player" - } -build_cost = 300 -upkeep = 0 -sabotage = 0 -sound = "w_leonardos_workshop" -sound_alt = "w_generic" -helptext = _("\ -Upgrades two obsolete units per game turn. Obsolete by:\ - Automobile.\ -") - -[building_lighthouse] -name = _("Lighthouse") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Map Making", "Player", TRUE, FALSE - "TerrainClass", "Oceanic", "Adjacent", TRUE, FALSE - "Building", "Lighthouse", "Player", FALSE, TRUE - } -graphic = "b.lighthouse" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Miniaturization", "Player" - } -build_cost = 170 -upkeep = 0 -sabotage = 0 -sound = "w_lighthouse" -sound_alt = "w_generic" -helptext = _("\ -Gives all your sea units 2 additional movement points,\ - while increasing their vision. Obsolete by: Miniaturization.\ -") - -[building_magellans_expedition] -name = _("Magellan's Expedition") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Navigation", "Player", TRUE, FALSE - "TerrainClass", "Oceanic", "Adjacent", TRUE, FALSE - "Building", "Magellan's Expedition", "Player", FALSE, TRUE - } -graphic = "b.magellans_expedition" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 400 -upkeep = 0 -sabotage = 0 -sound = "w_magellans_expedition" -sound_alt = "w_generic" -helptext = _("\ -All your new sea units built in cities in your nation start with an\ - additional veteran level (this is cumulative with any Port Facility.)\ - This wonder is never obsolete.\ -") - -[building_manhattan_project] -name = _("Manhattan Project") -genus = "GreatWonder" -reqs = - { "type", "name", "range" - "Tech", "Nuclear Fission", "Player" - } -graphic = "b.manhattan_project" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 600 -upkeep = 0 -sabotage = 0 -sound = "w_manhattan_project" -sound_alt = "w_generic" -;helptext is set in client/helpdata.c:helptext_wonder() -helptext = _("\ -Allows all nations who know Nuclear Fission to make nuclear weapons.\ - This Wonder does not become obsolete.\ -") - -[building_marco_polos_embassy] -name = _("Marco Polo's Embassy") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Trade", "Player", TRUE, FALSE - "Building", "Marco Polo's Embassy", "Player", FALSE, TRUE - } -graphic = "b.marco_polos_embassy" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 400 -upkeep = 0 -sabotage = 0 -sound = "w_marco_polos_embassy" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -This Wonder increases Trade, the very lifeblood of your tax income, science output,\ - and luxury for happiness. With this Wonder, Trade in each city increases by 40%.\ - This Wonder does not become obsolete.\ -") - -[building_michelangelos_chapel] -name = _("Michelangelo's Chapel") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Monotheism", "Player", TRUE, FALSE - "Building", "Michelangelo's Chapel", "Player", FALSE, TRUE - } -graphic = "b.michelangelos_chapel" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 300 -upkeep = 0 -sabotage = 0 -sound = "w_michelangelos_chapel" -sound_alt = "w_generic" -helptext = _("\ -This Wonder counts as a Cathedral in all cities which lack one.\ - That is, it makes 3 unhappy citizens content in each city,\ - but does not affect citizens unhappy about military activity.\ - (Theology increases the effect by +1. Communist government\ - reduces the effect by -1.)\ -"), _(" -In cities which already have a Cathedral, this Wonder enhances the\ - effects of the Cathedral, adding +1 happy citizen and +1 forced content.\ - This Wonder is never obsolete.\ -") - -;this is wonder #61 -[building_mausoleum_of_mausolos] -name = _("Mausoleum of Mausolos") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Ceremonial Burial", "Player", TRUE, FALSE - "Building", "Mausoleum of Mausolos", "Player", FALSE, TRUE - } -graphic = "b.mausoleum" -graphic_alt = "b.oracle" -obsolete_by = - { "type", "name", "range", "survives" - "Tech", "Radio", "Player", FALSE - } -build_cost = 200 -upkeep = 0 -sabotage = 0 -sound = "w_oracle" -sound_alt = "w_generic" -helptext = _("\ -With this wonder, City Walls and Courthouses each make one unhappy citizen\ - content in their city, unless that citizen is unhappy about aggression.\ - Also, no cities in the empire with this Wonder can be incited to revolt.\ - The discovery of Radio makes the Mausoleum obsolete.\ -") - -[building_oracle] -name = _("Oracle") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Mysticism", "Player", TRUE, FALSE - "Building", "Oracle", "Player", FALSE, TRUE - } -graphic = "b.oracle" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Theology", "Player" - } -build_cost = 100 -upkeep = 0 -sabotage = 0 -sound = "w_oracle" -sound_alt = "w_generic" -helptext = _("\ -Makes two of your unhappy citizens content in every city\ - with a Temple in your nation. Does not affect citizens made\ - unhappy by military activity. Obsolete by: Theology.\ -") - -[building_pyramids] -name = _("Pyramids") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Masonry", "Player", TRUE, FALSE - "Building", "Pyramids", "Player", FALSE, TRUE - } -graphic = "b.pyramids" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 160 -upkeep = 0 -sabotage = 0 -sound = "w_pyramids" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Every city will gain +25% to its food storage when population changes.\ - In addition, the city with the Pyramids can rapture when celebrating.\ - This Wonder does not become obsolete.\ -") - -[building_shakespeares_theatre] -name = _("Shakespeare's Theater") -rule_name = "Shakespeare's Theatre" ; en_GB used originally -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Medicine", "Player", TRUE, FALSE - "Building", "Shakespeare's Theatre", "Player", FALSE, TRUE - } -graphic = "b.shakespeares_theatre" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 200 -upkeep = 0 -sabotage = 0 -sound = "w_shakespeares_theatre" -sound_alt = "w_generic" -helptext = _("\ -Makes all angry and unhappy citizens content in the city where it\ - is located, including citizens unhappy about military activity.\ - This Wonder does not become obsolete.\ -") - -;this should be wonder #65 if we counted correctly and need it for the "statue hack" to determine if player can get gov. -[building_statue_of_liberty] -name = _("Statue of Liberty") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Democracy", "Player", TRUE, FALSE - "Building", "Statue of Liberty", "Player", FALSE, TRUE - } -graphic = "b.statue_of_liberty" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 400 -upkeep = 0 -sabotage = 0 -sound = "w_statue_of_liberty" -sound_alt = "w_generic" -helptext = _("\ -Allows you to instantly change government, including governments\ - not yet researched by your civilization, and without\ - the transition period of Anarchy.\ - This Wonder does not become obsolete.\ -") - -[building_statue_of_zeus] -name = _("Statue of Zeus") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Polytheism", "Player", TRUE, FALSE - "Building", "Statue of Zeus", "Player", FALSE, TRUE - } -graphic = "b.statue_of_zeus" -graphic_alt = "b.oracle" -obsolete_by = - { "type", "name", "range", "survives" - } -build_cost = 100 -upkeep = 0 -sabotage = 0 -sound = "w_oracle" -sound_alt = "w_generic" -helptext = _("\ -The powerful Zeus gives order and organization to both city and nation.\ - One citizen is made content about military activity in every city in\ - your nation. In the city the statue is located, it makes one citizen\ - happy and provides free upkeep to 4 units. Except for one permanent\ - happy citizen, the discovery of Tactics makes the Statue of Zeus obsolete.\ -") - -[building_supreme_court] -name = _("Supreme Court") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Literacy", "Player", TRUE, FALSE - "Building", "Supreme Court", "Player", FALSE, TRUE - } -graphic = "b.great_library" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 200 -upkeep = 0 -sabotage = 0 -sound = "w_great_library" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -The Supreme Court gives the same effect as an extra Courthouse in all your cities.\ - If a Courthouse is already present, the additional bonus for diplomatic combat and\ - Steal Tech is 10%. This Wonder is never obsolete.\ -") - -[building_sun_tzus_war_academy] -name = _("Sun Tzu's War Academy") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Feudalism", "Player", TRUE, FALSE - "Building", "Sun Tzu's War Academy", "Player", FALSE, TRUE - } -graphic = "b.sun_tzus_war_academy" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Mobile Warfare", "Player" - } -build_cost = 300 -upkeep = 0 -sabotage = 0 -sound = "w_sun_tzus_war_academy" -sound_alt = "w_generic" -helptext = _("\ -All your new military land units produced in cities in your nation\ - start with an additional veteran level (this is cumulative with any\ - Barracks in a city: with both, units are created as Hardened).\ - Obsolete by: Mobile Warfare.\ -") - -[building_temple_of_artemis] -name = _("Temple of Artemis") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Mysticism", "Player", TRUE, FALSE - "Building", "Temple", "City", TRUE, FALSE - "Building", "Temple of Artemis", "Player", FALSE, TRUE - - } -graphic = "b.temple_of_artemis" -graphic_alt = "b.oracle" -obsolete_by = - { "type", "name", "range", "survives" - "Tech", "Computers", "Player", FALSE - } -build_cost = 250 -upkeep = 0 -sabotage = 0 -sound = "w_oracle" -sound_alt = "w_generic" -helptext = _("\ -The bounteous Artemis bestows a multitudinous benefaction to all cities\ - with Temples: +1 production, +1 luxury, +1 science, and +1 gold.\ - Requires a Temple in the city where it will be built. (This wonder also\ - recovers the lost bonus shield in cities built on resources of +1 shield:\ - i.e. Grassland shield resource, Tundra fur.) Obsolete by: Computers.\ -") - -[building_teslas_laboratory] -name = _("Tesla's Laboratory") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Electricity", "Player", TRUE, FALSE - "Building", "Tesla's Laboratory", "Player", FALSE, TRUE - } -graphic = "b.teslas_laboratory" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 200 -upkeep = 0 -sabotage = 0 -sound = "w_teslas_laboratory" -sound_alt = "w_generic" -helptext = _("\ -Upgrades one obsolete unit per turn. This Wonder\ - does not become obsolete.\ -") - -[building_internet] -name = _("The Internet") -genus = "SmallWonder" - reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Computers", "Player", TRUE, FALSE - "Building", "The Internet", "Player", FALSE, TRUE - } -graphic = "b.internet" -graphic_alt = "b.seti_program" -obsolete_by = - { "type", "name", "range" - } -build_cost = 600 -upkeep = 0 -sabotage = 0 -sound = "w_internet" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Adds to science production in all your cities with\ - a Research Lab, 100% of base output.\ - This Wonder does not become obsolete.\ -") - -[building_united_nations] -name = _("United Nations") -genus = "GreatWonder" -reqs = - { "type", "name", "range" - "Tech", "Communism", "Player" - } -graphic = "b.united_nations" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 600 -upkeep = 0 -sabotage = 0 -sound = "w_united_nations" -sound_alt = "w_generic" -helptext = _("\ -Creates a World Senate that may prevent declarations of war in some circumstances. If\ - any city in the world is in revolt for more than two turns, its whole government falls.\ - This Wonder does not become obsolete.\ -") - -[building_voyage_of_darwin] -name = _("Voyage of Darwin") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Railroad", "Player", TRUE, FALSE - "Building", "Voyage of Darwin", "Player", FALSE, TRUE - } -graphic = "b.darwins_voyage" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 200 -upkeep = 0 -sabotage = 0 -sound = "w_darwins_voyage" -sound_alt = "w_generic" -helptext = _("\ -In the city where this wonder is built, +1 trade is added to every tile\ - that generates trade on its own.\ - This Wonder is never obsolete.\ -") - -[building_womens_suffrage] -name = _("Women's Suffrage") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Industrialization", "Player", TRUE, FALSE - "Building", "Women's Suffrage", "Player", FALSE, TRUE - } -graphic = "b.womens_suffrage" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 300 -upkeep = 0 -sabotage = 0 -sound = "w_womens_suffrage" -sound_alt = "w_generic" -helptext = _("\ -In the capacity of reducing Military Unhappiness, this Wonder neutralizes the\ - unhappiness caused by two military units. This Wonder has no other\ - effect. It does not confer bonuses against hostile diplomats like a Police\ - Station. It gives no bonus to cities which already have a Police Station.\ - This Wonder does not become obsolete.\ -") - -[building_capitalization] -name = _("Coinage") -genus = "Special" -flags = "Gold" -reqs = - { "type", "name", "range" - - } -graphic = "b.capitalization" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 999 -upkeep = 0 -sabotage = 0 -helptext = _("\ -This is not a normal improvement. Setting production to Coinage converts\ - normal output into tax output (money, coins!)\ -") diff --git a/freeciv/freeciv/data/.historic/mp2sandbox/cities.ruleset b/freeciv/freeciv/data/.historic/mp2sandbox/cities.ruleset deleted file mode 100644 index 9a4ee3bf8..000000000 --- a/freeciv/freeciv/data/.historic/mp2sandbox/cities.ruleset +++ /dev/null @@ -1,186 +0,0 @@ -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -[datafile] -description="Cities data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -; /* <-- avoid gettext warnings -; -; A specialist is a city citizen who is not a tile worker. Usually the -; player can control what specialist each citizen is, so long as the -; requirements for that specialist are met. -; -; Below are the entries for the specialists, one per specialist type. -; The tag name (in [specialist_*]) doesn't matter so long as it's unique. -; For each specialist the following fields may be set: -; -; -; name = translatable (plural) name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; if -; not present, "name" is used for this purpose too. Since -; the name used in savegames must not change, if you want -; to rename an item after a ruleset has been released, you -; should set "rule_name" to the original value of "name". -; short_name = one-character "short name" used (for instance) in cityrep; -; should be first character/abbrevation of "name" -; graphic = tag specifying preferred graphic -; Different images based on citizen number are supported. -; If no such images indexed with citizen number are found, -; plain tag is used instead. -; graphic_alt = fallback graphic tag in case the specialist graphic isn't -; found. -; reqs = requirements to have the specialist pick (see -; effects.ruleset and README.effects for help on requirements) -; helptext = optional help text string; should escape all raw newlines -; so that xgettext parsing works -; -; */ <-- avoid gettext warnings - -[specialist_elvis] -name = _("Entertainers") -; (The original specialist names in the classic ruleset and derivatives were -; not designed to be user-visible.) -rule_name = "elvis" -short_name = _("?Elvis:E") -graphic = "specialist.entertainer" -reqs = - { "type", "name", "range" -; Nothing - } -helptext = _("\ -Each Entertainer produces two luxury points for their city per turn. \ -See the section on Happiness for the effects of luxury points.\ -") - -[specialist_scientist] -name = _("Scientists") -rule_name = "scientist" -short_name = _("?Scientist:S") -graphic = "specialist.scientist" -reqs = - { "type", "name", "range" -; Nothing - } -helptext = _("\ -Each Scientist adds three points to your empire's research output \ -per turn.\ -") - -[specialist_taxman] -name = _("Taxmen") -rule_name = "taxman" -short_name = _("?Taxman:T") -graphic = "specialist.taxman" -reqs = - { "type", "name", "range" -; Nothing - } -helptext = _("\ -Each tax collector produces three extra gold for your treasury \ -per turn.\ -") - -[specialist_worker] -name = _("Laborer") -; (The original specialist names in the classic ruleset and derivatives were -; not designed to be user-visible.) -rule_name = "worker" -short_name = _("?Laborer:L") -graphic = "specialist.worker" -reqs = - { "type", "name", "range" -; Nothing - } -helptext = _("\ -Each Laborer produces one production point for their city per turn. \ -") - -[specialist_merchant] -name = _("Merchant") -; (The original specialist names in the classic ruleset and derivatives were -; not designed to be user-visible.) -rule_name = "merchant" -short_name = _("?Merchant:M") -graphic = "specialist.merchant" -reqs = - { "type", "name", "range" -; Nothing - } -helptext = _("\ -Each Merchant produces two trade points for their city per turn.\ - Trade will then be partioned by your nation's tax rates into\ - Gold, Science, and Luxury.\ -") - -[specialist_farmer] -name = _("Farmer") -; (The original specialist names in the classic ruleset and derivatives were -; not designed to be user-visible.) -rule_name = "farmer" -short_name = _("?Farmer:F") -graphic = "specialist.farmer" -reqs = - { "type", "name", "range" -; Nothing - } -helptext = _("\ -Each Farmer provides one food for their city per turn. Yet each\ - citizen consumes 2 food/turn. Assigning a farmer may be useful\ - for a citizen who otherwise produces no food.\ -") - - - -[parameters] -add_to_size_limit = 40 ; cities >= this cannot be added to. -angry_citizens = TRUE ; set to FALSE to disable angry citizens -celebrate_size_limit = 3 ; cities >= can celebrate - -changable_tax = TRUE ; set to FALSE to disallow changing of tax rates -;forced_science = 0 ; set these fields when changeable_tax is turned off -;forced_luxury = 100 -;forced_gold = 0 - -vision_reveal_tiles = TRUE ; civ1 & 2 default FALSE - -pop_report_zeroes = 4 ; Population in reports in tens of thousands - -[citizen] -nationality = TRUE ; account for the nationality of the citizens -convert_speed = 1000 ; base probability 333/1000 -> once every 3 turns -partisans_pct = 0 ; percentage of own nationality to inspire partisans - ; if 0, original city owner information is used instead -conquest_convert_pct = 34 ; percentage which converts to the new nation - ; after a city was conquered. Applied separately for each - ; nationality present in the city, and number of - ; converted people rounded up - -[missing_unit_upkeep] -; Get rid of a unit the city is unable to pay the X upkeep of. -; X_protected - never get rid of a unit with any of the listed unit type -; flags. -; X_unit_act - have the unit perform the listed actions until success, -; death or the list ends. -; X_wipe - wipe the unit if it survived performing the actions listed -; above. - -food_protected = "EvacuateFirst" -; food_unit_act = -food_wipe = TRUE - -; TODO: Should missing gold upkeep really be able to kill units with the -; EvacuateFirst unit type flag? -; gold_protected = -; gold_unit_act = -gold_wipe = TRUE - -shield_protected = "EvacuateFirst" -shield_unit_act = "Help Wonder", "Recycle Unit", "Disband Unit" -shield_wipe = FALSE diff --git a/freeciv/freeciv/data/.historic/mp2sandbox/default.lua b/freeciv/freeciv/data/.historic/mp2sandbox/default.lua deleted file mode 100644 index 5cb455c75..000000000 --- a/freeciv/freeciv/data/.historic/mp2sandbox/default.lua +++ /dev/null @@ -1,203 +0,0 @@ --- When creating new ruleset, you should copy this file only if you --- need to override default one. Usually you should implement your --- own scripts in ruleset specific script.lua. This way maintaining --- ruleset is easier as you do not need to keep your own copy of --- default.lua updated when ever it changes in Freeciv distribution. - --- Get gold from entering a hut. -function _deflua_hut_get_gold(unit, gold) - local owner = unit.owner - - notify.event(owner, unit.tile, E.HUT_GOLD, PL_("You found %d gold.", - "You found %d gold.", gold), - gold) - owner:change_gold(gold) -end - --- Default if intended hut behavior wasn`t possible. -function _deflua_hut_consolation_prize(unit) - _deflua_hut_get_gold(unit, 2) -end - --- Get a tech from entering a hut. -function _deflua_hut_get_tech(unit) - local owner = unit.owner - local tech = owner:give_tech(nil, -1, false, "hut") - - if tech then - notify.event(owner, unit.tile, E.HUT_TECH, - _("You found %s in ancient scrolls of wisdom."), - tech:name_translation()) - notify.research(owner, false, E.TECH_GAIN, - -- /* TRANS: One player got tech for the whole team. */ - _("The %s found %s in ancient scrolls of wisdom for you."), - owner.nation:plural_translation(), - tech:name_translation()) - notify.research_embassies(owner, E.TECH_EMBASSY, - -- /* TRANS: first %s is leader or team name */ - _("%s has acquired %s from ancient scrolls of wisdom."), - owner:research_name_translation(), - tech:name_translation()) - return true - else - return false - end -end - --- Get a mercenary unit from entering a hut. -function _deflua_hut_get_mercenaries(unit) - local owner = unit.owner - local type = find.role_unit_type('HutTech', owner) - - if not type or not type:can_exist_at_tile(unit.tile) then - type = find.role_unit_type('Hut', nil) - if not type or not type:can_exist_at_tile(unit.tile) then - type = nil - end - end - - if type then - notify.event(owner, unit.tile, E.HUT_MERC, - _("A band of friendly mercenaries joins your cause.")) - owner:create_unit(unit.tile, type, 0, unit:get_homecity(), -1) - return true - else - return false - end -end - --- Get new city from hut, or settlers (nomads) if terrain is poor. -function _deflua_hut_get_city(unit) - local owner = unit.owner - local settlers = find.role_unit_type('Cities', owner) - - if unit:is_on_possible_city_tile() then - owner:create_city(unit.tile, "") - notify.event(owner, unit.tile, E.HUT_CITY, - _("You found a friendly city.")) - return true - else - if settlers and settlers:can_exist_at_tile(unit.tile) then - notify.event(owner, unit.tile, E.HUT_SETTLER, - _("Friendly nomads are impressed by you, and join you.")) - owner:create_unit(unit.tile, settlers, 0, unit:get_homecity(), -1) - return true - else - return false - end - end -end - --- Get barbarians from hut, unless close to a city, king enters, or --- barbarians are disabled --- Unit may die: returns true if unit is alive -function _deflua_hut_get_barbarians(unit) - local tile = unit.tile - local type = unit.utype - local owner = unit.owner - - if server.setting.get("barbarians") == "DISABLED" - or unit.tile:city_exists_within_max_city_map(true) - or type:has_flag('Gameloss') then - notify.event(owner, unit.tile, E.HUT_BARB_CITY_NEAR, - _("An abandoned village is here.")) - return true - end - - local alive = tile:unleash_barbarians() - if alive then - notify.event(owner, tile, E.HUT_BARB, - _("You have unleashed a horde of barbarians!")); - else - notify.event(owner, tile, E.HUT_BARB_KILLED, - _("Your %s has been killed by barbarians!"), - type:name_translation()); - end - return alive -end - --- Randomly choose a hut event -function _deflua_hut_enter_callback(unit) - local chance = random(0, 7) - local alive = true - - if chance == 0 or chance == 1 then - _deflua_hut_get_gold(unit, 1) - elseif chance == 2 or chance == 3 then - _deflua_hut_get_gold(unit, 2) - elseif chance == 4 then - _deflua_hut_get_gold(unit, 5) - elseif chance == 5 then - _deflua_hut_get_gold(unit, 10) - elseif chance == 6 then - if not _deflua_hut_get_mercenaries(unit) then - _deflua_hut_consolation_prize(unit) - end - elseif chance == 7 then - alive = _deflua_hut_get_barbarians(unit) - end - - -- continue processing if unit is alive - return (not alive) -end - -signal.connect("hut_enter", "_deflua_hut_enter_callback") - - ---[[ - Make partisans around conquered city - - if requirements to make partisans when a city is conquered is fulfilled - this routine makes a lot of partisans based on the city`s size. - To be candidate for partisans the following things must be satisfied: - 1) The loser of the city is the original owner. - 2) The Inspire_Partisans effect must be larger than zero. - - If these conditions are ever satisfied, the ruleset must have a unit - with the Partisan role. - - In the default ruleset, the requirements for inspiring partisans are: - a) Guerilla warfare must be known by atleast 1 player - b) The player must know about Communism and Gunpowder - c) The player must run either a democracy or a communist society. -]]-- - --- Informs that the tribe has run away seeing your plane -function _deflua_hut_frighten_callback(unit, extra) - local owner = unit.owner - notify.event(owner, unit.tile, E.HUT_BARB, - _("Your overflight frightens the tribe;" - .. " they scatter in terror.")) - return true -end -signal.connect("hut_frighten", "_deflua_hut_frighten_callback") - -function _deflua_make_partisans_callback(city, loser, winner, reason) - if reason ~= 'conquest' or city:inspire_partisans(loser) <= 0 then - return - end - - local partisans = random(0, 1 + (city.size + 1) / 2) + 1 - if partisans > 8 then - partisans = 8 - end - city.tile:place_partisans(loser, partisans, city:map_sq_radius()) - notify.event(loser, city.tile, E.CITY_LOST, - _("The loss of %s has inspired partisans!"), city.name) - notify.event(winner, city.tile, E.UNIT_WIN_ATT, - _("The loss of %s has inspired partisans!"), city.name) -end - -signal.connect("city_transferred", "_deflua_make_partisans_callback") - - --- Notify player about the fact that disaster had no effect if that is --- the case -function _deflua_harmless_disaster_message(disaster, city, had_internal_effect) - if not had_internal_effect then - notify.event(city.owner, city.tile, E.DISASTER, - _("We survived the disaster without serious damage.")) - end -end - -signal.connect("disaster_occurred", "_deflua_harmless_disaster_message") diff --git a/freeciv/freeciv/data/.historic/mp2sandbox/effects.ruleset b/freeciv/freeciv/data/.historic/mp2sandbox/effects.ruleset deleted file mode 100644 index 983339de3..000000000 --- a/freeciv/freeciv/data/.historic/mp2sandbox/effects.ruleset +++ /dev/null @@ -1,4264 +0,0 @@ -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes, -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -; Note that the freeciv AI may not cope well with anything more -; than minor changes. - -[datafile] -description="Multiplayer-Evolution effects data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -; /* <-- avoid gettext warnings -; -; Effects -; -; type = What the effect does. Values of multiple active effects -; of the same type get summed for the total. -; See README.effects for list of possible types -; value = Value added for the effect type when this effect is active, -; i.e., all requirements are fulfilled -; multiplier = Name of the policy that gives a multiplier for effect's value -; reqs = Requirements for the effect to be active. -; See README.effects for help on requirements -; -; */ <-- avoid gettext warnings - -; /* <-- avoid gettext warnings -; Combat_rounds test as a way to fine tune Bomber balance: -;[effect_combat_rounds_medium_bomber] -;type = "Combat_Rounds" -;value = 20 -;reqs = -; { "type", "name", "range", "present" -; "UnitType", "Medium Bomber", "Local", TRUE -; } -;[effect_combat_rounds_heavy_bomber] -;type = "Combat_Rounds" -;value = 20 -;reqs = -; { "type", "name", "range", "present" -; "UnitType", "Heavy Bomber", "Local", TRUE -; } -;[effect_combat_rounds_stealth_bomber] -;type = "Combat_Rounds" -;value = 20 -;reqs = -; { "type", "name", "range", "present" -; "UnitType", "Stealth Bomber", "Local", TRUE -; } -; */ <-- avoid gettext warnings - -; Combat_rounds for ancient ships -[effect_combat_rounds_riverships] -type = "Combat_Rounds" -value = 15 -reqs = - { "type", "name", "range", "present" - "UnitClass", "RiverShip", "Local", TRUE - "UnitType", "Frigate", "Local", FALSE - } -[effect_combat_rounds_trireme] -type = "Combat_Rounds" -value = 15 -reqs = - { "type", "name", "range", "present" - "UnitType", "Trireme", "Local", TRUE - } - -; Cheating AI effects are in separate file -*include "default/ai_effects.ruleset" - -[effect_unhappysize] -type = "City_Unhappy_Size" -value = 4 - -; Percent foreign citizens who are unhappy if at war -; with their original nation -[effect_angry_conquered] -type = "Enemy_Citizen_Unhappy_Pct" -value = 34 ; handles proper rounding for 1/3 - - -;[effect_happy_foreigners] ; major happy is only a test to see how the Nationality flag works in test games. -;type = "Make_Happy" -;value = 30 -;reqs = -; { "type", "name", "range" -; "Nationality", "War", "City" -; } - - -; Barbarian effects - -[effect_barb1] -type = "No_Diplomacy" -value = 1 -reqs = - { "type", "name", "range" - "NationGroup", "Barbarian", "Player" - } - -; Barbarian disappearance - -[effect_barb_disappear] -type = "Retire_Pct" -value = 10 -reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", TRUE - "Age", "5", "Local", TRUE - "CityTile", "Center", "Local", FALSE - } - -; Lone Leader might escape on coast (33% chance) -; Complement of the two effects should be 0.9 * 0.66 = 0.594 -; (100 - 59) - 10 = 31 -[effect_leader_escape] -type = "Retire_Pct" -value = 31 -reqs = - { "type", "name", "range" - "UnitType", "Barbarian Leader", "Local" - "Age", "5", "Local" - "TerrainClass", "Oceanic", "Adjacent" - "MaxUnitsOnTile", "1", "Local" - } - -; Specialist output bonuses -[effect_elvis] -type = "Specialist_Output" -value = 2 -reqs = - { "type", "name", "range" - "Specialist", "elvis", "Local" - "OutputType", "luxury", "Local" - } - -[effect_scientist] -type = "Specialist_Output" -value = 3 -reqs = - { "type", "name", "range" - "Specialist", "scientist", "Local" - "OutputType", "science", "Local" - } - -[effect_taxman] -type = "Specialist_Output" -value = 3 -reqs = - { "type", "name", "range" - "Specialist", "taxman", "Local" - "OutputType", "gold", "Local" - } - -[effect_merchant] -type = "Specialist_Output" -value = 2 -reqs = - { "type", "name", "range" - "Specialist", "merchant", "Local" - "OutputType", "trade", "Local" - "Building", "A.Smith's Trading Co.", "Player" - } -[effect_merchant2] -type = "Specialist_Output" -value = 1 -reqs = - { "type", "name", "range" - "Specialist", "merchant", "Local" - "OutputType", "gold", "Local" - "Building", "A.Smith's Trading Co.", "Player" - } - -[effect_worker] -type = "Specialist_Output" -value = 1 -reqs = - { "type", "name", "range" - "Specialist", "worker", "Local" - "OutputType", "shield", "Local" - "Building", "A.Smith's Trading Co.", "Player" - } - -[effect_farmer] -type = "Specialist_Output" -value = 1 -reqs = - { "type", "name", "range" - "Specialist", "farmer", "Local" - "OutputType", "food", "Local" - "Building", "A.Smith's Trading Co.", "Player" - } - -; Vision benefit from mountains (for every land unit) -[effect_mountains_vision] -type = "Unit_Vision_Radius_Sq" -value = 5 -reqs = - { "type", "name", "range" - "Terrain", "Mountains", "Local" - "UnitClass", "Land", "Local" - } -[effect_mountains_vision_1] -type = "Unit_Vision_Radius_Sq" -value = 5 -reqs = - { "type", "name", "range" - "Terrain", "Mountains", "Local" - "UnitClass", "LandAirSea", "Local" - } -[effect_mountains_vision_2] -type = "Unit_Vision_Radius_Sq" -value = 5 -reqs = - { "type", "name", "range" - "Terrain", "Mountains", "Local" - "UnitClass", "LandNoKill", "Local" - } - -; basic free tech upkeep -[effect_upkeep_tech_free] -type = "Tech_Upkeep_Free" -value = 3 - -; ******************* TRADE ******************** - -[effect_trade_routes] -type = "Max_Trade_Routes" -value = 1 - -;pow(2, value/1000) -> Base = 50% -[effect_base_trade_revenue_reduce] -type = "Trade_Revenue_Bonus" -value = -1000 - -;Total = 25% -[effect_railroad_trade_revenue_reduce] -type = "Trade_Revenue_Bonus" -value = -1000 -reqs = - { "type", "name", "range" - "Tech", "Railroad", "Player" - } -;Total = 25% -[effect_flight_trade_revenue_reduce] -type = "Trade_Revenue_Bonus" -value = -1000 -reqs = - { "type", "name", "range" - "Tech", "Flight", "Player" - } - - -;If you don't acquire ongoing trade revenue from a trade route, -;a DECREASE in one-time bonus made NO SENSE AT ALL, -;Now it's a one time bonus with potentially slight ROI. -[effect_enter_marketplace_bonus_increase] -type = "Trade_Revenue_Bonus" -value = 2000 -reqs = - { "type", "name", "range" - "Action", "Enter Marketplace", "Local" - } -;TO-DO: pay x more than gold value of vessel entering marketplace, with ROI being somewhat inferior to most -;investments but hinting toward same order of magnitude. - -[effect_establish_traderoute_bonus] -type = "Trade_Revenue_Bonus" -value = -2400 -;this -2400 should go into base effect above -;then reqs action = "Establish Trade Route" can be an increase to counter both the -2400 subtracted above then to -;further tune upward any one time bonus to what it needs to be. reqs can look at unit type also to compensate higher cost -;of making certain units, since route-creating units now vary from 20 shields to 50 shields in cost. - -; *********************************** BASES ******************************* - -; **** FORT ***** -[effect_fort_defense] -type = "Defend_Bonus" -value = 33 -reqs = - { "type", "name", "range", "present" - "Extra", "Fort", "Local", TRUE - "Extra", "Fortress", "Local", FALSE ; Fortress calculated separately even if a fort is under it. - "UnitClass", "Helicopter", "Local", FALSE ; ... these attackers do not activate Fort defense bonus - "UnitClass", "Air", "Local", FALSE ; ... " " " " " " " " - "UnitClass", "AirPillage", "Local", FALSE ; ... " " " " " " " " - "UnitClass", "AirProtect", "Local", FALSE ; ... " " " " " " " " - "UnitClass", "Missile", "Local", FALSE ; ... " " " " " " " " - "UnitType", "Armor", "Local", FALSE ; ... " " " " " " " " - "UnitType", "Armor II", "Local", FALSE ; ... " " " " " " " " - } -; Fort HP regen -[effect_fort_hp_regen] -type = "HP_Regen" -value = 10 -reqs = - { "type", "name", "range" - "Extra", "Fort", "Tile" - "UnitClass", "Land", "Local" - } -[effect_fort_hp_regen_1] -type = "HP_Regen" -value = 10 -reqs = - { "type", "name", "range" - "Extra", "Fort", "Tile" - "UnitClass", "LandAirSea", "Local" - } -[effect_fort_hp_regen_2] -type = "HP_Regen" -value = 10 -reqs = - { "type", "name", "range" - "Extra", "Fort", "Tile" - "UnitClass", "LandNoKill", "Local" - } - -; **** FORTRESS ************************************************************** - -; Adjust the 1.67xdefense_bonus in terrain.ruleset for some attackers: -; **************************************************************************** -[effect_fortress_nonfortbuster] -type = "Defend_Bonus" -value = 20 ;increase 1.67x to 2x except when defending against FortBuster types. -;note: 1.20*1.67=2.0 (this bonus is multiplied after terrain defense_bonus was multiplied) -reqs = - { "type", "name", "range", "present" - "Extra", "Fortress", "Local", TRUE - "UnitFlag", "FortBuster", "Local", FALSE - "UnitFlag", "FortressBuster", "Local", FALSE - "UnitFlag", "AirAttacker", "Local", FALSE - } -[effect_fortressbuster] -type = "Attack_Bonus" -value = 67 ;Cancel defender's 1.67x with attacker getting 1.67x -reqs = - { "type", "name", "range", "present" - "Extra", "Fortress", "Local", TRUE - "UnitFlag", "FortressBuster", "Local", TRUE - } - -; ****** ^^ defense_bonus_correctives ^^ ************************************* - -; Vision benefit from fortress watchtowers -[effect_fortress_vision] -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "tile" - "Tech", "Invention", "Player" - "UnitClass", "Land", "Local" - } -[effect_fortress_vision_1] ;Marines, AAA -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "tile" - "Tech", "Invention", "Player" - "UnitClass", "LandAirSea", "Local" - } -[effect_fortress_vision_2] ;Knights -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "tile" - "Tech", "Invention", "Player" - "UnitClass", "LandNoKill", "Local" - } - -; Fortress HP regen -[effect_fortress_hp_regen] -; Cumulative with fort: 10+15=25 -type = "HP_Regen" -value = 15 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "Tile" - "UnitClass", "Land", "Local" - } -[effect_fortress_hp_regen_1] -type = "HP_Regen" -value = 15 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "Tile" - "UnitClass", "LandAirSea", "Local" - } -[effect_fortress_hp_regen_2] -type = "HP_Regen" -value = 15 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "Tile" - "UnitClass", "LandNoKill", "Local" - } -[effect_fortress_hp_regen_3] -type = "HP_Regen" -value = 25 ;25 because not cumulative with Fort -reqs = - { "type", "name", "range" - "Extra", "Fortress", "Tile" - "UnitClass", "Helicopter", "Local" - } - -[effect_airbase_hp_regen] -type = "HP_Regen" -value = 25 -reqs = - { "type", "name", "range" - "Extra", "Airbase", "Tile" - "UnitClass", "Helicopter", "Local" - } -; ****************** NAVAL BASE ****************************** -[effect_navbase_vision] -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "tile" - "Tech", "Invention", "Player" - "UnitClass", "Trireme", "Local" - } -[effect_navbase_vision1] -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "tile" - "Tech", "Invention", "Player" - "UnitClass", "RiverShip", "Local" - } -[effect_navbase_vision2] -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "tile" - "Tech", "Invention", "Player" - "UnitClass", "Sea", "Local" - } -; Naval Base HP regen -[effect_navbase_hp_regen] -type = "HP_Regen" -value = 20 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "Tile" - "UnitClass", "Sea", "Local" - } -[effect_navbase_hp_regen_1] -type = "HP_Regen" -value = 20 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "Tile" - "UnitClass", "RiverShip", "Local" - } -[effect_navbase_hp_regen_2] -type = "HP_Regen" -value = 20 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "Tile" - "UnitClass", "Trireme", "Local" - } -[effect_navbase_hp_regen_3] -type = "HP_Regen" -value = 20 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "Tile" - "UnitClass", "Submarine", "Local" - } -; *********************************************************** - -; Base vision range - radius of vision is sqrt(5) = 2.24 -[effect_city_vision] -type = "City_Vision_Radius_Sq" -value = 5 - -;PERCENTAGE CHANCE OF STEALING A TECH WHEN CONQUERING A CITY. -[effect_conquest_tech] -type = "Conquest_Tech_Pct" -value = 100 - -; Nuclear power gives +1 moves to sea units (+2 under 2x) -[effect_nuclear_powered_boats] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Tech", "Nuclear Power", "Player" - "UnitClass", "Sea", "Local" - } -; Nuclear power gives +1 moves to sea units (+2 under 2x) -[effect_nuclear_powered_subs] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Tech", "Nuclear Power", "Player" - "UnitClass", "Submarine", "Local" - } - -[effect_anarchy_upkeep] -type = "Upkeep_Free" -value = 99 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } -[effect_upkeep_communism] -type = "Upkeep_Free" -value = 1 -reqs = - { "type", "name", "range", "quiet" - "Gov", "Communism", "Player", TRUE - } - -[effect_anarchy_upkeep_tech_free] -type = "Tech_Upkeep_Free" -value = 9999 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_republic] -type = "Make_Content_Mil" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_corruption_anarchy0] -type = "Output_Waste" -value = 25 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_anarchy1] -type = "Output_Waste_By_Distance" -value = 200 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_despotism0] -type = "Output_Waste" -value = 37 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_despotism1] -type = "Output_Waste_By_Distance" -value = 400 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_monarchy0] -type = "Output_Waste" -value = 15 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_monarchy1] -type = "Output_Waste_By_Distance" -value = 200 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_communism0] -type = "Output_Waste" -value = 20 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_republic0] -type = "Output_Waste" -value = 15 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_republic1] -type = "Output_Waste_By_Distance" -value = 200 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - "OutputType", "Trade", "Local" - } - -[effect_base_unit_upkeep] -type = "Upkeep_Factor" -value = 1 - -[effect_republic_unit_upkeep] -type = "Upkeep_Factor" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - "OutputType", "Food", "Local" - } - -[effect_democracy_unit_upkeep] -type = "Upkeep_Factor" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - "OutputType", "Food", "Local" - } - -[effect_republic_unit_unhappiness] -type = "Unhappy_Factor" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_democracy_unit_unhappiness] -type = "Unhappy_Factor" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_upkeep_free_units_anarchy] -type = "Unit_Upkeep_Free_Per_City" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - "OutputType", "Shield", "Local" - } - -[effect_upkeep_free_units_despotism] -type = "Unit_Upkeep_Free_Per_City" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - "OutputType", "Shield", "Local" - } - -[effect_upkeep_free_units_monarchy] -type = "Unit_Upkeep_Free_Per_City" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - "OutputType", "Shield", "Local" - } - -[effect_upkeep_free_units_communism] -type = "Unit_Upkeep_Free_Per_City" -value = 4 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - "OutputType", "Shield", "Local" - } - -[effect_civil_war_0] -type = "Civil_War_Chance" -value = 90 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_civil_war_1] -type = "Civil_War_Chance" -value = 80 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_civil_war_2] -type = "Civil_War_Chance" -value = 70 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -[effect_civil_war_3] -type = "Civil_War_Chance" -value = 50 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - } - -[effect_civil_war_4] -type = "Civil_War_Chance" -value = 40 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_civil_war_5] -type = "Civil_War_Chance" -value = 30 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_empire_size_base_0] -type = "Empire_Size_Base" -value = 9 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_empire_size_base_1] -type = "Empire_Size_Base" -value = 10 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_empire_size_base_2] -type = "Empire_Size_Base" -value = 11 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -[effect_empire_size_base_3] -type = "Empire_Size_Base" -value = 12 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - } - -[effect_empire_size_base_4] -type = "Empire_Size_Base" -value = 13 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_empire_size_base_5] -type = "Empire_Size_Base" -value = 14 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_empire_size_base_6] -type = "Empire_Size_Base" -value = 14 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_empire_size_step_0] -type = "Empire_Size_Step" -value = 6 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_empire_size_step_1] -type = "Empire_Size_Step" -value = 10 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_empire_size_step_2] -type = "Empire_Size_Step" -value = 12 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -; Empire_Size_Step disabled for Communism - -[effect_empire_size_step_3] -type = "Empire_Size_Step" -value = 14 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_empire_size_step_4] -type = "Empire_Size_Step" -value = 16 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_empire_size_step_5] -type = "Empire_Size_Step" -value = 15 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_max_rates_0] -type = "Max_Rates" -value = 100 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_max_rates_1] -type = "Max_Rates" -value = 60 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_max_rates_2] -type = "Max_Rates" -value = 70 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -[effect_max_rates_3] -type = "Max_Rates" -value = 80 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - } - -[effect_max_rates_4] -type = "Max_Rates" -value = 80 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_max_rates_5] -type = "Max_Rates" -value = 100 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_martial_law_each_0] -type = "Martial_Law_Each" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_martial_law_each_1] -type = "Martial_Law_Each" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_martial_law_each_2] -type = "Martial_Law_Each" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -[effect_martial_law_each_3] -type = "Martial_Law_Each" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - } - -[effect_martial_law_each_4] -type = "Martial_Law_Each" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_martial_law_max_0] -type = "Martial_Law_Max" -value = 100 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_martial_law_max_1] -type = "Martial_Law_Max" -value = 100 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_martial_law_max_2] -type = "Martial_Law_Max" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -[effect_martial_law_max_3] -type = "Martial_Law_Max" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - } - -[effect_martial_law_max_4] -type = "Martial_Law_Max" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_rapture_grow_0] -type = "Rapture_Grow" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_rapture_grow_1] -type = "Rapture_Grow" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_communism_0] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - "UnitFlag", "Diplomat", "Local" - } - -[effect_gov_tile_bonus_0] -type = "Output_Penalty_Tile" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_gov_tile_bonus_1] -type = "Output_Penalty_Tile" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_gov_tile_bonus_2] -type = "Output_Inc_Tile_Celebrate" -value = 1 -reqs = - { "type", "name", "range" - "OutputType", "Trade", "Local" - "Gov", "Monarchy", "Player" - } - -[effect_gov_tile_bonus_3] -type = "Output_Inc_Tile_Celebrate" -value = 1 -reqs = - { "type", "name", "range" - "OutputType", "Trade", "Local" - "Gov", "Communism", "Player" - } - -[effect_gov_tile_bonus_4] -type = "Output_Inc_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - "OutputType", "Trade", "Local" - } - -[effect_gov_tile_bonus_5] -type = "Output_Inc_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_gov_tile_bonus_6] -type = "Output_Inc_Tile_Celebrate" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Trade", "Local" - } - -[effect_revolution_0] -type = "Revolution_Unhappiness" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_senate_0] -type = "Has_Senate" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_senate_1] -type = "Has_Senate" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_partisans_communism] -type = "Inspire_Partisans" -value = 1 -reqs = - { "type", "name", "range", "present" - "Gov", "Communism", "Player", TRUE - "Tech", "Communism", "Player", TRUE - "Tech", "Gunpowder", "Player", TRUE - "Tech", "Guerilla Warfare", "World", TRUE - "NationGroup", "Barbarian", "Player", FALSE - } - -[effect_partisans_democracy] -type = "Inspire_Partisans" -value = 1 -reqs = - { "type", "name", "range", "present" - "Gov", "Democracy", "Player", TRUE - "Tech", "Communism", "Player", TRUE - "Tech", "Gunpowder", "Player", TRUE - "Tech", "Guerilla Warfare", "World", TRUE - "NationGroup", "Barbarian", "Player", FALSE - } - -[effect_airport_2] -type = "Airlift" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Airport", "City" - } - -[effect_airport_v0] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Airport", "City", TRUE - "UnitClass", "Air", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_airport_v1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Airport", "City", TRUE - "UnitClass", "AirProtect", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_airport_v2] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Airport", "City", TRUE - "UnitClass", "AirPillage", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_airport_v3] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Airport", "City", TRUE - "UnitClass", "Helicopter", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_airport_v4] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Airport", "City", TRUE - "UnitClass", "Missile", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } - -[effect_airport_h1] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Airport", "City" - "UnitClass", "Air", "Local" - } -[effect_airport_h2] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Airport", "City" - "UnitClass", "AirProtect", "Local" - } -[effect_airport_h3] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Airport", "City" - "UnitClass", "AirPillage", "Local" - } -[effect_airport_h4] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Airport", "City" - "UnitClass", "Helicopter", "Local" - } - -; Base max city size of 8 -[effect_aqueduct_size] -type = "Size_Adj" -value = 8 - -[effect_aqueduct] -type = "Size_Adj" -value = 4 -reqs = - { "type", "name", "range" - "Building", "Aqueduct", "City" - } - -[effect_aqueduct_health] -type = "Health_Pct" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Aqueduct", "City" - } - -[effect_bank] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - "Building", "Bank", "City" - "OutputType", "Gold", "Local" - } - -[effect_bank_1] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - "Building", "Bank", "City" - "OutputType", "Luxury", "Local" - } - -[effect_barracks] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "Land", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_a] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "Land", "Local", TRUE - } -[effect_barracks_b] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE ; might be resting in allied city with Barracks I - } -[effect_barracks_c] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - } - -[effect_barracks_ii] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "Land", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_ii_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_ii_2] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_ii_a] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "Land", "Local", TRUE - } -[effect_barracks_ii_b] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - } -[effect_barracks_ii_c] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - } - -[effect_barracks_iii] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "Land", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_iii_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_iii_2] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_iii_a] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Barracks III", "City" - "UnitClass", "Land", "Local" - } -[effect_barracks_iii_b] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - } -[effect_barracks_iii_c] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - } - -;prolongs time-window relevance of amphibious invasions later in game -[effect_triple_training_marines] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "Building", "Port Facility", "City", TRUE - "Building", "Airport", "City", TRUE - "UnitType", "Marines", "Local", TRUE - } - -;--- STANDARD CATHEDRAL sans Michelangelo ------------------------ -[effect_cathedral] -type = "Make_Content" -value = 3 -reqs = - { "type", "name", "range", "present" - "Building", "Cathedral", "City", TRUE - "Building", "Michelangelo's Chapel", "Player", FALSE - } -[effect_cathedral_1] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range", "present" - "Tech", "Theology", "Player", TRUE - "Building", "Cathedral", "City", TRUE - "Building", "Michelangelo's Chapel", "Player", FALSE - } -[effect_cathedral_2] -type = "Make_Content" -value = -1 -reqs = - { "type", "name", "range", "present" - "Gov", "Communism", "Player", TRUE - "Building", "Cathedral", "City", TRUE - "Building", "Michelangelo's Chapel", "Player", FALSE - } -;--- ENHANCED CATHEDRAL with Michelangelo: *** -[effect_cathedral_ma] -type = "Make_Happy" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Cathedral", "City", TRUE - "Building", "Michelangelo's Chapel", "Player", TRUE - } -[effect_cathedral_ma2] -type = "Force_Content" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Cathedral", "City", TRUE - "Building", "Michelangelo's Chapel", "Player", TRUE - } -;------------------------------------------------------------ - -[effect_city_walls] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "UnitClass", "Land", "Local", TRUE - "Building", "Great Wall", "Player", FALSE - "UnitType", "Howitzer", "Local", FALSE - } - -[effect_city_walls_0] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "UnitClass", "Helicopter", "Local", TRUE - "Building", "Great Wall", "Player", FALSE - } -[effect_city_walls_0a] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - "Building", "Great Wall", "Player", FALSE - "UnitType", "Howitzer", "Local", FALSE - } -[effect_city_walls_0b] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - "Building", "Great Wall", "Player", FALSE - "UnitType", "Howitzer", "Local", FALSE - } - -[effect_city_walls_1] -type = "Unit_No_Lose_Pop" -value = 1 -reqs = - { "type", "name", "range" - "Building", "City Walls", "City" - } - -[effect_city_walls_visible] -type = "Visible_Walls" -value = 1 -reqs = - { "type", "name", "range" - "Building", "City Walls", "City" - } - -[effect_coastal_defense] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Coastal Defense", "City" - "UnitClass", "Sea", "Local" - } -[effect_coastal_defense_1] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Coastal Defense", "City" - "UnitClass", "RiverShip", "Local" - } -[effect_coastal_defense_2] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Coastal Defense", "City" - "UnitClass", "Submarine", "Local" - } -[effect_coastal_defense_trireme] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Coastal Defense", "City" - "UnitClass", "Trireme", "Local" - } - -[effect_gibraltar_fortress] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Gibraltar Fortress", "Player", TRUE - "Building", "Coastal Defense", "City", FALSE - "UnitClass", "Sea", "Local" - } -[effect_gibraltar_fortress_1] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Gibraltar Fortress", "Player", TRUE - "Building", "Coastal Defense", "City", FALSE - "UnitClass", "RiverShip", "Local" - } -[effect_gibraltar_fortress_2] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Gibraltar Fortress", "Player", TRUE - "Building", "Coastal Defense", "City", FALSE - "UnitClass", "Submarine", "Local" - } -[effect_gibraltar_fortress_trireme] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Gibraltar Fortress", "Player", TRUE - "Building", "Coastal Defense", "City", FALSE - "UnitClass", "Trireme", "Local" - } - -[effect_amphitheatre] -type = "Make_Content" -value = 3 -reqs = - { "type", "name", "range" - "Building", "Amphitheatre", "City" - } - -[effect_amphitheatre_1] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Tech", "Electricity", "Player" - "Building", "Amphitheatre", "City" - } - -; BECAUSE OF ROUNDING, AVERAGE EFFECT OF 50 ENDS UP BEING 41%, WHEREAS 60 YIELDS ABOUT 53% WHICH IS CLOSER TO ADVERTISED -[effect_courthouse] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "OutputType", "Trade", "Local", TRUE -; "Building", "Palace", "City", FALSE ; Courthouse is not advertised to be useless in cities with a Palace - } - -[effect_courthouse_1] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "OutputType", "shield", "local", TRUE -; "Building", "Palace", "City", FALSE ; Courthouse is not advertised to be useless in cities with a Palace - } - -[effect_courthouse_2] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - "Building", "Courthouse", "City" - } - -[effect_courthouse_3] -type = "Incite_Cost_Pct" -value = 300 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "MaxUnitsOnTile", "0", "Local", FALSE - } - -[effect_courthouse_upkeep] ; Law and order provides +1 upkeep -type = "Unit_Upkeep_Free_Per_City" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Courthouse", "City", TRUE - "OutputType", "Shield", "Local" - } - -[effect_courthouse_tile_corruption] ; Removes output penalties (Despotism/Anarchy) for cities with courthouses -type = "Output_Penalty_Tile" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Courthouse", "City", TRUE - } - -[effect_courthouse_spy_resistance] -type = "Spy_Resistant" -value = 15 ;50-15=35% success rate -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - } - -[effect_courthouse_theft_resistance] -type = "Action_Odds_Pct" -value = -35 ;80-35=45% success rate -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Steal Tech", "Local", TRUE - } - -[effect_courthouse_hostile_diplomat_7] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Steal Tech Escape Expected", "Local", TRUE - } - -[effect_courthouse_hostile_diplomat_8] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Targeted Steal Tech", "Local", TRUE - } - -[effect_courthouse_hostile_diplomat_9] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE - } - -[effect_courthouse_hostile_diplomat_1] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Sabotage City", "Local", TRUE - } - -[effect_courthouse_hostile_diplomat_2] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Sabotage City Escape", "Local", TRUE - } - -[effect_courthouse_hostile_diplomat_3] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Targeted Sabotage City", "Local", TRUE - } - -[effect_courthouse_hostile_diplomat_4] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Targeted Sabotage City Escape", "Local", TRUE - } - -[effect_incite_cost_empty_courthouse] -type = "Incite_Cost_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - "Building", "Courthouse", "City", TRUE - } - -[effect_diplomat_defense_fortress] -type = "Spy_Resistant" -value = 25 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "Local" - } - -[effect_incite_cost_empty] -type = "Incite_Cost_Pct" -value = -50 -reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - "Building", "Courthouse", "City", FALSE - "Building", "Supreme Court", "Player", FALSE - } - -[effect_factory] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Factory", "City" - "OutputType", "Shield", "Local" - } - -[effect_granary] -type = "Growth_Food" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Granary", "City" - } - -[effect_harbour] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "TerrainClass", "Oceanic", "Local" - "Building", "Harbour", "City" - "OutputType", "Food", "Local" - } - -[effect_hydro_plant] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Hydro Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_hydro_plant_1] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Hydro Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_hydro_plant_2] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Hydro Plant", "City", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_hydro_plant_3] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Hydro Plant", "City", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_library] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Library", "City" - "OutputType", "Science", "Local" - } - -[effect_marketplace] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - "OutputType", "Gold", "Local" - } - -[effect_marketplace_1] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - "OutputType", "Luxury", "Local" - } - -; No population pollution until certain techs researched -[effect_pollu_pop_base] -type = "Pollu_Pop_Pct_2" -value = -100 - -[effect_pollu_pop_automobile] -type = "Pollu_Pop_Pct_2" -value = 25 -reqs = - { "type", "name", "range" - "Tech", "Automobile", "Player" - } - -[effect_pollu_pop_industrialization] -type = "Pollu_Pop_Pct_2" -value = 25 -reqs = - { "type", "name", "range" - "Tech", "Industrialization", "Player" - } - -[effect_pollu_pop_mass_production] -type = "Pollu_Pop_Pct_2" -value = 25 -reqs = - { "type", "name", "range" - "Tech", "Mass Production", "Player" - } - -[effect_pollu_pop_plastics] -type = "Pollu_Pop_Pct_2" -value = 25 -reqs = - { "type", "name", "range" - "Tech", "Plastics", "Player" - } - -[effect_mass_transit] -type = "Pollu_Pop_Pct" -value = -100 -reqs = - { "type", "name", "range" - "Building", "Mass Transit", "City" - } -; Increased citizen mobility and ticket revenues increase city base trade by +2 -[effect_mass_transit_1] -type = "Output_Add_Tile" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Mass Transit", "City" - "CityTile", "Center", "Local" - "OutputType", "Trade", "Local" - } - -[effect_mfg_plant] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Mfg. Plant", "City" - "OutputType", "Shield", "Local" - } - -[effect_nuclear_plant] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Nuclear Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_nuclear_plant_1] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Nuclear Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_nuclear_plant_2] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Nuclear Plant", "City", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_nuclear_plant_3] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Nuclear Plant", "City", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_offshore_platform] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "TerrainClass", "Oceanic", "Local" - "Building", "Offshore Platform", "City" - "OutputType", "Shield", "Local" - } - -[effect_palace] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - "OutputType", "Trade", "Local" - } -[effect_palace_1] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - "OutputType", "shield", "local" - } -[effect_palace_2] -type = "Spy_Resistant" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - } -[effect_palace_2_sabotage] -type = "Building_Saboteur_Resistant" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - } -[effect_palace_3] -type = "Capital_City" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - } -[effect_palace_gov_center] -type = "Gov_Center" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - } -[effect_palace_5] -type = "Output_Bonus" -value = 75 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - "Building", "Palace", "City" - "OutputType", "Shield", "Local" - } - -[effect_palace_6] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - "Building", "Palace", "City" - "OutputType", "Shield", "Local" - } -[effect_palace_6a] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - "Building", "Palace", "City" - "OutputType", "Shield", "Local" - } -[effect_palace_7] -type = "Make_Happy" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - } -[effect_palace_fundamentalism] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range", "present", "quiet" - "Gov", "Fundamentalism", "Player", TRUE, TRUE - "Building", "Palace", "City", TRUE, FALSE - "OutputType", "Gold", "Local", TRUE, FALSE - } - -[effect_ecclesiastical_palace] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "OutputType", "Trade", "Local", TRUE - "Building", "Palace", "City", FALSE - } -[effect_ecclesiastical_palace_1] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "OutputType", "Shield", "local", TRUE - "Building", "Palace", "City", FALSE - } -[effect_ecclesiastical_palace_2] -type = "Spy_Resistant" -value = 50 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "Building", "Palace", "City", FALSE - } -[effect_ecclestiastical_palace_3] -type = "Make_Happy" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Ecclesiastical Palace", "City" - } -[effect_ecclesiastical_palace_4] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "UnitType", "Fanatics", "Local", TRUE - } -[effect_ecclesiastical_palace_gov_center] -type = "Gov_Center" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "Building", "Palace", "City", FALSE - } -[effect_ecclesiastical_palace_despotism] -type = "Output_Bonus" -value = 75 -reqs = - { "type", "name", "range", "present", "quiet" - "Gov", "Despotism", "Player", TRUE, TRUE - "Building", "Ecclesiastical Palace", "City", TRUE, FALSE - "OutputType", "Gold", "Local", TRUE, FALSE -; "Building", "Palace", "City", FALSE, FALSE - } -[effect_ecclesiastical_palace_monarchy] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range", "present", "quiet" - "Gov", "Monarchy", "Player", TRUE, TRUE - "Building", "Ecclesiastical Palace", "City", TRUE, FALSE - "OutputType", "Gold", "Local", TRUE, FALSE -; "Building", "Palace", "City", FALSE, FALSE - } -[effect_ecclesiastical_palace_fundamentalism] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range", "present", "quiet" - "Gov", "Fundamentalism", "Player", TRUE, TRUE - "Building", "Ecclesiastical Palace", "City", TRUE, FALSE - "OutputType", "Gold", "Local", TRUE, FALSE - ; "Building", "Palace", "City", FALSE, FALSE - } -[effect_ecclesiastical_palace_communism] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present", "quiet" - "Gov", "Communism", "Player", TRUE, TRUE - "Building", "Ecclesiastical Palace", "City", TRUE, FALSE - "OutputType", "Gold", "Local", TRUE, FALSE - ; "Building", "Palace", "City", FALSE, FALSE - } - -[effect_ecclesiastical_palace_culture] -type = "History" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "Building", "Palace", "City", FALSE - } -[effect_ecclesiastical_palace_2_sabotage] -type = "Building_Saboteur_Resistant" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Ecclesiastical Palace", "City" - } - -[effect_police_station] -type = "Make_Content_Mil" -value = 2 -reqs = - { "type", "name", "range", "present" - "Gov", "Republic", "Player", TRUE - "Building", "Police Station", "City", TRUE - "Building", "Women's Suffrage", "Player", FALSE - } -[effect_police_station_1] -type = "Make_Content_Mil" -value = 4 -reqs = - { "type", "name", "range", "present" - "Gov", "Democracy", "Player", TRUE - "Building", "Police Station", "City", TRUE - "Building", "Women's Suffrage", "Player", FALSE - } -[effect_police_station_spy_resistant] -type = "Spy_Resistant" -value = 10 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - } -[effect_police_station_theft_resistant] -type = "Action_Odds_Pct" -value = -10 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Steal Tech", "Local", TRUE - } -[effect_police_station_theft_resistant1] -type = "Action_Odds_Pct" -value = -10 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Steal Tech Escape Expected", "Local", TRUE - } -[effect_police_station_theft_resistant2] -type = "Action_Odds_Pct" -value = -10 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Targeted Steal Tech", "Local", TRUE - } -[effect_police_station_theft_resistant3] -type = "Action_Odds_Pct" -value = -10 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE - } - -[effect_port_facility] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Port Facility", "City", TRUE - "UnitClass", "Sea", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_port_facility_a] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Port Facility", "City", TRUE - "UnitClass", "RiverShip", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_port_facility_b] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Port Facility", "City", TRUE - "UnitClass", "Submarine", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_port_facility_1] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Port Facility", "City" - "UnitClass", "Sea", "Local" - } -[effect_port_facility_1a] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Port Facility", "City" - "UnitClass", "RiverShip", "Local" - } -[effect_port_facility_1b] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Port Facility", "City" - "UnitClass", "Submarine", "Local" - } -[effect_port_facility_trireme] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Port Facility", "City", TRUE - "UnitClass", "Trireme", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_port_facility_trireme_1] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Port Facility", "City" - "UnitClass", "Trireme", "Local" - } - -[effect_power_plant] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Power Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Hydro Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_power_plant_1] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Power Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Hydro Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_recycling_center] -type = "Pollu_Prod_Pct" -value = -66 -reqs = - { "type", "name", "range", "present" - "Building", "Recycling Center", "City", TRUE -; A Solar Plant can give a stronger effect than a Recycling Center, in which -; case we want only the Solar Plant's effect (not the addition of the two). - "Building", "Solar Plant", "City", FALSE - } - -; Nasty special cases: where a Solar Plant is present but its effect is less -; than that of a Recycling Center, top up so that the net effect is that of the -; Recycling Center. -; (This would be so much easier if effects could be combined by functions -; other than addition...) - -; Factory and no Mfg. Plant: Solar Plant saves 50%, less than 66%; add 16% -[effect_recycling_center_1] -type = "Pollu_Prod_Pct" -value = -16 -reqs = - { "type", "name", "range", "present" - "Building", "Recycling Center", "City", TRUE - "Building", "Solar Plant", "City", TRUE - "Building", "Factory", "City", TRUE - "Building", "Mfg. Plant", "City", FALSE - } - -; Mfg. Plant and no Factory: Solar Plant saves 50%, less than 66%; add 16% -[effect_recycling_center_2] -type = "Pollu_Prod_Pct" -value = -16 -reqs = - { "type", "name", "range", "present" - "Building", "Recycling Center", "City", TRUE - "Building", "Solar Plant", "City", TRUE - "Building", "Mfg. Plant", "City", TRUE - "Building", "Factory", "City", FALSE - } - -; Neither Factory nor Mfg. Plant: Solar Plant saves 0%; add 66% -[effect_recycling_center_3] -type = "Pollu_Prod_Pct" -value = -66 -reqs = - { "type", "name", "range", "present" - "Building", "Recycling Center", "City", TRUE - "Building", "Solar Plant", "City", TRUE - "Building", "Factory", "City", FALSE - "Building", "Mfg. Plant", "City", FALSE - } - -; Raw materials generated from Recycling add +2 base shields to city production. -[effect_recycling_center_4] -type = "Output_Add_Tile" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Recycling Center", "City" - "CityTile", "Center", "Local" - "OutputType", "Shield", "Local" - } - - -[effect_research_lab] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Library", "City" - "Building", "Research Lab", "City" - "OutputType", "Science", "Local" - } - -[effect_research_lab_1] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "University", "City" - "Building", "Research Lab", "City" - "OutputType", "Science", "Local" - } - -[effect_sam_battery] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "SAM Battery", "City" - "UnitClass", "Air", "Local" - "UnitType", "Stealth Bomber", "Local", FALSE - } -[effect_sam_battery_1] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "SAM Battery", "City" - "UnitClass", "AirProtect", "Local" - "UnitType", "Stealth Fighter", "Local", FALSE - } -[effect_sam_battery_2] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "SAM Battery", "City" - "UnitClass", "AirPillage", "Local" - "UnitType", "Stealth Fighter", "Local", FALSE - } -[effect_sam_battery_stealth_bomber] -type = "Defend_Bonus" -value = 25 -reqs = - { "type", "name", "range" - "Building", "SAM Battery", "City" - "UnitType", "Stealth Bomber", "Local", TRUE - } -[effect_sam_battery_stealth_fighter] -type = "Defend_Bonus" -value = 25 -reqs = - { "type", "name", "range" - "Building", "SAM Battery", "City" - "UnitType", "Stealth Fighter", "Local", TRUE - } - -[effect_sdi_defense] -type = "Nuke_Proof" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "SDI Defense", "City", TRUE - "DiplRel", "Foreign", "Local", TRUE - "DiplRel", "Team", "Local", FALSE - } - -[effect_sdi_defense_1] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "SDI Defense", "City" - "UnitClass", "Missile", "Local" - } - -[effect_sewer_system] -type = "Size_Unlimit" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Aqueduct", "City" - "Building", "Sewer System", "City" - } - -[effect_sewer_system_health] -type = "Health_Pct" -value = 30 -reqs = - { "type", "name", "range" - "Building", "Aqueduct", "City" - "Building", "Sewer System", "City" - } - -[effect_solar_plant] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range" - "Building", "Factory", "City" - "Building", "Solar Plant", "City" - "OutputType", "Shield", "Local" - } - -[effect_solar_plant_1] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range" - "Building", "Mfg. Plant", "City" - "Building", "Solar Plant", "City" - "OutputType", "Shield", "Local" - } - -[effect_solar_plant_2] -type = "Pollu_Prod_Pct" -value = -50 -reqs = - { "type", "name", "range" - "Building", "Factory", "City" - "Building", "Solar Plant", "City" - } - -[effect_solar_plant_3] -type = "Pollu_Prod_Pct" -value = -50 -reqs = - { "type", "name", "range" - "Building", "Mfg. Plant", "City" - "Building", "Solar Plant", "City" - } - -[effect_space_component] -type = "SS_Component" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Space Component", "City" - } - -[effect_space_module] -type = "SS_Module" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Space Module", "City" - } - -[effect_space_structural] -type = "SS_Structural" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Space Structural", "City" - } - -;Timeline is already way behind and too slow, REMOVE: -;[effect_plastics_slowdown] -;type = "Slow_Down_Timeline" -;value = 1 -;reqs = -; { "type", "name", "range", "survives" -; "Tech", "Plastics", "World", TRUE -; } - -;[effect_superconductor_slowdown] -;type = "Slow_Down_Timeline" -;value = 1 -;reqs = -; { "type", "name", "range", "survives" -; "Tech", "Superconductors", "World", TRUE -; } -;1 year per turn ensures spaceship travel time calibrated. -;this can be removed after game.info.spacerace bug of not changing -;timeline gets fixed in server. -[effect_spaceflight_slowdown] -type = "Turn_Years" -value = 1 -reqs = - { "type", "name", "range", "survives" - "Tech", "Space Flight", "World", TRUE - } - -[effect_stock_exchange] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Bank", "City" - "Building", "Stock Exchange", "City" - "OutputType", "Gold", "Local" - } - -[effect_stock_exchange_1] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Bank", "City" - "Building", "Stock Exchange", "City" - "OutputType", "Luxury", "Local" - } - -[effect_super_highways] -type = "Output_Per_Tile" -value = 50 -reqs = - { "type", "name", "range" - "Extra", "Road", "Local" - "Building", "Super Highways", "City" - "OutputType", "Trade", "Local" - } - -; Super Highways increase logistical efficiency to -; get more use out of an airport in size 12+ city. -[effect_super_highways_airlift_facilitation] -type = "Airlift" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Super Highways", "City" - "Building", "Airport", "City" - "Building", "Sewer System", "City" - } - -[effect_mine] -type = "Mining_Pct" -value = 100 -reqs = - { "type", "name", "range" - "Extra", "Mine", "Local" - } - -[effect_oil_well] -type = "Mining_Pct" -value = 100 -reqs = - { "type", "name", "range" - "Extra", "Oil Well", "Local" - } - -[effect_irrigation] -type = "Irrigation_Pct" -value = 100 -reqs = - { "type", "name", "range" - "Extra", "Irrigation", "Local" - } -; Desert with river (and no Oasis) gets 1 extra food from irrigation (total 2) -; ("Nile floods" effect) -[effect_irrigation_2] -type = "Irrigation_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "Terrain", "Desert", "Local", TRUE - "Extra", "River", "Local", TRUE - "Extra", "Oasis", "Local", FALSE - "Extra", "Irrigation", "Local", TRUE - } -; ...same for city centers -[effect_irrigation_3] -type = "Irrigation_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "Terrain", "Desert", "Local", TRUE - "Extra", "River", "Local", TRUE - "Extra", "Oasis", "Local", FALSE - "CityTile", "Center", "Local", TRUE -; "Extra", "Irrigation", "Local", FALSE - "TerrainAlter", "CanIrrigate", "Local", TRUE - "Extra", "Mine", "Local", FALSE - "Extra", "Oil Well", "Local", FALSE - } - -[effect_irrigation_center] -type = "Irrigation_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "CityTile", "Center", "Local", TRUE - "Extra", "Irrigation", "Local", FALSE - "TerrainAlter", "CanIrrigate", "Local", TRUE - "Extra", "Mine", "Local", FALSE - "Extra", "Oil Well", "Local", FALSE - } - -[effect_supermarket] -type = "Output_Per_Tile" -value = 100 -reqs = - { "type", "name", "range" - "Extra", "Farmland", "Local" - "Building", "Supermarket", "City" - "OutputType", "Food", "Local" - } - -[effect_supermarket_center] -type = "Output_Per_Tile" -value = 50 -reqs = - { "type", "name", "range", "present" - "CityTile", "Center", "Local", TRUE - "Extra", "Farmland", "Local", FALSE - "TerrainAlter", "CanIrrigate", "Local", TRUE - "Building", "Supermarket", "City", TRUE - "OutputType", "Food", "Local", TRUE - "Extra", "Mine", "Local", FALSE - "Extra", "Oil Well", "Local", FALSE - } - -[effect_temple] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - } - -[effect_temple_1] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Tech", "Mysticism", "Player" - "Building", "Temple", "City" - } - -[effect_university] -type = "Output_Bonus" -value = 150 -reqs = - { "type", "name", "range" - "Building", "Library", "City" - "Building", "University", "City" - "OutputType", "Science", "Local" - } - -[effect_apollo_program] -type = "Enable_Space" -value = 1 -reqs = - { "type", "name", "range", "survives" - "Building", "Apollo Program", "Player", TRUE - } - -[effect_telegraph_border_vision] -type = "Border_Vision" -value = 1 -reqs = - { "type", "name", "range" - "Tech", "Electricity", "Player" - } - - ; Air+Sea+LandAirSea CLASS units REQUIRE PHYSICS so their BONUS is in their stats to AVOID more [effect_] entries. -[effect_physics_vision] -type = "Unit_Vision_Radius_Sq" -value = 4 -reqs = - { "type", "name", "range" - "Tech", "Physics", "Player" - "UnitClass", "Land", "Local" - } -[effect_physics_vision_1] -type = "Unit_Vision_Radius_Sq" -value = 4 -reqs = - { "type", "name", "range" - "Tech", "Physics", "Player" - "UnitClass", "LandNoKill", "Local" - } -[effect_physics_vision_2] -type = "Unit_Vision_Radius_Sq" -value = 4 -reqs = - { "type", "name", "range" - "Tech", "Physics", "Player" - "UnitClass", "Trireme", "Local" - } -[effect_physics_vision_3] -type = "Unit_Vision_Radius_Sq" -value = 4 -reqs = - { "type", "name", "range" - "Tech", "Physics", "Player" - "UnitClass", "RiverShip", "Local" - } - -[effect_satellite_vision] ;Vision benefit from satellite communication to land units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "Land", "Local" - } -[effect_satellite_vision_1] ;Vision benefit from satellite communication to land units (Marines) -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "LandAirSea", "Local" - } -[effect_satellite_vision_2] ;Vision benefit from satellite communication to sea units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "Sea", "Local" - } -[effect_satellite_vision_2a] ;Vision benefit from satellite communication to sea units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "Submarine", "Local" - } -[effect_satellite_vision_3] ;Vision benefit from satellite communication to sea units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "Air", "Local" - } -[effect_satellite_vision_3a] ;Vision benefit from satellite communication to sea units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "AirProtect", "Local" - } -[effect_satellite_vision_4] ;Vision benefit from satellite communication to cities -type = "City_Vision_Radius_Sq" -value = 36 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - } - -[effect_agoge_move_bonus_1] -type = "Move_Bonus" -value = 3 -reqs = - { "type", "name", "range", "present" - "Building", "Agōgē of Sparta", "Player", TRUE - "UnitFlag", "FootSoldier", "Local", TRUE - } -[effect_agoge_move_bonus_2] -type = "Move_Bonus" -value = 6 ; 3/9 + 6/9 = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Agōgē of Sparta", "City", TRUE - "UnitFlag", "FootSoldier", "Local", TRUE - } -[effect_agoge_phalanx] -type = "Attack_Bonus" -value = 50 -reqs = - { "type", "name", "range", "present" - "Building", "Agōgē of Sparta", "Player", TRUE - "UnitType", "Phalanx", "Local", TRUE - } -[effect_agoge_pikemen] -type = "Attack_Bonus" -value = 50 -reqs = - { "type", "name", "range", "present" - "Building", "Agōgē of Sparta", "Player", TRUE - "UnitType", "Pikemen", "Local", TRUE - } - -[effect_asmiths_trading_co] -type = "Upkeep_Free" -value = 1 -reqs = - { "type", "name", "range" - "Building", "A.Smith's Trading Co.", "Player" - } - -[effect_colossus] -type = "Output_Inc_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Colossus", "City" - "OutputType", "Trade", "Local" - } - -[effect_copernicus_observatory] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Copernicus' Observatory", "City" - "OutputType", "Science", "Local" - } - -[effect_cure_for_cancer] -type = "Make_Happy" -value = 2 - reqs = - { "type", "name", "range" - "Building", "Cure For Cancer", "World" - "Tech", "Genetic Engineering", "Player" - } - -; HACK: there's all kinds of nasty hard-coded stuff to this Wonder, so it had to be -; given a different name (Voyage of Darwin) to avoid potential messyness -[effect_darwins_voyage] -type = "Output_Inc_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Voyage of Darwin", "City" - "OutputType", "Trade", "Local" - } - -[effect_eiffel_tower] -type = "Unit_Upkeep_Free_Per_City" -value = 1 - reqs = - { "type", "name", "range" - "Building", "Eiffel Tower", "Player" - "OutputType", "Shield", "Local" - } - -[effect_supreme_court] -type = "Output_Waste_Pct" -value = 60 - reqs = - { "type", "name", "range" - "Building", "Supreme Court", "Player" - "OutputType", "Trade", "Local" - } - -;The following effects make Supreme Court count as Courthouse in every city, as advertised -[effect_supreme_court_1] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player", TRUE - "OutputType", "Shield", "local", TRUE - } - -[effect_supreme_court_2] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - "Building", "Supreme Court", "Player" - } - -[effect_supreme_court_3] -type = "Incite_Cost_Pct" -value = 300 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player", TRUE - "MaxUnitsOnTile", "0", "Local", FALSE - } -[effect_incite_cost_empty_supremecourt] -type = "Incite_Cost_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - "Building", "Supreme Court", "Player", TRUE - } - -[effect_supreme_court_upkeep] ; Law and order provides +1 upkeep -type = "Unit_Upkeep_Free_Per_City" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Supreme Court", "Player" - "OutputType", "Shield", "Local" - } - -[effect_supreme_court_tile_corruption] ; Removes output penalties (Despotism/Anarchy) for cities with courthouses -type = "Output_Penalty_Tile" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Supreme Court", "Player" - } - -;35% success on spy-attack-spy with one court effect, 25% with both: -;35% hostile diplomatic combat success rate with only 1 of Courthouse / Supreme Court -[effect_only_supreme_court_spy_resistance] -type = "Spy_Resistant" -value = 15 ;50%-15%=35% success rate -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player", TRUE - "Building", "Courthouse", "City", FALSE - } -;25% hostile diplomatic combat success rate with both Supreme Court + Courthouse -[effect_only_supreme_court_spy_resistance_stacked] -type = "Spy_Resistant" -value = 10 ;10+15 for Courthouse = 25%. 50%-25%=25% success rate -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player", TRUE - "Building", "Courthouse", "City", TRUE - } - -;45% success on theft with one court, 35% with both courts: -[effect_supreme_court_only_steal_tech] -type = "Action_Odds_Pct" -value = -35 ; 80% base rate - 35% = 45% final rate -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player", TRUE - "Building", "Courthouse", "City", FALSE - "Action", "Steal Tech", "Local", TRUE - } -[effect_supreme_court_only_steal_tech_stacked] -type = "Action_Odds_Pct" -value = -10 ; 45% base rate after courthouse - 10% = 35% final rate -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player", TRUE - "Building", "Courthouse", "City", TRUE - "Action", "Steal Tech", "Local", TRUE - } - -[effect_supreme_court_hostile_diplomat_7] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player", TRUE - "Action", "Steal Tech Escape Expected", "Local", TRUE - } - -[effect_supreme_court_hostile_diplomat_8] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player", TRUE - "Action", "Targeted Steal Tech", "Local", TRUE - } - -[effect_supreme_court_hostile_diplomat_9] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player", TRUE - "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE - } - -[effect_supreme_court_hostile_diplomat_1] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player", TRUE - "Action", "Sabotage City", "Local", TRUE - } - -[effect_supreme_court_hostile_diplomat_2] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player", TRUE - "Action", "Sabotage City Escape", "Local", TRUE - } - -[effect_supreme_court_hostile_diplomat_3] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player", TRUE - "Action", "Targeted Sabotage City", "Local", TRUE - } - -[effect_supreme_court_hostile_diplomat_4] -type = "Action_Odds_Pct" -value = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player", TRUE - "Action", "Targeted Sabotage City Escape", "Local", TRUE - } - -[effect_great_wall] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "UnitClass", "Land", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "UnitType", "Howitzer", "Local", FALSE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_0] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range" - "Building", "Great Wall", "Player" - "UnitClass", "Helicopter", "Local" - "CityTile", "Center", "Local" - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_0a] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "UnitType", "Howitzer", "Local", FALSE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_0b] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "UnitType", "Howitzer", "Local", FALSE - "Tech", "Machine Tools", "World", FALSE - } - -[effect_great_wall_1] -type = "Unit_No_Lose_Pop" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Tech", "Machine Tools", "World", FALSE - } - -[effect_great_wall_visible] -type = "Visible_Walls" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Tech", "Machine Tools", "World", FALSE - } - -[effect_hanging_gardens] -type = "Make_Happy" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Hanging Gardens", "Player" - } - -[effect_hanging_gardens_1] -type = "Output_Add_Tile" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Hanging Gardens", "City" - "CityTile", "Center", "Local" - "OutputType", "Luxury", "Local" - } - -[effect_hoover_dam] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Hoover Dam", "Player", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Solar Plant", "City", FALSE - } - -[effect_hoover_dam_1] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Hoover Dam", "Player", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Solar Plant", "City", FALSE - } - -[effect_hoover_dam_2] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Hoover Dam", "Player", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_hoover_dam_3] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Hoover Dam", "Player", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_isaac_newtons_college] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "University", "City" - "Building", "Isaac Newton's College", "Player" - "OutputType", "Science", "Local" - } - -[effect_js_bachs_cathedral] -type = "Force_Content" -value = 2 -reqs = - { "type", "name", "range" - "Building", "J.S. Bach's Cathedral", "Player" - } - -[effect_king_richards_crusade] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "King Richard's Crusade", "City" - "OutputType", "Shield", "Local" - } - -[effect_leonardos_workshop] -type = "Upgrade_Unit" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Leonardo's Workshop", "Player" - } - -[effect_genghis_khans_equestrian_school] -type = "Move_Bonus" -value = 9 -reqs = - { "type", "name", "range", "present" - "Building", "Genghis Khan's Equestrian School", "Player", TRUE - "UnitFlag", "Horse", "Local", TRUE - } -[effect_genghis_khans_equestrian_school2] -type = "Move_Bonus" -value = 9 -reqs = - { "type", "name", "range", "present" - "Building", "Genghis Khan's Equestrian School", "Player", TRUE - "UnitType", "Explorer", "Local", TRUE - } - -[effect_lighthouse] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Sea", "Local" - } - -[effect_lighthouse_a] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Submarine", "Local" - } - -[effect_lighthouse_1] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Trireme", "Local" - } - -[effect_lighthouse_2] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "RiverShip", "Local" - } - -[effect_lighthouse_3] -type = "Unit_Vision_Radius_Sq" -value = 6 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Sea", "Local" - } - -[effect_lighthouse_3a] -type = "Unit_Vision_Radius_Sq" -value = 6 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Submarine", "Local" - } - -[effect_lighthouse_4] -type = "Unit_Vision_Radius_Sq" -svalue = 6 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Trireme", "Local" - } - -[effect_lighthouse_5] -type = "Unit_Vision_Radius_Sq" -svalue = 6 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "RiverShip", "Local" - } - -[effect_magellans_expedition] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Magellan's Expedition", "Player" - "UnitClass", "Sea", "Local" - } -[effect_magellans_expedition_a] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Magellan's Expedition", "Player" - "UnitClass", "RiverShip", "Local" - } -[effect_magellans_expedition_b] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Magellan's Expedition", "Player" - "UnitClass", "Submarine", "Local" - } -; Should be quite useless, just in case: -[effect_magellans_expedition_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Magellan's Expedition", "Player" - "UnitClass", "Trireme", "Local" - } - -[effect_manhattan_project] -type = "Enable_Nuke" -value = 1 -reqs = - { "type", "name", "range", "survives" - "Building", "Manhattan Project", "World", TRUE - } - -[effect_marco_polos_embassy] -type = "Output_Bonus" -value = 40 -reqs = - { "type", "name", "range" - "Building", "Marco Polo's Embassy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_michelangelos_chapel] -type = "Make_Content" -value = 3 -reqs = - { "type", "name", "range" - "Building", "Michelangelo's Chapel", "Player" - } -[effect_michelangelos_chapel_1] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Tech", "Theology", "Player" - "Building", "Michelangelo's Chapel", "Player" - } -[effect_michelangelos_chapel_2] -type = "Make_Content" -value = -1 -reqs = - { "type", "name", "range" - "Building", "Michelangelo's Chapel", "Player" - "Gov", "Communism", "Player" - } - -[effect_mausoleum_of_mausolos_1] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "Building", "Great Wall", "Player", FALSE - "Building", "Mausoleum of Mausolos", "Player", TRUE - } - -;Great Wall counts as City Walls in every city. -[effect_mausoleum_of_mausolos_1a] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Great Wall", "Player" - "Building", "Mausoleum of Mausolos", "Player" - } - -[effect_mausoleum_of_mausolos_2] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Building", "Supreme Court", "Player", FALSE - "Building", "Mausoleum of Mausolos", "Player", TRUE - } - -;Mausoleum respects that Supreme Court counts as Courthouse in every city. -[effect_mausoleum_of_mausolos_2a] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Supreme Court", "Player" - "Building", "Mausoleum of Mausolos", "Player" - } - -[effect_mausoleum_of_mausolos_culture] -type = "History" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Mausoleum of Mausolos", "City" - } - -[effect_statue_of_zeus] -type = "Make_Content_Mil_Per" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Statue of Zeus", "Player", TRUE - "Tech", "Tactics", "Player", FALSE - } -[effect_statue_of_zeus_1] -type = "Unit_Upkeep_Free_Per_City" -value = 4 -reqs = - { "type", "name", "range", "present" - "Building", "Statue of Zeus", "City", TRUE - "Tech", "Tactics", "Player", FALSE - "OutputType", "Shield", "Local", TRUE - } -[effect_statue_of_zeus_2] -type = "Make_Happy" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Statue of Zeus", "City" - } - -[effect_temple_of_artemis] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Luxury", "Local" - } -;Note: the city applies +1 to 0-shield city tiles on grass,swamp,hills,tundra -;Thus this bonus negates the condition of getting that +1 and needs a -;compensating +1 further below -[effect_temple_of_artemis_1] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Shield", "Local" - } -;-------- -;Give the city its extra shield if it was built on a 0-shield (grass/hills/swamp/tundra) -;tile or +1-shield resource (grass-shield,fur) -[effect_temple_of_artemis_1a] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Terrain", "Grassland", "Local" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Shield", "Local" - } -[effect_temple_of_artemis_1b] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range", "present" - "Terrain", "Hills", "Local", TRUE - "Extra", "Coal", "Local", FALSE ; only apply to 0 shield tile - "Extra", "Mine", "Local", FALSE ; only apply to 0 shield tile - "Building", "Temple", "City", TRUE - "Building", "Temple of Artemis", "Player", TRUE - "CityTile", "Center", "Local", TRUE - "OutputType", "Shield", "Local", TRUE - } -[effect_temple_of_artemis_1d] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range", "present" - "Terrain", "Swamp", "Local", TRUE - "Extra", "Peat", "Local", FALSE ; only apply to 0 shield tile - "Building", "Temple", "City", TRUE - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local", TRUE - "OutputType", "Shield", "Local", TRUE - } -[effect_temple_of_artemis_1e] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range", "present" - "Terrain", "Tundra", "Local", TRUE - "Extra", "Game", "Local", FALSE ; only apply to 0 shield tile - "Building", "Temple", "City", TRUE - "Building", "Temple of Artemis", "Player", TRUE - "CityTile", "Center", "Local", TRUE - "OutputType", "Shield", "Local", TRUE - } -;------ - -[effect_temple_of_artemis_2] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Gold", "Local" - } - -[effect_temple_of_artemis_3] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Science", "Local" - } - - -[effect_teslas_laboratory] -type = "Upgrade_Unit" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Tesla's Laboratory", "Player" - } -;[effect_tesla_laboratory2] or do this for Mass Production? -;type = "Upgrade_Price_Pct" -;value = -20 -;reqs = -; { "type", "name", "range" -; "Building", "Tesla's Laboratory", "Player" -; } - -[effect_oracle] -type = "Make_Content" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - "Building", "Oracle", "Player" - } - -[effect_pyramids] -type = "Growth_Food" -value = 25 -reqs = - { "type", "name", "range" - "Building", "Pyramids", "Player" - } - -[effect_pyramids_1] -type = "Rapture_Grow" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Pyramids", "City" - } - -[effect_internet] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Research Lab", "City" - "Building", "The Internet", "Player" - "OutputType", "Science", "Local" - } - -[effect_shakespeares_theatre] -type = "No_Unhappy" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Shakespeare's Theatre", "City" - } - -[effect_statue_of_liberty] -type = "Any_Government" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Statue of Liberty", "Player" - } - -[effect_statue_of_liberty_1] -type = "No_Anarchy" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Statue of Liberty", "Player" - } - -[effect_sun_tzus_war_academy] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Sun Tzu's War Academy", "Player", TRUE - "UnitClass", "Land", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_sun_tzus_war_academy_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Sun Tzu's War Academy", "Player", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - } -[effect_sun_tzus_war_academy_2] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Sun Tzu's War Academy", "Player", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - } - -[effect_united_nations] -type = "Has_Senate" -value = 1 -reqs = - { "type", "name", "range" - "Building", "United Nations", "World" - } - -[effect_united_nations_1] -type = "Revolution_Unhappiness" -value = 2 -reqs = - { "type", "name", "range", "present" - "Building", "United Nations", "World", TRUE -; Without !present UN would make revolution less likely instead -; of enabling it with Democracy (value 2 -> 4 instead of 0 -> 2) - "Gov", "Democracy", "Player", FALSE - } - -[effect_womens_suffrage] -type = "Make_Content_Mil" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - "Building", "Women's Suffrage", "Player" - } - -[effect_womens_suffrage_1] -type = "Make_Content_Mil" -value = 4 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - "Building", "Women's Suffrage", "Player" - } - -[effect_fanatics_fundamentalism] -type = "Fanatics" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_corruption_fundamentalism0] -type = "Output_Waste" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_fundamentalism1] -type = "Output_Waste_By_Distance" -value = 200 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Trade", "Local" - } - -;Shield waste is not a proper feature of mp rulesets -;[effect_waste_fundamentalism0] -;type = "Output_Waste" -;value = 2 -;reqs = -; { "type", "name", "range" -; "Gov", "Fundamentalism", "Player" -; "OutputType", "Shield", "Local" -; } - -;[effect_waste_fundamentalism1] -;type = "Output_Waste_By_Distance" -;value = 100 -;reqs = -; { "type", "name", "range" -; "Gov", "Fundamentalism", "Player" -; "OutputType", "Shield", "Local" -; } - -[effect_fundamentalism_unit_upkeep] -type = "Upkeep_Factor" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Food", "Local" - } - -[effect_upkeep_free_units_fundamentalism] -type = "Unit_Upkeep_Free_Per_City" -value = 10 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Shield", "Local" - } - -[effect_bad_sci_fundamentalism] -type = "Output_Bonus_2" -value = -50 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "science", "local" - } - -[effect_tithes_fundamentalism] -type = "Happiness_To_Gold" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_sabotage_bonus_fundamentalism1] -type = "Action_Odds_Pct" -value = 10 -reqs = - { "type", "name", "range", "present" - "Gov", "Fundamentalism", "Player", TRUE - "Action", "Sabotage City", "Local", TRUE - } -[effect_sabotage_bonus_fundamentalism2] -type = "Action_Odds_Pct" -value = 10 -reqs = - { "type", "name", "range", "present" - "Gov", "Fundamentalism", "Player", TRUE - "Action", "Sabotage City Escape", "Local", TRUE - } -[effect_sabotage_bonus_fundamentalism3] -type = "Action_Odds_Pct" -value = 10 -reqs = - { "type", "name", "range", "present" - "Gov", "Fundamentalism", "Player", TRUE - "Action", "Targeted Sabotage City", "Local", TRUE - } -[effect_sabotage_bonus_fundamentalism4] -type = "Action_Odds_Pct" -value = 10 -reqs = - { "type", "name", "range", "present" - "Gov", "Fundamentalism", "Player", TRUE - "Action", "Targeted Sabotage City Escape", "Local", TRUE - } - -[effect_max_rates_fundamentalism] -type = "Max_Rates" -value = 80 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_enviromentalism] -type = "Pollu_Prod_Pct" -value = -50 -reqs = - { "type", "name", "range" - "Tech", "Environmentalism", "Player" - } - -[effect_calendar_base] -type = "Turn_Years" -value = 100 - -; 100 - 50 = 50 -[effect_calendar_1] -type = "Turn_Years" -value = -50 -reqs = - { "type", "name", "range" - "MinYear", "0", "World" - } - -; 50 - 25 = 25 -[effect_calendar_2] -type = "Turn_Years" -value = -25 -reqs = - { "type", "name", "range" - "MinYear", "1000", "World" - } - -; 25 - 15 = 10 -[effect_calendar_3] -type = "Turn_Years" -value = -15 -reqs = - { "type", "name", "range" - "MinYear", "1800", "World" - } - -; 10 - 5 = 5 -[effect_calendar_4] -type = "Turn_Years" -value = -5 -reqs = - { "type", "name", "range" - "MinYear", "1900", "World" - } - -; 5 - 3 = 2 -[effect_calendar_5] -type = "Turn_Years" -value = -3 -reqs = - { "type", "name", "range" - "MinYear", "1950", "World" - } - -; 2 - 1 = 1 -[effect_calendar_6] -type = "Turn_Years" -value = -1 -reqs = - { "type", "name", "range" - "MinYear", "2012", "World" - } - -[effect_tech_cost_base] -type = "Tech_Cost_Factor" -value = 1 - -; Cities can always work tiles -[effect_tile_workable] -type = "Tile_Workable" -value = 1 -reqs = - { "type", "name", "range", "present" - "Terrain", "Inaccessible", "Local", FALSE - } - -; each city has at least one slot to build units -[effect_city_build_slots_basic] -type = "City_Build_Slots" -value = 1 - -[effect_city_image_1] -type = "City_Image" -value = 1 -reqs = - { "type", "name", "range" - "MinSize", "4", "City" - } - -[effect_city_image_2] -type = "City_Image" -value = 1 -reqs = - { "type", "name", "range" - "MinSize", "8", "City" - } - -[effect_city_image_3] -type = "City_Image" -value = 1 -reqs = - { "type", "name", "range" - "MinSize", "12", "City" - } - -[effect_city_image_4] -type = "City_Image" -value = 1 -reqs = - { "type", "name", "range" - "MinSize", "16", "City" - } - -[effect_pollution] -type = "Output_Tile_Punish_Pct" -value = 50 -reqs = - { "type", "name", "range", "present" - "Extra", "Pollution", "Local", TRUE - "Extra", "Fallout", "Local", FALSE - } - -[effect_fallout] -type = "Output_Tile_Punish_Pct" -value = 50 -reqs = - { "type", "name", "range", "present" - "Extra", "Fallout", "Local", TRUE - "Extra", "Pollution", "Local", FALSE - } - -[effect_pollution_fallout] -type = "Output_Tile_Punish_Pct" -value = 75 -reqs = - { "type", "name", "range" - "Extra", "Fallout", "Local" - "Extra", "Pollution", "Local" - } - -[effect_incident_caught_steal_maps] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Maps Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_steal_maps] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Maps Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_half_chance_steal_maps] -type = "Action_Odds_Pct" -value = -30 ;80 minus 30 is 50% or half chance, but who knows if it's really 80-.3*8=56% -reqs = - { "type", "name", "range", "present" - "Action", "Steal Maps Escape", "Local", TRUE - } - -; FIXED flag from "Cities" to "NonMil" to have proper effect. -[effect_unit_bribe_cost_settlers] -type = "Unit_Bribe_Cost_Pct" -value = -50 -reqs = - { "type", "name", "range" - "UnitFlag", "NonMil", "Local" - } - -;LOSING MOVES FROM ILLEGAL ACTION NEVER MADE SENSE. JUST FORBID IT AND LET THEM PICK A LEGAL ACTION. -;[effect_illegal_action_move_cost_base] -;type = "Illegal_Action_Move_Cost" -;value = 0 -;reqs = -; { "type", "name", "range", "present" -; "Action", "Found City", "Local", FALSE -; "Action", "Join City", "Local", FALSE -; } - -[effect_incident_caught_steal_tech] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Tech", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_steal_tech] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Tech", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_caught_steal_tech_esc] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Tech Escape Expected", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_steal_tech_esc] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Tech Escape Expected", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_caught_tgt_steal_tech] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_tgt_steal_tech] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_bribe_unit] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Bribe Unit", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_capture_unit] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Capture Units", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_sabotage_unit] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Sabotage Unit Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_incite] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Incite City", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_incite_esc] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Incite City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_poison] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Poison City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_sabotage_city] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Sabotage City", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_sabotage_city_esc] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Sabotage City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_success_tgt_sabotage_city] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Targeted Sabotage City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_tgt_sabotage_city_half_chance] -type = "Action_Odds_Pct" -value = -50 -reqs = - { "type", "name", "range", "present" - "Action", "Targeted Sabotage City Escape", "Local", TRUE - } - -[effect_incident_success_explode_nuke] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Explode Nuclear", "Local", TRUE - } - -; Double (+100%) buy cost for Great Wonders -[effect_great_wonder_buy_cost] -type = "Building_Buy_Cost_Pct" -value = 100 -reqs = - { "type", "name", "range" - "BuildingGenus", "GreatWonder", "Local" - } - -; Double buy cost for Small Wonders except Palaces -[effect_small_wonder_buy_cost] -type = "Building_Buy_Cost_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "BuildingGenus", "SmallWonder", "Local", TRUE - "Building", "Palace", "Local", FALSE - "Building", "Ecclesiastical Palace", "Local", FALSE - } - -; The Well-Digger can move 3 before you know Pottery or Alphabet. -[effect_welldigger_movement] -type = "Move_Bonus" -value = -27 -reqs = - { - "type", "name", "range", "present" - "UnitFlag", "Well-Digger", "Local", TRUE - "Tech", "Alphabet", "Player", TRUE - } -[effect_welldigger_movement_1] -type = "Move_Bonus" -value = -27 -reqs = - { - "type", "name", "range", "present" - "UnitFlag", "Well-Digger", "Local", TRUE - "Tech", "Pottery", "Player", TRUE - } - -;Can't give orders to Proletarians unless communist. -[effect_proletarian_movement] -type = "Move_Bonus" -value = -18 -reqs = - { - "type", "name", "range", "present" - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player", FALSE - } diff --git a/freeciv/freeciv/data/.historic/mp2sandbox/game.ruleset b/freeciv/freeciv/data/.historic/mp2sandbox/game.ruleset deleted file mode 100644 index 9dbaae249..000000000 --- a/freeciv/freeciv/data/.historic/mp2sandbox/game.ruleset +++ /dev/null @@ -1,1987 +0,0 @@ -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes, -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -; Note that the freeciv AI may not cope well with anything more -; than minor changes. - -[datafile] -description="Multiplayer-Evolution game rules for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -; This section contains meta information for freeciv-ruledit to recreate the ruleset -; file in a form wanted. These have no in-game effect whatsoever -[ruledit] - -; Which file to read description in from. -description_file = "mp2sandbox/README.mp2" - -[about] -; Ruleset name -; DO NOT CHANGE, FCW unfortunately has to hard-code certain special cases for this. -name = _("Multiplayer-Evolution ruleset") - -; There`s no separate versioning in rulesets part of main freeciv distribution -;version = "" - -; Summary of the ruleset -; /* TRANS: In the client, this is displayed alongside the contents of -; README.multiplayer, which are not localized. */ -summary = _("") - -; Detailed description -; When updating this, update also desciption_file in [ruledit] section to match -description = *mp2sandbox/README.mp2* - -; What capabilities ruleset provides for the scenarios. -; mimimum-default-sets - Default units, terrains, buildings, etc -capabilities = "minimum-default-sets" - -[options] -global_init_techs="" -global_init_buildings="Palace" - -[civstyle] -; Value added to city pollution -base_pollution = -20 - -; Cost in luxuries of making one citizen happier -happy_cost = 2 - -; Cost in food of upkeeping a single citizen -food_cost = 2 - -; Parameters used to generalize the calculation of city granary size: -; if city_size <= num_inis: -; city_granary_size = (granary_food_ini[city_size] * foodbox / 100) -; if city_size > num_inis; -; city_granary_size = (granary_food_ini[num_inis] + -; granary_food_inc * (city_size - num_inis)) * foodbox / 100 -granary_food_ini = 20, 30, 40, 50, 60, 70 -granary_food_inc = 0 - -; City center minimum outputs -min_city_center_food = 1 -min_city_center_shield = 1 -min_city_center_trade = 0 - -; Square of initial city radius -init_city_radius_sq = 5 - -; Square of initially visible radius (true distance). -init_vis_radius_sq = 5 - -; A base bribe cost, modified heavily by other factors -base_bribe_cost = 750 - -; Barbarian leader ransom in gold -ransom_gold = 100 - -; Number of veteran levels lost when upgrading a unit -upgrade_veteran_loss = 0 - -; Number of veteran levels lost when auto-upgrading a unit -autoupgrade_veteran_loss = 0 - -; Whether player gets to select which terrain improvement to pillage. -pillage_select = TRUE - -; Whether one can steal a tech for which prereqs are not known -tech_steal_allow_holes = FALSE -; Whether one can get a tech for which prereqs are not known via -; diplomatic trading -tech_trade_allow_holes = FALSE -; ...and whether one can lose a tech which is prereq for another known -; tech via trade, if techlost_donor is nonzero -tech_trade_loss_allow_holes = FALSE -; Whether one can get a tech for which prereqs are not known via -; parasite effect (classic ruleset's Great Library) -tech_parasite_allow_holes = FALSE -; Whether one can lose a tech which is prereq for another known tech -; due to negative bulbs, if techlossforgiveness allows loss -tech_loss_allow_holes = FALSE - -; Whether civil war is possible at all -civil_war_enabled = TRUE - -; Comma separated list of things to happen, in addition to death -; of owner, when gameloss unit dies -; "CivilWar" - Part of the empire remains, controlled by a new player -; "Barbarians" - Depending on if there`s also "CivilWar", all or part -; or half of the dead players empire gets under barbarian -; control. -; "Loot" - Player who killed the gameloss unit gets loot: -; Partial map, gold, techs, cities -gameloss_style = "" - -; Whether units may safely paradrop to transport on non-native terrain -paradrop_to_transport = FALSE - -; Method of paying unit and improvement gold upkeep -; "City" - The player`s total gold must be non-negative after paying upkeep -; costs associated with each city. If for any city the player`s -; gold is negative, random buildings in the city are sold off. If -; the gold is still negative, then supported units with gold upkeep -; are disbanded. -; "Mixed" - In the first step, the player`s total gold must be non-negative -; after paying upkeep for all buildings within a city. If for any -; city the player`s gold is negative, random buildings in the city -; are sold off. -; In the second step, gold upkeep for all units is paid in a lump -; sum. If the player does not have enough gold, random units with -; gold upkeep are disbanded. -; "Nation" - Gold upkeep for all buildings and units is paid in a lump sum -; after all cities have been processed. If the player does not -; have enough gold, random buildings from random cities are sold. -; If still more gold is needed, then random units with gold -; upkeep are disbanded. -gold_upkeep_style = "City" - -[illness] -; Whether plagues (illness) are possible -; There are some latent building effects in effects.ruleset which affect -; health, if you enable plague here. -illness_on = FALSE - -; the base factor for illness (of percent) -illness_base_factor = 25 - -; minimum city size for illness -illness_min_size = 3 - -; factor for how much trading with a plagued city increases our city`s -; chance for plague (in percent) -illness_trade_infection = 0 - -; factor for how much pollution within a city increases its chance for -; plague (in percent) -illness_pollution_factor = 50 - -[incite_cost] -; city_incite_cost = { [TF * SZ * NF * (BIC+owner_gold) * (2*CON) * (2*CEL) * (BONUS)] + (UF*UC) + (IF*IC) } / (3*DIST) -; See city_incite_cost() for more details -total_factor = 100 ; TF = 100 (effectively makes 100x cost at capital and 1x cost at DIST=32) -;city_size_adjusted ; SZ (happy*2 + content*1 + unhappy*0 - angry*2) -;nationality factor ; NF native=1.0, was_conquered=0.67, originally_belonged_to_inciter=0.5 -base_incite_cost = 1100 ; BIC =1100 (base cost before modifiers) -; content bonus. -;city is content ; CON -;city is celebrating ; CEL -;incite defence bonuses ; BONUS -50% empty + 300% occupied+courthouse OR + 100% empty+courthouse + supreme_court applies courthouse bonuses again -; ; +∞ = democracy/mausoleum/palace/ecclesiastical palace -;total unit shield cost ; UC -;total improvements cost ; IC -;distance to capital ; DIST (max distance penalty=32 tiles) -improvement_factor = 2 ; IF = 2 -unit_factor = 3 ; UF = 3 - -[global_unit_options] -; Shore landing style -; FALSE - normal movement -; TRUE - (default) slow invasions by removing all -; movement points from ground units moving -; from ocean tile to land -slow_invasions = TRUE - -[combat_rules] -; If tired_attack is set to TRUE, units that attack with less than a single -; move point (per move_fragments in terrain.ruleset) will have their attack -; power reduced accordingly. For instance, if move_fragments=3, a unit with -; 2/3 move points will have attack power 2/3 of normal. -; If this is set to FALSE units will attack with full strength even if they -; have only fractional moves left. -tired_attack = TRUE - -[auto_attack] -; An auto attack may be triggered when another unit moves to an adjacent -; tile and the autoattack server setting is enabled. The following details -; are ruleset controlled. -; will_never - units with this unit type flag will never auto attack. - -; Not a good idea to nuke our own area. -will_never = "Nuclear" - -[actions] -; If force_trade_route is set to TRUE it is illegal for an actor unit to -; enter the marketplace of a city if it can establish a trade route to it -; instead. -force_trade_route = FALSE - -; If force_capture_units is set to TRUE it is illegal for an actor unit to -; bombard, explode nuclear or perform a regular attack against a tile if -; it can capture units on it in stead. -force_capture_units = FALSE - -; If force_bombard is set to TRUE it is illegal for an actor unit to -; explode nuclear or perform a regular attack against a tile if it can -; bombard it in stead. -force_bombard = FALSE - -; If force_explode_nuclear is set to TRUE it is illegal for an actor unit -; to perform a regular attack against a tile if it can do explode nuclear -; in stead. -force_explode_nuclear = TRUE - -; If poison_empties_food_stock is set to TRUE a successful "Poison City" -; or "Poison City Escape" will empty the food stock. -poison_empties_food_stock = FALSE - -; The maximum distance from the actor unit to the target of the "Bombard" -; action. The value 1 means that the targets must be on a tile adjacent to -; the actor unit. The special value "unlimited" lifts the maximum distance -; restriction. The maximum distance can`t be smaller than the minimum -; distance. -bombard_max_range = 1 - -; What each action should be called when showing them to the player. -; The first %s should be before the mnemonic of the action. A Freeciv client -; that supports mnemonics will replace it with the in-band signal that marks -; the following character as a mnemonic in its graphical toolkit. -; The second %s marks where extra details should be inserted. - -; /* TRANS: _Deploy (3% chance of success). */ -ui_name_convert_unit = _("%sConvert Unit%s") - -; /* TRANS: _Poison City (3% chance of success). */ -ui_name_poison_city_escape = _("%sPoison City%s") - -; /* TRANS: _Sabotage Enemy Unit (3% chance of success). */ -ui_name_sabotage_unit_escape = _("%sSabotage Enemy Unit%s") - -; /* TRANS: _Bribe Enemy Unit (3% chance of success). */ -ui_name_bribe_unit = _("%sBribe Enemy Unit%s") - -; /* TRANS: _Sabotage City (3% chance of success). */ -ui_name_sabotage_city = _("%sSabotage City%s") - -; /* TRANS: _Sabotage City Escape (3% chance of success). */ -ui_name_sabotage_city_escape = _("%sSabotage City Escape%s") - -; /* TRANS: Industrial _Sabotage (3% chance of success). */ -ui_name_targeted_sabotage_city_escape = _("Industrial %sSabotage%s") - -; /* TRANS: Incite a _Revolt (3% chance of success). */ -ui_name_incite_city = _("Incite a %sRevolt%s") - -; /* TRANS: Incite a _Revolt and Escape (3% chance of success). */ -ui_name_incite_city_escape = _("Incite a Re%svolt and Escape%s") - -; /* TRANS: Establish Trade _Route (100% chance of success). */ -ui_name_establish_trade_route = _("Establish Trade %sRoute%s") - -; /* TRANS: Enter _Marketplace (100% chance of success). */ -ui_name_enter_marketplace = _("Enter %sMarketplace%s") - -; /* TRANS: Establish _Embassy (100% chance of success). */ -ui_name_establish_embassy = _("Establish %sEmbassy%s") - -; /* TRANS: Becom_e Ambassador (100% chance of success). */ -ui_name_establish_embassy_stay = _("Becom%se Ambassador%s") - -; /* TRANS: Steal _Technology (3% chance of success). */ -ui_name_steal_tech = _("Steal %sTechnology%s") - -; /* TRANS: Steal _Technology and Escape (3% chance of success). */ -ui_name_steal_tech_escape = _("Steal %sTechnology and Escape%s") - -; /* TRANS: Indus_trial Espionage (3% chance of success). */ -ui_name_targeted_steal_tech_escape = _("Indus%strial Espionage%s") - -; /* TRANS: Steal _Map Fragments and Escape (3% chance of success). */ -ui_name_steal_maps_escape = _("Steal %sMap Fragments and Escape%s") - -; /* TRANS: Steal _Map Fragments (3% chance of success). */ -ui_name_steal_maps = _("Steal %sMap Fragments%s") - -; /* TRANS: _Investigate City (100% chance of success). */ -ui_name_investigate_city = _("%sInvestigate City%s") - -; /* TRANS: _Investigate City (spends the unit) (100% chance of success). */ -ui_name_investigate_city_spend_unit = _("%sInvestigate City (spends the unit)%s") - -; /* TRANS: Help _build Wonder (100% chance of success). */ -ui_name_help_wonder = _("Help %sbuild Wonder%s") - -; /* TRANS: Rec_ycle Unit (100% chance of success). */ -ui_name_recycle_unit = _("Rec%sycle Unit%s") - -; /* TRANS: _You're Fired (100% chance of success). */ -ui_name_disband_unit = _("%sYou're Fired%s") - -; /* TRANS: _Capture Units (100% chance of success). */ -ui_name_capture_units = _("%sCapture Units%s") - -; /* TRANS: _Build City (100% chance of success). */ -ui_name_found_city = _("%sBuild City%s") - -; /* TRANS: _Add to City (100% chance of success). */ -ui_name_join_city = _("%sAdd to City%s") - -; /* TRANS: Explode _Nuclear (100% chance of success). */ -ui_name_explode_nuclear = _("Explode %sNuclear%s") - -; /* TRANS: Destroy _City (100% chance of success). */ -;ui_name_destroy_city = _("Destroy %sCity%s") ;ready to be enabled if we think of how - -; /* TRANS: Set _Home City (100% chance of success). */ -ui_name_home_city = _("Set %sHome City%s") - -; /* TRANS: _Upgrade Unit (100% chance of success). */ -ui_name_upgrade_unit = _("%sUpgrade Unit%s") - -; /* TRANS: Drop _Paratrooper (100% chance of success). */ -ui_name_paradrop_unit = _("Drop %sParatrooper%s") - -; /* TRANS: _Airlift to City (100% chance of success). */ -ui_name_airlift_unit = _("%sAirlift to City%s") - -; /* TRANS: _Attack (100% chance of success). */ -ui_name_attack = _("%sAttack%s") - -; /* TRANS: _Bombard (100% chance of success). */ -ui_name_bombard = _("Range%sd Attack%s") - -;UPGRADE -; /* TRANS: _Explode Missile (100% chance of success). */ -;ui_name_suicide_attack = _("%sExplode Missile%s") - -; /* TRANS: _Conquer City (100% chance of success). */ -ui_name_conquer_city = _("%sConquer City%s") - -; /* TRANS: _Transform Terrain (3% chance of success). */ - ui_name_transform_terrain = _("%sTransform Terrain%s") - -; /* TRANS: Transform by _Irrigate (3% chance of success). */ - ui_name_irrigate_tf = _("Transform by %sIrrigate%s") - -; /* TRANS: Transform by _Mine (3% chance of success). */ - ui_name_mine_tf = _("Transform by %sMine%s") - -; /* TRANS: Pilla_ge (100% chance of success). */ - ui_name_pillage = _("Pilla%sge%s") - -; /* TRANS: _Fortify (100% chance of success). */ - ui_name_fortify = _("%sFortify%s") - -; /* TRANS: Build _Road (100% chance of success). */ - ui_name_road = _("Build %sRoad%s") - -; /* TRANS: Build _Canal (100% chance of success). */ - ui_name_canal = _("Build %Canal%s") - -; /* TRANS: _Build Base (100% chance of success). */ - ui_name_build_base = _("%sBuild Base%s") - -; /* TRANS: Build _Mine (100% chance of success). */ - ui_name_build_mine = _("Build %sMine%s") - -; /* TRANS: Build _Irrigation (100% chance of success). */ - ui_name_irrigate = _("Build %sIrrigation%s") - -; Suppress automatic help text generation about what enables and/or -; disables the following actions. -; -; Can make the help text less redundant when you document it your self. -;quiet_actions = "Targeted Sabotage City", "Targeted Steal Tech" - -; /* <-- avoid gettext warnings -; -; Action enablers: -; -; action = the action to enable. -; actor_reqs = requirements that apply to the actor. -; target_reqs = requirements that apply to the target. -; -; README.actions lists the possible actions and their hard coded -; requirements. -; -; An action enabler is active when its actor_reqs AND its target_reqs are -; satisfied. -; -; */ <-- avoid gettext warnings - -[actionenabler_convert_leader] -action = "Convert Unit" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "GameLoss", "Local" - } - -[actionenabler_communist_rifles_to_plows] -action = "Convert Unit" -actor_reqs = - { "type", "name", "range" - "UnitType", "Riflemen", "Local" - "Gov", "Communism", "Player" - "Tech", "Communism", "Player" - "Tech", "Pottery", "Player" - "UnitState","OnDomesticTile","Local" - } -[actionenabler_communist_plows_to_rifles] -action = "Convert Unit" -actor_reqs = - { "type", "name", "range" - "UnitType", "Workers", "Local" - "Gov", "Communism", "Player" - "Tech", "Communism", "Player" - "Tech", "Conscription", "Player" - "UnitState","OnDomesticTile","Local" - } -;**Mobile SAM is an upgrade to AAA but does not obsolete it, -; since AAA retains special uses. Instead, AAA can convert -; to Mobile SAM under special conditions. -[actionenabler_convert_AAA_in_capital] -action = "Convert Unit" -actor_reqs = - { "type", "name", "range" - "UnitType", "Anti-Aircraft Artillery", "Local" - "UnitState","OnDomesticTile", "Local" - "CityTile", "Center", "Local" - "Building", "Palace", "City" - "Tech", "Space Flight", "Player" - "Age", "10", "Local" - } -[actionenabler_convert_AAA_in_capital_2] -action = "Convert Unit" -actor_reqs = - { "type", "name", "range" - "UnitType", "Anti-Aircraft Artillery", "Local" - "UnitState","OnDomesticTile", "Local" - "CityTile", "Center", "Local" - "Building", "Ecclesiastical Palace", "City" - "Tech", "Space Flight", "Player" - "Age", "10", "Local" - } - -[actionenabler_sabotage_city] -action = "Sabotage City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Diplomat", "Local", TRUE - "DiplRel", "War", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "UnitFlag", "Spy", "Local", FALSE - } - -[actionenabler_sabotage_city_spy] -action = "Sabotage City Escape" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "Spy", "Local" - "DiplRel", "War", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - } - -[actionenabler_sabotage_city_target] -action = "Targeted Sabotage City Escape" -actor_reqs = - { "type", "name", "range" - "DiplRel", "War", "Local" - "UnitFlag", "Spy", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - } - -; ************************ ESTABLISH EMBASSY *********************** -; normal establish embassy--if not at war -[actionenabler_establish_embassy] -action = "Establish Embassy Stay" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Diplomat", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "UnitFlag", "Spy", "Local", FALSE - "DiplRel", "War", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - } -;if at war, police station/fundie will block embassy: do a cease-fire first! -[actionenabler_establish_embassy_war] -action = "Establish Embassy Stay" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Diplomat", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "UnitFlag", "Spy", "Local", FALSE - "DiplRel", "War", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - "Building", "Police Station", "City", FALSE ; to do: when we can check for spy present to stop it - "Gov", "Fundamentalism", "Player", FALSE - } - -; normal establish embassy--if not at war -[actionenabler_establish_embassy_spy] -action = "Establish Embassy" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Spy", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - } -;if at war, police station or fundie will block embassy: do a cease-fire first! -[actionenabler_establish_embassy_spy_war] -action = "Establish Embassy" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Spy", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "DiplRel", "War", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - "Building", "Police Station", "City", FALSE ; to do: when we can check for spy present to stop it - "Gov", "Fundamentalism", "Player", FALSE - } -; *************************************************** - -[actionenabler_investigate_city] -action = "Investigate City Spend Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Diplomat", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "UnitFlag", "Spy", "Local", FALSE - } - -[actionenabler_investigate_city_spy] -action = "Investigate City" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "Spy", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - "DiplRel", "Foreign", "Local" - } - -[actionenabler_poison_city] -action = "Poison City Escape" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "Spy", "Local" - "DiplRel", "War", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - } -target_reqs = - { "type", "name", "range" - "MinSize", "2", "City" - } - -[actionenabler_steal_maps_escape] -action = "Steal Maps Escape" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "Spy", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - "DiplRel", "Foreign", "Local" - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - } -[actionenabler_steal_maps] -action = "Steal Maps" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "Diplomat", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - "DiplRel", "Foreign", "Local" - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - } - -[actionenabler_steal_tech_random] -action = "Steal Tech" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Spy", "Local", FALSE - "UnitFlag", "Diplomat", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - } - -[actionenabler_steal_tech_random_esc] -action = "Steal Tech Escape Expected" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "Spy", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - "DiplRel", "Foreign", "Local" - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - } - -[actionenabler_steal_tech_target] -action = "Targeted Steal Tech Escape Expected" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "Spy", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - "DiplRel", "Foreign", "Local" - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - } - -[actionenabler_incite_city] -action = "Incite City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Diplomat", "Local", TRUE - "DiplRel", "Alliance", "Local", FALSE - "DiplRel", "Team", "Local", FALSE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "UnitFlag", "Spy", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "Gov", "Democracy", "Player", FALSE - "Building", "Palace", "City", FALSE - "Building", "Ecclesiastical Palace", "City", FALSE - "Building", "Mausoleum of Mausolos", "Player", FALSE - } - -[actionenabler_incite_city_spy] -action = "Incite City Escape" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Spy", "Local", TRUE - "DiplRel", "Alliance", "Local", FALSE - "DiplRel", "Team", "Local", FALSE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "Gov", "Democracy", "Player", FALSE - "Building", "Palace", "City", FALSE - "Building", "Ecclesiastical Palace", "City", FALSE - "Building", "Mausoleum of Mausolos", "Player", FALSE - } - -[actionenabler_bribe_unit] -action = "Bribe Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Diplomat", "Local", TRUE - "DiplRel", "Alliance", "Local", FALSE - "DiplRel", "Team", "Local", FALSE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Unbribable", "Local", FALSE - "CityTile", "Center", "Local", FALSE - "Gov", "Democracy", "Player", FALSE - "MaxUnitsOnTile", "1", "Local", TRUE - } - -[actionenabler_sabotage_unit] -action = "Sabotage Unit Escape" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "Spy", "Local" - "DiplRel", "War", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - } -target_reqs = - { "type", "name", "range", "present" - "CityTile", "Center", "Local", FALSE - "UnitClassFlag", "Unreachable", "Local", FALSE - "UnitClass", "Helicopter", "Local", FALSE - "MinHitPoints", "2", "Local", TRUE - "MaxUnitsOnTile", "1", "Local", TRUE - } - -[actionenabler_traderoute] -action = "Establish Trade Route" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "TradeRoute", "Local", TRUE - "Tech", "Trade", "Player", TRUE - "MinMoveFrags", "1", "Local", TRUE -; "DiplRel", "War", "Local", FALSE ; allows establishing during war then awaiting diplomatic relation to activate trade income. - } - -[actionenabler_traderoute_boat] -action = "Establish Trade Route" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "TradeRoute", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "UnitType", "Boat", "Local", TRUE -; "DiplRel", "War", "Local", FALSE ; allows establishing during war then awaiting diplomatic relation to activate trade income. - } - -[actionenabler_marketplace] -action = "Enter Marketplace" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "TradeRoute", "Local", TRUE - "Tech", "Trade", "Player", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -target_reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - } - -[actionenabler_help_build_wonder] -action = "Help Wonder" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "HelpWonder", "Local", TRUE - "Tech", "Trade", "Player", TRUE - "DiplRel", "War", "Local", FALSE - "UnitType", "Caravel", "Local", FALSE - } -target_reqs = - { "type", "name", "range" - "BuildingGenus", "GreatWonder", "Local" - } - -[actionenabler_help_build_small_wonder] -action = "Help Wonder" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "HelpWonder", "Local", TRUE - "Tech", "Trade", "Player", TRUE - "DiplRel", "War", "Local", FALSE - "UnitType", "Caravel", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "BuildingGenus", "SmallWonder", "Local", TRUE -; "Building", "Palace", "Local", FALSE - } - -[actionenabler_help_build_wonder_boat] -action = "Help Wonder" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "HelpWonder", "Local", TRUE - "Tech", "Currency", "Player", TRUE - "DiplRel", "War", "Local", FALSE - "UnitType", "Boat", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "BuildingGenus", "SmallWonder", "Local", TRUE - "Building", "Palace", "Local", FALSE - } - - -[actionenabler_recycle_unit] -action = "Recycle Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "EvacuateFirst", "Local", FALSE - "DiplRel", "War", "Local", FALSE - "DiplRel", "Cease-fire", "Local", FALSE - "DiplRel", "Armistice", "Local", FALSE - "DiplRel", "Peace", "Local", FALSE - } - -[actionenabler_disband_unit] -action = "Disband Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "EvacuateFirst", "Local", FALSE - } - -;CAPTURING LAND UNITS a "Capturer" must get a "Capturable" but not on a mountain. -[actionenabler_capture] -action = "Capture Units" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Capturer", "Local", TRUE -; "DiplRel", "War", "Local", TRUE ;NAH - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "DiplRel", "Alliance", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Capturable", "Local", TRUE - "CityTile", "Center", "Local", FALSE - "Terrain", "Mountains", "Local", FALSE - "MaxUnitsOnTile", "1", "Local", TRUE - "Extra", "Fort", "Local", FALSE - "Extra", "Fortress", "Local", FALSE - } - -;Archers can strafe/soften every unit on a tile for one -;round of combat only, iff it is not a city, fortress, -;or sea tile: -[actionenabler_archer_bombard] ;**** -action = "Bombard" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Bombarder", "Local", TRUE - "UnitType", "Archers", "Local", TRUE - "UnitState", "Transported", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "War", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "CityTile", "Center", "Local", FALSE - "Extra", "Fortress", "Local", FALSE - "TerrainClass", "Oceanic", "Local", FALSE - } - -;Fanatics can strafe/soften every unit on a tile for one -;round of combat only, iff it is in domestic territory. -[actionenabler_fanatic_bombard] ;**** -action = "Bombard" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Bombarder", "Local", TRUE - "UnitType", "Fanatics", "Local", TRUE - "UnitState", "Transported", "Local", FALSE - "UnitState", "OnDomesticTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "War", "Local", TRUE - "Gov", "Fundamentalism", "Player", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "CityTile", "Center", "Local", FALSE - "Extra", "Fortress", "Local", FALSE - "TerrainClass", "Oceanic", "Local", FALSE - } - - -[actionenabler_build_city_pioneer] -action = "Found City" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "Cities", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - } -target_reqs = - { "type", "name", "range", "present" - "CityTile", "Claimed", "Local", FALSE - } - -[actionenabler_build_city_domestic] -action = "Found City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Cities", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", FALSE - } - -[actionenabler_build_city_fort] -action = "Found City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Cities", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "Extra", "Fort", "Local", TRUE - } - -[actionenabler_join_city] -action = "Join City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "AddToCity", "Local", TRUE - "DiplRel", "Foreign", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - } - -[actionenabler_join_city_pilgrims_domestic] -action = "Join City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "AddToCity", "Local", TRUE - "UnitType", "Pilgrims", "Local", TRUE - "DiplRel", "Foreign", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - } - -;Land expel: must be not on a mountain nor an air expeller/expellee -[actionenabler_border_police] -action = "Expel Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "BorderPolice", "Local", TRUE - "UnitClass", "Air", "Local", FALSE - "UnitClass", "AirProtect", "Local", FALSE - "UnitFlag", "NonMil", "Local", FALSE ;Non-Military land class can't expel - "UnitType", "Warriors", "Local", FALSE ;Warriors are too weak to expel - "UnitState", "OnDomesticTile", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "DiplRel", "Team", "Local", FALSE - "DiplRel", "Alliance", "Local", FALSE -; "DiplRel", "War", "Local", FALSE ;NAH, you could expel anyone if you wanted. - "MinMoveFrags", "1", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Expellable", "Local", TRUE - "UnitClass", "Air", "Local", FALSE ;LAND UNITS CAN'T EXPEL AWACS - "UnitState", "OnDomesticTile", "Local", FALSE - "Terrain", "Mountains", "Local", FALSE ;Can't expel people hiding in the mountains - "MaxUnitsOnTile", "1", "Local", TRUE - } - -;Air expel: must be be air-to-air expelling from an aggressor air unit. -[actionenabler_air_border_police] -action = "Expel Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "BorderPolice", "Local", TRUE - "UnitFlag", "AirAttacker", "Local", TRUE ;some air class might not be expellers (AWACS) - "UnitFlag", "FieldUnit", "Local", FALSE ;bombers can't expel - "UnitState", "OnDomesticTile", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "DiplRel", "Team", "Local", FALSE - "DiplRel", "Alliance", "Local", FALSE -; "DiplRel", "War", "Local", FALSE ;NAH, you could expel anyone if you wanted. - "MinMoveFrags", "1", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Expellable", "Local", TRUE ;Has to be 1-expellable and 2-an air unit, in order for an air-expeller... - "UnitClass", "Air", "Local", TRUE ;...to be able to do border police action - "UnitState", "OnDomesticTile", "Local", FALSE - "MaxUnitsOnTile", "1", "Local", TRUE - } - -[actionenabler_nuke] -action = "Explode Nuclear" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Nuclear", "Local", TRUE - } - -;DESTROY CITY -; The GameLoss unit requirement makes sending units on a suicide mission to -; capture and destroy cities deep inside enemy terrain national suicide. -; The risk of moving a GameLoss unit to the target city increases the cost -; of the action. Rationalization for the requirement: the physical presence -; of the Leader makes it easier to comply with the order to destroy the -; city. (See the "orders by phone" Milgram experiment variation) -; -; The domestic city requirement forces the player to invade a city before -; he can destroy it. If this limit is weakened by allowing the destruction -; of undefended (MaxUnitsOnTile) foreign cities during war it will lead to -; situations where a player can destroy a city but is unable to occupy it. -; Rationalization: the resistance must be crushed before the destruction. -; -; TODO: create an international incident (set the Casus_Belli_Success -; effect value to 1000) if "Destroy City" still is overpowered. -[actionenabler_scorched_earth] -action = "Destroy City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "GameLoss", "Local", TRUE - "DiplRel", "Foreign", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "MaxUnitsonTile","0", "Local", TRUE - } - -;UPGRADE - all the below need Missile=FALSE after merge with main branch -;--------------------------------------------------------------------------- -;Native attack ALWAYS allowed for units who aren't CargoRestrained -[actionenabler_attack_native_unrestrained] -action = "Attack" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE -; "UnitClassFlag","Missile", "Local", FALSE - "UnitClassFlag","CargoRestrained","Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - "UnitState", "OnNativeTile", "Local", TRUE - "DiplRel", "War", "Local", TRUE - } -;Native attack for CargoRestrained units allowed, if not Transporting -[actionenabler_attack_native_restrained] -action = "Attack" -;Should Archers attack from Rivers? Probably, but then what is the Pandora's box? Muskets, etc? -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE -; "UnitClassFlag","Missile", "Local", FALSE - "UnitClassFlag","CargoRestrained","Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "UnitState", "OnNativeTile", "Local", TRUE - "UnitState", "Transporting", "Local", FALSE - "DiplRel", "War", "Local", TRUE - } -;Marines -[actionenabler_attack_marines] -action = "Attack" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE -; "UnitClassFlag","Missile", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - "UnitFlag", "Marines", "Local", TRUE - "DiplRel", "War", "Local", TRUE - } -[actionenabler_attack_from_non_native] -action = "Attack" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE -; "UnitClassFlag", "Missile", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - "UnitClassFlag", "AttFromNonNative", "Local", TRUE - "DiplRel", "War", "Local", TRUE - } -;/* REQUIRED after merge -;[actionenabler_explode_missile] -;action = "Suicide Attack" -;actor_reqs = -; { "type", "name", "range", "present" -; "UnitFlag", "NonMil", "Local", FALSE -; "UnitClassFlag", "Missile", "Local", TRUE -; "MinMoveFrags", "1", "Local", TRUE -; "DiplRel", "War", "Local", TRUE -; } -;*/ -;--------------------------------------------------------------------------- -[actionenabler_conquer_city_native_unrestrained] -action = "Conquer City" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "CanOccupyCity", "Local", TRUE - "UnitClassFlag", "CargoRestrained","Local", FALSE - "UnitFlag", "NonMil", "Local", FALSE - "DiplRel", "War", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - } -[actionenabler_conquer_city_native_restrained] -action = "Conquer City" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "CanOccupyCity", "Local", TRUE - "UnitClassFlag", "CargoRestrained","Local", TRUE - "UnitState", "Transporting", "Local", FALSE - "UnitFlag", "NonMil", "Local", FALSE - "DiplRel", "War", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - } -[actionenabler_conquer_city_marines] -action = "Conquer City" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "CanOccupyCity", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "DiplRel", "War", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "UnitFlag", "Marines", "Local", TRUE - "UnitType", "Anti-Aircraft Artillery", "Local", FALSE - ;AAA got Marines flag only to enable reasonable attacks, - ;not for conquering cities from a Transport. - } -target_reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - } -[actionenabler_conquer_city_from_non_native] -action = "Conquer City" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "CanOccupyCity", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "DiplRel", "War", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "UnitClassFlag", "AttFromNonNative", "Local", TRUE - "UnitType", "Anti-Aircraft Artillery", "Local", FALSE - ;AAA got AttFromNonNative only to enable reasonable attacks, - ;not for conquering cities from a Transport. - } -target_reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - } -;--------------------------------------------------------------------------- -[actionenabler_change_home_city] -action = "Home City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "NoHome", "Local", FALSE - "UnitState", "HasHomeCity", "Local", TRUE -; REMOVE LINE BELOW TO ALLOW GIVING UNITS TO ALLIES THROUGH HOME CITY COMMAND - "DiplRel", "Foreign", "Local", FALSE - } - -[actionenabler_paradrop_base] -action = "Paradrop Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Paratroopers", "Local", TRUE - "UnitState", "Transporting", "Local", FALSE - "Extra", "Airbase", "Local", TRUE - } - -[actionenabler_paradrop_city] -action = "Paradrop Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Paratroopers", "Local", TRUE - "UnitState", "Transporting", "Local", FALSE - "CityTile", "Center", "Local", TRUE - } - -[actionenabler_upgrade_unit] -action = "Upgrade Unit" -actor_reqs = - { "type", "name", "range", "present" - "DiplRel", "Foreign", "Local", FALSE - } - -[actionenabler_airlift_unit] -action = "Airlift Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "Airliftable", "Local", TRUE - "UnitState", "Transporting", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - } - -[actionenabler_transform_terrain_outside_city] -action = "Transform Terrain" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Transform", "Local", TRUE - "CityTile", "Center", "Local", FALSE - } -[actionenabler_transform_terrain_inside_city] ;can't change grass to hills inside a city -action = "Transform Terrain" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Transform", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "Terrain", "Grassland", "Local", FALSE - } - -[actionenabler_irrigate_tf] -action = "Irrigate TF" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Legion", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - } -[actionenabler_irrigate_tf_prole] -action = "Irrigate TF" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player", TRUE - } - -[actionenabler_mine_tf_outside_city] -action = "Mine TF" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Legion", "Local", FALSE - "UnitType", "Proletarians","Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE - "CityTile", "Center", "Local", FALSE - } -[actionenabler_mine_tf_outside_city_prole] -action = "Mine TF" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians","Local", TRUE - "Gov", "Communism", "Player", TRUE - "CityTile", "Center", "Local", FALSE - } -[actionenabler_mine_tf_inside_city] ;you can't plant a forest in an existing city -action = "Mine TF" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Legion", "Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - "CityTile", "Center", "Local", TRUE - "Terrain", "Grassland", "Local", FALSE - "Terrain", "Plains", "Local", FALSE - } - -[actionenabler_pillage] -action = "Pillage" -actor_reqs = - { "type", "name", "range" - "UnitClassFlag", "CanPillage", "Local" - } - -[actionenabler_fortify] -action = "Fortify" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "CanFortify", "Local", TRUE - "UnitFlag", "Cant_Fortify", "Local", FALSE - } - -[actionenabler_road] -action = "Road" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Legion", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - } -[actionenabler_road_prole] -action = "Road" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player", TRUE - } -[actionenabler_legion_road] -action = "Road" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Legion", "Local", TRUE - "UnitState", "OnDomesticTile","Local", FALSE - } -; Don't force legions to road BEFORE making a fortress -; from fortress being "domestic national territory" -[actionenabler_legion_road2] -action = "Road" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Legion", "Local", TRUE - "Extra", "Fort", "Local", TRUE - } - -[actionenabler_base] -action = "Build Base" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "CanFortress", "Local", TRUE - "UnitType", "Proletarians", "Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE - } -[actionenabler_base_prole] -action = "Build Base" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "CanFortress", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player", TRUE - } - -[actionenabler_mining] -action = "Build Mine" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitFlag", "Well-Digger", "Local", FALSE - "UnitType", "Legion", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "TerrainFlag", "Oil", "Local", FALSE - } -[actionenabler_mining_prole] -action = "Build Mine" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "TerrainFlag", "Oil", "Local", FALSE - } - -[actionenabler_desert_oil] -action = "Build Mine" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Legion", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE - "Tech", "Construction", "Player", TRUE - } -target_reqs = - { "type", "name", "range" - "Terrain", "Desert", "Local" - } -[actionenabler_desert_oil_prole] -action = "Build Mine" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player", TRUE - "Tech", "Construction", "Player", TRUE - } -target_reqs = - { "type", "name", "range" - "Terrain", "Desert", "Local" - } - -[actionenabler_arctic_oil] -action = "Build Mine" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Legion", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE - "Tech", "Refining", "Player", TRUE - } -target_reqs = - { "type", "name", "range" - "Terrain", "Arctic", "Local" - } -[actionenabler_arctic_oil_prole] -action = "Build Mine" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "Gov", "Communism", "Player", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Tech", "Refining", "Player", TRUE - } -target_reqs = - { "type", "name", "range" - "Terrain", "Arctic", "Local" - } - -[actionenabler_irrigate_welldigger] -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitFlag", "Well-Digger", "Local", TRUE - "Age", "10", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "TerrainFlag", "Low Land", "Local", TRUE - "Tech", "Pottery", "Player", FALSE - "Tech", "Alphabet","Player", FALSE - "Tech", "Writing", "World", FALSE - } - -[actionenabler_irrigate_src_ocean] -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitFlag", "Well-Digger", "Local", FALSE - "UnitType", "Legion", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "TerrainClass", "Oceanic", "CAdjacent", TRUE - } -[actionenabler_irrigate_src_ocean_prole] -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player",TRUE - } -target_reqs = - { "type", "name", "range", "present" - "TerrainClass", "Oceanic", "CAdjacent", TRUE - } - -[actionenabler_irrigate_src_river] -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Legion", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "Extra", "River", "CAdjacent", TRUE - } -[actionenabler_irrigate_src_river_prole] -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player",TRUE - } -target_reqs = - { "type", "name", "range", "present" - "Extra", "River", "CAdjacent", TRUE - } - -[actionenabler_irrigate_src_oasis] -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Legion", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "Extra", "Oasis", "CAdjacent", TRUE - } -[actionenabler_irrigate_src_oasis_prole] -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player",TRUE - } -target_reqs = - { "type", "name", "range", "present" - "Extra", "Oasis", "CAdjacent", TRUE - } - -[actionenabler_irrigate_src_irrigation] -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitFlag", "Well-Digger", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - "UnitType", "Legion", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "Extra", "Irrigation", "CAdjacent", TRUE - } -[actionenabler_irrigate_src_irrigation_prole] -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player",TRUE - } -target_reqs = - { "type", "name", "range", "present" - "Extra", "Irrigation", "CAdjacent", TRUE - } - -[borders] -; Base border radius from city. -radius_sq_city = 17 - -; Border radius square increased by this amount / point of city size -size_effect = 1 - -; Difference between city workable area and area permanently claimed by -; city (these tiles cannot be stolen by stronger border sources). -; 0 means exactly city workable area is immune to border stealing. -; Negative value means outer workable tiles can be stolen; highly negative -; value (more than max city radius_sq) means any workable tile can be stolen. -; If City_Radius_Sq is variable, so is the set of locked tiles; this is -; a squared value, so the radius of the ring of tiles which are workable -; but not locked (or vice versa) varies but the area is constant. -radius_sq_city_permanent = 0 - -[research] -; Method of calculating technology costs -; "Civ I|II" - Civ (I|II) style. Every new tech add base_tech_cost to -; cost of next tech. -; "Classic" - Cost of technology is: -; base_tech_cost * (1 + reqs) * sqrt(1 + reqs) / 2 -; where reqs == number of requirement for tech, counted -; recursively. -; "Classic+" - Cost are read from tech.ruleset. Missing costs are -; generated by style "Classic". -; "Experimental" - Cost of technology is: -; base_tech_cost * (reqs^2 / (1 + sqrt(sqrt(reqs + 1))) -; - 0.5) -; where reqs == number of requirement for tech, counted -; recursively. Initial techs` cost will be base_tech_cost. -; "Experimental+" - Cost are read from tech.ruleset. Missing costs are -; generated by style "Experimental". -; "Linear" - Cost of technology is: -; base_tech_cost * reqs -; where reqs == number of requirement for tech, counted -; recursively. -tech_cost_style = "Classic+" - -; Base research cost. Used in tech cost styles where tech cost is generated. -; In other words: used everywhere unless the cost of *all* techs are -; specified and the tech cost style is "Experimental+" or "Classic+". -base_tech_cost = 20 - -; Technology leak from other civilizations -; "None" - No reduction of the technology cost. -; "Embassies" - Technology cost is reduced depending on the number of -; players which already know the tech and you have an -; embassy with. -; "All Players" - Technology cost is reduced depending on the number of -; all players (human, AI and barbarians) which already -; know the tech. -; "Normal Players" - Technology cost is reduced depending on the number of -; normal players (human and AI) which already know the -; tech. -tech_leakage = "All Players" - -; Method of paying tech upkeep -; "None" - no upkeep -; "Basic" - upkeep is calculated as: -; / tech_upkeep_divider - tech_upkeep_free -; "Cities" - upkeep is calculated like "Basic", but multiplied by number of cities -tech_upkeep_style = "None" - -; upkeep cost is divided by this value -tech_upkeep_divider = 2000 - -; Method of selecting techs given for free -; "Goal" - Towards player`s goal, random if no goal -; "Random" - Random researchable tech -; "Cheapest" - Cheapest researchable tech, random among equal cost ones -free_tech_method = "Goal" - -[culture] -; Minimum culture points for cultural domination victory -victory_min_points = 1000 - -; How big lead relative to second best player is needed for victory -victory_lead_pct = 200 - -; How much each culture point affects the migration -; from/to the city. Each culture point count as this many permilles -; of a migration point. -migration_pml = 50 - -[calendar] -; Year in the beginning of the game -start_year = -4000 - -; Year 1 instead of 0. -skip_year_0 = TRUE - -; How many fragments each year has. In addition to this, "Turn_Fragments" effects are -; needed to control fragment accumulation. -; Value 0 here disables year advancement by fragment accumulation. -fragments = 0 - -; Calendar fragment names. If name is missing, only a fragment number +1 (so human readable -; numbers begin from 1 and not 0) is shown. - -;fragment_name0 = "Jan" -;fragment_name1 = "Feb" -; ... - -; What labels are used for positive and negative years. -; /* TRANS: year label (Anno Domini, Common Era) */ -positive_label = _("AD") -; /* TRANS: year label (BC was before Common Era became PC) */ -negative_label = _("BC") - -; /* <-- avoid gettext warnings -; -; Disaster types: -; -; name = translatable name as seen by user -; reqs = requirements for disaster to happen (see effects.ruleset -; and README.effects for help on requirements) -; frequency = how likely disaster is to occur -; effects -; - "DestroyBuilding" = Random building is destroyed -; - "ReducePopulation" = Reduce city size by one unless it's already 1 -; - "ReducePopDestroy" = Reduce city size by one, possibly destroying the city -; - "EmptyFoodStock" = Remove all food from food stock -; - "EmptyProdStock" = Destroy current production -; - "Pollution" = One tile surrounding city polluted -; - "Fallout" = One tile surrounding city polluted with fallout -; -; */ <-- avoid gettext warnings - -; No disasters in multiplayer ruleset - -; /* <-- avoid gettext warnings -; -; Achievement types: -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets -; etc; if not present, "name" is used for this -; purpose too. Since the name used in savegames must -; not change, if you want to rename an item after a -; ruleset has been released, you should set -; "rule_name" to the original value of "name". -; type = What event grants the achievement to player. -; See README.achievements for list of these types. -; unique = If TRUE, only first one reaching the achievement will -; get it. Defaults to TRUE. -; value = Value to reach. Exact meaning of this depends on -; achievement type. -; culture = Amount of culture granted to player who gets achievement -; granted. -; first_msg = Message shown to first player gaining the achievement -; cons_msg = Message shown to consecutive players gaining the achievement -; -; */ <-- avoid gettext warnings - -; No achievements in multiplayer ruleset - -; -; Trade settings -; -; IN = international, IC = intercontinental. -; For each of the trade route types: -; "pct" - Trade income %. If this is 0, trade route cannot be -; established at all -; "cancelling" - What to do to previously established traderoutes when they -; turn illegal -; "Active" - Keep them active (although they will only -; provide nonzero income if illegal due to -; trademindist rather than pct==0) -; "Inactive" - Keep them inactive -; "Cancel" - Cancel them altogether -; "bonus" - One-time bonuses granted when traderoute established -; "None" - No one-time bonus -; "Gold" - Bonus to gold -; "Science" - Bonus to research -; "Both" - Bonus to gold and research -; -[trade] -settings = - { "type", "pct", "cancelling", "bonus" - "National", 0, "Cancel", "None" - "NationalIC", 0, "Cancel", "None" - "IN", 35, "Inactive", "Gold" - "INIC", 35, "Inactive", "Gold" - "Ally", 35, "Inactive", "Gold" - "AllyIC", 35, "Inactive", "Gold" - "Enemy", 0, "Inactive", "Gold" - "EnemyIC", 0, "Inactive", "Gold" - "Team", 35, "Inactive", "Gold" - "TeamIC", 35, "Inactive", "Gold" - } - -; When are goods for the trade route chosen. -; "Leaving" - Goods to carry are assigned to unit when it`s built, or it changes homecity -; "Arrival" - Goods are chosen when trade route is established, when unit arrives to destination -goods_selection = "Arrival" - -; /* <-- avoid gettext warnings -; -; Goods types: -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets -; etc; if not present, "name" is used for this -; purpose too. Since the name used in savegames must -; not change, if you want to rename an item after a -; ruleset has been released, you should set -; "rule_name" to the original value of "name". -; reqs = requirements for a city to provide goods (see effects.ruleset -; and README.effects for help on requirements) -; from_pct = Income for the sending end of the trade route. Default is 100% -; This value is applied to both ends of bidirectional routes. -; to_pct = Income for the receiving end of the trade route. Default is 100% -; This value is not used at all in case of bidirectional routes. -; onetime_pct = Onetime bonuses when traderoute is established. Default is 100% -; flags -; - "Bidirectional" = Trade route carrying the goods does not have "from" and "to" -; ends, but both ends are considered the same. -; - "Depletes" = Trade route gets cancelled when the source city cannot provide -; goods any more. Bidirectional routes gets cancelled if either -; one of the involved cities cannot provide goods. -; helptext = Optional help text string; should escape all raw -; newlines so that xgettext parsing works -; -; */ <-- avoid gettext warnings - -[goods_good] -name = _("Goods") - - -; /* <-- avoid gettext warnings -; -; Clause types -; -; Clause types that are not listed here, are not enabled at all. -; -; type = Type of the clause, one of "Advance", "Gold", "Map", "Seamap", -; "City", "Ceasefire", "Peace", "Alliance", "Vision", "Embassy" -; -; */ <-- avoid gettext warnings - -[clause_advance] -type = "Advance" - -[clause_gold] -type = "Gold" - -[clause_map] -type = "Map" - -[clause_seamap] -type = "Seamap" - -[clause_city] -type = "City" - -[clause_ceasefire] -type = "Ceasefire" - -[clause_peace] -type = "Peace" - -[clause_alliance] -type = "Alliance" - -[clause_vision] -type = "Vision" - -[clause_embassy] -type = "Embassy" - - -[playercolors] -background.r = 86 -background.g = 86 -background.b = 86 - -; Player colors for 32 players are defined below. -; Avoid greens, blues, and white / very pale colors (too easy to confuse -; with terrain). -; Avoid dark colors. -colorlist = - { "r", "g", "b" - 255, 0, 0 ; Red - 255, 255, 0 ; Yellow - 0, 255, 255 ; Blue - 138, 43, 226 ; Purple - 255, 165, 0 ; Orange - 255, 0, 255 ; Magenta - 173, 216, 230 ; Cornflower - 0, 255, 127 ; Emerald - 250, 128, 114 ; Salmon - 124, 252, 0 ; Green - 139, 0, 0 ; Burgundy - 255, 192, 203 ; Pink - 211, 211, 211 ; Silver - 218, 112, 214 ; Heliotrope - 255, 20, 147 ; Fuchsia - 100, 149, 237 ; Azure - 255, 215, 0 ; Gold - 245, 222, 179 ; Khaki - 255, 255, 128 ; Butter - 192, 255, 128 ; Mint - 204, 255, 0 ; Lime - 255, 211, 140 ; Peach - 255, 79, 0 ; Vermilion - 240, 145, 169 ; Puce - 255, 219, 88 ; Mustard - 153, 17, 153 ; Aubergine - 184, 134, 11 ; Brown - 255, 102, 0 ; Pumpkin - 102, 205, 170 ; Turquoise - 195, 33, 72 ; Crimson - 168, 153, 230 ; Lavender - 255, 250, 205 ; Cream - } - -[teams] -; Team names correspond roughly to colors defined above, so that -; plrcolormode=TEAM_ORDER is not gratuitously confusing. -names = -; /* TRANS: Name of a color; used as unique identifier for a team */ -; /* TRANS: With this and other color team names, uniqueness is more */ -; /* TRANS: important than precise translation. To see the colors, start a */ -; /* TRANS: multiplayer game with 32 players and look at the Nations report. */ - _("?team name:Red"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Yellow"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Blue"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Purple"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Orange"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Magenta"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Cornflower"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Emerald"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Salmon"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Green"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Burgundy"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Pink"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Silver"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Heliotrope"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Fuchsia"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Azure"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Gold"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Khaki"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Butter"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Mint"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Lime"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Peach"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Vermilion"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Puce"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Mustard"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Aubergine"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Brown"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Pumpkin"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Turquoise"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Crimson"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Lavender"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Cream") - - -; RESTRICTINFRA ENABLED ONLY RESTRICTS ENEMY RAILS TO FUNCTION AS ROADS -[settings] -; TO DISABLE SPACERACE INCLUDE THESE LINES BELOW: -; "endspaceship", DISABLED, FALSE -; "victories", "ALLIED", FALSE - -set = - { "name", "value", "lock" - "mapsize", "PLAYER", FALSE - "tilesperplayer", 300, FALSE - "netwait", 20, FALSE - "nettimeout", 120, FALSE - "pingtime", 30, FALSE - "pingtimeout", 240, FALSE - "restrictinfra", "ENABLED", FALSE - "alltemperate", FALSE, FALSE - "aifill", 6, FALSE - "airliftingstyle", "FROM_ALLIES|TO_ALLIES", FALSE - "airliftdestdivisor", 3, FALSE - "barbarians", "DISABLED", FALSE - "borders", "SEE_INSIDE", FALSE - "contactturns", 10, FALSE - "diplomacy", "ALL", FALSE - "dispersion", 2, FALSE - "endturn", 365, FALSE - "foggedborders", TRUE, FALSE - "generator", "RANDOM", FALSE - "gold", 100, FALSE - "huts", 0, FALSE - "landmass", 63, FALSE - "minplayers", 0, FALSE - "move_bonus_in_frags", "ENABLED", TRUE ;locked - "nationset", "all", FALSE - "nuclearwinter_percent", 20, FALSE - "revolen", 1, FALSE - "separatepoles", FALSE, FALSE - "spaceship_travel_time", 225, FALSE - "specials", 350, FALSE - "startpos", "SINGLE", FALSE - "startunits", "cccwwwxxaA", FALSE - "techleak", 0, FALSE - "techpenalty", 0, FALSE - "tinyisles", FALSE, FALSE - "trademindist", 12, FALSE - "trade_revenue_style", "SIMPLE", FALSE ;"simple" formula based on average trade in both cities (sans distance etc.) - "topology", "WRAPX", FALSE - "trading_city", "DISABLED", FALSE - "universal_unload", "ENABLED", FALSE - "unload_override", 0, FALSE ;0=native unloading same as non-native. 1+ = move_fragment cost for unloading. - "unreachableprotects", "ENABLED", FALSE - } diff --git a/freeciv/freeciv/data/.historic/mp2sandbox/governments.ruleset b/freeciv/freeciv/data/.historic/mp2sandbox/governments.ruleset deleted file mode 100644 index 9fe233f4d..000000000 --- a/freeciv/freeciv/data/.historic/mp2sandbox/governments.ruleset +++ /dev/null @@ -1,242 +0,0 @@ - -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -; Note that the freeciv AI may not cope well with anything more -; than minor changes. - -[datafile] -description="Multiplayer governments data for Freeciv (as Civ2, minus fundamentalism)" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -[governments] -during_revolution="Anarchy" - -; /* <-- avoid gettext warnings -; -; Below: The individual government types, one per section. -; -; The actual tag used (the * in [government_*]) does not matter, except -; it must be unique within this file, and it may be used in debug -; output when reading this file. -; -; For the "official" rulesets, the order of these sections should not -; be changed because that would break backward compatability with -; savegames. (In particular, if Fundamentalism is added to default -; ruleset, should be added at end.) -; -; Notes on fields: -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; if -; not present, "name" is used for this purpose too. Since -; the name used in savegames must not change, if you want -; to rename an item after a ruleset has been released, you -; should set "rule_name" to the original value of "name". -; reqs = requirements for this government (see README.effects) -; graphic = tag specifing preferred graphic -; graphic_alt = alternate graphics tag if preferred is not found; -; should be a standard tag if preferred is not; -; otherwise may be "-" -; ai_better = AI will not consider this government for use if the -; government listed here is available -; ruler_titles = ruler titles by nation, "-" is default, and non-matched -; nations are ignored -; helptext = optional help text string; should escape all raw newlines -; so that xgettext parsing works -; -; */ <-- avoid gettext warnings - -;------------------------------------------------------------------------ -[government_anarchy] - -name = _("Anarchy") -; No reqs -graphic = "gov.anarchy" -graphic_alt = "-" - -ruler_male_title = _("Warlord %s") -ruler_female_title = _("Warlady %s") - -helptext = _("\ -Anarchy is simply the absence of any recognizable government.\ - Citizens are disorganized and unproductive, and will spend all\ - income as quickly as possible, rather than paying taxes or\ - conducting research.\ -"), _("\ -Anarchy offers slightly less corruption than Despotism,\ - but slightly more unhappiness.\ -") - -;------------------------------------------------------------------------ -[government_despotism] - -name = _("Despotism") -; No reqs -graphic = "gov.despotism" -graphic_alt = "-" -ai_better = "Monarchy" - -ruler_male_title = _("Chief %s") -ruler_female_title = _("?female:Chief %s") - -helptext = _("\ -Under Despotism, you are the absolute ruler of your people. Your\ - control over your citizens is maintained largely by martial law.\ -"), _("\ -Despotism suffers the highest level of corruption of all\ - forms of government.\ -") - -;------------------------------------------------------------------------ -[government_monarchy] - -name = _("Monarchy") -reqs = { "type", "name", "range" - "tech", "Monarchy", "Player" - } -graphic = "gov.monarchy" -graphic_alt = "-" -ai_better = "Communism" - -ruler_male_title = _("King %s") -ruler_female_title = _("Queen %s") - -helptext = _("\ -Under Monarchy, a king or queen serves as a hereditary figurehead\ - for your government.\ -"), _("\ -Monarchy suffers the same small amount of corruption that\ - the Republic does.\ -") - -;------------------------------------------------------------------------ -[government_communism] - -name = _("Communism") -reqs = { "type", "name", "range" - "tech", "Communism", "Player" - } -graphic = "gov.communism" -graphic_alt = "-" - -ruler_male_title = _("Comrade %s") -ruler_female_title = _("?female:Comrade %s") - -helptext = _("\ -In Communism, all work, output, and goods are owned by the state.\ -"), _("\ -Corruption does not vary by distance from the capital;\ - all cities have the same base level of corruption. Each city gets 4\ - units free of upkeep. Buildings with 1 upkeep are free.\ - The capital city with Palace gets a +25% production bonus.\ -"), _("\ -Communist states can transfer Proletarians between cities to\ - re-distribute population. Large numbers of Proletarians can be\ - used to finish State projects. The Communism tech allows a\ - Communist government to conscript Workers to Riflemen and vice - versa, if inside national territory and if possessing the necessary\ - technologies.\ -") - -;------------------------------------------------------------------------ -[government_republic] - -name = _("Republic") -reqs = { "type", "name", "range" - "tech", "The Republic", "Player" - } -graphic = "gov.republic" -graphic_alt = "-" - -ruler_male_title = _("President %s") -ruler_female_title = _("?female:President %s") - -helptext = _("\ -Under a Republican government, citizens hold an election to select a\ - representative who will govern them; since elected leaders must\ - remain popular to remain in control, citizens are given a greater\ - degree of freedom. Citizens under the Republic become unhappy\ - easily, but the self-sufficiency of your citizens allows high levels\ - of trade.\ -") - -;------------------------------------------------------------------------ -[government_democracy] - -name = _("Democracy") -reqs = { "type", "name", "range" - "tech", "Democracy", "Player" - } -graphic = "gov.democracy" -graphic_alt = "-" - -ruler_male_title = _("Prime Minister %s") -ruler_female_title = _("?female:Prime Minister %s") - -helptext = _("\ -Under Democracy, citizens govern directly by voting on issues.\ - Democracy offers the highest possible level of trade, but also\ - offers the most potential for unhappiness. There is no corruption\ - during Democracy, but citizens become very upset during\ - wars.\ -") - -;------------------------------------------------------------------------ -[government_fundamentalism] - -name = _("Fundamentalism") -reqs = { "type", "name", "range" - "tech", "Fundamentalism", "Player" - } -graphic = "gov.fundamentalism" -graphic_alt = "-" - -ruler_male_title = _("High Priest %s") -ruler_female_title = _("High Priestess %s") - -helptext = _("\ -Fundamentalism is organized around central beliefs, usually religious. These form\ - rigid guidelines for the actions of the rulers and the people.\ -"), _("\ -The people are entirely devoted to their beliefs, and are often willing to die to\ - preserve them.\ -"), _("\ -Improvements that convert unhappy citizens to content produce gold tithes equal to\ - the number of citizens they would convert. Fanatics cannot be bribed. Palace\ - gives +50% to gold income in its city. In each city, two military units may impose\ - martial law, making one citizen each content. Pilgrims can be used to migrate and\ - grow the population in the cities directed by the ruling High Priest.\ -") - -; /* <-- avoid gettext warnings -; -; Multipliers (aka policies) -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets -; etc; if not present, "name" is used for this -; purpose too. Since the name used in savegames must -; not change, if you want to rename an item after a -; ruleset has been released, you should set -; "rule_name" to the original value of "name". -; default = default value (as presented in UI) -; start = minimum value (as presented in UI) -; stop = maximum value (as presented in UI) -; step = minimum increase/decrease (as presented in UI) -; offset = offset/factor control how UI values are turned -; factor = into effect values for use in effects.ruleset. -; effect_value = (ui_value + offset) * (factor/100) -; Optional; by default offset=0, factor=100, so -; that UI values are used as-is. -; reqs = requirements for adjusting this policy (see README.effects) -; helptext = optional help text string; should escape all raw -; newlines so that xgettext parsing works -; -; */ <-- avoid gettext warnings diff --git a/freeciv/freeciv/data/.historic/mp2sandbox/parser.lua b/freeciv/freeciv/data/.historic/mp2sandbox/parser.lua deleted file mode 100644 index ea4bf8c53..000000000 --- a/freeciv/freeciv/data/.historic/mp2sandbox/parser.lua +++ /dev/null @@ -1,13 +0,0 @@ --- Freeciv - Copyright (C) 2007 - The Freeciv Project --- This program is free software; you can redistribute it and/or modify --- it under the terms of the GNU General Public License as published by --- the Free Software Foundation; either version 2, or (at your option) --- any later version. --- --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU General Public License for more details. - --- This file is for lua-functionality for parsing luadata.txt --- of this ruleset. diff --git a/freeciv/freeciv/data/.historic/mp2sandbox/script.lua b/freeciv/freeciv/data/.historic/mp2sandbox/script.lua deleted file mode 100644 index 003523a9e..000000000 --- a/freeciv/freeciv/data/.historic/mp2sandbox/script.lua +++ /dev/null @@ -1,176 +0,0 @@ --- Freeciv - Copyright (C) 2007 - The Freeciv Project --- This program is free software; you can redistribute it and/or modify --- it under the terms of the GNU General Public License as published by --- the Free Software Foundation; either version 2, or (at your option) --- any later version. --- --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU General Public License for more details. - --- This file is for lua-functionality that is specific to a given --- ruleset. When freeciv loads a ruleset, it also loads script --- file called 'default.lua'. The one loaded if your ruleset --- does not provide an override is default/default.lua. - - --- This flags whether philosophy awards a bonus advance, and gets set to off (0) after T85. -philosophy_possible = 1 -game_turn = 0 - ---Give players custom messages on certain years. Currently at 1600 AD (T85), Philosophy expires. Let them know. -function history_turn_notifications(turn, year) - game_turn = turn - - if turn > 78 and turn < 85 then - notify.all("Philosophy will no longer award a bonus tech after turn 85.") - end - - if turn == 85 then - -- Philosophy no longer gives advances after 1600 AD - notify.all("Philosophers around the world mourn the execution of Giordano Bruno. Philosophy no longer gives a bonus advance.") - philosophy_possible = 0 - end - - return false -end -signal.connect("turn_begin", "history_turn_notifications") -- *************** turn_started deprecated in 3.1, renamed turn_begin - --- Place Ruins at the location of the destroyed city. -function city_destroyed_callback(city, loser, destroyer) - city.tile:create_extra("Ruins", NIL) - -- continue processing - return false -end - -signal.connect("city_destroyed", "city_destroyed_callback") - - --- Hack: record which players already got Philosophy, to avoid --- teams getting it multiple times with team_pooled_research. --- Stored as a string as this is a type simple enough to be included --- in savefiles. --- (It`s probably not necessary to test for existence as savefile --- data is loaded after this script is executed.) -if philo_players == nil then - philo_players = "" -end - --- Record that a player got Philosophy in our hacky string. -function record_philo(player) - local pos = player.id + 1 - philo_players = string.sub(philo_players, 1, pos-1) .. - string.rep(" ", math.max(0, pos - 1 - #philo_players)) .. - "." .. string.sub(philo_players, pos+1) -end - --- Grant one tech when the tech Philosophy is researched. -function tech_researched_handler(tech, player, how) - local id - local gained - - if tech == nil then - -- no tech was researched. - return - end - - id = tech.id --- Report early Horseback riding. - if id == find.tech_type("Horseback Riding").id and how == "researched" then - if game_turn < 15 then - for c in player:cities_iterate() do - if c:has_building(find.building_type("Palace")) then - notify.event(NIL, c.tile, E.TECH_GAIN, - _("Travellers tell stories of the amazing skills of the %s, who ride wild beasts near %s! (%i,%i)"), - player.nation:plural_translation(), c.name, c.tile.x, c.tile.y ) - - notify.all( _("Tribesmen have learned to ride wild beasts near %s (%i,%i)"), c.name, c.tile.x, c.tile.y) - end - end - end - end -------------------------- - if id == find.tech_type("Philosophy").id and how == "researched" then - - -- Check potential teammates. - for p in players_iterate() do - if player:shares_research(p) - and string.sub(philo_players, p.id+1, p.id+1) == "." then - -- Another player in the same team already got Philosophy. - record_philo(player) - return - end - end - - record_philo(player) - - - -- Philosophy does not give a bonus tech under certain conditions. Check for those conditions ------------------- - if philosophy_possible == 0 then - -- No Philosophy advance after turn 85 (1600 CE) - return - end - - -- Philosophy can only give advances if you know NO techs from the next tier -------------- - -- Even knowing any of these techs makes an advance impossible ! - - local researcher = player - - local forbidden_tech = find.tech_type("Banking") - if researcher:knows_tech(forbidden_tech) then - return - end - - forbidden_tech = find.tech_type("Medicine") - if researcher:knows_tech(forbidden_tech) then - return - end - - forbidden_tech = find.tech_type("University") - if researcher:knows_tech(forbidden_tech) then - return - end - - forbidden_tech = find.tech_type("Invention") - if researcher:knows_tech(forbidden_tech) then - return - end - - forbidden_tech = find.tech_type("Physics") - if researcher:knows_tech(forbidden_tech) then - return - end - - forbidden_tech = find.tech_type("Monotheism") - if researcher:knows_tech(forbidden_tech) then - return - end - - -- Give the player a free advance. - -- This will give a free advance for each player that shares research. - gained = player:give_tech(nil, -1, false, "researched") - - -- Notify the player. Include the tech names in a way that makes it - -- look natural no matter if each tech is announced or not. - notify.event(player, NIL, E.TECH_GAIN, - _("Great philosophers from all the world join your civilization: you get the immediate advance %s."), - gained:name_translation()) - - -- Notify research partners - notify.research(player, false, E.TECH_GAIN, - _("Great philosophers from all the world join the %s: you get the immediate advance %s."), - player.nation:plural_translation(), - gained:name_translation()) - - -- default.lua informs the embassies when the tech source is a hut. - -- They should therefore be informed about the source here too. - notify.research_embassies(player, E.TECH_EMBASSY, - -- /* TRANS: first %s is leader or team name */ - _("Great philosophers from all the world join %s: they get %s as an immediate advance."), - player:research_name_translation(), - gained:name_translation()) - end -end - -signal.connect("tech_researched", "tech_researched_handler") diff --git a/freeciv/freeciv/data/.historic/mp2sandbox/styles.ruleset b/freeciv/freeciv/data/.historic/mp2sandbox/styles.ruleset deleted file mode 100644 index cc690357f..000000000 --- a/freeciv/freeciv/data/.historic/mp2sandbox/styles.ruleset +++ /dev/null @@ -1,265 +0,0 @@ - -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -[datafile] -description="Nation theme data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -; /* <-- avoid gettext warnings -; -; Nation styles -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; if -; not present, "name" is used for this purpose too. Since -; the name used in savegames must not change, if you want -; to rename an item after a ruleset has been released, you -; should set "rule_name" to the original value of "name". -; -; */ <-- avoid gettext warnings - -[style_european] -name = _("?style:European") - -[style_classical] -name = _("?style:Classical") - -[style_tropical] -name = _("?style:Tropical") - -[style_asian] -name = _("?style:Asian") - -[style_babylonian] -name = _("?style:Babylonian") - -[style_celtic] -name = _("?style:Celtic") - -; /* <-- avoid gettext warnings -; -; City styles define the way cities are drawn -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; if -; not present, "name" is used for this purpose too. Since -; the name used in savegames must not change, if you want -; to rename an item after a ruleset has been released, you -; should set "rule_name" to the original value of "name". -; graphic = group of tiles to use, see cities spec for -; more info on city tiles -; citizens_graphic = group of citizens tiles to use, see citizens/small -; spec for more info on citizens tiles -; FIXME: this and _alt not currently used! -; reqs = requirements for this city style (see README.effects) -; -; */ <-- avoid gettext warnings - -[citystyle_european] -name = _("?citystyle:European") -graphic = "city.european" -graphic_alt = "-" -citizens_graphic = "ancient" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "Style", "European", "Player" - } - -[citystyle_classical] -name = _("?citystyle:Classical") -graphic = "city.classical" -graphic_alt = "-" -citizens_graphic = "ancient" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "Style", "Classical", "Player" - } - -[citystyle_tropical] -name = _("?citystyle:Tropical") -graphic = "city.tropical" -graphic_alt = "city.european" -citizens_graphic = "ancient" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "Style", "Tropical", "Player" - } - -[citystyle_asian] -name = _("?citystyle:Asian") -graphic = "city.asian" -graphic_alt = "city.classical" -citizens_graphic = "ancient" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "Style", "Asian", "Player" - } - -[citystyle_babylonian] -name = _("?citystyle:Babylonian") -graphic = "city.babylonian" -graphic_alt = "city.classical" -citizens_graphic = "ancient" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "Style", "Babylonian", "Player" - } - -[citystyle_celtic] -name = _("?citystyle:Celtic") -graphic = "city.celtic" -graphic_alt = "city.european" -citizens_graphic = "ancient" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "Style", "Celtic", "Player" - } - -[citystyle_industrial] -name = _("?citystyle:Industrial") -graphic = "city.industrial" -graphic_alt = "-" -citizens_graphic = "industrial" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "tech", "Railroad", "Player" - } - -[citystyle_electric] -name = _("?citystyle:ElectricAge") -graphic = "city.electricage" -graphic_alt = "city.modern" -citizens_graphic = "electricage" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "tech", "Automobile", "Player" - } - -[citystyle_modern] -name = _("?citystyle:Modern") -graphic = "city.modern" -graphic_alt = "-" -citizens_graphic = "modern" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "tech", "Rocketry", "Player" - } - -[citystyle_postmodern] -name = _("?citystyle:PostModern") -graphic = "city.postmodern" -graphic_alt = "-" -citizens_graphic = "postmodern" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "tech", "Superconductors", "Player" - } - -; /* <-- avoid gettext warnings -; -; Music styles -; -; Order is important. The last one for which activation requirements -; are fulfilled is the one that plays. -; -; music_peaceful = Music to play when nation in peaceful mood -; music_combat = Music to play when nation in combat mood -; reqs = requirements to activate the style (see effects.ruleset -; and README.effects for help on requirements) -; -; */ <-- avoid gettext warnings - -[musicstyle_european] -music_peaceful = "music_european_peace" -music_combat = "music_european_combat" -reqs = - { "type", "name", "range" - "Style", "European", "Player" - } - -[musicstyle_classical] -music_peaceful = "music_classical_peace" -music_combat = "music_classical_combat" -reqs = - { "type", "name", "range" - "Style", "Classical", "Player" - } - -[musicstyle_tropical] -music_peaceful = "music_tropical_peace" -music_combat = "music_tropical_combat" -reqs = - { "type", "name", "range" - "Style", "Tropical", "Player" - } - -[musicstyle_asian] -music_peaceful = "music_asian_peace" -music_combat = "music_asian_combat" -reqs = - { "type", "name", "range" - "Style", "Asian", "Player" - } - -[musicstyle_babylonian] -music_peaceful = "music_babylonian_peace" -music_combat = "music_babylonian_combat" -reqs = - { "type", "name", "range" - "Style", "Babylonian", "Player" - } - -[musicstyle_celtic] -music_peaceful = "music_celtic_peace" -music_combat = "music_celtic_combat" -reqs = - { "type", "name", "range" - "Style", "Celtic", "Player" - } - -[musicstyle_renaissance] -music_peaceful = "music_renaissance_peace" -music_combat = "music_renaissance_combat" -reqs = - { "type", "name", "range" - "Tech", "University", "Player" - } - -[musicstyle_industrial] -music_peaceful = "music_industrial_peace" -music_combat = "music_industrial_combat" -reqs = - { "type", "name", "range" - "Tech", "Railroad", "Player" - } - -[musicstyle_electricage] -music_peaceful = "music_electricage_peace" -music_combat = "music_electricage_combat" -reqs = - { "type", "name", "range" - "Tech", "Automobile", "Player" - } - -[musicstyle_modern] -music_peaceful = "music_modern_peace" -music_combat = "music_modern_combat" -reqs = - { "type", "name", "range" - "Tech", "Rocketry", "Player" - } - -[musicstyle_postmodern] -music_peaceful = "music_postmodern_peace" -music_combat = "music_postmodern_combat" -reqs = - { "type", "name", "range" - "Tech", "Superconductors", "Player" - } diff --git a/freeciv/freeciv/data/.historic/mp2sandbox/techs.ruleset b/freeciv/freeciv/data/.historic/mp2sandbox/techs.ruleset deleted file mode 100644 index 4341490df..000000000 --- a/freeciv/freeciv/data/.historic/mp2sandbox/techs.ruleset +++ /dev/null @@ -1,948 +0,0 @@ - -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes, -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -[datafile] -description="Multiplayer-Evolution technology data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -[control] -; Names for custom tech flags. There can be up to 8 of these. -; name = rule name; In some circumstances user may see this -; as part of some sentences, so try to make it descriptive -; and sensible. -; helptxt = displayed in the help for advances with this flag (optional) -;flags = -; { "name", "helptxt" -; } - -; /* <-- avoid gettext warnings -; -; Tech classes: -; -; First one is the default one. -; If there is none, tech classes feature is disabled -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets -; etc; if not present, "name" is used for this -; purpose too. Since the name used in savegames must -; not change, if you want to rename an item after a -; ruleset has been released, you should set -; "rule_name" to the original value of "name". -; cost_pct = how much techs of the class cost compared -; to normal. Default is 100%. -; -; */ <-- avoid gettext warnings - -;[techclass_default] -;name = - -; /* <-- avoid gettext warnings -; -; Below: The individual advances, one per section. -; The number can be variable, up to 250. -; -; The actual tag used (the * in [advance_*]) does not matter, except -; it must be unique within this file, and it may be used in debug -; output when reading this file. -; -; Notes: -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; if -; not present, "name" is used for this purpose too. Since -; the name used in savegames must not change, if you want -; to rename an item after a ruleset has been released, you -; should set "rule_name" to the original value of "name". -; class = tech class this tech belongs to, if they have been defined. -; Default is first one defined above. -; req1, req2 = advances required before researching this one -; root_req = tech required before acquiring this tech, by any means. -; All techs with any direct or indirect dependency on this -; one will *also* have this root_req, as well as their own -; and any others they inherit. -; Giving "None" explicitly here prevents a tech from -; inheriting root_reqs in this way, and stops root_req -; inheritance through that tech. -; Specifying a tech's root_req as itself means that the tech -; can only be acquired by special means (nation's init_techs, -; scripting, etc). -; research_reqs = requirements before researching this one. Can have non -; tech requirements because it is a requirement vector. -; See doc/README.effects to learn more about requirement -; vectors. -; Requireing a tech here in stead of in req1, req2 or -; root_req is not supported yet. -; Requirements that may become fulfilled during the game -; when they weren't at the start of the game is not -; supported yet. -; flags = special flag strings -; graphic = icon for technology -; graphic_alt = alternate icon -; helptext = optional help text string (set units ruleset for examples) -; bonus_message = text seen when a player is the first to discover -; an bonus tech. Must contain '%s' to mark place of the tech -; gained. -; cost = if tech_cost_style is set to "Classic+" or "Experimental+", -; this field is read for information on how much a tech -; costs. -; -; Special values for req1 and req2 are "None" (first section below) -; and "Never" (never available). If only one tech is required, -; it should be listed as req1. -; -; As well as custom flags defined above, the following flag strings are -; possible: -; -; "Bonus_Tech" = player gets extra tech if reached first -; "Bridge" = "Settler" unit types can build roads with -; "RequiresBridge" flag over roads with -; "PreventsOtherRoads" flag (rivers) -; "Build_Airborne" = from now on can build air units (for use by AI) -; "Claim_Ocean" = Player claims ocean tiles even if they are not -; adjacent to border source -; "Claim_Ocean_Limited" = Oceanic border sources claim ocean tiles even if -; they are not adjacent to border source -; -; */ <-- avoid gettext warnings - -[advance_advanced_flight] -name = _("Advanced Flight") -req1 = "Radio" -req2 = "Machine Tools" -flags = "" -graphic = "a.advanced_flight" -graphic_alt = "-" -cost = 6630 - -[advance_alphabet] -name = _("Alphabet") -req1 = "None" -req2 = "None" -flags = "" -graphic = "a.alphabet" -graphic_alt = "-" -cost = 24 - -[advance_amphibious_warfare] -name = _("Amphibious Warfare") -req1 = "Navigation" -req2 = "Tactics" -flags = "" -graphic = "a.amphibious_warfare" -graphic_alt = "-" -cost = 3280 - -[advance_astronomy] -name = _("Astronomy") -req1 = "Mysticism" -req2 = "Mathematics" -flags = "" -graphic = "a.astronomy" -graphic_alt = "-" -cost = 146 - -[advance_atomic_theory] -name = _("Atomic Theory") -req1 = "Theory of Gravity" -req2 = "Physics" -flags = "" -graphic = "a.atomic_theory" -graphic_alt = "-" -cost = 1080 - -[advance_automobile] -name = _("Automobile") -req1 = "Combustion" -req2 = "Steel" -graphic = "a.automobile" -graphic_alt = "-" -helptext = _("Obsoletes Leonardos Workshop, Colossus. +25% population pollution.") -cost = 4230 - -[advance_banking] -name = _("Banking") -req1 = "Trade" -req2 = "The Republic" -flags = "" -graphic = "a.banking" -graphic_alt = "-" -helptext = _("Prevents Philosophy from awarding bonus tech.") -cost = 364 - -[advance_bridge_building] -name = _("Bridge Building") -req1 = "Iron Working" -req2 = "Construction" -flags = "Bridge" -graphic = "a.bridge_building" -graphic_alt = "-" -helptext = _("Allows roads on rivers.") - -[advance_bronze_working] -name = _("Bronze Working") -req1 = "None" -req2 = "None" -flags = "" -graphic = "a.bronze_working" -graphic_alt = "-" -cost = 24 - -[advance_ceremonial_burial] -name = _("Ceremonial Burial") -req1 = "None" -req2 = "None" -flags = "" -graphic = "a.ceremonial_burial" -graphic_alt = "-" -cost = 24 - -[advance_chemistry] -name = _("Chemistry") -req1 = "University" -req2 = "Medicine" -flags = "" -graphic = "a.chemistry" -graphic_alt = "-" -cost = 800 - -[advance_chivalry] -name = _("Chivalry") -req1 = "Feudalism" -req2 = "Horseback Riding" -flags = "" -graphic = "a.chivalry" -graphic_alt = "-" -helptext = _("Obsoletes Horsemen, Chariots.") -cost = 226 - -[advance_code_of_laws] -name = _("Code of Laws") -req1 = "Alphabet" -req2 = "None" -flags = "" -graphic = "a.code_of_laws" -graphic_alt = "-" - -[advance_combined_arms] -name = _("Combined Arms") -req1 = "Mobile Warfare" -req2 = "Advanced Flight" -flags = "" -graphic = "a.combined_arms" -graphic_alt = "-" -cost = 6970 - -[advance_combustion] -name = _("Combustion") -req1 = "Refining" -req2 = "Explosives" -flags = "" -graphic = "a.combustion" -graphic_alt = "-" -cost = 3810 - -[advance_communism] -name = _("Communism") -req1 = "Philosophy" -req2 = "Industrialization" -flags = "" -graphic = "a.communism" -graphic_alt = "-" -helptext = _("-1 Effect for Cathedral, Michelangelos Chapel.") - -[advance_computers] -name = _("Computers") -req1 = "Mass Production" -req2 = "Miniaturization" -flags = "" -graphic = "a.computers" -graphic_alt = "-" -helptext = _("Obsoletes Temple of Artemis.") -cost = 5650 - -[advance_conscription] -name = _("Conscription") -req1 = "Democracy" -req2 = "Metallurgy" -flags = "" -graphic = "a.conscription" -graphic_alt = "-" -helptext = _("Obsoletes Musketeers.") -cost = 1890 - -[advance_construction] -name = _("Construction") -req1 = "Masonry" -req2 = "Currency" -flags = "" -graphic = "a.construction" -graphic_alt = "-" -helptext = _("Allows Fortresses, Oil Wells.") - -[advance_currency] -name = _("Currency") -req1 = "Bronze Working" -req2 = "None" -flags = "" -graphic = "a.currency" -graphic_alt = "-" - -[advance_democracy] -name = _("Democracy") -req1 = "Banking" -req2 = "Invention" -flags = "" -graphic = "a.democracy" -graphic_alt = "-" -cost = 875 - -[advance_economics] -name = _("Economics") -req1 = "Banking" -req2 = "University" -flags = "" -graphic = "a.economics" -graphic_alt = "-" -cost = 875 - -[advance_electricity] -name = _("Electricity") -req1 = "Metallurgy" -req2 = "Magnetism" -flags = "" -graphic = "a.electricity" -graphic_alt = "-" -helptext = _("Obsoletes Ironclad. +1 Effect for Amphitheaters.") -cost = 2220 - -[advance_electronics] -name = _("Electronics") -req1 = "The Corporation" -req2 = "Electricity" -flags = "" -graphic = "a.electronics" -graphic_alt = "-" -cost = 3630 - -[advance_engineering] -name = _("Engineering") -req1 = "The Wheel" -req2 = "Construction" -flags = "" -graphic = "a.engineering" -graphic_alt = "-" -helptext = _("Allows Canals and Naval Bases.") - -[advance_environmentalism] -name = _("Environmentalism") -req1 = "Recycling" -req2 = "Space Flight" -flags = "" -graphic = "a.environmentalism" -graphic_alt = "-" -helptext = _("-50% Pollution in all cities.") -cost = 8040 - -[advance_espionage] -name = _("Espionage") -req1 = "Communism" -req2 = "Democracy" -flags = "" -graphic = "a.espionage" -graphic_alt = "-" -helptext = _("Obsoletes Diplomat.") -cost = 2900 - -[advance_explosives] -name = _("Explosives") -req1 = "Gunpowder" -req2 = "Chemistry" -flags = "" -graphic = "a.explosives" -graphic_alt = "-" -helptext = _("Obsoletes Workers.") -cost = 1560 - -[advance_feudalism] -name = _("Feudalism") -req1 = "Warrior Code" -req2 = "Monarchy" -flags = "" -graphic = "a.feudalism" -graphic_alt = "-" -cost = 146 - -[advance_flight] -name = _("Flight") -req1 = "Combustion" -req2 = "Theory of Gravity" -flags = "Build_Airborne" -graphic = "a.flight" -graphic_alt = "-" -helptext = _("Less Traderoute revenue.") -cost = 4680 - -[advance_fundamentalism] -name = _("Fundamentalism") -req1 = "Theology" -req2 = "Conscription" -flags = "" -graphic = "a.fundamentalism" -graphic_alt = "-" - -[advance_fusion_power] -name = _("Fusion Power") -req1 = "Nuclear Power" -req2 = "Superconductors" -flags = "" -graphic = "a.fusion_power" -graphic_alt = "-" -cost = 6120 - -[advance_genetic_engineering] -name = _("Genetic Engineering") -req1 = "Medicine" -req2 = "The Corporation" -flags = "" -graphic = "a.genetic_engineering" -graphic_alt = "-" -cost = 3150 - -[advance_guerilla_warfare] -name = _("Guerilla Warfare") -req1 = "Communism" -req2 = "Tactics" -flags = "" -graphic = "a.guerilla_warfare" -graphic_alt = "-" -helptext = _("Obsoletes Explorer. Globally unlocks defensive partisans.") -cost = 3985 - -[advance_gunpowder] -name = _("Gunpowder") -req1 = "Invention" -req2 = "Iron Working" -flags = "" -graphic = "a.gunpowder" -graphic_alt = "-" -cost = 800 -helptext = _("Obsoletes Barracks, earlier foot soldiers.") - -[advance_horseback_riding] -name = _("Horseback Riding") -req1 = "None" -req2 = "None" -flags = "" -graphic = "a.horseback_riding" -graphic_alt = "-" -cost = 24 - -[advance_industrialization] -name = _("Industrialization") -req1 = "Railroad" -req2 = "Banking" -graphic = "a.industrialization" -graphic_alt = "-" -helptext = _("Obsoletes Galleon. Population begins polluting.") -cost = 2330 - -[advance_invention] -name = _("Invention") -req1 = "Engineering" -req2 = "Literacy" -flags = "" -graphic = "a.invention" -graphic_alt = "-" -helptext = _("Extra vision for Fortress and ships in Naval Base. Prevents Philosophy bonus.") - -[advance_iron_working] -name = _("Iron Working") -req1 = "Bronze Working" -req2 = "Warrior Code" -flags = "" -graphic = "a.iron_working" -graphic_alt = "-" - -[advance_labor_union] -name = _("Labor Union") -req1 = "Mass Production" -req2 = "Guerilla Warfare" -flags = "" -graphic = "a.labor_union" -graphic_alt = "-" -cost = 6630 - -[advance_laser] -name = _("Laser") -req1 = "Mass Production" -req2 = "Nuclear Power" -flags = "" -graphic = "a.laser" -graphic_alt = "-" -cost = 5790 - -[advance_leadership] -name = _("Leadership") -req1 = "Chivalry" -req2 = "Gunpowder" -flags = "" -graphic = "a.leadership" -graphic_alt = "-" -helptext = _("Obsoletes Horsemen, Chariot, Elephant, Knight, Crusader.") -cost = 1250 - -[advance_literacy] -name = _("Literacy") -req1 = "Writing" -req2 = "Code of Laws" -flags = "" -graphic = "a.literacy" -graphic_alt = "-" - -[advance_machine_tools] -name = _("Machine Tools") -req1 = "Steel" -req2 = "Tactics" -flags = "" -graphic = "a.machine_tools" -graphic_alt = "-" -helptext = _("Obsoletes Cannon. Globally obsoletes Great Wall.") -cost = 3985 - -[advance_magnetism] -name = _("Magnetism") -;req1 = "Iron Working" -;req2 = "Physics" -req1 = "Navigation" -req2 = "Invention" -flags = "" -graphic = "a.magnetism" -graphic_alt = "-" -helptext = _("Obsoletes Caravel.") -cost = 950 - -[advance_map_making] -name = _("Map Making") -req1 = "Alphabet" -req2 = "None" -flags = "" -graphic = "a.map_making" -graphic_alt = "-" -cost = 51 - -[advance_masonry] -name = _("Masonry") -req1 = "None" -req2 = "None" -flags = "" -graphic = "a.masonry" -graphic_alt = "-" -helptext = _("Allows Forts.") -cost = 24 - -[advance_mass_production] -name = _("Mass Production") -req1 = "Automobile" -req2 = "The Corporation" -graphic = "a.mass_production" -graphic_alt = "-" -helptext = _("+25% population pollution.") -cost = 4680 - -[advance_mathematics] -name = _("Mathematics") -req1 = "Alphabet" -req2 = "Masonry" -flags = "" -graphic = "a.mathematics" -graphic_alt = "-" - -[advance_medicine] -name = _("Medicine") -req1 = "Philosophy" -req2 = "Trade" -flags = "" -graphic = "a.medicine" -graphic_alt = "-" -cost = 468 - -[advance_metallurgy] -name = _("Metallurgy") -req1 = "Gunpowder" -req2 = "University" -flags = "" -graphic = "a.metallurgy" -graphic_alt = "-" -helptext = _("Obsoletes Catapult.") -cost = 1340 - -[advance_miniaturization] -name = _("Miniaturization") -req1 = "Machine Tools" -req2 = "Electronics" -flags = "" -graphic = "a.miniaturization" -graphic_alt = "-" -helptext = _("Obsoletes Lighthouse.") -cost = 4490 - -[advance_mobile_warfare] -name = _("Mobile Warfare") -req1 = "Automobile" -req2 = "Tactics" -flags = "" -graphic = "a.mobile_warfare" -graphic_alt = "-" -helptext = _("Obsoletes Barracks II, Cavalry, Sun Tzu, Genghis Khan.") -cost = 5650 - -[advance_monarchy] -name = _("Monarchy") -req1 = "Ceremonial Burial" -req2 = "Code of Laws" -flags = "" -graphic = "a.monarchy" -graphic_alt = "-" - -[advance_monotheism] -name = _("Monotheism") -req1 = "Philosophy" -req2 = "Polytheism" -flags = "" -graphic = "a.monotheism" -helptext = _("Obsoletes Elephants.") -graphic_alt = "-" -cost = 415 - -[advance_mysticism] -name = _("Mysticism") -req1 = "Ceremonial Burial" -req2 = "None" -flags = "" -graphic = "a.mysticism" -graphic_alt = "-" -helptext = _("Doubles the effect of Temples.") - -[advance_navigation] -name = _("Navigation") -req1 = "Seafaring" -req2 = "Astronomy" -flags = "" -graphic = "a.navigation" -graphic_alt = "-" -helptext = _("Obsoletes Galley, Longboat, War Galley, Ram Ship.") -cost = 486 - -[advance_nuclear_fission] -name = _("Nuclear Fission") -req1 = "Mass Production" -req2 = "Atomic Theory" -flags = "" -graphic = "a.nuclear_fission" -graphic_alt = "-" -cost = 5300 - -[advance_nuclear_power] -name = _("Nuclear Power") -req1 = "Nuclear Fission" -req2 = "Electronics" -flags = "" -graphic = "a.nuclear_power" -graphic_alt = "-" -helptext = _("+2 moves for Sea units.") -cost = 5650 - -[advance_philosophy] -name = _("Philosophy") -req1 = "Mysticism" -req2 = "Literacy" -flags = "" -graphic = "a.philosophy" -graphic_alt = "-" -helptext = _("Bonus tech before 1600AD if no next tier techs are possessed.") -cost = 276 - -[advance_physics] -name = _("Physics") -req1 = "Literacy" -req2 = "Navigation" -flags = "" -graphic = "a.physics" -graphic_alt = "-" -helptext = _("Prevents Philosophy from awarding bonus tech.") - -[advance_plastics] -name = _("Plastics") -req1 = "Refining" -req2 = "Space Flight" -graphic = "a.plastics" -graphic_alt = "-" -helptext = _("Obsoletes Armor. +25% population pollution.") -cost = 7860 - -[advance_polytheism] -name = _("Polytheism") -req1 = "Horseback Riding" -req2 = "Ceremonial Burial" -flags = "" -graphic = "a.polytheism" -graphic_alt = "-" - -[advance_pottery] -name = _("Pottery") -req1 = "None" -req2 = "None" -flags = "" -graphic = "a.pottery" -graphic_alt = "-" -cost = 24 - -[advance_radio] -name = _("Radio") -req1 = "Flight" -req2 = "Electronics" -flags = "" -graphic = "a.radio" -graphic_alt = "-" -helptext = _("Obsoletes Mausoleum. Allows Airbase, Buoy.") -cost = 5430 - -[advance_railroad] -name = _("?tech:Railroad") -req1 = "Steam Engine" -req2 = "Bridge Building" -flags = "" -graphic = "a.railroad" -graphic_alt = "-" -helptext = _("Obsoletes Hanging Gardens. Less Traderoute revenue. Allows Railroads.") -cost = 1820 - -[advance_recycling] -name = _("Recycling") -req1 = "Mass Production" -req2 = "Democracy" -flags = "" -graphic = "a.recycling" -graphic_alt = "-" -cost = 4460 - -[advance_refining] -name = _("Refining") -req1 = "Chemistry" -req2 = "Steel" -flags = "" -graphic = "a.refining" -graphic_alt = "-" -helptext = _("Allows Oil Wells on Glaciers.") -cost = 3630 - -[advance_refrigeration] -name = _("Refrigeration") -req1 = "Sanitation" -req2 = "Electricity" -flags = "" -graphic = "a.refrigeration" -graphic_alt = "-" -helptext = _("Allows Farmland.") -cost = 2775 - -[advance_robotics] -name = _("Robotics") -req1 = "Mobile Warfare" -req2 = "Computers" -flags = "" -graphic = "a.robotics" -graphic_alt = "-" -helptext = _("Obsoletes Artillery, King Richards Crusade.") -cost = 7860 - -[advance_rocketry] -name = _("Rocketry") -req1 = "Advanced Flight" -req2 = "Miniaturization" -flags = "" -graphic = "a.rocketry" -graphic_alt = "-" -helptext = _("Obsoletes Destroyer, Cruiser.") -cost = 7040 - -[advance_sanitation] -name = _("Sanitation") -req1 = "Engineering" -req2 = "Medicine" -flags = "" -graphic = "a.sanitation" -graphic_alt = "-" -cost = 950 - -[advance_seafaring] -name = _("Seafaring") -req1 = "Pottery" -req2 = "Map Making" -flags = "" -graphic = "a.seafaring" -helptext = _("Obsoletes Trireme.") -graphic_alt = "-" - -[advance_space_flight] -name = _("Space Flight") -req1 = "Computers" -req2 = "Rocketry" -flags = "" -graphic = "a.space_flight" -graphic_alt = "-" -helptext = _("Obsoletes prior Bombers/Fighters") -cost = 7680 - -[advance_stealth] -name = _("Stealth") -req1 = "Superconductors" -req2 = "Space Flight" -flags = "" -graphic = "a.stealth" -graphic_alt = "-" -cost = 11920 - -[advance_steam_engine] -name = _("Steam Engine") -;req1 = "Physics" -;req2 = "Invention" -req1 = "Physics" -req2 = "University" -flags = "" -graphic = "a.steam_engine" -graphic_alt = "-" -helptext = _("Obsoletes Frigate.") -cost = 1240 - -[advance_steel] -name = _("Steel") -req1 = "Electricity" -req2 = "Industrialization" -flags = "" -graphic = "a.steel" -graphic_alt = "-" -cost = 3280 - -[advance_superconductors] -name = _("Superconductors") -req1 = "Nuclear Power" -req2 = "Laser" -flags = "" -graphic = "a.superconductors" -graphic_alt = "-" -cost = 5950 -helptext = _("Allows MagLev.") - -[advance_tactics] -name = _("Tactics") -req1 = "Conscription" -req2 = "Leadership" -flags = "" -graphic = "a.tactics" -graphic_alt = "-" -helptext = _("Obsoletes Dragoons, Statue of Zeus.") -cost = 2530 - -[advance_the_corporation] -name = _("The Corporation") -req1 = "Economics" -req2 = "Industrialization" -flags = "" -graphic = "a.the_corporation" -graphic_alt = "-" -helptext = _("Obsoletes Caravan.") -cost = 2900 - -[advance_the_republic] -name = _("The Republic") -req1 = "Code of Laws" -req2 = "Literacy" -flags = "" -graphic = "a.the_republic" -graphic_alt = "-" - -[advance_the_wheel] -name = _("The Wheel") -req1 = "Horseback Riding" -req2 = "None" -flags = "" -graphic = "a.the_wheel" -graphic_alt = "-" - -[advance_theology] -name = _("Theology") -req1 = "Feudalism" -req2 = "Monotheism" -flags = "" -graphic = "a.theology" -graphic_alt = "-" -helptext = _("Obsoletes Oracle. +1 Effect on Cathedral, Michelangelos Chapel.") -cost = 725 - -[advance_theory_of_gravity] -name = _("Theory of Gravity") -req1 = "Astronomy" -req2 = "University" -flags = "" -graphic = "a.theory_of_gravity" -graphic_alt = "-" -cost = 585 - -[advance_trade] -name = _("Trade") -req1 = "Currency" -req2 = "Code of Laws" -flags = "" -graphic = "a.trade" -graphic_alt = "-" -helptext = _("Lets Commerce units make Wonders, Traderoutes.") - -[advance_university] -name = _("University") -req1 = "Mathematics" -req2 = "Philosophy" -flags = "" -graphic = "a.university" -graphic_alt = "-" -cost = 415 - -[advance_warrior_code] -name = _("Warrior Code") -req1 = "None" -req2 = "None" -flags = "" -graphic = "a.warrior_code" -graphic_alt = "-" -cost = 24 - -[advance_writing] -name = _("Writing") -req1 = "Alphabet" -req2 = "None" -flags = "" -graphic = "a.writing" -graphic_alt = "-" - -; A placeholder tech used to ensure that when -; a game is reloaded, a player can`t rebuild -; the "Darwin's Voyage" small wonder and get -; two free advances again. -; THIS RULESET DOES NOT USE OLD DARWIN'S VOYAGE BEHAVIOUR OR THEORY OF EVOLUTION. -[advance_theory_of_evolution] -name = _("Theory of Evolution") -req1 = "None" -req2 = "None" -root_req = "Theory of Evolution" -flags = "" -graphic = "b.darwins_voyage" -graphic_alt = "-" -helptext = _("This technology is not researchable and has no effect.") diff --git a/freeciv/freeciv/data/.historic/mp2sandbox/terrain.ruleset b/freeciv/freeciv/data/.historic/mp2sandbox/terrain.ruleset deleted file mode 100644 index 794100e2c..000000000 --- a/freeciv/freeciv/data/.historic/mp2sandbox/terrain.ruleset +++ /dev/null @@ -1,2144 +0,0 @@ - -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes, -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -; Note that the freeciv AI may not cope well with anything more -; than minor changes. - -[datafile] -description="Multiplayer-Evolution (MP2) terrain data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -[control] -; Names for custom terrain flags. There can be up to 8 of these. -; name = rule name; In some circumstances user may see this -; as part of some sentences, so try to make it descriptive -; and sensible. -; helptxt = displayed in the help for terrains with this flag (optional) -flags = - { "name", "helptxt" - _("Oil"), _("Has Oil Well instead of Mine.") - _("NoPollution"), _("No Pollution nor Fallout appear here.") - _("Low Land"), _("Terrain suitable for canal digging.") - } - -; Names for custom extra flags. There can be up to 8 of these. -; name = rule name; In some circumstances user may see this -; as part of some sentences, so try to make it descriptive -; and sensible. -; helptxt = displayed in the help for extra types with this flag -; (optional) -;extra_flags = -; { "name", "helptxt" -; } - -[parameters] - -; Percentage of "land" tiles required to be adjacent to a water tile before -; it may be "reclaimed" into a land tile (0-101; 0=anywhere, default 101=nowhere) -ocean_reclaim_requirement = 30 - -; Percentage of "water" tiles required to be adjacent to a land tile before -; it may be "channeled" into a water tile (0-101; 0=anywhere, default 101=nowhere) -land_channel_requirement = 10 - -; Percentage of unfrozen tiles (no "Frozen" flag) required to be adjacent -; to a frozen tile before it can thaw (0-101; 0=anywhere, default 101=nowhere) -thaw_requirement = 0 - -; Percentage of frozen tiles ("Frozen" flag) required to be adjacent to an -; unfrozen tile before it can freeze (0-101; 0=anywhere, default 101=nowhere) -freeze_requirement = 0 - -; Bodies of water up to this size are considered freshwater lakes, if there is -; also terrain type(s) with flag "FreshWater" in the ruleset. -lake_max_size = 14 - -; How many native tiles first startunit must be able to reach. -; 0 to disable check. -min_start_native_area = 0 - -; How many fragments each movement point has. -; For example road movement costs are relative to this. -move_fragments = 9 - -; How many move_fragments IgTer unit movement costs -igter_cost = 3 - -; Whether diagonal movement has increased cost (no effect with hex topology) -; The cost increase is more accurate with larger values for move_fragments -pythagorean_diagonal = FALSE - -; There is no resources in the middle of the oceans, only near coast -ocean_resources = FALSE - -; /* <-- avoid gettext warnings -; -; The individual terrain types, one per section. -; Roughly sorted by identifier. -; The actual tag used (the * in [terrain_*]) must be unique for each terrain, -; and may be used in debug output when reading this file. -; -; Notes: -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; -; if not present, "name" is used for this purpose too. -; Since the name used in savegames must not change, if -; you want to rename an item after a ruleset has been -; released, you should set "rule_name" to the original -; value of "name". -; graphic = preferred graphic; Tilespec [tile_*] section -; with 'tag' matching this will be used. -; graphic_alt = alternate graphic. When no tilespec 'tag' matching -; preferred graphic is not found, this will be used. -; Otherwise may be "-" -; identifier = single-character identifier used in savegames. This -; must be unique for each terrain. -; class = Terrain class terrain belongs to: "Land" or "Oceanic" -; movement_cost = in whole movement points, not move_fragments; -; typically 1 to 3 -; defense_bonus = percent added to defense; typically 0% to 200% -; food = normal food production -; shield = normal shield production -; trade = normal trade production -; resources = list of possible resources on this terrain -; road_food_incr_pct = percent of road food_incr applied to this terrain -; road_shield_incr_pct = percent of road shield_incr applied to this terrain -; road_trade_incr_pct = percent of road trade_incr applied to this terrain -; base_time = time to build bases; if 0, cannot build any bases. -; Nonzero values only affect extras with build_time 0. -; road_time = time to build roads; if 0, cannot build any roads. -; Nonzero values only affect extras with build_time 0. -; irrigation_result = result of 'irrigate' activity; one of: -; "no" -- cannot irrigate -; "yes" -- can build extra -; terrain section -- irrigation changes to that terrain -; irrigation_food_incr = increment to food if tile is 100% irrigated -; (actual bonus controlled by Irrigation_Pct effect) -; irrigation_time = time for 'irrigate' activity; if 0, cannot irrigate -; Nonzero values only affect extras with build_time 0. -; Such extras can modify time with build_time_factor. -; mining_result = result of 'mine' activity; one of: -; "no" -- cannot mine -; "yes" -- can build extra -; terrain section -- mining changes to that terrain -; mining_shield_incr = increment to shields if tile is 100% mined -; (actual bonus controlled by Mining_Pct effect) -; mining_time = time for 'mine' activity; if 0, cannot mine -; Nonzero values only affect extras with build_time 0. -; Such extras can modify time with build_time_factor. -; transform_result = result of transformation; one of: -; "no" -- cannot transform -; terrain section -- transformation changes to that -; terrain -; transform_time = time to transform; if 0, cannot transform -; pillage_time = time to pillage extra from the tile (0 = impossible) -; Nonzero values only affect extras with removal_time 0. -; clean_pollution_time = time for 'clean pollution' activity (0 = impossible) -; Nonzero values only affect extras with removal_time 0. -; clean_fallout_time = time for 'clean fallout' activity (0 = impossible) -; Nonzero values only affect extras with removal_time 0. -; animal = unit type that can appear as animal on the terrain -; warmer_wetter_result = result of global warming for wet terrains; one of: -; "no" -- no change; does not count for warming -; "yes" -- no change; counts for warming -; terrain section -- warming changes to that terrain -; warmer_drier_result = result of global warming for dry terrains; -; see warmer_wetter_result -; cooler_wetter_result = result of nuclear winter for wet terrains; -; see warmer_wetter_result -; cooler_drier_result = result of nuclear winter for dry terrains; -; see warmer_wetter_result -; native_to = List of unit classes that can move here -; flags = General flags for this terrain. List taken from the -; following, and/or any user flags defined above: -; - NoBarbs = Barbarians will not be spawned here. -; - NoCities = Cities may not be built or found on this terrain. -; - Starter = Players will only be started on "Starter" terrain. -; (Currently this cannot be Oceanic terrain.) -; - CanHaveRiver = Set to 1 if this terrain can have river on it (the -; actual chance of river generation is controlled -; separately). -; - UnsafeCoast = This terrain does not provide a safe voyage for -; units with flag "Trireme" -; - FreshWater = This terrain is used for small bodies of water. -; If this becomes adjacent to non-FreshWater terrain, -; the whole contiguous FreshWater area will be flooded -; with the non-FreshWater terrain. -; - NotGenerated = Map generator never places this terrain type. It can -; be added from editor only, or by ingame events -; (lua scripting) -; - NoZoc = Units on this terrain are not generating or subject -; to zoc -; - NoFortify = Units cannot fortify on this terrain -; - Frozen = Frozen/polar terrain. For water tiles, Frozen terrain -; is generated near poles. Conversion between frozen -; and unfrozen terrain can be controlled with -; thaw_requirement/freeze_requirement, and Frozen -; terrain is shown differently on the overview map. -; property_* = specific property % values used by mapgen. Most -; terrains will have 0 for most values. Properties -; other than ocean_depth are only used for land tiles. -; - mountainous = degree to which this terrain is mountainous -; - green = how much life this terrain has -; - foliage = how much thick undergrowth the terrain has -; - tropical = how "tropical" the terrain is (high temperature) -; - temperate = how "temperate" the terrain is (med temperature) -; - cold = how "cold" the terrain is (low temperature) -; - frozen = how "frozen" the terrain is (very low temperature) -; (does not necessarily have to have the "Frozen" flag) -; - wet = how "wet" the terrain is (moisture) -; - dry = how "dry" the terrain is (moisture) -; - ocean_depth = the depth of an ocean, as an average level -; color.r = color of the terrain (red value) -; color.g = color of the terrain (green value) -; color.b = color of the terrain (blue value) -; helptext = optional help text string; should escape all raw -; newlines so that xgettext parsing works -; -; */ <-- avoid gettext warnings - -[terrain_inaccesible] -name = _("Inaccessible") -graphic = "inaccessible" -graphic_alt = "arctic" -identifier = "i" -class = "Land" -movement_cost = 0 -defense_bonus = 0 -food = 0 -shield = 0 -trade = 0 -road_food_incr_pct = 0 -road_shield_incr_pct = 0 -road_trade_incr_pct = 0 -base_time = 0 -road_time = 0 -irrigation_result = "no" -irrigation_food_incr = 0 -irrigation_time = 0 -mining_result = "no" -mining_shield_incr = 0 -mining_time = 0 -transform_result = "no" -transform_time = 0 -pillage_time = 0 -clean_pollution_time = 0 -clean_fallout_time = 0 -animal = "None" -warmer_wetter_result = "no" -warmer_drier_result = "no" -cooler_wetter_result = "no" -cooler_drier_result = "no" -flags = "NotGenerated", "NoPollution", "NoCities", "UnsafeCoast", "Frozen" -color.r = 25 -color.g = 25 -color.b = 25 -helptext = _("\ -No unit can enter this terrain, nor can any city work its tiles.\ -") - -[terrain_lake] -name = _("Lake") -graphic = "lake" -graphic_alt = "coast" -identifier = "+" -class = "Oceanic" -movement_cost = 1 -defense_bonus = 0 -food = 1 -shield = 0 -trade = 2 -resources = "Fish" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 0 -irrigation_result = "no" -irrigation_food_incr = 0 -irrigation_time = 0 -mining_result = "no" -mining_shield_incr = 0 -mining_time = 0 -transform_result = "Swamp" -transform_time = 36 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "no" -warmer_drier_result = "Swamp" -cooler_wetter_result = "Arctic" -cooler_drier_result = "Tundra" -native_to = "Sea", "Air", "Balloon", "Missile", "Helicopter", "Trireme", "RiverShip", "Submarine", "AirProtect", "AirPillage", "Bomb" -flags = "NoCities", "NoBarbs", "NoPollution", "FreshWater", "NoZoc", "NoFortify" -property_ocean_depth = 0 -color.r = 46 -color.g = 120 -color.b = 182 -helptext = _("\ -Lakes are substantial bodies of fresh water.\ -") - -[terrain_ocean] -name = _("Ocean") -graphic = "coast" -graphic_alt = "-" -identifier = " " -class = "Oceanic" -movement_cost = 1 -defense_bonus = 0 -food = 1 -shield = 0 -trade = 2 -resources = "Fish", "Whales" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 0 -irrigation_result = "no" -irrigation_food_incr = 0 -irrigation_time = 0 -mining_result = "no" -mining_shield_incr = 0 -mining_time = 0 -transform_result = "Swamp" -transform_time = 36 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "no" -warmer_drier_result = "Swamp" -cooler_wetter_result = "Arctic" -cooler_drier_result = "Arctic" -native_to = "Sea", "Air", "Balloon", "Missile", "Helicopter", "Trireme", "RiverShip", "Submarine", "AirProtect", "AirPillage", "Bomb" -flags = "NoCities", "NoPollution", "UnsafeCoast", "NoZoc", "NoFortify" -property_ocean_depth = 32 -color.r = 0 -color.g = 46 -color.b = 137 -helptext = _("\ -Shallow oceans are mostly found near coastlines, and are often rich\ - sources of food and other resources.\ -") - -[terrain_deep_ocean] -name = _("Deep Ocean") -graphic = "floor" -graphic_alt = "coast" -identifier = ":" -class = "Oceanic" -movement_cost = 1 -defense_bonus = 0 -food = 1 -shield = 0 -trade = 2 -;resources = "none" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 0 -irrigation_result = "no" -irrigation_food_incr = 0 -irrigation_time = 0 -mining_result = "no" -mining_shield_incr = 0 -mining_time = 0 -transform_result = "no" -transform_time = 0 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "no" -warmer_drier_result = "no" -cooler_wetter_result = "no" -cooler_drier_result = "no" -native_to = "Trireme", "Sea", "Air", "Balloon", "Missile", "Helicopter", "RiverShip", "Submarine", "AirProtect", "AirPillage", "Bomb" -flags = "NoCities", "NoPollution", "UnsafeCoast", "NoZoc", "NoFortify" -property_ocean_depth = 87 -color.r = 0 -color.g = 33 -color.b = 129 -helptext = _("\ -Deep oceans cover much of the world away from coastlines, and only\ - seaworthy units (not including Triremes) can travel on them.\ -") - -[terrain_arctic] -name = _("Arctic") -graphic = "arctic" -graphic_alt = "-" -identifier = "a" -class = "Land" -movement_cost = 2 -defense_bonus = 0 -food = 0 -shield = 0 -trade = 0 -resources = "Ivory", "Oil" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 4 -irrigation_result = "Tundra" -irrigation_food_incr = 0 -irrigation_time = 15 -mining_result = "yes" -mining_shield_incr = 2 -mining_time = 10 -transform_result = "Desert" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Tundra" -warmer_drier_result = "Tundra" -cooler_wetter_result = "no" -cooler_drier_result = "no" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "NoBarbs", "NoCities", "CanHaveRiver", "Oil", "Frozen" -property_frozen = 23 -color.r = 232 -color.g = 232 -color.b = 232 -helptext = _("\ -Arctic terrain is ice capped permafrost, found only in the far northern or southern\ - reaches of the world. It is very cold, and hence difficult to work with.\ -"), _("\ -Oil wells can be built when Refining is known.\ -") - -[terrain_desert] -name = _("Desert") -graphic = "desert" -graphic_alt = "-" -identifier = "d" -class = "Land" -movement_cost = 1 -defense_bonus = 0 -food = 0 -shield = 1 -trade = 0 -resources = "Oasis", "Oil" -road_trade_incr_pct = 100 -base_time = 1 -road_time = 2 -irrigation_result = "yes" -irrigation_food_incr = 1 -irrigation_time = 5 -mining_result = "yes" -mining_shield_incr = 1 -mining_time = 5 -transform_result = "Plains" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Grassland" -warmer_drier_result = "no" -cooler_wetter_result = "Plains" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "CanHaveRiver", "Oil", "Low Land" -property_dry = 75 -property_tropical = 40 -property_temperate = 26 -color.r = 214 -color.g = 185 -color.b = 106 -helptext = _("\ -Deserts are regions of extreme dryness, making agriculture and\ - trade very difficult.\ -"), _("\ -Oil wells can be built when Construction is known.\ -") - -[terrain_forest] -name = _("Forest") -graphic = "forest" -graphic_alt = "-" -identifier = "f" -class = "Land" -movement_cost = 2 -defense_bonus = 33 -food = 1 -shield = 2 -trade = 0 -resources = "Pheasant", "Silk" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 4 -irrigation_result = "Plains" -irrigation_food_incr = 0 -irrigation_time = 5 -mining_result = "Swamp" -mining_shield_incr = 0 -mining_time = 15 -transform_result = "Grassland" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Jungle" -warmer_drier_result = "Plains" -cooler_wetter_result = "Swamp" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "Starter", "CanHaveRiver", "Low Land" -property_cold = 35 -property_frozen = 7 -property_mountainous = 15 -property_wet = 30 -property_foliage = 50 -property_temperate = 50 -color.r = 43 -color.g = 107 -color.b = 19 -helptext = _("\ -Forests are densely wooded, making agriculture somewhat\ - problematic.\ -") - -[terrain_grassland] -name = _("Grassland") -graphic = "grassland" -graphic_alt = "-" -identifier = "g" -class = "Land" -movement_cost = 1 -defense_bonus = 0 -food = 2 -shield = 0 -trade = 0 -resources = "Resources" -road_trade_incr_pct = 100 -base_time = 1 -road_time = 2 -irrigation_result = "yes" -irrigation_food_incr = 1 -irrigation_time = 5 -mining_result = "Forest" -mining_shield_incr = 0 -mining_time = 10 -transform_result = "Hills" -transform_time = 30 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Lake" -warmer_drier_result = "Desert" -cooler_wetter_result = "Arctic" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "Starter", "CanHaveRiver", "Low Land" -property_green = 50 -property_temperate = 50 -property_cold = 12 -property_dry = 10 -property_tropical = 20 -color.r = 11 -color.g = 138 -color.b = 4 -helptext = _("\ -Grasslands afford exceptional agricultural opportunities.\ -") - -[terrain_hills] -name = _("Hills") -graphic = "hills" -graphic_alt = "-" -identifier = "h" -class = "Land" -movement_cost = 2 -defense_bonus = 100 -food = 1 -shield = 0 -trade = 0 -resources = "Coal", "Wine" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 4 -irrigation_result = "yes" -irrigation_food_incr = 1 -irrigation_time = 10 -mining_result = "yes" -mining_shield_incr = 3 -mining_time = 10 -transform_result = "Plains" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "no" -warmer_drier_result = "no" -cooler_wetter_result = "no" -cooler_drier_result = "no" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "Starter", "CanHaveRiver" -property_green = 50 -property_mountainous = 35 -property_cold = 35 -property_frozen = 20 -property_dry = 15 -color.r = 24 -color.g = 97 -color.b = 5 -helptext = _("\ -In addition to being amenable to agriculture, Hills are frequently\ - rich in resources.\ -") - -[terrain_jungle] -name = _("Jungle") -graphic = "jungle" -graphic_alt = "-" -identifier = "j" -class = "Land" -movement_cost = 2 -defense_bonus = 50 -food = 1 -shield = 1 -trade = 0 -resources = "Gems", "Fruit", "Rubber" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 4 -irrigation_result = "Grassland" -irrigation_food_incr = 0 -irrigation_time = 8 -mining_result = "Forest" -mining_shield_incr = 0 -mining_time = 10 -transform_result = "Plains" -transform_time = 12 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Lake" -warmer_drier_result = "Desert" -cooler_wetter_result = "Swamp" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "CanHaveRiver", "Low Land" -property_foliage = 45 -property_tropical = 50 -property_wet = 45 -color.r = 55 -color.g = 156 -color.b = 38 -helptext = _("\ -Jungles are densely overgrown, making agriculture somewhat\ - problematic.\ -") - -[terrain_mountains] -name = _("Mountains") -graphic = "mountains" -graphic_alt = "-" -identifier = "m" -class = "Land" -movement_cost = 3 -defense_bonus = 200 -food = 0 -shield = 1 -trade = 0 -resources = "Gold", "Iron" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 6 -irrigation_result = "no" -irrigation_food_incr = 0 -irrigation_time = 0 -mining_result = "yes" -mining_shield_incr = 1 -mining_time = 10 -transform_result = "Hills" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "no" -warmer_drier_result = "no" -cooler_wetter_result = "no" -cooler_drier_result = "no" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "CanHaveRiver" -property_mountainous = 65 -property_cold = 50 -color.r = 129 -color.g = 127 -color.b = 118 -helptext = _("\ -Mountains are regions of extreme altitude, making agriculture and\ - trade very difficult.\ -") - -[terrain_plains] -name = _("Plains") -graphic = "plains" -graphic_alt = "-" -identifier = "p" -class = "Land" -movement_cost = 1 -defense_bonus = 0 -food = 1 -shield = 1 -trade = 0 -resources = "Buffalo", "Wheat" -road_trade_incr_pct = 100 -base_time = 1 -road_time = 2 -irrigation_result = "yes" -irrigation_food_incr = 1 -irrigation_time = 5 -mining_result = "Forest" -mining_shield_incr = 0 -mining_time = 15 -transform_result = "Grassland" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Lake" -warmer_drier_result = "Desert" -cooler_wetter_result = "Arctic" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "Starter", "CanHaveRiver", "Low Land" -property_green = 50 -property_frozen = 5 -property_dry = 16 -property_cold = 28 -property_tropical = 10 -property_temperate = 50 -property_mountainous = 15 -color.r = 122 -color.g = 156 -color.b = 46 -helptext = _("\ -Plains are very broad, sparse regions, which makes trade slightly\ - inconvenient.\ -") - -[terrain_swamp] -name = _("Swamp") -graphic = "swamp" -graphic_alt = "-" -identifier = "s" -class = "Land" -movement_cost = 2 -defense_bonus = 33 -food = 1 -shield = 0 -trade = 0 -resources = "Peat", "Spice" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 4 -irrigation_result = "Grassland" -irrigation_food_incr = 0 -irrigation_time = 15 -mining_result = "Forest" -mining_shield_incr = 0 -mining_time = 15 -transform_result = "Lake" -transform_time = 12 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Lake" -warmer_drier_result = "Desert" -cooler_wetter_result = "Arctic" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "CanHaveRiver", "Low Land" -property_wet = 100 -property_frozen = 3 -property_tropical = 10 -property_temperate = 10 -property_cold = 17 -color.r = 48 -color.g = 85 -color.b = 97 -helptext = _("\ -Swamps suffer from an over-abundance of water, making agriculture\ - somewhat problematic.\ -") - -[terrain_tundra] -name = _("Tundra") -graphic = "tundra" -graphic_alt = "-" -identifier = "t" -class = "Land" -movement_cost = 1 -defense_bonus = 0 -food = 1 -shield = 0 -trade = 0 -resources = "Game", "Furs", "Gold" -road_trade_incr_pct = 100 -base_time = 1 -road_time = 2 -irrigation_result = "yes" -irrigation_food_incr = 1 -irrigation_time = 5 -mining_result = "Desert" -mining_shield_incr = 0 -mining_time = 15 -transform_result = "Plains" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Lake" -warmer_drier_result = "Desert" -cooler_wetter_result = "Arctic" -cooler_drier_result = "no" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "Starter", "NoBarbs", "CanHaveRiver", "Low Land" -property_cold = 38 -property_frozen = 45 -color.r = 188 -color.g = 188 -color.b = 188 -helptext = _("\ -Tundra are broad, cold regions, fit for some agriculture and little\ - else.\ -") - -; /* <-- avoid gettext warnings -; -; Resource types: -; -; The actual tag used (the * in [resource_*]) must be unique for each resource, -; and may be used in debug output when reading this file. -; -; Notes: -; -; extra = name of the extra this resource section is part of -; (must have "Resource" in its causes) -; identifier = single-character identifier used in old savegames. This -; must be unique for each resource, and changing it will -; break loading those old savegames. -; food = increased food production -; shield = increased shield production -; trade = increased trade production -; -; */ <-- avoid gettext warnings - -[resource_gold] -extra = "Gold" -identifier = "$" -trade = 8 -# mountains, tundra - -[resource_iron] -extra = "Iron" -identifier = "/" -shield = 3 -# mountains. - -[resource_game] -extra = "Game" -identifier = "e" -food = 2 -shield = 2 -# tundra. - -[resource_furs] -extra = "Furs" -identifier = "u" -food = 1 -shield = 1 -trade = 3 -# tundra - -[resource_coal] -extra = "Coal" -identifier = "c" -shield = 2 -# hills. - -[resource_fish] -extra = "Fish" -identifier = "y" -food = 2 -# ocean. - -[resource_fruit] -extra = "Fruit" -identifier = "f" -food = 4 -trade = 2 -# jungle. - -[resource_gems] -extra = "Gems" -identifier = "g" -trade = 5 -# jungle. - -[resource_rubber] -extra = "Rubber" -identifier = "^" -shield = 2 -trade = 2 -# jungle. - -; "h" reserved for strategic horses - -[resource_buffalo] -extra = "Buffalo" -identifier = "b" -shield = 2 -# plains (horses => buffalo => cattle). - -[resource_wheat] -extra = "Wheat" -identifier = "j" -food = 2 -# plains. - -; "k" reserved for (cane) sugar - -; "l" reserved for tobacco - -; "m" reserved for marble - -[resource_oasis] -extra = "Oasis" -identifier = "o" -food = 3 -# desert. - -[resource_peat] -extra = "Peat" -identifier = "a" -shield = 4 -# swamp (petroleum => peat => petroleum). - -[resource_pheasant] -extra = "Pheasant" -identifier = "p" -food = 2 -# forest, forested. - -; "r" reserved for rubber - -[resource_bonus] -extra = "Resources" -identifier = "r" -shield = 1 -# grassland. - -[resource_icy_ivory] -extra = "Ivory" -identifier = "i" -food = 1 -shield = 1 -trade = 4 -# arctic - -[resource_silk] -extra = "Silk" -identifier = "s" -trade = 3 -# forest - -[resource_spice] -extra = "Spice" -identifier = "t" -food = 2 -trade = 4 -# swamp-only. - -; "u" reserved for uranium - -[resource_whales] -extra = "Whales" -identifier = "v" -food = 1 -shield = 1 -# ocean (sea). - -[resource_wine] -extra = "Wine" -identifier = "w" -trade = 4 -# hills-only. - -[resource_oil] -extra = "Oil" -identifier = "x" -shield = 3 ; arctic used to have 4, now it's 3+2 allowing an 0 2 0 tile. -# arctic, desert - - -[extraui] -; Player visible names of the base gui types. -ui_name_base_fortress = _("?gui_type:Build Fort/Buoy") -ui_name_base_airbase = _("?gui_type:Build Airbase") - -; /* <-- avoid gettext warnings -; -; Each extra, including bases, roads, and resource, must have a section here. -; Bases, roads, and resources have additional sections for their specific features. -; -; -; Extra types: -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets -; etc; if not present, "name" is used for this -; purpose too. Since the name used in savegames must -; not change, if you want to rename an item after a -; ruleset has been released, you should set -; "rule_name" to the original value of "name". -; category = How UI should categorize this extra. One of -; "Infra", "Natural", "Nuisance", "Resource", -; or "Bonus" -; causes = events that can create extra type. -; "Irrigation", "Mine", "Hut", "Pollution", "Fallout", -; "Appear", "Resource", "Base", or "Road" -; (the last three require a corresponding -; [resource_*] / [base_*] / [road_*] section) -; rmcauses = events that can remove extra type. -; "CleanPollution", "CleanFallout", "Pillage", or -; "Disappear" -; graphic = tag specifying preferred graphic -; graphic_alt = tag for alternate graphic if preferred graphic is -; not present. Can use eg "-" for no alternate -; graphic -; activity_gfx = tag specifying graphic for unit building extra -; This can be "None" to indicate that graphic sprite -; is not needed. -; act_gfx_alt = tag for alternative graphic for unit building extra -; act_gfx_alt2 = tag for second alternative graphic for unit building extra -; rmact_gfx = tag specifying graphic for unit removing extra -; This can be "None" to indicate that graphic sprite -; is not needed. -; rmact_gfx_alt = tag for alternative graphic for unit removing extra -; reqs = requirements to build the extra (see effects.ruleset -; and README.effects for help on requirements) -; rmreqs = requirements to remove the extra -; appearance_reqs = spontaneous appearance requirements -; disappearance_reqs = spontaneous disappearance requirements -; visibility_req = Tech a player needs to have to see the extra -; This affects visibility only, for all the rules -; extra is still there even if player can't see it. -; buildable = Can extra be built? Defaults to TRUE if extra has -; any causes indicating it can result from worker -; activity. -; generated = Can map generator place the extra? Applicable -; for Hut, Resource, and River extras. -; build_time = how long it takes a unit to build this extra. -; Value of 0 (default) means that terrain- and -; build activity specific time is used instead. -; build_time_factor = This setting take effect only if build_time is 0. -; Terrain and activity specific build time will be -; multiplied by this value (default 1) -; removal_time = how long it takes a unit to remove this extra. -; Value of 0 (default) means that terrain- and -; removal activity specific time is used instead. -; removal_time_factor = This setting take effect only if removal_time is 0. -; Terrain and activity specific removal time will be -; multiplied by this value (default 1) -; defense_bonus = Percent added to defense when tile has the extra -; (default none) -; unit_seen = How opponents see units inside this extra -; "Normal" - Units are seen normally (default) -; "Hidden" - Units are hidden from opponents -; appearance_chance = If extra has cause "Appear" and other requirements -; for its appearance are fulfilled, this tells how big -; chance it has to appear each turn. The chance is 1/10000 -; times this value. -; disappearance_chance = If extra has rmcause "Disappear" and other requirements -; for its disappearance are fulfilled, this tells how big -; chance it has to disappear each turn. The chance is 1/10000 -; times this value. -; native_to = List of unit classes that are considered to -; be inside the extra when they are on same tile -; conflicts = List of extras that cannot be on the same tile. -; Bases with non-zero border_sq automatically conflict -; with each other. -; hidden_by = List of extra types that will make this extra -; type not to show on UI if both present. -; bridged_over = List of extra types that, if present in tile, will prevent -; building this extra if can't be bridged over -; flags -; - "NativeTile" = Native units consider tile native regardless of -; terrain -; - "Refuel" = Native units can use tile as refuel point -; - "TerrChangeRemoves" = Extra gets removed when ever terrain changes even -; if target terrain could support it -; - "AlwaysOnCityCenter" = City center tiles always have this extra type -; regardless of its other requirements -; - "AutoOnCityCenter" = City center tiles will automatically have this -; extra type if the player can build it -; - "ConnectLand" = Road style gfx on Oceanic tiles are drawn to -; connect to adjacent Land tiles even if they have -; no extra. This affects appearance only -; - "GlobalWarming" = Instances of this extra on map count towards -; Global Warming -; - "NuclearWinter" = Instances of this extra on map count towards -; Nuclear Winter -; - "ShowFlag" = Draw owner's flag -; - "NaturalDefense" = Extra's defense bonus will be counted to "Natural" -; defense layer. The defense bonus of all the extras -; located at the tile, native to defending unit, -; is calculated as a 1 + sum of bonuses from the extras -; on the default "Fortification" defense layer multiplied -; by the 1 + sum of bonuses from the extras on the -; "Natural" layer. -; - "NoStackDeath" = Units inside do not die all at once when attacked -; helptext = optional help text string; should escape all raw -; newlines so that xgettext parsing works -; -; */ <-- avoid gettext warnings - -[extra_irrigation] -name = _("Irrigation") -category = "Infra" -causes = "Irrigation" -rmcauses = "Pillage" -graphic = "tx.irrigation" -graphic_alt = "-" -activity_gfx = "unit.irrigation" -act_gfx_alt = "unit.irrigate" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -build_time = 0 -removal_time = 0 -conflicts = "Mine", "Oil Well" -hidden_by = "Farmland" -helptext = _("\ -Irrigating a suitable tile causes it to produce extra food each turn. Most\ - tiles yield +1 extra food. A desert river that does not already benefit\ - from an oasis will yield +2, or +3 if it is a city on a desert river.\ -"), _("\ -Irrigating a tile with a mine or oil well will destroy it.\ -"), _("\ -City center tiles get their terrain's irrigation bonus automatically, \ -if there is no conflicting mine or oil well on the tile; however, \ -this does not make cities count as a water source for further \ -irrigation. Irrigation can be built on the city tile simply to allow \ -irrigating elsewhere, but will not give the tile any further bonus \ -except in the case of a desert river (see above.)\ -") - -[extra_mine] -name = _("Mine") -category = "Infra" -causes = "Mine" -rmcauses = "Pillage" -graphic = "tx.mine" -graphic_alt = "-" -activity_gfx = "unit.mine" -act_gfx_alt = "unit.plant" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "TerrainFlag", "Oil", "Local", FALSE, TRUE - } -build_time = 0 -removal_time = 0 -conflicts = "Irrigation", "Farmland" -helptext = _("\ -Mines can be built on some types of terrain, which increases the \ -number of production points produced by that tile. Hills get an extra \ -3 production points per tile; other terrains get 1 extra production \ -point.\ -"), _("\ -Building a mine on an irrigated tile will destroy the irrigation.\ -") - -[extra_oil_well] -name = _("Oil Well") -category = "Infra" -causes = "Mine" -rmcauses = "Pillage" -graphic = "tx.oil_mine" -graphic_alt = "tx.mine" -activity_gfx = "unit.oil_mine" -act_gfx_alt = "unit.mine" -act_gfx_alt2 = "unit.plant" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "quiet" - "TerrainFlag", "Oil", "Local", TRUE - } -build_time = 0 -removal_time = 0 -conflicts = "Irrigation", "Farmland" -helptext = _("\ -Oil wells behave like mines (giving an extra production point), but \ -require more technology. Oil wells can be built on Desert with knowledge \ -of Construction, and on Arctic terrain with knowledge of Refining.\ -"), _("\ -Building an oil well on an irrigated tile will destroy the irrigation.\ -") - -[extra_pollution] -name = _("Pollution") -category = "Nuisance" -causes = "Pollution" -rmcauses = "CleanPollution" -graphic = "tx.pollution" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "unit.pollution" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "TerrainFlag", "NoPollution", "Local", FALSE, TRUE - } -removal_time = 0 -flags = "GlobalWarming" -helptext = _("\ -Pollution appears on land tiles around cities with high production or \ -population. \ -It halves all output from its tile, and contributes to the risk of \ -global warming.\ -"), _("\ -The pollution can only be cleared by dispatching Workers, \ -Settlers, or Engineers with the \"clean pollution\" order.\ -"), _("\ -Pollution from production is likely to start becoming important as \ -your civilization becomes more industrialized, giving you buildings \ -such as Factory and Power Plant which boost production. Replacing a \ -Power Plant with cleaner forms of energy -- a Hydro Plant / Hoover \ -Dam, Nuclear Plant, or Solar Plant -- will reduce pollution from \ -production, as will a Recycling Center or knowledge of \ -Environmentalism.\ -"), _("\ -The city's population starts adding to pollution with the discovery of \ -Industrialization, and Automobile, Mass Production, and Plastics make \ -this worse. Building a Mass Transit in a city eliminates the \ -population's contribution to pollution.\ -"), _("\ -The contribution of these factors can be seen in the city dialog; once \ -it exceeds a threshold, the excess is the percent chance of pollution \ -appearing each turn.\ -"), _("\ -When an unused tile becomes polluted, there is the temptation to avoid \ -the effort of cleaning it; but the spread of pollution has far more \ -terrible results than the immediate economic impact -- every polluted \ -tile increases the chance of global warming. Each time global warming \ -advances, the entire world loses coastal land to the sea and to jungles \ -and swamps, and inland tiles are lost to desert. This tends to \ -devastate cities and leads to global impoverishment.\ -"), _("\ -The risk of global warming is cumulative; the longer polluted tiles \ -are left uncleaned, the higher the risk becomes, and the risk can \ -linger for some time even after all pollution has been cleaned. If a \ -long time passes with an elevated risk of warming, its effects will be \ -all the more severe when it does occur.\ -") - -[extra_hut] -name = _("Minor Tribe Village") -rule_name = "Hut" -category = "Bonus" -causes = "Hut" -;rmcauses = "" -graphic = "tx.village" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range" - "TerrainClass", "Land", "Local" - } -helptext = _("\ -Villages (also called \"huts\") are primitive communities spread \ -across the world at the beginning of the game. Any land unit can enter \ -a village, making the village disappear and deliver a random response. \ -If the village proves hostile, it could produce barbarians or the unit \ -entering may simply be destroyed. If they are friendly, the player \ -could receive gold, a new technology, a military unit (occasionally a \ -settler; and sometimes a unit that the player cannot yet create), or \ -even a new city.\ -"), _("\ -Later in the game, helicopters may also enter villages, but overflight \ -by other aircraft will cause the villagers to take fright and disband.\ -") - -[extra_farmland] -name = _("Farmland") -category = "Infra" -causes = "Irrigation" -rmcauses = "Pillage" -graphic = "tx.farmland" -graphic_alt = "-" -activity_gfx = "unit.farmland" -act_gfx_alt = "unit.irrigation" -act_gfx_alt2 = "unit.irrigate" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range" - "Tech", "Refrigeration", "Player" - "Extra", "Irrigation", "Local" - } -build_time = 0 -removal_time = 0 -conflicts = "Mine", "Oil Well" -helptext = _("\ -Once Refrigeration is known, irrigation systems can be upgraded to \ -farmland by irrigating them a second time; if the city working the tile \ -has a Supermarket, a farmland tile provides twice as much food.\ -"), _("\ -Like irrigation, farmland is incompatible with mines and oil wells.\ -") - -[extra_fallout] -name = _("Fallout") -category = "Nuisance" -causes = "Fallout" -rmcauses = "CleanFallout" -graphic = "tx.fallout" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "unit.fallout" -rmact_gfx_alt = "unit.pollution" -reqs = - { "type", "name", "range", "present", "quiet" - "TerrainFlag", "NoPollution", "Local", FALSE, TRUE - } -removal_time = 0 -flags = "NuclearWinter" -helptext = _("\ -Nuclear fallout can appear on land tiles when a Nuclear unit is \ -detonated. It halves all output from its tile.\ -"), _("\ -Every tile with nuclear fallout also increases the risk of global \ -nuclear winter. If nuclear winter occurs, land across the globe \ -changes into desert, tundra, and ice, and lakes and oceans freeze.\ -"), _("\ -Settlers, Workers, and Engineers can clean up nuclear fallout.\ -") - -; ***************************** BASES **************************************** - -[extra_fort] -name = _("Fort") -category = "Infra" -causes = "Base" -rmcauses = "Pillage" -graphic = "base.outpost" -graphic_alt = "base.fortress" -activity_gfx = "unit.outpost" -act_gfx_alt = "unit.fortress" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Masonry", "Player", TRUE, FALSE - "TerrainClass", "Land", "Local", TRUE, FALSE - "UnitFlag", "CanFortress", "Local", TRUE, FALSE - "CityTile", "Center", "Local", FALSE, TRUE - } -build_time = 3 -removal_time = 0 -native_to = "Land", "LandAirSea", "LandNoKill", "Helicopter", "Balloon", "AirProtect" -hidden_by = "Fortress", "Naval Base" -flags = "NativeTile", "NoStackDeath" ;, "Refuel" -;NOTE: effect_fortress_regen should give 25% of 20HP to helicopter, +1hp for being stationary -;thus a fortress should give +6hp -2hp for not being in refuel spot or +4hp/turn. Healing 67% -;as fast as an airbase. MEANWHILE, removing the refuel flag allows us to make Forts native -;to AirProtect so that they can't prevent attacks on forts. This is debatable issue of -;Fort with no Killstack but not Airprotected vs no fort, Killstack and Airprotect, but -;many times fighters over forts have come up as a dynamic. -helptext = _("\ -Forts are rapidly built fortifications which give Land units +33% defense\ - against Land and Sea units. Defending units are lost one at a time instead\ - of the entire stack dying. A fort is necessary to start building a fortress.\ -"), _(" -TIP: Forts make great outposts for keeping watch on your borders. Be careful--\ -an unmanned Fort can be claimed by a foreign unit. -") - -[extra_fortress] -name = _("Fortress") -category = "Infra" -causes = "Base" -rmcauses = "Pillage" -graphic = "base.fortress" -graphic_alt = "-" -activity_gfx = "unit.fortress" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "Extra", "Fort", "Local", TRUE, FALSE - "Tech", "Construction", "Player", TRUE, FALSE - "TerrainClass", "Land", "Local", TRUE, FALSE - "UnitFlag", "CanFortress", "Local", TRUE, FALSE - "CityTile", "Center", "Local", FALSE, TRUE - } -build_time = 5 -removal_time = 0 -defense_bonus = 67 -native_to = "Land", "LandAirSea", "LandNoKill", "Helicopter", "Balloon" -hidden_by = "Fortress", "Naval Base" -flags = "NativeTile", "Refuel", "NoStackDeath" -helptext = _("\ -Fortresses are improvements built on top of Forts which greatly improve defense.\ - A Land unit remaining in a fortress for a whole turn without moving recovers a\ - quarter of its hit points. With Invention, fortresses gain watchtowers from which\ - land units can see farther.\ -"), _("\ -Units in a Fortress die one at a time instead of the entire stack being lost.\ -Diplomatic units get a 25% defense bonus in diplomatic fights.\ -") - -[extra_airbase] -name = _("Airbase") -category = "Infra" -causes = "Base" -rmcauses = "Pillage" -graphic = "base.airbase" -graphic_alt = "-" -activity_gfx = "unit.airbase" -act_gfx_alt = "unit.fortress" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Radio", "Player", TRUE, FALSE - "TerrainClass", "Land", "Local", TRUE, FALSE - "UnitFlag", "Airbase", "Local", TRUE, FALSE - "CityTile", "Center", "Local", FALSE, TRUE - } -build_time = 3 -removal_time = 0 -native_to = "Air", "Balloon", "Helicopter", "Missile", "AirProtect", "AirPillage" -flags = "Refuel", "NoStackDeath" -helptext = _("\ -Airbases allow your air units to land and refuel outside cities. \ -Air units in an airbase may be attacked by land units.\ -"), _("\ -Units can paradrop from this tile.\ -") - -[extra_buoy] -name = _("Buoy") -category = "Infra" -causes = "Base" -rmcauses = "Pillage" -graphic = "base.buoy" -graphic_alt = "base.fortress" -activity_gfx = "unit.buoy" -act_gfx_alt = "unit.fortress" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Radio", "Player", TRUE, FALSE - "TerrainClass", "Oceanic", "Local", TRUE, FALSE - "UnitFlag", "Airbase", "Local", TRUE, FALSE - "CityTile", "Center", "Local", FALSE, TRUE - } -build_time = 3 -removal_time = 0 -flags = "ShowFlag" -helptext = _("\ -Buoys may be built in the ocean (by units on a sea-going vessel) to \ -allow their owner to see the surrounding tiles.\ -") - -[extra_navalbase] -name = _("Naval Base") -category = "Infra" -causes = "Base" -rmcauses = "Pillage" -graphic = "base.navalbase" -graphic_alt = "base.fortress" -activity_gfx = "unit.navalbase" -act_gfx_alt = "unit.fortress" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "Extra", "Fortress", "Local", TRUE, FALSE - "TerrainFlag", "Low Land", "Local", TRUE, FALSE - "TerrainClass", "Oceanic", "CAdjacent", TRUE, FALSE - "Tech", "Engineering", "Player", TRUE, FALSE - "UnitFlag", "CanFortress", "Local", TRUE, FALSE - "CityTile", "Center", "Local", FALSE, TRUE - } -build_time = 3 -removal_time = 0 -conflicts = "Airbase" -defense_bonus = 33 -native_to = "Trireme", "RiverShip", "Sea", "Submarine", "Balloon" -flags = "NativeTile", "NoStackDeath", "Refuel" -helptext = _("\ -Naval bases are coastal Fortresses with ocean access. They allow ships to enter and\ - receive a 1.33x bonus from superior fortifications and defensive position. Naval\ - Bases are built into Fortresses--all other units get the benefits of a Fortress.\ -"), _(" -NOTE: Naval bases are the only location where ships can be sure to avoid stack death without\ - suffering a defense disadvantage. Besides the Fortress its built on top of, only road- and\ - canal- type tile improvements can co-exist on the same tile.\ -") - -[extra_ruins] -name = _("Ruins") -category = "Bonus" -;causes = "" -rmcauses = "Pillage" -graphic = "extra.ruins" -graphic_alt = "base.ruins" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "TerrainClass", "Land", "Local", TRUE, FALSE - "CityTile", "Center", "Local", FALSE, TRUE - } -buildable = FALSE -removal_time = 0 -flags = "TerrChangeRemoves" -helptext = _("\ -Ruins mark the former site of a city that was destroyed or abandoned. \ -They have no effect on gameplay.\ -") - -[extra_road] -name = _("Road") -category = "Infra" -causes = "Road" -rmcauses = "Pillage" -graphic = "road.road" -graphic_alt = "-" -activity_gfx = "unit.road" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range" - "UnitFlag", "CanRoad", "Local" - "TerrainClass", "Land", "Local" - } -build_time = 0 -removal_time = 0 -native_to = "Land", "LandNoKill", "LandAirSea" -hidden_by = "Railroad", "Maglev", "Naval Base" -flags = "AutoOnCityCenter" -bridged_over = "River" -helptext = _("\ -Roads allow your land units to move more quickly, and on some terrain,\ - also provide a trade bonus.\ -"), _("\ -Building roads on river tiles requires knowledge of Bridge Building.\ - City center tiles automatically get roads (unless they are on a river\ - tile and you do not yet know Bridge Building).\ -") - -[extra_railroad] -name = _("Railroad") -category = "Infra" -causes = "Road" -rmcauses = "Pillage" -graphic = "road.rail" -graphic_alt = "-" -activity_gfx = "unit.rail" -act_gfx_alt = "unit.road" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range" - "Tech", "Railroad", "Player" - "Extra", "Road", "Local" - "UnitFlag", "CanRoad", "Local" - "TerrainClass", "Land", "Local" - } -build_time = 3 -removal_time = 0 -native_to = "Land", "LandNoKill", "LandAirSea" -hidden_by = "Maglev", "Naval Base" -flags = "AutoOnCityCenter" -bridged_over = "River" -helptext = _("\ -Once you learn Railroad technology, you may upgrade your roads to\ - railroads. Units travel three times faster along railroads than\ - along roads.\ -"), _("\ -A railroad also increases any shield resources produced by a tile.\ - A tile whose road is upgraded to a railroad retains any trade bonus\ - from the road as well.\ -"), _("\ -City center tiles with roads are automatically upgraded to railroads\ - when you learn the Railroad technology.\ -") - -[extra_maglev] -name = _("Maglev") -category = "Infra" -causes = "Road" -rmcauses = "Pillage" -graphic = "road.maglev" -graphic_alt = "road.rail" -activity_gfx = "unit.maglev" -act_gfx_alt = "unit.road" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Superconductors", "Player", TRUE, FALSE -; "Extra", "Railroad", "Local", TRUE, FALSE - "UnitFlag", "CanRoad", "Local", TRUE, FALSE -; "UnitClass", "Sea", "Local", FALSE, TRUE -; "TerrainClass", "Land", "Local", TRUE, FALSE - } -build_time = 3 -removal_time = 0 -native_to = "Land", "LandNoKill", "LandAirSea" -hidden_by = "Naval Base" -flags = "NativeTile", "AutoOnCityCenter" -helptext = _("\ -With Superconductors, you may build MAGnetic LEVitation tracks\ - on your railroad routes. Land units expend no movement points\ - when riding a MagLev; you may ride indefinitely.\ -"), _("\ -City center tiles with railroads are automatically upgraded to MagLev\ - when you learn about Superconductors.\ -") - -[extra_river] -name = _("River") -category = "Infra" ;TEST for well-digger -causes = "Road" -;rmcauses = "" -graphic = "road.river" -graphic_alt = "-" -activity_gfx = "unit.canal" -act_gfx_alt = "unit.oil_mine" -act_gfx_alt2 = "unit.road" -rmact_gfx = "None" -rmact_gfx_alt = "-" -buildable = TRUE -generated = TRUE -defense_bonus = 33 -reqs = - { "type", "name", "range", "present" - "TerrainClass", "Land", "Local", TRUE - "Tech", "Pottery", "Player", FALSE - "Tech", "Alphabet","Player", FALSE - "Tech", "Writing", "World", FALSE - "UnitFlag", "Well-Digger", "Local", TRUE - "Age", "10", "Local", FALSE - } -build_time = 2 -removal_time = 0 -flags = "NativeTile" -native_to = "Land", "LandNoKill", "LandAirSea", "Trireme", "RiverShip" -helptext = _("\ -Any land terrain type may have a River on it. A River adds 1\ - trade to the resources produced by that tile. It also increases a tile's\ - defense factor by 50%. Finally, land units may move along a River (but\ - not diagonally) for fast travel.\ -"), _("\ -Roads, railroads and MagLev can only be built on River tiles if your\ - civilization has learned Bridge Building technology.\ -") - -[extra_canal] -name = _("Canal") -category = "Infra" -causes = "Road" -rmcauses = "Pillage" -graphic = "road.canal" -graphic_alt = "road.river" -activity_gfx = "unit.canal" -act_gfx_alt = "unit.convert" -act_gfx_alt2 = "unit.airstrip" -rmact_gfx = "None" -rmact_gfx_alt = "-" -generated = FALSE -reqs = - { "type", "name", "range", "present" - "TerrainFlag", "Low Land", "Local", TRUE - "TerrainClass", "Oceanic", "Adjacent", TRUE - "Tech", "Engineering", "Player", TRUE - "UnitFlag", "Settlers", "Local", TRUE - } -build_time = 10 -removal_time = 0 -native_to = "Trireme", "Sea", "RiverShip", "Land", "LandAirSea", "LandNoKill", "Helicopter", "Submarine" -flags = "NativeTile" -helptext = _("\ -Canals allow ships to travel through land tiles. Canals can be built on \ -low land tiles only, and not far inland.\ -") - -[extra_gold] -name = _("Gold") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.gold" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_iron] -name = _("Iron") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.iron" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_game] -name = _("?animals:Game") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.tundra_game" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_furs] -name = _("Furs") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.furs" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_coal] -name = _("Coal") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.coal" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_fish] -name = _("Fish") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.fish" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_fruit] -name = _("Fruit") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.fruit" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_gems] -name = _("Gems") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.gems" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_rubber] -name = _("Rubber") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.rubber" -graphic_alt = "ts.peat" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_buffalo] -name = _("Buffalo") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.buffalo" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_wheat] -name = _("Wheat") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.wheat" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_oasis] -name = _("Oasis") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.oasis" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_peat] -name = _("Peat") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.peat" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_pheasant] -name = _("Pheasant") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.pheasant" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_bonus] -name = _("Resources") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.grassland_resources" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_ivory] -name = _("Ivory") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.arctic_ivory" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_silk] -name = _("Silk") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.silk" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_spice] -name = _("Spice") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.spice" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_whales] -name = _("Whales") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.whales" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_wine] -name = _("Wine") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.wine" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_oil] -name = _("Oil") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.oil" -graphic_alt = "-" -act_gfx_alt2 = "-" -activity_gfx = "None" -act_gfx_alt = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -; /* <-- avoid gettext warnings -; -; Base types: -; -; extra = name of the extra this base section is part of -; (must have "Base" in its causes) -; gui_type = How gui should handle this base. -; Value can be "Fortress", "Airbase", or "Other" -; border_sq = Base will claim land ownership up to this radius, -; -1 to disable. If enabled, base cannot exist in city tile. -; vision_main_sq = Base will have main layer vision to this radius -; vision_invis_sq = Base will have invisible layer vision to this radius -; vision_subs_sq = Base will have subsurface layer vision to this radius -; flags -; - "NoAggressive" = Units inside are not considered aggressive if there`s -; friendly city within 3 tiles -; -; */ <-- avoid gettext warnings - -[base_fort] -extra = "Fort" -gui_type = "Fortress" -border_sq = -1 -vision_main_sq = 4 - -[base_fortress] -extra = "Fortress" -gui_type = "Fortress" -border_sq = 4 -vision_main_sq = 4 -flags = "NoAggressive" - -[base_airbase] -extra = "Airbase" -gui_type = "Airbase" - -[base_buoy] -extra = "Buoy" -gui_type = "Fortress" -vision_main_sq = 5 - -[base_navalbase] -extra = "Naval Base" -gui_type = "Airbase" -border_sq = 3 ;this may be causing the nationality flip behaviour for allies co-occupying -vision_main_sq = 6 -vision_subs_sq = 4 -flags = "NoAggressive" - - -; /* <-- avoid gettext warnings -; -; Road types: -; -; extra = name of the extra this road section is part of -; (must have "Road" in its causes) -; first_reqs = additional requirements to build the first part of -; the road, when none of the adjacent tiles have any -; integrating roads (see effects.ruleset and -; README.effects for help on requirements) -; move_cost = how much movement it takes to travel -; via this road (in fractional move points, as -; defined by move_fragments) -; -1 means that road provides no speed bonus. -; move_mode = how movement costs are applied -; - "Cardinal" = Road cost applies only on cardinal moves -; - "Relaxed" = Road cost is normal for cardinal, double for diagonal moves -; - "FastAlways" = Road cost applies always between two tiles with the roads -; (default) -; food_incr_const = food production added to tile regardless of terrain -; shield_incr_const = shield production added to tile regardless of -; terrain -; trade_incr_const = trade production added to tile regardless of -; terrain -; food_incr = food production added to tile; multiplied by -; terrain-specific road_food_incr_pct -; shield_incr = shield production added to tile; multiplied by -; terrain-specific road_shield_incr_pct -; trade_incr = trade production added to tile; multiplied by -; terrain-specific road_trade_incr_pct -; food_bonus = percent added to food production -; shield_bonus = percent added to shield production -; trade_bonus = percent added to trade production -; In summary, output bonuses from roads are given by the formula: -; (base_prod + roads.incr_const + roads.incr*terrain.incr_pct) * roads.bonus -; compat_special = what kind of pre-2.5 special this road corresponds -; to, if any: "Road", "Railroad", "River", or "None". -; Used for UI and loading old savegames -; integrates = list of road types that are suitable next steps -; for travel from this road type -; flags -; - "River" = Automatically generated by map generator, always -; flowing from land tiles to ocean -; - "UnrestrictedInfra" = Use of the enemy owned road is not restricted -; even if server setting 'restrictinfra' is set -; - "JumpFrom" = Move to a tile nativity providing "JumpTo" -; road is considered native -; - "JumpTo" = Move from a tile nativity providing "JumpFrom" -; road is considered native -; -; */ <-- avoid gettext warnings - -[road_road] -extra = "Road" -move_cost = 3 -food_incr = 0 -shield_incr = 0 -trade_incr = 1 -food_bonus = 0 -shield_bonus = 0 -trade_bonus = 0 -compat_special = "Road" -flags = "UnrestrictedInfra" - -[road_railroad] -extra = "Railroad" -move_cost = 1 -food_incr = 0 -shield_incr = 0 -trade_incr = 0 -food_bonus = 0 -shield_bonus = 50 -trade_bonus = 0 -compat_special = "Railroad" - -[road_maglev] -extra = "Maglev" -move_cost = 0 -food_incr = 0 -shield_incr = 0 -trade_incr = 0 -food_bonus = 0 -shield_bonus = 0 -trade_bonus = 0 - -[road_river] -extra = "River" -move_cost = 3 -move_mode = "Cardinal" -trade_incr_const = 1 -compat_special = "River" -flags = "River", "UnrestrictedInfra" - -[road_canal] -extra = "Canal" -move_cost = 9 -move_mode = "Cardinal" -food_incr_const = 0 -shield_incr_const = 0 -trade_incr_const = 0 -food_incr = 0 -shield_incr = 0 -trade_incr = 0 -food_bonus = 0 -shield_bonus = 0 -trade_bonus = 0 -compat_special = "None" diff --git a/freeciv/freeciv/data/.historic/mp2sandbox/units.ruleset b/freeciv/freeciv/data/.historic/mp2sandbox/units.ruleset deleted file mode 100644 index b917a2992..000000000 --- a/freeciv/freeciv/data/.historic/mp2sandbox/units.ruleset +++ /dev/null @@ -1,3661 +0,0 @@ -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes, -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. -; -; You should sort role units from worst to better, as often the best -; available role unit of a given sort will be picked by choosing -; the first available (not obsolete) such unit, or by picking the last -; such unit directly. When determining starting units, the first -; unit with the relevant role that the player can build will be chosen. -; If no such unit can be found (eg Explorers that require Seafaring), -; then the first unit with this role will be chosen. - -[datafile] -description="Unit definitions for the Multiplayer-Evo ruleset." -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -[control] -; Names for custom unit type flags. There can be up to 45 of these. -; name = rule name; In some circumstances user may see this -; as part of some sentences, so try to make it descriptive -; and sensible. -; helptxt = displayed in the help for unit types with this flag (optional) -; ************** ANTYHING WHICH CHANGES THE SEQUENCE OR NUMBER OF THE USER CUSTOM FLAGS BELOW SHOULD BE -; ************** MADE COMPATIBLE BETWEEN MP+ AND MP2 RULESETS AND POSSIBLY CLASSIC AND CIV2CIV3 SO THAT -; ************** THERE IS UNIFORMITY IN FCW CLIENT which checks these flags based on index #. Not keeping -; ************** uniformity results in loss of features as ability to check these flags would be lost. -flags = - { "name", "helptxt" - _("Airbase") - _("Transform"), _("Can do advanced Terrain transformations.") - _("CanRoad"), _("Able to build Roads.") - _("CanFortress"), _("Can build Forts and Fortresses") - _("Bombarder"), _("Can safely conduct Ranged Attacks.") - _("AirAttacker"), _("Anti-Air units have a defense bonus against this unit.") - _("Horse"), _("Attack value halved when attacking Pikemen.\n\ -* Knights defend at 3 when attacked by this unit.") - _("FootSoldier"), _("Knights defend at 2 when attacked by this unit.") - _("Helicopter"), _("Defends very badly against Fighters.") - _("Submarine"), _("Attack value reduced against some ships.") - _("Unbribable"), _("Can't be bribed.") - _("TradeRoute"), _("Can establish a foreign trade route (must travel to target city).") - _("HelpWonder"), _("Can help build a Wonder in any non-hostile city.") - _("Capturer"), _("Can capture some enemy units.") - _("Capturable"), _("Can be captured by some enemy units.") - _("Cities") - _("AddToCity"), _("Can add itself to the population of a city.") - _("Nuclear"), _("Can perform a Nuclear Detonation obliterating all adjacent tiles.") - _("Missile"), _("AEGIS and Armor II have a defense bonus against this unit.") - _("Well-Digger"), _("Can dig a well and irrigate tiles with no water.") - _("Infra"), _("Can build infrastructure.") - _("Proletarian"), _("Controllable only by Communist governments.") - _("Paratroopers"), _("Can be paradropped from a friendly city or suitable base.") - _("Marines"), _("Can launch attack from non-native tiles.") - _("Expellable"), _("Can be peacefully expelled from foreign tiles.") - _("AirProtector"), _("Is Unreachable AND can protect its tile from units unable to attack this unit.") - _("CantReachAir"), _("Unable to attack air units.") - _("FortBuster"), _("Defending Forts get no bonus. +33% attack bonus vs. the 2x defense of a Fortress.") - _("FortressBuster"), _("Defending Fortresses get no bonus.") - _("AntiAir"), _("Anti-Air bonus of this unit is less effective against Stealth, which has a 25% bonus against this unit.") -;;; _("NeverProtects"), _("Does not protect other units on its tile.") ; UNCOMMENT THIS IF NOT USING SCL'S PATCH FOR THIS FLAG -;;; _("NeverBlocked"), _("Bypasses unreachable units when attacking a tile.") ; UNCOMMENT THIS IF NOT USING LEXXIE'S PATCH FOR THIS FLAG - } - -; Names for custom unit class flags. There can be up to 8 of these. -; name = rule name; In some circumstances user may see this -; as part of some sentences, so try to make it descriptive -; and sensible. -; helptxt = displayed in the help for unit types belonging to a class -; with this flag (optional) -class_flags = - { "name", "helptxt" - _("Airliftable"), _("Can be airlifted if it has remaining moves.") - _("BorderPolice"), _("Military units from this class can peacefully expel certain foreign units.") - _("AttFromNonNative"), _("Can launch attack from non-native tiles.") - _("CargoRestrained"), _("Can't attack as Cargo. Must first unload.") - } - -[veteran_system] -; What are the names of the levels? -veteran_names = _("green"), _("veteran"), _("hardened"), _("elite"), _("crack"), _("master"), _("champion") - -; The percentage chance of increasing level through combat -veteran_raise_chance = 50, 33, 20, 15, 15, 15, 0 - -; The percentage chance of a settler/engineer increasing level through -; performing useful work (per turn) -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 - -; Power factors are as a percentage. -; +50% is represented by 150 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 - -; The additional number of movement points granted for different veteran -; levels. These are fractional move points as defined by move_fragments in -; terrain.ruleset. -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 - -; /* <-- avoid gettext warnings -; -; Unit classes -; The number can be variable, up to 32 -; When adding new classes, remember to check effects.ruleset also. -; Eg. if you divide class 'Land' to two separate classes, you may -; want add effect giving City Walls defence bonus against new class -; too. -; -; The actual tag used (the * in [unitclass_*]) does not matter, except -; it must be unique within this file, and it may be used in debug -; output when reading this file. -; -; ** Fields ** -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; -; if not present, "name" is used for this purpose too. -; Since the name used in savegames must not change, if -; you want to rename an item after a ruleset has been -; released, you should set "rule_name" to the original -; value of "name". -; min_speed = Minimum speed after damage and effects (whole movement points) -; hp_loss_pct = Hitpoints lost each turn if unit not in city or native base -; non_native_def_pct = Defense power percentage applying when defending on -; non-native terrain (such as ship in harbour) -; hut_behavior = What happens to huts when unit enters tile: -; "Normal", "Nothing", or "Frighten" -; flags = List of unit class flags (from the following list; you -; cannot add custom unit class flags) -; helptext = optional help text string; should escape all raw newlines -; so that xgettext parsing works -; -; ** Unit class Flags ** -; -; "TerrainSpeed" = Unit Class uses terrain specific speed -; "TerrainDefense" = Unit Class gains defense bonus from terrain -; "DamageSlows" = Damaged units are slowed down -; "CanOccupyCity" = Military units of this class can occupy enemy cities -; "Missile" = Unit Class is destroyed when it attacks -; "BuildAnywhere" = Unit Class can be built even in the middle of non-native terrain -; "Unreachable" = Unit Class can be attacked only by units explicitly listing this -; class in its 'targets', unless on a city or native base. -; For class members which are transports, cargo cannot load/ -; unload except in a city or native base, unless that unit -; explicitly lists this class in its 'embarks'/'disembarks'. -; "CollectRansom" = Unit Class can collect ransom when killing lone barbarian leader -; "ZOC" = Unit Class is subject to ZOC rules. Unit type flag "IgZOC" can -; override this -; "CanFortify" = Unit can fortify at land tiles. Unit type flag -; "Cant_Fortify" can override this -; "CanPillage" = Unit Class can pillage tile infrastructure -; "DoesntOccupyTile" = Even if this class of enemy unit is on tile, cities can -; still work that tile -; "AttackNonNative" = Unit Class can attack units on non-native tiles. Unit type -; flag "Only_Native_Attack" can override this -; "AttFromNonNative" = Unit Class can launch attack from non-native tile (against -; native one) -; This applies for both attacking from transport or -; cities. If only some unit types of the class should -; get this property, use type flag "Marines" -; "KillCitizen" = Upon successful attack against a city, unit kills one -; citizen. The effect "Unit_No_Lose_Pop" and the server -; setting 'killcitizen' can disable this. - -; "Airliftable" = This Unit Class may be airlifted -; */ <-- avoid gettext warnings - - -; ********************************************************************************** -; ********************************************************************************** -; WARNING: ANY CHANGES TO WHAT TYPES OR CLASSES CAN LOAD ONTO WHICH TRANSPORTS MAY -; REQUIRE CHANGES TO FCW function unit_could_possibly_load() in unit.js -; ********************************************************************************** -; ********************************************************************************** -[unitclass_missile] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Missile") -min_speed = 1 -hp_loss_pct = 0 -hut_behavior = "Frighten" -flags = "Missile", "Unreachable", "DoesntOccupyTile", "Airliftable" - -; missile flag not class, indicates suicide explosion and possibly other things. -[unitclass_bomb] -name = _("?unitclass:Bomb") -min_speed = 1 -hp_loss_pct = 0 -hut_behavior = "Frighten" -flags = "Unreachable", "DoesntOccupyTile", "Airliftable" - -[unitclass_land] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Land") -min_speed = 1 -hp_loss_pct = 0 -flags = "TerrainSpeed", "DamageSlows", "CanOccupyCity", "BuildAnywhere", - "CollectRansom", "ZOC", "CanFortify", "CanPillage", - "TerrainDefense", "KillCitizen", "Airliftable", "BorderPolice", - "CargoRestrained" -helptext = _("\ - * Can be airlifted from a suitable city.\ -") - -[unitclass_landnokill] -name = _("?unitclass:LandNoKill") -min_speed = 1 -hp_loss_pct = 0 -flags = "TerrainSpeed", "DamageSlows", "CanOccupyCity", "BuildAnywhere", - "CollectRansom", "ZOC", "CanFortify", "CanPillage", - "TerrainDefense", "Airliftable", "BorderPolice", - "CargoRestrained" -helptext = _("\ - * Does not reduce population when attacking city.\ -") - -;Land units that are multipurpose for land/air/sea attacks (i.e., anti-aircraft, marines) -;include "Unreachable" in the targets for individual units -[unitclass_landairsea] -name = _("?unitclass:LandAirSea") -min_speed = 1 -hp_loss_pct = 0 -flags = "TerrainSpeed", "DamageSlows", "CanOccupyCity", "BuildAnywhere", - "CollectRansom", "ZOC", "CanFortify", "CanPillage", - "TerrainDefense", "KillCitizen", "Airliftable", - "AttackNonNative", "AttFromNonNative", "BorderPolice" -helptext = _("\ - * Can attack from Ships and Helicopters.\ -") - -[unitclass_sea] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Sea") -min_speed = 2 -hp_loss_pct = 0 -flags = "DamageSlows", "AttackNonNative", "AttFromNonNative", "CanPillage" - -; Separating the Submarine class finally allows it to be unreachable by Air. The old Submarine was -; far too offensively overpowered while simultaneously almost useless from ultra-vulnerability to Air units. -; Because it is now Unreachable, any unit able to attack it needs this class in its targets. -[unitclass_submarine] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Submarine") -min_speed = 2 -hp_loss_pct = 0 -flags = "DamageSlows", "AttackNonNative", "AttFromNonNative", "CanPillage", "Unreachable" - -[unitclass_trireme] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Trireme") -min_speed = 2 -hp_loss_pct = 0 -flags = "DamageSlows", "AttFromNonNative" - -[unitclass_rivership] -; /* Extra class providing ability to travel rivers */ -name = _("?unitclass:RiverShip") -min_speed = 2 -hp_loss_pct = 0 -flags = "DamageSlows", "AttackNonNative", "AttFromNonNative" - -[unitclass_heli] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Helicopter") -min_speed = 1 -hp_loss_pct = 10 -flags = "Unreachable", "CanOccupyCity", "CollectRansom", "Airliftable" - -; This class is for air units that are unreachable but do not protect a stack. -[unitclass_air] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Air") -min_speed = 1 -hp_loss_pct = 0 -hut_behavior = "Frighten" -flags = "Unreachable", "DoesntOccupyTile", "Airliftable" - -; This class is for air units that can pillage terrain (i.e. Jet Bomber) -[unitclass_airpillage] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:AirPillage") -min_speed = 1 -hp_loss_pct = 0 -hut_behavior = "Frighten" -flags = "Unreachable", "DoesntOccupyTile", "Airliftable", "CanPillage" - -; This class is for air units that can also protect a stack. -; (Fighters) -- technically a separate AirProtect class is not needed, but -; Fighters also have Border Police abilities, and a separate class -; facilitates future adjustments and balancing in an isolated class. -[unitclass_air_protect] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:AirProtect") -min_speed = 1 -hp_loss_pct = 0 -hut_behavior = "Frighten" -flags = "Unreachable", "DoesntOccupyTile", "Airliftable", "BorderPolice" - -[unitclass_balloon] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Balloon") -min_speed = 1 -hp_loss_pct = 0 -hut_behavior = "Frighten" -flags = "Unreachable", "DoesntOccupyTile", "Airliftable" - - -; /* <-- avoid gettext warnings -; -; Below: The individual unit types, one per section. -; -; The number can be variable, up to 200. -; However for the "official" rulesets, units should not be removed -; because that would break backward compatability with savegames. -; -; The order here matters: later units are considered "better" for -; a given flag or role. -; -; The actual tag used (the * in [unit_*]) does not matter, except -; it must be unique within this file, and it may be used in debug -; output when reading this file. -; -; ** Fields ** -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; if -; not present, "name" is used for this purpose too. Since -; the name used in savegames must not change, if you want -; to rename an item after a ruleset has been released, you -; should set "rule_name" to the original value of "name". -; graphic = tag specifying preferred graphic -; graphic_alt = tag for alternate graphic if preferred graphic is not -; present; especially if preferred graphic is non-standard, -; this should be a standard tag. Otherwise can use eg "-" -; for no alternate graphic. -; tech_req = required advance, names from techs.ruleset, or special: -; "None" => available from start -; impr_req = required city improvement, names from buildings.ruleset -; gov_req = required government, names from governments.ruleset -; obsolete_by = can be upgraded to and made obsolete by another unit by name -; build_cost = production shields required to build -; pop_cost = population removed from city when built; for 'Join City' -; units this is also the population added to the destination -; attack = base attack strength (0 = cannot attack) -; defense = base defense strength (0 = cannot defend) -; hitpoints = how much damage unit can withstand -; firepower = number of hitpoints removed per round of combat; at least 1 -; move_rate = base move rate (whole movement points) -; vision_radius_sq = base vision of unit: unit can see tile up to the square -; root of this value away -; convert_to = can be converted to another type of unit by name -; convert_time = number of movement points it takes to convert to -; another unit type -; class = One of the classes listed above -; transport_cap = Number of units (ground, or air/missiles, depending on flags) -; fuel = Number of turns unit can spend outside refuel points. -; If more time passes without unit refueling over turn change, -; they are lost. If this is zero, unit has no need to refuel -; Units with "Coast" flag set consider any tile next to coast -; refuel point -; uk_* = upkeep costs, these are used as base values in the game -; cargo = Unit classes this unit can transport -; city_slots = How many of homecity's unit maintenance slots unit takes -; city_size = Initial size of the cities built by 'Found City' type units -; (but 'Join City' uses pop_cost) -; targets = list of unit classes this unit can attack against even -; if they have Unreachable unit class flag -; embarks = list of unit classes this unit may load into while not in -; native base or city even if transporter has Unreachable unit -; class flag -; disembarks = list of unit classes this unit may unload from while not in -; native base or city even if transporter has Unreachable unit -; class flag -; vision_layer = At which layer this unit is visible; "Main", "Stealth", -; or "Subsurface" -; bonuses = definitions of combat bonuses against specific other units -; bonuses.flag = flag of the unit that bonus applies against -; bonuses.type = type of the bonus. See below -; bonuses.value = value of the bonus. Sum of these is used if multiple apply. -; bonuses.quiet = don't auto generate help text for this bonus. Use this if -; the bonus is documented in the unit type's help text. -; This is useful when the combination of a unit's bonuses -; becomes complex enough to make the auto generated help -; ugly or inaccurate. -; flags = special flag strings; list of built-in flags described below -; and/or user flags defined above -; -; veteran_names = Special veteran level for this unit. See the definitions in -; game.ruleset. All of the veteran_* entries have to have the -; same length! -; veteran_raise_chance = -; veteran_work_raise_chance = -; veteran_power_fact = -; veteran_move_bonus = -; -; roles = special role strings -; sound_move = optional sound effect when the unit moves -; sound_move_alt = optional alternative sound effect if above not -; supported in client -; sound_fight = optional sound effect when the unit fights -; sound_fight_alt = optional alternative sound effect if above not -; supported in client -; helptext = optional help text string; should escape all raw newlines -; so that xgettext parsing works -; -; -; ** Bonuses ** -; -; "DefenseMultiplier" = Multiply defense value (1 + 'value') times. -; Value of 1 means multiplication by 2, value 2 by 3... -; Bonus is defined in defenders entry. -; "DefenseMultiplierPct" = Multiply defense by 1 + (value / 100). -; Value of 100 means multiplication by 2, -; value of 50 means multiplication by 1.5, etc. -; Effectively increases defense by value percent. -; Bonus is defined in defenders entry. -; "DefenseDivider" = Divide defense value with (1 + 'value'). -; Bonus is defined in attackers entry. -; "DefenseDividerPct" = Divide defense value by 1 + (value / 100). -; Value of 100 means division by 2, (2x for attacker) -; value of 50 means division by 1.5, (1.5x for attacker) -; i.e.: Effectively increases *attack* by value percent. -; "FirePower1" = Defender firepower is reduced to value 1 when -; ever this has non-zero value. -; Bonus is defined in attackers entry. -; -; ** Flags ** -; -; "IgZOC" = ignore Zones of Control (ZOC) even if unit class has -; "ZOC" flag -; "HasNoZOC" = unit has no Zone of Control (ZOC), thus any unit can move -; around it freely -; "NonMil" = a non-military unit: no attacks; no martial law; can enter -; peaceful borders; DoesntOccupyTile -; "IgTer" = use constant move cost defined in igter_cost (terrain.ruleset) -; rather than terrain/road etc cost, unless terrain cost is -; less -; "OneAttack" = can only make a single attack, regardless of movement points -; "FieldUnit" = cause unhappiness even when not being aggressive -; "BeachLander" = won't lose all its movement when moving from non-native -; terrain to native terrain even if slow_invasions is on. -; "Settlers" = can irrigate and build roads -; "Diplomat" = can defend against diplomat actions (see diplchance -; server option) -; "Spy" = strong in diplomatic battles. _Must_ be "Diplomat" also -; "CoastStrict" = (sea only) cannot leave coast -; "Coast" = (sea only) can refuel on coast. Set fuel to force unit -; to regularly end turn on coast -; "Only_Native_Attack" = cannot attack targets on non-native tiles even if -; unit class can -; "Cant_Fortify" = cannot fortify even if unit class has "CanFortify" flag -; "Fanatic" = can only be built by governments that allow them -; (see civ2/governments.ruleset, Fundamentalism government) -; "Unique" = a player can only have one of these units in the game at -; the same time; barbarians cannot use this at present -; "GameLoss" = losing one of these units means you lose the game, but it -; is produced without homecity and upkeep -; "EvacuateFirst" = the game will try to rescue units with this flag before -; it tries to rescue units without it when their transport -; is destroyed. Think of the Birkenhead drill ("women and -; children first"). Replace "women and children" with -; "units with the EvacuateFirst unit type flag". -; "SuperSpy" = this unit always wins diplomatic contests, that is, unless -; it encounters another SuperSpy, in which case defender wins; -; can also be used on non-diplomat units, in which case it can -; protect cities from diplomats; also 100% spy survival chance -; "NoHome" = this unit has no homecity and will be free of all upkeep, and -; therefore will not revolt along with its city of origin should -; it be incited -; "NoVeteran" = this unit cannot gain veteran levels through experience -; (as if both raise_chance and work_raise_chance were zero); -; it can still gain veterancy through Veteran_Build, etc -; "CityBuster" = this unit has double firepower against cities -; "NoBuild" = this unit cannot be built -; "BadWallAttacker" = the firepower of this unit is set to 1 if -; attacking a city -; defended by a city wall (or other city building defense) -; "BadCityDefender" = if attacked while in a city, firepower is set to 1 -; and firepower of attacker is doubled (the Pearl Harbour -; rule) -; "BarbarianOnly" = only barbarians can build this unit -; "Shield2Gold" = Switch from shield upkeep to gold upkeep possible -; "NewCityGamesOnly" = unit can't be built on scenarios where founding new cities -; is not allowed. Give this flag to units that would make no sense -; to have in a game with such a scenario -; "CanEscape" = this unit has, given that certain conditions are -; fulfilled, a 50% chance to escape rather than being -; killed when killstack is enabled and the defender of its -; tile is defeated. The conditions are that it has more move -; points than required to move to an adjacent tile plus the -; attackers move points and that the attacker doesn't have -; the "CanKillEscaping" unit type flag. -; "CanKillEscaping" = an attack from this unit ignores the "CanEscape" unit -; type flag. -; "Provoking" = a unit considering to auto attack this unit will choose to -; do so even if has better odds when defending against it -; then when attacking it. Applies when the autoattack server -; setting is enabled. -; "NeverProtects" = doesn't protect reachable units on its tile from enemy -; attackers, even if the unreachableprotects server setting -; is enabled and the unit class is unreachable -; "NeverBlocked" = isn't blocked by unreachable units on targeted tile, -; even if the unreachableprotects server setting -; is enabled and the unit class is unreachable -; -; Following actions require extra fields: -; "Attack" -; attack = base attack strength -; "Bombard" -; attack = base attack strength -; bombard_rate = the number of shots fired at enemy units when attacking -; "Join City" -; pop_cost = the number of population added to the target city -; "Paradrop Unit" -; paratroopers_range = the maximal range the unit can be paradropped to. -; Max range is 65534. -; paratroopers_mr_req = the move rate which is required at least for -; paradropping (whole movement points) -; paratroopers_mr_sub = the move rate which is subtracted after paradropping -; (whole movement points) -; "Upgrade Unit" -; obsolete_by = the unit type upgraded to. -; "Convert Unit" -; convert_to = the unit type converted to. -; -; ** Roles ** -; -; "FirstBuild" = first to be built when city founded -; "Explorer" = unit to use for exploring -; "Hut" = can be found in a hut -; "HutTech" = can be found in a hut, but its techs required -; "Partisan" = can be created as a partisan (only one unit can have this -; flag), see end of this file for its tech requirements option -; "DefendOk" = AI hint: ok for defending with -; "DefendGood" = AI hint: good for defending with -; "Ferryboat" = AI hint: useful for ferrying -; "Barbarian" = can be created as land barbarian -; "BarbarianTech" = can be created as land barbarian, if someone has -; researched its tech requirements -; "BarbarianBoat" = can be created as boat for sea barbarian -; "BarbarianBuild" = can be built by barbarians -; "BarbarianBuildTech" = can be built by barbarians if someone has -; researched its tech requirements -; "BarbarianLeader" = this unit is the barbarian leader (only one) -; "BarbarianSea" = can be created as a barbarian that disembarks from a barbarian boat -; "BarbarianSeaTech" = can be created as a barbarian that disembarks from a barbarian boat -; if someone has researched its tech requirements -; "Settlers" = can irrigate and build roads -; "Hunter" = AI hint: good for hunting other units -; "CitiesStartUnit" = Gets granted as 'c' startunit -; "WorkerStartUnit" = Gets granted as 'w' startunit -; "ExplorerStartUnit" = Gets granted as 'x' startunit -; "KingStartUnit" = Gets granted as 'k' startunit -; "DiplomatStartUnit" = Gets granted as 's' startunit -; "FerryStartUnit" = Gets granted as 'f' startunit -; "DefendOkStartUnit" = Gets granted as 'd' startunit -; "DefendGoodStartUnit" = Gets granted as 'D' startunit -; "AttackFastStartUnit" = Gets granted as 'a' startunit -; "AttackStrongStartUnit" = Gets granted as 'A' startunit -; -; */ <-- avoid gettext warnings - -[unit_settlers] -name = _("Settlers") -class = "Land" -tech_req = "None" -obsolete_by = "None" -graphic = "u.settlers" -graphic_alt = "-" -sound_move = "m_settlers" -sound_move_alt = "m_generic" -sound_fight = "f_settlers" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 1 -attack = 0 -defense = 1 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 1 -uk_food = 1 -uk_gold = 0 -flags = "Settlers", "Infra", "CanRoad", "CanFortress", "NonMil", "HasNoZOC", "AddToCity", "Cities", "Cant_Fortify", "Expellable" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "CitiesStartUnit" -helptext = _("\ -Settlers are your only means of founding new cities.\ -"), _("\ -Settlers can perform most of the terrain alterations as\ - Workers (but cannot build Airbases or Buoys).\ -"), _("\ -Upkeep for Settlers costs food as well as production. A Settler\ - can die if its supporting city runs out of food. Settlers in a\ - Republic, Democracy, or Fundamentalist nation require twice as\ - much food per turn.\ -") - -;A unique patch unit to provide fair starts regardless of lack of nearby water. -;to make as a start unit, use the letter "a": for example, cccwwwxxa -[unit_welldigger] -name = _("Well-Digger") -class = "Land" -tech_req = "None" -obsolete_by = "Workers" -graphic = "u.well_digger" -graphic_alt = "u.migrants" -sound_move = "m_worker" -sound_move_alt = "m_generic" -sound_fight = "f_worker" -sound_fight_alt = "f_generic" -build_cost = 5 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 3 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 5 -uk_food = 2 -uk_gold = 2 -flags = "Settlers", "Infra", "NonMil", "HasNoZOC", "Cant_Fortify", "Unique", "Well-Digger", "Expellable" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "AttackFastStartUnit" ;this role taken over for well-digger -helptext = _("\ -This unit can fix unlucky starts, but has very high upkeep.\ - If you have no water, make a Well-Digger in a city that can\ - support it, create a water source, then disband the unit.\ -"), _("\ - This unit can dig wells or irrigate any lowland tile. It will cost its home city\ - -2 Food -2 Prod. This unit WILL NOT WORK: 1. Outside your borders,\ - 2. After Alphabet or Pottery, 3. After any player discovers Writing, 4. After 10 turns.\ - >> Don't fool around: high upkeep will permanently hinder you. Only make this unit if you\ - lack water when the game starts!\ -") - -[unit_proletarians] -name = _("Proletarians") -class = "Land" -tech_req = "Communism" -obsolete_by = "None" -graphic = "u.proletarian" -graphic_alt = "u.migrants" -sound_move = "m_worker" -sound_move_alt = "m_generic" -sound_fight = "f_worker" -sound_fight_alt = "f_generic" -build_cost = 10 -pop_cost = 1 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 1 -uk_gold = 0 -flags = "Settlers", "Infra", "Cant_Fortify", "NonMil", "HasNoZOC", "AddToCity", "Capturable", "Expellable", "Airbase", "CanFortress", "CanRoad", "Proletarian" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 1 -roles = "Settlers" -helptext = _("\ -Proletarians can only be controlled by Communist governments.\ -"), _("\ -Communist States can assign Proletarians from one city to another, which transfers population\ - from one to the other. They can also be ordered to the same tasks as Workers.\ -"), _("\ -Large numbers of Proletarians can be used to rapidly complete important State projects,\ - which you may organize into Five-turn Plans.\ -") - -[unit_pilgrims] -name = _("Pilgrims") -class = "Land" -tech_req = "Fundamentalism" -obsolete_by = "None" -graphic = "u.pilgrims" -graphic_alt = "u.migrants" -sound_move = "m_worker" -sound_move_alt = "m_generic" -sound_fight = "f_worker" -sound_fight_alt = "f_generic" -build_cost = 10 -pop_cost = 1 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 2 -uk_gold = 0 -flags = "Fanatic", "Cant_Fortify", "NonMil", "HasNoZOC", "AddToCity", "Capturable", "Expellable" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -helptext = _("\ -Pilgrims are wayfaring migrants from Fundamentalist nations. Like Fanatics,\ - they have no upkeep if under a Fundamentalist government. Heeding the call\ - of ecclesiastic authority, Pilgrims can be guided from one city to another in\ - order to transfer population from city to city.\ -") - - -[unit_worker] -name = _("?unit:Workers") -class = "Land" -tech_req = "Pottery" -obsolete_by = "Engineers" -graphic = "u.worker" -graphic_alt = "u.engineers" ; for compatibility -sound_move = "m_worker" -sound_move_alt = "m_generic" -sound_fight = "f_worker" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -convert_to = "Riflemen" -convert_time = 2 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "Settlers", "Infra", "CanRoad", "CanFortress", "NonMil", "HasNoZOC", "Airbase", "Cant_Fortify", "Capturable", "Expellable" -; No veteran levels (level name is never displayed) -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:army worker"), - _("?vet_rank:army engineer"), - _("?vet_rank:chief engineer") -veteran_raise_chance = 0, 0, 0, 0 -veteran_work_raise_chance = 0, 0, 0, 0 -veteran_power_fact = 100, 100, 100, 100 -veteran_move_bonus = 0, 1, 1, 1 -roles = "Settlers", "WorkerStartUnit" -helptext = _("\ -Workers can improve terrain tiles. See the manual on Terrain for details.\ -"), _("\ -Masonry lets Workers build Forts. Construction lets them build Fortresses and\ - Oil Wells. Engineering lets them build Canals and Naval Bases. Radio lets them\ - build Airbases and Buoys, which Settlers cannot. Workers must be on a ship to build Buoys.\ -"), _("\ -Communism tech allows Communist governments to conscript Workers into Riflemen via the\ - Convert order. And vice versa.\ -") - -[unit_engineers] -name = _("Engineers") -class = "Land" -tech_req = "Explosives" -obsolete_by = "None" -graphic = "u.engineers" -graphic_alt = "u.worker" -sound_move = "m_engineers" -sound_move_alt = "m_generic" -sound_fight = "f_engineers" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 0 -defense = 2 -hitpoints = 20 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "Settlers", "Infra", "CanRoad", "CanFortress", "NonMil", "HasNoZOC", "Transform", "Airbase", "Cant_Fortify", "Expellable" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "Settlers", "WorkerStartUnit" -helptext = _("\ -Engineers can do everything Workers can do, at twice the speed.\ - Unlike Workers, Engineers can Transform, such as converting\ - Desert to Plains. Converting Ocean to Swamp requires being on a ship\ - on a tile bordering 3 land tiles.\ -"), _("\ -TIP: If you build Leonardos Workshop, research Explosives before it goes\ - obsolete, so that you upgrade your Workers for free.\ -") - -[unit_warriors] -name = _("Warriors") -class = "Land" -tech_req = "None" -obsolete_by = "Pikemen" -graphic = "u.warriors" -graphic_alt = "-" -sound_move = "m_warriors" -sound_move_alt = "m_generic" -sound_fight = "f_warriors" -sound_fight_alt = "f_generic" -build_cost = 10 -pop_cost = 0 -attack = 1 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "FootSoldier", "CantReachAir" -roles = "DefendOk", "DefendOkStartUnit", "FirstBuild", "Hut" -helptext = _("\ -The Warrior is the weakest military unit, but can also be very cost effective.\ -") - -[unit_phalanx] -name = _("Phalanx") -class = "Land" -tech_req = "Bronze Working" -obsolete_by = "Pikemen" -graphic = "u.phalanx" -graphic_alt = "-" -sound_move = "m_phalanx" -sound_move_alt = "m_generic" -sound_fight = "f_phalanx" -sound_fight_alt = "f_generic" -build_cost = 20 -pop_cost = 0 -attack = 1 -defense = 2 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "FootSoldier", "CantReachAir" -roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild", "HutTech" -helptext = _("\ -The Phalanx is armored infantry, suitable for defending your cities. It offers good value\ - for defending.\ -") - -[unit_archers] -name = _("Archers") -class = "Land" -tech_req = "Warrior Code" -obsolete_by = "Musketeers" -graphic = "u.archers" -graphic_alt = "-" -sound_move = "m_archers" -sound_move_alt = "m_generic" -sound_fight = "f_archers" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 3 -defense = 2 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "FootSoldier", "Capturer", "CantReachAir", "Bombarder" -roles = "DefendOk", "DefendOkStartUnit" -helptext = _("\ -Archers fight with bows and arrows. They have good offense and decent defense.\ - Rather than fight to the death, Archers can also do a Ranged Attack with no risk\ - of retaliatory damage: a single volley of arrows is fired over all enemy units on the tile,\ - causing 1hp of damage to any units who are hit. This is useful for softening\ - enemies prior to battle, or for deterring an approach to a strategic location.\ - (Ranged Attack is not possible on Cities or Fortresses.)\ -") -bombard_rate = 1 - - -[unit_legion] -name = _("Legion") -class = "Land" -tech_req = "Iron Working" -obsolete_by = "Musketeers" -graphic = "u.legion" -graphic_alt = "-" -sound_move = "m_legion" -sound_move_alt = "m_generic" -sound_fight = "f_legion" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 4 -defense = 2 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "FootSoldier", "Settlers", "Infra", "CanRoad", "CanFortress", "Capturer", "CantReachAir" -roles = "DefendOk", "DefendOkStartUnit", "BarbarianBuild", "BarbarianSea" -helptext = _("\ -Legions are heavily armed well disciplined soldiers with excellent offensive strength.\ - They are famous and feared for their engineering abilities: with the required\ - technology they can build Forts and Fortresses. They can build Roads outside domestic\ - national territory and inside Forts and Fortresses.\ -") - -[unit_pikemen] -name = _("Pikemen") -class = "Land" -tech_req = "Feudalism" -obsolete_by = "Musketeers" -graphic = "u.pikemen" -graphic_alt = "-" -sound_move = "m_pikemen" -sound_move_alt = "m_generic" -sound_fight = "f_pikemen" -sound_fight_alt = "f_generic" -build_cost = 20 -pop_cost = 0 -attack = 1 -defense = 2 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -bonuses = - { "flag", "type", "value" - "Horse", "DefenseMultiplier", 1 - } -flags = "FootSoldier", "CantReachAir" -roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild" -helptext = _("\ -Equipped with long pikes and a 2x defence bonus against\ - mounted units, Pikemen replace the Phalanx as the\ - preferred city defender.\ -") - -[unit_musketeers] -name = _("Musketeers") -class = "Land" -tech_req = "Gunpowder" -obsolete_by = "Riflemen" -graphic = "u.musketeers" -graphic_alt = "-" -sound_move = "m_musketeers" -sound_move_alt = "m_generic" -sound_fight = "f_musketeers" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 3 -defense = 3 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "FootSoldier", "Capturer", "CantReachAir" -roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild", - "BarbarianTech", "BarbarianBuildTech", "BarbarianSeaTech" -helptext = _("\ -Musketeers are infantry equipped with early\ - firearms and replace Pikemen as the preferred\ - city defender, and replace Archers and Legions\ - for offensive foot soldiers.\ -") - -[unit_fanatics] -name = _("Fanatics") -class = "Land" -tech_req = "Fundamentalism" -gov_req = "Fundamentalism" -obsolete_by = "None" -graphic = "u.fanatics" -graphic_alt = "-" -sound_move = "m_fanatics" -sound_move_alt = "m_generic" -sound_fight = "f_fanatics" -sound_fight_alt = "f_generic" -build_cost = 20 -pop_cost = 0 -attack = 4 -defense = 4 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -flags = "Fanatic", "FootSoldier", "Capturer", "CantReachAir", "Unbribable", "Bombarder" -roles = "DefendGood", "DefendGoodStartUnit" -helptext = _("\ -Fanatics are warriors extremely devoted to a higher cause. Their faith\ - is strong and they cannot be bribed.\ -"), _("\ - Fundamentalist nations can maintain Fanatics without having to pay\ - any upkeep. Fanatics produced in a city with Ecclesiastical\ - Palace are inspired by fervorous faith to +1 higher veteran level.\ -"), _("\ - Fanatics zealously defend their homeland, and can do surprise assaults\ - and skirmishes to snipe and injure foreign occupants: Each invader\ - on the tile will endure three combat rounds without defense.\ -") -bombard_rate = 3 - -[unit_partisan] -name = _("Partisan") -class = "Land" -tech_req = "Guerilla Warfare" -obsolete_by = "None" -graphic = "u.partisan" -graphic_alt = "-" -sound_move = "m_partisan" -sound_move_alt = "m_generic" -sound_fight = "f_partisan" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 4 -defense = 4 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -flags = "IgTer", "IgZOC", "NoHome", "FootSoldier", "Capturer", "CantReachAir" -roles = "DefendGood", "DefendGoodStartUnit", "Partisan", "BarbarianTech" -helptext = _("\ -Partisans are guerilla fighters who can use the terrain to their advantage. Like the Explorer\ - that they upgrade, they can slip through ZOC and live off the land with no upkeep.\ -"), _("\ -A number of Partisans are granted free when an enemy conquers your\ - city -- they automatically fortify defensive positions in the\ - surrounding countryside -- but only under these conditions:\n\ - - Guerilla Warfare is known by any player.\n\ - - The city was originally built by you.\n\ - - You know Communism and Gunpowder.\n\ - - You must be Democracy or Communist.\ -") - -[unit_alpine_troops] -name = _("Alpine Troops") -class = "Land" -tech_req = "Tactics" -obsolete_by = "None" -graphic = "u.alpine_troops" -graphic_alt = "-" -sound_move = "m_alpine_troops" -sound_move_alt = "m_generic" -sound_fight = "f_alpine_troops" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 5 -defense = 5 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -flags = "IgTer", "FootSoldier", "Capturer", "CantReachAir" -roles = "DefendGood", "DefendGoodStartUnit" -helptext = _("\ -Alpine Troops are highly mobile units as well as\ - excellent defenders. Similar to an Explorer, they\ - treat every land tile as if it had a road on it.\ -") - -[unit_riflemen] -name = _("Riflemen") -class = "Land" -tech_req = "Conscription" -obsolete_by = "None" -graphic = "u.riflemen" -graphic_alt = "-" -sound_move = "m_riflemen" -sound_move_alt = "m_generic" -sound_fight = "f_riflemen" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 5 -defense = 4 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -convert_to = "Workers" -convert_time = 2 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -flags = "FootSoldier", "Capturer", "CantReachAir" -roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild" -helptext = _("\ -Riflemen are World War-era infantry. They are good at defending cities and\ - strategic Fortresses. They also have good attack capability.\ -"), _("\ -Communism tech allows Communist governments to de-commission Riflemen into\ - Workers via the Convert order. And vice versa.\ -") - -[unit_marines] -name = _("Marines") -class = "LandAirSea" -tech_req = "Amphibious Warfare" -obsolete_by = "None" -graphic = "u.marines" -graphic_alt = "-" -sound_move = "m_marines" -sound_move_alt = "m_generic" -sound_fight = "f_marines" -sound_fight_alt = "f_generic" -build_cost = 60 -pop_cost = 0 -attack = 8 -defense = 5 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 8 ; hard-coded the +4 extra for effect_physics_vision since it is a pre-req anyway -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter", "Land", "Sea" -disembarks = "Helicopter", "Land", "Sea" -targets = "Sea", "Balloon", "Helicopter" -flags = "Marines", "FootSoldier", "BeachLander", "Capturer", "NeverBlocked" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:Ranger"), - _("?vet_rank:Commando"), - _("?vet_rank:Green Beret"), - _("?vet_rank:Navy SEAL") -veteran_raise_chance = 60, 50, 40, 30, 20, 15, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 250, 300, 350, 400 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "DefendOk", "DefendOkStartUnit", "BarbarianSeaTech" -helptext = _("\ -Marines are experts at amphibious war. They are the strongest\ - foot unit in the game, and are armed with diverse weaponry.\ -"), _("\ - Unlike other units, Marines can attack Sea units (at a penalty).\ - Air units do not stop them from attacking reachable targets.\ - They can attack from a Transport or Helicopter. Marines promoted to three\ - veteran levels become commandos suitable for special ops.\ -"), _("\ - Marines built in a city with an Airport, Port Facility, and Barracks III\ - receive the second veteran level (hardened.)\ -") - -[unit_paratroopers] -name = _("Paratroopers") -class = "Land" -tech_req = "Combined Arms" -obsolete_by = "None" -graphic = "u.paratroopers" -graphic_alt = "-" -sound_move = "m_paratroopers" -sound_move_alt = "m_generic" -sound_fight = "f_paratroopers" -sound_fight_alt = "f_generic" -build_cost = 60 -pop_cost = 0 -attack = 6 -defense = 4 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -flags = "Paratroopers", "FootSoldier", "Capturer", "CantReachAir" -roles = "DefendOk", "DefendOkStartUnit" -helptext = _("\ -Paratroopers are experts at airborne attacks.\ - From a friendly city or airbase, Paratroopers who have not used any\ - move points can paradrop directly to any tile in range, and be\ - immediately ready to act there. Beware dropping into unseen territory,\ - as Paratroopers landing on a tile occupied by enemy units will be lost.\ -") -paratroopers_range = 14 -paratroopers_mr_req = 1 -paratroopers_mr_sub = 0 - -[unit_mech_inf] -name = _("Mech. Inf.") -class = "Land" -tech_req = "Labor Union" -obsolete_by = "None" -graphic = "u.mech_inf" -graphic_alt = "-" -sound_move = "m_mech_inf" -sound_move_alt = "m_generic" -sound_fight = "f_mech_inf" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 6 -defense = 6 -hitpoints = 30 -firepower = 1 -move_rate = 6 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -flags = "CantReachAir" -roles = "DefendGood", "DefendGoodStartUnit" -helptext = _("\ -Mechanized Infantry have the strongest general defense strength of any land unit.\ - They have decent attack strength in open field engagements, and excellent mobility.\ -") - -[unit_horsemen] -name = _("Horsemen") -class = "Land" -tech_req = "Horseback Riding" -obsolete_by = "Knights" -graphic = "u.horsemen" -graphic_alt = "-" -sound_move = "m_horsemen" -sound_move_alt = "m_generic" -sound_fight = "f_horsemen" -sound_fight_alt = "f_generic" -build_cost = 20 -pop_cost = 0 -attack = 2 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "Horse", "CantReachAir" -roles = "AttackFastStartUnit", "Barbarian", "Hunter" -helptext = _("\ -Horsemen are mounted warriors and an early shock-troop that can penetrate deep into\ - enemy territory.\ -") - -[unit_chariot] -name = _("Chariot") -class = "Land" -tech_req = "The Wheel" -obsolete_by = "Knights" -graphic = "u.chariot" -graphic_alt = "-" -sound_move = "m_chariot" -sound_move_alt = "m_generic" -sound_fight = "f_chariot" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 3 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "Horse", "Capturer", "CantReachAir" -roles = "AttackFastStartUnit", "Hunter" -helptext = _("\ -Chariots are horse-pulled war wagons, stronger but more expensive than horsemen.\ -") - -[unit_elephants] -name = _("Elephants") -class = "Land" -tech_req = "Polytheism" -obsolete_by = "Crusaders" -graphic = "u.elephants" -graphic_alt = "-" -sound_move = "m_elephants" -sound_move_alt = "m_generic" -sound_fight = "f_elephants" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 4 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "Horse", "Capturer", "CantReachAir" -roles = "AttackFastStartUnit" -helptext = _("\ -Elephants are towering animals trained for war. Their mobility and formidable\ - attack strength make them excellent for offensive engagements, but they\ - defend poorly against most units.\ -") - -[unit_crusaders] -name = _("Crusaders") -class = "Land" -tech_req = "Monotheism" -obsolete_by = "Dragoons" -graphic = "u.crusaders" -graphic_alt = "-" -sound_move = "m_crusaders" -sound_move_alt = "m_generic" -sound_fight = "f_crusaders" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 5 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "Horse", "Capturer", "CantReachAir" -roles = "AttackFastStartUnit" -helptext = _("\ -Crusaders are mounted warriors driven by a higher cause.\ - They have superior attack to Knights, but are poor at defending.\ - They are ideally suited for leading the charge in offensive campaigns.\ -") - -[unit_knights] -name = _("Knights") -class = "LandNoKill" -tech_req = "Chivalry" -obsolete_by = "Dragoons" -graphic = "u.knights" -graphic_alt = "-" -sound_move = "m_knights" -sound_move_alt = "m_generic" -sound_fight = "f_knights" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 4 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -bonuses = - { "flag", "type", "value" - "Horse", "DefenseMultiplier", 2 - "FootSoldier", "DefenseMultiplier", 1 - } -flags = "Horse", "Capturer", "CantReachAir" -roles = "AttackFastStartUnit", "BarbarianTech", - "BarbarianBuildTech", "BarbarianSeaTech", "Hunter" -helptext = _("\ -Knights are heavily armored mounted warriors. They defend at D:3 against mounted units.\ - They defend at D:2 against foot units. They defend at D:1 against everything else.\ - Their noble status allows them to attack cities without population reduction.\ -") - -[unit_dragoons] -name = _("Dragoons") -class = "Land" -tech_req = "Leadership" -obsolete_by = "Cavalry" -graphic = "u.dragoons" -graphic_alt = "-" -sound_move = "m_dragoons" -sound_move_alt = "m_generic" -sound_fight = "f_dragoons" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 5 -defense = 2 -hitpoints = 20 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "Horse", "Capturer", "CantReachAir" -roles = "AttackFastStartUnit", "BarbarianBuildTech", "BarbarianSeaTech", "Hunter" -helptext = _("\ -Dragoons are mounted warriors carrying early firearms.\ - Being the first highly mobile gunpowder unit, they are\ - formidable for offensive campaigns.\ -") - -[unit_cavalry] -name = _("Cavalry") -class = "Land" -tech_req = "Tactics" -obsolete_by = "Armor" -graphic = "u.cavalry" -graphic_alt = "-" -sound_move = "m_cavalry" -sound_move_alt = "m_generic" -sound_fight = "f_cavalry" -sound_fight_alt = "f_generic" -build_cost = 60 -pop_cost = 0 -attack = 8 -defense = 3 -hitpoints = 20 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -flags = "Capturer", "CantReachAir" -roles = "AttackFastStartUnit", "Hunter" -helptext = _("\ -The combination of mobility and superior attack strength make Cavalry\ - the most feared offensive unit in their era.\ -") - -[unit_armor] -name = _("Armor") -class = "Land" -tech_req = "Mobile Warfare" -obsolete_by = "Armor II" -graphic = "u.armor" -graphic_alt = "-" -sound_move = "m_armor" -sound_move_alt = "m_generic" -sound_fight = "f_armor" -sound_fight_alt = "f_generic" -build_cost = 80 -pop_cost = 0 -attack = 10 -defense = 5 -hitpoints = 30 -firepower = 1 -move_rate = 6 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -flags = "CantReachAir", "FortBuster" -roles = "AttackFastStartUnit", "Hunter" -helptext = _("\ -Armor is the mechanized equivalent of a Cavalry unit. They have high attack strength,\ - superb mobility, and the highest defense of any offensive unit. They are massive all-terrain\ - vehicles, well-suited for penetrating defensive fortifications: Units inside Forts get no defense\ - bonus against Armor. Units inside Fortresses get a reduced bonus of 1.67x instead of 2x.\ -") - -[unit_armor_ii] -name = _("Armor II") -class = "Land" -tech_req = "Plastics" -obsolete_by = "None" -graphic = "u.armor_ii" -graphic_alt = "u.armor" -sound_move = "m_armor_ii" -sound_move_alt = "m_armor" -sound_fight = "f_armor_ii" -sound_fight_alt = "f_armor" -build_cost = 80 -pop_cost = 0 -attack = 16 -defense = 6 -hitpoints = 30 -firepower = 1 -move_rate = 6 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -bonuses = - { "flag", "type", "value" - "Missile", "DefenseMultiplier", 1 - } -flags = "CantReachAir", "FortressBuster", "NeverBlocked" -roles = "AttackFastStartUnit", "Hunter" -helptext = _("\ -Armor II is the ultra-modern upgrade to Armor. It features high tech composite armor and\ - electronic countermeasures (ECM). Forts and Fortresses gain no bonus against\ - its ability to blast and break through fortifications. ECM and composite armor\ - give a 2x defense bonus against Missiles. Unlike most land units,\ - Armor II can attack reachable units regardless of whether unreachable units are protecting the tile.\ -") - -[unit_catapult] -name = _("Catapult") -class = "Land" -tech_req = "Mathematics" -obsolete_by = "Cannon" -graphic = "u.catapult" -graphic_alt = "-" -sound_move = "m_catapult" -sound_move_alt = "m_generic" -sound_fight = "f_catapult" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 6 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "CantReachAir" -roles = "" -helptext = _("\ -Catapults are war machines that hurl massive rocks to crush\ - and break their targets. They are strong attackers but equally\ - weak defenders, and will need an escort to be effective.\ -") - -[unit_cannon] -name = _("Cannon") -class = "Land" -tech_req = "Metallurgy" -obsolete_by = "Artillery" -graphic = "u.cannon" -graphic_alt = "-" -sound_move = "m_cannon" -sound_move_alt = "m_generic" -sound_fight = "f_cannon" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 8 -defense = 1 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "CantReachAir" -roles = "BarbarianTech", "BarbarianBuildTech" -helptext = _("\ -Cannons are huge guns that fire heavy metallic projectiles. They are strong\ - attackers but weak defenders, so they need an escort to be effective.\ -") - -[unit_artillery] -name = _("Artillery") -class = "Land" -tech_req = "Machine Tools" -obsolete_by = "Howitzer" -graphic = "u.artillery" -graphic_alt = "-" -sound_move = "m_artillery" -sound_move_alt = "m_generic" -sound_fight = "f_artillery" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 10 -defense = 1 -hitpoints = 20 -firepower = 2 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -flags = "CantReachAir" -roles = "" -helptext = _("\ -Artillery are a major upgrade to Cannons, with doubled firepower. They are\ - superb attackers but poor at defense. They need an escort to be effective.\ -") - -[unit_anti_aircraft] -name = _("Anti-Aircraft Artillery") -class = "LandAirSea" -tech_req = "Flight" -obsolete_by = "None" -graphic = "u.anti_aircraft" -graphic_alt = "u.howitzer" -sound_move = "m_anti_aircraft" -sound_move_alt = "m_generic" -sound_fight = "f_anti_aircraft" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 2 -defense = 2 -hitpoints = 20 -firepower = 2 -move_rate = 2 -vision_radius_sq = 8; hard-coding in physics bonus here since its a req, lets us cut making a new effect -convert_to = "Mobile SAM" -convert_time = 7 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter" -disembarks = "Helicopter" -targets = "Air", "AirProtect", "Sea", "Balloon", "Helicopter" -bonuses = - { "flag", "type", "value" - "AirAttacker", "DefenseDivider", 1 - "AirAttacker", "DefenseMultiplier", 1 - } -flags = "NeverBlocked", "AntiAir", "Marines" -roles = "" -helptext = _("\ -Anti-Aircraft Artillery (AAA) can attack almost anything from anywhere. AAA get a\ - 2x bonus against Air units. They are often used by Marines in combined ops because\ - they can be transported on any unit that can carry Marines, can attack from or to non-native\ - tiles, and do not lose a turn when unloading. (AAA cannot attack Submarines, Missiles,\ - or Jet Bombers.)\ -"), _(" -After Space Flight and 10 turns of service, AAA can be retrofitted to\ - Mobile SAM. The Convert order must be done in your capital, and takes 4 turns.\ -") - -[unit_mobile_sam] -name = _("Mobile SAM") -class = "Land" -tech_req = "Space Flight" -obsolete_by = "None" -graphic = "u.mobile_sam" -graphic_alt = "u.howitzer" -sound_move = "m_howitzer" -sound_move_alt = "m_generic" -sound_fight = "f_mobile_sam" -sound_fight_alt = "f_generic" -build_cost = 75 -pop_cost = 0 -attack = 2 -defense = 2 -hitpoints = 30 -firepower = 2 -move_rate = 6 -vision_radius_sq = 4 -transport_cap = 1 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Air", "AirProtect", "AirPillage", "Balloon", "Helicopter" -cargo = "Missile" -bonuses = - { "flag", "type", "value" - "AirAttacker", "DefenseDivider", 1 - "AirAttacker", "DefenseMultiplier", 1 - } -flags = "NeverBlocked", "AntiAir" -roles = "" -helptext = _("\ -The Mobile SAM is the strongest Anti-Air unit on the ground. It can\ - attack nearby aircraft. It has a 2x bonus against all Air units. The\ - Mobile SAM can also carry one Missile of any type.\ -"), _(" -An AAA can upgrade to Mobile SAM for free on its 10th turn of service.\ - The Convert order must be done in the capital city, and takes 4 turns.\ -") - -[unit_howitzer] -name = _("Howitzer") -class = "Land" -tech_req = "Robotics" -obsolete_by = "None" -graphic = "u.howitzer_o" -graphic_alt = "u.howitzer" -sound_move = "m_howitzer" -sound_move_alt = "m_generic" -sound_fight = "f_howitzer" -sound_fight_alt = "f_generic" -build_cost = 70 -pop_cost = 0 -attack = 12 -defense = 2 -hitpoints = 30 -firepower = 2 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -flags = "CantReachAir" -roles = "" -helptext = _("\ -Howitzers are upgraded Artillery with significant increase in mobility and attack strength. They can fire over city walls, ignoring their effect.\ -") - -[unit_balloon] -name = _("Balloon") -class = "Balloon" -tech_req = "Chemistry" -obsolete_by = "None" -graphic = "u.balloon" -graphic_alt = "u.trireme" -sound_move = "m_balloon" -sound_move_alt = "m_trireme" -sound_fight = "f_warrior" -sound_fight_alt = "f_generic" -build_cost = 25 -pop_cost = 0 -attack = 0 -defense = 0 -hitpoints = 10 -firepower = 1 -move_rate = 5 -vision_radius_sq = 17 -transport_cap = 0 -fuel = 2 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -flags = "Unbribable", "HasNoZOC", "NeverProtects", "NonMil" -roles = "" -helptext = _("\ -Balloons gather intel on potential battle areas. They have great vision and\ - are unreachable by units prior to Riflemen and Ironclads. They can stay in\ - the air for one Turn Change before landing in a City, Fortress, Airbase, or\ - ship with cargo capacity of 4+. Balloons do not block units under them\ - from being attacked, and cannot fly over mountains.\ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. At your own risk,\ - you can override this by ordering moves to adjacent tiles.\ -") - - -[unit_fighter] -name = _("Fighter") -class = "AirProtect" -tech_req = "Flight" -obsolete_by = "Jet Fighter" -graphic = "u.fighter" -graphic_alt = "-" -sound_move = "m_fighter" -sound_move_alt = "m_generic" -sound_fight = "f_fighter" -sound_fight_alt = "f_generic" -build_cost = 60 -pop_cost = 0 -attack = 4 -defense = 3 -hitpoints = 20 -firepower = 2 -move_rate = 20 -vision_radius_sq = 12 -transport_cap = 0 -fuel = 1 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Air", "AirProtect", "Missile", "Balloon", "Helicopter" -bonuses = - { "flag", "type", "value" - "Helicopter", "DefenseDivider", 1 - "Helicopter", "Firepower1", 1 - } -flags = "AirAttacker", "Unbribable", "HasNoZOC", "CanEscape", "AirProtector" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -Fighters are the first offensive Air units. Their superior mobility and firepower alter\ - the very nature of warfare. They can move anywhere and attack any unit (except Submarines,\ - Missiles, and Jet Bombers.) \ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. At your own risk,\ - you can override this by ordering movement and attacks to adjacent tiles.\ -") - - -[unit_escort_fighter] -name = _("Escort Fighter") -class = "AirProtect" -tech_req = "Radio" -obsolete_by = "Jet Fighter" -graphic = "u.escort_fighter" -graphic_alt = "u.fighter" -sound_move = "m_escort_fighter" -sound_move_alt = "m_generic" -sound_fight = "f_fighter" -sound_fight_alt = "f_generic" -build_cost = 80 -pop_cost = 0 -attack = 3 -defense = 5 -hitpoints = 20 -firepower = 2 -move_rate = 18 -vision_radius_sq = 12 -transport_cap = 0 -fuel = 2 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Air", "AirProtect", "Missile", "Balloon", "Helicopter" -bonuses = - { "flag", "type", "value" - "Helicopter", "DefenseDivider", 1 - "Helicopter", "Firepower1", 1 - } -flags = "AirAttacker", "Unbribable", "HasNoZOC", "CanEscape", "AirProtector" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 50, 33, 20, 15, 15, 15, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -Escort Fighters are large fighters with high fuel capacity. Higher mass and\ - stronger construction allow them to absorb more damage. They do not attack\ - as well as standard Fighters, but can return home on the next turn. They are\ - good for long-range missions, defensie air support, and escorting bombers. \ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_medium_bomber] -name = _("Medium Bomber") -class = "Air" -tech_req = "Radio" -obsolete_by = "Jet Bomber" -graphic = "u.medium_bomber" -graphic_alt = "u.bomber" -sound_move = "m_medium_bomber" -sound_move_alt = "m_generic" -sound_fight = "f_medium_bomber" -sound_fight_alt = "f_generic" -build_cost = 85 -pop_cost = 0 -attack = 6 -defense = 2 -hitpoints = 20 -firepower = 2 -move_rate = 13 -vision_radius_sq = 12 -transport_cap = 0 -fuel = 2 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon" -bonuses = - { "flag", "type", "value" - } -flags = "FieldUnit", "Unbribable", "AirAttacker", "HasNoZOC", "CanEscape", "CantReachAir", "NeverProtects" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -Medium Bombers are good for eliminating moderately strong ground targets, or multiple weaker targets.\ - They may not attack other Air units. \ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_bomber] -name = _("Heavy Bomber") -class = "Air" -tech_req = "Advanced Flight" -obsolete_by = "Jet Bomber" -graphic = "u.heavy_bomber_o" -graphic_alt = "u.bomber" -sound_move = "m_bomber" -sound_move_alt = "m_generic" -sound_fight = "f_heavy_bomber" -sound_fight_alt = "f_bomber" -build_cost = 120 -pop_cost = 0 -attack = 12 -defense = 3 -hitpoints = 20 -firepower = 2 -move_rate = 16 -vision_radius_sq = 12 -transport_cap = 1 -fuel = 2 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon" -cargo = "Bomb" -bonuses = - { "flag", "type", "value" - } -flags = "FieldUnit", "Unbribable", "AirAttacker", "HasNoZOC", "CanEscape", "CantReachAir", "NeverProtects" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -Heavy Bombers are good for hitting strong and well-defended ground targets, or multiple weaker targets.\ - They cannot attack Air units. May carry one Bomb. \ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_strategic_bomber] -name = _("Strategic Bomber") -class = "Air" -tech_req = "Rocketry" -obsolete_by = "Jet Bomber" -graphic = "u.ultra_heavy_bomber_o" -graphic_alt = "u.bomber" -sound_move = "m_strategic_bomber" -sound_move_alt = "m_bomber" -sound_fight = "f_strategic_bomber" -sound_fight_alt = "f_bomber" -build_cost = 135 -pop_cost = 0 -attack = 13 -defense = 4 -hitpoints = 20 -firepower = 2 -move_rate = 16 -vision_radius_sq = 12 -transport_cap = 2 -fuel = 3 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon" -cargo = "Bomb" -bonuses = - { "flag", "type", "value" - } -flags = "FieldUnit", "Unbribable", "AirAttacker", "HasNoZOC", "CanEscape", "CantReachAir", "NeverProtects" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -The Strategic Bomber offers a small improvement in attack. Higher altitude offers a good upgrade in\ - defense. It has considerably longer range, with one more turn of fuel. May carry two Bombs. \ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_awacs] -name = _("AWACS") -class = "Air" -tech_req = "Advanced Flight" -obsolete_by = "None" -graphic = "u.awacs" -graphic_alt = "u.bomber" ; backwards compatibility -sound_move = "m_awacs" -sound_move_alt = "m_generic" -sound_fight = "f_awacs" -sound_fight_alt = "f_generic" -build_cost = 140 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 20 -firepower = 1 -move_rate = 32 -vision_radius_sq = 46 -transport_cap = 0 -fuel = 2 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "HasNoZOC", "Unbribable", "Expellable", "NeverProtects", "CanEscape" -roles = "" -helptext = _("\ -The AWACS has great fuel capacity for long range flights, and advanced radar that can determine\ - the location of enemy units over a wide area. \ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_helicopter] -; /* TRANS: unit type */ -name = _("Helicopter") -class = "Helicopter" -tech_req = "Combined Arms" -obsolete_by = "None" -graphic = "u.helicopter" -graphic_alt = "-" -sound_move = "m_helicopter" -sound_move_alt = "m_generic" -sound_fight = "f_helicopter" -sound_fight_alt = "f_generic" -build_cost = 100 -pop_cost = 0 -attack = 10 -defense = 5 -hitpoints = 20 -firepower = 2 -move_rate = 12 -vision_radius_sq = 12 -transport_cap = 1 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -cargo = "LandAirSea" -flags = "Helicopter", "AirAttacker", "Unbribable", "CanEscape" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 50, 33, 20, 15, 15, 15, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -The Helicopter has good range and can attack multiple targets, and even conquer cities. Helicopters lose\ - a small amount of health for every turn not spent in a City, Fort, Fortress, Airbase or Carrier. Helicopters\ - can be attacked by ground units from Riflemen onward, or by Sea from Ironclad onward.\ -"), _("\ - Helicopters can transport one Marines or AAA unit.\ -") - -[unit_jet_fighter] -name = _("Jet Fighter") -class = "AirProtect" -tech_req = "Space Flight" -obsolete_by = "None" -graphic = "u.jet_fighter" -graphic_alt = "u.stealth_fighter" -sound_move = "m_jet_fighter" -sound_move_alt = "m_stealth_fighter" -sound_fight = "f_jet_fighter" -sound_fight_alt = "f_stealth_fighter" -build_cost = 70 -pop_cost = 0 -attack = 6 -defense = 5 -hitpoints = 20 -firepower = 2 -move_rate = 24 -vision_radius_sq = 12 -transport_cap = 0 -fuel = 1 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Air", "AirProtect", "AirPillage", "Missile", "Balloon", "Helicopter" -bonuses = - { "flag", "type", "value" - "Helicopter", "DefenseDivider", 1 - "Helicopter", "Firepower1", 1 - } -flags = "AirAttacker", "Unbribable", "HasNoZOC", "CanEscape", "AirProtector" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -Jet Fighters upgrade the Fighter with improved attack, defense, and range. \ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_jet_bomber] -name = _("Jet Bomber") -class = "AirPillage" -tech_req = "Space Flight" -obsolete_by = "None" -graphic = "u.jet_bomber_o" -graphic_alt = "u.bomber" -sound_move = "m_jet_bomber" -sound_move_alt = "m_bomber" -sound_fight = "f_jet_bomber" -sound_fight_alt = "f_bomber" -build_cost = 145 -pop_cost = 0 -attack = 15 -defense = 1 -hitpoints = 20 -firepower = 2 -move_rate = 19 -vision_radius_sq = 12 -transport_cap = 3 -fuel = 3 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -cargo = "Bomb" -flags = "FieldUnit", "Unbribable", "AirAttacker", "HasNoZOC", "CanEscape", "CantReachAir", "NeverProtects" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -Jet Bombers are stratospheric long-range bombers with 3 turns of fuel: they can be airborne for two\ - turn-changes. Their range makes them useful even after Stealth Bombers are available. Stratospheric altitude\ - makes them unreachable to propeller-based Fighters and AAA. Jet Bombers can carpet-bomb,\ - pillaging tiles from the air. May carry three Bombs. \ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_stealth_fighter] -name = _("Stealth Fighter") -class = "AirProtect" -tech_req = "Stealth" -obsolete_by = "None" -graphic = "u.stealth_fighter" -graphic_alt = "-" -sound_move = "m_stealth_fighter" -sound_move_alt = "m_generic" -sound_fight = "f_stealth_fighter" -sound_fight_alt = "f_generic" -build_cost = 80 -pop_cost = 0 -attack = 8 -defense = 4 -hitpoints = 20 -firepower = 2 -move_rate = 28 -vision_radius_sq = 12 -transport_cap = 0 -fuel = 1 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Air", "AirProtect", "AirPillage", "Missile", "Balloon", "Helicopter" -bonuses = - { "flag", "type", "value" - "Helicopter", "DefenseDivider", 1 - "Helicopter", "Firepower1", 1 - "AntiAir", "DefenseDividerPct", 25 - "AntiAir", "DefenseMultiplierPct", 25 - } -vision_layer = "Stealth" -flags = "AirAttacker", "Unbribable", "HasNoZOC", "CanEscape", "AirProtector" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -The most advanced Fighter, with improved attack and longer range. Stealth Fighters cannot be seen unless adjacent\ - to an enemy. Stealth evasion gives a 25% bonus against all Anti-Air units, and reduces\ - SAM Batteries down to a smaller 25% bonus. \ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_stealth_bomber] -name = _("Stealth Bomber") -class = "Air" -tech_req = "Stealth" -obsolete_by = "None" -graphic = "u.stealth_bomber_o" -graphic_alt = "u.stealth_bomber" -sound_move = "m_stealth_bomber" -sound_move_alt = "m_generic" -sound_fight = "f_stealth_bomber" -sound_fight_alt = "f_generic" -build_cost = 160 -pop_cost = 0 -attack = 19 -defense = 5 -hitpoints = 20 -firepower = 2 -move_rate = 24 -vision_radius_sq = 12 -transport_cap = 2 -fuel = 2 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon" -bonuses = - { "flag", "type", "value" - "AntiAir", "DefenseDividerPct", 25 - "AntiAir", "DefenseMultiplierPct", 25 - } -vision_layer = "Stealth" -cargo = "Bomb" -flags = "FieldUnit", "AirAttacker", - "HasNoZOC", "Unbribable", "CanEscape", "CantReachAir", "NeverProtects" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -The deadliest Bomber, with improved attack and speed. Stealth Bombers cannot be seen\ - unless adjacent to an enemy. Stealth evasion gives a 25% bonus against all Anti-Air\ - units, and reduces SAM Batteries down to only a 25% bonus. May carry two Bombs. \ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_boat] -name = _("Boat") -class = "RiverShip" -tech_req = "None" -obsolete_by = "Trireme" -graphic = "u.boat" -graphic_alt = "-" -sound_move = "m_trireme" -sound_move_alt = "m_generic" -sound_fight = "f_trireme" -sound_fight_alt = "f_generic" -build_cost = 10 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 1 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea" -flags = "BadCityDefender", "CantReachAir", "HelpWonder", "TradeRoute", "CoastStrict", "NonMil", "HasNoZOC" -roles = "Ferryboat", "FerryStartUnit" -helptext = _("\ -Boats were used pre-historically for exploration,\ - transport, and interaction with other tribes. They\ - can travel rivers and oceans, but must always stay\ - near shore. Boats can carry one unit and do ancient\ - commerce: building Wonders or setting up Traderoutes\ - without Trade tech. Primitive bartering generates little\ - or no extra trade, but may help you advance faster or\ - create relations with ancient neighbors. To build\ - Wonders with Boats requires Currency.\ -") - -[unit_trireme] -name = _("Trireme") -class = "Trireme" -tech_req = "Alphabet" -obsolete_by = "Galley" -graphic = "u.trireme" -graphic_alt = "-" -sound_move = "m_trireme" -sound_move_alt = "m_generic" -sound_fight = "f_trireme" -sound_fight_alt = "f_generic" -build_cost = 20 -pop_cost = 0 -attack = 1 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 6 -vision_radius_sq = 4 -transport_cap = 2 -fuel = 2 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea" -flags = "BadCityDefender", "Provoking", "CantReachAir", "HelpWonder", "TradeRoute", "Coast" -roles = "Ferryboat", "FerryStartUnit" -helptext = _("\ -Triremes are used for exploration, transport, and Commerce.\ - The entry on Caravan explains what Commerce units may do.\ -"), _(" - Triremes can enter Deep Ocean, but there is risk: they must end every second\ - turn on river, coastline, or a city--or else be lost at sea. They can travel\ - and attack on rivers, but cannot attack the shore.\ -"), _(" - Like most ancient sea units, when it initiates combat there will be 15 rounds\ - of combat and 15 total hp lost between both units. This may or may not\ - result in a victor. Triremes do not cause unhappiness.\ -") - -[unit_longboat] -name = _("Longboat") -class = "RiverShip" -tech_req = "Map Making" -obsolete_by = "Caravel" -graphic = "u.longboat" -graphic_alt = "u.trireme" -sound_move = "m_longboat" -sound_move_alt = "m_trireme" -sound_fight = "f_trireme" -sound_fight_alt = "f_generic" -build_cost = 25 -pop_cost = 0 -attack = 2 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 6 -vision_radius_sq = 4 -transport_cap = 1 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea" -flags = "BadCityDefender", "Provoking", "CantReachAir" -roles = "Ferryboat", "Hunter" -helptext = _("\ -The Longboat is a warship. It can attack at sea, attack the shore, and carry one land\ - unit. It is useful for ancient sea campaigns. Longboats can travel on rivers.\ -"), _(" -Like most early sea units, when it initiates combat there will be 15 rounds\ - of combat and 15 total hp lost between both units. This may or may not\ - result in the loss of one of the units.\ -") - -[unit_galley] -name = _("Galley") -class = "RiverShip" -tech_req = "Seafaring" -obsolete_by = "Caravel" -graphic = "u.galley" -graphic_alt = "u.trireme" -sound_move = "m_galley" -sound_move_alt = "m_trireme" -sound_fight = "f_trireme" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 2 -defense = 2 -hitpoints = 10 -firepower = 1 -move_rate = 6 -vision_radius_sq = 4 -transport_cap = 2 -fuel = 0 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea" -flags = "BadCityDefender", "Provoking", "CantReachAir", "HelpWonder", "Traderoute", "Only_Native_Attack" -roles = "Ferryboat", "FerryStartUnit", "BarbarianBoat" -helptext = _("\ -The Galley is an all-purpose sea unit and upgrades the Trireme. It has decent\ - combat strength, can transport, and is a Commerce unit. The entry on Caravan\ - explains what Commerce units may do. Galleys can travel and attack on rivers,\ - but cannot attack the shore. Galleys do not cause unhappiness.\ -"), _(" -Like most early sea units, when it initiates an attack, there will be 15 rounds\ - of combat and 15 total hp lost between both units. This may or may not\ - result in the loss of one of the units.\ -") - -[unit_war_galley] -name = _("War Galley") -class = "RiverShip" -tech_req = "Astronomy" -obsolete_by = "Caravel" -graphic = "u.war_galley" -graphic_alt = "u.trireme" -sound_move = "m_war_galley" -sound_move_alt = "m_trireme" -sound_fight = "f_trireme" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 3 -defense = 3 -hitpoints = 10 -firepower = 1 -move_rate = 6 -vision_radius_sq = 4 -transport_cap = 3 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea" -flags = "BadCityDefender", "Provoking", "CantReachAir" -roles = "Ferryboat", "FerryStartUnit", "BarbarianBoat", "Hunter" -helptext = _("\ -The War Galley has improved offense, defense, and cargo capacity, but lacks commerce\ - ability. War Galleys can travel and attack on rivers, and do shore attacks from the sea.\ -"), _(" -Like most ancient sea units, when it initiates combat there will be 15 rounds\ - of combat and 15 total hitpoints lost between both units. This may or may not\ - result in the loss of one of the units.\ -") - -[unit_ram_ship] -name = _("Ram Ship") -class = "Sea" -tech_req = "Engineering" -obsolete_by = "Caravel" -graphic = "u.ram_ship" -graphic_alt = "u.trireme" -sound_move = "m_ram_ship" -sound_move_alt = "m_trireme" -sound_fight = "f_ram_ship" -sound_fight_alt = "f_catapult" -build_cost = 35 -pop_cost = 0 -attack = 4 -defense = 2 -hitpoints = 10 -firepower = 1 -move_rate = 6 -vision_radius_sq = 1 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea" -flags = "BadCityDefender", "Provoking", "CantReachAir", "Only_Native_Attack" -roles = "Hunter" -helptext = _("\ -The Ram Ship has one purpose: to destroy other ships. It has poor vision, no transport or\ - commerce ability, and cannot travel rivers. Unlike other early ships, there will always be\ - a winner and a loser when Ram Ships attack. They are good for first-strike, and are good\ - counter units for nations not invested into sea tech. Ram Ships cannot do shore attacks.\ -") - -[unit_caravel] -name = _("Caravel") -class = "RiverShip" -tech_req = "Navigation" -obsolete_by = "Galleon" -graphic = "u.caravel" -graphic_alt = "u.trireme" -sound_move = "m_caravel" -sound_move_alt = "m_generic" -sound_fight = "f_caravel" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 4 -defense = 4 -hitpoints = 10 -firepower = 1 -move_rate = 7 -vision_radius_sq = 4 -transport_cap = 3 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea" -flags = "BadCityDefender", "Provoking", "CantReachAir", "Traderoute", "HelpWonder" -roles = "Ferryboat", "FerryStartUnit", "BarbarianBoat", "Hunter" -helptext = _("\ -Caravels upgrade older sea units, and are a big advance in combat, speed, range, and transport capacity. They have\ - the commerce ability of the Galley, but cannot build Wonders. Caravels can travel and attack on rivers and do shore attacks.\ -"), _(" -Like most early sea units, when it initiates an attack, there will be 15 rounds\ - of combat and 15 total hitpoints lost between both units. This may or may not\ - result in the loss of one of the units.\ -") - -[unit_galleon] -name = _("Galleon") -class = "RiverShip" -tech_req = "Magnetism" -obsolete_by = "Transport" -graphic = "u.galleon" -graphic_alt = "-" -sound_move = "m_galleon" -sound_move_alt = "m_generic" -sound_fight = "f_galleon" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 2 -defense = 3 -hitpoints = 20 -firepower = 1 -move_rate = 8 -vision_radius_sq = 4 -transport_cap = 4 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Submarine" -cargo = "Land", "LandNoKill", "LandAirSea", "Balloon" -flags = "BadCityDefender", "Provoking", "CanEscape", "CantReachAir" -roles = "Ferryboat", "FerryStartUnit", "BarbarianBoat" -helptext = _("\ -The Galleon is a heavily armed transport ship that can carry up to 4 units. Galleons can travel and attack on rivers,\ - and also do shore attacks.\ -"), _(" -Like most early sea units, when it initiates combat there will be 15 rounds\ - of combat and 15 total hitpoints lost between both units. This may or may not\ - result in the loss of one of the units.\ -"), _(" -Galleons can Stack-Escape: a 50% chance to escape a killed stack if they have more remaining moves than the attacker.\ -") - -[unit_frigate] -name = _("Frigate") -class = "RiverShip" -tech_req = "Magnetism" -obsolete_by = "Ironclad" -graphic = "u.frigate" -graphic_alt = "-" -sound_move = "m_frigate" -sound_move_alt = "m_generic" -sound_fight = "f_frigate" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 4 -defense = 3 -hitpoints = 20 -firepower = 1 -move_rate = 8 -vision_radius_sq = 4 -transport_cap = 2 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Submarine" -cargo = "Land", "LandNoKill", "LandAirSea" -bonuses = - { "flag", "type", "value" - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "Provoking", "CanEscape", "CantReachAir" -roles = "Hunter" -helptext = _("\ -The Frigate is versatile -- it's a superior offensive unit and also\ - a decent transport ship. Frigates can travel and attack on rivers, or make shore attacks\ - from sea.\ -"), _(" -From Frigates onward, all sea attacks end with a single victor.\ - Frigates can Stack-Escape: a 50% chance to escape a killed stack if they have more remaining move points than the attacker.\ -") - -[unit_ironclad] -name = _("Ironclad") -class = "Sea" -tech_req = "Steam Engine" -obsolete_by = "Destroyer" -graphic = "u.ironclad" -graphic_alt = "-" -sound_move = "m_ironclad" -sound_move_alt = "m_generic" -sound_fight = "f_ironclad" -sound_fight_alt = "f_generic" -build_cost = 60 -pop_cost = 0 -attack = 4 -defense = 4 -hitpoints = 30 -firepower = 1 -move_rate = 8 -vision_radius_sq = 8 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter" -bonuses = - { "flag", "type", "value" - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "CanEscape", "CantReachAir" -roles = "Hunter" -helptext = _("\ -The Ironclad is an armored ship that is much more sturdy than the Frigate but\ - loses transport capability and the ability to navigate rivers. From the Ironclad\ - onward, warships are excellent at attacking shore targets.\ -"), _(" -Ironclads and all modern ships can Stack-Escape: a 50% chance to escape a killed stack if they have more remaining move points than the attacker.\ -") - -[unit_destroyer] -name = _("Destroyer") -class = "Sea" -tech_req = "Electricity" -obsolete_by = "Missile Destroyer" -graphic = "u.destroyer" -graphic_alt = "-" -sound_move = "m_missile_destroyer" -sound_move_alt = "m_destroyer" -sound_fight = "f_missile_destroyer" -sound_fight_alt = "f_destroyer" -build_cost = 60 -pop_cost = 0 -attack = 5 -defense = 5 -hitpoints = 30 -firepower = 1 -move_rate = 12 -vision_radius_sq = 15 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter" -bonuses = - { "flag", "type", "value" - "Submarine", "DefenseMultiplier", 3 - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "CanEscape", "CantReachAir" -roles = "Hunter" -helptext = _("\ -Destroyers are the first of the modern ships to start your modern\ - navy. Their main roles are fast scouting, seek-and-destroy,\ - anti-submarine warfare, shore bombardment of lighter targets,\ - and supporting the needs of larger fleets. 4x ASW defence gives a\ - 35% chance defending vs Submarines.\ -") - -[unit_cruiser] -name = _("Cruiser") -class = "Sea" -tech_req = "Steel" -obsolete_by = "AEGIS Cruiser" -graphic = "u.cruiser" -graphic_alt = "-" -sound_move = "m_cruiser" -sound_move_alt = "m_generic" -sound_fight = "f_cruiser" -sound_fight_alt = "f_generic" -build_cost = 80 -pop_cost = 0 -attack = 6 -defense = 6 -hitpoints = 30 -firepower = 2 -move_rate = 11 -vision_radius_sq = 13 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter" -bonuses = - { "flag", "type", "value" - "Submarine", "DefenseMultiplier", 1 - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "CanEscape", "CantReachAir" -roles = "Hunter" -helptext = _("\ -The Cruiser is a large and fast surface warship with equally strong offensive and defensive strength. More often than not, its\ - 2x ASW defence allows it to survive a Submarine attack.\ -"), _("\ -The main duties of the Cruiser are offensive strikes against lesser ships, and escorting weaker ships.\ -") - -[unit_missile_destroyer] -name = _("Missile Destroyer") -class = "Sea" -tech_req = "Rocketry" -obsolete_by = "None" -graphic = "u.missile_destroyer" -graphic_alt = "u.destroyer" -sound_move = "m_destroyer" -sound_move_alt = "m_generic" -sound_fight = "f_destroyer" -sound_fight_alt = "f_generic" -build_cost = 60 -pop_cost = 0 -attack = 5 -defense = 5 -hitpoints = 30 -firepower = 2 -move_rate = 12 -vision_radius_sq = 16 -transport_cap = 1 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter" -cargo = "Missile" -bonuses = - { "flag", "type", "value" - "Submarine", "DefenseMultiplier", 1 - "Marines", "DefenseMultiplier", 1 - "AirAttacker", "DefenseMultiplier", 1 - "Missile", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "CanEscape", "CantReachAir" -roles = "Hunter" -helptext = _("\ -The Missile Destroyer has double the firepower of a Destroyer, and shares the same roles\ - as its ancestor. It gains 2x defense against Air and Missile units. It has a 2x ASW bonus\ - and can can carry one Missile.\ -") - -[unit_aegis_cruiser] -name = _("AEGIS Cruiser") -class = "Sea" -tech_req = "Rocketry" -obsolete_by = "None" -graphic = "u.aegis_cruiser" -graphic_alt = "-" -sound_move = "m_aegis_cruiser" -sound_move_alt = "m_generic" -sound_fight = "f_aegis_cruiser" -sound_fight_alt = "f_generic" -build_cost = 100 -pop_cost = 0 -attack = 8 -defense = 8 -hitpoints = 30 -firepower = 2 -move_rate = 11 -vision_radius_sq = 19 -transport_cap = 2 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Air", "AirProtect", "AirPillage", "Missile", "Helicopter", "Balloon", "Submarine" -cargo = "Missile" -bonuses = - { "flag", "type", "value" - "AirAttacker", "DefenseMultiplier", 2 - "Missile", "DefenseMultiplier", 2 - "Submarine", "DefenseMultiplier", 1 - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "CanEscape", "AntiAir" -roles = "Hunter" -helptext = _("\ -The AEGIS Cruiser has an Anti-Air missile system. Radar and sonar\ - give superior vision and 2x defense bonus against Submarines.\ - The AEGIS can carry two Missiles, and is the only ship that can attack\ - Air and Missile units.\ -"), _("\ - Excellent vision and 3x Anti-Air bonus are ideal for scouting and escorting.\ -") - -[unit_battleship] -name = _("Battleship") -class = "Sea" -tech_req = "Refining" -obsolete_by = "None" -graphic = "u.battleship" -graphic_alt = "u.battleship" -sound_move = "m_battleship" -sound_move_alt = "m_generic" -sound_fight = "f_battleship" -sound_fight_alt = "f_generic" -build_cost = 160 -pop_cost = 0 -attack = 12 -defense = 12 -hitpoints = 40 -firepower = 2 -move_rate = 10 -vision_radius_sq = 12 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter" -bonuses = - { "flag", "type", "value" - "Submarine", "DefenseMultiplier", 1 - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "CanEscape", "CantReachAir" -roles = "" -helptext = _("\ -The Battleship is the supreme naval unit with excellent offensive and defensive strength. It has a 2x defense bonus vs Submarines.\ -") - -[unit_submarine] -name = _("Submarine") -class = "Submarine" -tech_req = "Automobile" -obsolete_by = "None" -graphic = "u.submarine" -graphic_alt = "-" -sound_move = "m_submarine" -sound_move_alt = "m_generic" -sound_fight = "f_submarine" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 12 -defense = 2 -hitpoints = 28 -firepower = 2 -move_rate = 10 -vision_radius_sq = 12 -transport_cap = 8 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Submarine" -cargo = "Missile" -vision_layer = "Subsurface" -bonuses = - { "flag", "type", "value" - "Submarine", "DefenseMultiplier", 1 - } -flags = "NeverProtects", "BadCityDefender", "Provoking", "Only_Native_Attack", "Submarine", "CanEscape", "CantReachAir" -roles = "Hunter" -helptext = _("\ -Submarines are strong attackers but weak defenders. They can carry 8 Missiles.\ - They are unreachable by Air units, but do not block air attacks on surface ships.\ - Submarines cannot attack units on shore.\ -"), _("\ -Submarines have superior attrition rates when attacking in numbers. They excel\ - at hit-and-run against weaker ships.\ -") - -[unit_carrier] -name = _("Carrier") -class = "Sea" -tech_req = "Advanced Flight" -obsolete_by = "None" -graphic = "u.carrier" -graphic_alt = "-" -sound_move = "m_carrier" -sound_move_alt = "m_generic" -sound_fight = "f_carrier" -sound_fight_alt = "f_generic" -build_cost = 160 -pop_cost = 0 -attack = 1 -defense = 9 -hitpoints = 40 -firepower = 2 -move_rate = 10 -vision_radius_sq = 12 -transport_cap = 8 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter" -cargo = "Air", "AirProtect", "AirPillage", "Missile", "Helicopter", "Balloon", "LandAirSea" -bonuses = - { "flag", "type", "value" - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "Only_Native_Attack", "Provoking", "CanEscape", "CantReachAir" -roles = "" -helptext = _("\ -The Carrier is a mobile airport that can carry Air units, Helicopters, AAA, Marines, and Missiles.\ -"), _("\ - Carriers are very expensive and thus, usually protected by a fleet of scouts and escorts.\ -") - -[unit_cargo_ship] -name = _("Cargo Ship") -class = "RiverShip" -tech_req = "Industrialization" -obsolete_by = "None" -graphic = "u.cargo_ship" -graphic_alt = "u.transport" -sound_move = "m_transport" -sound_move_alt = "m_transport" -sound_fight = "f_trireme" -sound_fight_alt = "f_generic" -build_cost = 45 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 30 -firepower = 1 -move_rate = 7 -vision_radius_sq = 4 -transport_cap = 4 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea", "Balloon" -flags = "BadCityDefender", "HelpWonder", "Traderoute", "NonMil", "HasNoZOC" -roles = "" -helptext = _("\ -Cargo ships are Commerce units: they can establish Trade Routes and help\ - build Wonders. They can travel rivers and oceans. Cargo ships can also carry\ - four land units: thus, they are useful for transporting units by river or sea.\ -") - -[unit_transport] -name = _("Transport") -class = "Sea" -tech_req = "Industrialization" -obsolete_by = "None" -graphic = "u.transport" -graphic_alt = "-" -sound_move = "m_transport" -sound_move_alt = "m_generic" -sound_fight = "f_transport" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 0 -defense = 3 -hitpoints = 30 -firepower = 1 -move_rate = 10 -vision_radius_sq = 12 -transport_cap = 8 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea", "Balloon" -bonuses = - { "flag", "type", "value" - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "Provoking", "CanEscape" -roles = "Ferryboat", "FerryStartUnit" -helptext = _("\ -The Transport cannot attack but can defend itself when under attack.\ - Marines and Anti-Aircraft Artillery can directly attack from a Transport. Its\ - large cargo capacity makes it a significant logistical upgrade in\ - sea transportation.\ -") - -[unit_cruise_missile] -name = _("Cruise Missile") -class = "Missile" -tech_req = "Rocketry" -obsolete_by = "None" -graphic = "u.cruise_missile" -graphic_alt = "-" -sound_move = "m_cruise_missile" -sound_move_alt = "m_generic" -sound_fight = "f_cruise_missile" -sound_fight_alt = "f_generic" -build_cost = 60 -pop_cost = 0 -attack = 18 -defense = 0 -hitpoints = 10 -firepower = 3 -move_rate = 24 -vision_radius_sq = 2 -transport_cap = 0 -fuel = 1 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -flags = "NeverProtects", "FieldUnit", "OneAttack", "HasNoZOC", "Unbribable", "CantReachAir", "Missile", "NeverBlocked" -roles = "" -helptext = _("\ -A Cruise Missile can strike distant targets. It\ - cannot attack Air units, but Air units never block\ - a strike on reachable surface units. Cruise Missiles\ - can be relocated by ending their turn on a city,\ - airbase, Submarine, Missile Destroyer, AEGIS Cruiser,\ - Carrier, or Mobile SAM. A Cruise Missile cannot\ - block attacks on other units on its tile.\ -") - -[unit_atom_bomb] -name = _("Atom Bomb") -class = "Bomb" -tech_req = "Nuclear Fission" -obsolete_by = "None" -graphic = "u.atom_bomb" -graphic_alt = "u.nuclear" -sound_move = "m_atomb_bomb" -sound_move_alt = "m_generic" -sound_fight = "f_atomb_bomb" -sound_fight_alt = "f_nuclear" -build_cost = 150 -pop_cost = 0 -attack = 99 -defense = 0 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 0 -transport_cap = 0 -fuel = 1 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter", "Air", "AirProtect", "AirPillage", "Missile", "Submarine" -disembarks = "Air", "AirPillage" -flags = "NeverProtects", "FieldUnit", "OneAttack", "Nuclear", "HasNoZOC", "Unbribable", "AirAttacker", "NeverBlocked" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "" -helptext = _("\ -If you have Nuclear Fission and the Manhattan Project has been built by any player, you can make Atom Bombs.\ - A Bomber can drop it within two tiles of its location. Unload the bomb and fly the Bomber out of range, then\ - attack the target (or detonate by pressing D twice.) The blast destroys ALL units in a 3x3 area. City population\ - is reduced by half. Land tiles may get nuclear fallout.\ -"), _("\ - Fallout reduces tile output and increases risk of nuclear winter.\ -") - -[unit_nuclear] -name = _("Nuclear Missile") -class = "Missile" -tech_req = "Space Flight" -obsolete_by = "None" -graphic = "u.nuclear" -graphic_alt = "-" -sound_move = "m_nuclear" -sound_move_alt = "m_generic" -sound_fight = "f_nuclear" -sound_fight_alt = "f_generic" -build_cost = 160 -pop_cost = 0 -attack = 99 -defense = 0 -hitpoints = 10 -firepower = 1 -move_rate = 24 -vision_radius_sq = 2 -transport_cap = 0 -fuel = 1 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter", "Air", "AirProtect", "AirPillage", "Missile", "Submarine" -flags = "NeverProtects", "FieldUnit", "OneAttack", "Nuclear", "HasNoZOC", "Unbribable", "NeverBlocked" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "" -helptext = _("\ -If you have Nuclear Fission and the Manhattan Project has been built by any player, you can make Nuclear Missiles.\ - Nuclear blasts destroy ALL units in a 3x3 area. City population is reduced by half. Land tiles may get nuclear fallout.\ - Fallout reduces tile output and increases risk of nuclear winter.\ -"), _("\ -If Fallout is cleaned on the turn it appears, the chance of nuclear winter is reduced.\ -") - -[unit_diplomat] -name = _("Diplomat") -class = "Land" -tech_req = "Writing" -obsolete_by = "Spy" -graphic = "u.diplomat" -graphic_alt = "-" -sound_move = "m_diplomat" -sound_move_alt = "m_generic" -sound_fight = "f_diplomat" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 0 -defense = 0 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -flags = "Diplomat", "IgZOC", "NonMil", "HasNoZOC", "Provoking", "Expellable" -veteran_names = - _("?diplomatic_rank:attaché"), - _("?diplomatic_rank:secretary"), - _("?diplomatic_rank:envoy"), - _("?diplomatic_rank:ambassador"), - _("?diplomatic_rank:emissary"), - _("?diplomatic_rank:statesman"), - _("?diplomatic_rank:plenipotentiary") - -veteran_raise_chance = 50, 33, 20, 15, 15, 15, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 105, 110, 115, 120, 125, 130 -veteran_move_bonus = 0, 0, 0, 0, 0, 0, 0 -roles = "DiplomatStartUnit" -helptext = _("\ -A Diplomat performs official or covert actions. Covert acts make incidents\ - which let Senates break treaties. Diplomats in cities defend such acts with\ - combat. Diplomats can 1)Bribe a lone unit 2)Establish embassy 3)Investigate City\ - 4)Sabotage production/buildings 5)Steal tech 6)Steal maps 7)Incite city revolt.\n\ -"), _("\ -Full rules for Diplomats are in the Manual.\ -") - -[unit_spy] -name = _("Spy") -class = "Land" -tech_req = "Espionage" -obsolete_by = "None" -graphic = "u.spy" -graphic_alt = "-" -sound_move = "m_spy" -sound_move_alt = "m_generic" -sound_fight = "f_spy" -sound_fight_alt = "f_generic" -build_cost = 35 -pop_cost = 0 -attack = 0 -defense = 0 -hitpoints = 10 -firepower = 1 -move_rate = 6 -vision_radius_sq = 8 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -flags = "Diplomat", "IgZOC", "NonMil", "HasNoZOC", "Spy", - "Provoking", "Expellable" -veteran_names = - _("?spy_level:informant"), - _("?spy_level:handler"), - _("?spy_level:agent"), - _("?spy_level:operative"), - _("?spy_level:secret agent"), - _("?spy_level:neutralizer"), - _("?spy_level:spymaster") - -veteran_raise_chance = 50, 33, 20, 15, 15, 15, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 105, 110, 115, 120, 125, 130 -veteran_move_bonus = 0, 0, 0, 0, 0, 0, 0 -roles = "DiplomatStartUnit" -helptext = _("\ -Spies can do what a Diplomat can, and also 1)Survive ops\ - 2)Sabotage lone units 3)Poison city water 4)Steal specific tech\ - 5)Steal tech from cities more than once 6)Sabotage specific targets.\ -"), _("\ -Spies who survive ops escape to the nearest friendly city. Spies have\ - a 25% advantage over Diplomats in combat: a base 75% chance to win.\ - Full rules are in the Manual.\ -") - -[unit_caravan] -name = _("Caravan") -class = "Land" -tech_req = "Trade" -obsolete_by = "Freight" -graphic = "u.caravan" -graphic_alt = "-" -sound_move = "m_caravan" -sound_move_alt = "m_generic" -sound_fight = "f_caravan" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -flags = "HelpWonder", "TradeRoute", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Expellable" -roles = "AttackStrongStartUnit" ;note: MP2 doesn't start games with ASSU's so has co-opted this for caravan start unit. -helptext = _("\ -Caravans are Commerce units. In cities with whom you are not at war, Commerce units\ - help build Wonders or set up Traderoutes, increasing net trade in both cities\ - relative to combined trade (minimum city distance: 12 tiles.) Routes are inactive in\ - war but renew if war ends. Caravans can enter the Marketplace of foreign cities to sell\ - goods: revenue derives from total trade in both cities. Commerce units can finish a Wonder\ - on the same turn it starts.\ -") - -[unit_freight] -name = _("Freight") -class = "Land" -tech_req = "The Corporation" -obsolete_by = "None" -graphic = "u.freight" -graphic_alt = "-" -sound_move = "m_freight" -sound_move_alt = "m_generic" -sound_fight = "f_freight" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -flags = "HelpWonder", "TradeRoute", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Expellable" -roles = "" -helptext = _("\ -The Freight unit replaces the Caravan as the basic Commerce unit on Land. It moves at\ - twice the speed. Each Freight used to build a wonder will add 50 shields. See the\ - entry on Caravan to read what Commerce units may do.\ -") - -[unit_explorer] -name = _("Explorer") -class = "Land" -tech_req = "Seafaring" -obsolete_by = "Partisan" -graphic = "u.explorer" -graphic_alt = "-" -sound_move = "m_explorer" -sound_move_alt = "m_generic" -sound_fight = "f_explorer" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -flags = "IgTer", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Expellable" -roles = "Explorer", "ExplorerStartUnit" -helptext = _("\ -Explorers are brave individuals who map unknown territory. They can slip through enemy\ - ZOC, and have no unit upkeep.\ -") - -[unit_leader] -name = _("?unit:Leader") -class = "Land" -tech_req = "None" -obsolete_by = "None" -graphic = "u.leader" -graphic_alt = "u.explorer" -sound_move = "m_leader" -sound_move_alt = "m_generic" -sound_fight = "f_leader" -sound_fight_alt = "f_generic" -build_cost = 10 -pop_cost = 0 -attack = 0 -defense = 2 -hitpoints = 20 -firepower = 1 -move_rate = 4 -vision_radius_sq = 8 -convert_to = "Queen" -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -flags = "IgZOC", "NonMil", "HasNoZOC", "NoBuild", "NoHome", "SuperSpy", - "EvacuateFirst", "Unbribable", "GameLoss", "Unique", - "Provoking" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "KingStartUnit" -helptext = _("\ -This is you. If you lose this unit, you lose the game.\ -"), _("\ -Will not unleash barbarians from huts.\ -"), _("\ -You can use the DO command to change the gender of the Leader.\ -") - -[unit_queen] -name = _("?unit:Queen") -class = "Land" -tech_req = "None" -obsolete_by = "None" -graphic = "u.queen" -graphic_alt = "u.leader" -sound_move = "m_leader" -sound_move_alt = "m_generic" -sound_fight = "f_leader" -sound_fight_alt = "f_generic" -build_cost = 10 -pop_cost = 0 -attack = 0 -defense = 2 -hitpoints = 20 -firepower = 1 -move_rate = 4 -vision_radius_sq = 8 -convert_to = "Leader" -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -flags = "IgZOC", "NonMil", "HasNoZOC", "NoBuild", "NoHome", "SuperSpy", - "EvacuateFirst", "Unbribable", "GameLoss", "Unique", - "Provoking" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "KingStartUnit" -helptext = _("\ -(Alternate form of Leader. Behaves identically in-game.)\ - This is you. If you lose this unit, you lose the game.\ -"), _("\ -Will not unleash barbarians from huts.\ -"), _("\ -You can use the DO command to change the gender of the Leader.\ -") - - -[unit_barbarian_leader] -name = _("Barbarian Leader") -class = "Land" -tech_req = "None" -obsolete_by = "None" -graphic = "u.barbarian_leader" -graphic_alt = "u.diplomat" -sound_move = "m_barbarian_leader" -sound_move_alt = "m_generic" -sound_fight = "f_barbarian_leader" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 0 -defense = 0 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -flags = "IgZOC", "NonMil", "HasNoZOC", "Unbribable", - "EvacuateFirst", "SuperSpy", "NoHome", "NoBuild" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "BarbarianLeader" -helptext = _("\ -One Barbarian Leader appears every time there is a barbarian uprising\ - somewhere in the world.\ -"), _("\ -When a Barbarian Leader is killed on a tile without any defending units,\ - the 100 gold ransom is paid, but only to land units and helicopters.\ -") diff --git a/freeciv/freeciv/data/Makefile.am b/freeciv/freeciv/data/Makefile.am index 630432ad2..c0dbfbff8 100644 --- a/freeciv/freeciv/data/Makefile.am +++ b/freeciv/freeciv/data/Makefile.am @@ -39,7 +39,12 @@ SRV_RE_FILES = \ civ2civ3.serv \ sandbox.serv \ mpplus.serv \ - mp2.serv + mp2.serv \ + mp2-ag.serv \ + mp2-brava.serv \ + mp2-caravel.serv \ + mp2c-desert.serv \ + mp2c-occ.serv if SERVER SERVER_FILES = $(SRV_RE_FILES) @@ -79,7 +84,12 @@ EXTRA_DIST = \ civ2civ3.serv \ sandbox.serv \ mpplus.serv \ - mp2.serv + mp2.serv \ + mp2-ag.serv \ + mp2-brava.serv \ + mp2-caravel.serv \ + mp2c-desert.serv \ + mp2c-occ.serv if CLIENT CLIENTDATADIRS = amplio2 misc flags buildings cimpletoon isotrident trident\ @@ -88,7 +98,7 @@ else CLIENTDATADIRS = endif -SRV_RE_DATADIRS = default classic civ1 civ2 sandbox multiplayer alien civ2civ3 webperimental mpplus mp2 nation +SRV_RE_DATADIRS = default classic civ1 civ2 sandbox multiplayer alien civ2civ3 webperimental mpplus mp2 nation mp2-ag mp2-brava mp2-caravel mp2c-desert mp2c-occ if SERVER SERVERDATADIRS = $(SRV_RE_DATADIRS) scenarios else diff --git a/freeciv/freeciv/data/ag/README.ag b/freeciv/freeciv/data/ag/README.ag deleted file mode 100644 index 2af4c4616..000000000 --- a/freeciv/freeciv/data/ag/README.ag +++ /dev/null @@ -1,31 +0,0 @@ -AG: Avant-garde ruleset -------------------------------------- -LINKS: -Full Game Manual -Multiplayer II Summary -Design Log -... -Terrain -Bases -Combat -Governments -Economy -Diplomacy -Diplomatic Odds Charts -... -Terrain+Base Defense Bonus Quick-Reference -Hotkeys and Mouse Control - -The Avant-garde ruleset is a modernized ruleset to take advantage of cutting-edge advancements in Freeciv Server development. -Compared to Multiplayer-Evolution (MP2), the differences are that it is less restrained to keep the same "DNA" as the other -MP-branch rulesets, and allows itself to import features, improvements, and novel ideas from all other versions of Freeciv, -later versions of the commercial series, as well as original ideas from players. - -This ruleset began using MP2 as its base and added to it. Enjoy! - ------------------------------ -Changes from MP2: ------------------------------ -Hotkeys and Mouse Control - -END. \ No newline at end of file diff --git a/freeciv/freeciv/data/ag/cities.ruleset b/freeciv/freeciv/data/ag/cities.ruleset deleted file mode 100644 index 9a4ee3bf8..000000000 --- a/freeciv/freeciv/data/ag/cities.ruleset +++ /dev/null @@ -1,186 +0,0 @@ -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -[datafile] -description="Cities data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -; /* <-- avoid gettext warnings -; -; A specialist is a city citizen who is not a tile worker. Usually the -; player can control what specialist each citizen is, so long as the -; requirements for that specialist are met. -; -; Below are the entries for the specialists, one per specialist type. -; The tag name (in [specialist_*]) doesn't matter so long as it's unique. -; For each specialist the following fields may be set: -; -; -; name = translatable (plural) name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; if -; not present, "name" is used for this purpose too. Since -; the name used in savegames must not change, if you want -; to rename an item after a ruleset has been released, you -; should set "rule_name" to the original value of "name". -; short_name = one-character "short name" used (for instance) in cityrep; -; should be first character/abbrevation of "name" -; graphic = tag specifying preferred graphic -; Different images based on citizen number are supported. -; If no such images indexed with citizen number are found, -; plain tag is used instead. -; graphic_alt = fallback graphic tag in case the specialist graphic isn't -; found. -; reqs = requirements to have the specialist pick (see -; effects.ruleset and README.effects for help on requirements) -; helptext = optional help text string; should escape all raw newlines -; so that xgettext parsing works -; -; */ <-- avoid gettext warnings - -[specialist_elvis] -name = _("Entertainers") -; (The original specialist names in the classic ruleset and derivatives were -; not designed to be user-visible.) -rule_name = "elvis" -short_name = _("?Elvis:E") -graphic = "specialist.entertainer" -reqs = - { "type", "name", "range" -; Nothing - } -helptext = _("\ -Each Entertainer produces two luxury points for their city per turn. \ -See the section on Happiness for the effects of luxury points.\ -") - -[specialist_scientist] -name = _("Scientists") -rule_name = "scientist" -short_name = _("?Scientist:S") -graphic = "specialist.scientist" -reqs = - { "type", "name", "range" -; Nothing - } -helptext = _("\ -Each Scientist adds three points to your empire's research output \ -per turn.\ -") - -[specialist_taxman] -name = _("Taxmen") -rule_name = "taxman" -short_name = _("?Taxman:T") -graphic = "specialist.taxman" -reqs = - { "type", "name", "range" -; Nothing - } -helptext = _("\ -Each tax collector produces three extra gold for your treasury \ -per turn.\ -") - -[specialist_worker] -name = _("Laborer") -; (The original specialist names in the classic ruleset and derivatives were -; not designed to be user-visible.) -rule_name = "worker" -short_name = _("?Laborer:L") -graphic = "specialist.worker" -reqs = - { "type", "name", "range" -; Nothing - } -helptext = _("\ -Each Laborer produces one production point for their city per turn. \ -") - -[specialist_merchant] -name = _("Merchant") -; (The original specialist names in the classic ruleset and derivatives were -; not designed to be user-visible.) -rule_name = "merchant" -short_name = _("?Merchant:M") -graphic = "specialist.merchant" -reqs = - { "type", "name", "range" -; Nothing - } -helptext = _("\ -Each Merchant produces two trade points for their city per turn.\ - Trade will then be partioned by your nation's tax rates into\ - Gold, Science, and Luxury.\ -") - -[specialist_farmer] -name = _("Farmer") -; (The original specialist names in the classic ruleset and derivatives were -; not designed to be user-visible.) -rule_name = "farmer" -short_name = _("?Farmer:F") -graphic = "specialist.farmer" -reqs = - { "type", "name", "range" -; Nothing - } -helptext = _("\ -Each Farmer provides one food for their city per turn. Yet each\ - citizen consumes 2 food/turn. Assigning a farmer may be useful\ - for a citizen who otherwise produces no food.\ -") - - - -[parameters] -add_to_size_limit = 40 ; cities >= this cannot be added to. -angry_citizens = TRUE ; set to FALSE to disable angry citizens -celebrate_size_limit = 3 ; cities >= can celebrate - -changable_tax = TRUE ; set to FALSE to disallow changing of tax rates -;forced_science = 0 ; set these fields when changeable_tax is turned off -;forced_luxury = 100 -;forced_gold = 0 - -vision_reveal_tiles = TRUE ; civ1 & 2 default FALSE - -pop_report_zeroes = 4 ; Population in reports in tens of thousands - -[citizen] -nationality = TRUE ; account for the nationality of the citizens -convert_speed = 1000 ; base probability 333/1000 -> once every 3 turns -partisans_pct = 0 ; percentage of own nationality to inspire partisans - ; if 0, original city owner information is used instead -conquest_convert_pct = 34 ; percentage which converts to the new nation - ; after a city was conquered. Applied separately for each - ; nationality present in the city, and number of - ; converted people rounded up - -[missing_unit_upkeep] -; Get rid of a unit the city is unable to pay the X upkeep of. -; X_protected - never get rid of a unit with any of the listed unit type -; flags. -; X_unit_act - have the unit perform the listed actions until success, -; death or the list ends. -; X_wipe - wipe the unit if it survived performing the actions listed -; above. - -food_protected = "EvacuateFirst" -; food_unit_act = -food_wipe = TRUE - -; TODO: Should missing gold upkeep really be able to kill units with the -; EvacuateFirst unit type flag? -; gold_protected = -; gold_unit_act = -gold_wipe = TRUE - -shield_protected = "EvacuateFirst" -shield_unit_act = "Help Wonder", "Recycle Unit", "Disband Unit" -shield_wipe = FALSE diff --git a/freeciv/freeciv/data/ag/governments.ruleset b/freeciv/freeciv/data/ag/governments.ruleset deleted file mode 100644 index e82d20e80..000000000 --- a/freeciv/freeciv/data/ag/governments.ruleset +++ /dev/null @@ -1,245 +0,0 @@ - -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -; Note that the freeciv AI may not cope well with anything more -; than minor changes. - -[datafile] -description="Avant-garde governments data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -[governments] -during_revolution="Anarchy" - -; /* <-- avoid gettext warnings -; -; Below: The individual government types, one per section. -; -; The actual tag used (the * in [government_*]) does not matter, except -; it must be unique within this file, and it may be used in debug -; output when reading this file. -; -; For the "official" rulesets, the order of these sections should not -; be changed because that would break backward compatability with -; savegames. (In particular, if Fundamentalism is added to default -; ruleset, should be added at end.) -; -; Notes on fields: -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; if -; not present, "name" is used for this purpose too. Since -; the name used in savegames must not change, if you want -; to rename an item after a ruleset has been released, you -; should set "rule_name" to the original value of "name". -; reqs = requirements for this government (see README.effects) -; graphic = tag specifing preferred graphic -; graphic_alt = alternate graphics tag if preferred is not found; -; should be a standard tag if preferred is not; -; otherwise may be "-" -; ai_better = AI will not consider this government for use if the -; government listed here is available -; ruler_titles = ruler titles by nation, "-" is default, and non-matched -; nations are ignored -; helptext = optional help text string; should escape all raw newlines -; so that xgettext parsing works -; -; */ <-- avoid gettext warnings - -;------------------------------------------------------------------------ -[government_anarchy] - -name = _("Anarchy") -; No reqs -graphic = "gov.anarchy" -graphic_alt = "-" - -ruler_male_title = _("Warlord %s") -ruler_female_title = _("Warlady %s") - -helptext = _("\ -Anarchy is simply the absence of any recognizable government.\ - Citizens are disorganized and unproductive, and will spend all\ - income as quickly as possible, rather than paying taxes or\ - conducting research.\ -"), _("\ -Anarchy offers slightly less corruption than Despotism,\ - but slightly more unhappiness.\ -") - -;------------------------------------------------------------------------ -[government_despotism] - -name = _("Despotism") -; No reqs -graphic = "gov.despotism" -graphic_alt = "-" -ai_better = "Monarchy" - -ruler_male_title = _("Chief %s") -ruler_female_title = _("?female:Chief %s") - -helptext = _("\ -Under Despotism, you are the absolute ruler of your people. Your\ - control over your citizens is maintained largely by martial law.\ -"), _("\ -Despotism suffers the highest level of corruption of all\ - forms of government.\ -") - -;------------------------------------------------------------------------ -[government_monarchy] - -name = _("Monarchy") -reqs = { "type", "name", "range" - "tech", "Monarchy", "Player" - } -graphic = "gov.monarchy" -graphic_alt = "-" -ai_better = "Communism" - -ruler_male_title = _("King %s") -ruler_female_title = _("Queen %s") - -helptext = _("\ -Under Monarchy, a king or queen serves as a hereditary figurehead\ - for your government.\ -"), _("\ -Monarchy suffers the same small amount of corruption that\ - the Republic does.\ -") - -;------------------------------------------------------------------------ -[government_communism] - -name = _("Communism") -reqs = { "type", "name", "range" - "tech", "Communism", "Player" - } -graphic = "gov.communism" -graphic_alt = "-" - -ruler_male_title = _("Comrade %s") -ruler_female_title = _("?female:Comrade %s") - -helptext = _("\ -In Communism, all work, output, and goods are owned by the state.\ -"), _("\ -Corruption does not vary by distance from the capital;\ - all cities have the same base level of corruption. Each city gets 4\ - units free of upkeep. Buildings with 1 upkeep are free.\ - The capital city with Palace gets a +25% production bonus.\ -"), _("\ -Communist governments get a cost discount of -5 on Riflemen and -10\ - on Dive Bombers.\ -"), _("\ -Communist states can transfer Proletarians between cities to\ - re-distribute population. Large numbers of Proletarians can be\ - used to finish State projects. The Communism tech allows a\ - Communist government to conscript Workers to Riflemen and vice\ - versa, if inside national territory and if possessing the necessary\ - technologies.\ -") - -;------------------------------------------------------------------------ -[government_republic] - -name = _("Republic") -reqs = { "type", "name", "range" - "tech", "The Republic", "Player" - } -graphic = "gov.republic" -graphic_alt = "-" - -ruler_male_title = _("President %s") -ruler_female_title = _("?female:President %s") - -helptext = _("\ -Under a Republican government, citizens hold an election to select a\ - representative who will govern them; since elected leaders must\ - remain popular to remain in control, citizens are given a greater\ - degree of freedom. Citizens under the Republic become unhappy\ - easily, but the self-sufficiency of your citizens allows high levels\ - of trade.\ -") - -;------------------------------------------------------------------------ -[government_democracy] - -name = _("Democracy") -reqs = { "type", "name", "range" - "tech", "Democracy", "Player" - } -graphic = "gov.democracy" -graphic_alt = "-" - -ruler_male_title = _("Prime Minister %s") -ruler_female_title = _("?female:Prime Minister %s") - -helptext = _("\ -Under Democracy, citizens govern directly by voting on issues.\ - Democracy offers the highest possible level of trade, but also\ - offers the most potential for unhappiness. There is no corruption\ - during Democracy, but citizens become very upset during\ - wars.\ -") - -;------------------------------------------------------------------------ -[government_fundamentalism] - -name = _("Fundamentalism") -reqs = { "type", "name", "range" - "tech", "Fundamentalism", "Player" - } -graphic = "gov.fundamentalism" -graphic_alt = "-" - -ruler_male_title = _("High Priest %s") -ruler_female_title = _("High Priestess %s") - -helptext = _("\ -Fundamentalism is organized around central beliefs, usually religious. These form\ - rigid guidelines for the actions of the rulers and the people.\ -"), _("\ -The people are entirely devoted to their beliefs, and are often willing to die to\ - preserve them.\ -"), _("\ -Improvements that convert unhappy citizens to content produce gold tithes equal to\ - the number of citizens they would convert. Fanatics cannot be bribed. Palace\ - gives +50% to gold income in its city. In each city, two military units may impose\ - martial law, making one citizen each content. Pilgrims can be used to migrate and\ - grow the population in the cities directed by the ruling High Priest.\ -") - -; /* <-- avoid gettext warnings -; -; Multipliers (aka policies) -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets -; etc; if not present, "name" is used for this -; purpose too. Since the name used in savegames must -; not change, if you want to rename an item after a -; ruleset has been released, you should set -; "rule_name" to the original value of "name". -; default = default value (as presented in UI) -; start = minimum value (as presented in UI) -; stop = maximum value (as presented in UI) -; step = minimum increase/decrease (as presented in UI) -; offset = offset/factor control how UI values are turned -; factor = into effect values for use in effects.ruleset. -; effect_value = (ui_value + offset) * (factor/100) -; Optional; by default offset=0, factor=100, so -; that UI values are used as-is. -; reqs = requirements for adjusting this policy (see README.effects) -; helptext = optional help text string; should escape all raw -; newlines so that xgettext parsing works -; -; */ <-- avoid gettext warnings diff --git a/freeciv/freeciv/data/ag/nations.ruleset b/freeciv/freeciv/data/ag/nations.ruleset deleted file mode 100644 index 85937b425..000000000 --- a/freeciv/freeciv/data/ag/nations.ruleset +++ /dev/null @@ -1,62 +0,0 @@ - -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -[datafile] -description="Avant-garde nations data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -; This section contains meta information for freeciv-ruledit to recreate the ruleset -; file in a form wanted. These have no in-game effect whatsoever -[ruledit] - -; Nationlist to add include statement for. If this entry is omitted, all the nations -; will be saved to nations.ruleset itself. -nationlist = "default/nationlist.ruleset" - -; List of nations to embed to main nations.ruleset despite separate nationlist -; being used for other nations. -embedded_nations = "barbarian", "pirate" - -[compatibility] -; Initial government for all the nations that do not -; have it explicitly defined -default_government = "Despotism" - -[default_traits] -; Default values for the AI traits. These are used if nation specific -; value for some trait has not been used. If these default too are -; not defined, the ultimate default is 50. -; _min and _max give the range from which the trait value -; is randomly chosen for a given AI player unless 'traitdistribution' -; server setting is 'FIXED' -; _default is the exaxt trait value used when 'traitdistribution' -; is 'FIXED'. If _default has not been given, it's set to the -; midpoint between _min and _max. - -; Value of trait "expansionist" defines how much AI wants to settle new territory. -expansionist_min = 30 -expansionist_max = 90 -expansionist_default = 50 - -; Value of trait "trader" defines how much AI wants to establish trade routes. -trader_min = 30 -trader_max = 90 -trader_default = 50 - -; Value of trait "aggressive" defines how easily AI declares war. -aggressive_min = 30 -aggressive_max = 90 -aggressive_default = 50 - -; Please keep [ruledit] section in sync with these includes -*include "default/nationlist.ruleset" -; This ruleset uses model of two separate barbarian nations -*include "nation/barbarian.ruleset" -*include "nation/pirate.ruleset" diff --git a/freeciv/freeciv/data/ag/parser.lua b/freeciv/freeciv/data/ag/parser.lua deleted file mode 100644 index ea4bf8c53..000000000 --- a/freeciv/freeciv/data/ag/parser.lua +++ /dev/null @@ -1,13 +0,0 @@ --- Freeciv - Copyright (C) 2007 - The Freeciv Project --- This program is free software; you can redistribute it and/or modify --- it under the terms of the GNU General Public License as published by --- the Free Software Foundation; either version 2, or (at your option) --- any later version. --- --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU General Public License for more details. - --- This file is for lua-functionality for parsing luadata.txt --- of this ruleset. diff --git a/freeciv/freeciv/data/ag/styles.ruleset b/freeciv/freeciv/data/ag/styles.ruleset deleted file mode 100644 index cc690357f..000000000 --- a/freeciv/freeciv/data/ag/styles.ruleset +++ /dev/null @@ -1,265 +0,0 @@ - -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -[datafile] -description="Nation theme data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -; /* <-- avoid gettext warnings -; -; Nation styles -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; if -; not present, "name" is used for this purpose too. Since -; the name used in savegames must not change, if you want -; to rename an item after a ruleset has been released, you -; should set "rule_name" to the original value of "name". -; -; */ <-- avoid gettext warnings - -[style_european] -name = _("?style:European") - -[style_classical] -name = _("?style:Classical") - -[style_tropical] -name = _("?style:Tropical") - -[style_asian] -name = _("?style:Asian") - -[style_babylonian] -name = _("?style:Babylonian") - -[style_celtic] -name = _("?style:Celtic") - -; /* <-- avoid gettext warnings -; -; City styles define the way cities are drawn -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; if -; not present, "name" is used for this purpose too. Since -; the name used in savegames must not change, if you want -; to rename an item after a ruleset has been released, you -; should set "rule_name" to the original value of "name". -; graphic = group of tiles to use, see cities spec for -; more info on city tiles -; citizens_graphic = group of citizens tiles to use, see citizens/small -; spec for more info on citizens tiles -; FIXME: this and _alt not currently used! -; reqs = requirements for this city style (see README.effects) -; -; */ <-- avoid gettext warnings - -[citystyle_european] -name = _("?citystyle:European") -graphic = "city.european" -graphic_alt = "-" -citizens_graphic = "ancient" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "Style", "European", "Player" - } - -[citystyle_classical] -name = _("?citystyle:Classical") -graphic = "city.classical" -graphic_alt = "-" -citizens_graphic = "ancient" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "Style", "Classical", "Player" - } - -[citystyle_tropical] -name = _("?citystyle:Tropical") -graphic = "city.tropical" -graphic_alt = "city.european" -citizens_graphic = "ancient" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "Style", "Tropical", "Player" - } - -[citystyle_asian] -name = _("?citystyle:Asian") -graphic = "city.asian" -graphic_alt = "city.classical" -citizens_graphic = "ancient" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "Style", "Asian", "Player" - } - -[citystyle_babylonian] -name = _("?citystyle:Babylonian") -graphic = "city.babylonian" -graphic_alt = "city.classical" -citizens_graphic = "ancient" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "Style", "Babylonian", "Player" - } - -[citystyle_celtic] -name = _("?citystyle:Celtic") -graphic = "city.celtic" -graphic_alt = "city.european" -citizens_graphic = "ancient" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "Style", "Celtic", "Player" - } - -[citystyle_industrial] -name = _("?citystyle:Industrial") -graphic = "city.industrial" -graphic_alt = "-" -citizens_graphic = "industrial" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "tech", "Railroad", "Player" - } - -[citystyle_electric] -name = _("?citystyle:ElectricAge") -graphic = "city.electricage" -graphic_alt = "city.modern" -citizens_graphic = "electricage" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "tech", "Automobile", "Player" - } - -[citystyle_modern] -name = _("?citystyle:Modern") -graphic = "city.modern" -graphic_alt = "-" -citizens_graphic = "modern" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "tech", "Rocketry", "Player" - } - -[citystyle_postmodern] -name = _("?citystyle:PostModern") -graphic = "city.postmodern" -graphic_alt = "-" -citizens_graphic = "postmodern" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "tech", "Superconductors", "Player" - } - -; /* <-- avoid gettext warnings -; -; Music styles -; -; Order is important. The last one for which activation requirements -; are fulfilled is the one that plays. -; -; music_peaceful = Music to play when nation in peaceful mood -; music_combat = Music to play when nation in combat mood -; reqs = requirements to activate the style (see effects.ruleset -; and README.effects for help on requirements) -; -; */ <-- avoid gettext warnings - -[musicstyle_european] -music_peaceful = "music_european_peace" -music_combat = "music_european_combat" -reqs = - { "type", "name", "range" - "Style", "European", "Player" - } - -[musicstyle_classical] -music_peaceful = "music_classical_peace" -music_combat = "music_classical_combat" -reqs = - { "type", "name", "range" - "Style", "Classical", "Player" - } - -[musicstyle_tropical] -music_peaceful = "music_tropical_peace" -music_combat = "music_tropical_combat" -reqs = - { "type", "name", "range" - "Style", "Tropical", "Player" - } - -[musicstyle_asian] -music_peaceful = "music_asian_peace" -music_combat = "music_asian_combat" -reqs = - { "type", "name", "range" - "Style", "Asian", "Player" - } - -[musicstyle_babylonian] -music_peaceful = "music_babylonian_peace" -music_combat = "music_babylonian_combat" -reqs = - { "type", "name", "range" - "Style", "Babylonian", "Player" - } - -[musicstyle_celtic] -music_peaceful = "music_celtic_peace" -music_combat = "music_celtic_combat" -reqs = - { "type", "name", "range" - "Style", "Celtic", "Player" - } - -[musicstyle_renaissance] -music_peaceful = "music_renaissance_peace" -music_combat = "music_renaissance_combat" -reqs = - { "type", "name", "range" - "Tech", "University", "Player" - } - -[musicstyle_industrial] -music_peaceful = "music_industrial_peace" -music_combat = "music_industrial_combat" -reqs = - { "type", "name", "range" - "Tech", "Railroad", "Player" - } - -[musicstyle_electricage] -music_peaceful = "music_electricage_peace" -music_combat = "music_electricage_combat" -reqs = - { "type", "name", "range" - "Tech", "Automobile", "Player" - } - -[musicstyle_modern] -music_peaceful = "music_modern_peace" -music_combat = "music_modern_combat" -reqs = - { "type", "name", "range" - "Tech", "Rocketry", "Player" - } - -[musicstyle_postmodern] -music_peaceful = "music_postmodern_peace" -music_combat = "music_postmodern_combat" -reqs = - { "type", "name", "range" - "Tech", "Superconductors", "Player" - } diff --git a/freeciv/freeciv/data/alien/README.alien b/freeciv/freeciv/data/alien/README.alien index 42a0481fa..290d2932e 100644 --- a/freeciv/freeciv/data/alien/README.alien +++ b/freeciv/freeciv/data/alien/README.alien @@ -1,124 +1,52 @@ - -=============================== -Alien World ruleset for Freeciv -=============================== - -Design Philosophy: ------------------- - -Alien ruleset is very different from standard rules - it -has been one of the design goals of the ruleset that it -should provide users with "second game" to play with -Freeciv. We hope you can enjoy both more standard rulesets -and Alien ruleset, not selecting just one of them to play. - - -More info: ----------- - -Before Alien World was made part of official Freeciv -distribution, it was developet independently and was -available from cazfi.net. Documentation of the last -cazfi.net version is available from -http://www.cazfi.net/freeciv/alien/dev/ -Though some bits are outdated, it's still the most -comprehensive documentation of the Alien World ruleset. - - -Changes since last cazfi.net document version ---------------------------------------------- - -This list is incomplete - -- Citizens convert to city owning nationality over time - -- Population is measered in hundreds in reports - -- Road type "Tunnel" can be built to radiating tiles only - -- Techs cannot be stolen from Lunatics or Madmen - -- Intercontinental traderoutes give same trade than routes - within one continent. International routes give three - times as much trade as national ones - -- Once player knows "Ocean Cities" tech, borders extend - to oceanic tiles just like land tiles - -- Players are guaranteed to start from a Earthly units - reachable area of at least 15 tiles - -- Explorer cost reduced to 20 shields - -- Road type "Tunnel" provides 35% defense bonus for units - inside - -- Burrow Tubes can be built only to connect existing burrow tubes, first - one needs to be adjacent to a land tile - -- Amphibious and Antigravity units kill citizens after succesfull - attack against a city, Burrowing units do not - -- There's two river types. Earthly units do not gain movement - bonus from them. Both give trade bonus. Green River gives also - food bonus, and Brown River production bonus. Both give - defense bonus counted on natural defense layer. - -- There can never be civil war - -- Each movement point is divided to 4 fragments. IgTer movement - costs 2 fragments, river movement 2, road 2, highway 1. - -- Specialists have been renamed, but their effects remain the same - Elvis -> Culturists - Scientist -> Scientists - Taxman -> Government Merchants - -- Governments production and trade adjustments have been changed to be - always positive. Old negative values have turned to 0, and old 0 and - positive values have been increased accordingly. - +Design Philosophy: +Alien ruleset is very different from standard rules • it has been one of the design goals of the ruleset that it should provide users with "second game" to play with Freeciv. We hope you can enjoy both more standard rulesets and Alien ruleset, not selecting just one of them to play. + +More info: +Before Alien World was made part of official Freeciv distribution, it was developed independently and was available from cazfi.net. Documentation of the last cazfi.net version is available from the link below. Though some bits are outdated, it's still the most comprehensive documentation of the Alien World ruleset. +Alien Ruleset Documentation + +Changes since last cazfi.net document version +This list is incomplete: +• Citizens convert to city owning nationality over time +• Population is measered in hundreds in reports +• Road type "Tunnel" can be built to radiating tiles only +• Techs cannot be stolen from Lunatics or Madmen +• Intercontinental traderoutes give same trade than routes within one continent. International routes give three times as much trade as national ones +• Once player knows "Ocean Cities" tech, borders extend to oceanic tiles just like land tiles +• Players are guaranteed to start from a Earthly units reachable area of at least 15 tiles +• Explorer cost reduced to 20 shields +• Road type "Tunnel" provides 35% defense bonus for units inside +• Burrow Tubes can be built only to connect existing burrow tubes, first one needs to be adjacent to a land tile +• Amphibious and Antigravity units kill citizens after succesful attack against a city, Burrowing units do not +• There's two river types. Earthly units do not gain movement bonus from them. Both give trade bonus. Green River gives also food bonus, and Brown River production bonus. Both give defense bonus counted on natural defense layer. +• There can never be civil war +• Each movement point is divided to 4 fragments. IgTer movement costs 2 fragments, river movement 2, road 2, highway 1. +• Specialists have been renamed, but their effects remain the same + Entertainer -> Culturists + Scientist -> Scientists + Taxman -> Government Merchants +• Governments production and trade adjustments have been changed to be always positive. Old negative values have turned to 0, and old 0 and positive values have been increased accordingly. Gov: prod/trade Despotism: 0 / 0 Communism: 20% / 0 Democracy: 0 / 20% Dual Communism: 40% / 20% Dual Democracy: 20% / 40% - -- Math Club gets only 30% bonus to science - -- There's third veterancy level, "Superb", that is available only for - units built by Team Gladiators in a city with Training Facility - -- Cities cannot be built on Boiling Ocean tiles. - -- Cities of Adventurers can grow one size bigger than cities of other - factions in lack of Basic Infrastructure or radiation fighting methods - -- Increased unit move rates: +• Math Club gets only 30% bonus to science +• There's third veterancy level, "Superb", that is available only for units built by Team Gladiators in a city with Training Facility +• Cities cannot be built on Boiling Ocean tiles. +• Cities of Adventurers can grow one size bigger than cities of other factions in lack of Basic Infrastructure or radiation fighting methods +• Increased unit move rates: Ship: 3 Destroyer: 4 Light Saucer: 3 Bomb Saucer: 2 - -- Thick Mountains cannot be mined at all until Burrowing is known, but then - it requires just 17 movement points, road building time reduced to 12 movement - points - -- Empire size causes additional unhappiness only once every 15 bases (was 10), - and knowledge of Communication eases it so that the step is 20 bases - -- Added tech "Controlled Biomass" that provides new unit "Biomass" that can - transport Earthly and Amphibious units through Radiating tiles - -- Water Engineer build_cost increased to 40, like other City Founding units - -- Hex topology is used by default. On hex maps Transportation building - increases city radius to 2 tiles. - -- Stealth Spies cannot establish embassies. They are already granted by - "Communication" tech - -- Limited possible startunits to one weak unit type for each startunit role - -- Each turn is quarter of a year +• Thick Mountains cannot be mined at all until Burrowing is known, but then it requires just 17 movement points, road building time reduced to 12 movement points +• Empire size causes additional unhappiness only once every 15 bases (was 10), and knowledge of Communication eases it so that the step is 20 bases +• Added tech "Controlled Biomass" that provides new unit "Biomass" that can transport Earthly and Amphibious units through Radiating tiles +• Water Engineer build_cost increased to 40, like other City Founding units +• Stealth Spies cannot establish embassies. They are already granted by "Communication" tech +• Limited possible startunits to one weak unit type for each startunit role +• Each turn is quarter of a year + + diff --git a/freeciv/freeciv/data/alien/buildings.ruleset b/freeciv/freeciv/data/alien/buildings.ruleset index 4f90ab188..f8a791ba1 100644 --- a/freeciv/freeciv/data/alien/buildings.ruleset +++ b/freeciv/freeciv/data/alien/buildings.ruleset @@ -13,7 +13,7 @@ [datafile] description="Alien World buildings data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02" +options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" format_version=20 ; /* <-- avoid gettext warnings diff --git a/freeciv/freeciv/data/alien/cities.ruleset b/freeciv/freeciv/data/alien/cities.ruleset index 115f09483..b3fcf5f00 100644 --- a/freeciv/freeciv/data/alien/cities.ruleset +++ b/freeciv/freeciv/data/alien/cities.ruleset @@ -13,7 +13,7 @@ [datafile] description="Alien World cities data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02" +options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" format_version=20 ; /* <-- avoid gettext warnings diff --git a/freeciv/freeciv/data/alien/effects.ruleset b/freeciv/freeciv/data/alien/effects.ruleset index bb94fab63..aca9b74df 100644 --- a/freeciv/freeciv/data/alien/effects.ruleset +++ b/freeciv/freeciv/data/alien/effects.ruleset @@ -13,7 +13,7 @@ [datafile] description="Alien World effects data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02" +options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" format_version=20 ; /* <-- avoid gettext warnings diff --git a/freeciv/freeciv/data/alien/game.ruleset b/freeciv/freeciv/data/alien/game.ruleset index 17b5b0ec3..c67af1724 100644 --- a/freeciv/freeciv/data/alien/game.ruleset +++ b/freeciv/freeciv/data/alien/game.ruleset @@ -13,7 +13,7 @@ [datafile] description="Alien World game rules for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02" +options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" format_version=20 ; This section contains meta information for freeciv-ruledit to recreate the ruleset @@ -739,7 +739,8 @@ actor_reqs = action = "Upgrade Unit" actor_reqs = { "type", "name", "range", "present" - "DiplRel", "Foreign", "Local", FALSE + "DiplRel", "Foreign", "Local", FALSE + "CityTile", "Center", "Local", TRUE } [actionenabler_airlift_unit] @@ -1314,7 +1315,7 @@ colorlist = ; freeciv game settings for the alien ruleset set = { "name", "value", "lock" - "topology", "WRAPX|WRAPY|ISO|HEX", FALSE + "topology", "WRAPX", FALSE "mapsize", "PLAYER", FALSE "tilesperplayer", 300, FALSE "aifill", 7, FALSE diff --git a/freeciv/freeciv/data/alien/governments.ruleset b/freeciv/freeciv/data/alien/governments.ruleset index 8f09a8e15..c6465f6aa 100644 --- a/freeciv/freeciv/data/alien/governments.ruleset +++ b/freeciv/freeciv/data/alien/governments.ruleset @@ -13,7 +13,7 @@ [datafile] description="Alien World governments data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02" +options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" format_version=20 [governments] diff --git a/freeciv/freeciv/data/alien/nations.ruleset b/freeciv/freeciv/data/alien/nations.ruleset index b1f917b25..f846056e2 100644 --- a/freeciv/freeciv/data/alien/nations.ruleset +++ b/freeciv/freeciv/data/alien/nations.ruleset @@ -10,7 +10,7 @@ [datafile] description="Alien World nations data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02" +options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" format_version=20 ; This section contains meta information for freeciv-ruledit to recreate the ruleset diff --git a/freeciv/freeciv/data/alien/styles.ruleset b/freeciv/freeciv/data/alien/styles.ruleset index 534d3741c..e9703a597 100644 --- a/freeciv/freeciv/data/alien/styles.ruleset +++ b/freeciv/freeciv/data/alien/styles.ruleset @@ -10,7 +10,7 @@ [datafile] description="Nation theme data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02" +options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" format_version=20 ; /* <-- avoid gettext warnings diff --git a/freeciv/freeciv/data/alien/techs.ruleset b/freeciv/freeciv/data/alien/techs.ruleset index 2e763cc4a..31223b116 100644 --- a/freeciv/freeciv/data/alien/techs.ruleset +++ b/freeciv/freeciv/data/alien/techs.ruleset @@ -13,7 +13,7 @@ [datafile] description="Alien World technology data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02" +options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" format_version=20 [control] diff --git a/freeciv/freeciv/data/alien/terrain.ruleset b/freeciv/freeciv/data/alien/terrain.ruleset index a94a52b40..33df9a190 100644 --- a/freeciv/freeciv/data/alien/terrain.ruleset +++ b/freeciv/freeciv/data/alien/terrain.ruleset @@ -13,7 +13,7 @@ [datafile] description="Alien World tile_type data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02" +options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" format_version=20 [control] diff --git a/freeciv/freeciv/data/alien/units.ruleset b/freeciv/freeciv/data/alien/units.ruleset index 711b64d3d..ddd9e8541 100644 --- a/freeciv/freeciv/data/alien/units.ruleset +++ b/freeciv/freeciv/data/alien/units.ruleset @@ -13,7 +13,7 @@ [datafile] description="Alien World unit data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02" +options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" format_version=20 [control] diff --git a/freeciv/freeciv/data/amplio2/STYLE_GUIDE.md b/freeciv/freeciv/data/amplio2/STYLE_GUIDE.md new file mode 100644 index 000000000..91e1e3fb2 --- /dev/null +++ b/freeciv/freeciv/data/amplio2/STYLE_GUIDE.md @@ -0,0 +1,71 @@ +# I. About the STYLE GUIDE FOR UNITS. + +The style guide is a "strong suggestion" and not a set of absolute rules. + +However: Proportions and dimensions of the current unit art is how it is +for a reason. Also shapes, styles, colours, and details are that way for +a reason as well. + +The guide has collected experience from evolutionary fixing of previous problems. +Volunteer artists are encouraged to meditate on the STYLE GUIDE FOR UNITS before +submitting proposed art. It may help greatly with improving the odds of approval, +and diminish the number of edits before approval. + +You may break with the guide when you feel that your artistic competence and judgment +transcend these abstract considerations. There is just greater risk of the work being +rejected or redone later, for the exact reasons which caused the STYLE GUIDE to be +written in the first place. + +# II. STYLE GUIDE FOR UNITS. + +1. **Differentiation and Recognition** +a. Differentiation is what causes the eye to rapidly identify a unit as the type it is +and not some other type. It consisit of prominent visual clues. Colours, angles, stances, +weapons, and other styles (like shields, belt buckles, fashion, etc.), when they are +strong, noticeable, and different from other unit types -- they all come together to help +the eye instantly differentiate the unit from similar looking units. People are playing "chess" +with hundreds of units all over the map... they need to quickly process the +visual info in the mind. +b. Recognition is what happens when the mind instantly differentiates a unit to identify it +effortlessly. + +2. **Familiarity** - There is a tradition for some units to look how they do. This isn't about +conservatism or "it's always been this way so why change?" It's actually part of differentiation +and recognition. A complete makeover of how a unit looks is not out of the question, but it +is much more well-received when it has a strong overlap with the style cues of the previous +graphics it's replacing. All players love upgraded graphics that make them still familiar with +the look of the unit. But only half will love upgraded looks that are not familiar and look +very dissimilar to the classic graphics they have learned to differentiate and recognise. + +3. **Ethnocultural ambiguity** - The units often represent 500 or 1000 year periods for units from tribes +all over the world. That's tough to pull off and can't be done perfectly. But anything that increases +ethnic ambiguity and overlaps many cultural/ethnic/racial/tribal divisions to find their commonality, +helps the entire ambience of the game as a global one. Any changes that diminish the ambiguity are +a strike against the proposed change. + +4. **Size and Fit** - At all screen resolutions, the units end up being very small on the screen. It's a +challenge to see them well, which is why #1 and #2 are ranked so high. The unit graphics should try to +maximize the space it lives inside of with palpable details and styling cues that differentiate it. +BAD: tiny units not boldly using their space or exhibiting much visible detail. GOOD: units which +use the space and size available to them to be recognisable, different, familiar, and well-detailed. + +THE SPACE: units live in 2:1 ratio polygons. (96:48 HD or 192:96 4K). It's very helpful when making +the art to superimpose it over a frame or trace-layer with this polygon, to see how to optimise and +maximise use of the space. + +5. **Polygon Fit Rules** - The 96x48 polygon only occupies half the space of a 96x48 rectangle. The corners +belong to other tiles. + (1) However, you will notice in screenshots of the units, that they aren't completely contained +inside the polygon, and some parts can go outside it into the corner regions of the 96x48 rectangle. + (2) You will also notice that on average, 95% of all pixels ARE inside the polygon. + +REASONS for (1): Units come in all shapes and sizes and it's not realistic to force them to fit completely +in the polygon. Fitting the natural shape into the polygon might force some shapes to be much smaller +than the relative size we'd expect them to have. For example, we don't expect a Battleship to be smaller +than a Boat, just so it can keep its real shape. + +REASONS for (2): Every pixel that goes outside the polygon risks clashing or overlapping with nearby units +whose pixels also go outside the polygon. If we are conservative and avoid these outer pixels except when +necessary, we also diminish the clash and overdrawn overlap of adjacent units. + +For 'outer pixels', use conservative judgment but don't be afraid where necessary. \ No newline at end of file diff --git a/freeciv/freeciv/data/amplio2/activities.png b/freeciv/freeciv/data/amplio2/activities.png index 4d601b793..15c52616c 100644 Binary files a/freeciv/freeciv/data/amplio2/activities.png and b/freeciv/freeciv/data/amplio2/activities.png differ diff --git a/freeciv/freeciv/data/amplio2/activities.spec b/freeciv/freeciv/data/amplio2/activities.spec index 7bee22aaa..16b775eca 100644 --- a/freeciv/freeciv/data/amplio2/activities.spec +++ b/freeciv/freeciv/data/amplio2/activities.spec @@ -50,6 +50,7 @@ tiles = { "row", "column", "tag" 2, 3, "unit.patrol" 2, 4, "unit.pillage" ; Lexxie 2, 5, "unit.hideout" ; Lexxie + 2, 6, "unit.fishing" ; Lexxie 3, 0, "unit.irrigate" 3, 1, "unit.plant" ; Lexxie @@ -57,6 +58,7 @@ tiles = { "row", "column", "tag" 3, 3, "unit.pollution" ; Lexxie 3, 4, "unit.fallout" ; Lexxie 3, 5, "unit.hidden" ; Lexxie + 3, 6, "unit.deepdive" ; Lexxie 4, 0, "unit.goto" ; Lexxie 4, 1, "unit.convert" ; Lexxie diff --git a/freeciv/freeciv/data/amplio2/animals.png b/freeciv/freeciv/data/amplio2/animals.png index c31f66d0e..33395771f 100644 Binary files a/freeciv/freeciv/data/amplio2/animals.png and b/freeciv/freeciv/data/amplio2/animals.png differ diff --git a/freeciv/freeciv/data/amplio2/bases.png b/freeciv/freeciv/data/amplio2/bases.png index 7d7d9c914..9c633b4c4 100644 Binary files a/freeciv/freeciv/data/amplio2/bases.png and b/freeciv/freeciv/data/amplio2/bases.png differ diff --git a/freeciv/freeciv/data/amplio2/cities.png b/freeciv/freeciv/data/amplio2/cities.png index 0560b8943..f85e51d3c 100644 Binary files a/freeciv/freeciv/data/amplio2/cities.png and b/freeciv/freeciv/data/amplio2/cities.png differ diff --git a/freeciv/freeciv/data/amplio2/cities.spec b/freeciv/freeciv/data/amplio2/cities.spec index 00e0c4ef6..9ae3be9ff 100644 --- a/freeciv/freeciv/data/amplio2/cities.spec +++ b/freeciv/freeciv/data/amplio2/cities.spec @@ -164,7 +164,7 @@ tiles = { "row", "column", "tag" 10, 1, "city.coastal_underlay" 10, 2, "city.fortifications_overlay" 10, 3, "city.fortifications_underlay" -; 10, 4, "city.citadel_overlay" -; 10, 5, "city.citadel_underlay" + 10, 4, "city.sam_overlay" +; 10, 5, unused 10, 6, "city.citadel_overlay" } diff --git a/freeciv/freeciv/data/amplio2/desert.png b/freeciv/freeciv/data/amplio2/desert.png index ea6add6d9..4d863259d 100644 Binary files a/freeciv/freeciv/data/amplio2/desert.png and b/freeciv/freeciv/data/amplio2/desert.png differ diff --git a/freeciv/freeciv/data/amplio2/grid.png b/freeciv/freeciv/data/amplio2/grid.png index f5c230f13..32ea3f739 100644 Binary files a/freeciv/freeciv/data/amplio2/grid.png and b/freeciv/freeciv/data/amplio2/grid.png differ diff --git a/freeciv/freeciv/data/amplio2/grid.spec b/freeciv/freeciv/data/amplio2/grid.spec index 3da4b7682..8cd952bcf 100644 --- a/freeciv/freeciv/data/amplio2/grid.spec +++ b/freeciv/freeciv/data/amplio2/grid.spec @@ -47,4 +47,6 @@ tiles = { "row", "column", "tag" 3, 2, "grid.userspot" 3, 3, "grid.pollute_ring" 3, 4, "grid.pollute_icon" + + 3, 5, "grid.map" } diff --git a/freeciv/freeciv/data/amplio2/swamp.spec b/freeciv/freeciv/data/amplio2/swamp.spec index bfe4be384..7d4d3a89c 100644 --- a/freeciv/freeciv/data/amplio2/swamp.spec +++ b/freeciv/freeciv/data/amplio2/swamp.spec @@ -4,7 +4,7 @@ options = "+Freeciv-spec-Devel-2019-Jul-03" [info] artists = " - Unknown + Canik " ;modified substantially by Lexxie. diff --git a/freeciv/freeciv/data/amplio2/terrain1.png b/freeciv/freeciv/data/amplio2/terrain1.png index 4748457bb..e0f5478d2 100644 Binary files a/freeciv/freeciv/data/amplio2/terrain1.png and b/freeciv/freeciv/data/amplio2/terrain1.png differ diff --git a/freeciv/freeciv/data/amplio2/terrain1.spec b/freeciv/freeciv/data/amplio2/terrain1.spec index ae25ae1ea..0f4381703 100644 --- a/freeciv/freeciv/data/amplio2/terrain1.spec +++ b/freeciv/freeciv/data/amplio2/terrain1.spec @@ -81,6 +81,7 @@ tiles = { "row", "column", "tag" 8, 2, "ts.gems" 8, 4, "ts.fruit" 8, 6, "ts.rubber" + 8, 7, "ts.fishtrap" 9, 2, "ts.fish" 9, 4, "ts.whales" diff --git a/freeciv/freeciv/data/amplio2/units.png b/freeciv/freeciv/data/amplio2/units.png index 6f8c27fee..eb66f4b16 100644 Binary files a/freeciv/freeciv/data/amplio2/units.png and b/freeciv/freeciv/data/amplio2/units.png differ diff --git a/freeciv/freeciv/data/amplio2/units.spec b/freeciv/freeciv/data/amplio2/units.spec index 6609ced6f..bf708a41b 100644 --- a/freeciv/freeciv/data/amplio2/units.spec +++ b/freeciv/freeciv/data/amplio2/units.spec @@ -14,26 +14,24 @@ options = "+Freeciv-spec-Devel-2019-Jul-03" ; in the scenarios 2194 days war, Red Front, 2nd front and other misc graphics. ; Fairline for his huge collection of original Civ2 unit spanning centuries ; Bebro for his collection of mediveal units and ships +; Last but not least: Lexxie artists = " - Lexxie9952 [Lexxie] - Alex Mor [Alex] - Allard H.S. Höfelt [AHS] - Bebro [BB] - Captain Nemo [Nemo][MHN] - CapTVK [CT] - Curt Sibling [CS] - Erwan [EW] - Fairline [GB] - GoPostal [GP] - Oprisan Sorin [Sor] - Tanelorn [T] - Paul Klein Lankhorst / GukGuk [GG] - Andrew ''Panda´´ Livings [APL] - Vodvakov - J. W. Bjerk / Eleazar - qwm - FiftyNine + Alex Mor [Alex] + Allard H.S. Höfelt [AHS] + Bebro [BB] + CapTVK [CT] + Curt Sibling [CS] + Eleazar [Eleazar] / J. W. Bjerk + Erwan [EW] + FiftyNine [FiftyNine] + Fairline [GB] + GoPostal [GP] + Lexxie9952 [Lexxie] + Captain Nemo [Nemo] + qwm [QWM] + Tanelorn [T] + * [*m] = was used as inspiration/model in creating an original work " [file] @@ -49,98 +47,102 @@ pixel_border = 1 tiles = { "row", "column", "tag" ; Scenario League tags in brackets - 0, 0, "u.armor" ; [Nemo] & [Lexxie] - 0, 1, "u.howitzer" ; [Nemo] & [Lexxie]--fallback: u_howitzer_o is in units_oversize.spec<Civilization I Manual + + diff --git a/freeciv/freeciv/data/civ1/buildings.ruleset b/freeciv/freeciv/data/civ1/buildings.ruleset index a4efa7156..f8aa7dfbd 100644 --- a/freeciv/freeciv/data/civ1/buildings.ruleset +++ b/freeciv/freeciv/data/civ1/buildings.ruleset @@ -232,11 +232,17 @@ sabotage = 50 sound = "b_city_walls" sound_alt = "b_generic" helptext = _("\ -City Walls make it easier to defend a city. They triple the defense\ - strength of units within the city. They are ineffective against\ - Artillery and Bombers.\ - City Walls also prevent the loss of population which\ - occurs when a defending unit is destroyed by a land unit.\ +City Walls make it easier to defend a city. They triple the defense\ + strength of units within the city, but part of this bonus considers\ + the units as fortified -- that is, there is no fortified bonus\ + behind City Walls because the City Walls bonus already considered\ + to give fortified status to all units of every type, for free. \n\ +City Walls are not effective against Artillery and Bombers, in\ + which case being fortified gives the normal 50% bonus. (Note:\ + currently, ALL units get a 1.5x bonus instead of 3x bonus, if inside\ + City Walls and attacked by Bomber or Artillery.) \n\ + City Walls prevent the loss of population which occurs when a defending\ + unit is destroyed by a land unit.\ "), _("\ For cities near rivers, City Walls also eliminate the risk of population\ loss from flooding.\ @@ -761,7 +767,7 @@ Together with a Library, a University increases the science\ [building_apollo_program] name = _("Apollo Program") -genus = "GreatWonder" +genus = "GreatWonder" reqs = { "type", "name", "range" "Tech", "Space Flight", "Player" @@ -774,6 +780,8 @@ obsolete_by = build_cost = 600 upkeep = 0 sabotage = 0 +sound = "w_apollo_program" +sound_alt = "w_generic" helptext = _("\ All cities on the map become visible for the player who owns it --\ the player always has up-to-date knowledge of all tiles with cities\ diff --git a/freeciv/freeciv/data/civ1/effects.ruleset b/freeciv/freeciv/data/civ1/effects.ruleset index fbd23f4f8..42b8eeeca 100644 --- a/freeciv/freeciv/data/civ1/effects.ruleset +++ b/freeciv/freeciv/data/civ1/effects.ruleset @@ -592,6 +592,43 @@ reqs = "UnitType", "Bomber", "Local", FALSE "Building", "Great Wall", "Player", FALSE } +; "Being fortified behind City Walls has no effect unless the attacking unit is a Bomber or Artillery unit." +; -- Civ1 Manual +; Fortified inside City Walls ONLY works when attacked by Bombers or Artillery; see official manual. +; For now we have to assume it's a unit qualified to fortify (which ~80% will be), and that it's fortified. +; (Civ1 doesn't give free-fortified-in-cities). This handling is substantially better than being massively +; wrong 100% of the time, but leaves two "lesser evil" false reproductions of the rules: 1. Units who can fortify +; but didn't actually fortify, will get a free bonus of being fortified vs Bomber & Artillery IFF they are in +; a city with City Walls (a mistake the old effects made anyway); and 2. A slight minority of units who can't +; fortify will get a 1.5x City Walls bonus vs Bomber and Artillery IFF inside cities with Walls. Compare to the +; former effect handling errors: 1. Every unit who can fortify gets a 4.5x bonus in city walls instead of 3x +; 100% of the time, and every unit who isn't fortified gets a false bonus for being fortified 100% of the time, +; instead of the new effects' rare case of getting a false fortify bonus only when unfortified in a city with +; Walls and only when being attacked by a Bomber or Artillery. +; ... +; FIXME: when Fortify_Defense_Bonus can check attacker type or Defend_Bonus can check target unit, then... +; fortified-behind-city-walls-bonus gets special reqs that check for: +; City Walls || Great Wall == TRUE, Bomber || Artillery attacking == TRUE, Defender Activity == FORTIFIED +; ... +[effect_city_walls_3] +type = "Defend_Bonus" +value = 50 +reqs = + { "type", "name", "range", "present" + "Building", "City Walls", "City", TRUE + "UnitType", "Artillery", "Local", TRUE + "Building", "Great Wall", "Player", FALSE + } +;see note in above effect +[effect_city_walls_4] +type = "Defend_Bonus" +value = 50 +reqs = + { "type", "name", "range", "present" + "Building", "City Walls", "City", TRUE + "UnitType", "Bomber", "Local", TRUE + "Building", "Great Wall", "Player", FALSE + } [effect_city_walls_2] type = "Unit_No_Lose_Pop" @@ -987,6 +1024,43 @@ reqs = "UnitType", "Artillery", "Local", FALSE "UnitType", "Bomber", "Local", FALSE } +; "Being fortified behind City Walls has no effect unless the attacking unit is a Bomber or Artillery unit." +; -- Civ1 Manual +; Fortified inside City Walls ONLY works when attacked by Bombers or Artillery; see official manual. +; For now we have to assume it's a unit qualified to fortify (which ~80% will be), and that it's fortified. +; (Civ1 doesn't give free-fortified-in-cities). This handling is substantially better than being massively +; wrong 100% of the time, but leaves two "lesser evil" false reproductions of the rules: 1. Units who can fortify +; but didn't actually fortify, will get a free bonus of being fortified vs Bomber & Artillery IFF they are in +; a city with City Walls (a mistake the old effects made anyway); and 2. A slight minority of units who can't +; fortify will get a 1.5x City Walls bonus vs Bomber and Artillery IFF inside cities with Walls. Compare to the +; former effect handling errors: 1. Every unit who can fortify gets a 4.5x bonus in city walls instead of 3x +; 100% of the time, and every unit who isn't fortified gets a false bonus for being fortified 100% of the time, +; instead of the new effects' rare case of getting a false fortify bonus only when unfortified in a city with +; Walls and only when being attacked by a Bomber or Artillery. +; ... +; FIXME: when Fortify_Defense_Bonus can check attacker type or Defend_Bonus can check target unit, then... +; fortified-behind-city-walls-bonus gets special reqs that check for: +; City Walls || Great Wall == TRUE, Bomber || Artillery attacking == TRUE, Defender Activity == FORTIFIED +; ... +[effect_great_wall_2] +type = "Defend_Bonus" +value = 50 +reqs = + { "type", "name", "range", "present" + "Building", "Great Wall", "Player", TRUE + "CityTile", "Center", "Local", TRUE + "UnitType", "Bomber", "Local", TRUE + } +;see note in effect above +[effect_great_wall_3] +type = "Defend_Bonus" +value = 50 +reqs = + { "type", "name", "range", "present" + "Building", "Great Wall", "Player", TRUE + "CityTile", "Center", "Local", TRUE + "UnitType", "Artillery", "Local", TRUE + } [effect_great_wall_protect_pop] type = "Unit_No_Lose_Pop" @@ -1200,23 +1274,36 @@ type = "Trade_Revenue_Bonus" value = 1585 ; *************************** Ruleset Fortify Bonus *********************** +; From Civ1 Manual: For example, if a chariot (attack factor 4) attacks a phalanx +; (defense factor 2), the Chariot has a 67% chance of winning (4 out of 6) and the +; Phalanx 33% (2 out of 6). If both units were veterans, the odds are 6 to 3. If both +; are veterans and the Phalanx was behind City Walls (which triples the defense factor), +; the odds are 6 to 9. [effect_fortified] type = "Fortify_Defense_Bonus" value = 50 reqs = - { "type", "name", "range" - "Activity", "Fortified", "Local" + { "type", "name", "range", "present" + "Activity", "Fortified", "Local", TRUE + "CityTile", "Center", "Local", FALSE ; To get fortify bonus behind City Walls has special reqs, see below and also [effect_city_walls] } +; No auto-fortify-in-city bonus in Civ1, see the manual! +; Also, actively fortified in a city gives no bonus IFF there are City Walls +; ... (unless attacked by Artillery or Bomber) [effect_city_fortified] type = "Fortify_Defense_Bonus" value = 50 reqs = - { "type", "name", "range", "present" - "CityTile", "Center", "Local", TRUE - "Activity", "Fortified", "Local", FALSE - "UnitClassFlag", "CanFortify", "Local", TRUE - "UnitFlag", "Cant_Fortify", "Local", FALSE + { "type", "name", "range", "present" + "CityTile", "Center", "Local", TRUE + "Activity", "Fortified", "Local", TRUE +; if attacked by Artillery or Bomber the city walls==FALSE req isn't true, so we moved +; +50% bonus for fortified-behind-walls to an effect that can check the attacker type. + "Building", "City Walls", "City", FALSE + "Building", "Great Wall", "Player", FALSE + "UnitClassFlag","CanFortify", "Local", TRUE + "UnitFlag", "Cant_Fortify", "Local", FALSE } ; ****************************** RECYCLE SHIELDS ************************** diff --git a/freeciv/freeciv/data/civ1/game.ruleset b/freeciv/freeciv/data/civ1/game.ruleset index 3b53824c5..4f10f1cb6 100644 --- a/freeciv/freeciv/data/civ1/game.ruleset +++ b/freeciv/freeciv/data/civ1/game.ruleset @@ -19,11 +19,11 @@ format_version=20 [ruledit] ; Which file to read description in from. -;description_file = "" +description_file = "civ1/README.civ1" [about] ; Ruleset name -name = _("Civ1 ruleset") +name = _("Civ I ruleset") ; There`s no separate versioning in rulesets part of main freeciv distribution ;version = "" @@ -36,10 +36,8 @@ name = _("Civ1 ruleset") ; Summary of the ruleset summary = _("\ -You are playing with civ1 style rules. \ -These rules are much simpler than the Freeciv default rules. \ -If you know only the default rules, spend some time checking the \ -differences.\ +Civ1 rules are much simpler than Freeciv Classic rules. If you only\ + know other rules, spend some time checking the differences.\ \n\n\ * There are fewer technologies, buildings and units.\n\ * Units have no hitpoints. If they win a battle, they remain in full health.\n\ @@ -47,7 +45,7 @@ differences.\ ; Detailed description ; When updating this, update also desciption_file in [ruledit] section to match -; description = "" +description = *civ1/README.civ1* ; What capabilities ruleset provides for the scenarios. ; See doc/README.rulesets for definitions of official capabilities @@ -1298,5 +1296,5 @@ set = ; no effect anyway "traitdistribution", "FIXED", TRUE "plrcolormode", "NATION_ORDER", FALSE - "topology", "WRAPX|ISO", FALSE + "topology", "WRAPX", FALSE } diff --git a/freeciv/freeciv/data/civ2/README.civ2 b/freeciv/freeciv/data/civ2/README.civ2 new file mode 100644 index 000000000..476a44685 --- /dev/null +++ b/freeciv/freeciv/data/civ2/README.civ2 @@ -0,0 +1,116 @@ +Civ2 ruleset is intended to be the closest approximation to Civilization II that Freeciv can implement. +Compared to Classic rules, Classic rules are a conservative but substantially significant improvement in smoothing and modernizing the Civilization II rules. The experience is quite close, but arguably smoother, more fluid, and better functioning. + +Civilization II Manual +Civilization II Combat Guide +Civilization II War Academy + +Differences from Classic ruleset: +Units +• There are no Workers units; only Settlers and Engineers +• The game starts with two Settlers only, by default. +• Settlers can make Airbases. +• Settlers are obsolete by Engineers. +• Engineers can build new cities. +• Engineers cost 1 population and have 1 food upkeep. +• Military units have 1 veteran level instead of 3. +• All units have Zone of Control. Classic has ZOC for specific military units only. +• Has Elephants, Crusaders, and Fanatics. Classic does not. +• Stealth aircraft are visible like all conventional units. +• Stealth Bomber attacks at 14, not 18. +• Trireme has 1 turn of fuel - must end its turn on coast. +• Submarines cost 60, move 3, and attack at 10. Classic: (50/5/12) +• Carriers suffer no Pearl Harbor Effect (BadyCityDefender) +• Diplomats can't be promoted from field operations. Only Communist government makes them vet. +• Vet Diplomat power factor is 110%. Classic: 105% +• Spies power factor is 110%. Classic: 105%. (Spies can be promoted in both rulesets.) +• No AWACS unit. +• Bribe costs are different. +• Upgraded units lose veteran status. +• Disembarking from sea to land does not use all moves. (slow_invasions = FALSE) +• Units have tired attack. Attacking with < 1 move_point gives (move_points / 1) attack strength %. +• Hostile diplomatic actions do not require the diplomatic unit to act from a land tile. +• Can't embark from a transport to an adjacent transport inside a city. + +Tech +• Tech costs are not static but rise with each tech already discovered. +• Freely acquired techs are completely random, not based on tech goal. +• Stealth requires Superconductors and Robotics (Classic: Superconductors and Advanced Flight) +• Invention does not give Fortress vision bonus. + +Misc +• No disasters: therefore, no bonus effects to prevent them. +• Suitcase Nukes enabled. +• Trade Routes are Bidirectional, i.e. equal revenue in all cases. +• There is no clause or diplomatic state for Alliance. +• Barbarian cities can't produce. +• AI does not have random traits but are all uniformly moderate (50%) +• Has a finite subset of nations like the original game. Classic has over 500. +• Calendar uses legacy BC/AD rather then politically corrected CE/BCE. + +Terrain +• Rivers add +0.50 to the terrain's natural defense. (Classic: multiplies all other bonuses by 1.5x) +• Oil Wells are not in the game. +• Glacier oil is +4 shields (Classic: +3, +4 after Refining) +• Ocean tiles cannot be reclaimed as land by transformation. +• Swamp tiles cannot be dredged to be Lake or Ocean. It transforms to Plains. +• Forest terrain can't transform from "Plant" into Swamp terrain. +• Cities get bridges on the city center, even without Bridge Building tech. +• Airbases hide the units inside (Hangar effect) +• There is no Deep Ocean terrain. +• There is no Nuclear Fallout. +• No buoys or ruins. + +Buildings +• Almost all buildings cost more: 4/3 more usually; some are 3/2 more. +• City Walls defend at 3x but supercede fortify bonus. (Classic: 3x + Fortified = 4.5x) +• Solar Plant does flat -100% production pollution. (Classic -50% for Factory, -50% for Mfg. Plant) +• Libraries increases science +50%. (Classic: +100%) +• Research Labs increase science +50%. (Classic: +100% for each library and university) +• Universities increase science +50%. (Classic: +150% for each Library) +• Note that Police Station nullifies the unhappy effects of two aggressive military units. Original Civ2 reduces the unhappy effect by -1 for each unit. +• Hydro and Nuclear Plants do a flat -50% producion pollution. (Classic -25% for Factory, -25 for Mfg. Plant) + +Wonders +• Hoover Dam same as Hydro Plant above. +• Copernicus increases science +50%. (Classic: +100%) +• King Richard's Crusade obsolete by Industrialization (Classic: Robotics) +• Eiffel Tower twice as strong as Classic. +• Oracle: for each temple, makes +1 content and additional +1 for Mysticism. (Classic: +1 only.) +• Pyramids count as Granary in every city. (Classic: Pyramids add +25% food and stack with +50% from Granary) +• Sun Tzu's War Academy: chance of promotion increased to 100% (Classic: increased 50%: e.g., 50%+(50%*50%)=75%) +• Isaac Newton's College +100% science for city (Classic: +100% for all cities with University) +• Seti Program gives +50% science for each Library (Classic: +100% for each Research Lab) + +Government and Nation +• No capital production bonus for Palace city. +• Scientists and Taxmen require a minimum size city of 5 before they can be assigned. +• Cities cannot reveal unexplored tiles, only maintain vision of what was explored. +• No nationality of citizens is accounted in any city; thus, no foreign nationality effects either. +• City Unhappy Size starts at 4. See Manual above for more info. +• No scientist or taxman specialists. +• Government base corruption differences: +--------------Civ2 - Classic + •• ..Anarchy: 37% --- 25% + •• Despotism: 30% --- 37% + •• .Monarchy: 25% --- 15% + •• .Republic: 18% --- 15% + •• Fundament: 2% + +• Empire base size differences: +-------------Civ2 - Classic + •• .Republic: 14 --- 13 + •• Communism: 14 --- 12 + •• Democracy: 17 --- 14 +• Empire step size differences: +-------------Civ2 - Classic + •• Despotism: 06 --- 10 + •• .Monarchy: 09 --- 12 + •• .Republic: 12 --- 14 + •• Communism: 12 --- none + •• Democracy: 12 --- 16 +• Has government type Fundamentalism +• Fundamentalism 10 units upkeep free per city. +• -50% science for Fundamentalism. + + diff --git a/freeciv/freeciv/data/civ2/buildings.ruleset b/freeciv/freeciv/data/civ2/buildings.ruleset index 284bc8b17..89ceb3e3a 100644 --- a/freeciv/freeciv/data/civ2/buildings.ruleset +++ b/freeciv/freeciv/data/civ2/buildings.ruleset @@ -265,11 +265,13 @@ sabotage = 50 sound = "b_city_walls" sound_alt = "b_generic" helptext = _("\ -City Walls make it easier to defend a city. They triple the defense\ - strength of units within the city against land and helicopter\ - units. They are ineffective against airborne and sea units as well\ - as Howitzers. City Walls also prevent the loss of population which\ - occurs when a defending unit is destroyed by a land unit.\ +City Walls make it easier to defend a city. They double the defense\ + strength of units within the city against land and helicopter units.\ + (Defending land units who can fortify get an automatic +50% bonus when\ + inside cities, making a total defense bonus of 3x for such units.)\ + City Walls are ineffective against airborne and sea units as well as\ + Howitzers. City Walls also prevent the loss of population which occurs\ + when a defending unit is destroyed by a land unit.\ ") [building_coastal_defense] diff --git a/freeciv/freeciv/data/civ2/effects.ruleset b/freeciv/freeciv/data/civ2/effects.ruleset index 830ae9a4e..0ba9658ea 100644 --- a/freeciv/freeciv/data/civ2/effects.ruleset +++ b/freeciv/freeciv/data/civ2/effects.ruleset @@ -502,7 +502,7 @@ reqs = [effect_upkeep_free_units_fundamentalism] type = "Unit_Upkeep_Free_Per_City" -value = 8 +value = 10 reqs = { "type", "name", "range" "Gov", "Fundamentalism", "Player" @@ -1068,9 +1068,15 @@ reqs = "Building", "Michelangelo's Chapel", "Player", FALSE } +; I. Fortified land units receive a x1.5 bonus for defense strength. This bonus is superceded by fortress +; improvement (3.c) and city walls (3.e). It can be used in combination with a SAM battery (3.f) or a +; Coastal Fortress (3.g). +; II. City walls triple the defense value of city defenders against attacks by land units only. This bonus +; can apply only to land units. See http://www.civfanatics.com/civ2/strategy/combatguide/ +; NOTE: this means the fix will have to do some tricky effect gymnastics that are counterintuitive. [effect_city_walls] type = "Defend_Bonus" -value = 200 +value = 200 ; NB:Civ2 effect for unit in city walls is 3x. This is wrongly working as 3x + fortify = 4.5x reqs = { "type", "name", "range", "present" "Building", "City Walls", "City", TRUE @@ -1079,15 +1085,8 @@ reqs = "UnitType", "Howitzer", "Local", FALSE } -[effect_city_walls_0] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "UnitClass", "Helicopter", "Local", TRUE - "Building", "Great Wall", "Player", FALSE - } +; III. City Walls DO NOT give a bonus against Helicopters!! SAM Battery does. + [effect_city_walls_1] type = "Unit_No_Lose_Pop" @@ -1101,8 +1100,9 @@ reqs = type = "Visible_Walls" value = 1 reqs = - { "type", "name", "range" - "Building", "City Walls", "City" + { "type", "name", "range", "present" + "Building", "City Walls", "City", TRUE + "Building", "Great Wall", "Player", FALSE } [effect_coastal_defense] @@ -1186,6 +1186,29 @@ reqs = "Extra", "Fortress", "Local" } +[effect_fortified] +type = "Fortify_Defense_Bonus" +value = 50 +reqs = + { "type", "name", "range" + "Activity", "Fortified", "Local" + } + +;NB: In Civ2 you actually have to be fortified in a city to get the bonus, but... +;1. This prevents ability to use sentry in the legacy UX +;2. It's rumored that in a city, fortify-ing gives the bonus anyway, not needing fortif-ied. +;3. So, it's debatable to change the erroneous(?) status quo, for now, so we won't, for now. +[effect_city_fortified] +type = "Fortify_Defense_Bonus" +value = 50 +reqs = + { "type", "name", "range", "present" + "CityTile", "Center", "Local", TRUE + "Activity", "Fortified", "Local", FALSE + "UnitClassFlag", "CanFortify", "Local", TRUE + "UnitFlag", "Cant_Fortify", "Local", FALSE + } + [effect_incite_cost_empty] type = "Incite_Cost_Pct" value = -50 @@ -1533,6 +1556,14 @@ reqs = "Building", "SAM Battery", "City" "UnitClass", "Air", "Local" } +[effect_sam_battery_2] +type = "Defend_Bonus" +value = 100 +reqs = + { "type", "name", "range" + "Building", "SAM Battery", "City" + "UnitClass", "Helicopter", "Local" + } [effect_sdi_defense] type = "Nuke_Proof" @@ -1797,7 +1828,7 @@ reqs = [effect_great_wall] type = "Defend_Bonus" -value = 200 +value = 200 ; NB: Civ2 effect for unit in city walls is 3x. This is wrongly put as 3x + fortify = 4.5x reqs = { "type", "name", "range", "present" "Building", "Great Wall", "Player", TRUE @@ -1805,17 +1836,7 @@ reqs = "CityTile", "Center", "Local", TRUE "UnitType", "Howitzer", "Local", FALSE } - -[effect_great_wall_0] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range" - "Building", "Great Wall", "Player" - "UnitClass", "Helicopter", "Local" - "CityTile", "Center", "Local" - } - +; Great Wall gets no defend bonus against Helicopters in Civ 2. [effect_great_wall_1] type = "Unit_No_Lose_Pop" value = 1 @@ -2136,44 +2157,6 @@ reqs = type = "Trade_Revenue_Bonus" value = 1585 -; *************************** Ruleset Fortify Bonus *********************** -[effect_fortified] -type = "Fortify_Defense_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Activity", "Fortified", "Local" - } - -[effect_city_fortified] -type = "Fortify_Defense_Bonus" -value = 50 -reqs = - { "type", "name", "range", "present" - "CityTile", "Center", "Local", TRUE - "Activity", "Fortified", "Local", FALSE - "UnitClassFlag", "CanFortify", "Local", TRUE - "UnitFlag", "Cant_Fortify", "Local", FALSE - } - -; ****************************** RECYCLE SHIELDS ************************** -[effect_unit_shield_value_recycle] -type = "Unit_Shield_Value_Pct" -value = -50 -reqs = - { "type", "name", "range", "present" - "Action", "Recycle Unit", "Local", TRUE - } - -[effect_unit_shield_value_in_upgrade_price_calc] -type = "Unit_Shield_Value_Pct" -value = -50 -reqs = - { "type", "name", "range", "present" - "Action", "Upgrade Unit", "Local", TRUE - } -;*************************************************************************** - [effect_tithes_fundamentalism] type = "Happiness_To_Gold" value = 1 @@ -2525,7 +2508,7 @@ reqs = } ; Civilization II took all remaining move fragments when a land unit -; embarked to a ship. It didn't take all remaining more fragments when the +; embarked to a ship. It didn't take all remaining move fragments when the ; same land unit boarded a ship in the city it was in. It didn't take all ; remaining move fragments when disembarking. Correct this rule if I'm wrong. ; TODO: was transferring from a transport to a transport on an adjacent tile @@ -2538,14 +2521,88 @@ reqs = "Action", "Transport Embark", "Local", TRUE } -[effect_action_success_move_cost_embassy] +[effect_action_establish_embassy_success_move_cost] type = "Action_Success_Actor_Move_Cost" value = 1 reqs = - { "type", "name", "range", "present" + { "type", "name", "range", "quiet" "Action", "Establish Embassy", "Local", TRUE } +[effect_action_success_poison_city_escape] +type = "Action_Success_Actor_Move_Cost" +value = 65535 +reqs = + { "type", "name", "range", "quiet" + "Action", "Poison City Escape", "Local", TRUE + } + +[effect_action_success_sabotage_city_escape] +type = "Action_Success_Actor_Move_Cost" +value = 65535 +reqs = + { "type", "name", "range", "quiet" + "Action", "Sabotage City Escape", "Local", TRUE + } + +[effect_action_success_targeted_sabotage_city_escape] +type = "Action_Success_Actor_Move_Cost" +value = 65535 +reqs = + { "type", "name", "range", "quiet" + "Action", "Targeted Sabotage City Escape", "Local", TRUE + } + +[effect_action_success_sabotage_city_production_escape] +type = "Action_Success_Actor_Move_Cost" +value = 65535 +reqs = + { "type", "name", "range", "quiet" + "Action", "Sabotage City Production Escape", "Local", TRUE + } + +[effect_action_success_steal_tech_escape_expected] +type = "Action_Success_Actor_Move_Cost" +value = 65535 +reqs = + { "type", "name", "range", "quiet" + "Action", "Steal Tech Escape Expected", "Local", TRUE + } + +[effect_action_success_targeted_steal_tech_escape_expected] +type = "Action_Success_Actor_Move_Cost" +value = 65535 +reqs = + { "type", "name", "range", "quiet" + "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE + } + +[effect_action_success_incite_city_escape] +type = "Action_Success_Actor_Move_Cost" +value = 65535 +reqs = + { "type", "name", "range", "quiet" + "Action", "Incite City Escape", "Local", TRUE + } + +[effect_action_success_unit_sabotage] +type = "Action_Success_Actor_Move_Cost" +value = 65535 +reqs = + { + "type", "name", "range", "quiet" + "Action", "Sabotage Unit Escape", "Local", TRUE + } + +[effect_action_success_suitcase_nuke] +type = "Action_Success_Actor_Move_Cost" +value = 65535 +reqs = + { + "type", "name", "range", "quiet" + "Action", "Suitcase Nuke Escape", "Local", TRUE + } + [effect_action_success_move_cost_investigate] type = "Action_Success_Actor_Move_Cost" value = 1 @@ -2553,3 +2610,37 @@ reqs = { "type", "name", "range", "present" "Action", "Investigate City", "Local", TRUE } + +[effect_action_success_attack_one_attack] +type = "Action_Success_Actor_Move_Cost" +value = 65535 +reqs = + { "type", "name", "range", "quiet" + "Action", "Attack", "Local", TRUE + "UnitFlag", "OneAttack", "Local", TRUE + } + +[effect_action_success_attack_normal] +type = "Action_Success_Actor_Move_Cost" +value = 3 +reqs = + { "type", "name", "range", "present" + "Action", "Attack", "Local", TRUE + "UnitFlag", "OneAttack", "Local", FALSE + } + +[effect_unit_shield_value_recycle] +type = "Unit_Shield_Value_Pct" +value = -50 +reqs = + { "type", "name", "range", "present" + "Action", "Recycle Unit", "Local", TRUE + } + +[effect_unit_shield_value_in_upgrade_price_calc] +type = "Unit_Shield_Value_Pct" +value = -50 +reqs = + { "type", "name", "range", "present" + "Action", "Upgrade Unit", "Local", TRUE + } diff --git a/freeciv/freeciv/data/civ2/game.ruleset b/freeciv/freeciv/data/civ2/game.ruleset index e7ac627fe..75e15e916 100644 --- a/freeciv/freeciv/data/civ2/game.ruleset +++ b/freeciv/freeciv/data/civ2/game.ruleset @@ -19,11 +19,11 @@ format_version=20 [ruledit] ; Which file to read description in from. -;description_file = "" +description_file = "civ2/README.civ2" [about] ; Ruleset name -name = _("Civ2 ruleset") +name = _("Civ II ruleset") ; There`s no separate versioning in rulesets part of main freeciv distribution ;version = "" @@ -35,15 +35,11 @@ name = _("Civ2 ruleset") ;alt_dir = "" ; Summary of the ruleset -summary = _("\ -You are playing with civ2 style rules. These are\ - quite close to classic (old default) Freeciv rules,\ - but with some additions.\ -") +summary = _("") ; Detailed description ; When updating this, update also desciption_file in [ruledit] section to match -; description = "" +description = *civ2/README.civ2* ; What capabilities ruleset provides for the scenarios. ; See doc/README.rulesets for definitions of official capabilities @@ -923,7 +919,8 @@ actor_reqs = action = "Upgrade Unit" actor_reqs = { "type", "name", "range", "present" - "DiplRel", "Foreign", "Local", FALSE + "DiplRel", "Foreign", "Local", FALSE + "CityTile", "Center", "Local", TRUE } [actionenabler_airlift_unit] @@ -962,22 +959,20 @@ actor_reqs = { "type", "name", "range" "UnitClassFlag", "CanPillage", "Local" } - [actionenabler_clean_pollution] action = "Clean Pollution" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE "UnitFlag", "NonMil", "Local", TRUE - ;NonMil = don't let ability to do Hideouts 'cause' ability to clean pollution } + [actionenabler_clean_fallout] action = "Clean Fallout" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE "UnitFlag", "NonMil", "Local", TRUE - ;NonMil = don't let ability to do Hideouts 'cause' ability to clean fallout } [actionenabler_fortify] @@ -1457,5 +1452,5 @@ set = ; no effect anyway "traitdistribution", "FIXED", TRUE "plrcolormode", "NATION_ORDER", FALSE - "topology", "WRAPX|ISO", FALSE + "topology", "WRAPX", FALSE } diff --git a/freeciv/freeciv/data/civ2/techs.ruleset b/freeciv/freeciv/data/civ2/techs.ruleset index 6da820cee..0eb41b3f0 100644 --- a/freeciv/freeciv/data/civ2/techs.ruleset +++ b/freeciv/freeciv/data/civ2/techs.ruleset @@ -159,7 +159,7 @@ req1 = "Combustion" req2 = "Steel" graphic = "a.automobile" graphic_alt = "-" -helptext = _("Increases the population's contribution to pollution.") +helptext = _("Obsoletes Leonardos Workshop. Increases population pollution.") [advance_banking] name = _("Banking") @@ -209,6 +209,7 @@ req2 = "Horseback Riding" flags = "" graphic = "a.chivalry" graphic_alt = "-" +helptext = _("Obsoletes Horsemen, Chariots.") [advance_code_of_laws] name = _("Code of Laws") @@ -299,7 +300,7 @@ req2 = "Magnetism" flags = "" graphic = "a.electricity" graphic_alt = "-" -helptext = _("Improves the effect of Colosseums.") +helptext = _("Obsoletes Ironclad. +1 Effect for Colosseums.") [advance_electronics] name = _("Electronics") @@ -332,6 +333,7 @@ req2 = "Democracy" flags = "" graphic = "a.espionage" graphic_alt = "-" +helptext = _("Obsoletes Diplomat.") [advance_explosives] name = _("Explosives") @@ -340,6 +342,7 @@ req2 = "Chemistry" flags = "" graphic = "a.explosives" graphic_alt = "-" +helptext = _("Obsoletes Settlers.") [advance_feudalism] name = _("Feudalism") @@ -356,7 +359,7 @@ req2 = "Theory of Gravity" flags = "" graphic = "a.flight" graphic_alt = "-" -helptext = _("Decreases one-time revenue from new trade routes.") +helptext = _("Obsoletes Colossus, decreases one-time Traderoute revenue.") [advance_fundamentalism] name = _("Fundamentalism") @@ -389,6 +392,7 @@ req2 = "Tactics" flags = "" graphic = "a.guerilla_warfare" graphic_alt = "-" +helptext = _("Obsoletes Explorer.") [advance_gunpowder] name = _("Gunpowder") @@ -397,6 +401,7 @@ req2 = "Iron Working" flags = "" graphic = "a.gunpowder" graphic_alt = "-" +helptext = _("Obsoletes Barracks, earlier foot soldiers.") [advance_horseback_riding] name = _("Horseback Riding") @@ -412,7 +417,7 @@ req1 = "Railroad" req2 = "Banking" graphic = "a.industrialization" graphic_alt = "-" -helptext = _("Population will start contributing to pollution.") +helptext = _("Obsoletes Galleon, King Richards Crusade. Population begins polluting.") [advance_invention] name = _("Invention") @@ -453,6 +458,7 @@ req2 = "Gunpowder" flags = "" graphic = "a.leadership" graphic_alt = "-" +helptext = _("Obsoletes Horsemen, Chariot, Elephant, Knight, Crusader.") [advance_literacy] name = _("Literacy") @@ -469,6 +475,7 @@ req2 = "Tactics" flags = "" graphic = "a.machine_tools" graphic_alt = "-" +helptext = _("Obsoletes Cannon.") [advance_magnetism] name = _("Magnetism") @@ -477,6 +484,7 @@ req2 = "Physics" flags = "" graphic = "a.magnetism" graphic_alt = "-" +helptext = _("Obsoletes Caravel, Lighthouse.") [advance_map_making] name = _("Map Making") @@ -500,7 +508,7 @@ req1 = "Automobile" req2 = "The Corporation" graphic = "a.mass_production" graphic_alt = "-" -helptext = _("Increases the population's contribution to pollution.") +helptext = _("Increases population pollution.") [advance_mathematics] name = _("Mathematics") @@ -525,6 +533,7 @@ req2 = "University" flags = "" graphic = "a.metallurgy" graphic_alt = "-" +helptext = _("Obsoletes Catapult, Great Wall.") [advance_miniaturization] name = _("Miniaturization") @@ -541,6 +550,7 @@ req2 = "Tactics" flags = "" graphic = "a.mobile_warfare" graphic_alt = "-" +helptext = _("Obsoletes Barracks II, Cavalry, Sun Tzu.") [advance_monarchy] name = _("Monarchy") @@ -557,6 +567,7 @@ req2 = "Polytheism" flags = "" graphic = "a.monotheism" graphic_alt = "-" +helptext = _("Obsoletes Elephants.") [advance_mysticism] name = _("Mysticism") @@ -574,6 +585,7 @@ req2 = "Astronomy" flags = "" graphic = "a.navigation" graphic_alt = "-" +helptext = _("Obsoletes Trireme.") [advance_nuclear_fission] name = _("Nuclear Fission") @@ -590,7 +602,7 @@ req2 = "Electronics" flags = "" graphic = "a.nuclear_power" graphic_alt = "-" -helptext = _("Gives sea units one extra move.") +helptext = _("+1 move for Sea units.") [advance_philosophy] name = _("Philosophy") @@ -616,7 +628,7 @@ req1 = "Refining" req2 = "Space Flight" graphic = "a.plastics" graphic_alt = "-" -helptext = _("Increases the population's contribution to pollution.") +helptext = _("Increases population pollution.") [advance_polytheism] name = _("Polytheism") @@ -641,7 +653,7 @@ req2 = "Electricity" flags = "" graphic = "a.radio" graphic_alt = "-" -helptext = _("Allows Settlers and Engineers to build airbases.") +helptext = _("Allows building Airbases.") [advance_railroad] name = _("?tech:Railroad") @@ -679,9 +691,7 @@ req2 = "Electricity" flags = "" graphic = "a.refrigeration" graphic_alt = "-" -helptext = _("\ -Allows Settlers and Engineers to upgrade irrigation systems to farmland.\ -") +helptext = _("Allows Farmland.") [advance_robotics] name = _("Robotics") @@ -690,6 +700,7 @@ req2 = "Computers" flags = "" graphic = "a.robotics" graphic_alt = "-" +helptext = _("Obsoletes Artillery.") [advance_rocketry] name = _("Rocketry") @@ -698,6 +709,7 @@ req2 = "Electronics" flags = "" graphic = "a.rocketry" graphic_alt = "-" +helptext = _("Obsoletes Cruiser.") [advance_sanitation] name = _("Sanitation") @@ -762,6 +774,7 @@ req2 = "Leadership" flags = "" graphic = "a.tactics" graphic_alt = "-" +helptext = _("Obsoletes Dragoons.") [advance_the_corporation] name = _("The Corporation") @@ -770,6 +783,7 @@ req2 = "Industrialization" flags = "" graphic = "a.the_corporation" graphic_alt = "-" +helptext = _("Obsoletes Caravan.") [advance_the_republic] name = _("The Republic") @@ -794,7 +808,7 @@ req2 = "Monotheism" flags = "" graphic = "a.theology" graphic_alt = "-" -helptext = _("Improves the effect of Cathedrals.") +helptext = _("Obsoletes Oracle. +1 Effect on Cathedral, Michelangelos Chapel.") [advance_theory_of_gravity] name = _("Theory of Gravity") diff --git a/freeciv/freeciv/data/civ2/units.ruleset b/freeciv/freeciv/data/civ2/units.ruleset index ae7dd0fe2..0f8eff15a 100644 --- a/freeciv/freeciv/data/civ2/units.ruleset +++ b/freeciv/freeciv/data/civ2/units.ruleset @@ -46,6 +46,7 @@ class_flags = { "name", "helptxt" _("Missile") _("CanPillage") + _("IgnoresWalls") } [veteran_system] @@ -134,7 +135,7 @@ name = _("?unitclass:Missile") min_speed = 1 hp_loss_pct = 0 hut_behavior = "Frighten" -flags = "Missile", "Unreachable", "DoesntOccupyTile" +flags = "Missile", "Unreachable", "DoesntOccupyTile", "IgnoresWalls" [unitclass_land] ; /* TRANS: Unit class: used adjectivally */ @@ -153,17 +154,20 @@ helptext = _("\ name = _("?unitclass:Sea") min_speed = 2 hp_loss_pct = 0 -flags = "DamageSlows", "AttackNonNative" +flags = "DamageSlows", "AttackNonNative", "IgnoresWalls" helptext = _("\ Can launch attack from non-native tiles.\ ") +; See: https://civilization.fandom.com/wiki/Helicopter_(Civ2) +; "Helicopters ignore city walls when attacking cities." [unitclass_heli] ; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Helicopter") min_speed = 1 hp_loss_pct = 10 -flags = "CanOccupyCity", "CollectRansom" +flags = "CanOccupyCity", "CollectRansom", "IgnoresWalls" +;TODO: Can see Subsurface layer [unitclass_air] ; /* TRANS: Unit class: used adjectivally */ @@ -171,7 +175,7 @@ name = _("?unitclass:Air") min_speed = 1 hp_loss_pct = 0 hut_behavior = "Frighten" -flags = "Unreachable", "DoesntOccupyTile" +flags = "Unreachable", "DoesntOccupyTile", "IgnoresWalls" ; /* <-- avoid gettext warnings ; @@ -1232,8 +1236,8 @@ name = _("Howitzer") class = "Land" tech_req = "Robotics" obsolete_by = "None" -graphic = "u.howitzer" -graphic_alt = "-" +graphic = "u.howitzer_o" +graphic_alt = "u.howitzer" sound_move = "m_howitzer" sound_move_alt = "m_generic" sound_fight = "f_howitzer" @@ -1303,8 +1307,8 @@ name = _("Bomber") class = "Air" tech_req = "Advanced Flight" obsolete_by = "Stealth Bomber" -graphic = "u.bomber" -graphic_alt = "-" +graphic = "u.heavy_bomber_o" +graphic_alt = "u.bomber" sound_move = "m_bomber" sound_move_alt = "m_generic" sound_fight = "f_bomber" @@ -1410,8 +1414,8 @@ name = _("Stealth Bomber") class = "Air" tech_req = "Stealth" obsolete_by = "None" -graphic = "u.stealth_bomber" -graphic_alt = "-" +graphic = "u.stealth_bomber_o" +graphic_alt = "u.stealth_bomber" sound_move = "m_stealth_bomber" sound_move_alt = "m_generic" sound_fight = "f_stealth_bomber" diff --git a/freeciv/freeciv/data/civ2civ3/README.civ2civ3 b/freeciv/freeciv/data/civ2civ3/README.civ2civ3 index a670b84c5..08c1f44e2 100644 --- a/freeciv/freeciv/data/civ2civ3/README.civ2civ3 +++ b/freeciv/freeciv/data/civ2civ3/README.civ2civ3 @@ -1,180 +1,62 @@ -================================= -Civ2Civ3 Ruleset for Freeciv v3.1 -================================= +OBJECTIVES: +• The main purpose is to get a gameplay more similar to civ3, keeping the combat system from civ2. +• This ruleset is designed to be simpler and more beginner friendly than the classic rules, and less of a disadvantage when you do not + play optimally. It may, however, hurt you in learning good habits for more advanced rulesets. +• Removed the rules that allowed a sudden boost: mainly rapture growth, national trade routes, and the big bonuses from some governments. +The result should be a simpler and more linear development of your cities, and a slower paced gameplay. With governments that keep a similar balance along the different ages. -OBJECTIVES: ------------ - -- The main purpose is to get a gameplay more similar to civ3, keeping - the combat system from civ2. - -- Reduced micromanagement as much as possible. Don't be afraid by the - amount of changes, I think this ruleset is easier to learn than - classic rules, and it is designed so there is not a big disadvantage - when you do not play optimally. I hope both rookies and experienced - players can enjoy it. - -- Removed the rules that allowed a sudden boost: mainly rapture growth, - national trade routes, and the big bonuses from some governments. - - The result should be a simpler and more linear development of your - cities, and a slower paced gameplay. With governments that keep a - similar balance along the different ages, and smoother effects of - terrains, units, buildings and wonders. - -- All the new rules have been adapted so AI can play with them, and to - avoid possible exploits by human players. - -I wish to keep it updated and to improve it with the comments from the -players. - - -INFO: ------ - -- Help texts have been updated (mainly Buildings and Wonders), so the - info showed ingame already takes into account the changed rules. Note - that some graphical tables from the Manual will not match (mainly - Terrains and Governments), so better use the tables in this ReadMe as - reference. - -- I suggest new players to start a game with 6 players or so, AI skill - level Normal, and default ruleset options (Small continental map with - 100 land tiles per player). - -- For challenging games, you may place several AI players in the same - team. For example, one team with 5 AIs together against you. - -- Cheating AI level was adjusted for these rules, I suggest experienced - players to use it. +INFO: +• Cheating AI level was adjusted for these rules: CHEATING AI: +40% Science, Luxury, Gold and Production, +40 AI love, +40% Veteran chance, +40% Bribe and Incite costs, -20% Pollution, +1 Content per city, no food penalty from units. The following is a full list of changes compared to classic ruleset... - -CORE CHANGES: -------------- - -- No Rapture Growth (Celebration only causes additional Trade per tile, - same as civ3). Foodbox readjusted to keep a constant city growth. - -- Settlers cost 2 population (as in civ3). This way, the number of tiles - worked in the original city are reduced by 2, equal to the number of - tiles worked in the newly created city. - -- Disabled national Trade Routes: it is still possible to create Trade - Routes, but only to foreign cities that you are not at war with - (trade routes are canceled when war breaks out). Each city can - support a maximum of 2 trade routes. Removed the one time revenues. - -- Every unit (except Settlers/Migrants, which cost population to build) - pays some kind of Upkeep cost. Under some governments, this upkeep is - changed from Shields to Gold (similar to civ3). - -- A city can support as many military and Settler/Migrant units as its - population size (min 4, max 20). Additional units cause waste of Food. - If the city shrinks due to starvation, one of those extra units will - be disbanded. - -- Units lose one Veteran level when upgraded. - -- Enabled tired attack: units that attack with less than a single move - point will have their attack power reduced accordingly. +CORE CHANGES: +• No Rapture Growth (Celebration only causes additional Trade per tile). Foodbox readjusted to keep a constant city growth. +• Settlers cost 2 population (as in civ3). +• Disabled national Trade Routes: it is still possible to create Trade Routes, to foreign cities that you are not at war with (trade routes are canceled when war breaks out). Each city supports a maximum of 2 trade routes. Removed the one time revenues. +• Every unit (except Settlers/Migrants, which cost population to build) pays some kind of Upkeep cost. Under some governments, this upkeep is changed from Shields to Gold. +• A city can support as many military and Settler/Migrant units as its population size (min 4, max 20). Additional units cause waste of Food. If the city shrinks due to starvation, one of those extra units will be disbanded. +• Units lose one Veteran level when upgraded. +• Enabled tired attack: units that attack with less than a single move point will have their attack power reduced accordingly: If they have 2/3 movement points, they will attack with 2/3 strength. If they have 1/3 movement points, they will attack with 1/3 strength. - -- Unlimited movement on rails delayed to maglev (available with - Superconductors). Movement bonus on Railroads x6, on Roads x3, on - Rivers x3 (non diagonal). - -- The 'restrictinfra' server setting applies to rivers as well as to - roads/railroads. - -- Added Fort and Airstrip bases, required before you can build Fortress - or Airbase, respectively. It prevents the construction of full bases - in one single turn. The bases no longer protect full stacks from being - killed when one unit is defeated. - -- Specialists output reduced to 2 (same as civ2). There are wonders that - increase it to 3 for all players. - -- Enabled Tech Leakage: technologies are cheaper if already discovered - by other nations you have Embassy with. - -- The cost of each Tech is equal to the number of steps needed to get - the tech (Tech Cost = Base Cost * Number of Parents). It is a linear - formula more similar to civ2, and it fits better the new reduced - bonuses from Trade and Science. - -- Tech Upkeep assigned to Cities: some science is required from each - city to maintain a given technological level. The upkeep grows from 0 - during the middle ages, up to 10 Bulbs per city when the whole tech - tree was researched. If the global balance of Bulbs ends negative, one - technology is lost, and half of its value is restored to the count of - Bulbs. - -- No holes allowed in tech tree. To acquire a tech you must know its - prerequisites, and you cannot lose a tech that another depends on. - -- Some buildings, and all wonders, generate culture points in your - cities; certain achievements such as mapping the world also generate - culture points. By default, this only affects score; it also affects - migration (which is not enabled by default), and a cultural victory - can optionally be enabled. - -- Enabled risk of Plague at cities with population greater than 4. Chances - reduced by the buildings Aqueduct and Sewer System, the tech Medicine, - and the wonder Cure for Cancer. - -- Added other random disasters: Earthquake, Fire, Flood, Industrial - Accident, and Nuclear Accident. - -- Increased AI_love for AI players, in order to reduce the amount of - wars between them. - -OPTIONAL RULES: - -- Every player starts with 1 free Tech, 1 Settler, 1 Worker, - 1 Explorer, and 1 Diplomat. ('startunits', 'techlevel') - -- Minimum Distance between cities set to 3. ('citymindist') - -- Initial National Border equal to city radius (2 tiles). ('borders') - -- Restricted the use of infrastructure (roads, railroads, and rivers) - for enemy units. ('restrictinfra') - -- Unreachable units do not protect reachable ones. ('unreachableprotects') - -- Set Occupy Chance to 100%: Units automatically move to the target tile - if the attack is successful and ZoC rules allow the movement. - ('occupychance') - -- Halved change of building loss when city is conquered. ('razechance') - -- Revolutions become quicker the more times any player has changed to - the target government. ('revolentype') - - -FOODBOX: --------- - -- City FoodBox Size uniformed to even the population wasted when you - build Settlers at larger cities (similar to civ3). - -- Granary size is fixed to 10 Food for every city size. - -- Cities with Pop <= 4 receive this granary effect for free, so they can - create Settlers at best rate even without Granary. (This free granary - helps the AI to build Settlers optimally). +• Unlimited movement on rails delayed to maglev (available with Superconductors). Movement bonus on Railroads x6, on Roads x3, on Rivers x3 (non diagonal). +• The 'restrictinfra' server setting applies to rivers as well as to roads/railroads. +• Added Fort and Airstrip bases, required before you can build Fortress or Airbase. It prevents the construction of full bases in one single turn. The bases no longer protect full stacks from being killed when one unit is defeated. +• Specialists output reduced to 2 (same as civ2). There are wonders that increase it to 3 for all players. +• Enabled Tech Leakage: technologies are cheaper if already discovered by other nations you have Embassy with. +• The cost of each Tech is equal to the number of steps needed to get the tech (Tech Cost = Base Cost * Number of Parents). +• Tech Upkeep assigned to Cities: some science is required from each city to maintain a given technological level. The upkeep grows from 0 during the middle ages, up to 10 Bulbs per city when the whole tech tree was researched. +If the global balance of Bulbs ends negative, one technology is lost, and half of its value is restored to the count of Bulbs. +• No holes allowed in tech tree. To acquire a tech you must know its prerequisites. You cannot lose a tech that another depends on. +• Some buildings, and all wonders, generate culture points in your cities; certain achievements such as mapping the world also generate culture points. By default, this only affects score; it also affects migration (which is not enabled by default), and a cultural victory can optionally be enabled. +• Enabled risk of Plague at cities with population greater than 4. Chances are reduced by Aqueduct and Sewer System, the tech Medicine, and the wonder Cure for Cancer. +• Added other random disasters: Earthquake, Fire, Flood, Industrial Accident, and Nuclear Accident. +• Increased AI_love for AI players, in order to reduce the amount of wars between them. + +OPTIONAL RULES: +• Every player starts with 1 free Tech, 1 Settler, 1 Worker, 1 Explorer, and 1 Diplomat. ('startunits', 'techlevel') +• Minimum Distance between cities set to 3. ('citymindist') +• Initial National Border equal to city radius (2 tiles). ('borders') +• Restricted the use of infrastructure (roads, railroads, and rivers) for enemy units. ('restrictinfra') +• Unreachable units do not protect reachable ones. ('unreachableprotects') +• Set Occupy Chance to 100%: Units automatically move to the target tile if the attack is successful and ZoC rules allow the movement. ('occupychance') +• Halved the chance of building loss when city is conquered. ('razechance') +• Revolutions become quicker the more times any player has changed to the target government. ('revolentype') + +FOODBOX: +• City FoodBox Size uniformed to even the population wasted when you build Settlers at larger cities (similar to civ3). +• Granary size is fixed to 10 Food for every city size. +• Cities with Pop <= 4 receive this granary effect for free, so they can create Settlers at best rate even without Granary. (This free granary helps the AI to build Settlers optimally). CITY FOODBOX SETTLER FOODBOX SETTLER SIZE NEW NEW OLD OLD -1 20 - 20 - -2 20(10)# - 30(15) 20(5-15) +1 20 • 20 • +2 20(10)# • 30(15) 20(5-15) 3 20(10)# 20(20) 40(20) 30(10-20) 4 20(10)# 20(20) 50(25) 40(15-25) 5 20(10) 30(20) 60(30) 50(20-30) @@ -191,61 +73,25 @@ SIZE NEW NEW OLD OLD # Granary effect for free when city grows to this city level. FOODBOX = Foodbox size at that city level. (In brackets = Granary size). -SETTLER = Food needed to recover the population if you create a Settler - at that city size. (In brackets = The same but with Granary). +SETTLER = Food needed to recover the population if you create a Settler at that city size. (In brackets = The same but with Granary). NEW = This ruleset. OLD = Classic ruleset -TIP: In order to keep max growth, you should build the Granary before - city grows larger than Pop 4 (same as Aqueduct at Pop 8, and - Sewer System at Pop 16). -TIP: Optimal production of Settlers occurs at any city with Pop <= 4, or - cities with Granary and Pop <= 6. - - -TERRAIN: --------- - -- Jungles receive +1 Shield (1/1/0). Swamps can be irrigated for +1 Food - (to 2/0/0). Tundras can be mined for +1 Shield (instead of irrigated) - and receive +1 Trade when roaded (up to 1/1/1). - -- Deserts with a river receive 1 extra Food from irrigation (total 2), - unless they have an Oasis; this simulates a growth boost like Nile - floods. - -- Reduced Food bonus by 1 to Swamp/Spice; the original bonus can be - obtained by irrigating the Swamp. - -- Hills receive 1 Shield for free, and +2 from mines, same as civ3, - (was 0 and +3). Mountains receive +2 Shields from mines too (was +1). - -- Mountains give extra vision range. Cities can not be placed over - Mountains. Land units starting the turn on unroaded Mountains receive a -1 - penalty to movement (this way it is not so good for cavalry to end the - turn on Mountains). - -- The discovery of Refining allows to upgrade the mines placed on - Deserts and Glaciers to Oil Wells (+2 Shields in total). - -- Lake tiles receive for free +1 Food (2/0/2), while Harbours and - Offshore Platforms do not affect them. Lakes do not enable wonders - that needs a coastal city. - -- Deep ocean tiles must be mined (resulting in an Oil Platform) in order to - take advantage of the shield bonus from Offshore Platforms. - -- Pollution may appear in Ocean tiles, and Transports can clean it - without the need of Workers/Engineers. Jungles and Forests are less - affected by global warming. - -- Cities on rivers always get roads, even before Bridge Building - is known. - -- No minimum city output (was 1/1/0). City central tile simply gets - +1 Shield. - This way, no matter the tile where you place your city, you never - waste any resource (for example, with classic rules, a city placed - over bonused Grassland was wasting the Shield bonus). +TIP: In order to keep max growth, you should build the Granary before city grows larger than Pop 4 (same as Aqueduct at Pop 8, and Sewer System at Pop 16). +TIP: Optimal production of Settlers occurs at any city with Pop <= 4, or cities with Granary and Pop <= 6. + +TERRAIN: +• Jungles receive +1 Shield (1/1/0). Swamps can be irrigated for +1 Food (to 2/0/0). +• Tundra can be mined for +1 Shield (instead of irrigated and receive +1 Trade when roaded (up to 1/1/1). +• Deserts with a river receive 1 extra Food from irrigation (total 2), unless they have an Oasis; this simulates a growth boost like Nile floods. +• Reduced Food bonus by 1 on Swamp/Spice; the original bonus can be obtained by irrigating the Swamp. +• Hills receive 1 Shield for free, and +2 from mines (was 0 and +3). Mountains receive +2 Shields from mines too (was +1). +• Mountains give extra vision range. Cities can't be placed on Mountains. Land units starting the turn on unroaded Mountains receive a -1 penalty to movement. +• The discovery of Refining allows upgrading the mines placed on Deserts and Glaciers to Oil Wells (+2 Shields in total). +• Lake tiles receive +1 Food (2/0/2) free, while Harbours and Offshore Platforms do not affect them. Lakes do not enable wonders that need a coastal city. +• Deep ocean tiles must be mined (resulting in an Oil Platform) in order to take advantage of the shield bonus from Offshore Platforms. +• Pollution may appear in Ocean tiles, and Transports can clean it without the need of Workers/Engineers. Jungles and Forests are less affected by global warming. +• Cities on rivers always get roads, even before Bridge Building is known. +• No minimum city output (was 1/1/0). City central tile simply gets +1 Shield. TILE F/P/T IRRIG(t) MINE(t) ROAD MAX1 MAX2 TRANSFORM Deep 1/0/2 NO NO NO 2/0/2 2/1/2 No @@ -264,21 +110,12 @@ Mountains 0/1/0 NO *+2(10) +0(6) 0/3/0 0/4/0 Hills(36) F/P/T = Food/Production/Trade; (t) = turns MAX1 = irrigated/mined/roaded/harbour; MAX2 = farmland/railroad/oil well. -* = Changes compared to classic ruleset. Most affected are Jungles, - Swamps and Tundras. - -TIP: The optimal tiles to place your initial cities are those with MAX - output equal or greater than 2/1/1, mainly those with bonus - resources or rivers. Hills and Plains are always good places for - cities, as well as Flood Desert (desert with river), or bonused - Grassland. The best defense comes from cities placed on Hills with - river. +* = Changes compared to classic ruleset. Most affected are Jungles, Swamps and Tundras. +TIP: The optimal tiles to place your initial cities are those with MAX output equal or greater than 2/1/1, mainly those with bonus resources or rivers. Hills and Plains are always good places for cities, as well as Flood Desert (desert with river), or bonused Grassland. The best defense comes from cities placed on Hills with river. -DEFENSE: --------- - -- Halved the terrain defense bonuses, now more similar to civ3 values: +DEFENSE: +• Halved the terrain defense bonuses, more similar to civ3 values: TERRAIN NEW OLD Forest/Jungle/Swamp +25% +50% @@ -293,8 +130,7 @@ Hardened +75% (=) Elite +100% (=) FORTIFIED +50% (=) -(only Land and Big Land units can fortify; inside cities, they are -always considered fortified) +(only Land and Big Land units can fortify; inside cities, they are always considered fortified) BASE VS LAND VS SEA VS AIR VS MISSILE Fort +50% +50% +0% +0% @@ -313,41 +149,29 @@ Coastal Defense +0% +100% +0% +0% SAM Battery +0% +0% +100% +0% SDI Defense +0% +0% +0% +100% -- Every City of any size receives an inherent Defend_Bonus = +50% - against all kinds of land units. - -- Every City with Pop>8 receives an additional free Defend_Bonus = +50% - against both land and sea units. +• Every City of any size receives an inherent Defend_Bonus = +50% against all kinds of land units. -- Walls effect reduced from 200% to 100%, and cost reduced from 60 - to 30. +• Every City with Pop>8 receives an additional free Defend_Bonus = +50% against both land and sea units. -- Great Wall gives additional Defend_Bonus = +50% against Land units, - and prevents population loss in any city when a defending unit loses. +• Walls effect reduced from 200% to 100%, and cost reduced from 60 to 30. -Total Defense = (UNIT DEFENSE) * (100+TERRAIN)/100 * (100+RIVER)/100 - * (100+CITY+BASE)/100 * (100+FORTIFIED)/100 * (100+VETERAN)/100 -(Same as classic rules). +• Great Wall gives additional Defend_Bonus = +50% against Land units, and prevents population loss in any city when a defending unit loses. -EXAMPLE: Riflemen fortified in a fortress, on mountains, with a river, - will get a total defense of 30 against land attacks: +Total Defense = (UNIT DEFENSE) * (100+TERRAIN)/100 * (100+RIVER)/100 * (100+CITY+BASE)/100 * (100+FORTIFIED)/100 * (100+VETERAN)/100 (Same as classic rules). +EXAMPLE: Riflemen fortified in a fortress, on mountains, with a river, will get a total defense of 30 against land attacks: Riflemen: defense 4 Fortified (+50%): 4 + 2 = 6 In Fortress (+100%): 6 + 6 = 12 On Mountains (+100%): 12 + 12 = 24 With River (+25%): 24 + 6 = 30. -EXAMPLE: Riflemen in a size 9 city, with walls, on hills, - will get a total defense of 27 against land attacks: - +EXAMPLE: Riflemen in a size 9 city, with walls, on hills, will get a total defense of 27 against land attacks: Fortified (+50%): 4 + 2 = 6 On Hills (+50%): 6 + 3 = 9 In City with Walls (+200%): 9 + 18 = 27. - -GOVERNMENTS: ------------- +GOVERNMENTS: Anarch Tribal Despot Monarc Fundam Republ Democr Federat Commun Tax/Lux/Sci Rate 0 60 60 70 70 80 90 90 80 Output per tile # -1(if>2) -1(if>2) -1(if>2) 0 0 +1Trade +1Trade 0 0 @@ -369,212 +193,77 @@ Corrup by Dist * 1 1 1 1 1 1 1 Base Waste 30% 0% 10% 20% 15% 5% 25% 30% 0% Waste by Dist ** 1 1 1 1 1 1 1 0 0 -* Corruption by Distance is doubled until The Corporation is researched - by the player (or increased to 1 for Federation). +* Corruption by Distance is doubled until The Corporation is researched by the player (or increased to 1 for Federation). ** Waste by Distance is doubled until Trade is researched by the player. -# This penalty is negated by The Pyramids wonder, or when Railroad is - researched by the player. -+ Partisans appear in conquered cities (democratic or communist) if - Guerilla Warfare has been researched by any player. - -Added Fundamentalism (available with Theology), Tribal (available at -start) and Federation (available with Economics). - -- "Base Corruption/Waste": Modern governments cause less Trade - Corruption, but more Wasted Production. The total % lost (Waste + - Corruption) is equal for all governments. - -- "Empire Size" (number of cities that start causing extra unhappiness): - Modern governments have double size limit than his ancient - counterpart. Empire Base Size is equal to Empire Step Size for every - government. - -- "Unit Upkeep": Tribal, Republic and Communism use the standard unit - upkeep by Shields, while the other governments use Gold upkeep (x2 - Gold per unit for modern governments). - -- "Free Units": Means units free of Gold/Shield upkeep and also free of - Military Unhappiness. By default 2 free units per city. - -- "Mil Unhappiness": Most governments are affected by Military - Unhappiness due to units out of cities/fortresses (same as Republic - in classic ruleset). - -- "Martial Law": Max 3 units can apply Martial Law (was max 20 for - Despotism and Anarchy). - -- The bonus "+1 Trade" under Republic and Democracy does not affect - oceanic tiles. This way, oceanic tiles are more even to land tiles - under any government. - -- Republic receives Revolution_When_Unhappy and has unbribable units, - Federation receives Has_senate and has unincitable cities (Democracy - receives all them). - -- Spies built under Communism or Federation will start at the first - veteran level. Federation grants +2 Luxury per city. - -- Under Communism you do not pay upkeep for buildings that cost 1 Gold. - Communism cancels the bonus from Mysticism and Theology (to Temples - and Cathedrals). +# This penalty is negated by The Pyramids wonder, or when Railroad is researched by the player. ++ Partisans appear in conquered cities (democratic or communist) if Guerilla Warfare has been researched by any player. -- Under Fundamentalism you receive extra Gold from Tithes, but -50% to - Science. +• Added Fundamentalism (available with Theology), Tribal (available at start) and Federation (available with Economics). +• "Base Corruption/Waste": Modern governments cause less Trade Corruption, but more Wasted Production. The total % lost (Waste + Corruption) is equal for all governments. +• "Empire Size" (number of cities that start causing extra unhappiness): Modern governments have double size limit than his ancient counterpart. Empire Base Size is equal to Empire Step Size for every government. +• "Unit Upkeep": Tribal, Republic and Communism use the standard unit upkeep by Shields, while the other governments use Gold upkeep (x2 Gold per unit for modern governments). +• "Free Units": Means units free of Gold/Shield upkeep and also free of Military Unhappiness. By default 2 free units per city. +• "Mil Unhappiness": Most governments are affected by Military Unhappiness due to units out of cities/fortresses (same as Republic in classic ruleset). +• "Martial Law": Max 3 units can apply Martial Law (was max 20 for Despotism and Anarchy). +• The bonus "+1 Trade" under Republic and Democracy does not affect oceanic tiles. This way, oceanic tiles are more even to land tiles under any government. +• Republic receives Revolution_When_Unhappy and has unbribable units, Federation receives Has_senate and has unincitable cities (Democracy receives all them). +• Spies built under Communism or Federation will start at the first veteran level. Federation grants +2 Luxury per city. +• Under Communism you do not pay upkeep for buildings that cost 1 Gold. Communism cancels the bonus from Mysticism and Theology (to Temples and Cathedrals). +• Under Fundamentalism you receive extra Gold from Tithes, but -50% to Science. +• The Bonus to production at Palace (under Despotism and Monarchy) switched from Shields to Gold. +• Tribal government increases by half the chance of land units getting the next veteran level after a battle. Every city gets 1 extra content citizen, but units can't apply Martial Law. +TIP: There is some hurry to get Monarchy or Republic (or to build Pyramids), in order to avoid the initial penalty to output per tile. However, the Corruption and Waste are evened for all governments, so there are no big differences, and every government could be used at any technological age. The choice depends on the role of your civilization. -- The Bonus to production at Palace (under Despotism and Monarchy) - switched from Shields to Gold. +TECHS: +• Added new wonders: Mausoleum of Mausolos (available with Ceremonial Burial), and Statue of Zeus (available with Polytheism). Oracle of Delphi renamed to Temple of Artemis (in order to allow all 7 wonders). -- Tribal government increases by half the chance of land units getting - the next veteran level after a battle. Every city gets 1 extra content - citizen, but units can't apply Martial Law. +• Moved Great Wall to Construction (was Masonry). Moved King Richard's Crusade to Chivalry, so it requires Monarchy and Knights. Women's Suffrage moved to Conscription, so it requires Democracy. Switched Darwin's Voyage and Eiffel Tower (Darwin was earlier than Eiffel). Shakespeare's Theatre available with Sanitation (was Medicine). -TIP: There is some hurry to get Monarchy or Republic (or to build - Pyramids), in order to avoid the initial penalty to output per - tile. However, the Corruption and Waste are evened for all - governments, so there are no big differences, and every government - could be used at any technological age. The choice depends on the - role of your civilization. +• Diplomats available with Alphabet (was Writing), and Migrants with Pottery, so every initial tech allows some unit or building. +• Coastal Defense moved to Magnetism*. AI likes defense improvements and this change encourages them to develop Frigates/Galleons early in game. + (*) The labels and icons for "Magnetism" and "Navigation" were switched, because compass was already used by historical Caravels, while sextants were not invented until the age of Galleons/Frigates. -TECHS: ------- +• Construction requires Iron Working instead of Currency. This way, Iron Working is a prerequisite to build Frigates and Ironclads. -- Added new wonders: Mausoleum of Mausolos (available with Ceremonial - Burial), and Statue of Zeus (available with Polytheism). Oracle of - Delphi renamed to Temple of Artemis (in order to allow all 7 wonders). +• Bridge Building merged to old Engineering in the tech tree. Added modern "Engineering" in the Industrial Ages that allows Destroyers (was Electricity) and Transports (was Industrialization), and it is required for Steel (Cruiser), Amphibious Warfare (Ports), and Combustion (Submarines). -- Moved Great Wall to Construction (was Masonry). Moved King Richard's - Crusade to Chivalry, so it requires Monarchy and Knights. Women's - Suffrage moved to Conscription, so it requires Democracy. Switched - Darwin's Voyage and Eiffel Tower (Darwin was earlier than Eiffel). - Shakespeare's Theatre available with Sanitation (was Medicine). +• Battleship available with Mass Production instead of Automobile. Mfg Plant available with Plastics (was Robotics). -- Diplomats available with Alphabet (was Writing), and Migrants with - Pottery, so every initial tech allows some unit or building. +• Nuclear Fission requires Refrigeration, in order to delay the Atomic age, and to force the AI to research farms. Communism requires Theology (Fundamentalism) instead of Philosophy, to encourage AI to research all governments. -- Coastal Defense moved to Magnetism*. AI likes defense improvements and - this change encourages them to develop Frigates/Galleons early in - game. - (*) The labels and icons for "Magnetism" and "Navigation" were - switched, because compass was already used by historical Caravels, - while sextants were not invented until the age of Galleons/Frigates. - -- Construction requires Iron Working instead of Currency. This way, - Iron Working is a prerequisite to build Frigates and Ironclads. - -- Bridge Building merged to old Engineering in the tech tree. Added - modern "Engineering" in the Industrial Ages that allows Destroyers - (was Electricity) and Transports (was Industrialization), and it is - required for Steel (Cruiser), Amphibious Warfare (Ports), and - Combustion (Submarines). - -- Battleship available with Mass Production instead of Automobile. - Mfg Plant available with Plastics (was Robotics). - -- Nuclear Fission requires Refrigeration, in order to delay the Atomic - age, and to force the AI to research farms. Communism requires - Theology (Fundamentalism) instead of Philosophy, to encourage AI to - research all governments. - -- Fusion Power allows Engineers to perform terrain transformations, that - were simplified so there is no need to chain more than one - transformation in the same terrain. +• Fusion Power allows Engineers to perform terrain transformations, that were simplified so there is no need to chain more than one transformation in the same terrain. Special effects: -- Astronomy: Increases units vision when in fortresses. -- Invention: Halves upgrade cost of your units. -- Medicine: Reduces by 30% the chance of illness in your cities. -- Electricity: Allows irrigation without adjacent water, increases city - vision radius, and the effect of Colosseums. -- Trade: Decreases one-time the waste of Shields caused by distance to - capital. -- The Corporation: Decreases one-time the corruption of Trade caused by - distance to capital. - -The Techs, Buildings, Wonders and Units are the same as civ2, but some -requirements have been changed to improve a bit the historical accuracy, -to encourage the use of every military unit, and to avoid units or -wonders becoming obsolete too soon. The following is a list of some -inaccuracies from classic tech tree that were addressed in the new tree: -- It was possible to research Pikemen before Phalanxs; Musketeers before - Pikemen; Ironclads before Frigates; Destroyers before Ironclads; - Armors before Artillery; Mech Infantry without Barracks III. -- Cathedrals did not require Construction nor Masonry. Ironclads and - Eiffel Tower were available without Iron Working. Chivalry and Pikemen - did not need Iron nor Bronze. -- Pottery was not needed to research Trade, Economics, Explosives, - Invention, or Sanitation. -- Chemistry was not related to Atomic theory, Refrigeration, Gunpowder, - Steam Engine, or Steel. -- Theory of Gravity did not need Physics, Invention, or even The Wheel, - and it was not needed for Automobile, Robotics, or Miniaturization. -- Offshore Platforms did not require Refining, Combustion or Explosives. - Miniaturization was not needed for Rocketry or Laser. - -In the new tree, you are forced to research most of the ancient techs -before you can research the modern ones, but overall, researching paths -are similar to classic tree. - - -BUILDINGS: ----------- - -- Aqueduct is cheaper near rivers or lakes. Sewer System is needed to - grow larger than pop 16 (instead of 12). Each one reduces the chances - of illness by -30%. - -- Created a new building: Ecclesiastical Palace (available with - Theology), that acts as a second center of government that lowers - corruption and waste. - -- Courthouse: Make_Content = 1, and reduces to half any kind of waste - (Trade, Shields or Food). - - Added new effect: Food wasted by distance to Palace = -1% Food each 2 - tiles. - For example, cities at distance 20 of the Palace lose -10% Food - (-5% with courthouse), so they lose -1 Food when their production - reaches 10 Food per turn (20 Food per turn with courthouse), - noticeable when city reaches size 5 or so (around city size 10 with - courthouse). - -- Granary halves the waste of food caused by distance to Palace. - Together with a Courthouse, it eliminates completely the waste of - food. - -- Police Station: Make_Content = 2, and reduces unhappiness caused by 1 - Military unit. - -- Science bonus by buildings (Library, University and Research Lab) - restored to civ2 values (+50%). There are wonders that double the - effect later. - -- Production bonus by Factory and Mfg Plant reduced to +25% each - (was +50%), so the Power Plants are as important as the Factories. - Mfg Plants allows the construction of 2 units per turn. - -- Super Highways double the effect of Stock Exchange (+50% to - Gold/Luxuries), and they produce extra Trade at tiles with roads but - without farmlands (the classic effect was overpowered under - Democracy/Republic). The city center tile can still have both farmland - and Super Highways bonuses. - -- Doubled costs of all Spaceship parts. All them require Library, - University, Research Lab and Factory present in the city in order to - be built. - -- Reduced by one the gold upkeep of Aqueduct, Colosseum (renamed to - Amphitheatre), University, Bank, Stock Exchange, Port Facility, - SDI Defense, Factory and Mfg Plant. - -- Pollution caused by population is increased by buildings instead of by - techs: - Industrialization->Factory; Automobile->Highways; Plastics->Mfg Plant; +• Astronomy: Increases units vision when in fortresses. +• Invention: Halves upgrade cost of your units. +• Medicine: Reduces by 30% the chance of illness in your cities. +• Electricity: Allows irrigation without adjacent water, increases city vision radius, and the effect of Colosseums. +• Trade: Decreases one-time the waste of Shields caused by distance to capital. +• The Corporation: Decreases one-time the corruption of Trade caused by distance to capital. + +The Techs, Buildings, Wonders and Units are the same as civ2, but some requirements have been changed to improve historical accuracy, to encourage the use of every military unit, and to avoid units or wonders becoming obsolete too soon. +In the new tree, you are forced to research most of the ancient techs before you can research the modern ones. + +BUILDINGS: +• Aqueduct is cheaper near rivers or lakes. Sewer System is needed to grow larger than pop 16 (instead of 12). Each one reduces the chances of illness by -30%. +• Created a new building: Ecclesiastical Palace (available with Theology), that acts as a second center of government that lowers corruption and waste. +• Courthouse: Make_Content = 1, and reduces to half any kind of waste (Trade, Shields or Food). +• Added new effect: Food wasted by distance to Palace = -1% Food each 2 tiles. + For example, cities at distance 20 of the Palace lose -10% Food (-5% with courthouse), so they lose -1 Food when their production reaches 10 Food per turn (20 Food per turn with courthouse), noticeable when city reaches size 5 or so (around city size 10 with courthouse). +• Granary halves the waste of food caused by distance to Palace. Together with a Courthouse, it eliminates completely the waste of food. +• Police Station: Make_Content = 2, and reduces unhappiness caused by 1 Military unit. +• Science bonus by buildings (Library, University and Research Lab) restored to civ2 values (+50%). There are wonders that double the effect later. +• Production bonus by Factory and Mfg Plant reduced to +25% each (was +50%), so the Power Plants are as important as the Factories. Mfg Plants allows the construction of 2 units per turn. +• Super Highways double the effect of Stock Exchange (+50% to Gold/Luxuries), and they produce extra Trade at tiles with roads but without farmlands. The city center tile can still have both farmland and Super Highways bonuses. +• Doubled costs of all Spaceship parts. All them require Library, University, Research Lab and Factory present in the city in order to be built. +• Reduced by one the gold upkeep of Aqueduct, Colosseum (renamed to Amphitheatre), University, Bank, Stock Exchange, Port Facility, SDI Defense, Factory and Mfg Plant. +• Pollution caused by population is increased by buildings instead of by techs: + Industrialization->Factory; + Automobile->Highways; + Plastics->Mfg Plant; Mass Production->Offshore platforms. - -- Adjusted the Pollution of all Power Plants, and increased building - cost of Nuclear Plants: - +• Adjusted the Pollution of all Power Plants, and increased building cost of Nuclear Plants: Cost Upkeep Shields Pollution(+Recycle) Power plant 130 4 +25%/+50% 100%(50%) Hydro plant 180 4 +25%/+50% 50% (25%) @@ -582,122 +271,36 @@ Hydro plant 180 4 +25%/+50% 50% (25%) Nuclear plant 240 2 +25%/+50% 50% (25%) Solar plant 320 4 +25%/+50% 25% (0%) - -UNITS: ------- - -- Settlers pop cost increased to 2 and removed the upkeep. New unit - Migrants available to work, or to migrate 1 pop, they can't create - cities and can be captured. Costs more similar to civ3: - +UNITS: +• Settlers pop cost increased to 2 and removed the upkeep. New unit Migrants available to work, or to migrate 1 pop, they can't create cities and can be captured. Settlers: pop_cost = 2, cost = 30, upkeep = 0 Migrants: pop_cost = 1, cost = 10, upkeep = 0 Workers: pop_cost = 0, cost = 20, upkeep = 1 -- Non-military units now belongs to a new unit class ("Small Land") that - can not pillage, nor capture cities, and does not create Zones of - Control that would affect the movements of enemy units. - -- Created a new unit class for Caravans and Freights ("Merchant") that - doesn't get the unlimited movement from Maglev, and can be captured. - They can only establish Trade Routes to foreign cities. - -- Land units can capture enemy Migrants (as slaves) and - Caravans/Freights (as loot). - -- Wheeled units (new unit class "Big Land") can't move to Mountains, - Jungles and Swamps, unless they are travelling on a road. They do not - get defensive bonuses from the terrain, can not perform pillage, and - need Galleons or Transports to travel by sea. - -- Only "Big Land" units can cause population loss when attacking a city. - -- Units stay alive when they establish embassies or investigate cities, - and they can do it directly from boats without disembarking. Explorers - can also perform those two actions, same as Diplomats. Increased - vision range of Explorers and Partisans. - -- Added Elephants from civ2, available with Polytheism: - (at/def/mov-hp,cost) = (3/2/2-10,30). Obsolete by Dragoons. - -- Added Crusaders from civ2, available with Monotheism: (5/1/2-10,40). - Obsolete by Dragoons. They do not cause military unhappiness. - -- Added Fanatics from civ2, available with Guerrilla, under - Fundamentalism government: (5/5/1-20,20). They cost 1 population, but - do not cause unhappiness and do not need upkeep. - -- Archers defense reduced to 1 (was 2), and cost to 20 (was 30). Legion - cost reduced to 30 (was 40). This way the ratio Attack/Cost of ancient - units is more even to Catapults. - -- Pikemen changed to (2/3), cost to 30, and removed the doubled defense - vs horses. Attack of Chariots increased to 4 (was 3). Defense of - Knights increased to 3 (was 2). In order to encourage early use of - cavalry. - -- Alpine Troops changed to (7/4), and Partisan to (4/5). This way, - Riflemen do not become obsolete as city defenders until Partisan or - Marine are researched, and every modern infantry is somehow useful. - -- Given Marine ability to Legion, Musketeer, and Rifleman. This way, - one-tile islands can be assaulted early in game. Yet, the Marine unit - is still the best offensive/defensive infantry. - -- Triremes can navigate rivers. Caravel changed from (2/1) to (1/2), in - order to encourage peaceful exploration of the seas in the age of - discovery. - -- Removed transport capability from Frigates, to force the use of - Galleons. Reduced attack of Frigate and defense of Ironclad to 3 - (was 4). - -- Battleship hit points reduced to 30 (was 40), Ironclad and Submarine - to 20 (was 30). Doubled the defense of Destroyers against Submarines. - Now there is a Rock-paper-scissors relation between - Destroyer-Cruiser-Submarine. - -- All units that had Firepower 2 now have Firepower 1, in order to even - the power of naval, air, and artillery units, and to simplify the - mental calculation to compare them. - -- Artillery and Howitzer receive the ability CityBuster, so their - firepower is 1 in open field, and 2 against cities. Removed Ignore - Walls for Howitzer (that would bypass the new city defense bonuses), - and reduced movement to 1. - -- Bombers and Helicopters receive the Bombarder ability: when they - attack land units, they can only damage (not kill) them, but damage - every unit in a stack or city; and are never damaged while attacking. - Note they have a normal attack against sea units (they still can kill - or die). - Halved the attack so it is harder to bombard land enemies - successfully. Increased hit points so it is still possible to kill - naval units. - -- Air units can perform pillage (representing bombardment of - infrastructure), and can be Airlifted from a city with an Airport to - another. Increased defense of all Air units, in order to discourage - the use of Land units to protect them. - -- Increased fuel of all planes by one (giving them an extra turn in - the air), in order to allow battles for air control. All planes - lose 10% of HPs, like helicopters, when they end a turn outside a city, - airstrip, or airbase. - -- Helicopters can carry 1 military Land unit, and can only be attacked - by Fighters (with no extra attack bonuses), and by Missiles. Carriers - can also transport military Land units. - -- Cruise Missile no longer cause unhappiness, range increased to 16, - and allowed to attack Air units. - -- Nuclear weapons can be built with Nuclear Fission, but you need - Advanced Flight to move them, and Rocketry to get max movement. - -- Readjusted many costs so units with better stats are always more - expensive. At the same time, modern units always get better ratio - Att/Cost or Def/Cost. +• Non-military units now belongs to a new unit class ("Small Land") that can't pillage. +• Created a new unit class for Caravans and Freights ("Merchant") that doesn't get the unlimited movement from Maglev, and can be captured. +• Land units can capture enemy Migrants (as slaves) and Caravans/Freights (as loot). +• Wheeled units (new unit class "Big Land") can't move to Mountains, Jungles and Swamps, unless they are travelling on a road. They do not get defensive bonuses from the terrain, can't pillage, and need Galleons or Transports to travel by sea. +• Only "Big Land" units can cause population loss when attacking a city. +• Units stay alive when they establish embassies or investigate cities, and they can do it directly from boats. Explorers can also perform those two actions, same as Diplomats. Increased vision of Explorers and Partisans. +• Archers defense reduced to 1 (was 2), and cost to 20 (was 30). Legion cost reduced to 30 (was 40). This way the ratio Attack/Cost of ancient units is more even to Catapults. +• Pikemen changed to (2/3), cost to 30, and removed the doubled defense vs horses. +• Attack of Chariots increased to 4 (was 3). Defense of Knights increased to 3 (was 2). In order to encourage early use of cavalry. +• Alpine Troops changed to (7/4), and Partisan to (4/5). This way, Riflemen do not become obsolete as city defenders until Partisan or Marine are researched, and every modern infantry is somehow useful. +• Given Marine ability to Legion, Musketeer, and Rifleman. This way, one-tile islands can be assaulted early in game. +• Triremes can navigate rivers. Caravel changed from (2/1) to (1/2), in order to encourage peaceful exploration of the seas in the age of discovery. +• Removed transport capability from Frigates, to force the use of Galleons. Reduced attack of Frigate and defense of Ironclad to 3 (was 4). +• Battleship hit points reduced to 30 (was 40), Ironclad and Submarine to 20 (was 30). Doubled the defense of Destroyers against Submarines. +• Now there is a Rock-paper-scissors relation between Destroyer-Cruiser-Submarine. +• All units that had Firepower 2 now have Firepower 1, in order to even the power of naval, air, and artillery units, and to simplify the mental calculation to compare them. +• Artillery and Howitzer receive the ability CityBuster, so their firepower is 1 in open field, and 2 against cities. Removed Ignore Walls for Howitzer (that would bypass the new city defense bonuses), and reduced movement to 1. +• Bombers and Helicopters receive the Bombarder ability: when they attack land units, they can only damage (not kill) them, but damage every unit in a stack or city; and are never damaged while attacking. Note they have a normal attack against sea units (they still can kill or die). Halved the attack so it is harder to bombard land enemies successfully. Increased hit points so it is still possible to kill naval units. +• Air units can perform pillage (representing bombardment of infrastructure), and can be Airlifted from a city with an Airport to another. Increased defense of all Air units, in order to discourage the use of Land units to protect them. +• Increased fuel of all planes by one (giving them an extra turn in the air), in order to allow battles for air control. All planes lose 10% of HPs, like helicopters, when they end a turn outside a city, airstrip, or airbase. +• Helicopters can carry 1 military Land unit, and can only be attacked by Fighters (with no extra attack bonuses), and by Missiles. Carriers can also transport military Land units. +• Cruise Missile no longer cause unhappiness, range increased to 16, and allowed to attack Air units. +• Nuclear weapons can be built with Nuclear Fission, but you need Advanced Flight to move them, and Rocketry to get max movement. +• Readjusted many costs so units with better stats are always more expensive. At the same time, modern units always get better ratio Att/Cost or Def/Cost. UNIT Att Def Mov FP HP Cost Warrior 1 1 1 1 10 10 @@ -755,136 +358,64 @@ FP = Firepower, HP = Hit Points * = Changes compared to classic ruleset. Most affected are modern infantry, air units, and all units that had 2 firepower. +WONDERS: +Readjusted effects for most wonders. Restored all civ2 costs. -WONDERS: --------- +• Modified all effects that worked as if you had certain building in every city. +• Replaced every effect Make_Happy, Force_content, and No_unhappy, by additional Luxury in the central city tile. Else they would allow a possible exploit to avoid unhappiness caused by Military units. +• Replaced effect that gives a percentage bonus to Science output, by additional Science in the central city tile. This way, they do not multiply the effect of other wonders like Colossus, and it is not an advantage to build them all in the same city. -Readjusted effects for most wonders. Restored all civ2 costs. +• Your Caravans and Freight can help build allies' or team-mates' wonders. -- Modified all effects that worked as if you had certain building in - every city. +• Wonders become obsolete by techs researched by the owner (not affected by the researches of other players). -- Replaced every effect Make_Happy, Force_content, and No_unhappy, by - additional Luxury in the central city tile. Else they would allow a - possible exploit to avoid unhappiness caused by Military units. +• Some Wonders require certain building in the city to be built. -- Replaced effect that gives a percentage bonus to Science output, by - additional Science in the central city tile. This way, they do not - multiply the effect of other wonders like Colossus, and it is not an - advantage to build them all in the same city. +FULL LIST OF WONDERS +(#) = Global effect, "Name", Cost, Obsolete, Effect -- Your Caravans and Freight can help build allies' or team-mates' - wonders. +• "Pyramids" 200, Obsolete by Railroad (that increases even more the Shield production): +1 Shield per worked tile in the city (already producing Shields). Disables tile penalty under Despotism/Tribal governments. +• "Colossus" 200, Obsolete by Automobile (Super Highways): +1 Trade per worked tile in the city (already producing Trade). +• "Copernicus' Observatory" 300, Obsolete by Computers (Research Lab): +1 Science per worked tile in the city. -- Wonders become obsolete by techs researched by the owner (not affected - by the researches of other players). +• "Hanging Gardens" 200, Obsolete by Electricity (that increases Colosseum effect): +1 Content in every city. +4 Luxury in the city where it is built. +• "Mausoleum of Mausolos" 200, Obsolete by Sanitation (that enables wonder with similar effect): +1 Content in every city with Walls, and +1 extra content in every city with Courthouse. Your cities cannot be incited to revolt. +• "Temple of Artemis" 200, Requires Temple, Obsolete by Theology (that enables wonder with similar effect): +2 Content in every city with Temple. +• "Michelangelo's Chapel" 400, Requires Cathedral: +3 Content in every city with Cathedral. -- Some Wonders require certain building in the city to be built. +• "J.S. Bach's Cathedral" 400: +2 Luxuries in every city. +• "Cure For Cancer" 600: +2 Luxuries in every city. -10% chance of illness. -FULL LIST OF WONDERS -(#) = Global effect, "Name", Cost, Obsolete, Effect +• (#)"Shakespeare's Theatre" 300: Entertainer = 3 luxury for all nations. +1 Luxury in every city, +6 Luxury where it is built. +• (#)"A.Smith's Trading Co" 400, Requires Stock Exchange: Taxman Specialist_Output = 3 for Every Nation. Free upkeep for buildings that cost 1 Gold, in every city with Stock Exchange. +• (#)"Darwin's Voyage" 400: Scientist Specialist_Output = 3 for Every Nation. +1 Science in every city. -- "Pyramids" 200, Obsolete by Railroad (that increases even more the - Shield production): - +1 Shield per worked tile in the city (already producing Shields). - Disables tile penalty under Despotism/Tribal governments. -- "Colossus" 200, Obsolete by Automobile (Super Highways): - +1 Trade per worked tile in the city (already producing Trade). -- "Copernicus' Observatory" 300, Obsolete by Computers (Research Lab): - +1 Science per worked tile in the city. - -- "Hanging Gardens" 200, Obsolete by Electricity (that increases - Colosseum effect): - +1 Content in every city. +4 Luxury in the city where it is built. -- "Mausoleum of Mausolos" 200, Obsolete by Sanitation (that enables - wonder with similar effect): - +1 Content in every city with Walls, and +1 extra content in every - city with Courthouse. Your cities cannot be incited to revolt. -- "Temple of Artemis" 200, Requires Temple, Obsolete by Theology (that - enables wonder with similar effect): - +2 Content in every city with Temple. -- "Michelangelo's Chapel" 400, Requires Cathedral: - +3 Content in every city with Cathedral. - -- "J.S. Bach's Cathedral" 400: - +2 Luxuries in every city. -- "Cure For Cancer" 600: - +2 Luxuries in every city. -10% chance of illness. - -- (#)"Shakespeare's Theatre" 300: - Elvis Specialist_Output = 3 for Every Nation. +1 Luxury in every city, - +6 Luxury where it is built. -- (#)"A.Smith's Trading Co" 400, Requires Stock Exchange: - Taxman Specialist_Output = 3 for Every Nation. Free upkeep for - buildings that cost 1 Gold, in every city with Stock Exchange. -- (#)"Darwin's Voyage" 400: - Scientist Specialist_Output = 3 for Every Nation. +1 Science in every - city. - -- (#)"Great Library" 300, Requires Library: - Doubles the effect of Library for Every Nation. Gives an immediate - technology advance. +4 Science where it is built. -- (#)"Isaac Newton's College" 400, Requires University: - Doubles the effect of University for Every Nation. Gives an immediate - technology advance. +6 Science where it is built. -- (#)"Internet" 600, Requires Research Lab: - Doubles the effect of Research Lab for Every Nation. Gives an - immediate technology advance. Reveals all cities in the map for the - owner. - -- "Lighthouse" 200, Obsolete by Engineering (Destroyer): - +1 move, and Veteran built, for Trireme and Sea units. -- "Magellan's Expedition" 400, Obsolete by Nuclear Power (that increases - even more movement of sea units): - +1 move, and +50% chance to become veteran, for Sea units (No - triremes). -- "Sun Tzu's War Academy" 300, Obsolete by Mobile Warfare: - Veteran built, cumulative to barracks, for Military Land units. - -- "Statue of Zeus" 200, Obsolete by Conscription (that enables wonder - with similar effect): - +1 Military Content, +1 free Shield per city for upkeep of units. -- "King Richard's Crusade" 300, Obsolete by Communism (Police Station): - +1 Military Content, +2 free Gold per city for upkeep of units. -- "Women's Suffrage" 600: - +1 Military Content. Summed to Police Stations effect. Under Democracy - it halves the unhappiness caused by Military units. - -- "Marco Polo's Embassy" 200, Obsolete by Democracy: - Embassy with all players. -- "Eiffel Tower" 300: - +10 to AI love for the owner. Reduces the pollution caused by the - population in all your cities (-25%). -- "Statue of Liberty" 400: - Disables Has_Senate effect. Any government available. No Anarchy - periods when government changes. -- (#)"United Nations" 600: - +10 to AI love for the owner. Revolution_When_Unhappy and Has_Senate - for every nation. - -- "Great Wall" 300, Obsolete by Machine Tools (Artillery): - +50% Defense bonus against Land units in every city, and cities do not - lose population due to attacks. -- "Leonardo's Workshop" 400, Obsolete by Combustion: - Upgrades one obsolete unit per game turn. -- "Hoover Dam" 600, Requires Factory: - Gives to every Hydro Plant the same effect than Solar Plants - (-25% pollution). -- (#)"Manhattan Project" 600: - Enables nuclear units for Every Nation. -- (#)"Apollo Program" 600: - Enables space race for Every Nation. Makes entire map permanently - visible for the owner. - -Special "Cold War" effect: if Manhattan Project and United Nations were -built, every nation with nuclear power receives the Has_Senate effect, -until the Apollo Program is finished. - - -THANKS: -------- - -To every people who collaborated to create this wonderful Freeciv game. -Specially to those who programmed the Ruleset modding capabilities and -the AI capable to play with them. +• (#)"Great Library" 300, Requires Library: Doubles the effect of Library for Every Nation. Gives an immediate technology advance. +4 Science where it is built. +• (#)"Isaac Newton's College" 400, Requires University: Doubles the effect of University for Every Nation. Gives an immediate technology advance. +6 Science where it is built. +• (#)"Internet" 600, Requires Research Lab: Doubles the effect of Research Lab for Every Nation. Gives an immediate technology advance. Reveals all cities in the map for the owner. + +• "Lighthouse" 200, Obsolete by Engineering (Destroyer): +1 move, and Veteran built, for Trireme and Sea units. +• "Magellan's Expedition" 400, Obsolete by Nuclear Power (that increases even more movement of sea units): +1 move, and +50% chance to become veteran, for Sea units (No triremes). +• "Sun Tzu's War Academy" 300, Obsolete by Mobile Warfare: Veteran built, cumulative to barracks, for Military Land units. + +• "Statue of Zeus" 200, Obsolete by Conscription (that enables wonder with similar effect): +1 Military Content, +1 free Shield per city for upkeep of units. +• "King Richard's Crusade" 300, Obsolete by Communism (Police Station): +1 Military Content, +2 free Gold per city for upkeep of units. +• "Women's Suffrage" 600: +1 Military Content. Summed to Police Stations effect. Under Democracy it halves the unhappiness caused by Military units. + +• "Marco Polo's Embassy" 200, Obsolete by Democracy: Embassy with all players. +• "Eiffel Tower" 300: +10 to AI love for the owner. Reduces the pollution caused by the population in all your cities (-25%). +• "Statue of Liberty" 400: Disables Has_Senate effect. Any government available. No Anarchy periods when government changes. +• (#)"United Nations" 600: +10 to AI love for the owner. Revolution_When_Unhappy and Has_Senate for every nation. + +• "Great Wall" 300, Obsolete by Machine Tools (Artillery): +50% Defense bonus against Land units in every city, and cities do not lose population due to attacks. +• "Leonardo's Workshop" 400, Obsolete by Combustion: Upgrades one obsolete unit per game turn. +• "Hoover Dam" 600, Requires Factory: Gives to every Hydro Plant the same effect than Solar Plants (-25% pollution). +• (#)"Manhattan Project" 600: Enables nuclear units for Every Nation. +• (#)"Apollo Program" 600: Enables space race for Every Nation. Makes entire map permanently visible for the owner. + +Special "Cold War" effect: if Manhattan Project and United Nations were built, every nation with nuclear power receives the Has_Senate effect, until the Apollo Program is finished. + +THANKS: Original developer David Fernandez (Bardo). + + \ No newline at end of file diff --git a/freeciv/freeciv/data/civ2civ3/game.ruleset b/freeciv/freeciv/data/civ2civ3/game.ruleset index 1a80e28bb..193f40b1d 100644 --- a/freeciv/freeciv/data/civ2civ3/game.ruleset +++ b/freeciv/freeciv/data/civ2civ3/game.ruleset @@ -1017,7 +1017,8 @@ actor_reqs = action = "Upgrade Unit" actor_reqs = { "type", "name", "range", "present" - "DiplRel", "Foreign", "Local", FALSE + "DiplRel", "Foreign", "Local", FALSE + "CityTile", "Center", "Local", TRUE } [actionenabler_airlift_unit] @@ -1760,7 +1761,7 @@ set = { "name", "value" "aifill", 6 "generator", "FRACTAL" - "topology", "WRAPX|WRAPY|ISO|HEX" + "topology", "WRAPX" "mapsize", "PLAYER" "tilesperplayer", 100 "tinyisles", "ENABLED" diff --git a/freeciv/freeciv/data/classic/README.classic b/freeciv/freeciv/data/classic/README.classic index b3763a30e..f0584dd0a 100644 --- a/freeciv/freeciv/data/classic/README.classic +++ b/freeciv/freeciv/data/classic/README.classic @@ -1,39 +1,21 @@ -=============== -Classic Ruleset -=============== - -Classic Game Manual -Click link for: Multiplayer Strategy Guide
- +Classic Game Manual +Click link for: Strategy Guide Terrain Combat Governments Economy Diplomacy - Hotkeys and Mouse Control +History +Classic ruleset has a long history. It started deep in the past before Civilization II ever came out. After Civ2, Classic became a synthesis of three things. Civilization I, which it was built from, new features from Civilization II that were better, a few things from other Civ sources which were considered good, and a touch of salt and spice modifications to make it all work right together. The result is an experience of Classic Civilization that is somehow more "classic" than any of the original games--in some people's view at least! -History -------- - -Classic ruleset has a long history. It started deep in the past before Civilization II ever came out. -After Civ2, Classic became a synthesis of three things. Civilization I, which it was built from, -new features in Civilization II that were better, a very few things from other Civ sources which were -considered good, and a touch of salt and spice modifications to make it all work right together! -The result is an experience of Classic Civilization that is somehow more "classic" than any of the -original games--in some people's view at least! - -Nevertheless, time has moved on, and you are highly encouraged to try some other more modern rulesets -for variations, such as: +After getting your feet wet with Classic, you are encouraged to try more modern rulesets, such as: Civ2Civ3 - A beginner level mix of Civ2 and Civ3 with a liberal amount of other changes. -Multiplayer+ - In many ways an even more Classic and much more refined version of classic Civilization, - ... with many balance changes that it functions well even with massive multiplayer human conditions. +Multiplayer+ - An even more Classic and much more refined version of classic Civilization, with many balance changes that it functions well even with massive multiplayer human conditions. -Multiplayer-Evolution (MP2) - The ultimate synthesis of Classic Civilization with modern features and - ... advancements. All the best classical mechanics are kept, and only the best newer features and - ... units are added. This preserves the hard-edged chess match of older Civ with the finer balance - ... and portfolio of features, new units, and improvements, of years of evolution and playtesting. +Multiplayer II Evolution (MP2) - The ultimate synthesis of Classic Civilization with modern features and advancements. All the best classical mechanics are kept, and only the best newer features and units are added. This preserves the hard-edged chess match of older Civ with the finer balance and portfolio of features, new units, and improvements, of years of evolution and playtesting. + \ No newline at end of file diff --git a/freeciv/freeciv/data/classic/buildings.ruleset b/freeciv/freeciv/data/classic/buildings.ruleset index 1487da91d..91f281e53 100644 --- a/freeciv/freeciv/data/classic/buildings.ruleset +++ b/freeciv/freeciv/data/classic/buildings.ruleset @@ -939,7 +939,8 @@ Space Components can be differentiated into Propulsion and Fuel\ time. You can build up to 8 pairs.\ "), _("\ Before you can build any spaceship parts, the Apollo Program wonder\ - must have been built by any player.\ + must have been built by any player. A factory is required in the city\ + that makes space components.\ ") [building_space_module] @@ -975,7 +976,8 @@ Space Modules are the most expensive parts of spaceships. There\ You can build up to 4 Space Modules of each kind.\ "), _("\ Before you can build any spaceship parts, the Apollo Program wonder\ - must have been built by any player.\ + must have been built by any player. A factory is required in the city\ + that makes space modules.\ ") [building_space_structural] @@ -1002,7 +1004,8 @@ Space Structurals form the base of your spaceship. All other\ function. You can build up to 32 Space Structurals.\ "), _("\ Before you can build any spaceship parts, the Apollo Program wonder\ - must have been built by any player.\ + must have been built by any player. A factory is required in the city\ + that makes space structurals.\ ") [building_stock_exchange] diff --git a/freeciv/freeciv/data/classic/game.ruleset b/freeciv/freeciv/data/classic/game.ruleset index b5a032e06..1a5a025ff 100644 --- a/freeciv/freeciv/data/classic/game.ruleset +++ b/freeciv/freeciv/data/classic/game.ruleset @@ -952,7 +952,8 @@ actor_reqs = action = "Upgrade Unit" actor_reqs = { "type", "name", "range", "present" - "DiplRel", "Foreign", "Local", FALSE + "DiplRel", "Foreign", "Local", FALSE + "CityTile", "Center", "Local", TRUE } [actionenabler_airlift_unit] @@ -997,7 +998,6 @@ actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE "UnitFlag", "NonMil", "Local", TRUE - ;NonMil = don't let ability to do Hideouts 'cause' ability to clean pollution } [actionenabler_clean_fallout] @@ -1006,7 +1006,6 @@ actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE "UnitFlag", "NonMil", "Local", TRUE - ;NonMil = don't let ability to do Hideouts 'cause' ability to clean pollution } [actionenabler_fortify] diff --git a/freeciv/freeciv/data/default/default.lua b/freeciv/freeciv/data/default/default.lua index 3e7084243..11e6010b2 100644 --- a/freeciv/freeciv/data/default/default.lua +++ b/freeciv/freeciv/data/default/default.lua @@ -127,9 +127,20 @@ function _deflua_hut_get_barbarians(unit) return alive end +-- Reveal map around the hut +function _deflua_hut_reveal_map(unit) + local owner = unit.owner + + notify.event(owner, unit.tile, E.HUT_MAP, + _("You find a map of the surrounding terrain.")) + for revealtile in unit.tile:circle_iterate(30) do + revealtile:show(owner) + end +end + -- Randomly choose a hut event function _deflua_hut_enter_callback(unit) - local chance = random(0, 11) + local chance = random(0, 13) local alive = true if chance == 0 then @@ -150,6 +161,8 @@ function _deflua_hut_enter_callback(unit) if not _deflua_hut_get_city(unit) then _deflua_hut_consolation_prize(unit) end + elseif chance == 12 or chance == 13 then + _deflua_hut_reveal_map(unit) end -- continue processing if unit is alive diff --git a/freeciv/freeciv/data/experimental/game.ruleset b/freeciv/freeciv/data/experimental/game.ruleset index f149575f2..190da62e8 100644 --- a/freeciv/freeciv/data/experimental/game.ruleset +++ b/freeciv/freeciv/data/experimental/game.ruleset @@ -974,7 +974,8 @@ actor_reqs = action = "Upgrade Unit" actor_reqs = { "type", "name", "range", "present" - "DiplRel", "Foreign", "Local", FALSE + "DiplRel", "Foreign", "Local", FALSE + "CityTile", "Center", "Local", TRUE } [actionenabler_airlift_unit] diff --git a/freeciv/freeciv/data/flags/abkhazia-large.png b/freeciv/freeciv/data/flags/abkhazia-large.png index fdd06770f..d212291b1 100644 Binary files a/freeciv/freeciv/data/flags/abkhazia-large.png and b/freeciv/freeciv/data/flags/abkhazia-large.png differ diff --git a/freeciv/freeciv/data/flags/abkhazia-shield-large.png b/freeciv/freeciv/data/flags/abkhazia-shield-large.png index 5f1b246dc..92e1c27a2 100644 Binary files a/freeciv/freeciv/data/flags/abkhazia-shield-large.png and b/freeciv/freeciv/data/flags/abkhazia-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/abkhazia-shield.png b/freeciv/freeciv/data/flags/abkhazia-shield.png index 748a10b51..4ff75e8b2 100644 Binary files a/freeciv/freeciv/data/flags/abkhazia-shield.png and b/freeciv/freeciv/data/flags/abkhazia-shield.png differ diff --git a/freeciv/freeciv/data/flags/abkhazia.png b/freeciv/freeciv/data/flags/abkhazia.png index b9a7a56ee..27b79a867 100644 Binary files a/freeciv/freeciv/data/flags/abkhazia.png and b/freeciv/freeciv/data/flags/abkhazia.png differ diff --git a/freeciv/freeciv/data/flags/antarctica_alt.png b/freeciv/freeciv/data/flags/antarctica_alt.png index d338bfd71..380a88a58 100644 Binary files a/freeciv/freeciv/data/flags/antarctica_alt.png and b/freeciv/freeciv/data/flags/antarctica_alt.png differ diff --git a/freeciv/freeciv/data/flags/antigua_and_barbuda.png b/freeciv/freeciv/data/flags/antigua_and_barbuda.png index 7eedee16a..7ff720c79 100644 Binary files a/freeciv/freeciv/data/flags/antigua_and_barbuda.png and b/freeciv/freeciv/data/flags/antigua_and_barbuda.png differ diff --git a/freeciv/freeciv/data/flags/argentina-large.png b/freeciv/freeciv/data/flags/argentina-large.png index 31501e163..f835f4e43 100644 Binary files a/freeciv/freeciv/data/flags/argentina-large.png and b/freeciv/freeciv/data/flags/argentina-large.png differ diff --git a/freeciv/freeciv/data/flags/argentina.png b/freeciv/freeciv/data/flags/argentina.png index c73277162..cb430b68c 100644 Binary files a/freeciv/freeciv/data/flags/argentina.png and b/freeciv/freeciv/data/flags/argentina.png differ diff --git a/freeciv/freeciv/data/flags/armenia-large.png b/freeciv/freeciv/data/flags/armenia-large.png index 2bee38642..42d9106ea 100644 Binary files a/freeciv/freeciv/data/flags/armenia-large.png and b/freeciv/freeciv/data/flags/armenia-large.png differ diff --git a/freeciv/freeciv/data/flags/armenia.png b/freeciv/freeciv/data/flags/armenia.png index 19750a4d6..dc13a82f5 100644 Binary files a/freeciv/freeciv/data/flags/armenia.png and b/freeciv/freeciv/data/flags/armenia.png differ diff --git a/freeciv/freeciv/data/flags/australia-large.png b/freeciv/freeciv/data/flags/australia-large.png index d672552ae..5b599bbe9 100644 Binary files a/freeciv/freeciv/data/flags/australia-large.png and b/freeciv/freeciv/data/flags/australia-large.png differ diff --git a/freeciv/freeciv/data/flags/azerbaijan-large.png b/freeciv/freeciv/data/flags/azerbaijan-large.png index 693e731ee..fdada76e1 100644 Binary files a/freeciv/freeciv/data/flags/azerbaijan-large.png and b/freeciv/freeciv/data/flags/azerbaijan-large.png differ diff --git a/freeciv/freeciv/data/flags/azerbaijan-shield-large.png b/freeciv/freeciv/data/flags/azerbaijan-shield-large.png index 92f83d699..1795ab6ef 100644 Binary files a/freeciv/freeciv/data/flags/azerbaijan-shield-large.png and b/freeciv/freeciv/data/flags/azerbaijan-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/azerbaijan-shield.png b/freeciv/freeciv/data/flags/azerbaijan-shield.png index 113f1b86c..7b6798323 100644 Binary files a/freeciv/freeciv/data/flags/azerbaijan-shield.png and b/freeciv/freeciv/data/flags/azerbaijan-shield.png differ diff --git a/freeciv/freeciv/data/flags/azerbaijan.png b/freeciv/freeciv/data/flags/azerbaijan.png index d75ef3ef6..61f1397de 100644 Binary files a/freeciv/freeciv/data/flags/azerbaijan.png and b/freeciv/freeciv/data/flags/azerbaijan.png differ diff --git a/freeciv/freeciv/data/flags/bahamas-large.png b/freeciv/freeciv/data/flags/bahamas-large.png index 2578a5f08..b32f5e016 100644 Binary files a/freeciv/freeciv/data/flags/bahamas-large.png and b/freeciv/freeciv/data/flags/bahamas-large.png differ diff --git a/freeciv/freeciv/data/flags/bahamas-shield-large.png b/freeciv/freeciv/data/flags/bahamas-shield-large.png index ab372eb3d..f5f2e1ce3 100644 Binary files a/freeciv/freeciv/data/flags/bahamas-shield-large.png and b/freeciv/freeciv/data/flags/bahamas-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/bahamas-shield.png b/freeciv/freeciv/data/flags/bahamas-shield.png index fc294b9dc..a3af58838 100644 Binary files a/freeciv/freeciv/data/flags/bahamas-shield.png and b/freeciv/freeciv/data/flags/bahamas-shield.png differ diff --git a/freeciv/freeciv/data/flags/bahamas.png b/freeciv/freeciv/data/flags/bahamas.png index 1218a2742..1bdc0b78d 100644 Binary files a/freeciv/freeciv/data/flags/bahamas.png and b/freeciv/freeciv/data/flags/bahamas.png differ diff --git a/freeciv/freeciv/data/flags/belarus-large.png b/freeciv/freeciv/data/flags/belarus-large.png index 622af0c55..043a8ead3 100644 Binary files a/freeciv/freeciv/data/flags/belarus-large.png and b/freeciv/freeciv/data/flags/belarus-large.png differ diff --git a/freeciv/freeciv/data/flags/belarus-shield-large.png b/freeciv/freeciv/data/flags/belarus-shield-large.png index 9a3fe088e..882bbdd87 100644 Binary files a/freeciv/freeciv/data/flags/belarus-shield-large.png and b/freeciv/freeciv/data/flags/belarus-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/belarus-shield.png b/freeciv/freeciv/data/flags/belarus-shield.png index 57ca2a687..a02ae4659 100644 Binary files a/freeciv/freeciv/data/flags/belarus-shield.png and b/freeciv/freeciv/data/flags/belarus-shield.png differ diff --git a/freeciv/freeciv/data/flags/belarus.png b/freeciv/freeciv/data/flags/belarus.png index c95a214b7..744225b4a 100644 Binary files a/freeciv/freeciv/data/flags/belarus.png and b/freeciv/freeciv/data/flags/belarus.png differ diff --git a/freeciv/freeciv/data/flags/benin_ancient.png b/freeciv/freeciv/data/flags/benin_ancient.png index 876606bac..26f537839 100644 Binary files a/freeciv/freeciv/data/flags/benin_ancient.png and b/freeciv/freeciv/data/flags/benin_ancient.png differ diff --git a/freeciv/freeciv/data/flags/bosnia-large.png b/freeciv/freeciv/data/flags/bosnia-large.png index 2411d2053..ee551a77f 100644 Binary files a/freeciv/freeciv/data/flags/bosnia-large.png and b/freeciv/freeciv/data/flags/bosnia-large.png differ diff --git a/freeciv/freeciv/data/flags/bosnia-shield-large.png b/freeciv/freeciv/data/flags/bosnia-shield-large.png index 71791a83b..5b42a5b71 100644 Binary files a/freeciv/freeciv/data/flags/bosnia-shield-large.png and b/freeciv/freeciv/data/flags/bosnia-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/bosnia-shield.png b/freeciv/freeciv/data/flags/bosnia-shield.png index a848dc2a5..eea3b93a2 100644 Binary files a/freeciv/freeciv/data/flags/bosnia-shield.png and b/freeciv/freeciv/data/flags/bosnia-shield.png differ diff --git a/freeciv/freeciv/data/flags/bosnia.png b/freeciv/freeciv/data/flags/bosnia.png index 019b70671..66e1b679f 100644 Binary files a/freeciv/freeciv/data/flags/bosnia.png and b/freeciv/freeciv/data/flags/bosnia.png differ diff --git a/freeciv/freeciv/data/flags/brasil-large.png b/freeciv/freeciv/data/flags/brasil-large.png index 080f88bdf..d15744323 100644 Binary files a/freeciv/freeciv/data/flags/brasil-large.png and b/freeciv/freeciv/data/flags/brasil-large.png differ diff --git a/freeciv/freeciv/data/flags/brasil.png b/freeciv/freeciv/data/flags/brasil.png index 0ae8451f5..c2b4104c2 100644 Binary files a/freeciv/freeciv/data/flags/brasil.png and b/freeciv/freeciv/data/flags/brasil.png differ diff --git a/freeciv/freeciv/data/flags/brunei-large.png b/freeciv/freeciv/data/flags/brunei-large.png index 99b8b78c3..4a9626529 100644 Binary files a/freeciv/freeciv/data/flags/brunei-large.png and b/freeciv/freeciv/data/flags/brunei-large.png differ diff --git a/freeciv/freeciv/data/flags/brunei-shield-large.png b/freeciv/freeciv/data/flags/brunei-shield-large.png index 49ce3a90a..933fb6baf 100644 Binary files a/freeciv/freeciv/data/flags/brunei-shield-large.png and b/freeciv/freeciv/data/flags/brunei-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/brunei-shield.png b/freeciv/freeciv/data/flags/brunei-shield.png index 989088f3e..1d3db75ae 100644 Binary files a/freeciv/freeciv/data/flags/brunei-shield.png and b/freeciv/freeciv/data/flags/brunei-shield.png differ diff --git a/freeciv/freeciv/data/flags/brunei.png b/freeciv/freeciv/data/flags/brunei.png index dda615ba3..153dac859 100644 Binary files a/freeciv/freeciv/data/flags/brunei.png and b/freeciv/freeciv/data/flags/brunei.png differ diff --git a/freeciv/freeciv/data/flags/burkina_faso.png b/freeciv/freeciv/data/flags/burkina_faso.png index 151d0b268..85cd66572 100644 Binary files a/freeciv/freeciv/data/flags/burkina_faso.png and b/freeciv/freeciv/data/flags/burkina_faso.png differ diff --git a/freeciv/freeciv/data/flags/canada-large.png b/freeciv/freeciv/data/flags/canada-large.png index d16b14a09..9465d072a 100644 Binary files a/freeciv/freeciv/data/flags/canada-large.png and b/freeciv/freeciv/data/flags/canada-large.png differ diff --git a/freeciv/freeciv/data/flags/canada-shield-large.png b/freeciv/freeciv/data/flags/canada-shield-large.png index dc223dbc6..1fe370167 100644 Binary files a/freeciv/freeciv/data/flags/canada-shield-large.png and b/freeciv/freeciv/data/flags/canada-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/canada-shield.png b/freeciv/freeciv/data/flags/canada-shield.png index 9e74c4910..8cb410aca 100644 Binary files a/freeciv/freeciv/data/flags/canada-shield.png and b/freeciv/freeciv/data/flags/canada-shield.png differ diff --git a/freeciv/freeciv/data/flags/canada.png b/freeciv/freeciv/data/flags/canada.png index fe9f3ae4c..75abbf4a3 100644 Binary files a/freeciv/freeciv/data/flags/canada.png and b/freeciv/freeciv/data/flags/canada.png differ diff --git a/freeciv/freeciv/data/flags/canada_old.png b/freeciv/freeciv/data/flags/canada_old.png index 1a63d2f2c..52be22fed 100644 Binary files a/freeciv/freeciv/data/flags/canada_old.png and b/freeciv/freeciv/data/flags/canada_old.png differ diff --git a/freeciv/freeciv/data/flags/central_america.png b/freeciv/freeciv/data/flags/central_america.png index 42f692ea6..c67826ca3 100644 Binary files a/freeciv/freeciv/data/flags/central_america.png and b/freeciv/freeciv/data/flags/central_america.png differ diff --git a/freeciv/freeciv/data/flags/central_lithuania.png b/freeciv/freeciv/data/flags/central_lithuania.png index 8845fc197..283b62e51 100644 Binary files a/freeciv/freeciv/data/flags/central_lithuania.png and b/freeciv/freeciv/data/flags/central_lithuania.png differ diff --git a/freeciv/freeciv/data/flags/costa_rica.png b/freeciv/freeciv/data/flags/costa_rica.png index 3018060d7..d34382c2c 100644 Binary files a/freeciv/freeciv/data/flags/costa_rica.png and b/freeciv/freeciv/data/flags/costa_rica.png differ diff --git a/freeciv/freeciv/data/flags/crimean_tatar-large.png b/freeciv/freeciv/data/flags/crimean_tatar-large.png index 618e5f6ba..7a503d51e 100644 Binary files a/freeciv/freeciv/data/flags/crimean_tatar-large.png and b/freeciv/freeciv/data/flags/crimean_tatar-large.png differ diff --git a/freeciv/freeciv/data/flags/crimean_tatar-shield-large.png b/freeciv/freeciv/data/flags/crimean_tatar-shield-large.png index 276808d4d..bcc03ae75 100644 Binary files a/freeciv/freeciv/data/flags/crimean_tatar-shield-large.png and b/freeciv/freeciv/data/flags/crimean_tatar-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/crimean_tatar-shield.png b/freeciv/freeciv/data/flags/crimean_tatar-shield.png index 1f2048680..36e033bb1 100644 Binary files a/freeciv/freeciv/data/flags/crimean_tatar-shield.png and b/freeciv/freeciv/data/flags/crimean_tatar-shield.png differ diff --git a/freeciv/freeciv/data/flags/crimean_tatar.png b/freeciv/freeciv/data/flags/crimean_tatar.png index 6fb66bc8a..db686b955 100644 Binary files a/freeciv/freeciv/data/flags/crimean_tatar.png and b/freeciv/freeciv/data/flags/crimean_tatar.png differ diff --git a/freeciv/freeciv/data/flags/crimeantatar.png b/freeciv/freeciv/data/flags/crimeantatar.png index b282aa2bf..c6c322331 100644 Binary files a/freeciv/freeciv/data/flags/crimeantatar.png and b/freeciv/freeciv/data/flags/crimeantatar.png differ diff --git a/freeciv/freeciv/data/flags/croatia-large.png b/freeciv/freeciv/data/flags/croatia-large.png index e6e07e516..5f4d3fed0 100644 Binary files a/freeciv/freeciv/data/flags/croatia-large.png and b/freeciv/freeciv/data/flags/croatia-large.png differ diff --git a/freeciv/freeciv/data/flags/croatia-shield-large.png b/freeciv/freeciv/data/flags/croatia-shield-large.png index f73295de2..da66b1554 100644 Binary files a/freeciv/freeciv/data/flags/croatia-shield-large.png and b/freeciv/freeciv/data/flags/croatia-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/croatia-shield.png b/freeciv/freeciv/data/flags/croatia-shield.png index 78177c00b..c8a2e657c 100644 Binary files a/freeciv/freeciv/data/flags/croatia-shield.png and b/freeciv/freeciv/data/flags/croatia-shield.png differ diff --git a/freeciv/freeciv/data/flags/croatia.png b/freeciv/freeciv/data/flags/croatia.png index d94a5bdb3..19b6da824 100644 Binary files a/freeciv/freeciv/data/flags/croatia.png and b/freeciv/freeciv/data/flags/croatia.png differ diff --git a/freeciv/freeciv/data/flags/cuba-large.png b/freeciv/freeciv/data/flags/cuba-large.png index a1d475b98..83f5d57a1 100644 Binary files a/freeciv/freeciv/data/flags/cuba-large.png and b/freeciv/freeciv/data/flags/cuba-large.png differ diff --git a/freeciv/freeciv/data/flags/cuba-shield-large.png b/freeciv/freeciv/data/flags/cuba-shield-large.png index ecfcade04..45edab517 100644 Binary files a/freeciv/freeciv/data/flags/cuba-shield-large.png and b/freeciv/freeciv/data/flags/cuba-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/cuba-shield.png b/freeciv/freeciv/data/flags/cuba-shield.png index ca1c51651..97fa8f1ea 100644 Binary files a/freeciv/freeciv/data/flags/cuba-shield.png and b/freeciv/freeciv/data/flags/cuba-shield.png differ diff --git a/freeciv/freeciv/data/flags/cuba.png b/freeciv/freeciv/data/flags/cuba.png index 666daa662..f7ab1b7e8 100644 Binary files a/freeciv/freeciv/data/flags/cuba.png and b/freeciv/freeciv/data/flags/cuba.png differ diff --git a/freeciv/freeciv/data/flags/cuyavia.png b/freeciv/freeciv/data/flags/cuyavia.png index 8a3495b72..5a223742a 100644 Binary files a/freeciv/freeciv/data/flags/cuyavia.png and b/freeciv/freeciv/data/flags/cuyavia.png differ diff --git a/freeciv/freeciv/data/flags/czech-large.png b/freeciv/freeciv/data/flags/czech-large.png index a5e01309d..f89a823bd 100644 Binary files a/freeciv/freeciv/data/flags/czech-large.png and b/freeciv/freeciv/data/flags/czech-large.png differ diff --git a/freeciv/freeciv/data/flags/czech-shield-large.png b/freeciv/freeciv/data/flags/czech-shield-large.png index 600efc3ac..c36d00fd3 100644 Binary files a/freeciv/freeciv/data/flags/czech-shield-large.png and b/freeciv/freeciv/data/flags/czech-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/czech-shield.png b/freeciv/freeciv/data/flags/czech-shield.png index 80d6422f0..31bb33df3 100644 Binary files a/freeciv/freeciv/data/flags/czech-shield.png and b/freeciv/freeciv/data/flags/czech-shield.png differ diff --git a/freeciv/freeciv/data/flags/czech.png b/freeciv/freeciv/data/flags/czech.png index dc509e638..38114a100 100644 Binary files a/freeciv/freeciv/data/flags/czech.png and b/freeciv/freeciv/data/flags/czech.png differ diff --git a/freeciv/freeciv/data/flags/czechoslovakia-large.png b/freeciv/freeciv/data/flags/czechoslovakia-large.png index 16e9aa0a6..a1d1cb220 100644 Binary files a/freeciv/freeciv/data/flags/czechoslovakia-large.png and b/freeciv/freeciv/data/flags/czechoslovakia-large.png differ diff --git a/freeciv/freeciv/data/flags/czechoslovakia-shield-large.png b/freeciv/freeciv/data/flags/czechoslovakia-shield-large.png index 7e826b72c..2e8082c1c 100644 Binary files a/freeciv/freeciv/data/flags/czechoslovakia-shield-large.png and b/freeciv/freeciv/data/flags/czechoslovakia-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/czechoslovakia-shield.png b/freeciv/freeciv/data/flags/czechoslovakia-shield.png index bcbe81832..1b62ea41c 100644 Binary files a/freeciv/freeciv/data/flags/czechoslovakia-shield.png and b/freeciv/freeciv/data/flags/czechoslovakia-shield.png differ diff --git a/freeciv/freeciv/data/flags/czechoslovakia.png b/freeciv/freeciv/data/flags/czechoslovakia.png index e8498f155..2655678ac 100644 Binary files a/freeciv/freeciv/data/flags/czechoslovakia.png and b/freeciv/freeciv/data/flags/czechoslovakia.png differ diff --git a/freeciv/freeciv/data/flags/dominica-large.png b/freeciv/freeciv/data/flags/dominica-large.png index d8fccbaaf..b66925c9d 100644 Binary files a/freeciv/freeciv/data/flags/dominica-large.png and b/freeciv/freeciv/data/flags/dominica-large.png differ diff --git a/freeciv/freeciv/data/flags/dominica.png b/freeciv/freeciv/data/flags/dominica.png index d7eabfe5e..4fc5dda27 100644 Binary files a/freeciv/freeciv/data/flags/dominica.png and b/freeciv/freeciv/data/flags/dominica.png differ diff --git a/freeciv/freeciv/data/flags/dominican_republic.png b/freeciv/freeciv/data/flags/dominican_republic.png index ad20f6138..3f78664fb 100644 Binary files a/freeciv/freeciv/data/flags/dominican_republic.png and b/freeciv/freeciv/data/flags/dominican_republic.png differ diff --git a/freeciv/freeciv/data/flags/dr_congo.png b/freeciv/freeciv/data/flags/dr_congo.png index ae537036f..e9a9c842b 100644 Binary files a/freeciv/freeciv/data/flags/dr_congo.png and b/freeciv/freeciv/data/flags/dr_congo.png differ diff --git a/freeciv/freeciv/data/flags/east_timor.png b/freeciv/freeciv/data/flags/east_timor.png index 360591471..0571f507a 100644 Binary files a/freeciv/freeciv/data/flags/east_timor.png and b/freeciv/freeciv/data/flags/east_timor.png differ diff --git a/freeciv/freeciv/data/flags/egypt_ancient.png b/freeciv/freeciv/data/flags/egypt_ancient.png index ae34b1014..96b0ed2e2 100644 Binary files a/freeciv/freeciv/data/flags/egypt_ancient.png and b/freeciv/freeciv/data/flags/egypt_ancient.png differ diff --git a/freeciv/freeciv/data/flags/el_salvador.png b/freeciv/freeciv/data/flags/el_salvador.png index be5ed6055..81aca2d81 100644 Binary files a/freeciv/freeciv/data/flags/el_salvador.png and b/freeciv/freeciv/data/flags/el_salvador.png differ diff --git a/freeciv/freeciv/data/flags/equatorial_guinea.png b/freeciv/freeciv/data/flags/equatorial_guinea.png index 1b8caaa32..6ba353a10 100644 Binary files a/freeciv/freeciv/data/flags/equatorial_guinea.png and b/freeciv/freeciv/data/flags/equatorial_guinea.png differ diff --git a/freeciv/freeciv/data/flags/eritrea-large.png b/freeciv/freeciv/data/flags/eritrea-large.png index abdea3e3d..493815279 100644 Binary files a/freeciv/freeciv/data/flags/eritrea-large.png and b/freeciv/freeciv/data/flags/eritrea-large.png differ diff --git a/freeciv/freeciv/data/flags/eritrea-shield.png b/freeciv/freeciv/data/flags/eritrea-shield.png index b0c49368f..9ad9427f9 100644 Binary files a/freeciv/freeciv/data/flags/eritrea-shield.png and b/freeciv/freeciv/data/flags/eritrea-shield.png differ diff --git a/freeciv/freeciv/data/flags/eritrea.png b/freeciv/freeciv/data/flags/eritrea.png index 377d12930..ddd9e2ba0 100644 Binary files a/freeciv/freeciv/data/flags/eritrea.png and b/freeciv/freeciv/data/flags/eritrea.png differ diff --git a/freeciv/freeciv/data/flags/ethiopia-large.png b/freeciv/freeciv/data/flags/ethiopia-large.png index bf43a99e8..1be4103b3 100644 Binary files a/freeciv/freeciv/data/flags/ethiopia-large.png and b/freeciv/freeciv/data/flags/ethiopia-large.png differ diff --git a/freeciv/freeciv/data/flags/ethiopia-shield-large.png b/freeciv/freeciv/data/flags/ethiopia-shield-large.png index 56056f6d4..36a23d44b 100644 Binary files a/freeciv/freeciv/data/flags/ethiopia-shield-large.png and b/freeciv/freeciv/data/flags/ethiopia-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/ethiopia-shield.png b/freeciv/freeciv/data/flags/ethiopia-shield.png index d70d7211d..ea167ea7d 100644 Binary files a/freeciv/freeciv/data/flags/ethiopia-shield.png and b/freeciv/freeciv/data/flags/ethiopia-shield.png differ diff --git a/freeciv/freeciv/data/flags/ethiopia.png b/freeciv/freeciv/data/flags/ethiopia.png index 455088d43..3d291d6a3 100644 Binary files a/freeciv/freeciv/data/flags/ethiopia.png and b/freeciv/freeciv/data/flags/ethiopia.png differ diff --git a/freeciv/freeciv/data/flags/ethiopia_old.png b/freeciv/freeciv/data/flags/ethiopia_old.png index 2ab3a23cd..b5b0b484a 100644 Binary files a/freeciv/freeciv/data/flags/ethiopia_old.png and b/freeciv/freeciv/data/flags/ethiopia_old.png differ diff --git a/freeciv/freeciv/data/flags/etruscan-large.png b/freeciv/freeciv/data/flags/etruscan-large.png index be8313fc2..04e5a5c17 100644 Binary files a/freeciv/freeciv/data/flags/etruscan-large.png and b/freeciv/freeciv/data/flags/etruscan-large.png differ diff --git a/freeciv/freeciv/data/flags/etruscan.png b/freeciv/freeciv/data/flags/etruscan.png index 3dfaaea2a..ed143d9ec 100644 Binary files a/freeciv/freeciv/data/flags/etruscan.png and b/freeciv/freeciv/data/flags/etruscan.png differ diff --git a/freeciv/freeciv/data/flags/europe-large.png b/freeciv/freeciv/data/flags/europe-large.png index be3c81794..3f294551b 100644 Binary files a/freeciv/freeciv/data/flags/europe-large.png and b/freeciv/freeciv/data/flags/europe-large.png differ diff --git a/freeciv/freeciv/data/flags/europe-shield-large.png b/freeciv/freeciv/data/flags/europe-shield-large.png index 55ad91025..09cc0d6b0 100644 Binary files a/freeciv/freeciv/data/flags/europe-shield-large.png and b/freeciv/freeciv/data/flags/europe-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/europe-shield.png b/freeciv/freeciv/data/flags/europe-shield.png index 87e41b359..df9067a56 100644 Binary files a/freeciv/freeciv/data/flags/europe-shield.png and b/freeciv/freeciv/data/flags/europe-shield.png differ diff --git a/freeciv/freeciv/data/flags/europe.png b/freeciv/freeciv/data/flags/europe.png index 3b6c1cec7..4f1d7c334 100644 Binary files a/freeciv/freeciv/data/flags/europe.png and b/freeciv/freeciv/data/flags/europe.png differ diff --git a/freeciv/freeciv/data/flags/fiji-large.png b/freeciv/freeciv/data/flags/fiji-large.png index acf9ab3ad..4e0c5c092 100644 Binary files a/freeciv/freeciv/data/flags/fiji-large.png and b/freeciv/freeciv/data/flags/fiji-large.png differ diff --git a/freeciv/freeciv/data/flags/finland-large.png b/freeciv/freeciv/data/flags/finland-large.png index 63b58e262..1633e8760 100644 Binary files a/freeciv/freeciv/data/flags/finland-large.png and b/freeciv/freeciv/data/flags/finland-large.png differ diff --git a/freeciv/freeciv/data/flags/finland.png b/freeciv/freeciv/data/flags/finland.png index 0cbb7c5b3..c4aa6e26a 100644 Binary files a/freeciv/freeciv/data/flags/finland.png and b/freeciv/freeciv/data/flags/finland.png differ diff --git a/freeciv/freeciv/data/flags/france_old.png b/freeciv/freeciv/data/flags/france_old.png index d98491add..99d737d97 100644 Binary files a/freeciv/freeciv/data/flags/france_old.png and b/freeciv/freeciv/data/flags/france_old.png differ diff --git a/freeciv/freeciv/data/flags/french_polynesia.png b/freeciv/freeciv/data/flags/french_polynesia.png index 2965f8ada..44c2fa77e 100644 Binary files a/freeciv/freeciv/data/flags/french_polynesia.png and b/freeciv/freeciv/data/flags/french_polynesia.png differ diff --git a/freeciv/freeciv/data/flags/germany-large.png b/freeciv/freeciv/data/flags/germany-large.png index 25cd7d32f..42bc917b3 100644 Binary files a/freeciv/freeciv/data/flags/germany-large.png and b/freeciv/freeciv/data/flags/germany-large.png differ diff --git a/freeciv/freeciv/data/flags/germany.png b/freeciv/freeciv/data/flags/germany.png index 66357a9fa..acebefcac 100644 Binary files a/freeciv/freeciv/data/flags/germany.png and b/freeciv/freeciv/data/flags/germany.png differ diff --git a/freeciv/freeciv/data/flags/ghana_ancient.png b/freeciv/freeciv/data/flags/ghana_ancient.png index 5c651c668..f7a16bfa1 100644 Binary files a/freeciv/freeciv/data/flags/ghana_ancient.png and b/freeciv/freeciv/data/flags/ghana_ancient.png differ diff --git a/freeciv/freeciv/data/flags/ghaznavid-large.png b/freeciv/freeciv/data/flags/ghaznavid-large.png index 8baa6e4b8..e1a8fafaf 100644 Binary files a/freeciv/freeciv/data/flags/ghaznavid-large.png and b/freeciv/freeciv/data/flags/ghaznavid-large.png differ diff --git a/freeciv/freeciv/data/flags/ghaznavid-shield-large.png b/freeciv/freeciv/data/flags/ghaznavid-shield-large.png index 184f5eb54..da3afd103 100644 Binary files a/freeciv/freeciv/data/flags/ghaznavid-shield-large.png and b/freeciv/freeciv/data/flags/ghaznavid-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/ghaznavid-shield.png b/freeciv/freeciv/data/flags/ghaznavid-shield.png index 7be9cfd10..03be175fe 100644 Binary files a/freeciv/freeciv/data/flags/ghaznavid-shield.png and b/freeciv/freeciv/data/flags/ghaznavid-shield.png differ diff --git a/freeciv/freeciv/data/flags/ghaznavid.png b/freeciv/freeciv/data/flags/ghaznavid.png index 5d7a2c817..d3f1ba0bc 100644 Binary files a/freeciv/freeciv/data/flags/ghaznavid.png and b/freeciv/freeciv/data/flags/ghaznavid.png differ diff --git a/freeciv/freeciv/data/flags/golden_horde.png b/freeciv/freeciv/data/flags/golden_horde.png index e520ece72..ab96bc4df 100644 Binary files a/freeciv/freeciv/data/flags/golden_horde.png and b/freeciv/freeciv/data/flags/golden_horde.png differ diff --git a/freeciv/freeciv/data/flags/greater_poland.png b/freeciv/freeciv/data/flags/greater_poland.png index 27e2d0091..9f7e23610 100644 Binary files a/freeciv/freeciv/data/flags/greater_poland.png and b/freeciv/freeciv/data/flags/greater_poland.png differ diff --git a/freeciv/freeciv/data/flags/greece_ancient.png b/freeciv/freeciv/data/flags/greece_ancient.png index 7c1daadfd..3fe341f5d 100644 Binary files a/freeciv/freeciv/data/flags/greece_ancient.png and b/freeciv/freeciv/data/flags/greece_ancient.png differ diff --git a/freeciv/freeciv/data/flags/guatemala-large.png b/freeciv/freeciv/data/flags/guatemala-large.png index c7432a116..898becb34 100644 Binary files a/freeciv/freeciv/data/flags/guatemala-large.png and b/freeciv/freeciv/data/flags/guatemala-large.png differ diff --git a/freeciv/freeciv/data/flags/guatemala-shield-large.png b/freeciv/freeciv/data/flags/guatemala-shield-large.png index 0896585dc..8c96da3d8 100644 Binary files a/freeciv/freeciv/data/flags/guatemala-shield-large.png and b/freeciv/freeciv/data/flags/guatemala-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/guatemala-shield.png b/freeciv/freeciv/data/flags/guatemala-shield.png index ef3c91739..b883fa309 100644 Binary files a/freeciv/freeciv/data/flags/guatemala-shield.png and b/freeciv/freeciv/data/flags/guatemala-shield.png differ diff --git a/freeciv/freeciv/data/flags/guatemala.png b/freeciv/freeciv/data/flags/guatemala.png index 4f8025f83..80ae5c793 100644 Binary files a/freeciv/freeciv/data/flags/guatemala.png and b/freeciv/freeciv/data/flags/guatemala.png differ diff --git a/freeciv/freeciv/data/flags/guinea-bissau-large.png b/freeciv/freeciv/data/flags/guinea-bissau-large.png index 65ebdd1f9..2aa62a1b6 100644 Binary files a/freeciv/freeciv/data/flags/guinea-bissau-large.png and b/freeciv/freeciv/data/flags/guinea-bissau-large.png differ diff --git a/freeciv/freeciv/data/flags/guinea-bissau-shield.png b/freeciv/freeciv/data/flags/guinea-bissau-shield.png index b8f8ebf1c..76cb3ed7b 100644 Binary files a/freeciv/freeciv/data/flags/guinea-bissau-shield.png and b/freeciv/freeciv/data/flags/guinea-bissau-shield.png differ diff --git a/freeciv/freeciv/data/flags/guinea-bissau.png b/freeciv/freeciv/data/flags/guinea-bissau.png index 3f5637086..b9ebc015d 100644 Binary files a/freeciv/freeciv/data/flags/guinea-bissau.png and b/freeciv/freeciv/data/flags/guinea-bissau.png differ diff --git a/freeciv/freeciv/data/flags/honduras-large.png b/freeciv/freeciv/data/flags/honduras-large.png index 40035c05b..f41e18dcc 100644 Binary files a/freeciv/freeciv/data/flags/honduras-large.png and b/freeciv/freeciv/data/flags/honduras-large.png differ diff --git a/freeciv/freeciv/data/flags/honduras-shield-large.png b/freeciv/freeciv/data/flags/honduras-shield-large.png index 29904e8fe..f6aff07e8 100644 Binary files a/freeciv/freeciv/data/flags/honduras-shield-large.png and b/freeciv/freeciv/data/flags/honduras-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/honduras-shield.png b/freeciv/freeciv/data/flags/honduras-shield.png index a0ea1dcb5..4eab7d07a 100644 Binary files a/freeciv/freeciv/data/flags/honduras-shield.png and b/freeciv/freeciv/data/flags/honduras-shield.png differ diff --git a/freeciv/freeciv/data/flags/honduras.png b/freeciv/freeciv/data/flags/honduras.png index 12d5bad47..a3d7e394f 100644 Binary files a/freeciv/freeciv/data/flags/honduras.png and b/freeciv/freeciv/data/flags/honduras.png differ diff --git a/freeciv/freeciv/data/flags/hungary-large.png b/freeciv/freeciv/data/flags/hungary-large.png index ffeae1490..5ef35d1c4 100644 Binary files a/freeciv/freeciv/data/flags/hungary-large.png and b/freeciv/freeciv/data/flags/hungary-large.png differ diff --git a/freeciv/freeciv/data/flags/hungary-shield-large.png b/freeciv/freeciv/data/flags/hungary-shield-large.png index a8f716a5f..5caefef93 100644 Binary files a/freeciv/freeciv/data/flags/hungary-shield-large.png and b/freeciv/freeciv/data/flags/hungary-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/hungary-shield.png b/freeciv/freeciv/data/flags/hungary-shield.png index c81ff1005..ed28531c8 100644 Binary files a/freeciv/freeciv/data/flags/hungary-shield.png and b/freeciv/freeciv/data/flags/hungary-shield.png differ diff --git a/freeciv/freeciv/data/flags/hungary.png b/freeciv/freeciv/data/flags/hungary.png index cb8604a38..107abf86e 100644 Binary files a/freeciv/freeciv/data/flags/hungary.png and b/freeciv/freeciv/data/flags/hungary.png differ diff --git a/freeciv/freeciv/data/flags/iceland-large.png b/freeciv/freeciv/data/flags/iceland-large.png index 174722f40..c1781454a 100644 Binary files a/freeciv/freeciv/data/flags/iceland-large.png and b/freeciv/freeciv/data/flags/iceland-large.png differ diff --git a/freeciv/freeciv/data/flags/iceland-shield-large.png b/freeciv/freeciv/data/flags/iceland-shield-large.png index 23ed8069b..859a9c05a 100644 Binary files a/freeciv/freeciv/data/flags/iceland-shield-large.png and b/freeciv/freeciv/data/flags/iceland-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/iceland-shield.png b/freeciv/freeciv/data/flags/iceland-shield.png index 389aa4d7d..7dcf6f757 100644 Binary files a/freeciv/freeciv/data/flags/iceland-shield.png and b/freeciv/freeciv/data/flags/iceland-shield.png differ diff --git a/freeciv/freeciv/data/flags/iceland.png b/freeciv/freeciv/data/flags/iceland.png index b7bc08d3b..b252cd6af 100644 Binary files a/freeciv/freeciv/data/flags/iceland.png and b/freeciv/freeciv/data/flags/iceland.png differ diff --git a/freeciv/freeciv/data/flags/iran_ancient.png b/freeciv/freeciv/data/flags/iran_ancient.png index f1e05a94e..a34ff282b 100644 Binary files a/freeciv/freeciv/data/flags/iran_ancient.png and b/freeciv/freeciv/data/flags/iran_ancient.png differ diff --git a/freeciv/freeciv/data/flags/iraq_old.png b/freeciv/freeciv/data/flags/iraq_old.png index 9d3cb151b..d3ec5d04d 100644 Binary files a/freeciv/freeciv/data/flags/iraq_old.png and b/freeciv/freeciv/data/flags/iraq_old.png differ diff --git a/freeciv/freeciv/data/flags/ireland-large.png b/freeciv/freeciv/data/flags/ireland-large.png index 1e032cd65..4860e9900 100644 Binary files a/freeciv/freeciv/data/flags/ireland-large.png and b/freeciv/freeciv/data/flags/ireland-large.png differ diff --git a/freeciv/freeciv/data/flags/ireland-shield-large.png b/freeciv/freeciv/data/flags/ireland-shield-large.png index 86ca42f9c..0d87a8e74 100644 Binary files a/freeciv/freeciv/data/flags/ireland-shield-large.png and b/freeciv/freeciv/data/flags/ireland-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/ireland-shield.png b/freeciv/freeciv/data/flags/ireland-shield.png index e6d0fa576..1301b54f9 100644 Binary files a/freeciv/freeciv/data/flags/ireland-shield.png and b/freeciv/freeciv/data/flags/ireland-shield.png differ diff --git a/freeciv/freeciv/data/flags/ireland.png b/freeciv/freeciv/data/flags/ireland.png index 00104706c..8c8d3c5df 100644 Binary files a/freeciv/freeciv/data/flags/ireland.png and b/freeciv/freeciv/data/flags/ireland.png differ diff --git a/freeciv/freeciv/data/flags/israel-large.png b/freeciv/freeciv/data/flags/israel-large.png index 95acb4103..c7e521074 100644 Binary files a/freeciv/freeciv/data/flags/israel-large.png and b/freeciv/freeciv/data/flags/israel-large.png differ diff --git a/freeciv/freeciv/data/flags/israel-shield-large.png b/freeciv/freeciv/data/flags/israel-shield-large.png index 61473387a..9dc9be28d 100644 Binary files a/freeciv/freeciv/data/flags/israel-shield-large.png and b/freeciv/freeciv/data/flags/israel-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/israel-shield.png b/freeciv/freeciv/data/flags/israel-shield.png index 440484ee2..08d7f5723 100644 Binary files a/freeciv/freeciv/data/flags/israel-shield.png and b/freeciv/freeciv/data/flags/israel-shield.png differ diff --git a/freeciv/freeciv/data/flags/israel.png b/freeciv/freeciv/data/flags/israel.png index a007cdf96..320af9c57 100644 Binary files a/freeciv/freeciv/data/flags/israel.png and b/freeciv/freeciv/data/flags/israel.png differ diff --git a/freeciv/freeciv/data/flags/israel_ancient.png b/freeciv/freeciv/data/flags/israel_ancient.png index 43f849869..045ca8ed6 100644 Binary files a/freeciv/freeciv/data/flags/israel_ancient.png and b/freeciv/freeciv/data/flags/israel_ancient.png differ diff --git a/freeciv/freeciv/data/flags/jaffna.png b/freeciv/freeciv/data/flags/jaffna.png index 79792dca3..c3cc29ba1 100644 Binary files a/freeciv/freeciv/data/flags/jaffna.png and b/freeciv/freeciv/data/flags/jaffna.png differ diff --git a/freeciv/freeciv/data/flags/jamaica-large.png b/freeciv/freeciv/data/flags/jamaica-large.png index baf674618..e76ed85df 100644 Binary files a/freeciv/freeciv/data/flags/jamaica-large.png and b/freeciv/freeciv/data/flags/jamaica-large.png differ diff --git a/freeciv/freeciv/data/flags/jamaica-shield-large.png b/freeciv/freeciv/data/flags/jamaica-shield-large.png index c9a77f13a..27ac6c0f4 100644 Binary files a/freeciv/freeciv/data/flags/jamaica-shield-large.png and b/freeciv/freeciv/data/flags/jamaica-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/jamaica-shield.png b/freeciv/freeciv/data/flags/jamaica-shield.png index 4f72b4331..a79495eef 100644 Binary files a/freeciv/freeciv/data/flags/jamaica-shield.png and b/freeciv/freeciv/data/flags/jamaica-shield.png differ diff --git a/freeciv/freeciv/data/flags/jamaica.png b/freeciv/freeciv/data/flags/jamaica.png index d8324b711..7667181ac 100644 Binary files a/freeciv/freeciv/data/flags/jamaica.png and b/freeciv/freeciv/data/flags/jamaica.png differ diff --git a/freeciv/freeciv/data/flags/japan-large.png b/freeciv/freeciv/data/flags/japan-large.png index 411be7831..9cb4c92ef 100644 Binary files a/freeciv/freeciv/data/flags/japan-large.png and b/freeciv/freeciv/data/flags/japan-large.png differ diff --git a/freeciv/freeciv/data/flags/japan-shield-large.png b/freeciv/freeciv/data/flags/japan-shield-large.png index f548e27d1..49ed95a8d 100644 Binary files a/freeciv/freeciv/data/flags/japan-shield-large.png and b/freeciv/freeciv/data/flags/japan-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/japan-shield.png b/freeciv/freeciv/data/flags/japan-shield.png index 4cee6c362..7085f6903 100644 Binary files a/freeciv/freeciv/data/flags/japan-shield.png and b/freeciv/freeciv/data/flags/japan-shield.png differ diff --git a/freeciv/freeciv/data/flags/japan.png b/freeciv/freeciv/data/flags/japan.png index f46492577..413520b7d 100644 Binary files a/freeciv/freeciv/data/flags/japan.png and b/freeciv/freeciv/data/flags/japan.png differ diff --git a/freeciv/freeciv/data/flags/jordan-large.png b/freeciv/freeciv/data/flags/jordan-large.png index 4f0735e46..a20e86666 100644 Binary files a/freeciv/freeciv/data/flags/jordan-large.png and b/freeciv/freeciv/data/flags/jordan-large.png differ diff --git a/freeciv/freeciv/data/flags/jordan-shield-large.png b/freeciv/freeciv/data/flags/jordan-shield-large.png index b48148f1a..83e801b98 100644 Binary files a/freeciv/freeciv/data/flags/jordan-shield-large.png and b/freeciv/freeciv/data/flags/jordan-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/jordan-shield.png b/freeciv/freeciv/data/flags/jordan-shield.png index e3f583eb9..9928de37f 100644 Binary files a/freeciv/freeciv/data/flags/jordan-shield.png and b/freeciv/freeciv/data/flags/jordan-shield.png differ diff --git a/freeciv/freeciv/data/flags/jordan.png b/freeciv/freeciv/data/flags/jordan.png index 7d8675402..2c813440f 100644 Binary files a/freeciv/freeciv/data/flags/jordan.png and b/freeciv/freeciv/data/flags/jordan.png differ diff --git a/freeciv/freeciv/data/flags/kazakhstan-large.png b/freeciv/freeciv/data/flags/kazakhstan-large.png index 953305b9e..c34762bdd 100644 Binary files a/freeciv/freeciv/data/flags/kazakhstan-large.png and b/freeciv/freeciv/data/flags/kazakhstan-large.png differ diff --git a/freeciv/freeciv/data/flags/kazakhstan.png b/freeciv/freeciv/data/flags/kazakhstan.png index 532c8604e..a85ea9fad 100644 Binary files a/freeciv/freeciv/data/flags/kazakhstan.png and b/freeciv/freeciv/data/flags/kazakhstan.png differ diff --git a/freeciv/freeciv/data/flags/keetoowah.png b/freeciv/freeciv/data/flags/keetoowah.png index 318926763..bf9ea3906 100644 Binary files a/freeciv/freeciv/data/flags/keetoowah.png and b/freeciv/freeciv/data/flags/keetoowah.png differ diff --git a/freeciv/freeciv/data/flags/kiribati-large.png b/freeciv/freeciv/data/flags/kiribati-large.png index 1e9eda3cf..ae4eeff02 100644 Binary files a/freeciv/freeciv/data/flags/kiribati-large.png and b/freeciv/freeciv/data/flags/kiribati-large.png differ diff --git a/freeciv/freeciv/data/flags/kiribati.png b/freeciv/freeciv/data/flags/kiribati.png index 7704a0ad2..6a6bc24c3 100644 Binary files a/freeciv/freeciv/data/flags/kiribati.png and b/freeciv/freeciv/data/flags/kiribati.png differ diff --git a/freeciv/freeciv/data/flags/kuna_yala.png b/freeciv/freeciv/data/flags/kuna_yala.png index a542d463b..5b84ce2a1 100644 Binary files a/freeciv/freeciv/data/flags/kuna_yala.png and b/freeciv/freeciv/data/flags/kuna_yala.png differ diff --git a/freeciv/freeciv/data/flags/kurd-large.png b/freeciv/freeciv/data/flags/kurd-large.png index 2b142a782..19afb2bdb 100644 Binary files a/freeciv/freeciv/data/flags/kurd-large.png and b/freeciv/freeciv/data/flags/kurd-large.png differ diff --git a/freeciv/freeciv/data/flags/kurd-shield-large.png b/freeciv/freeciv/data/flags/kurd-shield-large.png index 559fc8b64..972c0021b 100644 Binary files a/freeciv/freeciv/data/flags/kurd-shield-large.png and b/freeciv/freeciv/data/flags/kurd-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/kurd-shield.png b/freeciv/freeciv/data/flags/kurd-shield.png index b7486471e..7453222b4 100644 Binary files a/freeciv/freeciv/data/flags/kurd-shield.png and b/freeciv/freeciv/data/flags/kurd-shield.png differ diff --git a/freeciv/freeciv/data/flags/kurd.png b/freeciv/freeciv/data/flags/kurd.png index 7b73bb0ce..265b73df3 100644 Binary files a/freeciv/freeciv/data/flags/kurd.png and b/freeciv/freeciv/data/flags/kurd.png differ diff --git a/freeciv/freeciv/data/flags/kuwait-large.png b/freeciv/freeciv/data/flags/kuwait-large.png index ba515ad54..f530a1b76 100644 Binary files a/freeciv/freeciv/data/flags/kuwait-large.png and b/freeciv/freeciv/data/flags/kuwait-large.png differ diff --git a/freeciv/freeciv/data/flags/kuwait.png b/freeciv/freeciv/data/flags/kuwait.png index e4101930b..4680fbe43 100644 Binary files a/freeciv/freeciv/data/flags/kuwait.png and b/freeciv/freeciv/data/flags/kuwait.png differ diff --git a/freeciv/freeciv/data/flags/latin_empire.png b/freeciv/freeciv/data/flags/latin_empire.png index 59c470d56..aa7dac5dc 100644 Binary files a/freeciv/freeciv/data/flags/latin_empire.png and b/freeciv/freeciv/data/flags/latin_empire.png differ diff --git a/freeciv/freeciv/data/flags/latvia-large.png b/freeciv/freeciv/data/flags/latvia-large.png index 6214b930d..8077e6fb6 100644 Binary files a/freeciv/freeciv/data/flags/latvia-large.png and b/freeciv/freeciv/data/flags/latvia-large.png differ diff --git a/freeciv/freeciv/data/flags/latvia-shield-large.png b/freeciv/freeciv/data/flags/latvia-shield-large.png index 15b10e0ef..724bb4f9e 100644 Binary files a/freeciv/freeciv/data/flags/latvia-shield-large.png and b/freeciv/freeciv/data/flags/latvia-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/latvia-shield.png b/freeciv/freeciv/data/flags/latvia-shield.png index aa25ba4ad..53086581b 100644 Binary files a/freeciv/freeciv/data/flags/latvia-shield.png and b/freeciv/freeciv/data/flags/latvia-shield.png differ diff --git a/freeciv/freeciv/data/flags/latvia.png b/freeciv/freeciv/data/flags/latvia.png index 1b956d940..f4e0ca17d 100644 Binary files a/freeciv/freeciv/data/flags/latvia.png and b/freeciv/freeciv/data/flags/latvia.png differ diff --git a/freeciv/freeciv/data/flags/lebanon-large.png b/freeciv/freeciv/data/flags/lebanon-large.png index 89575d7f8..cc9f80ccf 100644 Binary files a/freeciv/freeciv/data/flags/lebanon-large.png and b/freeciv/freeciv/data/flags/lebanon-large.png differ diff --git a/freeciv/freeciv/data/flags/lebanon-shield-large.png b/freeciv/freeciv/data/flags/lebanon-shield-large.png index d15ab4af3..466485d94 100644 Binary files a/freeciv/freeciv/data/flags/lebanon-shield-large.png and b/freeciv/freeciv/data/flags/lebanon-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/lebanon-shield.png b/freeciv/freeciv/data/flags/lebanon-shield.png index 8dc5705b8..275af7121 100644 Binary files a/freeciv/freeciv/data/flags/lebanon-shield.png and b/freeciv/freeciv/data/flags/lebanon-shield.png differ diff --git a/freeciv/freeciv/data/flags/lebanon.png b/freeciv/freeciv/data/flags/lebanon.png index f54131040..9998e9180 100644 Binary files a/freeciv/freeciv/data/flags/lebanon.png and b/freeciv/freeciv/data/flags/lebanon.png differ diff --git a/freeciv/freeciv/data/flags/lesotho_old.png b/freeciv/freeciv/data/flags/lesotho_old.png index c011482cf..000ac97bb 100644 Binary files a/freeciv/freeciv/data/flags/lesotho_old.png and b/freeciv/freeciv/data/flags/lesotho_old.png differ diff --git a/freeciv/freeciv/data/flags/libya-large.png b/freeciv/freeciv/data/flags/libya-large.png index a8f7b31c7..d74f9ce15 100644 Binary files a/freeciv/freeciv/data/flags/libya-large.png and b/freeciv/freeciv/data/flags/libya-large.png differ diff --git a/freeciv/freeciv/data/flags/libya.png b/freeciv/freeciv/data/flags/libya.png index a02c7d6d4..b2eac7719 100644 Binary files a/freeciv/freeciv/data/flags/libya.png and b/freeciv/freeciv/data/flags/libya.png differ diff --git a/freeciv/freeciv/data/flags/libya_old.png b/freeciv/freeciv/data/flags/libya_old.png index 3f45344bd..803fe07ef 100644 Binary files a/freeciv/freeciv/data/flags/libya_old.png and b/freeciv/freeciv/data/flags/libya_old.png differ diff --git a/freeciv/freeciv/data/flags/libyaold.png b/freeciv/freeciv/data/flags/libyaold.png index b51255518..9a8f860d9 100644 Binary files a/freeciv/freeciv/data/flags/libyaold.png and b/freeciv/freeciv/data/flags/libyaold.png differ diff --git a/freeciv/freeciv/data/flags/macedonia-large.png b/freeciv/freeciv/data/flags/macedonia-large.png index ea7482779..00b6728c6 100644 Binary files a/freeciv/freeciv/data/flags/macedonia-large.png and b/freeciv/freeciv/data/flags/macedonia-large.png differ diff --git a/freeciv/freeciv/data/flags/macedonia-shield-large.png b/freeciv/freeciv/data/flags/macedonia-shield-large.png index 3edcfde3c..73ec216e6 100644 Binary files a/freeciv/freeciv/data/flags/macedonia-shield-large.png and b/freeciv/freeciv/data/flags/macedonia-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/macedonia-shield.png b/freeciv/freeciv/data/flags/macedonia-shield.png index 35c36d33c..dd6ae4cf9 100644 Binary files a/freeciv/freeciv/data/flags/macedonia-shield.png and b/freeciv/freeciv/data/flags/macedonia-shield.png differ diff --git a/freeciv/freeciv/data/flags/macedonia.png b/freeciv/freeciv/data/flags/macedonia.png index 47a816366..d11c3f41d 100644 Binary files a/freeciv/freeciv/data/flags/macedonia.png and b/freeciv/freeciv/data/flags/macedonia.png differ diff --git a/freeciv/freeciv/data/flags/malaysia-large.png b/freeciv/freeciv/data/flags/malaysia-large.png index 7abe6039c..2b442b0d1 100644 Binary files a/freeciv/freeciv/data/flags/malaysia-large.png and b/freeciv/freeciv/data/flags/malaysia-large.png differ diff --git a/freeciv/freeciv/data/flags/malaysia.png b/freeciv/freeciv/data/flags/malaysia.png index 3dc0d6335..c8663b64a 100644 Binary files a/freeciv/freeciv/data/flags/malaysia.png and b/freeciv/freeciv/data/flags/malaysia.png differ diff --git a/freeciv/freeciv/data/flags/mali_ancient.png b/freeciv/freeciv/data/flags/mali_ancient.png index cb5f76af3..06a839705 100644 Binary files a/freeciv/freeciv/data/flags/mali_ancient.png and b/freeciv/freeciv/data/flags/mali_ancient.png differ diff --git a/freeciv/freeciv/data/flags/man-large.png b/freeciv/freeciv/data/flags/man-large.png index 9c1fbcba0..5c50aa2a2 100644 Binary files a/freeciv/freeciv/data/flags/man-large.png and b/freeciv/freeciv/data/flags/man-large.png differ diff --git a/freeciv/freeciv/data/flags/man-shield.png b/freeciv/freeciv/data/flags/man-shield.png index d4e56f44a..811b2f77b 100644 Binary files a/freeciv/freeciv/data/flags/man-shield.png and b/freeciv/freeciv/data/flags/man-shield.png differ diff --git a/freeciv/freeciv/data/flags/man.png b/freeciv/freeciv/data/flags/man.png index 69efe2bf8..18cde170b 100644 Binary files a/freeciv/freeciv/data/flags/man.png and b/freeciv/freeciv/data/flags/man.png differ diff --git a/freeciv/freeciv/data/flags/marshall_islands.png b/freeciv/freeciv/data/flags/marshall_islands.png index e3e275cff..553f44159 100644 Binary files a/freeciv/freeciv/data/flags/marshall_islands.png and b/freeciv/freeciv/data/flags/marshall_islands.png differ diff --git a/freeciv/freeciv/data/flags/moldova-large.png b/freeciv/freeciv/data/flags/moldova-large.png index 9d673f37b..98615e5e5 100644 Binary files a/freeciv/freeciv/data/flags/moldova-large.png and b/freeciv/freeciv/data/flags/moldova-large.png differ diff --git a/freeciv/freeciv/data/flags/moldova-shield-large.png b/freeciv/freeciv/data/flags/moldova-shield-large.png index 9d3944305..3a968d9fd 100644 Binary files a/freeciv/freeciv/data/flags/moldova-shield-large.png and b/freeciv/freeciv/data/flags/moldova-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/moldova-shield.png b/freeciv/freeciv/data/flags/moldova-shield.png index f958a9efb..fb1ae13e2 100644 Binary files a/freeciv/freeciv/data/flags/moldova-shield.png and b/freeciv/freeciv/data/flags/moldova-shield.png differ diff --git a/freeciv/freeciv/data/flags/moldova.png b/freeciv/freeciv/data/flags/moldova.png index 877dd4eef..b10e6ecc6 100644 Binary files a/freeciv/freeciv/data/flags/moldova.png and b/freeciv/freeciv/data/flags/moldova.png differ diff --git a/freeciv/freeciv/data/flags/moluccas-large.png b/freeciv/freeciv/data/flags/moluccas-large.png index 345a41d97..845b791dc 100644 Binary files a/freeciv/freeciv/data/flags/moluccas-large.png and b/freeciv/freeciv/data/flags/moluccas-large.png differ diff --git a/freeciv/freeciv/data/flags/moluccas-shield-large.png b/freeciv/freeciv/data/flags/moluccas-shield-large.png index e2fb2dc33..e969cd47e 100644 Binary files a/freeciv/freeciv/data/flags/moluccas-shield-large.png and b/freeciv/freeciv/data/flags/moluccas-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/moluccas-shield.png b/freeciv/freeciv/data/flags/moluccas-shield.png index 096088b9c..b45b6b99f 100644 Binary files a/freeciv/freeciv/data/flags/moluccas-shield.png and b/freeciv/freeciv/data/flags/moluccas-shield.png differ diff --git a/freeciv/freeciv/data/flags/moluccas.png b/freeciv/freeciv/data/flags/moluccas.png index 4e7ecb54d..e36f1df16 100644 Binary files a/freeciv/freeciv/data/flags/moluccas.png and b/freeciv/freeciv/data/flags/moluccas.png differ diff --git a/freeciv/freeciv/data/flags/monaco_alternative-large.png b/freeciv/freeciv/data/flags/monaco_alternative-large.png index fa62f4686..68947c512 100644 Binary files a/freeciv/freeciv/data/flags/monaco_alternative-large.png and b/freeciv/freeciv/data/flags/monaco_alternative-large.png differ diff --git a/freeciv/freeciv/data/flags/monaco_alternative-shield-large.png b/freeciv/freeciv/data/flags/monaco_alternative-shield-large.png index 4f1a39b01..db2eb8861 100644 Binary files a/freeciv/freeciv/data/flags/monaco_alternative-shield-large.png and b/freeciv/freeciv/data/flags/monaco_alternative-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/monaco_alternative-shield.png b/freeciv/freeciv/data/flags/monaco_alternative-shield.png index 501a489d1..afa3dce52 100644 Binary files a/freeciv/freeciv/data/flags/monaco_alternative-shield.png and b/freeciv/freeciv/data/flags/monaco_alternative-shield.png differ diff --git a/freeciv/freeciv/data/flags/monaco_alternative.png b/freeciv/freeciv/data/flags/monaco_alternative.png index fd4290710..a4b236554 100644 Binary files a/freeciv/freeciv/data/flags/monaco_alternative.png and b/freeciv/freeciv/data/flags/monaco_alternative.png differ diff --git a/freeciv/freeciv/data/flags/monacoalternative.png b/freeciv/freeciv/data/flags/monacoalternative.png index 42dbab89f..3b80fc03b 100644 Binary files a/freeciv/freeciv/data/flags/monacoalternative.png and b/freeciv/freeciv/data/flags/monacoalternative.png differ diff --git a/freeciv/freeciv/data/flags/mongolia-large.png b/freeciv/freeciv/data/flags/mongolia-large.png index 787ebd2b5..65fd67f48 100644 Binary files a/freeciv/freeciv/data/flags/mongolia-large.png and b/freeciv/freeciv/data/flags/mongolia-large.png differ diff --git a/freeciv/freeciv/data/flags/mongolia-shield-large.png b/freeciv/freeciv/data/flags/mongolia-shield-large.png index 5f9458819..f5ce37734 100644 Binary files a/freeciv/freeciv/data/flags/mongolia-shield-large.png and b/freeciv/freeciv/data/flags/mongolia-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/mongolia-shield.png b/freeciv/freeciv/data/flags/mongolia-shield.png index 7998d0f4b..b8be34912 100644 Binary files a/freeciv/freeciv/data/flags/mongolia-shield.png and b/freeciv/freeciv/data/flags/mongolia-shield.png differ diff --git a/freeciv/freeciv/data/flags/mongolia.png b/freeciv/freeciv/data/flags/mongolia.png index aeff4f7b5..e2251344a 100644 Binary files a/freeciv/freeciv/data/flags/mongolia.png and b/freeciv/freeciv/data/flags/mongolia.png differ diff --git a/freeciv/freeciv/data/flags/myanmar_old.png b/freeciv/freeciv/data/flags/myanmar_old.png index 4aa65f6a5..4503720e2 100644 Binary files a/freeciv/freeciv/data/flags/myanmar_old.png and b/freeciv/freeciv/data/flags/myanmar_old.png differ diff --git a/freeciv/freeciv/data/flags/nagorno_karabakh.png b/freeciv/freeciv/data/flags/nagorno_karabakh.png index cdd61d3e6..b791eb4ac 100644 Binary files a/freeciv/freeciv/data/flags/nagorno_karabakh.png and b/freeciv/freeciv/data/flags/nagorno_karabakh.png differ diff --git a/freeciv/freeciv/data/flags/netherlands_antilles.png b/freeciv/freeciv/data/flags/netherlands_antilles.png index afcfa390b..0fc778bd5 100644 Binary files a/freeciv/freeciv/data/flags/netherlands_antilles.png and b/freeciv/freeciv/data/flags/netherlands_antilles.png differ diff --git a/freeciv/freeciv/data/flags/newzealand-large.png b/freeciv/freeciv/data/flags/newzealand-large.png index c13ffef5d..7c1d2bb62 100644 Binary files a/freeciv/freeciv/data/flags/newzealand-large.png and b/freeciv/freeciv/data/flags/newzealand-large.png differ diff --git a/freeciv/freeciv/data/flags/newzealand-shield-large.png b/freeciv/freeciv/data/flags/newzealand-shield-large.png index fee2fcad1..0c8494cd6 100644 Binary files a/freeciv/freeciv/data/flags/newzealand-shield-large.png and b/freeciv/freeciv/data/flags/newzealand-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/newzealand-shield.png b/freeciv/freeciv/data/flags/newzealand-shield.png index 38183c3b2..908c3b8b5 100644 Binary files a/freeciv/freeciv/data/flags/newzealand-shield.png and b/freeciv/freeciv/data/flags/newzealand-shield.png differ diff --git a/freeciv/freeciv/data/flags/newzealand.png b/freeciv/freeciv/data/flags/newzealand.png index 0220069b3..f5f346894 100644 Binary files a/freeciv/freeciv/data/flags/newzealand.png and b/freeciv/freeciv/data/flags/newzealand.png differ diff --git a/freeciv/freeciv/data/flags/nez_perce.png b/freeciv/freeciv/data/flags/nez_perce.png index dac77869f..8e286cf34 100644 Binary files a/freeciv/freeciv/data/flags/nez_perce.png and b/freeciv/freeciv/data/flags/nez_perce.png differ diff --git a/freeciv/freeciv/data/flags/nigeria-large.png b/freeciv/freeciv/data/flags/nigeria-large.png index 530b023a7..7f15d2aff 100644 Binary files a/freeciv/freeciv/data/flags/nigeria-large.png and b/freeciv/freeciv/data/flags/nigeria-large.png differ diff --git a/freeciv/freeciv/data/flags/nigeria-shield.png b/freeciv/freeciv/data/flags/nigeria-shield.png index 2f8564c9f..7b753d642 100644 Binary files a/freeciv/freeciv/data/flags/nigeria-shield.png and b/freeciv/freeciv/data/flags/nigeria-shield.png differ diff --git a/freeciv/freeciv/data/flags/north_korea-large.png b/freeciv/freeciv/data/flags/north_korea-large.png index 81547ad8c..4fc5e2059 100644 Binary files a/freeciv/freeciv/data/flags/north_korea-large.png and b/freeciv/freeciv/data/flags/north_korea-large.png differ diff --git a/freeciv/freeciv/data/flags/north_korea.png b/freeciv/freeciv/data/flags/north_korea.png index aea5a7e2d..07eec9704 100644 Binary files a/freeciv/freeciv/data/flags/north_korea.png and b/freeciv/freeciv/data/flags/north_korea.png differ diff --git a/freeciv/freeciv/data/flags/northkorea.png b/freeciv/freeciv/data/flags/northkorea.png index a3ea0c639..69ed5df8e 100644 Binary files a/freeciv/freeciv/data/flags/northkorea.png and b/freeciv/freeciv/data/flags/northkorea.png differ diff --git a/freeciv/freeciv/data/flags/norway-large.png b/freeciv/freeciv/data/flags/norway-large.png index fdbff23c4..9cde28d56 100644 Binary files a/freeciv/freeciv/data/flags/norway-large.png and b/freeciv/freeciv/data/flags/norway-large.png differ diff --git a/freeciv/freeciv/data/flags/norway-shield-large.png b/freeciv/freeciv/data/flags/norway-shield-large.png index 34d290911..d63281b0f 100644 Binary files a/freeciv/freeciv/data/flags/norway-shield-large.png and b/freeciv/freeciv/data/flags/norway-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/norway-shield.png b/freeciv/freeciv/data/flags/norway-shield.png index 4fb77a7c1..e13859b0a 100644 Binary files a/freeciv/freeciv/data/flags/norway-shield.png and b/freeciv/freeciv/data/flags/norway-shield.png differ diff --git a/freeciv/freeciv/data/flags/norway.png b/freeciv/freeciv/data/flags/norway.png index a97003a74..f12a2c100 100644 Binary files a/freeciv/freeciv/data/flags/norway.png and b/freeciv/freeciv/data/flags/norway.png differ diff --git a/freeciv/freeciv/data/flags/oldenburg-large.png b/freeciv/freeciv/data/flags/oldenburg-large.png index ab0e72d8a..b81593612 100644 Binary files a/freeciv/freeciv/data/flags/oldenburg-large.png and b/freeciv/freeciv/data/flags/oldenburg-large.png differ diff --git a/freeciv/freeciv/data/flags/oldenburg-shield-large.png b/freeciv/freeciv/data/flags/oldenburg-shield-large.png index 06dea46b7..660e78645 100644 Binary files a/freeciv/freeciv/data/flags/oldenburg-shield-large.png and b/freeciv/freeciv/data/flags/oldenburg-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/oldenburg-shield.png b/freeciv/freeciv/data/flags/oldenburg-shield.png index 0d099dcb8..feab611f0 100644 Binary files a/freeciv/freeciv/data/flags/oldenburg-shield.png and b/freeciv/freeciv/data/flags/oldenburg-shield.png differ diff --git a/freeciv/freeciv/data/flags/oldenburg.png b/freeciv/freeciv/data/flags/oldenburg.png index 06db1addb..2a99094af 100644 Binary files a/freeciv/freeciv/data/flags/oldenburg.png and b/freeciv/freeciv/data/flags/oldenburg.png differ diff --git a/freeciv/freeciv/data/flags/papua_newguinea.png b/freeciv/freeciv/data/flags/papua_newguinea.png index 5c2abb163..87366e593 100644 Binary files a/freeciv/freeciv/data/flags/papua_newguinea.png and b/freeciv/freeciv/data/flags/papua_newguinea.png differ diff --git a/freeciv/freeciv/data/flags/philippines-large.png b/freeciv/freeciv/data/flags/philippines-large.png index 64566e786..a72d31873 100644 Binary files a/freeciv/freeciv/data/flags/philippines-large.png and b/freeciv/freeciv/data/flags/philippines-large.png differ diff --git a/freeciv/freeciv/data/flags/philippines-shield-large.png b/freeciv/freeciv/data/flags/philippines-shield-large.png index 1b64c0d39..c3ff2ce7a 100644 Binary files a/freeciv/freeciv/data/flags/philippines-shield-large.png and b/freeciv/freeciv/data/flags/philippines-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/philippines-shield.png b/freeciv/freeciv/data/flags/philippines-shield.png index c5666ad45..60a48b5c6 100644 Binary files a/freeciv/freeciv/data/flags/philippines-shield.png and b/freeciv/freeciv/data/flags/philippines-shield.png differ diff --git a/freeciv/freeciv/data/flags/philippines.png b/freeciv/freeciv/data/flags/philippines.png index b2456fa43..73aab8263 100644 Binary files a/freeciv/freeciv/data/flags/philippines.png and b/freeciv/freeciv/data/flags/philippines.png differ diff --git a/freeciv/freeciv/data/flags/poland-large.png b/freeciv/freeciv/data/flags/poland-large.png index a50d144f2..b85ed8924 100644 Binary files a/freeciv/freeciv/data/flags/poland-large.png and b/freeciv/freeciv/data/flags/poland-large.png differ diff --git a/freeciv/freeciv/data/flags/poland-shield-large.png b/freeciv/freeciv/data/flags/poland-shield-large.png index dd1d27d83..4c627cfd8 100644 Binary files a/freeciv/freeciv/data/flags/poland-shield-large.png and b/freeciv/freeciv/data/flags/poland-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/poland-shield.png b/freeciv/freeciv/data/flags/poland-shield.png index dc9adcdce..48ee57521 100644 Binary files a/freeciv/freeciv/data/flags/poland-shield.png and b/freeciv/freeciv/data/flags/poland-shield.png differ diff --git a/freeciv/freeciv/data/flags/poland.png b/freeciv/freeciv/data/flags/poland.png index bc47e891e..3cc48be00 100644 Binary files a/freeciv/freeciv/data/flags/poland.png and b/freeciv/freeciv/data/flags/poland.png differ diff --git a/freeciv/freeciv/data/flags/puerto_rico.png b/freeciv/freeciv/data/flags/puerto_rico.png index 86de6bd53..447576a01 100644 Binary files a/freeciv/freeciv/data/flags/puerto_rico.png and b/freeciv/freeciv/data/flags/puerto_rico.png differ diff --git a/freeciv/freeciv/data/flags/r_congo.png b/freeciv/freeciv/data/flags/r_congo.png index 0b6a8bd15..aac0105d6 100644 Binary files a/freeciv/freeciv/data/flags/r_congo.png and b/freeciv/freeciv/data/flags/r_congo.png differ diff --git a/freeciv/freeciv/data/flags/rapa_nui.png b/freeciv/freeciv/data/flags/rapa_nui.png index 19928741d..e35b1713a 100644 Binary files a/freeciv/freeciv/data/flags/rapa_nui.png and b/freeciv/freeciv/data/flags/rapa_nui.png differ diff --git a/freeciv/freeciv/data/flags/russia-large.png b/freeciv/freeciv/data/flags/russia-large.png index 03ccb190d..673a7712b 100644 Binary files a/freeciv/freeciv/data/flags/russia-large.png and b/freeciv/freeciv/data/flags/russia-large.png differ diff --git a/freeciv/freeciv/data/flags/russia-shield-large.png b/freeciv/freeciv/data/flags/russia-shield-large.png index 020a9f97d..a02b5b2a0 100644 Binary files a/freeciv/freeciv/data/flags/russia-shield-large.png and b/freeciv/freeciv/data/flags/russia-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/russia-shield.png b/freeciv/freeciv/data/flags/russia-shield.png index 50557fac7..e20c44cc7 100644 Binary files a/freeciv/freeciv/data/flags/russia-shield.png and b/freeciv/freeciv/data/flags/russia-shield.png differ diff --git a/freeciv/freeciv/data/flags/russia.png b/freeciv/freeciv/data/flags/russia.png index 55058c7ad..15ddc9719 100644 Binary files a/freeciv/freeciv/data/flags/russia.png and b/freeciv/freeciv/data/flags/russia.png differ diff --git a/freeciv/freeciv/data/flags/saint_kitts_and_nevis.png b/freeciv/freeciv/data/flags/saint_kitts_and_nevis.png index 52f91d898..fae002057 100644 Binary files a/freeciv/freeciv/data/flags/saint_kitts_and_nevis.png and b/freeciv/freeciv/data/flags/saint_kitts_and_nevis.png differ diff --git a/freeciv/freeciv/data/flags/saint_lucia.png b/freeciv/freeciv/data/flags/saint_lucia.png index 82683de87..abc5f9085 100644 Binary files a/freeciv/freeciv/data/flags/saint_lucia.png and b/freeciv/freeciv/data/flags/saint_lucia.png differ diff --git a/freeciv/freeciv/data/flags/san_marino.png b/freeciv/freeciv/data/flags/san_marino.png index 9510d8535..cfb502607 100644 Binary files a/freeciv/freeciv/data/flags/san_marino.png and b/freeciv/freeciv/data/flags/san_marino.png differ diff --git a/freeciv/freeciv/data/flags/sao_tome_and_principe.png b/freeciv/freeciv/data/flags/sao_tome_and_principe.png index 3873155f1..b3c35b43d 100644 Binary files a/freeciv/freeciv/data/flags/sao_tome_and_principe.png and b/freeciv/freeciv/data/flags/sao_tome_and_principe.png differ diff --git a/freeciv/freeciv/data/flags/saotomeand_principe.png b/freeciv/freeciv/data/flags/saotomeand_principe.png index cf7e31e97..6eab2e090 100644 Binary files a/freeciv/freeciv/data/flags/saotomeand_principe.png and b/freeciv/freeciv/data/flags/saotomeand_principe.png differ diff --git a/freeciv/freeciv/data/flags/saotomeandprincipe.png b/freeciv/freeciv/data/flags/saotomeandprincipe.png index cf7e31e97..6eab2e090 100644 Binary files a/freeciv/freeciv/data/flags/saotomeandprincipe.png and b/freeciv/freeciv/data/flags/saotomeandprincipe.png differ diff --git a/freeciv/freeciv/data/flags/saudi_arabia.png b/freeciv/freeciv/data/flags/saudi_arabia.png index e96c0555b..cd901fbfe 100644 Binary files a/freeciv/freeciv/data/flags/saudi_arabia.png and b/freeciv/freeciv/data/flags/saudi_arabia.png differ diff --git a/freeciv/freeciv/data/flags/scotland-large.png b/freeciv/freeciv/data/flags/scotland-large.png index 93c5e3408..dd47d26c0 100644 Binary files a/freeciv/freeciv/data/flags/scotland-large.png and b/freeciv/freeciv/data/flags/scotland-large.png differ diff --git a/freeciv/freeciv/data/flags/scotland-shield-large.png b/freeciv/freeciv/data/flags/scotland-shield-large.png index 5b721fc04..7000cc074 100644 Binary files a/freeciv/freeciv/data/flags/scotland-shield-large.png and b/freeciv/freeciv/data/flags/scotland-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/scotland-shield.png b/freeciv/freeciv/data/flags/scotland-shield.png index 897283394..b2222c022 100644 Binary files a/freeciv/freeciv/data/flags/scotland-shield.png and b/freeciv/freeciv/data/flags/scotland-shield.png differ diff --git a/freeciv/freeciv/data/flags/scotland.png b/freeciv/freeciv/data/flags/scotland.png index 652744775..7c1879a63 100644 Binary files a/freeciv/freeciv/data/flags/scotland.png and b/freeciv/freeciv/data/flags/scotland.png differ diff --git a/freeciv/freeciv/data/flags/seleucid-large.png b/freeciv/freeciv/data/flags/seleucid-large.png index d40cf25f7..bebac97bc 100644 Binary files a/freeciv/freeciv/data/flags/seleucid-large.png and b/freeciv/freeciv/data/flags/seleucid-large.png differ diff --git a/freeciv/freeciv/data/flags/seleucid-shield-large.png b/freeciv/freeciv/data/flags/seleucid-shield-large.png index 821dbcfd1..3cb4a684a 100644 Binary files a/freeciv/freeciv/data/flags/seleucid-shield-large.png and b/freeciv/freeciv/data/flags/seleucid-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/seleucid-shield.png b/freeciv/freeciv/data/flags/seleucid-shield.png index 2291f9296..2f8361375 100644 Binary files a/freeciv/freeciv/data/flags/seleucid-shield.png and b/freeciv/freeciv/data/flags/seleucid-shield.png differ diff --git a/freeciv/freeciv/data/flags/seleucid.png b/freeciv/freeciv/data/flags/seleucid.png index 206b6764e..d41758c16 100644 Binary files a/freeciv/freeciv/data/flags/seleucid.png and b/freeciv/freeciv/data/flags/seleucid.png differ diff --git a/freeciv/freeciv/data/flags/sierra_leone.png b/freeciv/freeciv/data/flags/sierra_leone.png index 432194534..778470e30 100644 Binary files a/freeciv/freeciv/data/flags/sierra_leone.png and b/freeciv/freeciv/data/flags/sierra_leone.png differ diff --git a/freeciv/freeciv/data/flags/solomon_islands.png b/freeciv/freeciv/data/flags/solomon_islands.png index 29314e4f1..aefbc0eba 100644 Binary files a/freeciv/freeciv/data/flags/solomon_islands.png and b/freeciv/freeciv/data/flags/solomon_islands.png differ diff --git a/freeciv/freeciv/data/flags/south_africa.png b/freeciv/freeciv/data/flags/south_africa.png index a272d32ad..a054144bf 100644 Binary files a/freeciv/freeciv/data/flags/south_africa.png and b/freeciv/freeciv/data/flags/south_africa.png differ diff --git a/freeciv/freeciv/data/flags/south_yemen.png b/freeciv/freeciv/data/flags/south_yemen.png index 0ed4efbfb..6ec7fb1f3 100644 Binary files a/freeciv/freeciv/data/flags/south_yemen.png and b/freeciv/freeciv/data/flags/south_yemen.png differ diff --git a/freeciv/freeciv/data/flags/southern_cross.png b/freeciv/freeciv/data/flags/southern_cross.png index 6ae88b564..169f91d47 100644 Binary files a/freeciv/freeciv/data/flags/southern_cross.png and b/freeciv/freeciv/data/flags/southern_cross.png differ diff --git a/freeciv/freeciv/data/flags/southern_sudan.png b/freeciv/freeciv/data/flags/southern_sudan.png index 6fc783d76..457e22146 100644 Binary files a/freeciv/freeciv/data/flags/southern_sudan.png and b/freeciv/freeciv/data/flags/southern_sudan.png differ diff --git a/freeciv/freeciv/data/flags/spartan-large.png b/freeciv/freeciv/data/flags/spartan-large.png index b3d529ed7..51b2914d9 100644 Binary files a/freeciv/freeciv/data/flags/spartan-large.png and b/freeciv/freeciv/data/flags/spartan-large.png differ diff --git a/freeciv/freeciv/data/flags/spartan-shield-large.png b/freeciv/freeciv/data/flags/spartan-shield-large.png index 77f062309..6c154088c 100644 Binary files a/freeciv/freeciv/data/flags/spartan-shield-large.png and b/freeciv/freeciv/data/flags/spartan-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/spartan-shield.png b/freeciv/freeciv/data/flags/spartan-shield.png index df981ded4..3e45d61b7 100644 Binary files a/freeciv/freeciv/data/flags/spartan-shield.png and b/freeciv/freeciv/data/flags/spartan-shield.png differ diff --git a/freeciv/freeciv/data/flags/spartan.png b/freeciv/freeciv/data/flags/spartan.png index f0a09a0b6..fb7cf9ef5 100644 Binary files a/freeciv/freeciv/data/flags/spartan.png and b/freeciv/freeciv/data/flags/spartan.png differ diff --git a/freeciv/freeciv/data/flags/sweden-large.png b/freeciv/freeciv/data/flags/sweden-large.png index ac5bbc786..d2e4e8c26 100644 Binary files a/freeciv/freeciv/data/flags/sweden-large.png and b/freeciv/freeciv/data/flags/sweden-large.png differ diff --git a/freeciv/freeciv/data/flags/sweden-shield-large.png b/freeciv/freeciv/data/flags/sweden-shield-large.png index f3584e490..5f68d93aa 100644 Binary files a/freeciv/freeciv/data/flags/sweden-shield-large.png and b/freeciv/freeciv/data/flags/sweden-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/sweden-shield.png b/freeciv/freeciv/data/flags/sweden-shield.png index b32162103..78859ce03 100644 Binary files a/freeciv/freeciv/data/flags/sweden-shield.png and b/freeciv/freeciv/data/flags/sweden-shield.png differ diff --git a/freeciv/freeciv/data/flags/sweden.png b/freeciv/freeciv/data/flags/sweden.png index 6d37d5f7d..e3d696f9c 100644 Binary files a/freeciv/freeciv/data/flags/sweden.png and b/freeciv/freeciv/data/flags/sweden.png differ diff --git a/freeciv/freeciv/data/flags/switzerland-large.png b/freeciv/freeciv/data/flags/switzerland-large.png index 85b7bd627..684c99a68 100644 Binary files a/freeciv/freeciv/data/flags/switzerland-large.png and b/freeciv/freeciv/data/flags/switzerland-large.png differ diff --git a/freeciv/freeciv/data/flags/switzerland-shield-large.png b/freeciv/freeciv/data/flags/switzerland-shield-large.png index 948cac6e5..234ca3aa9 100644 Binary files a/freeciv/freeciv/data/flags/switzerland-shield-large.png and b/freeciv/freeciv/data/flags/switzerland-shield-large.png differ diff --git a/freeciv/freeciv/data/flags/switzerland-shield.png b/freeciv/freeciv/data/flags/switzerland-shield.png index 03fe94cbb..42b1ad6e3 100644 Binary files a/freeciv/freeciv/data/flags/switzerland-shield.png and b/freeciv/freeciv/data/flags/switzerland-shield.png differ diff --git a/freeciv/freeciv/data/flags/switzerland.png b/freeciv/freeciv/data/flags/switzerland.png index 681974623..5029914d2 100644 Binary files a/freeciv/freeciv/data/flags/switzerland.png and b/freeciv/freeciv/data/flags/switzerland.png differ diff --git a/freeciv/freeciv/data/flags/tannu_tuva.png b/freeciv/freeciv/data/flags/tannu_tuva.png index 8e88edfc2..a45dc88d8 100644 Binary files a/freeciv/freeciv/data/flags/tannu_tuva.png and b/freeciv/freeciv/data/flags/tannu_tuva.png differ diff --git a/freeciv/freeciv/data/flags/teutonic_order.png b/freeciv/freeciv/data/flags/teutonic_order.png index 6764ec959..413959906 100644 Binary files a/freeciv/freeciv/data/flags/teutonic_order.png and b/freeciv/freeciv/data/flags/teutonic_order.png differ diff --git a/freeciv/freeciv/data/flags/trinidad_and_tobago.png b/freeciv/freeciv/data/flags/trinidad_and_tobago.png index 99ce5248a..e992911b2 100644 Binary files a/freeciv/freeciv/data/flags/trinidad_and_tobago.png and b/freeciv/freeciv/data/flags/trinidad_and_tobago.png differ diff --git a/freeciv/freeciv/data/flags/uae.png b/freeciv/freeciv/data/flags/uae.png index eb915fc54..b6ac88de3 100644 Binary files a/freeciv/freeciv/data/flags/uae.png and b/freeciv/freeciv/data/flags/uae.png differ diff --git a/freeciv/freeciv/data/flags/united_kingdom.png b/freeciv/freeciv/data/flags/united_kingdom.png index d771447cd..c567533b5 100644 Binary files a/freeciv/freeciv/data/flags/united_kingdom.png and b/freeciv/freeciv/data/flags/united_kingdom.png differ diff --git a/freeciv/freeciv/data/flags/united_nations.png b/freeciv/freeciv/data/flags/united_nations.png index 6be173ea8..c1c6bc6ff 100644 Binary files a/freeciv/freeciv/data/flags/united_nations.png and b/freeciv/freeciv/data/flags/united_nations.png differ diff --git a/freeciv/freeciv/data/flags/usa.png b/freeciv/freeciv/data/flags/usa.png index 2247a3252..d5aebe6aa 100644 Binary files a/freeciv/freeciv/data/flags/usa.png and b/freeciv/freeciv/data/flags/usa.png differ diff --git a/freeciv/freeciv/data/flags/uzbekistan.png b/freeciv/freeciv/data/flags/uzbekistan.png index 319cbec8f..d703a555b 100644 Binary files a/freeciv/freeciv/data/flags/uzbekistan.png and b/freeciv/freeciv/data/flags/uzbekistan.png differ diff --git a/freeciv/freeciv/data/flags/volga_bulgar.png b/freeciv/freeciv/data/flags/volga_bulgar.png index 55675e7db..74d73c293 100644 Binary files a/freeciv/freeciv/data/flags/volga_bulgar.png and b/freeciv/freeciv/data/flags/volga_bulgar.png differ diff --git a/freeciv/freeciv/data/flags/volga_german.png b/freeciv/freeciv/data/flags/volga_german.png index 5a09ff6e0..272cfee37 100644 Binary files a/freeciv/freeciv/data/flags/volga_german.png and b/freeciv/freeciv/data/flags/volga_german.png differ diff --git a/freeciv/freeciv/data/flags/west_indies_federation.png b/freeciv/freeciv/data/flags/west_indies_federation.png index 4a8dba193..fab35d29d 100644 Binary files a/freeciv/freeciv/data/flags/west_indies_federation.png and b/freeciv/freeciv/data/flags/west_indies_federation.png differ diff --git a/freeciv/freeciv/data/flags/west_papua.png b/freeciv/freeciv/data/flags/west_papua.png index 53807631b..51e289a06 100644 Binary files a/freeciv/freeciv/data/flags/west_papua.png and b/freeciv/freeciv/data/flags/west_papua.png differ diff --git a/freeciv/freeciv/data/maptest.serv b/freeciv/freeciv/data/maptest.serv deleted file mode 100644 index 84cfde594..000000000 --- a/freeciv/freeciv/data/maptest.serv +++ /dev/null @@ -1,6 +0,0 @@ -# Server commands to make multiplayer-evo Freeciv rules -# - -rulesetdir maptest - -# changed game settings are defined in game.ruleset diff --git a/freeciv/freeciv/data/maptest/README.maptest b/freeciv/freeciv/data/maptest/README.maptest deleted file mode 100644 index 6a30abae9..000000000 --- a/freeciv/freeciv/data/maptest/README.maptest +++ /dev/null @@ -1,29 +0,0 @@ -AG: Avant-garde ruleset -------------------------------------- -LINKS: -Full Game Manual -Multiplayer II Summary -Design Log -... -Terrain -Bases -Combat -Governments -Economy -Diplomacy -... -Terrain+Base Defense Bonus Quick-Reference -Hotkeys and Mouse Control - -The Avant-garde ruleset is a modernized ruleset to take advantage of cutting-edge advancements in Freeciv Server development. -Compared to Multiplayer-Evolution (MP2), the differences are that it is less restrained to keep the same "DNA" as the other -MP-branch rulesets, and allows itself to import features, improvements, and novel ideas from all other versions of Freeciv, -later versions of the commercial series, as well as original ideas from players. - -This ruleset began using MP2 as its base and added to it. Enjoy! - ------------------------------ -Changes from MP2: ------------------------------ - -END. \ No newline at end of file diff --git a/freeciv/freeciv/data/maptest/buildings.ruleset b/freeciv/freeciv/data/maptest/buildings.ruleset deleted file mode 100644 index 5926ed947..000000000 --- a/freeciv/freeciv/data/maptest/buildings.ruleset +++ /dev/null @@ -1,2205 +0,0 @@ -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes, -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -; Note that the freeciv AI may not cope well with anything more -; than minor changes. - -[datafile] -description="Avant-garde buildings data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -; /* <-- avoid gettext warnings -; -; Below: The individual buildings, one per section. -; (Buildings = City Improvements and Wonders) -; -; The actual tag used (the * in [building_*]) does not matter, except -; it must be unique within this file, and it may be used in debug -; output when reading this file. -; -; Notes: -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; if -; not present, "name" is used for this purpose too. Since -; the name used in savegames must not change, if you want -; to rename an item after a ruleset has been released, you -; should set "rule_name" to the original value of "name". -; genus = genus; one of: -; "GreatWonder", "SmallWonder", "Improvement", "Special". -; reqs = requirements to build the building (see effects.ruleset -; and README.effects for help on requirements) -; graphic = icon of improvement (used in city dialog) -; graphic_alt = alternate icon of improvement -; obsolete_by = requirements for the building to become obsolete -; build_cost = production shields required to build -; upkeep = monetary upkeep value -; sabotage = percent chance of diplomat sabotage being successful -; flags = special flag strings -; -; ** Building flags ** -; "VisibleByOthers" = Anyone who can see your city knows whether it has -; this improvement. (Great and small wonders are -; always visible.) -; "SaveSmallWonder" = If you lose the city with this building in, and the -; "savepalace" server setting is enabled, another will -; be built for free in a random city. -; Should only be used with genus "SmallWonder". -; "Gold" = Not a real building; production turned into gold -; indefinitely (capitalization/coinage). -; Genus should be "Special". -; "DisasterProof" = Disasters never destroy this building. Is meaningful -; only for genus "Improvement" buildings as others are -; automatically disaster proof. -; -; */ <-- avoid gettext warnings - -[building_airport] -name = _("Airport") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Radio", "Player" - } -graphic = "b.airport" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 120 -upkeep = 3 -sabotage = 100 -sound = "b_airport" -sound_alt = "b_generic" -helptext = _("\ -Allows a city to produce veteran Air units, Helicopters, and Missiles.\ - Damaged Air units and Helicopters which stay in town for one full turn\ - without moving are completely repaired.\ -"), _("\ -Two cities with Airports can airlift units. Airlifting instantly transports\ - the unit from one city to another and will use up all movement\ - points. A unit must have some movement points left to be airlifted.\ -") - -[building_amphitheatre] -name = _("Amphitheater") -rule_name = "Amphitheatre" ; en_GB used originally -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Construction", "Player" - } -graphic = "b.colosseum" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 4 -sabotage = 100 -sound = "b_colosseum" -sound_alt = "b_generic" -helptext = _("\ -Entertains the citizens of a city, making 3 unhappy citizens content. \ - (Four after the discovery of Electricity.) However, it does not\ - affect citizens made unhappy by military activity.\ -") - -[building_aqueduct] -name = _("Aqueduct") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Construction", "Player" - } -graphic = "b.aqueduct" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 2 -sabotage = 100 -sound = "b_aqueduct" -sound_alt = "b_generic" -helptext = _("\ -Allows a city to grow larger than size 8. A Sewer System is also\ - required for a city to grow larger than size 12.\ -") -; There is also an effect to reduce the chance of plague, but you have to -; enable illness in game.ruleset for that to be relevant. - -[building_bank] -name = _("Bank") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Banking", "Player" - "Building", "Marketplace", "City" - } -graphic = "b.bank" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 80 -upkeep = 2 -sabotage = 100 -sound = "b_bank" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Together, a Bank and Marketplace double the tax and luxury production in a city.\ - That is, the Bank adds another +50% to the +50% of the Marketplace.\ -") - -[building_barracks] -name = _("Barracks") -genus = "Improvement" -reqs = - { "type", "name", "range" - - } -graphic = "b.barracks_i" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Gunpowder", "Player" - "Building", "Barracks II", "City" - "Building", "Barracks III", "City" - } -build_cost = 30 -upkeep = 1 -sabotage = 100 -sound = "b_barracks_i" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -With a Barracks I, each new land unit built in a city will\ - automatically have Veteran V1 status, which means that its attack and\ - defense strengths are increased by 50%. Also, damaged land units\ - which stay in town for one full turn without moving are completely\ - healed. Obsolete by: Gunpowder.\ -") - -[building_barracks_ii] -name = _("Barracks II") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Gunpowder", "Player" - } -graphic = "b.barracks_ii" -graphic_alt = "b.barracks_i" -obsolete_by = - { "type", "name", "range" - "Tech", "Mobile Warfare", "Player" - "Building", "Barracks III", "City" - } -build_cost = 30 -upkeep = 1 -sabotage = 100 -sound = "b_barracks_ii" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -With a Barracks II, each new land unit built in a city will\ - automatically have Veteran V1 status, which means that its attack and\ - defense strengths are increased by 50%. Also, damaged land units\ - which stay in town for one full turn without moving are completely\ - restored. Obsolete by: Mobile Warfare.\ -") - -[building_barracks_iii] -name = _("Barracks III") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Mobile Warfare", "Player" - } -graphic = "b.barracks_iii" -graphic_alt = "b.barracks_i" -obsolete_by = - { "type", "name", "range" - } -build_cost = 30 -upkeep = 1 -sabotage = 100 -sound = "b_barracks_iii" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -With a Barracks III, each new land unit built in a city will\ - automatically have Veteran V1 status, which means that its attack and\ - defense strengths are increased by 50%. Also, damaged land units\ - which stay in town for one full turn without moving are completely\ - restored.\ -"), _("\ -When combined with an Airport and Port Facility, Marines built in the city\ - will automatically have Hardened V2 status.\ -") - -[building_cathedral] -name = _("Cathedral") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Monotheism", "Player" - "Building", "Temple", "City" - } -graphic = "b.cathedral" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 75 -upkeep = 3 -sabotage = 100 -sound = "b_cathedral" -sound_alt = "b_generic" -helptext = _("\ -A Cathedral makes 3 unhappy citizens content, but does not affect citizens\ - made unhappy by military activity. Theology increases the effect by +1.\ - Communist government decreases the effect by -1. (Michelangelos Chapel enhances\ - the effect of Cathedrals by +1 happy citizen and +1 forced content citizen.)\ -") - -[building_city_walls] -name = _("City Walls") -genus = "Improvement" -flags = "VisibleByOthers" -reqs = - { "type", "name", "range" - "Tech", "Masonry", "Player" - } -graphic = "b.city_walls" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 0 -sabotage = 50 -sound = "b_city_walls" -sound_alt = "b_generic" -helptext = _("\ -City Walls increase the 1.5x bonus for Land units in a city to 3x, effectively\ - doubling the strength of Land units against attacks from other Land units (and\ - Helicopters.) City Walls are ineffective against Air units, Sea units, Missiles,\ - and Howitzers; in which case the normal 1.5x bonus is given. City Walls prevent\ - population loss when a defending unit is destroyed by a Land unit. City Walls have\ - a 50% bonus against sabotage actions.\ -") - -[building_coastal_defense] -name = _("Coastal Defense") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Gunpowder", "Player" - "TerrainClass", "Oceanic", "Adjacent" - } -graphic = "b.coastal_defense" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 1 -sabotage = 100 -sound = "b_coastal_defense" -sound_alt = "b_generic" -helptext = _("\ -Doubles the defense strength of all units in a city when defending against\ - against enemy ships.\ -") - -[building_courthouse] -name = _("Courthouse") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Code of Laws", "Player" - } -graphic = "b.courthouse" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 45 -upkeep = 1 -sabotage = 100 -sound = "b_courthouse" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Courthouses reduce corruption by about half (60% rounded down),\ - eliminate tile output penalties for Anarchy and Despotism, and\ - give +1 unit free of upkeep.\ -"), _("\ - Diplomatic combat gets a bonus of ¼ of base odds. (At general base odds\ - of ½, odds of losing become: ½ - ⅛ = ⅜). All other hostile diplomatic\ - actions are 20% less effective (80% - 20% = 60%).\ -"), _("\ - In Democracy, Courthouses make 1 unhappy citizen content, unless the\ - citizen is unhappy about military activity).\ -"), _("\ - Cost to incite revolt in the city is 2x if empty and 4x if occupied.\ -") - -[building_factory] -name = _("Factory") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Industrialization", "Player" - } -graphic = "b.factory" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 140 -upkeep = 4 -sabotage = 100 -sound = "b_factory" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Increases the shield production in a city by +50%. This increase may\ - contribute to pollution.\ -"), _("\ - This building lets you conscript one extra infantry/foot unit per turn.\ -") - -[building_enrichment_facility] -name = _("Enrichment Facility") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Fusion Power", "Player" - "Building", "Fusion Reactor","City" - "ServerSetting","nukes_major", "World" - } -graphic = "b.enrichment_facility" -graphic_alt = "b.capitalization" -obsolete_by = - { "type", "name", "range" - } -build_cost = 200 -upkeep = 3 -sabotage = 100 -sound = "b_enrichment_facility" -sound_alt = "b_generic" -helptext = _("\ -Allows refining the fissile isotopes needed to create nuclear fusion weapons.\ - To make these weapons, a city requires an Enrichment Facility, which first\ - requires a Fusion Reactor.\ -") - -[building_fusion_reactor] -name = _("Fusion Reactor") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Fusion Power", "Player" - } -graphic = "b.fusion_reactor" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 200 -upkeep = 4 -sabotage = 100 -sound = "b_fusion_reactor" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Increases the shield production in a city by +75% of base production levels.\ - Gives +1 build slot and +5 free shield upkeep on units.\ -") - -[building_granary] -name = _("Granary") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Pottery", "Player" - } -graphic = "b.granary" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 35 -upkeep = 1 -sabotage = 100 -sound = "b_granary" -sound_alt = "b_generic" -helptext = _("\ -The amount of stored food will be set to half full whenever a city\ - with a Granary 1) grows in size, or 2) loses size from starvation.\ - This helps a city to grow faster and more easily withstand famine.\ -") - -[building_harbour] -name = _("Harbor") -rule_name = "Harbour" ; en_GB spelling used originally -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Seafaring", "Player" - "TerrainClass", "Oceanic", "Adjacent" - } -graphic = "b.harbour" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 40 -upkeep = 1 -sabotage = 100 -sound = "b_harbour" -sound_alt = "b_generic" -helptext = _("\ -Gives one extra food resource on all Oceanic tiles. The city needs\ - to be coastal to build this improvement.\ -") - -[building_homeland_security] -name = _("Homeland Security") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Literacy", "Player" - "Building", "Supreme Court", "Player" - } -graphic = "b.homeland_security" -graphic_alt = "b.courthouse" -obsolete_by = - { "type", "name", "range" - } -build_cost = 30 -upkeep = 0 -sabotage = 0 -sound = "b_homeland_security" -sound_alt = "b_generic" -helptext = _("\ -You can build Homeland Security offices if you own the Supreme Court. Homeland Security\ - gives the same bonus as a Courthouse vs. all hostile diplomatic acts. As a ministry of the\ - Supreme Court, it has no upkeep and cannot be sabotaged.\ -") - -[building_hydro_plant] -name = _("Hydro Plant") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Electronics", "Player" - "Building", "Factory", "City" - "Extra", "River", "Adjacent" - } -graphic = "b.hydro_plant" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 180 -upkeep = 4 -sabotage = 100 -sound = "b_hydro_plant" -sound_alt = "b_generic" -helptext = _("\ -For each Factory or Mfg. Plant in a city, a Hydro Plant adds +25% to\ - base production, and reduces pollution from production by -25%.\ -"), _("\ -*If a city has either a Factory or Mfg. Plant, this makes a combined +75%\ - production bonus with a 25% decrease in pollution from production.\ -"), _("\ -*In a city with both a Factory and Mfg. Plant, this makes a combined +150%\ - production bonus with a 50% decrease in pollution from production.\ -"), _("\ -*Only one Power Plant, Hydro Plant, Nuclear Plant, or\ - Solar Plant can have an active effect in a city.\ -") - -[building_library] -name = _("Library") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Writing", "Player" - } -graphic = "b.library" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 1 -sabotage = 100 -sound = "b_library" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Increases the science output in a city by +100%.\ -") - -[building_marketplace] -name = _("Marketplace") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Currency", "Player" - } -graphic = "b.marketplace" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 0 -sabotage = 100 -sound = "b_marketplace" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Increases the luxury and tax output in a city by +50%.\ -") - -[building_mass_transit] -name = _("Mass Transit") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Mass Production", "Player" - } -graphic = "b.mass_transit" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 0 -sabotage = 100 -sound = "b_mass_transit" -sound_alt = "b_generic" -helptext = _("\ -Eliminates the pollution generated by population.\ - Production becomes the only source of pollution in\ - the city.\ -"), _("\ -Increased citizen mobility and ticket revenues\ - increase base trade on city centre tile by +2\ -") - -[building_mfg_plant] -name = _("Manufacturing Plant") -rule_name = "Mfg. Plant" -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Robotics", "Player" - "Building", "Factory", "City" - } -graphic = "b.mfg_plant" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 220 -upkeep = 6 -sabotage = 100 -sound = "b_mfg_plant" -sound_alt = "b_generic" -helptext = _("\ -A Manufacturing Plant increases base production by +50%.\ -"), _("\ -A Mfg. Plant & Factory together double the production in a city.\ - That is, the Mfg. Plant adds another +50% to the +50% of the Factory.\ -"), _("\ -A Mfg. Plant with a Factory AND a Power, Hydro, Nuclear, or Solar Plant\ - will combine for a total +150% increase over base production.\ -"), _("\ -The pollution reduction of a Hydro, Nuclear, or Solar Plant is applied one more\ - time to cities with Mfg. Plants, effectively doubling the bonus percentage.\ -"), _("\ - This building lets you conscript one extra infantry/foot unit per turn.\ -") - -[building_nuclear_plant] -name = _("Nuclear Plant") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Nuclear Power", "Player" - "Building", "Factory", "City" - } -graphic = "b.nuclear_plant" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 120 -upkeep = 2 -sabotage = 100 -sound = "b_nuclear_plant" -sound_alt = "b_generic" -helptext = _("\ -For each Factory or Mfg. Plant in a city, a Nuclear Plant adds +25% to\ - base production, and reduces pollution from production by -25%.\ -"), _("\ -*If a city has either a Factory or Mfg. Plant, this makes a combined +75%\ - production bonus with a 25% decrease in pollution from production.\ -"), _("\ -*In a city with both a Factory and Mfg. Plant, this makes a combined +150%\ - production bonus with a 50% decrease in pollution from production.\ -"), _("\ -*Only one Power Plant, Hydro Plant, Nuclear Plant, or\ - Solar Plant can have an active effect in a city.\ -") - -[building_offshore_platform] -name = _("Offshore Platform") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Miniaturization", "Player" - "TerrainClass", "Oceanic", "Adjacent" - } -graphic = "b.offshore_platform" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 120 -upkeep = 3 -sabotage = 100 -sound = "b_offshore_platform" -sound_alt = "b_generic" -helptext = _("\ -Adds 1 extra production to all Oceanic tiles worked by a city. The\ - city needs to be coastal to build this improvement.\ -") - -[building_police_station] -name = _("Police Station") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Communism", "Player" - } -graphic = "b.police_station" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 50 -upkeep = 2 -sabotage = 100 -sound = "b_police_station" -sound_alt = "b_generic" -helptext = _("\ -Police Stations neutralize the unhappiness caused by two military units, and\ - prevent enemies from estalishing embassies without first agreeing to cease-fire\ - or peace.\ -"), _("\ - Diplomatic combat gets a bonus of ¼ of base odds. (At general base odds\ - of ½, odds of losing become: ½ - ⅛ = ⅜). All other hostile diplomatic\ - actions are 20% less effective (80% - 20% = 60%).\ -"), _("\ - Diplomats and Spies made in a city with Police Station gain +1 veteran level.\ -") - -[building_port_facility] -name = _("Port Facility") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Amphibious Warfare", "Player" - "TerrainClass", "Oceanic", "Adjacent" - } -graphic = "b.port_facility" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 3 -sabotage = 100 -sound = "b_port_facility" -sound_alt = "b_generic" -helptext = _("\ -Allows a city to build veteran sea units. Damaged sea units\ - which stay in town for one full turn without moving are completely\ - restored.\ -") - -[building_power_plant] -name = _("Power Plant") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Refining", "Player" - "Building", "Factory", "City" - } -graphic = "b.power_plant" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 130 -upkeep = 4 -sabotage = 100 -sound = "b_power_plant" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -For each Factory or Mfg. Plant in a city, a Power Plant adds +25% to\ - base production. The extra production may lead to more pollution.\ -"), _("\ -*If a city has either a Factory or Mfg. Plant, this makes a combined +75%\ - production bonus.\ -"), _("\ -*In a city with both a Factory and Mfg. Plant, this makes a combined +150%\ - production bonus.\ -"), _("\ -*Only one Power Plant, Hydro Plant, Nuclear Plant, or\ - Solar Plant can have an active effect in a city.\ -") - -[building_radar_tower] -name = _("Radar Tower") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Radar", "Player" - } -graphic = "b.radar_tower" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 55 -upkeep = 0 -sabotage = 100 -sound = "b_radar_tower" -sound_alt = "b_generic" -helptext = _("\ -Radar Towers use advanced technology to increase a city's vision to\ - approximately 6 tiles.\ -") - -[building_recycling_center] -name = _("Recycling Center") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Recycling", "Player" - } -graphic = "b.recycling_center" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 70 -upkeep = 1 -sabotage = 100 -sound = "b_recycling_center" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -A Recycling Center reduces the pollution\ - generated by production in a city by -66%. Supply of raw\ - recycled materials adds +2 producton to the city\ - center tile.\ -") - -[building_research_lab] -name = _("Research Lab") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Computers", "Player" - "Building", "University", "City" - } -graphic = "b.research_lab" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 120 -upkeep = 3 -sabotage = 100 -sound = "b_research_lab" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Adds +100% to base science output for each Library and University\ - in a city.\ -*In a city with a Library or University, the combined increase to science\ - output is +200%. \ -*In a city with a Library and a University, the combined increase\ - is +450%.\ -") - -[building_sam_battery] -name = _("SAM Battery") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Rocketry", "Player" - } -graphic = "b.sam_battery" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 70 -upkeep = 2 -sabotage = 100 -sound = "b_sam_battery" -sound_alt = "b_generic" -helptext = _("\ -Doubles the defense of all units inside the city when attacked by\ - aircraft (not including Helicopters or Missiles). Stealth aircraft\ - reduce the bonus to 25%.\ -") - -[building_sdi_defense] -name = _("SDI Defense") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Laser", "Player" - } -graphic = "b.sdi_defense" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 140 -upkeep = 4 -sabotage = 100 -sound = "b_sdi_defense" -sound_alt = "b_generic" -helptext = _("\ -Protects a city and its environs (up to 2 tiles away) from attacks\ - by Nuclear units. A Nuclear unit not owned by you or a teammate will\ - be shot down and have no effect if it tries to detonate in this area.\ - Nuclear units detonating outside this area will still affect all tiles\ - adjacent to ground zero, including tiles within the protected area.\ - SDI also doubles defense for units in the city against non-nuclear missiles.\ -") - -[building_sewer_system] -name = _("Sewer System") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Sanitation", "Player" - "Building", "Aqueduct", "City" - } -graphic = "b.sewer_system" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 80 -upkeep = 2 -sabotage = 100 -sound = "b_sewer_system" -sound_alt = "b_generic" -helptext = _("\ -Allows a city to grow larger than size 12. An Aqueduct is first\ - required for a city to grow larger than size 8.\ -") -; There is also an effect to reduce the chance of plague, but you have to -; enable illness in game.ruleset for that to be relevant. - -[building_solar_plant] -name = _("Solar Plant") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Environmentalism", "Player" - "Building", "Factory", "City" - } -graphic = "b.solar_plant" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 140 -upkeep = 4 -sabotage = 100 -sound = "b_solar_plant" -sound_alt = "b_generic" -helptext = _("\ -For each Factory or Mfg. Plant in a city, a Solar Plant adds +25% to\ - base production, and reduces pollution from production by -50%.\ -"), _("\ -*If a city has either a Factory or Mfg. Plant, this makes a combined +75%\ - production bonus with a 50% decrease in pollution from production.\ -"), _("\ -*In a city with both a Factory and Mfg. Plant, this makes a combined +150%\ - production bonus with 100% elimination of all pollution from production.\ -"), _("\ -*Only one Power Plant, Hydro Plant, Nuclear Plant, or\ - Solar Plant can have an active effect in a city.\ -") - -[building_space_component] -name = _("Space Component") -genus = "Special" -reqs = - { "type", "name", "range" - "Tech", "Plastics", "Player" - "Building", "Factory", "City" - } -graphic = "b.space_component" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 1000 -upkeep = 0 -sabotage = 100 -sound = "b_space_component" -sound_alt = "b_generic" -helptext = _("\ -Space Components can be differentiated into Propulsion and Fuel Components.\ - Each pair of them reduces spaceship travel time. You can build up to 8 pairs.\ -"), _("\ -Before you can build any spaceship parts, your nation must have built the\ - Apollo Program.\ -") - -[building_space_module] -name = _("Space Module") -genus = "Special" -reqs = - { "type", "name", "range" - "Tech", "Superconductors", "Player" - "Building", "Factory", "City" - } -graphic = "b.space_modules" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 2000 -upkeep = 0 -sabotage = 100 -sound = "b_space_module" -sound_alt = "b_generic" -helptext = _("\ -Space Modules are the most expensive parts of spaceships. There\ - are three different types of Space Module:\ -"), _("\ -- Habitation Module: provides living space for 10,000 people.\ -"), _("\ -- Life Support Module: provides food and water for the population of\ - one Habitation Module.\ -"), _("\ -- Solar Panels: provides the energy needed for any two of the other\ - Modules.\ -"), _("\ -You can build up to 4 Space Modules of each kind.\ -"), _("\ -Before you can build any spaceship parts, your nation must have built the\ - Apollo Program.\ -") - -[building_space_structural] -name = _("Space Structural") -genus = "Special" -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "Building", "Factory", "City" - } -graphic = "b.space_structural" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 500 -upkeep = 0 -sabotage = 100 -sound = "b_space_structural" -sound_alt = "b_generic" -helptext = _("\ -Space Structurals form the base of your spaceship. All other\ - spaceship parts need to be connected to Structurals in order to\ - function. You can build up to 32 Space Structurals.\ -"), _("\ -Before you can build any spaceship parts, your nation must have built the\ - Apollo Program.\ -") - -[building_stock_exchange] -name = _("Stock Exchange") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Economics", "Player" - "Building", "Bank", "City" - } -graphic = "b.stock_exchange" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 120 -upkeep = 3 -sabotage = 100 -sound = "b_stock_exchange" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -In cities with a Bank, a Stock Exchange boosts tax and luxury\ - production by an additional +50%.\ -"), _("\ -*A Bank and Stock Exchange together boost\ - tax and luxury production by +100%.\ -"), _("\ -*A Marketplace, Bank, and Stock Exchange together boost\ - tax and luxury production by +150%.\ -") - -[building_super_highways] -name = _("Super Highways") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Automobile", "Player" - } -graphic = "b.super_highways" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 120 -upkeep = 3 -sabotage = 100 -sound = "b_super_highways" -sound_alt = "b_generic" -helptext = _("\ -Increases trade by +50% on all tiles with roads, railroads, or MagLev (rounded down.) Improves transportation\ - logistics to an Airport, giving +1 airlift capacity to cities over size 12.\ -") - -[building_supermarket] -name = _("Supermarket") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Refrigeration", "Player" - } -graphic = "b.supermarket" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 80 -upkeep = 3 -sabotage = 100 -sound = "b_supermarket" -sound_alt = "b_generic" -helptext = _("\ -Increases the food resources by +100% on each farmland tile which\ - is being used around the city. An irrigable city centre tile receives a\ - +50% bonus immediately, but cannot receive a benefit from farmland.\ - Farmland tiles are those which have been irrigated a second time.\ -") - -[building_temple] -name = _("Temple") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Ceremonial Burial", "Player" - } -graphic = "b.temple" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 30 -upkeep = 1 -sabotage = 100 -sound = "b_temple" -sound_alt = "b_generic" -helptext = _("\ -Makes one unhappy citizen content. Mysticism doubles\ - this effect. With both Mysticism and the Oracle, +4 citizens are\ - made content. Does not affect citizens made unhappy by military\ - activity.\ -") - -[building_university] -name = _("University") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "University", "Player" - "Building", "Library", "City" - } -graphic = "b.university" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 120 -upkeep = 3 -sabotage = 100 -sound = "b_university" -sound_alt = "b_generic" -helptext = _("\ -Adds +150% to science output in a city with a Library.\ -"), _("\ -*A University and Library combine for a +250% increase\ - in science output.\ -") - -[building_palace] -name = _("Palace") -genus = "SmallWonder" -flags = "SaveSmallWonder" -reqs = - { "type", "name", "range" - "Tech", "Masonry", "Player" - } -graphic = "b.palace" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 70 -upkeep = 0 -sabotage = 0 -sound = "b_palace" -sound_alt = "b_generic" -helptext = _("\ -Makes a city the capital of your nation. Corruption in cities increases with distance\ - from the capital (except under Democracy or Communism.) A Palace reduces corruption\ - in your capital by roughly half.\ -"), _("\ - The cost of inciting a revolt decreases with distance from the\ - capital. The capital cannot be incited to revolt. The chance\ - of enemy agents defeating your agents or sabotaging buildings is\ - reduced by half.\ -"), _("\ - Losing your capital may result in your empire falling into civil\ - war. It also will destroy whatever Spaceship you might have.\ -"), _("\ - You can rebuild your Palace in another city. This may help if your\ - capital is in a dangerous location, or a new loaction would\ - reduce corruption.\ -"), _("\ - The Palace gives a production bonus of +75% under Despotism,\ - +50% under Monarchy, and +25% under Communism. Under Fundamentalism it gets\ - a +50% gold bonus.\ -"), _("\ - With Conscription, a Palace allows conscripting one extra qualifying unit per turn.\ -") - -[building_ecclesiastical_palace] -name = _("Ecclesiastical Palace") -genus = "SmallWonder" -flags = "SaveSmallWonder" -reqs = - { "type", "name", "range" - "Tech", "Mysticism", "Player" - } -graphic = "b.ecclesiastical_palace" -graphic_alt = "b.palace" -obsolete_by = - { "type", "name", "range" - } -build_cost = 100 -upkeep = 0 -sabotage = 0 -sound = "b_palace" -sound_alt = "b_generic" -helptext = _("\ -Makes a city the religious capital that acts as a second center of government.\ -"), _("\ - Cities experience lower corruption rates if they are closer to\ - a capital. In your religious capital, capital bonuses are rendered\ - in gold tithes rather than shield output. Under Fundamentalism,\ - the religious capital gets a +50% gold bonus from tithes.\ -"), _("\ - The cost of bribing and inciting increase when closer to a\ - capital. Capitals can not be incited to revolt, and the\ - chance of enemy agents defeating your agents or sabotaging\ - buildings is reduced by half.\ -"), _("\ - Under Fundamentalism, Fanatics produced in the city with this building\ - are inspired by fervorous faith to +1 higher veteran level.\ -"), _("\ - With Conscription, this building allows making one extra qualifying unit per turn.\ -") - -[building_agoge] -name = _("Agōgē of Sparta") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Bronze Working", "Player", TRUE, FALSE - "Building", "Agōgē of Sparta", "Player", FALSE, TRUE - } -graphic = "b.agoge" -graphic_alt = "b.sun_tzus_war_academy" -obsolete_by = - { "type", "name", "range" - "Tech", "Gunpowder", "Player" - } -build_cost = 100 -upkeep = 0 -sabotage = 0 -sound = "w_agoge" -sound_alt = "w_generic" -helptext = _("\ -The Agōgē creates a culture of extreme fitness, and is famous for\ - vigilant patrols, secret shortcut trails, and battle readiness.\ - All your foot soldiers get +⅓ move. Phalanx and Pikemen receive a\ - +50% attack bonus. Foot units in the city with the Agōgē begin\ - their turn with +1 move. Obsolete by: Gunpowder.\ -") - -[building_apollo_program] -name = _("Apollo Program") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Space Flight", "Player", TRUE, FALSE - "Building", "Apollo Program", "Player", FALSE, TRUE - } -graphic = "b.apollo_program" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 600 -upkeep = 0 -sabotage = 0 -sound = "w_apollo_program" -sound_alt = "w_generic" -helptext = _("\ -Allows you to start building spaceship parts in cities\ - with factories (assuming you have researched the necessary\ - technologies).\ -") - -[building_asmiths_trading_co] -name = _("A.Smith's Trading Co.") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Economics", "Player", TRUE, FALSE - "Building", "A.Smith's Trading Co.", "Player", FALSE, TRUE - } -graphic = "b.asmiths_trading_co" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 300 -upkeep = 0 -sabotage = 0 -sound = "w_asmiths_trading_co" -sound_alt = "w_generic" -helptext = _("\ -In all your cities, Buildings with upkeep of 1 gold become free.\ - This Wonder also allows three new specialists:\ -"), _(" - * Each Laborer produces 1 production point for their city per turn;\ -"), _(" - * Each Merchant produces 1 gold and 2 trade points per turn.\ - Trade is then distributed by your national tax rates.\ -"), _(" - * Each Farmer provides 1 food for their city per turn;\ -"), _(" - This wonder is never obsolete.\ -") - -[building_colossus] -name = _("Colossus") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Bronze Working", "Player", TRUE, FALSE - "Building", "Colossus", "Player", FALSE, TRUE - } -graphic = "b.colossus" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Automobile", "Player" - } -build_cost = 100 -upkeep = 0 -sabotage = 0 -sound = "w_colossus" -sound_alt = "w_generic" -helptext = _("\ -In the city where this wonder is built, +1 trade is added to every tile\ - that generates trade on its own.\ - Obsolete by: Automobile.\ -") - - -[building_copernicus_observatory] -name = _("Copernicus' Observatory") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Astronomy", "Player", TRUE, FALSE - "Building", "Copernicus' Observatory", "Player", FALSE, TRUE - } -graphic = "b.copernicus_observatory" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 100 -upkeep = 0 -sabotage = 0 -sound = "w_copernicus_observatory" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Boosts science production by 100% in the city where it is built.\ - That is, the base science level before any improvements were made,\ - is added to the total science. This wonder is never obsolete.\ -") - -[building_cure_for_cancer] -name = _("Cure For Cancer") -genus = "GreatWonder" -reqs = - { "type", "name", "range" - "Tech", "Genetic Engineering", "Player" - } -graphic = "b.cure_for_cancer" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 400 -upkeep = 0 -sabotage = 0 -sound = "w_cure_for_cancer" -sound_alt = "w_generic" -helptext = _("\ -This stunning technological achievement makes two content citizens\ - happy in all cities of all players who know Genetic\ - Engineering. In the event where there are not enough\ - content citizens to benefit from this effect, the wonder\ - applies to unhappy citizens (including those unhappy about military\ - activity), making each content then happy. This wonder is never obsolete.\ -") - -[building_eiffel_tower] -name = _("Eiffel Tower") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Steam Engine", "Player", TRUE, FALSE - "Building", "Eiffel Tower", "Player", FALSE, TRUE - } -graphic = "b.eiffel_tower" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 100 -upkeep = 0 -sabotage = 0 -sound = "w_eiffel_tower" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -All your cities support one unit free of\ - shield upkeep. This wonder is never obsolete.\ -") - -[building_genghis_khans_equestrian_school] -name = _("Genghis Khan's Equestrian School") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Horseback Riding", "Player", TRUE, FALSE - "Building", "Genghis Khan's Equestrian School", "Player", FALSE, TRUE - "Building", "Barracks", "City", TRUE, FALSE - } -graphic = "b.genghis_khans_equestrian_school" -graphic_alt = "b.sun_tzus_war_academy" -obsolete_by = - { "type", "name", "range" - "Tech", "Mobile Warfare", "Player" - } -build_cost = 150 -upkeep = 0 -sabotage = 0 -sound = "w_sun_tzus_war_academy" -sound_alt = "w_generic" -helptext = _("\ -Gives all mounted units +1 movement point, except for Cavalry. Must be\ - built in a city with Barracks I (not II). Obsolete by: Mobile Warfare.\ -") - -[building_gibraltar_fortress] -name = _("Gibraltar Fortress") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Metallurgy", "Player", TRUE, FALSE - "Building", "Gibraltar Fortress", "Player", FALSE, TRUE - "TerrainClass", "Oceanic", "Adjacent", TRUE, FALSE - } -graphic = "b.gibraltar_fortress" -graphic_alt = "b.great_wall" -obsolete_by = - { "type", "name", "range" - } -build_cost = 350 -upkeep = 0 -sabotage = 0 -sound = "w_gibraltar_fortress" -sound_alt = "w_generic" -helptext = _("\ -Gives a Coastal Defense in all your coastal cities. This has no effect\ - when Coastal Defense is already present. This Wonder must be built\ - in a coastal city. It does not become obsolete.\ -") - -[building_great_wall] -name = _("Great Wall") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Masonry", "Player", TRUE, FALSE - "Building", "Great Wall", "Player", FALSE, TRUE - } -graphic = "b.great_wall" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Machine Tools", "Player" - } -build_cost = 275 -upkeep = 0 -sabotage = 0 -sound = "w_great_wall" -sound_alt = "w_generic" -helptext = _("\ -The Great Wall protects your cities with City Walls. It takes three\ - turns after founding a city for the Great Wall to extend protection\ - to the new city. Also, the city must have been founded by you, or\ - assimilated to where less than a fifth of its citizens are foreign.\n\ -The Great Wall gives no extra effect when City Walls are already present.\ - However, regular City Walls still protect a city in which the Great\ - Wall has not yet activated.\nWarning! This Wonder is obsolete when\ - ANY nation in the world discovers Machine Tools. You may not know\ - which nations have Machine Tools. This makes it possible for you to\ - build an obsolete wonder!\ -") - -[building_hanging_gardens] -name = _("Hanging Gardens") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Pottery", "Player", TRUE, FALSE - "Building", "Hanging Gardens", "Player", FALSE, TRUE - } -graphic = "b.hanging_gardens" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Railroad", "Player" - } -build_cost = 200 -upkeep = 0 -sabotage = 0 -sound = "w_hanging_gardens" -sound_alt = "w_generic" -helptext = _("\ -Makes two content citizens happy in every city in your nation.\ - In the event where there are no content citizens to get the\ - effect of Hanging Gardens, the wonder applies to unhappy citizens\ - (including those unhappy about military activity), making each content\ - then happy. Gives +2 luxury in the city where it is built.\ - Obsolete by: Railroad.\ -") - -[building_hoover_dam] -name = _("Hoover Dam") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Electronics", "Player", TRUE, FALSE - "Extra", "River", "Adjacent", TRUE, FALSE - "Building", "Hoover Dam", "Player", FALSE, TRUE - } -graphic = "b.hoover_dam" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 600 -upkeep = 0 -sabotage = 0 -sound = "w_hoover_dam" -sound_alt = "w_generic" -helptext = _("\ -Works exactly as a Hydro Plant in all your cities.\ - (This reduces pollution and increases the effects\ - of Factories and Mfg. Plants.) This wonder is never obsolete.\ -") - -[building_isaac_newtons_college] -name = _("Isaac Newton's College") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Theory of Gravity", "Player", TRUE, FALSE - "Building", "Isaac Newton's College", "Player", FALSE, TRUE - } -graphic = "b.isaac_newtons_college" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 400 -upkeep = 0 -sabotage = 0 -sound = "w_isaac_newtons_college" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Adds 100% of base science production to every city in your\ - nation that has a University. That is, the boost that a\ - Library gives with no other science improvements is added\ - to the total science output in each city with a University.\ - This wonder is never obsolete.\ -") - -[building_jtids] -name = _("JTIDS") -genus = "SmallWonder" -reqs = - { "type", "name", "range" - "Tech", "Computers", "Player" - } -graphic = "b.seti_program" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 230 -upkeep = 0 -sabotage = 0 -sound = "w_seti_program" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -JTIDS (Joint Tactical Information Distribution System) is a radio\ - battlefield information network that provides real-time intel to forces\ - on the ground. Effectively, this Wonder modernizes the weaponry and info systems\ - for all the infantry in your army.\n\n\ -All foot soldiers and Mechanized Infantry are built with +1 vet level.\ - Odds of veteran promotion are increased.\ -") - -[building_js_bachs_cathedral] -name = _("J.S. Bach's Cathedral") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Theology", "Player", TRUE, FALSE - "Building", "J.S. Bach's Cathedral", "Player", FALSE, TRUE - } -graphic = "b.js_bachs_cathedral" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 300 -upkeep = 0 -sabotage = 0 -sound = "w_js_bachs_cathedral" -sound_alt = "w_generic" -helptext = _("\ -Makes two unhappy citizens content in every city in your nation\ - (including citizens unhappy about military activity).\ - This wonder is never obsolete.\ -") - -[building_king_richards_crusade] -name = _("King Richard's Crusade") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Engineering", "Player", TRUE, FALSE - "Building", "King Richard's Crusade", "Player", FALSE, TRUE - } -graphic = "b.king_richards_crusade" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Robotics", "Player" - } -build_cost = 150 -upkeep = 0 -sabotage = 0 -sound = "w_king_richards_crusade" -sound_alt = "w_generic" -helptext = _("\ -In the city where it is built, adds one extra shield resource on every\ - tile. Lets you build one extra Caravan or infantry unit per turn without\ - Conscription tech.\ - Obsolete by: Robotics.\ -") - -[building_leonardos_workshop] -name = _("Leonardo's Workshop") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Invention", "Player", TRUE, FALSE - "Building", "Leonardo's Workshop", "Player", FALSE, TRUE - } -graphic = "b.leonardos_workshop" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Automobile", "Player" - } -build_cost = 300 -upkeep = 0 -sabotage = 0 -sound = "w_leonardos_workshop" -sound_alt = "w_generic" -helptext = _("\ -Upgrades two obsolete units per game turn. Obsolete by:\ - Automobile.\ -") - -[building_lighthouse] -name = _("Lighthouse") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Map Making", "Player", TRUE, FALSE - "TerrainClass", "Oceanic", "Adjacent", TRUE, FALSE - "Building", "Lighthouse", "Player", FALSE, TRUE - } -graphic = "b.lighthouse" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Miniaturization", "Player" - } -build_cost = 170 -upkeep = 0 -sabotage = 0 -sound = "w_lighthouse" -sound_alt = "w_generic" -helptext = _("\ -Gives all your sea units 2 additional movement points,\ - while increasing their vision. Obsolete by: Miniaturization.\ -") - -[building_magellans_expedition] -name = _("Magellan's Expedition") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Navigation", "Player", TRUE, FALSE - "TerrainClass", "Oceanic", "Adjacent", TRUE, FALSE - "Building", "Magellan's Expedition", "Player", FALSE, TRUE - } -graphic = "b.magellans_expedition" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 400 -upkeep = 0 -sabotage = 0 -sound = "w_magellans_expedition" -sound_alt = "w_generic" -helptext = _("\ -All your new sea units built in cities in your nation start with an\ - additional veteran level (this is cumulative with any Port Facility.)\ - This wonder is never obsolete.\ -") - -[building_manhattan_project] -name = _("Manhattan Project") -genus = "GreatWonder" -reqs = - { "type", "name", "range" - "Tech", "Nuclear Fission", "Player" - } -graphic = "b.manhattan_project" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 600 -upkeep = 0 -sabotage = 0 -sound = "w_manhattan_project" -sound_alt = "w_generic" -;helptext is set in client/helpdata.c:helptext_wonder() -helptext = _("\ -Allows all nations who know Nuclear Fission to make nuclear weapons.\ - This Wonder does not become obsolete.\ -") - -[building_marco_polos_embassy] -name = _("Marco Polo's Embassy") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Trade", "Player", TRUE, FALSE - "Building", "Marco Polo's Embassy", "Player", FALSE, TRUE - } -graphic = "b.marco_polos_embassy" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 400 -upkeep = 0 -sabotage = 0 -sound = "w_marco_polos_embassy" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -This Wonder increases Trade, the very lifeblood of your tax income, science output,\ - and luxury for happiness. With this Wonder, Trade in each city increases by 40%.\ - This Wonder does not become obsolete.\ -") - -[building_michelangelos_chapel] -name = _("Michelangelo's Chapel") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Monotheism", "Player", TRUE, FALSE - "Building", "Michelangelo's Chapel", "Player", FALSE, TRUE - } -graphic = "b.michelangelos_chapel" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 300 -upkeep = 0 -sabotage = 0 -sound = "w_michelangelos_chapel" -sound_alt = "w_generic" -helptext = _("\ -This Wonder counts as a Cathedral in all cities which lack one.\ - That is, it makes 3 unhappy citizens content in each city,\ - but does not affect citizens unhappy about military activity.\ - (Theology increases the effect by +1. Communist government\ - reduces the effect by -1.)\ -"), _(" -In cities which already have a Cathedral, this Wonder enhances the\ - effects of the Cathedral, adding +1 happy citizen and +1 forced content.\ - This Wonder is never obsolete.\ -") - -;this is wonder #61 -[building_mausoleum_of_mausolos] -name = _("Mausoleum of Mausolos") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Ceremonial Burial", "Player", TRUE, FALSE - "Building", "Mausoleum of Mausolos", "Player", FALSE, TRUE - } -graphic = "b.mausoleum" -graphic_alt = "b.oracle" -obsolete_by = - { "type", "name", "range", "survives" - "Tech", "Radio", "Player", FALSE - } -build_cost = 200 -upkeep = 0 -sabotage = 0 -sound = "w_oracle" -sound_alt = "w_generic" -helptext = _("\ -With this wonder, City Walls and Courthouses each make one unhappy citizen\ - content in their city, unless that citizen is unhappy about military activity.\ - Also, no cities in the empire with this Wonder can be incited to revolt.\ - The discovery of Radio makes the Mausoleum obsolete.\ -") - -[building_oracle] -name = _("Oracle") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Mysticism", "Player", TRUE, FALSE - "Building", "Oracle", "Player", FALSE, TRUE - } -graphic = "b.oracle" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Theology", "Player" - } -build_cost = 100 -upkeep = 0 -sabotage = 0 -sound = "w_oracle" -sound_alt = "w_generic" -helptext = _("\ -Makes two of your unhappy citizens content in every city\ - with a Temple in your nation. Does not affect citizens made\ - unhappy by military activity. Obsolete by: Theology.\ -") - -[building_pyramids] -name = _("Pyramids") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Masonry", "Player", TRUE, FALSE - "Building", "Pyramids", "Player", FALSE, TRUE - } -graphic = "b.pyramids" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 160 -upkeep = 0 -sabotage = 0 -sound = "w_pyramids" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Every city will gain +25% to its food storage when population changes.\ - In addition, the city with the Pyramids can rapture when celebrating.\ - This Wonder does not become obsolete.\ -") - -[building_shakespeares_theatre] -name = _("Shakespeare's Theater") -rule_name = "Shakespeare's Theatre" ; en_GB used originally -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Medicine", "Player", TRUE, FALSE - "Building", "Shakespeare's Theatre", "Player", FALSE, TRUE - } -graphic = "b.shakespeares_theatre" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 200 -upkeep = 0 -sabotage = 0 -sound = "w_shakespeares_theatre" -sound_alt = "w_generic" -helptext = _("\ -Makes all angry and unhappy citizens content in the city where it\ - is located, including citizens unhappy about military activity.\ - This Wonder does not become obsolete.\ -") - -;this should be wonder #65 if we counted correctly and need it for the "statue hack" to determine if player can get gov. -[building_statue_of_liberty] -name = _("Statue of Liberty") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Democracy", "Player", TRUE, FALSE - "Building", "Statue of Liberty", "Player", FALSE, TRUE - } -graphic = "b.statue_of_liberty" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 400 -upkeep = 0 -sabotage = 0 -sound = "w_statue_of_liberty" -sound_alt = "w_generic" -helptext = _("\ -Allows you to instantly change government, including governments not\ - yet researched by your civilization, and without the transition period\ - of Anarchy. It also allows unprovoked declaration of war regardless of\ - any Senate or United Nations. Democracies cannot fall into Anarchy from\ - two turns of city disorder.\n\ - This Wonder does not become obsolete.\ -") - -[building_statue_of_zeus] -name = _("Statue of Zeus") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Polytheism", "Player", TRUE, FALSE - "Building", "Statue of Zeus", "Player", FALSE, TRUE - } -graphic = "b.statue_of_zeus" -graphic_alt = "b.oracle" -obsolete_by = - { "type", "name", "range", "survives" - } -build_cost = 100 -upkeep = 0 -sabotage = 0 -sound = "w_oracle" -sound_alt = "w_generic" -helptext = _("\ -The powerful Zeus gives order and organization to both city and nation.\ - In every city in your nation, this Wonder neutralizes the unhappiness\ - caused by one military unit. In the city the statue is located, it makes\ - one citizen happy and provides free upkeep to 4 units. Except for one permanent\ - happy citizen, the discovery of Tactics makes the Statue of Zeus obsolete.\ -") - -[building_supreme_court] -name = _("Supreme Court") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Literacy", "Player", TRUE, FALSE - "Building", "Supreme Court", "Player", FALSE, TRUE - } -graphic = "b.great_library" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 200 -upkeep = 0 -sabotage = 0 -sound = "w_great_library" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -With respect to corruption, incite protection, upkeep, and other bonuses, the\ - Supreme Court gives the same effect as an extra Courthouse in all your cities. By\ - itself, it gives no bonus against hostile diplomatic acts. However, owning the\ - Supreme Court enables each city to build a regional Homeland Security building\ - to acquire those additional bonuses. This Wonder is never obsolete.\ -") - -[building_sun_tzus_war_academy] -name = _("Sun Tzu's War Academy") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Feudalism", "Player", TRUE, FALSE - "Building", "Sun Tzu's War Academy", "Player", FALSE, TRUE - } -graphic = "b.sun_tzus_war_academy" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Mobile Warfare", "Player" - } -build_cost = 300 -upkeep = 0 -sabotage = 0 -sound = "w_sun_tzus_war_academy" -sound_alt = "w_generic" -helptext = _("\ -All your new military land units produced in cities in your nation\ - start with an additional veteran level (this is cumulative with any\ - Barracks in a city: with both, units are created as Hardened).\ - Obsolete by: Mobile Warfare.\ -") - -[building_temple_of_artemis] -name = _("Temple of Artemis") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Mysticism", "Player", TRUE, FALSE - "Building", "Temple", "City", TRUE, FALSE - "Building", "Temple of Artemis", "Player", FALSE, TRUE - - } -graphic = "b.temple_of_artemis" -graphic_alt = "b.oracle" -obsolete_by = - { "type", "name", "range", "survives" - "Tech", "Computers", "Player", FALSE - } -build_cost = 250 -upkeep = 0 -sabotage = 0 -sound = "w_oracle" -sound_alt = "w_generic" -helptext = _("\ -The bounteous Artemis bestows a multitudinous benefaction to all cities\ - with Temples: +1 production, +1 luxury, +1 science, and +1 gold.\ - Requires a Temple in the city where it will be built. (This wonder also\ - recovers the lost bonus shield in cities built on resources of +1 shield:\ - i.e. Grassland shield resource, Tundra fur.) Obsolete by: Computers.\ -") - -[building_teslas_laboratory] -name = _("Tesla's Laboratory") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Electricity", "Player", TRUE, FALSE - "Building", "Tesla's Laboratory", "Player", FALSE, TRUE - } -graphic = "b.teslas_laboratory" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 220 -upkeep = 0 -sabotage = 0 -sound = "w_teslas_laboratory" -sound_alt = "w_generic" -helptext = _("\ -Upgrades one obsolete unit per turn. Reduces price of unit upgrades by\ - 20%. This Wonder does not become obsolete.\ -") - -[building_internet] -name = _("The Internet") -genus = "SmallWonder" - reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Computers", "Player", TRUE, FALSE - "Building", "The Internet", "Player", FALSE, TRUE - } -graphic = "b.internet" -graphic_alt = "b.seti_program" -obsolete_by = - { "type", "name", "range" - } -build_cost = 600 -upkeep = 0 -sabotage = 0 -sound = "w_internet" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Adds to science production in all your cities with\ - a Research Lab, 100% of base output.\ - This Wonder does not become obsolete.\ -") - -[building_united_nations] -name = _("United Nations") -genus = "GreatWonder" -reqs = - { "type", "name", "range" - "Tech", "Communism", "Player" - } -graphic = "b.united_nations" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 600 -upkeep = 0 -sabotage = 0 -sound = "w_united_nations" -sound_alt = "w_generic" -helptext = _("\ -Creates a World Senate that may prevent declarations of war in some circumstances. If\ - any city in the world is in revolt for more than two turns, its whole government falls.\ - This Wonder does not become obsolete.\ -") - -[building_voyage_of_darwin] -name = _("Voyage of Darwin") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Railroad", "Player", TRUE, FALSE - "Building", "Voyage of Darwin", "Player", FALSE, TRUE - } -graphic = "b.darwins_voyage" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 200 -upkeep = 0 -sabotage = 0 -sound = "w_darwins_voyage" -sound_alt = "w_generic" -helptext = _("\ -In the city where this wonder is built, +1 trade is added to every tile\ - that generates trade on its own.\ - This Wonder is never obsolete.\ -") - -[building_womens_suffrage] -name = _("Women's Suffrage") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Industrialization", "Player", TRUE, FALSE - "Building", "Women's Suffrage", "Player", FALSE, TRUE - } -graphic = "b.womens_suffrage" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 300 -upkeep = 0 -sabotage = 0 -sound = "w_womens_suffrage" -sound_alt = "w_generic" -helptext = _("\ -In the capacity of reducing Military Unhappiness, this Wonder neutralizes the\ - unhappiness caused by two military units. This Wonder has no other\ - effect. It does not confer bonuses against hostile diplomats like a Police\ - Station. It gives no bonus to cities which already have a Police Station.\ - This Wonder does not become obsolete.\ -") - -[building_capitalization] -name = _("Coinage") -genus = "Special" -flags = "Gold" -reqs = - { "type", "name", "range" - - } -graphic = "b.capitalization" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 999 -upkeep = 0 -sabotage = 0 -helptext = _("\ -This is not a normal improvement. Setting production to Coinage converts\ - normal output into tax output (money, coins!)\ -") diff --git a/freeciv/freeciv/data/maptest/cities.ruleset b/freeciv/freeciv/data/maptest/cities.ruleset deleted file mode 100644 index 9a4ee3bf8..000000000 --- a/freeciv/freeciv/data/maptest/cities.ruleset +++ /dev/null @@ -1,186 +0,0 @@ -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -[datafile] -description="Cities data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -; /* <-- avoid gettext warnings -; -; A specialist is a city citizen who is not a tile worker. Usually the -; player can control what specialist each citizen is, so long as the -; requirements for that specialist are met. -; -; Below are the entries for the specialists, one per specialist type. -; The tag name (in [specialist_*]) doesn't matter so long as it's unique. -; For each specialist the following fields may be set: -; -; -; name = translatable (plural) name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; if -; not present, "name" is used for this purpose too. Since -; the name used in savegames must not change, if you want -; to rename an item after a ruleset has been released, you -; should set "rule_name" to the original value of "name". -; short_name = one-character "short name" used (for instance) in cityrep; -; should be first character/abbrevation of "name" -; graphic = tag specifying preferred graphic -; Different images based on citizen number are supported. -; If no such images indexed with citizen number are found, -; plain tag is used instead. -; graphic_alt = fallback graphic tag in case the specialist graphic isn't -; found. -; reqs = requirements to have the specialist pick (see -; effects.ruleset and README.effects for help on requirements) -; helptext = optional help text string; should escape all raw newlines -; so that xgettext parsing works -; -; */ <-- avoid gettext warnings - -[specialist_elvis] -name = _("Entertainers") -; (The original specialist names in the classic ruleset and derivatives were -; not designed to be user-visible.) -rule_name = "elvis" -short_name = _("?Elvis:E") -graphic = "specialist.entertainer" -reqs = - { "type", "name", "range" -; Nothing - } -helptext = _("\ -Each Entertainer produces two luxury points for their city per turn. \ -See the section on Happiness for the effects of luxury points.\ -") - -[specialist_scientist] -name = _("Scientists") -rule_name = "scientist" -short_name = _("?Scientist:S") -graphic = "specialist.scientist" -reqs = - { "type", "name", "range" -; Nothing - } -helptext = _("\ -Each Scientist adds three points to your empire's research output \ -per turn.\ -") - -[specialist_taxman] -name = _("Taxmen") -rule_name = "taxman" -short_name = _("?Taxman:T") -graphic = "specialist.taxman" -reqs = - { "type", "name", "range" -; Nothing - } -helptext = _("\ -Each tax collector produces three extra gold for your treasury \ -per turn.\ -") - -[specialist_worker] -name = _("Laborer") -; (The original specialist names in the classic ruleset and derivatives were -; not designed to be user-visible.) -rule_name = "worker" -short_name = _("?Laborer:L") -graphic = "specialist.worker" -reqs = - { "type", "name", "range" -; Nothing - } -helptext = _("\ -Each Laborer produces one production point for their city per turn. \ -") - -[specialist_merchant] -name = _("Merchant") -; (The original specialist names in the classic ruleset and derivatives were -; not designed to be user-visible.) -rule_name = "merchant" -short_name = _("?Merchant:M") -graphic = "specialist.merchant" -reqs = - { "type", "name", "range" -; Nothing - } -helptext = _("\ -Each Merchant produces two trade points for their city per turn.\ - Trade will then be partioned by your nation's tax rates into\ - Gold, Science, and Luxury.\ -") - -[specialist_farmer] -name = _("Farmer") -; (The original specialist names in the classic ruleset and derivatives were -; not designed to be user-visible.) -rule_name = "farmer" -short_name = _("?Farmer:F") -graphic = "specialist.farmer" -reqs = - { "type", "name", "range" -; Nothing - } -helptext = _("\ -Each Farmer provides one food for their city per turn. Yet each\ - citizen consumes 2 food/turn. Assigning a farmer may be useful\ - for a citizen who otherwise produces no food.\ -") - - - -[parameters] -add_to_size_limit = 40 ; cities >= this cannot be added to. -angry_citizens = TRUE ; set to FALSE to disable angry citizens -celebrate_size_limit = 3 ; cities >= can celebrate - -changable_tax = TRUE ; set to FALSE to disallow changing of tax rates -;forced_science = 0 ; set these fields when changeable_tax is turned off -;forced_luxury = 100 -;forced_gold = 0 - -vision_reveal_tiles = TRUE ; civ1 & 2 default FALSE - -pop_report_zeroes = 4 ; Population in reports in tens of thousands - -[citizen] -nationality = TRUE ; account for the nationality of the citizens -convert_speed = 1000 ; base probability 333/1000 -> once every 3 turns -partisans_pct = 0 ; percentage of own nationality to inspire partisans - ; if 0, original city owner information is used instead -conquest_convert_pct = 34 ; percentage which converts to the new nation - ; after a city was conquered. Applied separately for each - ; nationality present in the city, and number of - ; converted people rounded up - -[missing_unit_upkeep] -; Get rid of a unit the city is unable to pay the X upkeep of. -; X_protected - never get rid of a unit with any of the listed unit type -; flags. -; X_unit_act - have the unit perform the listed actions until success, -; death or the list ends. -; X_wipe - wipe the unit if it survived performing the actions listed -; above. - -food_protected = "EvacuateFirst" -; food_unit_act = -food_wipe = TRUE - -; TODO: Should missing gold upkeep really be able to kill units with the -; EvacuateFirst unit type flag? -; gold_protected = -; gold_unit_act = -gold_wipe = TRUE - -shield_protected = "EvacuateFirst" -shield_unit_act = "Help Wonder", "Recycle Unit", "Disband Unit" -shield_wipe = FALSE diff --git a/freeciv/freeciv/data/maptest/default.lua b/freeciv/freeciv/data/maptest/default.lua deleted file mode 100644 index 2145db452..000000000 --- a/freeciv/freeciv/data/maptest/default.lua +++ /dev/null @@ -1,203 +0,0 @@ --- When creating new ruleset, you should copy this file only if you --- need to override default one. Usually you should implement your --- own scripts in ruleset specific script.lua. This way maintaining --- ruleset is easier as you do not need to keep your own copy of --- default.lua updated when ever it changes in Freeciv distribution. - --- Get gold from entering a hut. -function _deflua_hut_get_gold(unit, gold) - local owner = unit.owner - - notify.event(owner, unit.tile, E.HUT_GOLD, PL_("You found %d gold.", - "You found %d gold.", gold), - gold) - owner:change_gold(gold) -end - --- Default if intended hut behavior wasn`t possible. -function _deflua_hut_consolation_prize(unit) - _deflua_hut_get_gold(unit, 2) -end - --- Get a tech from entering a hut. -function _deflua_hut_get_tech(unit) - local owner = unit.owner - local tech = owner:give_tech(nil, -1, false, "hut") - - if tech then - notify.event(owner, unit.tile, E.HUT_TECH, - _("You found %s in ancient scrolls of wisdom."), - tech:name_translation()) - notify.research(owner, false, E.TECH_GAIN, - -- /* TRANS: One player got tech for the whole team. */ - _("The %s found %s in ancient scrolls of wisdom for you."), - owner.nation:plural_translation(), - tech:name_translation()) - notify.research_embassies(owner, E.TECH_EMBASSY, - -- /* TRANS: first %s is leader or team name */ - _("%s has acquired %s from ancient scrolls of wisdom."), - owner:research_name_translation(), - tech:name_translation()) - return true - else - return false - end -end - --- Get a mercenary unit from entering a hut. -function _deflua_hut_get_mercenaries(unit) - local owner = unit.owner - local type = find.role_unit_type('HutTech', owner) - - if not type or not type:can_exist_at_tile(unit.tile) then - type = find.role_unit_type('Hut', nil) - if not type or not type:can_exist_at_tile(unit.tile) then - type = nil - end - end - - if type then - notify.event(owner, unit.tile, E.HUT_MERC, - _("A band of friendly mercenaries joins your cause.")) - owner:create_unit(unit.tile, type, 0, unit:get_homecity(), -1) - return true - else - return false - end -end - --- Get new city from hut, or settlers (nomads) if terrain is poor. -function _deflua_hut_get_city(unit) - local owner = unit.owner - local settlers = find.role_unit_type('Cities', owner) - - if unit:is_on_possible_city_tile() then - owner:create_city(unit.tile, "") - notify.event(owner, unit.tile, E.HUT_CITY, - _("You found a friendly city.")) - return true - else - if settlers and settlers:can_exist_at_tile(unit.tile) then - notify.event(owner, unit.tile, E.HUT_SETTLER, - _("Friendly nomads are impressed by you, and join you.")) - owner:create_unit(unit.tile, settlers, 0, unit:get_homecity(), -1) - return true - else - return false - end - end -end - --- Get barbarians from hut, unless close to a city, king enters, or --- barbarians are disabled --- Unit may die: returns true if unit is alive -function _deflua_hut_get_barbarians(unit) - local tile = unit.tile - local type = unit.utype - local owner = unit.owner - - if server.setting.get("barbarians") == "DISABLED" - or unit.tile:city_exists_within_max_city_map(true) - or type:has_flag('Gameloss') then - notify.event(owner, unit.tile, E.HUT_BARB_CITY_NEAR, - _("An abandoned village is here.")) - return true - end - - local alive = tile:unleash_barbarians() - if alive then - notify.event(owner, tile, E.HUT_BARB, - _("You have unleashed a horde of barbarians!")); - else - notify.event(owner, tile, E.HUT_BARB_KILLED, - _("Your %s has been killed by barbarians!"), - type:name_translation()); - end - return alive -end - --- Randomly choose a hut event -function _deflua_hut_enter_callback(unit) - local chance = random(0, 6) - local alive = true - - if chance == 0 or chance == 1 then - _deflua_hut_get_gold(unit, 1) - elseif chance == 2 or chance == 3 then - _deflua_hut_get_gold(unit, 2) - elseif chance == 4 then - _deflua_hut_get_gold(unit, 5) - elseif chance == 5 then - _deflua_hut_get_gold(unit, 10) - elseif chance == 6 then - if not _deflua_hut_get_mercenaries(unit) then - _deflua_hut_consolation_prize(unit) - end - elseif chance == 7 then - alive = _deflua_hut_get_barbarians(unit) - end - - -- continue processing if unit is alive - return (not alive) -end - -signal.connect("hut_enter", "_deflua_hut_enter_callback") - --- Informs that the tribe has run away seeing your plane -function _deflua_hut_frighten_callback(unit, extra) - local owner = unit.owner - notify.event(owner, unit.tile, E.HUT_BARB, - _("Your overflight frightens the tribe;" - .. " they scatter in terror.")) - return true -end -signal.connect("hut_frighten", "_deflua_hut_frighten_callback") - - ---[[ - Make partisans around conquered city - - if requirements to make partisans when a city is conquered is fulfilled - this routine makes a lot of partisans based on the city`s size. - To be candidate for partisans the following things must be satisfied: - 1) The loser of the city is the original owner. - 2) The Inspire_Partisans effect must be larger than zero. - - If these conditions are ever satisfied, the ruleset must have a unit - with the Partisan role. - - In the default ruleset, the requirements for inspiring partisans are: - a) Guerilla warfare must be known by atleast 1 player - b) The player must know about Communism and Gunpowder - c) The player must run either a democracy or a communist society. -]]-- - -function _deflua_make_partisans_callback(city, loser, winner, reason) - if reason ~= 'conquest' or city:inspire_partisans(loser) <= 0 then - return - end - - local partisans = random(0, 1 + (city.size + 1) / 2) + 1 - if partisans > 8 then - partisans = 8 - end - city.tile:place_partisans(loser, partisans, city:map_sq_radius()) - notify.event(loser, city.tile, E.CITY_LOST, - _("The loss of %s has inspired partisans!"), city.name) - notify.event(winner, city.tile, E.UNIT_WIN_ATT, - _("The loss of %s has inspired partisans!"), city.name) -end - -signal.connect("city_transferred", "_deflua_make_partisans_callback") - - --- Notify player about the fact that disaster had no effect if that is --- the case -function _deflua_harmless_disaster_message(disaster, city, had_internal_effect) - if not had_internal_effect then - notify.event(city.owner, city.tile, E.DISASTER, - _("We survived the disaster without serious damage.")) - end -end - -signal.connect("disaster_occurred", "_deflua_harmless_disaster_message") diff --git a/freeciv/freeciv/data/maptest/effects.ruleset b/freeciv/freeciv/data/maptest/effects.ruleset deleted file mode 100644 index f3bf5920d..000000000 --- a/freeciv/freeciv/data/maptest/effects.ruleset +++ /dev/null @@ -1,4848 +0,0 @@ -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes, -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -; Note that the freeciv AI may not cope well with anything more -; than minor changes. - -[datafile] -description="Avant-garde effects data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -; /* <-- avoid gettext warnings -; -; Effects -; -; type = What the effect does. Values of multiple active effects -; of the same type get summed for the total. -; See README.effects for list of possible types -; value = Value added for the effect type when this effect is active, -; i.e., all requirements are fulfilled -; multiplier = Name of the policy that gives a multiplier for effect's value -; reqs = Requirements for the effect to be active. -; See README.effects for help on requirements -; -; */ <-- avoid gettext warnings - -; Med. Bomber is a "Soft Field Unit." If non-aggressively deployed, 0 unhappy in Republic, -; 1 unhappy in Democracy: -[effect_medium_bomber_field_unit_minus_one] -type = "Peaceful_Field_Unit_Bonus" -value = 1 -reqs = - { "type", "name", "range", "present" - "UnitType", "Medium Bomber", "Local", TRUE - } - -; EXAMPLE OF HOW TO USE NEW Unit_Unhappy_Cost EFFECT, almost same -; as the above effect (don't use both!) -;[effect_medium_bomber_field_unit_minus_one] -;type = "Unit_Unhappy_Cost" -;value = -1 -;reqs = -; { "type", "name", "range", "present" -; "UnitType", "Medium Bomber", "Local", TRUE -; "UnitState","OnDomesticTile","Local", TRUE -; } - -; Combat_rounds for ancient ships -[effect_combat_rounds_riverships] -type = "Combat_Rounds" -value = 15 -reqs = - { "type", "name", "range", "present" - "UnitClass", "RiverShip", "Local", TRUE - "UnitType", "Frigate", "Local", FALSE - } -[effect_combat_rounds_trireme] -type = "Combat_Rounds" -value = 15 -reqs = - { "type", "name", "range", "present" - "UnitType", "Trireme", "Local", TRUE - } - -; Cheating AI effects are in separate file -*include "default/ai_effects.ruleset" - -[effect_unhappysize] -type = "City_Unhappy_Size" -value = 4 - -; Percent foreign citizens who are unhappy if at war -; with their original nation -[effect_angry_conquered] -type = "Enemy_Citizen_Unhappy_Pct" -value = 34 ; handles proper rounding for 1/3 - -; Barbarian effects -[effect_barb1] -type = "No_Diplomacy" -value = 1 -reqs = - { "type", "name", "range" - "NationGroup", "Barbarian", "Player" - } - -; Barbarian disappearance -[effect_barb_disappear] -type = "Retire_Pct" -value = 10 -reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", TRUE - "Age", "5", "Local", TRUE - "CityTile", "Center", "Local", FALSE - } - -; Lone Leader might escape on coast (33% chance) -; Complement of the two effects should be 0.9 * 0.66 = 0.594 -; (100 - 59) - 10 = 31 -[effect_leader_escape] -type = "Retire_Pct" -value = 31 -reqs = - { "type", "name", "range" - "UnitType", "Barbarian Leader", "Local" - "Age", "5", "Local" - "TerrainClass", "Oceanic", "Adjacent" - "MaxUnitsOnTile", "1", "Local" - } - -; Specialist output bonuses -[effect_elvis] -type = "Specialist_Output" -value = 2 -reqs = - { "type", "name", "range" - "Specialist", "elvis", "Local" - "OutputType", "luxury", "Local" - } - -[effect_scientist] -type = "Specialist_Output" -value = 3 -reqs = - { "type", "name", "range" - "Specialist", "scientist", "Local" - "OutputType", "science", "Local" - } - -[effect_taxman] -type = "Specialist_Output" -value = 3 -reqs = - { "type", "name", "range" - "Specialist", "taxman", "Local" - "OutputType", "gold", "Local" - } - -[effect_merchant] -type = "Specialist_Output" -value = 2 -reqs = - { "type", "name", "range" - "Specialist", "merchant", "Local" - "OutputType", "trade", "Local" - "Building", "A.Smith's Trading Co.", "Player" - } -[effect_merchant2] -type = "Specialist_Output" -value = 1 -reqs = - { "type", "name", "range" - "Specialist", "merchant", "Local" - "OutputType", "gold", "Local" - "Building", "A.Smith's Trading Co.", "Player" - } - -[effect_worker] -type = "Specialist_Output" -value = 1 -reqs = - { "type", "name", "range" - "Specialist", "worker", "Local" - "OutputType", "shield", "Local" - "Building", "A.Smith's Trading Co.", "Player" - } - -[effect_farmer] -type = "Specialist_Output" -value = 1 -reqs = - { "type", "name", "range" - "Specialist", "farmer", "Local" - "OutputType", "food", "Local" - "Building", "A.Smith's Trading Co.", "Player" - } - -; Vision benefit from mountains (for every land unit) -[effect_mountains_vision] -type = "Unit_Vision_Radius_Sq" -value = 5 -reqs = - { "type", "name", "range" - "Terrain", "Mountains", "Local" - "UnitClass", "Land", "Local" - } -[effect_mountains_vision_1] -type = "Unit_Vision_Radius_Sq" -value = 5 -reqs = - { "type", "name", "range" - "Terrain", "Mountains", "Local" - "UnitClass", "LandAirSea", "Local" - } -[effect_mountains_vision_2] -type = "Unit_Vision_Radius_Sq" -value = 5 -reqs = - { "type", "name", "range" - "Terrain", "Mountains", "Local" - "UnitClass", "LandNoKill", "Local" - } - -; basic free tech upkeep -[effect_upkeep_tech_free] -type = "Tech_Upkeep_Free" -value = 3 - -; ******************* TRADE ******************** - -[effect_trade_routes] -type = "Max_Trade_Routes" -value = 1 - -;pow(2, value/1000) -> Base = 50% -[effect_base_trade_revenue_reduce] -type = "Trade_Revenue_Bonus" -value = -1000 - -;Total = 25% -[effect_railroad_trade_revenue_reduce] -type = "Trade_Revenue_Bonus" -value = -1000 -reqs = - { "type", "name", "range" - "Tech", "Railroad", "Player" - } -;Total = 25% -[effect_flight_trade_revenue_reduce] -type = "Trade_Revenue_Bonus" -value = -1000 -reqs = - { "type", "name", "range" - "Tech", "Flight", "Player" - } - - -;If you don't acquire ongoing trade revenue from a trade route, -;a DECREASE in one-time bonus made NO SENSE AT ALL, -;Now it's a one time bonus with potentially slight ROI. -[effect_enter_marketplace_bonus_increase] -type = "Trade_Revenue_Bonus" -value = 2000 -reqs = - { "type", "name", "range" - "Action", "Enter Marketplace", "Local" - } -;TO-DO: pay x more than gold value of vessel entering marketplace, with ROI being somewhat inferior to most -;investments but hinting toward same order of magnitude. - -[effect_establish_traderoute_bonus] -type = "Trade_Revenue_Bonus" -value = -2400 -;this -2400 should go into base effect above -;then reqs action = "Establish Trade Route" can be an increase to counter both the -2400 subtracted above then to -;further tune upward any one time bonus to what it needs to be. reqs can look at unit type also to compensate higher cost -;of making certain units, since route-creating units now vary from 20 shields to 50 shields in cost. - -; ***************************** SEA UNIT REPAIR ******************************* -; Sea units have crews which pro-actively repair damage regardless of movement. -; This is almost comparable to land unit healing. Sea units being "Use once -; and dispose", and/or unable to re-enter action for literally centuries, had -; created issues in realism, playability, and balance. 8% repair/turn effect: -; 10hp units: +0 hp/turn 20hp units: +1 hp/turn -; 30hp units: +2 hp/turn 40hp units: +3 hp/turn -;[effect_sea_hp_regen] -;type = "Unit_Recover_Pct" -;value = 8 -;reqs = -; { "type", "name", "range" -; "UnitClass", "Sea", "Local" -; } -;[effect_sub_hp_regen] -;type = "Unit_Recover_Pct" -;value = 8 -;reqs = -; { "type", "name", "range" -; "UnitClass", "Submarine", "Local" -; } -;[effect_rivership_hp_regen] -;type = "Unit_Recover_Pct" -;value = 8 -;reqs = -; { "type", "name", "range" -; "UnitClass", "RiverShip", "Local" -; } -; The effects above replace the effects below after Unit_Recover_Pct is up -; The effects below substitute if Unit_Recover_Pct is missing from server -[effect_sea_hp_regen] -type = "Unit_Recover" ;30 hp units get + 2 -value = 2 -reqs = - { "type", "name", "range" - "UnitClass", "Sea", "Local" - } -[effect_sub_hp_regen] ;30 hp units get + 2 -type = "Unit_Recover" -value = 2 -reqs = - { "type", "name", "range" - "UnitClass", "Submarine", "Local" - } -[effect_rivership_hp_regen] ;20 hp units get + 1 -type = "Unit_Recover" -value = 1 -reqs = - { "type", "name", "range", "present" - "UnitClass", "RiverShip", "Local", TRUE - "UnitType", "Boat", "Local", FALSE ;have to exclude all 10hp ships - "UnitType", "Galley", "Local", FALSE - "UnitType", "War Galley", "Local", FALSE - "UnitType", "Longboat", "Local", FALSE - "UnitType", "Caravel", "Local", FALSE - "UnitType", "Ram Ship", "Local", FALSE - } -[effect_battleship_hp_regen] ;40 hp units get + 3 -type = "Unit_Recover" -value = 1 ; 2+1=3 -reqs = - { "type", "name", "range" - "UnitType", "Battleship", "Local" - } -[effect_carrier_hp_regen] ;40 hp units get + 3 -type = "Unit_Recover" -value = 1 ; 2+1=3 -reqs = - { "type", "name", "range" - "UnitType", "Carrier", "Local" - } - -; *********************************** BASES ******************************* - -; **** FORT ***** -[effect_fort_defense] -type = "Defend_Bonus" -value = 33 -reqs = - { "type", "name", "range", "present" - "Extra", "Fort", "Local", TRUE - "Extra", "Fortress", "Local", FALSE ; Fortress calculated separately even if a fort is under it. - "Extra", "Naval Base", "Local", FALSE ; Naval base calculated separately even if a fort is under it. - "UnitClass", "Helicopter", "Local", FALSE ; ... these attackers do not activate Fort defense bonus - "UnitClass", "Air", "Local", FALSE ; ... " " " " " " " " - "UnitClass", "AirPillage", "Local", FALSE ; ... " " " " " " " " - "UnitClass", "AirProtect", "Local", FALSE ; ... " " " " " " " " - "UnitType", "Armor", "Local", FALSE ; ... " " " " " " " " - "UnitType", "Armor II", "Local", FALSE ; ... " " " " " " " " - } -; Fort HP regen -[effect_fort_hp_regen] -type = "HP_Regen" -value = 10 -reqs = - { "type", "name", "range" - "Extra", "Fort", "Tile" - "UnitClass", "Land", "Local" - } -[effect_fort_hp_regen_1] -type = "HP_Regen" -value = 10 -reqs = - { "type", "name", "range" - "Extra", "Fort", "Tile" - "UnitClass", "LandAirSea", "Local" - } -[effect_fort_hp_regen_2] -type = "HP_Regen" -value = 10 -reqs = - { "type", "name", "range" - "Extra", "Fort", "Tile" - "UnitClass", "LandNoKill", "Local" - } - -; **** FORTRESS/NAVAL BASE *************************************************** - -; Adjust the 1.67xdefense_bonus in terrain.ruleset for some attackers: -; **************************************************************************** -[effect_nonfortbuster_vs_fortress] -type = "Defend_Bonus" -value = 20 ;increase 1.67x to 2x except when defending against FortBuster types. -;note: 1.20*1.67=2.0 (this bonus is multiplied after terrain defense_bonus was multiplied) -reqs = - { "type", "name", "range", "present" - "Extra", "Fortress", "Local", TRUE - "UnitFlag", "FortBuster", "Local", FALSE - "UnitFlag", "FortressBuster", "Local", FALSE - "UnitFlag", "AirAttacker", "Local", FALSE - } -[effect_nonfortbuster_vs_navalbase] ;same as above but for naval base -type = "Defend_Bonus" -value = 20 ;increase 1.67x to 2x except when defending against FortBuster types. -;note: 1.20*1.67=2.0 (this bonus is multiplied after terrain defense_bonus was multiplied) -reqs = - { "type", "name", "range", "present" - "Extra", "Naval Base", "Local", TRUE - "UnitFlag", "FortBuster", "Local", FALSE - "UnitFlag", "FortressBuster", "Local", FALSE - "UnitFlag", "AirAttacker", "Local", FALSE - } -[effect_fortressbuster_fortress] -type = "Attack_Bonus" -value = 67 ;Cancel defender's 1.67x with attacker getting 1.67x -reqs = - { "type", "name", "range", "present" - "Extra", "Fortress", "Local", TRUE - "UnitFlag", "FortressBuster", "Local", TRUE - } -[effect_fortressbuster_navalbase] -type = "Attack_Bonus" -value = 67 ;Cancel defender's 1.67x with attacker getting 1.67x -reqs = - { "type", "name", "range", "present" - "Extra", "Naval Base", "Local", TRUE - "UnitFlag", "FortressBuster", "Local", TRUE - } - -; ****** ^^ defense_bonus_correctives ^^ ************************************* - -; Vision benefit from fortress watchtowers -[effect_fortress_vision] -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "tile" - "Tech", "Invention", "Player" - "UnitClass", "Land", "Local" - } -[effect_fortress_vision_1] ;Marines, AAA -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "tile" - "Tech", "Invention", "Player" - "UnitClass", "LandAirSea", "Local" - } -[effect_fortress_vision_2] ;Knights -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "tile" - "Tech", "Invention", "Player" - "UnitClass", "LandNoKill", "Local" - } - -; Fortress HP regen -[effect_fortress_hp_regen] -; Cumulative with fort: 10+15=25 -type = "HP_Regen" -value = 15 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "Tile" - "UnitClass", "Land", "Local" - } -[effect_fortress_hp_regen_1] -type = "HP_Regen" -value = 15 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "Tile" - "UnitClass", "LandAirSea", "Local" - } -[effect_fortress_hp_regen_2] -type = "HP_Regen" -value = 15 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "Tile" - "UnitClass", "LandNoKill", "Local" - } -[effect_fortress_hp_regen_3] -type = "HP_Regen" -value = 25 ;25 because not cumulative with Fort -reqs = - { "type", "name", "range" - "Extra", "Fortress", "Tile" - "UnitClass", "Helicopter", "Local" - } - -[effect_airbase_hp_regen] -type = "HP_Regen" -value = 25 -reqs = - { "type", "name", "range" - "Extra", "Airbase", "Tile" - "UnitClass", "Helicopter", "Local" - } -[effect_airbase_hp_regen1] -type = "HP_Regen" -value = 15 -reqs = - { "type", "name", "range" - "Extra", "Airbase", "Tile" - "UnitClass", "AirProtect", "Local" - } -[effect_airbase_hp_regen2] -type = "HP_Regen" -value = 15 -reqs = - { "type", "name", "range" - "Extra", "Airbase", "Tile" - "UnitClass", "Air", "Local" - } -[effect_airbase_hp_regen3] -type = "HP_Regen" -value = 15 -reqs = - { "type", "name", "range" - "Extra", "Airbase", "Tile" - "UnitClass", "AirPillage", "Local" - } - -; ****************** NAVAL BASE ****************************** -[effect_navbase_vision] -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "tile" - "Tech", "Invention", "Player" - "UnitClass", "Trireme", "Local" - } -[effect_navbase_vision1] -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "tile" - "Tech", "Invention", "Player" - "UnitClass", "RiverShip", "Local" - } -[effect_navbase_vision2] -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "tile" - "Tech", "Invention", "Player" - "UnitClass", "Sea", "Local" - } -; Naval Base HP regen -[effect_navbase_hp_regen] -type = "HP_Regen" -value = 20 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "Tile" - "UnitClass", "Sea", "Local" - } -[effect_navbase_hp_regen_1] -type = "HP_Regen" -value = 20 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "Tile" - "UnitClass", "RiverShip", "Local" - } -[effect_navbase_hp_regen_2] -type = "HP_Regen" -value = 20 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "Tile" - "UnitClass", "Trireme", "Local" - } -[effect_navbase_hp_regen_3] -type = "HP_Regen" -value = 20 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "Tile" - "UnitClass", "Submarine", "Local" - } -; *********************************************************** - -; Base vision range - radius of vision is sqrt(5) = 2.24 -[effect_city_vision] -type = "City_Vision_Radius_Sq" -value = 5 - -;PERCENTAGE CHANCE OF STEALING A TECH WHEN CONQUERING A CITY. -[effect_conquest_tech] -type = "Conquest_Tech_Pct" -value = 100 - -;Freshly fueled full hp helicopters get +1 move per turn -[effect_fresh_helicopter] -type = "Move_Bonus" -value = 9 -reqs = - { "type", "name", "range" - "UnitClass", "Helicopter", "Local" - "Extra", "Airbase", "Local" - } -;Freshly fueled full hp helicopters get +1 move per turn -[effect_fresh_helicopter2] -type = "Move_Bonus" -value = 9 -reqs = - { "type", "name", "range" - "UnitClass", "Helicopter", "Local" - "CityTile", "Center", "Local" - } - -; Nuclear power gives +1 moves to sea units (+2 under 2x) -[effect_nuclear_powered_boats] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Tech", "Nuclear Power", "Player" - "UnitClass", "Sea", "Local" - } -; Nuclear power gives +1 moves to sea units (+2 under 2x) -[effect_nuclear_powered_subs] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Tech", "Nuclear Power", "Player" - "UnitClass", "Submarine", "Local" - } - -[effect_anarchy_upkeep] -type = "Upkeep_Free" -value = 99 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } -[effect_upkeep_communism] -type = "Upkeep_Free" -value = 1 -reqs = - { "type", "name", "range", "quiet" - "Gov", "Communism", "Player", TRUE - } - -[effect_anarchy_upkeep_tech_free] -type = "Tech_Upkeep_Free" -value = 9999 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_republic] -type = "Make_Content_Mil" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_corruption_anarchy0] -type = "Output_Waste" -value = 25 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_anarchy1] -type = "Output_Waste_By_Distance" -value = 200 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_despotism0] -type = "Output_Waste" -value = 37 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_despotism1] -type = "Output_Waste_By_Distance" -value = 400 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_monarchy0] -type = "Output_Waste" -value = 15 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_monarchy1] -type = "Output_Waste_By_Distance" -value = 200 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_communism0] -type = "Output_Waste" -value = 20 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_republic0] -type = "Output_Waste" -value = 15 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_republic1] -type = "Output_Waste_By_Distance" -value = 200 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - "OutputType", "Trade", "Local" - } - -[effect_base_unit_upkeep] -type = "Upkeep_Factor" -value = 1 - -[effect_republic_unit_upkeep] -type = "Upkeep_Factor" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - "OutputType", "Food", "Local" - } - -[effect_democracy_unit_upkeep] -type = "Upkeep_Factor" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - "OutputType", "Food", "Local" - } - -[effect_republic_unit_unhappiness] -type = "Unhappy_Factor" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_democracy_unit_unhappiness] -type = "Unhappy_Factor" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_upkeep_free_units_anarchy] -type = "Unit_Upkeep_Free_Per_City" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - "OutputType", "Shield", "Local" - } - -[effect_upkeep_free_units_despotism] -type = "Unit_Upkeep_Free_Per_City" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - "OutputType", "Shield", "Local" - } - -[effect_upkeep_free_units_monarchy] -type = "Unit_Upkeep_Free_Per_City" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - "OutputType", "Shield", "Local" - } - -[effect_upkeep_free_units_communism] -type = "Unit_Upkeep_Free_Per_City" -value = 4 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - "OutputType", "Shield", "Local" - } - -[effect_civil_war_0] -type = "Civil_War_Chance" -value = 90 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_civil_war_1] -type = "Civil_War_Chance" -value = 80 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_civil_war_2] -type = "Civil_War_Chance" -value = 70 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -[effect_civil_war_3] -type = "Civil_War_Chance" -value = 50 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - } - -[effect_civil_war_4] -type = "Civil_War_Chance" -value = 40 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_civil_war_5] -type = "Civil_War_Chance" -value = 30 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_empire_size_base_0] -type = "Empire_Size_Base" -value = 9 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_empire_size_base_1] -type = "Empire_Size_Base" -value = 10 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_empire_size_base_2] -type = "Empire_Size_Base" -value = 11 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -[effect_empire_size_base_3] -type = "Empire_Size_Base" -value = 12 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - } - -[effect_empire_size_base_4] -type = "Empire_Size_Base" -value = 13 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_empire_size_base_5] -type = "Empire_Size_Base" -value = 14 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_empire_size_base_6] -type = "Empire_Size_Base" -value = 14 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_empire_size_step_0] -type = "Empire_Size_Step" -value = 6 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_empire_size_step_1] -type = "Empire_Size_Step" -value = 10 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_empire_size_step_2] -type = "Empire_Size_Step" -value = 12 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -; Empire_Size_Step disabled for Communism - -[effect_empire_size_step_3] -type = "Empire_Size_Step" -value = 14 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_empire_size_step_4] -type = "Empire_Size_Step" -value = 16 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_empire_size_step_5] -type = "Empire_Size_Step" -value = 15 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_max_rates_0] -type = "Max_Rates" -value = 100 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_max_rates_1] -type = "Max_Rates" -value = 60 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_max_rates_2] -type = "Max_Rates" -value = 70 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -[effect_max_rates_3] -type = "Max_Rates" -value = 80 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - } - -[effect_max_rates_4] -type = "Max_Rates" -value = 80 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_max_rates_5] -type = "Max_Rates" -value = 100 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_martial_law_each_0] -type = "Martial_Law_Each" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_martial_law_each_1] -type = "Martial_Law_Each" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_martial_law_each_2] -type = "Martial_Law_Each" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -[effect_martial_law_each_3] -type = "Martial_Law_Each" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - } - -[effect_martial_law_each_4] -type = "Martial_Law_Each" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_martial_law_max_0] -type = "Martial_Law_Max" -value = 100 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_martial_law_max_1] -type = "Martial_Law_Max" -value = 100 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_martial_law_max_2] -type = "Martial_Law_Max" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -[effect_martial_law_max_3] -type = "Martial_Law_Max" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - } - -[effect_martial_law_max_4] -type = "Martial_Law_Max" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_rapture_grow_0] -type = "Rapture_Grow" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_rapture_grow_1] -type = "Rapture_Grow" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_communism_0] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - "UnitFlag", "Diplomat", "Local" - } - -[effect_gov_tile_bonus_0] -type = "Output_Penalty_Tile" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_gov_tile_bonus_1] -type = "Output_Penalty_Tile" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_gov_tile_bonus_2] -type = "Output_Inc_Tile_Celebrate" -value = 1 -reqs = - { "type", "name", "range" - "OutputType", "Trade", "Local" - "Gov", "Monarchy", "Player" - } - -[effect_gov_tile_bonus_3] -type = "Output_Inc_Tile_Celebrate" -value = 1 -reqs = - { "type", "name", "range" - "OutputType", "Trade", "Local" - "Gov", "Communism", "Player" - } - -[effect_gov_tile_bonus_4] -type = "Output_Inc_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - "OutputType", "Trade", "Local" - } - -[effect_gov_tile_bonus_5] -type = "Output_Inc_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_gov_tile_bonus_6] -type = "Output_Inc_Tile_Celebrate" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Trade", "Local" - } - -[effect_revolution_0] -type = "Revolution_Unhappiness" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_senate_0] -type = "Has_Senate" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_senate_1] -type = "Has_Senate" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_partisans_communism] -type = "Inspire_Partisans" -value = 1 -reqs = - { "type", "name", "range", "present" - "Gov", "Communism", "Player", TRUE - "Tech", "Communism", "Player", TRUE - "Tech", "Gunpowder", "Player", TRUE - "Tech", "Guerilla Warfare", "World", TRUE - "NationGroup", "Barbarian", "Player", FALSE - } - -[effect_partisans_democracy] -type = "Inspire_Partisans" -value = 1 -reqs = - { "type", "name", "range", "present" - "Gov", "Democracy", "Player", TRUE - "Tech", "Communism", "Player", TRUE - "Tech", "Gunpowder", "Player", TRUE - "Tech", "Guerilla Warfare", "World", TRUE - "NationGroup", "Barbarian", "Player", FALSE - } - -[effect_airport_2] -type = "Airlift" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Airport", "City" - } - -[effect_airport_v0] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Airport", "City", TRUE - "UnitClass", "Air", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_airport_v1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Airport", "City", TRUE - "UnitClass", "AirProtect", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_airport_v2] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Airport", "City", TRUE - "UnitClass", "AirPillage", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_airport_v3] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Airport", "City", TRUE - "UnitClass", "Helicopter", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_airport_v4] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Airport", "City", TRUE - "UnitClass", "Missile", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } - -[effect_airport_h1] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Airport", "City" - "UnitClass", "Air", "Local" - } -[effect_airport_h2] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Airport", "City" - "UnitClass", "AirProtect", "Local" - } -[effect_airport_h3] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Airport", "City" - "UnitClass", "AirPillage", "Local" - } -[effect_airport_h4] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Airport", "City" - "UnitClass", "Helicopter", "Local" - } - -; Base max city size of 8 -[effect_aqueduct_size] -type = "Size_Adj" -value = 8 - -[effect_aqueduct] -type = "Size_Adj" -value = 4 -reqs = - { "type", "name", "range" - "Building", "Aqueduct", "City" - } - -[effect_aqueduct_health] -type = "Health_Pct" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Aqueduct", "City" - } - -[effect_bank] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - "Building", "Bank", "City" - "OutputType", "Gold", "Local" - } - -[effect_bank_1] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - "Building", "Bank", "City" - "OutputType", "Luxury", "Local" - } - -[effect_barracks] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "Land", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_a] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "Land", "Local", TRUE - } -[effect_barracks_b] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE ; might be resting in allied city with Barracks I - } -[effect_barracks_c] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - } - -[effect_barracks_ii] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "Land", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_ii_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_ii_2] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_ii_a] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "Land", "Local", TRUE - } -[effect_barracks_ii_b] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - } -[effect_barracks_ii_c] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - } - -[effect_barracks_iii] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "Land", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_iii_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_iii_2] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_iii_a] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Barracks III", "City" - "UnitClass", "Land", "Local" - } -[effect_barracks_iii_b] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - } -[effect_barracks_iii_c] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - } - -;prolongs time-window relevance of amphibious invasions later in game -[effect_triple_training_marines] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "Building", "Port Facility", "City", TRUE - "Building", "Airport", "City", TRUE - "UnitType", "Marines", "Local", TRUE - } - -;--- STANDARD CATHEDRAL sans Michelangelo ------------------------ -[effect_cathedral] -type = "Make_Content" -value = 3 -reqs = - { "type", "name", "range", "present" - "Building", "Cathedral", "City", TRUE - "Building", "Michelangelo's Chapel", "Player", FALSE - } -[effect_cathedral_1] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range", "present" - "Tech", "Theology", "Player", TRUE - "Building", "Cathedral", "City", TRUE - "Building", "Michelangelo's Chapel", "Player", FALSE - } -[effect_cathedral_2] -type = "Make_Content" -value = -1 -reqs = - { "type", "name", "range", "present" - "Gov", "Communism", "Player", TRUE - "Building", "Cathedral", "City", TRUE - "Building", "Michelangelo's Chapel", "Player", FALSE - } -;--- ENHANCED CATHEDRAL with Michelangelo: *** -[effect_cathedral_ma] -type = "Make_Happy" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Cathedral", "City", TRUE - "Building", "Michelangelo's Chapel", "Player", TRUE - } -[effect_cathedral_ma2] -type = "Force_Content" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Cathedral", "City", TRUE - "Building", "Michelangelo's Chapel", "Player", TRUE - } -;------------------------------------------------------------ -[effect_city_walls] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "UnitClass", "Land", "Local", TRUE -; "Building", "Great Wall", "Player", FALSE - "UnitType", "Howitzer", "Local", FALSE - } -[effect_city_walls_0] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "UnitClass", "Helicopter", "Local", TRUE -; "Building", "Great Wall", "Player", FALSE - } -[effect_city_walls_0a] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE -; "Building", "Great Wall", "Player", FALSE - "UnitType", "Howitzer", "Local", FALSE - } -[effect_city_walls_0b] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE -; "Building", "Great Wall", "Player", FALSE - "UnitType", "Howitzer", "Local", FALSE - } -[effect_city_walls_1] -type = "Unit_No_Lose_Pop" -value = 1 -reqs = - { "type", "name", "range" - "Building", "City Walls", "City" - } -[effect_city_walls_visible] -type = "Visible_Walls" -value = 1 -reqs = - { "type", "name", "range" - "Building", "City Walls", "City" - } - -[effect_coastal_defense] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Coastal Defense", "City" - "UnitClass", "Sea", "Local" - } -[effect_coastal_defense_1] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Coastal Defense", "City" - "UnitClass", "RiverShip", "Local" - } -[effect_coastal_defense_2] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Coastal Defense", "City" - "UnitClass", "Submarine", "Local" - } -[effect_coastal_defense_trireme] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Coastal Defense", "City" - "UnitClass", "Trireme", "Local" - } - -[effect_gibraltar_fortress] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Gibraltar Fortress", "Player", TRUE - "Building", "Coastal Defense", "City", FALSE - "UnitClass", "Sea", "Local" - } -[effect_gibraltar_fortress_1] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Gibraltar Fortress", "Player", TRUE - "Building", "Coastal Defense", "City", FALSE - "UnitClass", "RiverShip", "Local" - } -[effect_gibraltar_fortress_2] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Gibraltar Fortress", "Player", TRUE - "Building", "Coastal Defense", "City", FALSE - "UnitClass", "Submarine", "Local" - } -[effect_gibraltar_fortress_trireme] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Gibraltar Fortress", "Player", TRUE - "Building", "Coastal Defense", "City", FALSE - "UnitClass", "Trireme", "Local" - } - -[effect_amphitheatre] -type = "Make_Content" -value = 3 -reqs = - { "type", "name", "range" - "Building", "Amphitheatre", "City" - } - -[effect_amphitheatre_1] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Tech", "Electricity", "Player" - "Building", "Amphitheatre", "City" - } - -; BECAUSE OF ROUNDING, AVERAGE EFFECT OF 50 ENDS UP BEING 41%, WHEREAS 60 YIELDS ABOUT 53% WHICH IS CLOSER TO ADVERTISED -[effect_courthouse_corruption1] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "OutputType", "Trade", "Local", TRUE - } -[effect_courthouse_corruption2] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "OutputType", "shield", "local", TRUE - } -[effect_courthouse_tile_corruption] ; Removes output penalties (Despotism/Anarchy) for cities with courthouses -type = "Output_Penalty_Tile" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Courthouse", "City", TRUE - } -[effect_courthouse_democracy] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - "Building", "Courthouse", "City" - } -[effect_courthouse_incite_cost_occupied] -type = "Incite_Cost_Pct" -value = 300 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "MaxUnitsOnTile", "0", "Local", FALSE - } -[effect_courthouse_incite_cost_empty] -type = "Incite_Cost_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - "Building", "Courthouse", "City", TRUE - } -[effect_courthouse_upkeep] ; Law and order provides +1 upkeep -type = "Unit_Upkeep_Free_Per_City" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Courthouse", "City", TRUE - "OutputType", "Shield", "Local" - } -[effect_courthouse_spy_resistance] -type = "Spy_Resistant" -value = 25 ;25% reduction of 50% base chance is 12.5% bonus. 50%-12.5%=37.5% success rate - ; No protection= 1/2, HL = 3/8, CH+HL = 1/4, CH+HL+PS = 1/8 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - } -[effect_courthouse_hostile_diplomat0] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Steal Tech", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_1] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Steal Tech Escape Expected", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_2] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Targeted Steal Tech", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_3] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_4] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Sabotage City", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_5] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Sabotage City Escape", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_6] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Targeted Sabotage City", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_7] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Targeted Sabotage City Escape", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_8] -type = "Action_Odds_Pct" -value = -25 ;40 minus 25%*80 = 20% -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Steal Maps Escape", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_9] -type = "Action_Odds_Pct" -value = -25 ;40 minus 25%*80 = 20% -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Steal Maps", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_10] -type = "Action_Odds_Pct" -value = -25 ;40 minus 25%*80 = 20% -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Poison City Escape", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_11] -type = "Action_Odds_Pct" -value = -25 ;40 minus 25%*80 = 20% -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Incite City", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_12] -type = "Action_Odds_Pct" -value = -25 ;40 minus 25%*80 = 20% -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Incite City Escape", "Local", TRUE - } - -[effect_diplomat_defense_fortress] -type = "Spy_Resistant" -value = 25 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "Local" - } - -[effect_incite_cost_empty] -type = "Incite_Cost_Pct" -value = -50 -reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - "Building", "Courthouse", "City", FALSE - "Building", "Supreme Court", "Player", FALSE - } - -[effect_factory] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Factory", "City" - "OutputType", "Shield", "Local" - } - -[effect_fusion_reactor] -type = "Output_Bonus" -value = 75 -reqs = - { "type", "name", "range" - "Building", "Fusion Reactor", "City" - "OutputType", "Shield", "Local" - } -[effect_fusion_reactor1] -type = "Unit_Upkeep_Free_Per_City" -value = 5 -reqs = - { "type", "name", "range" - "Building", "Fusion Reactor", "City", TRUE - "OutputType", "Shield", "Local" - } -[effect_fusion_reactor2] -type = "City_Build_Slots" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Fusion Reactor", "City", TRUE - } - -[effect_granary] -type = "Growth_Food" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Granary", "City" - } - -[effect_harbour] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "TerrainClass", "Oceanic", "Local" - "Building", "Harbour", "City" - "OutputType", "Food", "Local" - } - -[effect_hydro_plant] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Hydro Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_hydro_plant_1] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Hydro Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_hydro_plant_2] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Hydro Plant", "City", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_hydro_plant_3] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Hydro Plant", "City", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_library] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Library", "City" - "OutputType", "Science", "Local" - } - -[effect_marketplace] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - "OutputType", "Gold", "Local" - } - -[effect_marketplace_1] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - "OutputType", "Luxury", "Local" - } - -; No population pollution until certain techs researched -[effect_pollu_pop_base] -type = "Pollu_Pop_Pct_2" -value = -100 - -[effect_pollu_pop_automobile] -type = "Pollu_Pop_Pct_2" -value = 25 -reqs = - { "type", "name", "range" - "Tech", "Automobile", "Player" - } - -[effect_pollu_pop_industrialization] -type = "Pollu_Pop_Pct_2" -value = 25 -reqs = - { "type", "name", "range" - "Tech", "Industrialization", "Player" - } - -[effect_pollu_pop_mass_production] -type = "Pollu_Pop_Pct_2" -value = 25 -reqs = - { "type", "name", "range" - "Tech", "Mass Production", "Player" - } - -[effect_pollu_pop_plastics] -type = "Pollu_Pop_Pct_2" -value = 25 -reqs = - { "type", "name", "range" - "Tech", "Plastics", "Player" - } - -[effect_mass_transit] -type = "Pollu_Pop_Pct" -value = -100 -reqs = - { "type", "name", "range" - "Building", "Mass Transit", "City" - } -; Increased citizen mobility and ticket revenues increase city base trade by +2 -[effect_mass_transit_1] -type = "Output_Add_Tile" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Mass Transit", "City" - "CityTile", "Center", "Local" - "OutputType", "Trade", "Local" - } - -[effect_mfg_plant] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Mfg. Plant", "City" - "OutputType", "Shield", "Local" - } - -[effect_nuclear_plant] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Nuclear Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_nuclear_plant_1] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Nuclear Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_nuclear_plant_2] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Nuclear Plant", "City", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_nuclear_plant_3] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Nuclear Plant", "City", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_offshore_platform] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "TerrainClass", "Oceanic", "Local" - "Building", "Offshore Platform", "City" - "OutputType", "Shield", "Local" - } - -[effect_palace] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - "OutputType", "Trade", "Local" - } -[effect_palace_1] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - "OutputType", "shield", "local" - } -[effect_palace_2] -type = "Spy_Resistant" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - } -[effect_palace_2_sabotage] -type = "Building_Saboteur_Resistant" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - } -[effect_palace_3] -type = "Capital_City" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - } -[effect_palace_gov_center] -type = "Gov_Center" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - } -[effect_palace_5] -type = "Output_Bonus" -value = 75 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - "Building", "Palace", "City" - "OutputType", "Shield", "Local" - } - -[effect_palace_6] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - "Building", "Palace", "City" - "OutputType", "Shield", "Local" - } -[effect_palace_6a] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - "Building", "Palace", "City" - "OutputType", "Shield", "Local" - } -[effect_palace_7] -type = "Make_Happy" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - } -[effect_palace_fundamentalism] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range", "present", "quiet" - "Gov", "Fundamentalism", "Player", TRUE, TRUE - "Building", "Palace", "City", TRUE, FALSE - "OutputType", "Gold", "Local", TRUE, FALSE - } - -[effect_ecclesiastical_palace] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "OutputType", "Trade", "Local", TRUE - "Building", "Palace", "City", FALSE - } -[effect_ecclesiastical_palace_1] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "OutputType", "Shield", "local", TRUE - "Building", "Palace", "City", FALSE - } -[effect_ecclesiastical_palace_2] -type = "Spy_Resistant" -value = 50 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "Building", "Palace", "City", FALSE - } -[effect_ecclestiastical_palace_3] -type = "Make_Happy" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Ecclesiastical Palace", "City" - } -[effect_ecclesiastical_palace_4] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "UnitType", "Fanatics", "Local", TRUE - } -[effect_ecclesiastical_palace_gov_center] -type = "Gov_Center" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "Building", "Palace", "City", FALSE - } -[effect_ecclesiastical_palace_despotism] -type = "Output_Bonus" -value = 75 -reqs = - { "type", "name", "range", "present", "quiet" - "Gov", "Despotism", "Player", TRUE, TRUE - "Building", "Ecclesiastical Palace", "City", TRUE, FALSE - "OutputType", "Gold", "Local", TRUE, FALSE -; "Building", "Palace", "City", FALSE, FALSE - } -[effect_ecclesiastical_palace_monarchy] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range", "present", "quiet" - "Gov", "Monarchy", "Player", TRUE, TRUE - "Building", "Ecclesiastical Palace", "City", TRUE, FALSE - "OutputType", "Gold", "Local", TRUE, FALSE -; "Building", "Palace", "City", FALSE, FALSE - } -[effect_ecclesiastical_palace_fundamentalism] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range", "present", "quiet" - "Gov", "Fundamentalism", "Player", TRUE, TRUE - "Building", "Ecclesiastical Palace", "City", TRUE, FALSE - "OutputType", "Gold", "Local", TRUE, FALSE - ; "Building", "Palace", "City", FALSE, FALSE - } -[effect_ecclesiastical_palace_communism] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present", "quiet" - "Gov", "Communism", "Player", TRUE, TRUE - "Building", "Ecclesiastical Palace", "City", TRUE, FALSE - "OutputType", "Gold", "Local", TRUE, FALSE - ; "Building", "Palace", "City", FALSE, FALSE - } - -[effect_ecclesiastical_palace_culture] -type = "History" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "Building", "Palace", "City", FALSE - } -[effect_ecclesiastical_palace_2_sabotage] -type = "Building_Saboteur_Resistant" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Ecclesiastical Palace", "City" - } - -[effect_police_station] -type = "Make_Content_Mil" -value = 2 -reqs = - { "type", "name", "range", "present" - "Gov", "Republic", "Player", TRUE - "Building", "Police Station", "City", TRUE - "Building", "Women's Suffrage", "Player", FALSE - } -[effect_police_station_1] -type = "Make_Content_Mil" -value = 4 -reqs = - { "type", "name", "range", "present" - "Gov", "Democracy", "Player", TRUE - "Building", "Police Station", "City", TRUE - "Building", "Women's Suffrage", "Player", FALSE - } -[effect_police_station_vet_diplo] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "UnitFlag", "NoVeteran", "Local", FALSE - "UnitFlag", "Diplomat", "Local", TRUE - } -[effect_police_station_spy_resistant] -type = "Spy_Resistant" -value = 25 ; 25% of 50% = -12.5% 4/8-1/8 = 3/8 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - } -[effect_police_station_hostile_diplomat_0] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Steal Tech", "Local", TRUE - } -[effect_police_station_hostile_diplomat_1] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Steal Tech Escape Expected", "Local", TRUE - } -[effect_police_station_hostile_diplomat_2] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Targeted Steal Tech", "Local", TRUE - } -[effect_police_station_hostile_diplomat_3] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE - } -[effect_police_station_hostile_diplomat_4] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Sabotage City", "Local", TRUE - } -[effect_police_station_hostile_diplomat_5] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Sabotage City Escape", "Local", TRUE - } -[effect_police_station_hostile_diplomat_6] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Targeted Sabotage City", "Local", TRUE - } -[effect_police_station_hostile_diplomat_7] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Targeted Sabotage City Escape", "Local", TRUE - } -[effect_police_station_hostile_diplomat_8] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Steal Maps Escape", "Local", TRUE - } -[effect_police_station_hostile_diplomat_9] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Steal Maps", "Local", TRUE - } -[effect_police_station_hostile_diplomat_10] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Poison City Escape", "Local", TRUE - } -[effect_police_station_hostile_diplomat_11] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Incite City", "Local", TRUE - } -[effect_police_station_hostile_diplomat_12] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Incite City Escape", "Local", TRUE - } - -[effect_port_facility] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Port Facility", "City", TRUE - "UnitClass", "Sea", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_port_facility_a] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Port Facility", "City", TRUE - "UnitClass", "RiverShip", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_port_facility_b] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Port Facility", "City", TRUE - "UnitClass", "Submarine", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_port_facility_1] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Port Facility", "City" - "UnitClass", "Sea", "Local" - } -[effect_port_facility_1a] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Port Facility", "City" - "UnitClass", "RiverShip", "Local" - } -[effect_port_facility_1b] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Port Facility", "City" - "UnitClass", "Submarine", "Local" - } -[effect_port_facility_trireme] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Port Facility", "City", TRUE - "UnitClass", "Trireme", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_port_facility_trireme_1] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Port Facility", "City" - "UnitClass", "Trireme", "Local" - } - -[effect_power_plant] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Power Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Hydro Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_power_plant_1] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Power Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Hydro Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_recycling_center] -type = "Pollu_Prod_Pct" -value = -66 -reqs = - { "type", "name", "range", "present" - "Building", "Recycling Center", "City", TRUE -; A Solar Plant can give a stronger effect than a Recycling Center, in which -; case we want only the Solar Plant's effect (not the addition of the two). - "Building", "Solar Plant", "City", FALSE - } - -; Nasty special cases: where a Solar Plant is present but its effect is less -; than that of a Recycling Center, top up so that the net effect is that of the -; Recycling Center. -; (This would be so much easier if effects could be combined by functions -; other than addition...) - -; Factory and no Mfg. Plant: Solar Plant saves 50%, less than 66%; add 16% -[effect_recycling_center_1] -type = "Pollu_Prod_Pct" -value = -16 -reqs = - { "type", "name", "range", "present" - "Building", "Recycling Center", "City", TRUE - "Building", "Solar Plant", "City", TRUE - "Building", "Factory", "City", TRUE - "Building", "Mfg. Plant", "City", FALSE - } - -; Mfg. Plant and no Factory: Solar Plant saves 50%, less than 66%; add 16% -[effect_recycling_center_2] -type = "Pollu_Prod_Pct" -value = -16 -reqs = - { "type", "name", "range", "present" - "Building", "Recycling Center", "City", TRUE - "Building", "Solar Plant", "City", TRUE - "Building", "Mfg. Plant", "City", TRUE - "Building", "Factory", "City", FALSE - } - -; Neither Factory nor Mfg. Plant: Solar Plant saves 0%; add 66% -[effect_recycling_center_3] -type = "Pollu_Prod_Pct" -value = -66 -reqs = - { "type", "name", "range", "present" - "Building", "Recycling Center", "City", TRUE - "Building", "Solar Plant", "City", TRUE - "Building", "Factory", "City", FALSE - "Building", "Mfg. Plant", "City", FALSE - } - -; Raw materials generated from Recycling add +2 base shields to city production. -[effect_recycling_center_4] -type = "Output_Add_Tile" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Recycling Center", "City" - "CityTile", "Center", "Local" - "OutputType", "Shield", "Local" - } - - -[effect_research_lab] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Library", "City" - "Building", "Research Lab", "City" - "OutputType", "Science", "Local" - } - -[effect_research_lab_1] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "University", "City" - "Building", "Research Lab", "City" - "OutputType", "Science", "Local" - } - -[effect_sam_battery] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "SAM Battery", "City", TRUE - "UnitClass", "Air", "Local", TRUE - "UnitType", "Stealth Bomber", "Local", FALSE - } -[effect_sam_battery_1] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "SAM Battery", "City", TRUE - "UnitClass", "AirProtect", "Local", TRUE - "UnitType", "Stealth Fighter", "Local", FALSE - } -[effect_sam_battery_2] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "SAM Battery", "City" - "UnitClass", "AirPillage", "Local" - } -[effect_sam_battery_stealth_bomber] -type = "Defend_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "SAM Battery", "City", TRUE - "UnitType", "Stealth Bomber", "Local", TRUE - } -[effect_sam_battery_stealth_fighter] -type = "Defend_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "SAM Battery", "City", TRUE - "UnitType", "Stealth Fighter", "Local", TRUE - } - -[effect_sdi_defense] -type = "Nuke_Proof" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "SDI Defense", "City", TRUE - "DiplRel", "Foreign", "Local", TRUE - "DiplRel", "Team", "Local", FALSE - } - -[effect_sdi_defense_1] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "SDI Defense", "City" - "UnitClass", "Missile", "Local" - } - -[effect_sewer_system] -type = "Size_Unlimit" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Aqueduct", "City" - "Building", "Sewer System", "City" - } - -[effect_sewer_system_health] -type = "Health_Pct" -value = 30 -reqs = - { "type", "name", "range" - "Building", "Aqueduct", "City" - "Building", "Sewer System", "City" - } - -[effect_solar_plant] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range" - "Building", "Factory", "City" - "Building", "Solar Plant", "City" - "OutputType", "Shield", "Local" - } - -[effect_solar_plant_1] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range" - "Building", "Mfg. Plant", "City" - "Building", "Solar Plant", "City" - "OutputType", "Shield", "Local" - } - -[effect_solar_plant_2] -type = "Pollu_Prod_Pct" -value = -50 -reqs = - { "type", "name", "range" - "Building", "Factory", "City" - "Building", "Solar Plant", "City" - } - -[effect_solar_plant_3] -type = "Pollu_Prod_Pct" -value = -50 -reqs = - { "type", "name", "range" - "Building", "Mfg. Plant", "City" - "Building", "Solar Plant", "City" - } - -[effect_space_component] -type = "SS_Component" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Space Component", "City" - } - -[effect_space_module] -type = "SS_Module" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Space Module", "City" - } - -[effect_space_structural] -type = "SS_Structural" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Space Structural", "City" - } - -;Timeline is already way behind and too slow, REMOVE: -;[effect_plastics_slowdown] -;type = "Slow_Down_Timeline" -;value = 1 -;reqs = -; { "type", "name", "range", "survives" -; "Tech", "Plastics", "World", TRUE -; } - -;[effect_superconductor_slowdown] -;type = "Slow_Down_Timeline" -;value = 1 -;reqs = -; { "type", "name", "range", "survives" -; "Tech", "Superconductors", "World", TRUE -; } -;1 year per turn ensures spaceship travel time calibrated. -;this can be removed after game.info.spacerace bug of not changing -;timeline gets fixed in server. -[effect_spaceflight_slowdown] -type = "Turn_Years" -value = 1 -reqs = - { "type", "name", "range", "survives" - "Tech", "Space Flight", "World", TRUE - } - -[effect_stock_exchange] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Bank", "City" - "Building", "Stock Exchange", "City" - "OutputType", "Gold", "Local" - } - -[effect_stock_exchange_1] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Bank", "City" - "Building", "Stock Exchange", "City" - "OutputType", "Luxury", "Local" - } - -[effect_super_highways] -type = "Output_Per_Tile" -value = 50 -reqs = - { "type", "name", "range" - "Extra", "Road", "Local" - "Building", "Super Highways", "City" - "OutputType", "Trade", "Local" - } - -; Super Highways increase logistical efficiency to -; get more use out of an airport in size 12+ city. -[effect_super_highways_airlift_facilitation] -type = "Airlift" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Super Highways", "City" - "Building", "Airport", "City" - "Building", "Sewer System", "City" - } - -[effect_mine] -type = "Mining_Pct" -value = 100 -reqs = - { "type", "name", "range" - "Extra", "Mine", "Local" - } - -[effect_oil_well] -type = "Mining_Pct" -value = 100 -reqs = - { "type", "name", "range" - "Extra", "Oil Well", "Local" - } - -[effect_irrigation] -type = "Irrigation_Pct" -value = 100 -reqs = - { "type", "name", "range" - "Extra", "Irrigation", "Local" - } -; Desert with river (and no Oasis) gets 1 extra food from irrigation (total 2) -; ("Nile floods" effect) -[effect_irrigation_2] -type = "Irrigation_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "Terrain", "Desert", "Local", TRUE - "Extra", "River", "Local", TRUE - "Extra", "Oasis", "Local", FALSE - "Extra", "Irrigation", "Local", TRUE - } -; ...same for city centers -[effect_irrigation_3] -type = "Irrigation_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "Terrain", "Desert", "Local", TRUE - "Extra", "River", "Local", TRUE - "Extra", "Oasis", "Local", FALSE - "CityTile", "Center", "Local", TRUE -; "Extra", "Irrigation", "Local", FALSE - "TerrainAlter", "CanIrrigate", "Local", TRUE - "Extra", "Mine", "Local", FALSE - "Extra", "Oil Well", "Local", FALSE - } - -[effect_irrigation_center] -type = "Irrigation_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "CityTile", "Center", "Local", TRUE - "Extra", "Irrigation", "Local", FALSE - "TerrainAlter", "CanIrrigate", "Local", TRUE - "Extra", "Mine", "Local", FALSE - "Extra", "Oil Well", "Local", FALSE - } - -[effect_supermarket] -type = "Output_Per_Tile" -value = 100 -reqs = - { "type", "name", "range" - "Extra", "Farmland", "Local" - "Building", "Supermarket", "City" - "OutputType", "Food", "Local" - } - -[effect_supermarket_center] -type = "Output_Per_Tile" -value = 50 -reqs = - { "type", "name", "range", "present" - "CityTile", "Center", "Local", TRUE - "Extra", "Farmland", "Local", FALSE - "TerrainAlter", "CanIrrigate", "Local", TRUE - "Building", "Supermarket", "City", TRUE - "OutputType", "Food", "Local", TRUE - "Extra", "Mine", "Local", FALSE - "Extra", "Oil Well", "Local", FALSE - } - -[effect_temple] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - } - -[effect_temple_1] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Tech", "Mysticism", "Player" - "Building", "Temple", "City" - } - -[effect_university] -type = "Output_Bonus" -value = 150 -reqs = - { "type", "name", "range" - "Building", "Library", "City" - "Building", "University", "City" - "OutputType", "Science", "Local" - } - -[effect_apollo_program] -type = "Enable_Space" -value = 1 -reqs = - { "type", "name", "range", "survives" - "Building", "Apollo Program", "Player", TRUE - } - -[effect_telegraph_border_vision] -type = "Border_Vision" -value = 1 -reqs = - { "type", "name", "range" - "Tech", "Electricity", "Player" - } - - ; Air+Sea+LandAirSea CLASS units REQUIRE PHYSICS so their BONUS is in their stats to AVOID more [effect_] entries. -[effect_physics_vision] -type = "Unit_Vision_Radius_Sq" -value = 4 -reqs = - { "type", "name", "range" - "Tech", "Physics", "Player" - "UnitClass", "Land", "Local" - } -[effect_physics_vision_1] -type = "Unit_Vision_Radius_Sq" -value = 4 -reqs = - { "type", "name", "range" - "Tech", "Physics", "Player" - "UnitClass", "LandNoKill", "Local" - } -[effect_physics_vision_2] -type = "Unit_Vision_Radius_Sq" -value = 4 -reqs = - { "type", "name", "range" - "Tech", "Physics", "Player" - "UnitClass", "Trireme", "Local" - } -[effect_physics_vision_3] -type = "Unit_Vision_Radius_Sq" -value = 4 -reqs = - { "type", "name", "range" - "Tech", "Physics", "Player" - "UnitClass", "RiverShip", "Local" - } - -[effect_satellite_vision] ;Vision benefit from satellite communication to land units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "Land", "Local" - } -[effect_satellite_vision_1] ;Vision benefit from satellite communication to land units (Marines) -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "LandAirSea", "Local" - } -[effect_satellite_vision_2] ;Vision benefit from satellite communication to sea units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "Sea", "Local" - } -[effect_satellite_vision_2a] ;Vision benefit from satellite communication to sea units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "Submarine", "Local" - } -[effect_satellite_vision_3] ;Vision benefit from satellite communication to sea units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "Air", "Local" - } -[effect_satellite_vision_3a] ;Vision benefit from satellite communication to sea units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "AirProtect", "Local" - } -[effect_satellite_vision_4] ;Vision benefit from satellite communication to cities -type = "City_Vision_Radius_Sq" -value = 36 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - } -[effect_radar_vision] -type = "City_Vision_Radius_Sq" -value = 50 ;7 cardinal, 5 diagonal -reqs = - { "type", "name", "range" - "Tech", "Radar", "Player" - "Building", "Radar Tower", "City" - } -;[effect_radar_vision2] -;type = "Unit_Vision_Radius_Sq" -;value = 16 -;reqs = -; { "type", "name", "range", "present" -; "Extra", "Airbase", "tile", TRUE -; "Tech", "Radar", "Player", TRUE -; "MaxUnitsOnTile", "0", "Local", FALSE ;occupied base -; } - -[effect_agoge_move_bonus_1] -type = "Move_Bonus" -value = 3 -reqs = - { "type", "name", "range", "present" - "Building", "Agōgē of Sparta", "Player", TRUE - "UnitFlag", "FootSoldier", "Local", TRUE - } -[effect_agoge_move_bonus_2] -type = "Move_Bonus" -value = 6 ; 3/9 + 6/9 = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Agōgē of Sparta", "City", TRUE - "UnitFlag", "FootSoldier", "Local", TRUE - } -[effect_agoge_phalanx] -type = "Attack_Bonus" -value = 50 -reqs = - { "type", "name", "range", "present" - "Building", "Agōgē of Sparta", "Player", TRUE - "UnitType", "Phalanx", "Local", TRUE - } -[effect_agoge_pikemen] -type = "Attack_Bonus" -value = 50 -reqs = - { "type", "name", "range", "present" - "Building", "Agōgē of Sparta", "Player", TRUE - "UnitType", "Pikemen", "Local", TRUE - } - -[effect_asmiths_trading_co] -type = "Upkeep_Free" -value = 1 -reqs = - { "type", "name", "range" - "Building", "A.Smith's Trading Co.", "Player" - } - -[effect_colossus] -type = "Output_Inc_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Colossus", "City" - "OutputType", "Trade", "Local" - } - -[effect_copernicus_observatory] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Copernicus' Observatory", "City" - "OutputType", "Science", "Local" - } - -[effect_cure_for_cancer] -type = "Make_Happy" -value = 2 - reqs = - { "type", "name", "range" - "Building", "Cure For Cancer", "World" - "Tech", "Genetic Engineering", "Player" - } - -; HACK: there's all kinds of nasty hard-coded stuff to this Wonder, so it had to be -; given a different name (Voyage of Darwin) to avoid potential messyness -[effect_darwins_voyage] -type = "Output_Inc_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Voyage of Darwin", "City" - "OutputType", "Trade", "Local" - } - -[effect_eiffel_tower] -type = "Unit_Upkeep_Free_Per_City" -value = 1 - reqs = - { "type", "name", "range" - "Building", "Eiffel Tower", "Player" - "OutputType", "Shield", "Local" - } - -[effect_supreme_court_corruption1] -type = "Output_Waste_Pct" -value = 60 - reqs = - { "type", "name", "range" - "Building", "Supreme Court", "Player" - "OutputType", "Trade", "Local" - } -[effect_supreme_court_corruption2] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player", TRUE - "OutputType", "Shield", "local", TRUE - } -[effect_supreme_court_democracy] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - "Building", "Supreme Court", "Player" - } -[effect_supreme_court_incite_occupied] -type = "Incite_Cost_Pct" -value = 300 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player", TRUE - "MaxUnitsOnTile", "0", "Local", FALSE - } -[effect_supreme_court_incite_empty] -type = "Incite_Cost_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - "Building", "Supreme Court", "Player", TRUE - } -[effect_supreme_court_upkeep] -type = "Unit_Upkeep_Free_Per_City" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Supreme Court", "Player" - "OutputType", "Shield", "Local" - } -; Removes penalties (Despotism/Anarchy) for tiles >3 output -[effect_supreme_court_tile_corruption] -type = "Output_Penalty_Tile" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Supreme Court", "Player" - } -; HOMELAND SECURITY EFFECTS -; ********************************************************** -[effect_homeland_security_spy_resistance] -type = "Spy_Resistant" -value = 25 ;25% reduction of 50% base chance is 12.5% bonus. 50%-12.5%=37.5% success rate - ; No protection= 1/2, HL = 3/8, CH+HL = 1/4, CH+HL+PS = 1/8 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - } -[effect_homeland_security_hostile_diplomat0] -type = "Action_Odds_Pct" -value = -25 ; 25% of 80% base rate = 20% - ; No protection = 4/5, HL = 3/5, CH+HL = 2/5, CH+HL+PS = 1/5 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Steal Tech", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_1] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Steal Tech Escape Expected", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_2] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Targeted Steal Tech", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_3] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_4] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Sabotage City", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_5] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Sabotage City Escape", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_6] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Targeted Sabotage City", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_7] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Targeted Sabotage City Escape", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_8] -type = "Action_Odds_Pct" -value = -25 ;40 minus 25%*80 = 20% -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Steal Maps Escape", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_9] -type = "Action_Odds_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Steal Maps", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_10] -type = "Action_Odds_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Poison City Escape", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_11] -type = "Action_Odds_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Incite City", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_12] -type = "Action_Odds_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Incite City Escape", "Local", TRUE - } - -;============================================================== -; GREAT Wall -;============================================================== -[effect_great_wall_0_original] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", TRUE - "UnitClass", "Land", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "UnitType", "Howitzer", "Local", FALSE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_0_assimilated] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", FALSE - "MinForeignPct", "19", "City", FALSE - "UnitClass", "Land", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "UnitType", "Howitzer", "Local", FALSE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_1_original] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range" - "Building", "Great Wall", "Player" - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", TRUE - "UnitClass", "Helicopter", "Local" - "CityTile", "Center", "Local" - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_1_assimilated] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range" - "Building", "Great Wall", "Player" - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", FALSE - "MinForeignPct", "19", "City", FALSE - "UnitClass", "Helicopter", "Local" - "CityTile", "Center", "Local" - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_2_original] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "UnitType", "Howitzer", "Local", FALSE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_2_assimilated] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", FALSE - "MinForeignPct", "19", "City", FALSE - "UnitClass", "LandNoKill", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "UnitType", "Howitzer", "Local", FALSE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_3_original] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "UnitType", "Howitzer", "Local", FALSE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_3_assimilated] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", FALSE - "MinForeignPct", "19", "City", FALSE - "UnitClass", "LandAirSea", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "UnitType", "Howitzer", "Local", FALSE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_poploss_original] -type = "Unit_No_Lose_Pop" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", TRUE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_poploss_assimilated] -type = "Unit_No_Lose_Pop" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", FALSE - "MinForeignPct", "19", "City", FALSE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_visible_original] -type = "Visible_Walls" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", TRUE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_visible_assimilated] -type = "Visible_Walls" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", FALSE - "MinForeignPct", "19", "City", FALSE - "Tech", "Machine Tools", "World", FALSE - } -;============================================================== - -[effect_hanging_gardens] -type = "Make_Happy" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Hanging Gardens", "Player" - } -[effect_hanging_gardens_1] -type = "Output_Add_Tile" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Hanging Gardens", "City" - "CityTile", "Center", "Local" - "OutputType", "Luxury", "Local" - } - -[effect_hoover_dam] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Hoover Dam", "Player", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Solar Plant", "City", FALSE - } -[effect_hoover_dam_1] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Hoover Dam", "Player", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Solar Plant", "City", FALSE - } -[effect_hoover_dam_2] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Hoover Dam", "Player", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } -[effect_hoover_dam_3] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Hoover Dam", "Player", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_isaac_newtons_college] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "University", "City" - "Building", "Isaac Newton's College", "Player" - "OutputType", "Science", "Local" - } - -[effect_jtids] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "JTIDS", "Player", TRUE - "UnitFlag", "FootSoldier", "Local", TRUE - } -[effect_jtids_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "JTIDS", "Player", TRUE - "UnitType", "Mech. Inf.", "Local", TRUE ; uses rule_name - } -[effect_jtids_2] -type = "Veteran_Combat" -value = 75 ; 87 57::35 26 26 26 -reqs = - { "type", "name", "range", "present" - "Building", "JTIDS", "Player", TRUE - "UnitFlag", "FootSoldier", "Local", TRUE - "UnitType", "Marines", "Local", FALSE - } -[effect_jtids_3] -type = "Veteran_Combat" -value = 60 ; 80 52::32 24 24 24 -reqs = - { "type", "name", "range", "present" - "Building", "JTIDS", "Player", TRUE - "UnitType", "Mech. Inf.", "Local", TRUE ; uses rule_name - } -[effect_jtids_4] -type = "Veteran_Combat" -value = 40 ;84 70::56 42 28 21 -reqs = - { "type", "name", "range", "present" - "Building", "JTIDS", "Player", TRUE - "UnitFlag", "FootSoldier", "Local", TRUE - "UnitType", "Marines", "Local", TRUE - } - -[effect_js_bachs_cathedral] -type = "Force_Content" -value = 2 -reqs = - { "type", "name", "range" - "Building", "J.S. Bach's Cathedral", "Player" - } - -[effect_king_richards_crusade] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "King Richard's Crusade", "City" - "OutputType", "Shield", "Local" - } -[effect_city_build_slots_kr] -type = "City_Build_Slots" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "King Richard's Crusade", "City", TRUE - } - -[effect_leonardos_workshop] -type = "Upgrade_Unit" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Leonardo's Workshop", "Player" - } - -[effect_genghis_khans_equestrian_school] -type = "Move_Bonus" -value = 9 -reqs = - { "type", "name", "range", "present" - "Building", "Genghis Khan's Equestrian School", "Player", TRUE - "UnitFlag", "Horse", "Local", TRUE - } -[effect_genghis_khans_equestrian_school2] -type = "Move_Bonus" -value = 9 -reqs = - { "type", "name", "range", "present" - "Building", "Genghis Khan's Equestrian School", "Player", TRUE - "UnitType", "Explorer", "Local", TRUE - } - -[effect_lighthouse] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Sea", "Local" - } -[effect_lighthouse_a] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Submarine", "Local" - } -[effect_lighthouse_1] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Trireme", "Local" - } -[effect_lighthouse_2] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "RiverShip", "Local" - } -[effect_lighthouse_3] -type = "Unit_Vision_Radius_Sq" -value = 6 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Sea", "Local" - } -[effect_lighthouse_3a] -type = "Unit_Vision_Radius_Sq" -value = 6 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Submarine", "Local" - } -[effect_lighthouse_4] -type = "Unit_Vision_Radius_Sq" -svalue = 6 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Trireme", "Local" - } -[effect_lighthouse_5] -type = "Unit_Vision_Radius_Sq" -svalue = 6 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "RiverShip", "Local" - } - -[effect_magellans_expedition] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Magellan's Expedition", "Player", TRUE - "UnitClass", "Sea", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_magellans_expedition_a] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Magellan's Expedition", "Player", TRUE - "UnitClass", "RiverShip", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_magellans_expedition_b] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Magellan's Expedition", "Player", TRUE - "UnitClass", "Submarine", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } - -[effect_manhattan_project] -type = "Enable_Nuke" -value = 1 -reqs = - { "type", "name", "range", "survives" - "Building", "Manhattan Project", "World", TRUE - } - -[effect_marco_polos_embassy] -type = "Output_Bonus" -value = 40 -reqs = - { "type", "name", "range" - "Building", "Marco Polo's Embassy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_michelangelos_chapel] -type = "Make_Content" -value = 3 -reqs = - { "type", "name", "range" - "Building", "Michelangelo's Chapel", "Player" - } -[effect_michelangelos_chapel_1] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Tech", "Theology", "Player" - "Building", "Michelangelo's Chapel", "Player" - } -[effect_michelangelos_chapel_2] -type = "Make_Content" -value = -1 -reqs = - { "type", "name", "range" - "Building", "Michelangelo's Chapel", "Player" - "Gov", "Communism", "Player" - } - -[effect_mausoleum_of_mausolos_1] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "Building", "Great Wall", "Player", FALSE - "Building", "Mausoleum of Mausolos", "Player", TRUE - } - -;Great Wall counts as City Walls in every city. -[effect_mausoleum_of_mausolos_1a] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Great Wall", "Player" - "Building", "Mausoleum of Mausolos", "Player" - } -[effect_mausoleum_of_mausolos_2] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Building", "Mausoleum of Mausolos", "Player", TRUE - } -;Mausoleum respects that Supreme Court counts as extra Courthouse in every city. -[effect_mausoleum_of_mausolos_2a] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Supreme Court", "Player" - "Building", "Mausoleum of Mausolos", "Player" - } -[effect_mausoleum_of_mausolos_culture] -type = "History" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Mausoleum of Mausolos", "City" - } - -[effect_statue_of_zeus_content_republic] -type = "Make_Content_Mil" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Statue of Zeus", "Player", TRUE - "Gov", "Republic", "Player", TRUE - "Tech", "Tactics", "Player", FALSE - } -[effect_statue_of_zeus_content_democracy] -type = "Make_Content_Mil" -value = 2 -reqs = - { "type", "name", "range", "present" - "Building", "Statue of Zeus", "Player", TRUE - "Gov", "Democracy", "Player", TRUE - "Tech", "Tactics", "Player", FALSE - } -[effect_statue_of_zeus_1] -type = "Unit_Upkeep_Free_Per_City" -value = 4 -reqs = - { "type", "name", "range", "present" - "Building", "Statue of Zeus", "City", TRUE - "Tech", "Tactics", "Player", FALSE - "OutputType", "Shield", "Local", TRUE - } -[effect_statue_of_zeus_2] -type = "Make_Happy" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Statue of Zeus", "City" - } - -[effect_temple_of_artemis] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Luxury", "Local" - } -;Note: the city applies +1 to 0-shield city tiles on grass,swamp,hills,tundra -;Thus this bonus negates the condition of getting that +1 and needs a -;compensating +1 further below -[effect_temple_of_artemis_1] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Shield", "Local" - } -;-------- -;Give the city its extra shield if it was built on a 0-shield (grass/hills/swamp/tundra) -;tile or +1-shield resource (grass-shield,fur) -[effect_temple_of_artemis_1a] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Terrain", "Grassland", "Local" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Shield", "Local" - } -[effect_temple_of_artemis_1b] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range", "present" - "Terrain", "Hills", "Local", TRUE - "Extra", "Coal", "Local", FALSE ; only apply to 0 shield tile - "Extra", "Mine", "Local", FALSE ; only apply to 0 shield tile - "Building", "Temple", "City", TRUE - "Building", "Temple of Artemis", "Player", TRUE - "CityTile", "Center", "Local", TRUE - "OutputType", "Shield", "Local", TRUE - } -[effect_temple_of_artemis_1d] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range", "present" - "Terrain", "Swamp", "Local", TRUE - "Extra", "Peat", "Local", FALSE ; only apply to 0 shield tile - "Building", "Temple", "City", TRUE - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local", TRUE - "OutputType", "Shield", "Local", TRUE - } -[effect_temple_of_artemis_1e] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range", "present" - "Terrain", "Tundra", "Local", TRUE - "Extra", "Game", "Local", FALSE ; only apply to 0 shield tile - "Building", "Temple", "City", TRUE - "Building", "Temple of Artemis", "Player", TRUE - "CityTile", "Center", "Local", TRUE - "OutputType", "Shield", "Local", TRUE - } -;------ - -[effect_temple_of_artemis_2] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Gold", "Local" - } - -[effect_temple_of_artemis_3] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Science", "Local" - } - - -[effect_teslas_laboratory] -type = "Upgrade_Unit" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Tesla's Laboratory", "Player" - } -[effect_tesla_laboratory2] -type = "Upgrade_Price_Pct" -value = -20 -reqs = - { "type", "name", "range" - "Building", "Tesla's Laboratory", "Player" - } - -[effect_oracle] -type = "Make_Content" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - "Building", "Oracle", "Player" - } - -[effect_pyramids] -type = "Growth_Food" -value = 25 -reqs = - { "type", "name", "range" - "Building", "Pyramids", "Player" - } - -[effect_pyramids_1] -type = "Rapture_Grow" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Pyramids", "City" - } - -[effect_internet] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Research Lab", "City" - "Building", "The Internet", "Player" - "OutputType", "Science", "Local" - } - -[effect_shakespeares_theatre] -type = "No_Unhappy" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Shakespeare's Theatre", "City" - } - -[effect_statue_of_liberty] -type = "Any_Government" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Statue of Liberty", "Player" - } - -[effect_statue_of_liberty_1] -type = "No_Anarchy" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Statue of Liberty", "Player" - } - -[effect_sun_tzus_war_academy] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Sun Tzu's War Academy", "Player", TRUE - "UnitClass", "Land", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_sun_tzus_war_academy_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Sun Tzu's War Academy", "Player", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - } -[effect_sun_tzus_war_academy_2] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Sun Tzu's War Academy", "Player", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - } - -[effect_united_nations] -type = "Has_Senate" -value = 1 -reqs = - { "type", "name", "range" - "Building", "United Nations", "World" - } - -[effect_united_nations_1] -type = "Revolution_Unhappiness" -value = 2 -reqs = - { "type", "name", "range", "present" - "Building", "United Nations", "World", TRUE -; Without !present UN would make revolution less likely instead -; of enabling it with Democracy (value 2 -> 4 instead of 0 -> 2) - "Gov", "Democracy", "Player", FALSE - } - -[effect_womens_suffrage] -type = "Make_Content_Mil" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - "Building", "Women's Suffrage", "Player" - } - -[effect_womens_suffrage_1] -type = "Make_Content_Mil" -value = 4 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - "Building", "Women's Suffrage", "Player" - } - -[effect_fanatics_fundamentalism] -type = "Fanatics" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_corruption_fundamentalism0] -type = "Output_Waste" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_fundamentalism1] -type = "Output_Waste_By_Distance" -value = 200 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Trade", "Local" - } - -;Shield waste is not a proper feature of mp rulesets -;[effect_waste_fundamentalism0] -;type = "Output_Waste" -;value = 2 -;reqs = -; { "type", "name", "range" -; "Gov", "Fundamentalism", "Player" -; "OutputType", "Shield", "Local" -; } - -;[effect_waste_fundamentalism1] -;type = "Output_Waste_By_Distance" -;value = 100 -;reqs = -; { "type", "name", "range" -; "Gov", "Fundamentalism", "Player" -; "OutputType", "Shield", "Local" -; } - -[effect_fundamentalism_unit_upkeep] -type = "Upkeep_Factor" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Food", "Local" - } - -[effect_upkeep_free_units_fundamentalism] -type = "Unit_Upkeep_Free_Per_City" -value = 10 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Shield", "Local" - } - -[effect_bad_sci_fundamentalism] -type = "Output_Bonus_2" -value = -50 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "science", "local" - } - -[effect_tithes_fundamentalism] -type = "Happiness_To_Gold" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_sabotage_bonus_fundamentalism1] -type = "Action_Odds_Pct" -value = 13 ;// 13%*80% = 10.4% -reqs = - { "type", "name", "range", "present" - "Gov", "Fundamentalism", "Player", TRUE - "Action", "Sabotage City", "Local", TRUE - } -[effect_sabotage_bonus_fundamentalism2] -type = "Action_Odds_Pct" -value = 13 ;// 13%*80% = 10.4% -reqs = - { "type", "name", "range", "present" - "Gov", "Fundamentalism", "Player", TRUE - "Action", "Sabotage City Escape", "Local", TRUE - } -[effect_sabotage_bonus_fundamentalism3] -type = "Action_Odds_Pct" -value = 13 ;// 13%*80% = 10.4% (int rounds to 10%) -reqs = - { "type", "name", "range", "present" - "Gov", "Fundamentalism", "Player", TRUE - "Action", "Targeted Sabotage City", "Local", TRUE - } -[effect_sabotage_bonus_fundamentalism4] -type = "Action_Odds_Pct" -value = 13 ;// 13%*80% = 10.4% (int rounds to 10%) -reqs = - { "type", "name", "range", "present" - "Gov", "Fundamentalism", "Player", TRUE - "Action", "Targeted Sabotage City Escape", "Local", TRUE - } - -[effect_max_rates_fundamentalism] -type = "Max_Rates" -value = 80 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_enviromentalism] -type = "Pollu_Prod_Pct" -value = -50 -reqs = - { "type", "name", "range" - "Tech", "Environmentalism", "Player" - } - -[effect_calendar_base] -type = "Turn_Years" -value = 100 - -; 100 - 50 = 50 -[effect_calendar_1] -type = "Turn_Years" -value = -50 -reqs = - { "type", "name", "range" - "MinYear", "0", "World" - } - -; 50 - 25 = 25 -[effect_calendar_2] -type = "Turn_Years" -value = -25 -reqs = - { "type", "name", "range" - "MinYear", "1000", "World" - } - -; 25 - 15 = 10 -[effect_calendar_3] -type = "Turn_Years" -value = -15 -reqs = - { "type", "name", "range" - "MinYear", "1800", "World" - } - -; 10 - 5 = 5 -[effect_calendar_4] -type = "Turn_Years" -value = -5 -reqs = - { "type", "name", "range" - "MinYear", "1900", "World" - } - -; 5 - 3 = 2 -[effect_calendar_5] -type = "Turn_Years" -value = -3 -reqs = - { "type", "name", "range" - "MinYear", "1950", "World" - } - -; 2 - 1 = 1 -[effect_calendar_6] -type = "Turn_Years" -value = -1 -reqs = - { "type", "name", "range" - "MinYear", "2012", "World" - } - -[effect_tech_cost_base] -type = "Tech_Cost_Factor" -value = 1 - -; Cities can always work tiles -[effect_tile_workable] -type = "Tile_Workable" -value = 1 -reqs = - { "type", "name", "range", "present" - "Terrain", "Inaccessible", "Local", FALSE - } - -; Each city has at least one slot to build units -[effect_city_build_slots_basic] -type = "City_Build_Slots" -value = 1 - -; Capital has two slots -[effect_city_build_slots_capital] -type = "City_Build_Slots" -value = 1 -reqs = - { "type", "name", "range", "present" - "Tech", "Conscription", "Player", TRUE - "Building", "Palace", "City", TRUE - } -[effect_city_build_slots_capital2] -type = "City_Build_Slots" -value = 1 -reqs = - { "type", "name", "range", "present" - "Tech", "Conscription", "Player", TRUE - "Building", "Ecclesiastical Palace", "City", TRUE - } -[effect_city_build_slots_factory] -type = "City_Build_Slots" -value = 1 -reqs = - { "type", "name", "range", "present" - "Tech", "Conscription", "Player", TRUE - "Building", "Factory", "City", TRUE - } -[effect_city_build_slots_mfg_plant] -type = "City_Build_Slots" -value = 1 -reqs = - { "type", "name", "range", "present" - "Tech", "Conscription", "Player", TRUE - "Building", "Mfg. Plant", "City", TRUE - } - -[effect_city_image_1] -type = "City_Image" -value = 1 -reqs = - { "type", "name", "range" - "MinSize", "4", "City" - } - -[effect_city_image_2] -type = "City_Image" -value = 1 -reqs = - { "type", "name", "range" - "MinSize", "8", "City" - } - -[effect_city_image_3] -type = "City_Image" -value = 1 -reqs = - { "type", "name", "range" - "MinSize", "12", "City" - } - -[effect_city_image_4] -type = "City_Image" -value = 1 -reqs = - { "type", "name", "range" - "MinSize", "16", "City" - } - -[effect_pollution] -type = "Output_Tile_Punish_Pct" -value = 50 -reqs = - { "type", "name", "range", "present" - "Extra", "Pollution", "Local", TRUE - "Extra", "Fallout", "Local", FALSE - } - -[effect_fallout] -type = "Output_Tile_Punish_Pct" -value = 50 -reqs = - { "type", "name", "range", "present" - "Extra", "Fallout", "Local", TRUE - "Extra", "Pollution", "Local", FALSE - } - -; This would bring back bridges in cities without Bridge Building, -; but not get the trade bonus until BB discovered. Not needed now -; since Quay was added. -; collect trade from them until Bridge Building. -;[effect_bridge_without_bridge_building] -;type = "Output_Add_Tile" -;value = -1 -;reqs = -; { "type", "name", "range", "present" -; "Tech", "Bridge Building", "Player", FALSE -; "CityTile", "Center", "Local", TRUE -; "Extra", "River", "Local", TRUE -; "OutputType","Trade", "Local", TRUE -; -; ;Don't subtract a non-existent bonus. -; "Terrain", "Arctic", "Local", FALSE -; "Terrain", "Forest", "Local", FALSE -; "Terrain", "Hills", "Local", FALSE -; "Terrain", "Jungle", "Local", FALSE -; "Terrain", "Mountains", "Local", FALSE -; "Terrain", "Swamp", "Local", FALSE -; } - -[effect_pollution_fallout] -type = "Output_Tile_Punish_Pct" -value = 75 -reqs = - { "type", "name", "range" - "Extra", "Fallout", "Local" - "Extra", "Pollution", "Local" - } - -; **** Action Odds for Hostile Diplomatic Actions ******* -;******************************************************** -[effect_reduced_chance_steal_maps_escape] -type = "Action_Odds_Pct" -value = -32 ;80 minus 31%*80 = 55% -reqs = - { "type", "name", "range", "present" - "Action", "Steal Maps Escape", "Local", TRUE - } -[effect_reduced_chance_steal_maps] -type = "Action_Odds_Pct" -value = -13 ;80 minus 13%*80 = 70% -reqs = - { "type", "name", "range", "present" - "Action", "Steal Maps", "Local", TRUE - } -[effect_reduced_targeted_sabotage_city] -type = "Action_Odds_Pct" -value = -32 ;80 minus 31%*80 = 55% -reqs = - { "type", "name", "range", "present" - "Action", "Targeted Sabotage City Escape", "Local", TRUE - } -[effect_reduced_poison_city_escape] -type = "Action_Odds_Pct" -value = -13 ;80 minus 13%*80 = 70% -reqs = - { "type", "name", "range", "present" - "Action", "Poison City Escape", "Local", TRUE - } -;********************************************************* - -; FIXED flag from "Cities" to "NonMil" to have proper effect. -[effect_unit_bribe_cost_settlers] -type = "Unit_Bribe_Cost_Pct" -value = -50 -reqs = - { "type", "name", "range" - "UnitFlag", "NonMil", "Local" - } - -;LOSING MOVES FROM ILLEGAL ACTION NEVER MADE SENSE. JUST FORBID IT AND LET THEM PICK A LEGAL ACTION. -;[effect_illegal_action_move_cost_base] -;type = "Illegal_Action_Move_Cost" -;value = 0 -;reqs = -; { "type", "name", "range", "present" -; "Action", "Found City", "Local", FALSE -; "Action", "Join City", "Local", FALSE -; } - -;CASUS BELLI INCIDENTS -;******************************************************** -[effect_incident_success_pillage] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Pillage", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_caught_steal_maps1] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Maps Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_steal_maps1] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Maps Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_steal_maps2] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Maps", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_steal_maps2] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Maps", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_steal_tech] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Tech", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_steal_tech] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Tech", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_steal_tech_esc] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Tech Escape Expected", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_steal_tech_esc] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Tech Escape Expected", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_tgt_steal_tech] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_tgt_steal_tech] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_bribe_unit] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Bribe Unit", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_capture_unit] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Capture Units", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_sabotage_unit] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Sabotage Unit Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_sabotage_unit] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Sabotage Unit Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_incite] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Incite City", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_incite] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Incite City", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_incite_esc] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Incite City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_incite_esc] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Incite City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_poison] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Poison City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_poison] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Poison City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_sabotage_city] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Sabotage City", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_sabotage_city] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Sabotage City", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_sabotage_city_esc] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Sabotage City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_sabotage_city_esc] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Sabotage City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_tgt_sabotage_city] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Targeted Sabotage City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_tgt_sabotage_city] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Targeted Sabotage City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_explode_nuke] -type = "Casus_Belli_Success" -value = 1000 -reqs = - { "type", "name", "range", "present" - "Action", "Explode Nuclear", "Local", TRUE - } -;******************************************************************** - -; Double (+100%) buy cost for Great Wonders -[effect_great_wonder_buy_cost] -type = "Building_Buy_Cost_Pct" -value = 100 -reqs = - { "type", "name", "range" - "BuildingGenus", "GreatWonder", "Local" - } - -; Double buy cost for Small Wonders except Palaces -[effect_small_wonder_buy_cost] -type = "Building_Buy_Cost_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "BuildingGenus", "SmallWonder", "Local", TRUE - "Building", "Palace", "Local", FALSE - "Building", "Ecclesiastical Palace", "Local", FALSE - } - -; The Well-Digger can move 3 before you know Pottery or Alphabet. -[effect_welldigger_movement] -type = "Move_Bonus" -value = -27 -reqs = - { - "type", "name", "range", "present" - "UnitFlag", "Well-Digger", "Local", TRUE - "Tech", "Alphabet", "Player", TRUE - } -[effect_welldigger_movement_1] -type = "Move_Bonus" -value = -27 -reqs = - { - "type", "name", "range", "present" - "UnitFlag", "Well-Digger", "Local", TRUE - "Tech", "Pottery", "Player", TRUE - } - -;Can't give orders to Proletarians unless communist. -[effect_proletarian_movement] -type = "Move_Bonus" -value = -18 -reqs = - { - "type", "name", "range", "present" - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player", FALSE - } - -;5 shield discount Riflemen -[effect_communist_riflemen] -type = "Unit_Build_Cost_Pct" -value = -12 -reqs = - { - "type", "name", "range", "present" - "UnitType", "Riflemen", "Local", TRUE - "Gov", "Communism", "Player", TRUE - } - -;10 shield discount "Sturmovik Effect". -[effect_communist_dive_bombers] -type = "Unit_Build_Cost_Pct" -value = -16 -reqs = - { - "type", "name", "range", "present" - "UnitType", "Dive Bomber", "Local", TRUE - "Gov", "Communism", "Player", TRUE - } - -;Labor Union changes upkeep of foot units and mech.inf to gold -[effect_labor_union_upkeep] -type = "Shield2Gold_Factor" -value = 100 -reqs = - { - "type", "name", "range", "present" - "Tech", "Labor Union", "Player", TRUE - } diff --git a/freeciv/freeciv/data/maptest/game.ruleset b/freeciv/freeciv/data/maptest/game.ruleset deleted file mode 100644 index 4bcdde141..000000000 --- a/freeciv/freeciv/data/maptest/game.ruleset +++ /dev/null @@ -1,2088 +0,0 @@ -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes, -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -; Note that the freeciv AI may not cope well with anything more -; than minor changes. - -[datafile] -description="Avant-garde game rules for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -; This section contains meta information for freeciv-ruledit to recreate the ruleset -; file in a form wanted. These have no in-game effect whatsoever -[ruledit] - -; Which file to read description in from. -description_file = "ag/README.ag" - -[about] -; Ruleset name -; DO NOT CHANGE, FCW unfortunately has to hard-code certain special cases for this. -name = _("Avant-garde") - -; There`s no separate versioning in rulesets part of main freeciv distribution -;version = "" - -; Summary of the ruleset -; /* TRANS: In the client, this is displayed alongside the contents of -; README.ag, which are not localized. */ -summary = _("") - -; Detailed description -; When updating this, update also desciption_file in [ruledit] section to match -description = *ag/README.ag* - -; What capabilities ruleset provides for the scenarios. -; mimimum-default-sets - Default units, terrains, buildings, etc -capabilities = "minimum-default-sets" - -[options] -global_init_techs="" -global_init_buildings="Palace" - -[civstyle] -; Value added to city pollution -base_pollution = -20 - -; Cost in luxuries of making one citizen happier -happy_cost = 2 - -; Cost in food of upkeeping a single citizen -food_cost = 2 - -; Parameters used to generalize the calculation of city granary size: -; if city_size <= num_inis: -; city_granary_size = (granary_food_ini[city_size] * foodbox / 100) -; if city_size > num_inis; -; city_granary_size = (granary_food_ini[num_inis] + -; granary_food_inc * (city_size - num_inis)) * foodbox / 100 -granary_food_ini = 20, 30, 40, 50, 60, 70 -granary_food_inc = 0 - -; City center minimum outputs -min_city_center_food = 1 -min_city_center_shield = 1 -min_city_center_trade = 0 - -; Square of initial city radius -init_city_radius_sq = 5 - -; Square of initially visible radius (true distance). -init_vis_radius_sq = 5 - -; A base bribe cost, modified heavily by other factors -base_bribe_cost = 750 - -; Barbarian leader ransom in gold -ransom_gold = 100 - -; Number of veteran levels lost when upgrading a unit -upgrade_veteran_loss = 0 - -; Number of veteran levels lost when auto-upgrading a unit -autoupgrade_veteran_loss = 0 - -; Whether player gets to select which terrain improvement to pillage. -pillage_select = TRUE - -; Whether one can steal a tech for which prereqs are not known -tech_steal_allow_holes = FALSE -; Whether one can get a tech for which prereqs are not known via -; diplomatic trading -tech_trade_allow_holes = FALSE -; ...and whether one can lose a tech which is prereq for another known -; tech via trade, if techlost_donor is nonzero -tech_trade_loss_allow_holes = FALSE -; Whether one can get a tech for which prereqs are not known via -; parasite effect (classic ruleset's Great Library) -tech_parasite_allow_holes = FALSE -; Whether one can lose a tech which is prereq for another known tech -; due to negative bulbs, if techlossforgiveness allows loss -tech_loss_allow_holes = FALSE - -; Whether civil war is possible at all -civil_war_enabled = TRUE - -; Comma separated list of things to happen, in addition to death -; of owner, when gameloss unit dies -; "CivilWar" - Part of the empire remains, controlled by a new player -; "Barbarians" - Depending on if there`s also "CivilWar", all or part -; or half of the dead players empire gets under barbarian -; control. -; "Loot" - Player who killed the gameloss unit gets loot: -; Partial map, gold, techs, cities -gameloss_style = "" - -; Whether units may safely paradrop to transport on non-native terrain -paradrop_to_transport = FALSE - -; Method of paying unit and improvement gold upkeep -; "City" - The player`s total gold must be non-negative after paying upkeep -; costs associated with each city. If for any city the player`s -; gold is negative, random buildings in the city are sold off. If -; the gold is still negative, then supported units with gold upkeep -; are disbanded. -; "Mixed" - In the first step, the player`s total gold must be non-negative -; after paying upkeep for all buildings within a city. If for any -; city the player`s gold is negative, random buildings in the city -; are sold off. -; In the second step, gold upkeep for all units is paid in a lump -; sum. If the player does not have enough gold, random units with -; gold upkeep are disbanded. -; "Nation" - Gold upkeep for all buildings and units is paid in a lump sum -; after all cities have been processed. If the player does not -; have enough gold, random buildings from random cities are sold. -; If still more gold is needed, then random units with gold -; upkeep are disbanded. -gold_upkeep_style = "City" - -[illness] -; Whether plagues (illness) are possible -; There are some latent building effects in effects.ruleset which affect -; health, if you enable plague here. -illness_on = FALSE - -; the base factor for illness (of percent) -illness_base_factor = 25 - -; minimum city size for illness -illness_min_size = 3 - -; factor for how much trading with a plagued city increases our city`s -; chance for plague (in percent) -illness_trade_infection = 0 - -; factor for how much pollution within a city increases its chance for -; plague (in percent) -illness_pollution_factor = 50 - -[incite_cost] -; city_incite_cost = { [TF * SZ * NF * (BIC+owner_gold) * (2*CON) * (2*CEL) * (BONUS)] + (UF*UC) + (IF*IC) } / (3*DIST) -; See city_incite_cost() for more details -total_factor = 100 ; TF = 100 (effectively makes 100x cost at capital and 1x cost at DIST=32) -;city_size_adjusted ; SZ (happy*2 + content*1 + unhappy*0 - angry*2) -;nationality factor ; NF native=1.0, was_conquered=0.67, originally_belonged_to_inciter=0.5 -base_incite_cost = 1500 ; BIC =1100 (base cost before modifiers) -; content bonus. -;city is content ; CON -;city is celebrating ; CEL -;incite defence bonuses ; BONUS -50% empty + 300% occupied+courthouse OR + 100% empty+courthouse + supreme_court applies courthouse bonuses again -; ; +∞ = democracy/mausoleum/palace/ecclesiastical palace -;total unit shield cost ; UC -;total improvements cost ; IC -;distance to capital ; DIST (max distance penalty=32 tiles) -improvement_factor = 20 ; IF = 20 these need inflation because subject to huge divisors -unit_factor = 50 ; UF = 50 - -[global_unit_options] -; Shore landing style -; FALSE - normal movement -; TRUE - (default) slow invasions by removing all -; movement points from ground units moving -; from ocean tile to land -slow_invasions = TRUE - -[combat_rules] -; If tired_attack is set to TRUE, units that attack with less than a single -; move point (per move_fragments in terrain.ruleset) will have their attack -; power reduced accordingly. For instance, if move_fragments=3, a unit with -; 2/3 move points will have attack power 2/3 of normal. -; If this is set to FALSE units will attack with full strength even if they -; have only fractional moves left. -tired_attack = TRUE - -[auto_attack] -; An auto attack may be triggered when another unit moves to an adjacent -; tile and the autoattack server setting is enabled. The following details -; are ruleset controlled. -; will_never - units with this unit type flag will never auto attack. - -; Non-fighters don't auto-attack. -will_never = "WillNever" - -[actions] -; If force_trade_route is set to TRUE it is illegal for an actor unit to -; enter the marketplace of a city if it can establish a trade route to it -; instead. -force_trade_route = FALSE - -; If force_capture_units is set to TRUE it is illegal for an actor unit to -; bombard, explode nuclear or perform a regular attack against a tile if -; it can capture units on it in stead. -force_capture_units = FALSE - -; If force_bombard is set to TRUE it is illegal for an actor unit to -; explode nuclear or perform a regular attack against a tile if it can -; bombard it in stead. -force_bombard = FALSE - -; If force_explode_nuclear is set to TRUE it is illegal for an actor unit -; to perform a regular attack against a tile if it can do explode nuclear -; in stead. -force_explode_nuclear = TRUE - -; If poison_empties_food_stock is set to TRUE a successful "Poison City" -; or "Poison City Escape" will empty the food stock. -poison_empties_food_stock = FALSE - -; The maximum distance from the actor unit to the target of the "Bombard" -; action. The value 1 means that the targets must be on a tile adjacent to -; the actor unit. The special value "unlimited" lifts the maximum distance -; restriction. The maximum distance can`t be smaller than the minimum -; distance. -bombard_max_range = 1 - -; What each action should be called when showing them to the player. -; The first %s should be before the mnemonic of the action. A Freeciv client -; that supports mnemonics will replace it with the in-band signal that marks -; the following character as a mnemonic in its graphical toolkit. -; The second %s marks where extra details should be inserted. - -; /* TRANS: _Deploy (3% chance of success). */ -ui_name_convert_unit = _("%sConvert Unit%s") - -; /* TRANS: _Poison City (3% chance of success). */ -ui_name_poison_city_escape = _("%sPoison City%s") - -; /* TRANS: _Sabotage Enemy Unit (3% chance of success). */ -ui_name_sabotage_unit_escape = _("%sSabotage Enemy Unit%s") - -; /* TRANS: _Bribe Enemy Unit (3% chance of success). */ -ui_name_bribe_unit = _("%sBribe Enemy Unit%s") - -; /* TRANS: _Sabotage City (3% chance of success). */ -ui_name_sabotage_city = _("%sSabotage City%s") - -; /* TRANS: _Sabotage City Escape (3% chance of success). */ -ui_name_sabotage_city_escape = _("%sSabotage City Escape%s") - -; /* TRANS: Industrial _Sabotage (3% chance of success). */ -ui_name_targeted_sabotage_city_escape = _("Targeted %sSabotage%s") - -; /* TRANS: Incite a _Revolt (3% chance of success). */ -ui_name_incite_city = _("Incite a %sRevolt%s") - -; /* TRANS: Incite a _Revolt and Escape (3% chance of success). */ -ui_name_incite_city_escape = _("Incite a Re%svolt and Escape%s") - -; /* TRANS: Establish Trade _Route (100% chance of success). */ -ui_name_establish_trade_route = _("Establish Trade %sRoute%s") - -; /* TRANS: Enter _Marketplace (100% chance of success). */ -ui_name_enter_marketplace = _("Enter %sMarketplace%s") - -; /* TRANS: Establish _Embassy (100% chance of success). */ -ui_name_establish_embassy = _("Establish %sEmbassy%s") - -; /* TRANS: Becom_e Ambassador (100% chance of success). */ -ui_name_establish_embassy_stay = _("Becom%se Ambassador%s") - -; /* TRANS: Steal _Technology (3% chance of success). */ -ui_name_steal_tech = _("Steal %sTechnology%s") - -; /* TRANS: Steal _Technology and Escape (3% chance of success). */ -ui_name_steal_tech_escape = _("Steal %sTechnology and Escape%s") - -; /* TRANS: Indus_trial Espionage (3% chance of success). */ -ui_name_targeted_steal_tech_escape = _("Tar%sgeted Tech Theft%s") - -; /* TRANS: Steal _Map Fragments and Escape (3% chance of success). */ -ui_name_steal_maps_escape = _("Steal %sMap Fragments and Escape%s") - -; /* TRANS: Steal _Map Fragments (3% chance of success). */ -ui_name_steal_maps = _("Steal %sMap Fragments%s") - -; /* TRANS: _Investigate City (100% chance of success). */ -ui_name_investigate_city = _("%sInvestigate City%s") - -; /* TRANS: _Investigate City (spends the unit) (100% chance of success). */ -ui_name_investigate_city_spend_unit = _("%sInvestigate City (spends the unit)%s") - -; /* TRANS: Help _build Wonder (100% chance of success). */ -ui_name_help_wonder = _("Help %sbuild Wonder%s") - -; /* TRANS: Rec_ycle Unit (100% chance of success). */ -ui_name_recycle_unit = _("Rec%sycle Unit%s") - -; /* TRANS: _You're Fired (100% chance of success). */ -ui_name_disband_unit = _("%sYou're Fired%s") - -; /* TRANS: _Capture Units (100% chance of success). */ -ui_name_capture_units = _("%sCapture Units%s") - -; /* TRANS: _Build City (100% chance of success). */ -ui_name_found_city = _("%sBuild City%s") - -; /* TRANS: _Add to City (100% chance of success). */ -ui_name_join_city = _("%sAdd to City%s") - -; /* TRANS: Explode _Nuclear (100% chance of success). */ -ui_name_explode_nuclear = _("Explode %sNuclear%s") - -; /* TRANS: Destroy _City (100% chance of success). */ -;ui_name_destroy_city = _("Destroy %sCity%s") ;ready to be enabled if we think of how - -; /* TRANS: Set _Home City (100% chance of success). */ -ui_name_home_city = _("Set %sHome City%s") - -; /* TRANS: _Upgrade Unit (100% chance of success). */ -ui_name_upgrade_unit = _("%sUpgrade Unit%s") - -; /* TRANS: Drop _Paratrooper (100% chance of success). */ -ui_name_paradrop_unit = _("Drop %sParatrooper%s") - -; /* TRANS: _Airlift to City (100% chance of success). */ -ui_name_airlift_unit = _("%sAirlift to City%s") - -; /* TRANS: _Attack (100% chance of success). */ -ui_name_attack = _("%sAttack%s") - -; /* TRANS: _Bombard (100% chance of success). */ -ui_name_bombard = _("Range%sd Attack%s") - -;UPGRADE -; /* TRANS: _Explode Missile (100% chance of success). */ -;ui_name_suicide_attack = _("%sExplode Missile%s") - -; /* TRANS: _Conquer City (100% chance of success). */ -ui_name_conquer_city = _("%sConquer City%s") - -; /* TRANS: _Transform Terrain (3% chance of success). */ - ui_name_transform_terrain = _("%sTransform Terrain%s") - -; /* TRANS: Transform by _Irrigate (3% chance of success). */ - ui_name_irrigate_tf = _("Transform by %sIrrigate%s") - -; /* TRANS: Transform by _Mine (3% chance of success). */ - ui_name_mine_tf = _("Transform by %sMine%s") - -; /* TRANS: Pilla_ge (100% chance of success). */ - ui_name_pillage = _("Pilla%sge%s") - -; /* TRANS: _Fortify (100% chance of success). */ - ui_name_fortify = _("%sFortify%s") - -; /* TRANS: Build _Road (100% chance of success). */ - ui_name_road = _("Build %sRoad%s") - -; /* TRANS: Build _Canal (100% chance of success). */ - ui_name_canal = _("Build %Canal%s") - ui_name_waterway = _("Build Water%way%s") - -; /* TRANS: _Build Base (100% chance of success). */ - ui_name_build_base = _("%sBuild Base%s") - -; /* TRANS: Build _Mine (100% chance of success). */ - ui_name_build_mine = _("Build %sMine%s") - -; /* TRANS: Build _Irrigation (100% chance of success). */ - ui_name_irrigate = _("Build %sIrrigation%s") - -; NOT IMPLEMENTED IN SERVER YET - ; /* TRANS: _Unload (100% chance of success). */ -;ui_name_transport_unload = _("%sUnload%s") - -; Suppress automatic help text generation about what enables and/or -; disables the following actions. -; -; Can make the help text less redundant when you document it your self. -;quiet_actions = "Targeted Sabotage City", "Targeted Steal Tech" - -; /* <-- avoid gettext warnings -; -; Action enablers: -; -; action = the action to enable. -; actor_reqs = requirements that apply to the actor. -; target_reqs = requirements that apply to the target. -; -; README.actions lists the possible actions and their hard coded -; requirements. -; -; An action enabler is active when its actor_reqs AND its target_reqs are -; satisfied. -; -; */ <-- avoid gettext warnings - -[actionenabler_convert_leader] -action = "Convert Unit" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "GameLoss", "Local" - } - -[actionenabler_communist_rifles_to_plows] -action = "Convert Unit" -actor_reqs = - { "type", "name", "range" - "UnitType", "Riflemen", "Local" - "Gov", "Communism", "Player" - "Tech", "Communism", "Player" - "Tech", "Pottery", "Player" - "UnitState","OnDomesticTile","Local" - } -[actionenabler_communist_plows_to_rifles] -action = "Convert Unit" -actor_reqs = - { "type", "name", "range" - "UnitType", "Workers", "Local" - "Gov", "Communism", "Player" - "Tech", "Communism", "Player" - "Tech", "Conscription", "Player" - "UnitState","OnDomesticTile","Local" - } -;**Mobile SAM is an upgrade to AAA but does not obsolete it, -; since AAA retains special uses. Instead, AAA can convert -; to Mobile SAM under special conditions. -[actionenabler_convert_AAA_in_capital] -action = "Convert Unit" -actor_reqs = - { "type", "name", "range" - "UnitType", "Anti-Aircraft Artillery", "Local" - "UnitState","OnDomesticTile", "Local" - "CityTile", "Center", "Local" - "Building", "Palace", "City" - "Tech", "Space Flight", "Player" - "Age", "10", "Local" - } -[actionenabler_convert_AAA_in_capital_2] -action = "Convert Unit" -actor_reqs = - { "type", "name", "range" - "UnitType", "Anti-Aircraft Artillery", "Local" - "UnitState","OnDomesticTile", "Local" - "CityTile", "Center", "Local" - "Building", "Ecclesiastical Palace", "City" - "Tech", "Space Flight", "Player" - "Age", "10", "Local" - } - -[actionenabler_sabotage_city] -action = "Sabotage City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Diplomat", "Local", TRUE - "DiplRel", "War", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "UnitFlag", "Spy", "Local", FALSE - } - -[actionenabler_sabotage_city_spy] -action = "Sabotage City Escape" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "Spy", "Local" - "DiplRel", "War", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - } - -[actionenabler_sabotage_city_target] -action = "Targeted Sabotage City Escape" -actor_reqs = - { "type", "name", "range" - "DiplRel", "War", "Local" - "UnitFlag", "Spy", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - } - -; ************************ ESTABLISH EMBASSY *********************** -; normal establish embassy--if not at war -[actionenabler_establish_embassy] -action = "Establish Embassy Stay" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Diplomat", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "UnitFlag", "Spy", "Local", FALSE - "DiplRel", "War", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - } -;if at war, police station/fundie will block embassy: do a cease-fire first! -[actionenabler_establish_embassy_war] -action = "Establish Embassy Stay" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Diplomat", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "UnitFlag", "Spy", "Local", FALSE - "DiplRel", "War", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - "Building", "Police Station", "City", FALSE ; to do: when we can check for spy present to stop it - "Gov", "Fundamentalism", "Player", FALSE - } - -; normal establish embassy--if not at war -[actionenabler_establish_embassy_spy] -action = "Establish Embassy" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Spy", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - } -;if at war, police station or fundie will block embassy: do a cease-fire first! -[actionenabler_establish_embassy_spy_war] -action = "Establish Embassy" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Spy", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "DiplRel", "War", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - "Building", "Police Station", "City", FALSE ; to do: when we can check for spy present to stop it - "Gov", "Fundamentalism", "Player", FALSE - } -; *************************************************** - -[actionenabler_investigate_city] -action = "Investigate City Spend Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Diplomat", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "UnitState", "Transported", "Local", FALSE - "UnitFlag", "Spy", "Local", FALSE - } - -[actionenabler_investigate_city_spy] -action = "Investigate City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Spy", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "UnitState", "Transported", "Local", FALSE - "DiplRel", "Foreign", "Local", TRUE - } - -[actionenabler_poison_city] -action = "Poison City Escape" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Spy", "Local", TRUE - "UnitState", "Transported", "Local", FALSE - "DiplRel", "War", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - } -target_reqs = - { "type", "name", "range" - "MinSize", "2", "City" - } - -[actionenabler_steal_maps_escape] -action = "Steal Maps Escape" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Spy", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "UnitState", "Transported", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - } -[actionenabler_steal_maps] -action = "Steal Maps" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Diplomat", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - "DiplRel", "Foreign", "Local" - "UnitState", "Transported", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - } - -[actionenabler_steal_tech_random] -action = "Steal Tech" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Spy", "Local", FALSE - "UnitFlag", "Diplomat", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "UnitState", "Transported", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - } - -[actionenabler_steal_tech_random_esc] -action = "Steal Tech Escape Expected" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Spy", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "UnitState", "Transported", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - } - -[actionenabler_steal_tech_target] -action = "Targeted Steal Tech Escape Expected" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Spy", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "UnitState", "Transported", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - } - -[actionenabler_incite_city] -action = "Incite City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Diplomat", "Local", TRUE - "DiplRel", "Alliance", "Local", FALSE - "DiplRel", "Team", "Local", FALSE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "UnitFlag", "Spy", "Local", FALSE - "UnitState", "Transported", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "Gov", "Democracy", "Player", FALSE - "Building", "Palace", "City", FALSE - "Building", "Ecclesiastical Palace", "City", FALSE - "Building", "Mausoleum of Mausolos", "Player", FALSE - } - -[actionenabler_incite_city_spy] -action = "Incite City Escape" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Spy", "Local", TRUE - "DiplRel", "Alliance", "Local", FALSE - "DiplRel", "Team", "Local", FALSE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "UnitState", "Transported", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "Gov", "Democracy", "Player", FALSE - "Building", "Palace", "City", FALSE - "Building", "Ecclesiastical Palace", "City", FALSE - "Building", "Mausoleum of Mausolos", "Player", FALSE - } - -[actionenabler_bribe_unit] -action = "Bribe Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Diplomat", "Local", TRUE - "DiplRel", "Alliance", "Local", FALSE - "DiplRel", "Team", "Local", FALSE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Unbribable", "Local", FALSE - "CityTile", "Center", "Local", FALSE - "Gov", "Democracy", "Player", FALSE - "MaxUnitsOnTile", "1", "Local", TRUE - } - -[actionenabler_sabotage_unit] -action = "Sabotage Unit Escape" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "Spy", "Local" - "DiplRel", "War", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - } -target_reqs = - { "type", "name", "range", "present" - "CityTile", "Center", "Local", FALSE - "UnitClassFlag", "Unreachable", "Local", FALSE - "UnitClass", "Helicopter", "Local", FALSE - "MinHitPoints", "2", "Local", TRUE - "MaxUnitsOnTile", "1", "Local", TRUE - } - -[actionenabler_traderoute] -action = "Establish Trade Route" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "TradeRoute", "Local", TRUE - "Tech", "Trade", "Player", TRUE - "MinMoveFrags", "1", "Local", TRUE -; "DiplRel", "War", "Local", FALSE ; allows establishing during war then awaiting diplomatic relation to activate trade income. - } - -[actionenabler_traderoute_boat] -action = "Establish Trade Route" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "TradeRoute", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "UnitType", "Boat", "Local", TRUE -; "DiplRel", "War", "Local", FALSE ; allows establishing during war then awaiting diplomatic relation to activate trade income. - } - -[actionenabler_marketplace] -action = "Enter Marketplace" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "TradeRoute", "Local", TRUE - "Tech", "Trade", "Player", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -target_reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - } - -[actionenabler_help_build_wonder] -action = "Help Wonder" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "HelpWonder", "Local", TRUE - "Tech", "Trade", "Player", TRUE - "DiplRel", "War", "Local", FALSE - "UnitType", "Caravel", "Local", FALSE - } -target_reqs = - { "type", "name", "range" - "BuildingGenus", "GreatWonder", "Local" - } - -[actionenabler_help_build_small_wonder] -action = "Help Wonder" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "HelpWonder", "Local", TRUE - "Tech", "Trade", "Player", TRUE - "DiplRel", "War", "Local", FALSE - "UnitType", "Caravel", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "BuildingGenus", "SmallWonder", "Local", TRUE -; "Building", "Palace", "Local", FALSE - } - -[actionenabler_help_build_wonder_boat] -action = "Help Wonder" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "HelpWonder", "Local", TRUE - "Tech", "Currency", "Player", TRUE - "DiplRel", "War", "Local", FALSE - "UnitType", "Boat", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "BuildingGenus", "SmallWonder", "Local", TRUE -; "Building", "Palace", "Local", FALSE - } -; Allow no-home commerce units to be used on a first wonder: -[actionenabler_help_build_wonder_starting_caravan] -action = "Help Wonder" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "HelpWonder", "Local", TRUE - "UnitState", "HasHomeCity", "Local", FALSE - "DiplRel", "War", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "BuildingGenus", "SmallWonder", "Local", TRUE - } - -[actionenabler_recycle_unit] -action = "Recycle Unit" -actor_reqs = - { "type", "name", "range", "present", "quiet" - "UnitFlag", "EvacuateFirst","Local", FALSE, TRUE - "DiplRel", "War", "Local", FALSE, TRUE - "DiplRel", "Cease-fire", "Local", FALSE, TRUE - "DiplRel", "Armistice", "Local", FALSE, TRUE - "DiplRel", "Peace", "Local", FALSE, TRUE - } - -[actionenabler_disband_unit] -action = "Disband Unit" -actor_reqs = - { "type", "name", "range", "present", "quiet" - "UnitFlag", "EvacuateFirst", "Local", FALSE, TRUE - } - -;CAPTURING LAND UNITS a "Capturer" must get a "Capturable" but not on a mountain. -[actionenabler_capture] -action = "Capture Units" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Capturer", "Local", TRUE - "UnitState", "Transported", "Local", FALSE -; "DiplRel", "War", "Local", TRUE ;NAH - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "DiplRel", "Alliance", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Capturable", "Local", TRUE - "CityTile", "Center", "Local", FALSE - "Terrain", "Mountains", "Local", FALSE - "MaxUnitsOnTile", "1", "Local", TRUE - "Extra", "Fort", "Local", FALSE - "Extra", "Fortress", "Local", FALSE - } - -;Archers can strafe/soften every unit on a tile for one -;round of combat only, iff it is not a city, fortress, -;or sea tile: -[actionenabler_archer_bombard] ;**** -action = "Bombard" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Bombarder", "Local", TRUE - "UnitType", "Archers", "Local", TRUE -; "UnitState", "Transported", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "War", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "CityTile", "Center", "Local", FALSE - "Extra", "Fortress", "Local", FALSE - "TerrainClass", "Oceanic", "Local", FALSE - } - -;Fanatics can strafe/soften every unit on a tile for one -;round of combat only, iff it is in domestic territory. -[actionenabler_fanatic_bombard] ;**** -action = "Bombard" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Bombarder", "Local", TRUE - "UnitType", "Fanatics", "Local", TRUE - "UnitState", "OnDomesticTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "War", "Local", TRUE - "Gov", "Fundamentalism", "Player", TRUE -; "UnitState", "Transported", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "CityTile", "Center", "Local", FALSE - "Extra", "Fortress", "Local", FALSE - "TerrainClass", "Oceanic", "Local", FALSE - } - - -[actionenabler_build_city_pioneer] -action = "Found City" -actor_reqs = - { "type", "name", "range" - "UnitFlag", "Cities", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" - } -target_reqs = - { "type", "name", "range", "present" - "CityTile", "Claimed", "Local", FALSE - } - -[actionenabler_build_city_domestic] -action = "Found City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Cities", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "Foreign", "Local", FALSE - } - -[actionenabler_build_city_fort] -action = "Found City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Cities", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "Extra", "Fort", "Local", TRUE - } - -[actionenabler_join_city] -action = "Join City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "AddToCity", "Local", TRUE - "DiplRel", "Foreign", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - } - -[actionenabler_join_city_pilgrims_domestic] -action = "Join City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "AddToCity", "Local", TRUE - "UnitType", "Pilgrims", "Local", TRUE - "DiplRel", "Foreign", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - } - -;Land expel: must be not on a mountain nor an air expeller/expellee -[actionenabler_border_police] -action = "Expel Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "BorderPolice", "Local", TRUE - "UnitClass", "Air", "Local", FALSE - "UnitClass", "AirProtect", "Local", FALSE - "UnitFlag", "NonMil", "Local", FALSE ;Non-Military land class can't expel - "UnitType", "Warriors", "Local", FALSE ;Warriors are too weak to expel - "UnitState", "OnDomesticTile", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "DiplRel", "Team", "Local", FALSE - "DiplRel", "Alliance", "Local", FALSE -; "DiplRel", "War", "Local", FALSE ;NAH, you could expel anyone if you wanted. - "MinMoveFrags", "1", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Expellable", "Local", TRUE - "UnitClass", "Air", "Local", FALSE ;LAND UNITS CAN'T EXPEL AWACS - "UnitState", "OnDomesticTile", "Local", FALSE - "Terrain", "Mountains", "Local", FALSE ;Can't expel people hiding in the mountains - "MaxUnitsOnTile", "1", "Local", TRUE - } - -;Air expel: must be be air-to-air expelling from an aggressor air unit. -[actionenabler_air_border_police] -action = "Expel Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "BorderPolice", "Local", TRUE - "UnitFlag", "AirAttacker", "Local", TRUE ;some air class might not be expellers (AWACS) - "UnitFlag", "FieldUnit", "Local", FALSE ;bombers can't expel - "UnitState", "OnDomesticTile", "Local", TRUE - "DiplRel", "Foreign", "Local", TRUE - "DiplRel", "Team", "Local", FALSE - "DiplRel", "Alliance", "Local", FALSE -; "DiplRel", "War", "Local", FALSE ;NAH, you could expel anyone if you wanted. - "MinMoveFrags", "1", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Expellable", "Local", TRUE ;Has to be 1-expellable and 2-an air unit, in order for an air-expeller... - "UnitClass", "Air", "Local", TRUE ;...to be able to do border police action - "UnitState", "OnDomesticTile", "Local", FALSE - "MaxUnitsOnTile", "1", "Local", TRUE - } - -[actionenabler_nuke] -action = "Explode Nuclear" -actor_reqs = - { "type", "name", "range", "present", "quiet" - "UnitFlag", "Nuclear", "Local", TRUE, FALSE - "ServerSetting","nukes_minor","World", TRUE, FALSE - } - -;DESTROY CITY -; The GameLoss unit requirement makes sending units on a suicide mission to -; capture and destroy cities deep inside enemy terrain national suicide. -; The risk of moving a GameLoss unit to the target city increases the cost -; of the action. Rationalization for the requirement: the physical presence -; of the Leader makes it easier to comply with the order to destroy the -; city. (See the "orders by phone" Milgram experiment variation) -; -; The domestic city requirement forces the player to invade a city before -; he can destroy it. If this limit is weakened by allowing the destruction -; of undefended (MaxUnitsOnTile) foreign cities during war it will lead to -; situations where a player can destroy a city but is unable to occupy it. -; Rationalization: the resistance must be crushed before the destruction. -; -; TODO: create an international incident (set the Casus_Belli_Success -; effect value to 1000) if "Destroy City" still is overpowered. -[actionenabler_scorched_earth] -action = "Destroy City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "GameLoss", "Local", TRUE - "DiplRel", "Foreign", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "MaxUnitsonTile","0", "Local", TRUE - } - -;UPGRADE - all the below need Missile=FALSE after merge with main branch -;--------------------------------------------------------------------------- -;Native attack ALWAYS allowed for units who aren't CargoRestrained -[actionenabler_attack_native_unrestrained] -action = "Attack" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE -; "UnitClassFlag","Missile", "Local", FALSE - "UnitClassFlag","CargoRestrained","Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - "UnitState", "OnNativeTile", "Local", TRUE - "DiplRel", "War", "Local", TRUE - } -;Native attack for CargoRestrained units allowed, if not Transported -[actionenabler_attack_native_restrained] -action = "Attack" -;Should Archers attack from Rivers? Probably, but then what is the Pandora's box? Muskets, etc? -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE -; "UnitClassFlag","Missile", "Local", FALSE - "UnitClassFlag","CargoRestrained","Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "UnitState", "OnNativeTile", "Local", TRUE - "UnitState", "Transported", "Local", FALSE - "DiplRel", "War", "Local", TRUE - } -;Marines -[actionenabler_attack_marines] -action = "Attack" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE -; "UnitClassFlag","Missile", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - "UnitFlag", "Marines", "Local", TRUE - "DiplRel", "War", "Local", TRUE - } -[actionenabler_attack_from_non_native] -action = "Attack" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE -; "UnitClassFlag", "Missile", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - "UnitClassFlag", "AttFromNonNative", "Local", TRUE - "DiplRel", "War", "Local", TRUE - } -;/* REQUIRED after merge -;[actionenabler_explode_missile] -;action = "Suicide Attack" -;actor_reqs = -; { "type", "name", "range", "present" -; "UnitFlag", "NonMil", "Local", FALSE -; "UnitClassFlag", "Missile", "Local", TRUE -; "MinMoveFrags", "1", "Local", TRUE -; "DiplRel", "War", "Local", TRUE -; } -;*/ -;--------------------------------------------------------------------------- -[actionenabler_conquer_city_native_unrestrained] -action = "Conquer City" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "CanOccupyCity", "Local", TRUE - "UnitClassFlag", "CargoRestrained","Local", FALSE - "UnitFlag", "NonMil", "Local", FALSE - "DiplRel", "War", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - } -[actionenabler_conquer_city_native_restrained] -action = "Conquer City" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "CanOccupyCity", "Local", TRUE - "UnitClassFlag", "CargoRestrained","Local", TRUE - "UnitState", "Transported", "Local", FALSE - "UnitFlag", "NonMil", "Local", FALSE - "DiplRel", "War", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - } -[actionenabler_conquer_city_marines] -action = "Conquer City" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "CanOccupyCity", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "DiplRel", "War", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "UnitFlag", "Marines", "Local", TRUE - "UnitType", "Anti-Aircraft Artillery", "Local", FALSE - ;AAA got Marines flag only to enable reasonable attacks, - ;not for conquering cities from a Transport. - } -target_reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - } -[actionenabler_conquer_city_from_non_native] -action = "Conquer City" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "CanOccupyCity", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "DiplRel", "War", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "UnitClassFlag", "AttFromNonNative", "Local", TRUE - "UnitType", "Anti-Aircraft Artillery", "Local", FALSE - ;AAA got AttFromNonNative only to enable reasonable attacks, - ;not for conquering cities from a Transport. - } -target_reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - } -;--------------------------------------------------------------------------- -[actionenabler_change_home_city] -action = "Home City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "NoHome", "Local", FALSE - "UnitState", "HasHomeCity", "Local", TRUE -; REMOVE LINE BELOW TO ALLOW GIVING UNITS TO ALLIES THROUGH HOME CITY COMMAND - "DiplRel", "Foreign", "Local", FALSE - } -; Allow no-home caravans to be "homed" so they can be used for a Trade Route: -[actionenabler_change_home_commerce] -action = "Home City" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "NoHome", "Local", FALSE - "UnitFlag", "TradeRoute", "Local", TRUE -; REMOVE LINE BELOW TO ALLOW GIVING UNITS TO ALLIES THROUGH HOME CITY COMMAND - "DiplRel", "Foreign", "Local", FALSE - } - -[actionenabler_paradrop_base] -action = "Paradrop Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Paratroopers", "Local", TRUE - "UnitState", "Transporting", "Local", FALSE - "Extra", "Airbase", "Local", TRUE - } - -[actionenabler_paradrop_city] -action = "Paradrop Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Paratroopers", "Local", TRUE - "UnitState", "Transporting", "Local", FALSE - "CityTile", "Center", "Local", TRUE - } - -[actionenabler_upgrade_unit] -action = "Upgrade Unit" -actor_reqs = - { "type", "name", "range", "present" - "DiplRel", "Foreign", "Local", FALSE - } - -[actionenabler_airlift_unit] -action = "Airlift Unit" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "Airliftable", "Local", TRUE - "UnitState", "Transporting", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - } - -[actionenabler_transform_terrain_outside_city] -action = "Transform Terrain" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Transform", "Local", TRUE - "CityTile", "Center", "Local", FALSE - } -[actionenabler_transform_terrain_inside_city] ;can't change grass to hills inside a city -action = "Transform Terrain" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Transform", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "Terrain", "Grassland", "Local", FALSE - } - -[actionenabler_irrigate_tf] -action = "Irrigate TF" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitFlag", "CanHide", "Local", FALSE -; "UnitType", "Legion", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - } -[actionenabler_irrigate_tf_prole] -action = "Irrigate TF" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player", TRUE - } - -[actionenabler_mine_tf_outside_city] -action = "Mine TF" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitFlag", "CanHide", "Local", FALSE -; "UnitType", "Legion", "Local", FALSE - "UnitType", "Proletarians","Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE - "CityTile", "Center", "Local", FALSE - } -[actionenabler_mine_tf_outside_city_prole] -action = "Mine TF" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians","Local", TRUE - "Gov", "Communism", "Player", TRUE - "CityTile", "Center", "Local", FALSE - } -[actionenabler_mine_tf_inside_city] ;you can't plant a forest in an existing city -action = "Mine TF" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE -; "UnitType", "Legion", "Local", FALSE - "UnitFlag", "CanHide", "Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - "CityTile", "Center", "Local", TRUE - "Terrain", "Grassland", "Local", FALSE - "Terrain", "Plains", "Local", FALSE - } - -[actionenabler_pillage] -action = "Pillage" -actor_reqs = - { "type", "name", "range" - "UnitClassFlag", "CanPillage", "Local" - } -[actionenabler_pillage2] -action = "Pillage" -actor_reqs = - { "type", "name", "range" - "UnitType", "Ground Strike Fighter", "Local" - } - -[actionenabler_fortify] -action = "Fortify" -actor_reqs = - { "type", "name", "range", "present" - "UnitClassFlag", "CanFortify", "Local", TRUE - "UnitFlag", "Cant_Fortify", "Local", FALSE - "UnitClass", "AirProtect", "Local", FALSE - } - -[actionenabler_road] -action = "Road" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitFlag", "CanHide", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - } -[actionenabler_road_prole] -action = "Road" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player", TRUE - } -[actionenabler_legion_road] -action = "Road" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Legion", "Local", TRUE - "UnitState", "OnDomesticTile","Local", FALSE - } -; Don't force legions to road BEFORE making a fortress -; from fortress being "domestic national territory" -[actionenabler_legion_road2] -action = "Road" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Legion", "Local", TRUE - "Extra", "Fort", "Local", TRUE - } - -[actionenabler_base] -action = "Build Base" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "CanFortress", "Local", TRUE - "UnitType", "Proletarians", "Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE - } -[actionenabler_base_prole] -action = "Build Base" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "CanFortress", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player", TRUE - } -[actionenabler_build_hideout_domestic] -action = "Build Base" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "CanHide", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - "DiplRel", "Foreign", "Local", FALSE - } -[actionenabler_build_hideout_unclaimed] -action = "Build Base" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "CanHide", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "CityTile", "Claimed", "Local", FALSE - } - -[actionenabler_mining] -action = "Build Mine" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitFlag", "Well-Digger", "Local", FALSE -; "UnitType", "Legion", "Local", FALSE - "UnitFlag", "CanHide", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "TerrainFlag", "Oil", "Local", FALSE - } -[actionenabler_mining_prole] -action = "Build Mine" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player", TRUE - } -target_reqs = - { "type", "name", "range", "present" - "TerrainFlag", "Oil", "Local", FALSE - } - -[actionenabler_desert_oil] -action = "Build Mine" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE -; "UnitType", "Legion", "Local", FALSE - "UnitFlag", "CanHide", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE - "Tech", "Construction", "Player", TRUE - } -target_reqs = - { "type", "name", "range" - "Terrain", "Desert", "Local" - } -[actionenabler_desert_oil_prole] -action = "Build Mine" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player", TRUE - "Tech", "Construction", "Player", TRUE - } -target_reqs = - { "type", "name", "range" - "Terrain", "Desert", "Local" - } - -[actionenabler_arctic_oil] -action = "Build Mine" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE -; "UnitType", "Legion", "Local", FALSE - "UnitFlag", "CanHide", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE - "Tech", "Refining", "Player", TRUE - } -target_reqs = - { "type", "name", "range" - "Terrain", "Arctic", "Local" - } -[actionenabler_arctic_oil_prole] -action = "Build Mine" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "Gov", "Communism", "Player", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Tech", "Refining", "Player", TRUE - } -target_reqs = - { "type", "name", "range" - "Terrain", "Arctic", "Local" - } - -[actionenabler_irrigate_welldigger] -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitFlag", "Well-Digger", "Local", TRUE - "Age", "10", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "TerrainFlag", "Low Land", "Local", TRUE - "Tech", "Pottery", "Player", FALSE - "Tech", "Alphabet","Player", FALSE - "Tech", "Writing", "World", FALSE - } - -[actionenabler_irrigate_src_ocean] -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitFlag", "Well-Digger", "Local", FALSE -; "UnitType", "Legion", "Local", FALSE - "UnitFlag", "CanHide", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "TerrainClass", "Oceanic", "CAdjacent", TRUE - } -[actionenabler_irrigate_src_ocean_prole] -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player",TRUE - } -target_reqs = - { "type", "name", "range", "present" - "TerrainClass", "Oceanic", "CAdjacent", TRUE - } - -[actionenabler_irrigate_src_river] ;canal and waterway too -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE -; "UnitType", "Legion", "Local", FALSE - "UnitFlag", "CanHide", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "ExtraFlag", "IrrigationSource", "CAdjacent", TRUE -; "Extra", "River", "CAdjacent", TRUE - } -[actionenabler_irrigate_src_river_prole] ;canal and water way too -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player",TRUE - } -target_reqs = - { "type", "name", "range", "present" - "ExtraFlag", "IrrigationSource", "CAdjacent", TRUE -; "Extra", "River", "CAdjacent", TRUE - } - -[actionenabler_irrigate_src_oasis] -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE -; "UnitType", "Legion", "Local", FALSE - "UnitFlag", "CanHide", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "Extra", "Oasis", "CAdjacent", TRUE - } -[actionenabler_irrigate_src_oasis_prole] -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player",TRUE - } -target_reqs = - { "type", "name", "range", "present" - "Extra", "Oasis", "CAdjacent", TRUE - } - -[actionenabler_irrigate_src_irrigation] -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitFlag", "Well-Digger", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE -; "UnitType", "Legion", "Local", FALSE - "UnitFlag", "CanHide", "Local", FALSE - } -target_reqs = - { "type", "name", "range", "present" - "Extra", "Irrigation", "CAdjacent", TRUE - } -[actionenabler_irrigate_src_irrigation_prole] -action = "Build Irrigation" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player",TRUE - } -target_reqs = - { "type", "name", "range", "present" - "Extra", "Irrigation", "CAdjacent", TRUE - } - -; NOT IMPLEMENTED IN SERVER YET -;[actionenabler_unload] -;action = "Transport Unload" -;actor_reqs = -; { "type", "name", "range" -; "UnitState", "Transporting", "Local" -; } -;target_reqs = -; { "type", "name", "range" -; "UnitState", "OnLivableTile", "Local" -; "UnitState", "Transported", "Local" -; } - -[borders] -; Base border radius from city. -radius_sq_city = 17 - -; Border radius square increased by this amount / point of city size -size_effect = 1 - -; Difference between city workable area and area permanently claimed by -; city (these tiles cannot be stolen by stronger border sources). -; 0 means exactly city workable area is immune to border stealing. -; Negative value means outer workable tiles can be stolen; highly negative -; value (more than max city radius_sq) means any workable tile can be stolen. -; If City_Radius_Sq is variable, so is the set of locked tiles; this is -; a squared value, so the radius of the ring of tiles which are workable -; but not locked (or vice versa) varies but the area is constant. -radius_sq_city_permanent = 0 - -[research] -; Method of calculating technology costs -; "Civ I|II" - Civ (I|II) style. Every new tech add base_tech_cost to -; cost of next tech. -; "Classic" - Cost of technology is: -; base_tech_cost * (1 + reqs) * sqrt(1 + reqs) / 2 -; where reqs == number of requirement for tech, counted -; recursively. -; "Classic+" - Cost are read from tech.ruleset. Missing costs are -; generated by style "Classic". -; "Experimental" - Cost of technology is: -; base_tech_cost * (reqs^2 / (1 + sqrt(sqrt(reqs + 1))) -; - 0.5) -; where reqs == number of requirement for tech, counted -; recursively. Initial techs` cost will be base_tech_cost. -; "Experimental+" - Cost are read from tech.ruleset. Missing costs are -; generated by style "Experimental". -; "Linear" - Cost of technology is: -; base_tech_cost * reqs -; where reqs == number of requirement for tech, counted -; recursively. -tech_cost_style = "Classic+" - -; Base research cost. Used in tech cost styles where tech cost is generated. -; In other words: used everywhere unless the cost of *all* techs are -; specified and the tech cost style is "Experimental+" or "Classic+". -base_tech_cost = 20 - -; Technology leak from other civilizations -; "None" - No reduction of the technology cost. -; "Embassies" - Technology cost is reduced depending on the number of -; players which already know the tech and you have an -; embassy with. -; "All Players" - Technology cost is reduced depending on the number of -; all players (human, AI and barbarians) which already -; know the tech. -; "Normal Players" - Technology cost is reduced depending on the number of -; normal players (human and AI) which already know the -; tech. -tech_leakage = "All Players" - -; Method of paying tech upkeep -; "None" - no upkeep -; "Basic" - upkeep is calculated as: -; / tech_upkeep_divider - tech_upkeep_free -; "Cities" - upkeep is calculated like "Basic", but multiplied by number of cities -tech_upkeep_style = "None" - -; upkeep cost is divided by this value -tech_upkeep_divider = 2000 - -; Method of selecting techs given for free -; "Goal" - Towards player`s goal, random if no goal -; "Random" - Random researchable tech -; "Cheapest" - Cheapest researchable tech, random among equal cost ones -free_tech_method = "Goal" - -[culture] -; Minimum culture points for cultural domination victory -victory_min_points = 1000 - -; How big lead relative to second best player is needed for victory -victory_lead_pct = 200 - -; How much each culture point affects the migration -; from/to the city. Each culture point count as this many permilles -; of a migration point. -migration_pml = 50 - -[calendar] -; Year in the beginning of the game -start_year = -4000 - -; Year 1 instead of 0. -skip_year_0 = TRUE - -; How many fragments each year has. In addition to this, "Turn_Fragments" effects are -; needed to control fragment accumulation. -; Value 0 here disables year advancement by fragment accumulation. -fragments = 0 - -; Calendar fragment names. If name is missing, only a fragment number +1 (so human readable -; numbers begin from 1 and not 0) is shown. - -;fragment_name0 = "Jan" -;fragment_name1 = "Feb" -; ... - -; What labels are used for positive and negative years. -; /* TRANS: year label (Anno Domini, Common Era) */ -positive_label = _("AD") -; /* TRANS: year label (BC was before Common Era became PC) */ -negative_label = _("BC") - -; /* <-- avoid gettext warnings -; -; Disaster types: -; -; name = translatable name as seen by user -; reqs = requirements for disaster to happen (see effects.ruleset -; and README.effects for help on requirements) -; frequency = how likely disaster is to occur -; effects -; - "DestroyBuilding" = Random building is destroyed -; - "ReducePopulation" = Reduce city size by one unless it's already 1 -; - "ReducePopDestroy" = Reduce city size by one, possibly destroying the city -; - "EmptyFoodStock" = Remove all food from food stock -; - "EmptyProdStock" = Destroy current production -; - "Pollution" = One tile surrounding city polluted -; - "Fallout" = One tile surrounding city polluted with fallout -; -; */ <-- avoid gettext warnings - -; No disasters in multiplayer ruleset - -; /* <-- avoid gettext warnings -; -; Achievement types: -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets -; etc; if not present, "name" is used for this -; purpose too. Since the name used in savegames must -; not change, if you want to rename an item after a -; ruleset has been released, you should set -; "rule_name" to the original value of "name". -; type = What event grants the achievement to player. -; See README.achievements for list of these types. -; unique = If TRUE, only first one reaching the achievement will -; get it. Defaults to TRUE. -; value = Value to reach. Exact meaning of this depends on -; achievement type. -; culture = Amount of culture granted to player who gets achievement -; granted. -; first_msg = Message shown to first player gaining the achievement -; cons_msg = Message shown to consecutive players gaining the achievement -; -; */ <-- avoid gettext warnings - -; No achievements in multiplayer ruleset - -; -; Trade settings -; -; IN = international, IC = intercontinental. -; For each of the trade route types: -; "pct" - Trade income %. If this is 0, trade route cannot be -; established at all -; "cancelling" - What to do to previously established traderoutes when they -; turn illegal -; "Active" - Keep them active (although they will only -; provide nonzero income if illegal due to -; trademindist rather than pct==0) -; "Inactive" - Keep them inactive -; "Cancel" - Cancel them altogether -; "bonus" - One-time bonuses granted when traderoute established -; "None" - No one-time bonus -; "Gold" - Bonus to gold -; "Science" - Bonus to research -; "Both" - Bonus to gold and research -; -[trade] -settings = - { "type", "pct", "cancelling", "bonus" - "National", 0, "Cancel", "None" - "NationalIC", 0, "Cancel", "None" - "IN", 35, "Inactive", "Gold" - "INIC", 35, "Inactive", "Gold" - "Ally", 35, "Inactive", "Gold" - "AllyIC", 35, "Inactive", "Gold" - "Enemy", 0, "Inactive", "Gold" - "EnemyIC", 0, "Inactive", "Gold" - "Team", 35, "Inactive", "Gold" - "TeamIC", 35, "Inactive", "Gold" - } - -; When are goods for the trade route chosen. -; "Leaving" - Goods to carry are assigned to unit when it`s built, or it changes homecity -; "Arrival" - Goods are chosen when trade route is established, when unit arrives to destination -goods_selection = "Arrival" - -; /* <-- avoid gettext warnings -; -; Goods types: -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets -; etc; if not present, "name" is used for this -; purpose too. Since the name used in savegames must -; not change, if you want to rename an item after a -; ruleset has been released, you should set -; "rule_name" to the original value of "name". -; reqs = requirements for a city to provide goods (see effects.ruleset -; and README.effects for help on requirements) -; from_pct = Income for the sending end of the trade route. Default is 100% -; This value is applied to both ends of bidirectional routes. -; to_pct = Income for the receiving end of the trade route. Default is 100% -; This value is not used at all in case of bidirectional routes. -; onetime_pct = Onetime bonuses when traderoute is established. Default is 100% -; flags -; - "Bidirectional" = Trade route carrying the goods does not have "from" and "to" -; ends, but both ends are considered the same. -; - "Depletes" = Trade route gets cancelled when the source city cannot provide -; goods any more. Bidirectional routes gets cancelled if either -; one of the involved cities cannot provide goods. -; helptext = Optional help text string; should escape all raw -; newlines so that xgettext parsing works -; -; */ <-- avoid gettext warnings - -[goods_good] -name = _("Goods") - - -; /* <-- avoid gettext warnings -; -; Clause types -; -; Clause types that are not listed here, are not enabled at all. -; -; type = Type of the clause, one of "Advance", "Gold", "Map", "Seamap", -; "City", "Ceasefire", "Peace", "Alliance", "Vision", "Embassy" -; -; */ <-- avoid gettext warnings - -[clause_advance] -type = "Advance" - -[clause_gold] -type = "Gold" - -[clause_map] -type = "Map" - -[clause_seamap] -type = "Seamap" - -[clause_city] -type = "City" - -[clause_ceasefire] -type = "Ceasefire" - -[clause_peace] -type = "Peace" - -[clause_alliance] -type = "Alliance" - -[clause_vision] -type = "Vision" - -[clause_embassy] -type = "Embassy" - - -[playercolors] -background.r = 86 -background.g = 86 -background.b = 86 - -; Player colors for 32 players are defined below. -; Avoid greens, blues, and white / very pale colors (too easy to confuse -; with terrain). -; Avoid dark colors. -colorlist = - { "r", "g", "b" - 255, 0, 0 ; Red - 255, 255, 0 ; Yellow - 0, 255, 255 ; Blue - 138, 43, 226 ; Purple - 255, 165, 0 ; Orange - 255, 0, 255 ; Magenta - 173, 216, 230 ; Cornflower - 0, 255, 127 ; Emerald - 250, 128, 114 ; Salmon - 124, 252, 0 ; Green - 139, 0, 0 ; Burgundy - 255, 192, 203 ; Pink - 211, 211, 211 ; Silver - 218, 112, 214 ; Heliotrope - 255, 20, 147 ; Fuchsia - 100, 149, 237 ; Azure - 255, 215, 0 ; Gold - 245, 222, 179 ; Khaki - 255, 255, 128 ; Butter - 192, 255, 128 ; Mint - 204, 255, 0 ; Lime - 255, 211, 140 ; Peach - 255, 79, 0 ; Vermilion - 240, 145, 169 ; Puce - 255, 219, 88 ; Mustard - 153, 17, 153 ; Aubergine - 184, 134, 11 ; Brown - 255, 102, 0 ; Pumpkin - 102, 205, 170 ; Turquoise - 195, 33, 72 ; Crimson - 168, 153, 230 ; Lavender - 255, 250, 205 ; Cream - } - -[teams] -; Team names correspond roughly to colors defined above, so that -; plrcolormode=TEAM_ORDER is not gratuitously confusing. -names = -; /* TRANS: Name of a color; used as unique identifier for a team */ -; /* TRANS: With this and other color team names, uniqueness is more */ -; /* TRANS: important than precise translation. To see the colors, start a */ -; /* TRANS: multiplayer game with 32 players and look at the Nations report. */ - _("?team name:Red"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Yellow"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Blue"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Purple"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Orange"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Magenta"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Cornflower"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Emerald"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Salmon"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Green"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Burgundy"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Pink"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Silver"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Heliotrope"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Fuchsia"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Azure"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Gold"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Khaki"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Butter"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Mint"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Lime"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Peach"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Vermilion"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Puce"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Mustard"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Aubergine"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Brown"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Pumpkin"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Turquoise"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Crimson"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Lavender"), -; /* TRANS: Name of a color; used as unique identifier for a team */ - _("?team name:Cream") - - -; RESTRICTINFRA ENABLED ONLY RESTRICTS ENEMY RAILS TO FUNCTION AS ROADS -[settings] -; TO DISABLE SPACERACE INCLUDE THESE LINES BELOW: -; "endspaceship", DISABLED, FALSE -; "victories", "ALLIED", FALSE - -set = - { "name", "value", "lock" - "mapsize", "PLAYER", FALSE - "tilesperplayer", 300, FALSE - "netwait", 20, FALSE - "nettimeout", 120, FALSE - "pingtime", 30, FALSE - "pingtimeout", 240, FALSE - "restrictinfra", "ENABLED", FALSE - "alltemperate", FALSE, FALSE - "aifill", 6, FALSE - "airliftingstyle", "FROM_ALLIES|TO_ALLIES", FALSE - "airliftdestdivisor", 3, FALSE - "autoattack", "enabled", FALSE - "autoattack_style", 1, FALSE - "barbarians", "DISABLED", FALSE - "borders", "SEE_INSIDE", FALSE - "contactturns", 10, FALSE - "diplomacy", "ALL", FALSE - "dispersion", 0, FALSE -; "endturn", 365, FALSE - "foggedborders", TRUE, FALSE - "fogofwar", "DISABLED", FALSE - "generator", "RANDOM", FALSE - "gold", 100, FALSE - "hideouts", TRUE, FALSE - "huts", 0, FALSE - "landmass", 63, FALSE - "minplayers", 0, FALSE - "move_bonus_in_frags", "ENABLED", TRUE ;locked - "nationset", "all", FALSE - "nuclearwinter_percent", 20, FALSE - "nukes_minor", "ENABLED", FALSE ; set to DISABLED to completely disallow nuclear detonations - "nukes_major", "DISABLED", FALSE ; set to ENABLED to allow nuclear fusion weapons - "revealmap", "START", FALSE - "revolen", 1, FALSE - "separatepoles", FALSE, FALSE - "slot_control", TRUE, FALSE ; multiple units per turn - "slot_control_style", 1, FALSE ; 1 = Shield2Gold units only - "spaceship_travel_time", 225, FALSE - "specials", 350, FALSE - "startpos", "SINGLE", FALSE - "startunits", "cccwwwxxaA", FALSE - "techleak", 25, FALSE - "techpenalty", 0, FALSE - "tinyisles", FALSE, FALSE - "trademindist", 12, FALSE - "trade_revenue_style", "SIMPLE", FALSE ;"simple" formula based on average trade in both cities (sans distance etc.) - "topology", "WRAPX", FALSE - "trading_city", "DISABLED", FALSE - "universal_unload", "ENABLED", FALSE - "unload_override", 0, FALSE ;0=native unloading same as non-native. 1+ = move_fragment cost for unloading. - "unreachableprotects", "ENABLED", FALSE - "unitwaittime_style", "ACTIVITIES|FORTIFY|DELAYGOTO", FALSE - "zoc_purity", "ENABLED", FALSE ; igZOC units don't lift ZOC for units subject to ZOC - } diff --git a/freeciv/freeciv/data/maptest/governments.ruleset b/freeciv/freeciv/data/maptest/governments.ruleset deleted file mode 100644 index 99820fb9d..000000000 --- a/freeciv/freeciv/data/maptest/governments.ruleset +++ /dev/null @@ -1,245 +0,0 @@ - -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -; Note that the freeciv AI may not cope well with anything more -; than minor changes. - -[datafile] -description="Avant-garde governments data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -[governments] -during_revolution="Anarchy" - -; /* <-- avoid gettext warnings -; -; Below: The individual government types, one per section. -; -; The actual tag used (the * in [government_*]) does not matter, except -; it must be unique within this file, and it may be used in debug -; output when reading this file. -; -; For the "official" rulesets, the order of these sections should not -; be changed because that would break backward compatability with -; savegames. (In particular, if Fundamentalism is added to default -; ruleset, should be added at end.) -; -; Notes on fields: -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; if -; not present, "name" is used for this purpose too. Since -; the name used in savegames must not change, if you want -; to rename an item after a ruleset has been released, you -; should set "rule_name" to the original value of "name". -; reqs = requirements for this government (see README.effects) -; graphic = tag specifing preferred graphic -; graphic_alt = alternate graphics tag if preferred is not found; -; should be a standard tag if preferred is not; -; otherwise may be "-" -; ai_better = AI will not consider this government for use if the -; government listed here is available -; ruler_titles = ruler titles by nation, "-" is default, and non-matched -; nations are ignored -; helptext = optional help text string; should escape all raw newlines -; so that xgettext parsing works -; -; */ <-- avoid gettext warnings - -;------------------------------------------------------------------------ -[government_anarchy] - -name = _("Anarchy") -; No reqs -graphic = "gov.anarchy" -graphic_alt = "-" - -ruler_male_title = _("Warlord %s") -ruler_female_title = _("Warlady %s") - -helptext = _("\ -Anarchy is simply the absence of any recognizable government.\ - Citizens are disorganized and unproductive, and will spend all\ - income as quickly as possible, rather than paying taxes or\ - conducting research.\ -"), _("\ -Anarchy offers slightly less corruption than Despotism,\ - but slightly more unhappiness.\ -") - -;------------------------------------------------------------------------ -[government_despotism] - -name = _("Despotism") -; No reqs -graphic = "gov.despotism" -graphic_alt = "-" -ai_better = "Monarchy" - -ruler_male_title = _("Chief %s") -ruler_female_title = _("?female:Chief %s") - -helptext = _("\ -Under Despotism, you are the absolute ruler of your people. Your\ - control over your citizens is maintained largely by martial law.\ -"), _("\ -Despotism suffers the highest level of corruption of all\ - forms of government.\ -") - -;------------------------------------------------------------------------ -[government_monarchy] - -name = _("Monarchy") -reqs = { "type", "name", "range" - "tech", "Monarchy", "Player" - } -graphic = "gov.monarchy" -graphic_alt = "-" -ai_better = "Communism" - -ruler_male_title = _("King %s") -ruler_female_title = _("Queen %s") - -helptext = _("\ -Under Monarchy, a king or queen serves as a hereditary figurehead\ - for your government.\ -"), _("\ -Monarchy suffers the same small amount of corruption that\ - the Republic does.\ -") - -;------------------------------------------------------------------------ -[government_communism] - -name = _("Communism") -reqs = { "type", "name", "range" - "tech", "Communism", "Player" - } -graphic = "gov.communism" -graphic_alt = "-" - -ruler_male_title = _("Comrade %s") -ruler_female_title = _("?female:Comrade %s") - -helptext = _("\ -In Communism, all work, output, and goods are owned by the state.\ -"), _("\ -Corruption does not vary by distance from the capital;\ - all cities have the same base level of corruption. Each city gets 4\ - units free of upkeep. Buildings with 1 upkeep are free.\ - The capital city with Palace gets a +25% production bonus.\ -"), _("\ -Communist governments get a cost discount of -5 on Riflemen and -10\ - on Dive Bombers.\ -"), _("\ -Communist states can transfer Proletarians between cities to\ - re-distribute population. Large numbers of Proletarians can be\ - used to finish State projects. The Communism tech allows a\ - Communist government to conscript Workers to Riflemen and vice - versa, if inside national territory and if possessing the necessary\ - technologies.\ -") - -;------------------------------------------------------------------------ -[government_republic] - -name = _("Republic") -reqs = { "type", "name", "range" - "tech", "The Republic", "Player" - } -graphic = "gov.republic" -graphic_alt = "-" - -ruler_male_title = _("President %s") -ruler_female_title = _("?female:President %s") - -helptext = _("\ -Under a Republican government, citizens hold an election to select a\ - representative who will govern them; since elected leaders must\ - remain popular to remain in control, citizens are given a greater\ - degree of freedom. Citizens under the Republic become unhappy\ - easily, but the self-sufficiency of your citizens allows high levels\ - of trade.\ -") - -;------------------------------------------------------------------------ -[government_democracy] - -name = _("Democracy") -reqs = { "type", "name", "range" - "tech", "Democracy", "Player" - } -graphic = "gov.democracy" -graphic_alt = "-" - -ruler_male_title = _("Prime Minister %s") -ruler_female_title = _("?female:Prime Minister %s") - -helptext = _("\ -Under Democracy, citizens govern directly by voting on issues.\ - Democracy offers the highest possible level of trade, but also\ - offers the most potential for unhappiness. There is no corruption\ - during Democracy, but citizens become very upset during\ - wars.\ -") - -;------------------------------------------------------------------------ -[government_fundamentalism] - -name = _("Fundamentalism") -reqs = { "type", "name", "range" - "tech", "Fundamentalism", "Player" - } -graphic = "gov.fundamentalism" -graphic_alt = "-" - -ruler_male_title = _("High Priest %s") -ruler_female_title = _("High Priestess %s") - -helptext = _("\ -Fundamentalism is organized around central beliefs, usually religious. These form\ - rigid guidelines for the actions of the rulers and the people.\ -"), _("\ -The people are entirely devoted to their beliefs, and are often willing to die to\ - preserve them.\ -"), _("\ -Improvements that convert unhappy citizens to content produce gold tithes equal to\ - the number of citizens they would convert. Fanatics cannot be bribed. Palace\ - gives +50% to gold income in its city. In each city, two military units may impose\ - martial law, making one citizen each content. Pilgrims can be used to migrate and\ - grow the population in the cities directed by the ruling High Priest.\ -") - -; /* <-- avoid gettext warnings -; -; Multipliers (aka policies) -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets -; etc; if not present, "name" is used for this -; purpose too. Since the name used in savegames must -; not change, if you want to rename an item after a -; ruleset has been released, you should set -; "rule_name" to the original value of "name". -; default = default value (as presented in UI) -; start = minimum value (as presented in UI) -; stop = maximum value (as presented in UI) -; step = minimum increase/decrease (as presented in UI) -; offset = offset/factor control how UI values are turned -; factor = into effect values for use in effects.ruleset. -; effect_value = (ui_value + offset) * (factor/100) -; Optional; by default offset=0, factor=100, so -; that UI values are used as-is. -; reqs = requirements for adjusting this policy (see README.effects) -; helptext = optional help text string; should escape all raw -; newlines so that xgettext parsing works -; -; */ <-- avoid gettext warnings diff --git a/freeciv/freeciv/data/maptest/nations.ruleset b/freeciv/freeciv/data/maptest/nations.ruleset deleted file mode 100644 index 85937b425..000000000 --- a/freeciv/freeciv/data/maptest/nations.ruleset +++ /dev/null @@ -1,62 +0,0 @@ - -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -[datafile] -description="Avant-garde nations data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -; This section contains meta information for freeciv-ruledit to recreate the ruleset -; file in a form wanted. These have no in-game effect whatsoever -[ruledit] - -; Nationlist to add include statement for. If this entry is omitted, all the nations -; will be saved to nations.ruleset itself. -nationlist = "default/nationlist.ruleset" - -; List of nations to embed to main nations.ruleset despite separate nationlist -; being used for other nations. -embedded_nations = "barbarian", "pirate" - -[compatibility] -; Initial government for all the nations that do not -; have it explicitly defined -default_government = "Despotism" - -[default_traits] -; Default values for the AI traits. These are used if nation specific -; value for some trait has not been used. If these default too are -; not defined, the ultimate default is 50. -; _min and _max give the range from which the trait value -; is randomly chosen for a given AI player unless 'traitdistribution' -; server setting is 'FIXED' -; _default is the exaxt trait value used when 'traitdistribution' -; is 'FIXED'. If _default has not been given, it's set to the -; midpoint between _min and _max. - -; Value of trait "expansionist" defines how much AI wants to settle new territory. -expansionist_min = 30 -expansionist_max = 90 -expansionist_default = 50 - -; Value of trait "trader" defines how much AI wants to establish trade routes. -trader_min = 30 -trader_max = 90 -trader_default = 50 - -; Value of trait "aggressive" defines how easily AI declares war. -aggressive_min = 30 -aggressive_max = 90 -aggressive_default = 50 - -; Please keep [ruledit] section in sync with these includes -*include "default/nationlist.ruleset" -; This ruleset uses model of two separate barbarian nations -*include "nation/barbarian.ruleset" -*include "nation/pirate.ruleset" diff --git a/freeciv/freeciv/data/maptest/parser.lua b/freeciv/freeciv/data/maptest/parser.lua deleted file mode 100644 index ea4bf8c53..000000000 --- a/freeciv/freeciv/data/maptest/parser.lua +++ /dev/null @@ -1,13 +0,0 @@ --- Freeciv - Copyright (C) 2007 - The Freeciv Project --- This program is free software; you can redistribute it and/or modify --- it under the terms of the GNU General Public License as published by --- the Free Software Foundation; either version 2, or (at your option) --- any later version. --- --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU General Public License for more details. - --- This file is for lua-functionality for parsing luadata.txt --- of this ruleset. diff --git a/freeciv/freeciv/data/maptest/script.lua b/freeciv/freeciv/data/maptest/script.lua deleted file mode 100644 index b3c26813e..000000000 --- a/freeciv/freeciv/data/maptest/script.lua +++ /dev/null @@ -1,188 +0,0 @@ --- Freeciv - Copyright (C) 2007 - The Freeciv Project --- This program is free software; you can redistribute it and/or modify --- it under the terms of the GNU General Public License as published by --- the Free Software Foundation; either version 2, or (at your option) --- any later version. --- --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU General Public License for more details. - --- This file is for lua-functionality that is specific to a given --- ruleset. When freeciv loads a ruleset, it also loads script --- file called 'default.lua'. The one loaded if your ruleset --- does not provide an override is default/default.lua. - - --- This flags whether philosophy awards a bonus advance, and gets set to off (0) after T85. -philosophy_possible = 1 -game_turn = 0 - ---Give players custom messages on certain years. Currently at 1600 AD (T85), Philosophy expires. Let them know. -function history_turn_notifications(turn, year) - game_turn = turn - - if turn > 78 and turn < 85 then - notify.all("Philosophy will no longer award a bonus tech after turn 85.") - end - - if turn == 85 then - -- Philosophy no longer gives advances after 1600 AD - notify.all("Philosophers around the world mourn the execution of Giordano Bruno. Philosophy no longer gives a bonus advance.") - philosophy_possible = 0 - end - - return false -end -signal.connect("turn_begin", "history_turn_notifications") -- *************** turn_started deprecated in 3.1, renamed turn_begin - --- Place Ruins at the location of the destroyed city. -function city_destroyed_callback(city, loser, destroyer) - city.tile:create_extra("Ruins", NIL) - -- continue processing - return false -end - -signal.connect("city_destroyed", "city_destroyed_callback") - - --- Hack: record which players already got Philosophy, to avoid --- teams getting it multiple times with team_pooled_research. --- Stored as a string as this is a type simple enough to be included --- in savefiles. --- (It`s probably not necessary to test for existence as savefile --- data is loaded after this script is executed.) -if philo_players == nil then - philo_players = "" -end - --- Record that a player got Philosophy in our hacky string. -function record_philo(player) - local pos = player.id + 1 - philo_players = string.sub(philo_players, 1, pos-1) .. - string.rep(" ", math.max(0, pos - 1 - #philo_players)) .. - "." .. string.sub(philo_players, pos+1) -end - --- Grant one tech when the tech Philosophy is researched. -function tech_researched_handler(tech, player, how) - local id - local gained - - if tech == nil then - -- no tech was researched. - return - end - - id = tech.id --- Report early Horseback riding. - if id == find.tech_type("Horseback Riding").id and how == "researched" then - if game_turn < 15 then - for c in player:cities_iterate() do - if c:has_building(find.building_type("Palace")) then - notify.event(NIL, c.tile, E.TECH_GAIN, - _("Travellers tell stories of the amazing skills of the %s, who ride wild beasts near %s! (%i,%i)"), - player.nation:plural_translation(), c.name, c.tile.x, c.tile.y ) - - notify.all( _("Tribesmen have learned to ride wild beasts near %s (%i,%i)"), c.name, c.tile.x, c.tile.y) - end - end - end - end -------------------------- - if id == find.tech_type("Philosophy").id and how == "researched" then - - -- Check potential teammates. - for p in players_iterate() do - if player:shares_research(p) - and string.sub(philo_players, p.id+1, p.id+1) == "." then - -- Another player in the same team already got Philosophy. - record_philo(player) - return - end - end - - record_philo(player) - - - -- Philosophy does not give a bonus tech under certain conditions. Check for those conditions ------------------- - if philosophy_possible == 0 then - -- No Philosophy advance after turn 85 (1600 CE) - return - end - - -- Philosophy can only give advances if you know NO techs from the next tier -------------- - -- Even knowing any of these techs makes an advance impossible ! - - local researcher = player - - local forbidden_tech = find.tech_type("Banking") - if researcher:knows_tech(forbidden_tech) then - return - end - - forbidden_tech = find.tech_type("Medicine") - if researcher:knows_tech(forbidden_tech) then - return - end - - forbidden_tech = find.tech_type("University") - if researcher:knows_tech(forbidden_tech) then - return - end - - forbidden_tech = find.tech_type("Invention") - if researcher:knows_tech(forbidden_tech) then - return - end - - forbidden_tech = find.tech_type("Physics") - if researcher:knows_tech(forbidden_tech) then - return - end - - forbidden_tech = find.tech_type("Monotheism") - if researcher:knows_tech(forbidden_tech) then - return - end - - -- Give the player a free advance. - -- This will give a free advance for each player that shares research. - gained = player:give_tech(nil, -1, false, "researched") - - -- Notify the player. Include the tech names in a way that makes it - -- look natural no matter if each tech is announced or not. - notify.event(player, NIL, E.TECH_GAIN, - _("Great philosophers from all the world join your civilization: you get the immediate advance %s."), - gained:name_translation()) - - -- Notify research partners - notify.research(player, false, E.TECH_GAIN, - _("Great philosophers from all the world join the %s: you get the immediate advance %s."), - player.nation:plural_translation(), - gained:name_translation()) - - -- default.lua informs the embassies when the tech source is a hut. - -- They should therefore be informed about the source here too. - notify.research_embassies(player, E.TECH_EMBASSY, - -- /* TRANS: first %s is leader or team name */ - _("Great philosophers from all the world join %s: they get %s as an immediate advance."), - player:research_name_translation(), - gained:name_translation()) - end -end - -signal.connect("tech_researched", "tech_researched_handler") - -function turn_callback(turn, year) - if turn == 1 then - notify.event(nil, nil, E.SCRIPT, -_("Welcome to the MP2 Avant-garde ruleset!\n\ -This developmental version of MP2 has features which are not\ -documented in the MP2 game manual. In-game helptext is accurate.\ -Inquire on Discord for the list of new features. Have fun!\n\ -")) - end -end -signal.connect('turn_begin', 'turn_callback') diff --git a/freeciv/freeciv/data/maptest/styles.ruleset b/freeciv/freeciv/data/maptest/styles.ruleset deleted file mode 100644 index cc690357f..000000000 --- a/freeciv/freeciv/data/maptest/styles.ruleset +++ /dev/null @@ -1,265 +0,0 @@ - -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -[datafile] -description="Nation theme data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -; /* <-- avoid gettext warnings -; -; Nation styles -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; if -; not present, "name" is used for this purpose too. Since -; the name used in savegames must not change, if you want -; to rename an item after a ruleset has been released, you -; should set "rule_name" to the original value of "name". -; -; */ <-- avoid gettext warnings - -[style_european] -name = _("?style:European") - -[style_classical] -name = _("?style:Classical") - -[style_tropical] -name = _("?style:Tropical") - -[style_asian] -name = _("?style:Asian") - -[style_babylonian] -name = _("?style:Babylonian") - -[style_celtic] -name = _("?style:Celtic") - -; /* <-- avoid gettext warnings -; -; City styles define the way cities are drawn -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; if -; not present, "name" is used for this purpose too. Since -; the name used in savegames must not change, if you want -; to rename an item after a ruleset has been released, you -; should set "rule_name" to the original value of "name". -; graphic = group of tiles to use, see cities spec for -; more info on city tiles -; citizens_graphic = group of citizens tiles to use, see citizens/small -; spec for more info on citizens tiles -; FIXME: this and _alt not currently used! -; reqs = requirements for this city style (see README.effects) -; -; */ <-- avoid gettext warnings - -[citystyle_european] -name = _("?citystyle:European") -graphic = "city.european" -graphic_alt = "-" -citizens_graphic = "ancient" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "Style", "European", "Player" - } - -[citystyle_classical] -name = _("?citystyle:Classical") -graphic = "city.classical" -graphic_alt = "-" -citizens_graphic = "ancient" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "Style", "Classical", "Player" - } - -[citystyle_tropical] -name = _("?citystyle:Tropical") -graphic = "city.tropical" -graphic_alt = "city.european" -citizens_graphic = "ancient" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "Style", "Tropical", "Player" - } - -[citystyle_asian] -name = _("?citystyle:Asian") -graphic = "city.asian" -graphic_alt = "city.classical" -citizens_graphic = "ancient" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "Style", "Asian", "Player" - } - -[citystyle_babylonian] -name = _("?citystyle:Babylonian") -graphic = "city.babylonian" -graphic_alt = "city.classical" -citizens_graphic = "ancient" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "Style", "Babylonian", "Player" - } - -[citystyle_celtic] -name = _("?citystyle:Celtic") -graphic = "city.celtic" -graphic_alt = "city.european" -citizens_graphic = "ancient" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "Style", "Celtic", "Player" - } - -[citystyle_industrial] -name = _("?citystyle:Industrial") -graphic = "city.industrial" -graphic_alt = "-" -citizens_graphic = "industrial" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "tech", "Railroad", "Player" - } - -[citystyle_electric] -name = _("?citystyle:ElectricAge") -graphic = "city.electricage" -graphic_alt = "city.modern" -citizens_graphic = "electricage" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "tech", "Automobile", "Player" - } - -[citystyle_modern] -name = _("?citystyle:Modern") -graphic = "city.modern" -graphic_alt = "-" -citizens_graphic = "modern" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "tech", "Rocketry", "Player" - } - -[citystyle_postmodern] -name = _("?citystyle:PostModern") -graphic = "city.postmodern" -graphic_alt = "-" -citizens_graphic = "postmodern" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "tech", "Superconductors", "Player" - } - -; /* <-- avoid gettext warnings -; -; Music styles -; -; Order is important. The last one for which activation requirements -; are fulfilled is the one that plays. -; -; music_peaceful = Music to play when nation in peaceful mood -; music_combat = Music to play when nation in combat mood -; reqs = requirements to activate the style (see effects.ruleset -; and README.effects for help on requirements) -; -; */ <-- avoid gettext warnings - -[musicstyle_european] -music_peaceful = "music_european_peace" -music_combat = "music_european_combat" -reqs = - { "type", "name", "range" - "Style", "European", "Player" - } - -[musicstyle_classical] -music_peaceful = "music_classical_peace" -music_combat = "music_classical_combat" -reqs = - { "type", "name", "range" - "Style", "Classical", "Player" - } - -[musicstyle_tropical] -music_peaceful = "music_tropical_peace" -music_combat = "music_tropical_combat" -reqs = - { "type", "name", "range" - "Style", "Tropical", "Player" - } - -[musicstyle_asian] -music_peaceful = "music_asian_peace" -music_combat = "music_asian_combat" -reqs = - { "type", "name", "range" - "Style", "Asian", "Player" - } - -[musicstyle_babylonian] -music_peaceful = "music_babylonian_peace" -music_combat = "music_babylonian_combat" -reqs = - { "type", "name", "range" - "Style", "Babylonian", "Player" - } - -[musicstyle_celtic] -music_peaceful = "music_celtic_peace" -music_combat = "music_celtic_combat" -reqs = - { "type", "name", "range" - "Style", "Celtic", "Player" - } - -[musicstyle_renaissance] -music_peaceful = "music_renaissance_peace" -music_combat = "music_renaissance_combat" -reqs = - { "type", "name", "range" - "Tech", "University", "Player" - } - -[musicstyle_industrial] -music_peaceful = "music_industrial_peace" -music_combat = "music_industrial_combat" -reqs = - { "type", "name", "range" - "Tech", "Railroad", "Player" - } - -[musicstyle_electricage] -music_peaceful = "music_electricage_peace" -music_combat = "music_electricage_combat" -reqs = - { "type", "name", "range" - "Tech", "Automobile", "Player" - } - -[musicstyle_modern] -music_peaceful = "music_modern_peace" -music_combat = "music_modern_combat" -reqs = - { "type", "name", "range" - "Tech", "Rocketry", "Player" - } - -[musicstyle_postmodern] -music_peaceful = "music_postmodern_peace" -music_combat = "music_postmodern_combat" -reqs = - { "type", "name", "range" - "Tech", "Superconductors", "Player" - } diff --git a/freeciv/freeciv/data/maptest/techs.ruleset b/freeciv/freeciv/data/maptest/techs.ruleset deleted file mode 100644 index abbe21c53..000000000 --- a/freeciv/freeciv/data/maptest/techs.ruleset +++ /dev/null @@ -1,978 +0,0 @@ - -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes, -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -[datafile] -description="Avant-garde technology data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -[control] -; Names for custom tech flags. There can be up to 8 of these. -; name = rule name; In some circumstances user may see this -; as part of some sentences, so try to make it descriptive -; and sensible. -; helptxt = displayed in the help for advances with this flag (optional) -;flags = -; { "name", "helptxt" -; } - -; /* <-- avoid gettext warnings -; -; Tech classes: -; -; First one is the default one. -; If there is none, tech classes feature is disabled -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets -; etc; if not present, "name" is used for this -; purpose too. Since the name used in savegames must -; not change, if you want to rename an item after a -; ruleset has been released, you should set -; "rule_name" to the original value of "name". -; cost_pct = how much techs of the class cost compared -; to normal. Default is 100%. -; -; */ <-- avoid gettext warnings - -;[techclass_default] -;name = - -; /* <-- avoid gettext warnings -; -; Below: The individual advances, one per section. -; The number can be variable, up to 250. -; -; The actual tag used (the * in [advance_*]) does not matter, except -; it must be unique within this file, and it may be used in debug -; output when reading this file. -; -; Notes: -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; if -; not present, "name" is used for this purpose too. Since -; the name used in savegames must not change, if you want -; to rename an item after a ruleset has been released, you -; should set "rule_name" to the original value of "name". -; class = tech class this tech belongs to, if they have been defined. -; Default is first one defined above. -; req1, req2 = advances required before researching this one -; root_req = tech required before acquiring this tech, by any means. -; All techs with any direct or indirect dependency on this -; one will *also* have this root_req, as well as their own -; and any others they inherit. -; Giving "None" explicitly here prevents a tech from -; inheriting root_reqs in this way, and stops root_req -; inheritance through that tech. -; Specifying a tech's root_req as itself means that the tech -; can only be acquired by special means (nation's init_techs, -; scripting, etc). -; research_reqs = requirements before researching this one. Can have non -; tech requirements because it is a requirement vector. -; See doc/README.effects to learn more about requirement -; vectors. -; Requireing a tech here in stead of in req1, req2 or -; root_req is not supported yet. -; Requirements that may become fulfilled during the game -; when they weren't at the start of the game is not -; supported yet. -; flags = special flag strings -; graphic = icon for technology -; graphic_alt = alternate icon -; helptext = optional help text string (set units ruleset for examples) -; bonus_message = text seen when a player is the first to discover -; an bonus tech. Must contain '%s' to mark place of the tech -; gained. -; cost = if tech_cost_style is set to "Classic+" or "Experimental+", -; this field is read for information on how much a tech -; costs. -; -; Special values for req1 and req2 are "None" (first section below) -; and "Never" (never available). If only one tech is required, -; it should be listed as req1. -; -; As well as custom flags defined above, the following flag strings are -; possible: -; -; "Bonus_Tech" = player gets extra tech if reached first -; "Bridge" = "Settler" unit types can build roads with -; "RequiresBridge" flag over roads with -; "PreventsOtherRoads" flag (rivers) -; "Build_Airborne" = from now on can build air units (for use by AI) -; "Claim_Ocean" = Player claims ocean tiles even if they are not -; adjacent to border source -; "Claim_Ocean_Limited" = Oceanic border sources claim ocean tiles even if -; they are not adjacent to border source -; -; */ <-- avoid gettext warnings - -[advance_advanced_flight] -name = _("Advanced Flight") -req1 = "Radio" -req2 = "Machine Tools" -flags = "" -graphic = "a.advanced_flight" -graphic_alt = "-" -cost = 5430 - -[advance_alphabet] -name = _("Alphabet") -req1 = "None" -req2 = "None" -flags = "" -graphic = "a.alphabet" -graphic_alt = "-" -cost = 24 -helptext = _("Obsoletes Boat.") - -[advance_amphibious_warfare] -name = _("Amphibious Warfare") -req1 = "Navigation" -req2 = "Tactics" -flags = "" -graphic = "a.amphibious_warfare" -graphic_alt = "-" -cost = 3280 - -[advance_astronomy] -name = _("Astronomy") -req1 = "Mysticism" -req2 = "Mathematics" -flags = "" -graphic = "a.astronomy" -graphic_alt = "-" -cost = 146 - -[advance_atomic_theory] -name = _("Atomic Theory") -req1 = "Theory of Gravity" -req2 = "Physics" -flags = "" -graphic = "a.atomic_theory" -graphic_alt = "-" -cost = 1080 - -[advance_automobile] -name = _("Automobile") -req1 = "Combustion" -req2 = "Steel" -graphic = "a.automobile" -graphic_alt = "-" -helptext = _("Obsoletes Leonardos Workshop, Colossus. +25% population pollution.") -cost = 4230 - -[advance_avionics] -name = _("Avionics") -req1 = "Computers" -req2 = "Rocketry" -flags = "" -graphic = "a.avionics" -graphic_alt = "-" -helptext = _("Obsoletes Dive Bomber, prior Fighters") -cost = 7250 - -[advance_banking] -name = _("Banking") -req1 = "Trade" -req2 = "The Republic" -flags = "" -graphic = "a.banking" -graphic_alt = "-" -helptext = _("Prevents Philosophy from awarding bonus tech.") -cost = 364 - -[advance_bridge_building] -name = _("Bridge Building") -req1 = "Iron Working" -req2 = "Construction" -flags = "Bridge" -graphic = "a.bridge_building" -graphic_alt = "-" -helptext = _("Allows roads on rivers.") - -[advance_bronze_working] -name = _("Bronze Working") -req1 = "None" -req2 = "None" -flags = "" -graphic = "a.bronze_working" -graphic_alt = "-" -cost = 24 - -[advance_ceremonial_burial] -name = _("Ceremonial Burial") -req1 = "None" -req2 = "None" -flags = "" -graphic = "a.ceremonial_burial" -graphic_alt = "-" -cost = 24 - -[advance_chemistry] -name = _("Chemistry") -req1 = "University" -req2 = "Medicine" -flags = "" -graphic = "a.chemistry" -graphic_alt = "-" -cost = 800 - -[advance_chivalry] -name = _("Chivalry") -req1 = "Feudalism" -req2 = "Horseback Riding" -flags = "" -graphic = "a.chivalry" -graphic_alt = "-" -helptext = _("Obsoletes Horsemen, Chariots. Does not block Philosophy bonus.") -cost = 226 - -[advance_code_of_laws] -name = _("Code of Laws") -req1 = "Alphabet" -req2 = "None" -flags = "" -graphic = "a.code_of_laws" -graphic_alt = "-" - -[advance_combined_arms] -name = _("Combined Arms") -req1 = "Mobile Warfare" -req2 = "Advanced Flight" -flags = "" -graphic = "a.combined_arms" -graphic_alt = "-" -cost = 5650 - -[advance_combustion] -name = _("Combustion") -req1 = "Refining" -req2 = "Explosives" -flags = "" -graphic = "a.combustion" -graphic_alt = "-" -cost = 3810 - -[advance_communism] -name = _("Communism") -req1 = "Philosophy" -req2 = "Industrialization" -flags = "" -graphic = "a.communism" -graphic_alt = "-" -helptext = _("Allows government Communism.") - -[advance_computers] -name = _("Computers") -req1 = "Mass Production" -req2 = "Miniaturization" -flags = "" -graphic = "a.computers" -graphic_alt = "-" -helptext = _("Obsoletes Temple of Artemis.") -cost = 5650 - -[advance_conscription] -name = _("Conscription") -req1 = "Democracy" -req2 = "Metallurgy" -flags = "" -graphic = "a.conscription" -graphic_alt = "-" -helptext = _("Obsoletes Musketeers. Capable cities can make multiple caravans/infantry per turn.") -cost = 1890 - -[advance_construction] -name = _("Construction") -req1 = "Masonry" -req2 = "Currency" -flags = "" -graphic = "a.construction" -graphic_alt = "-" -helptext = _("Allows Fortresses, Oil Wells.") - -[advance_currency] -name = _("Currency") -req1 = "Bronze Working" -req2 = "None" -flags = "" -graphic = "a.currency" -graphic_alt = "-" -helptext = _("Boats can build Wonders.") - -[advance_democracy] -name = _("Democracy") -req1 = "Banking" -req2 = "Invention" -flags = "" -graphic = "a.democracy" -graphic_alt = "-" -cost = 875 - -[advance_economics] -name = _("Economics") -req1 = "Banking" -req2 = "University" -flags = "" -graphic = "a.economics" -graphic_alt = "-" -cost = 875 - -[advance_electricity] -name = _("Electricity") -req1 = "Metallurgy" -req2 = "Magnetism" -flags = "" -graphic = "a.electricity" -graphic_alt = "-" -helptext = _("Obsoletes Ironclad. +1 Effect for Amphitheaters.") -cost = 2220 - -[advance_electronics] -name = _("Electronics") -req1 = "The Corporation" -req2 = "Electricity" -flags = "" -graphic = "a.electronics" -graphic_alt = "-" -cost = 3630 - -[advance_engineering] -name = _("Engineering") -req1 = "The Wheel" -req2 = "Construction" -flags = "" -graphic = "a.engineering" -graphic_alt = "-" -helptext = _("Allows Canals and Naval Bases.") - -[advance_environmentalism] -name = _("Environmentalism") -req1 = "Recycling" -req2 = "Space Flight" -flags = "" -graphic = "a.environmentalism" -graphic_alt = "-" -helptext = _("-50% Pollution in all cities.") -cost = 8040 - -[advance_espionage] -name = _("Espionage") -req1 = "Communism" -req2 = "Democracy" -flags = "" -graphic = "a.espionage" -graphic_alt = "-" -helptext = _("Obsoletes Diplomat.") -cost = 2900 - -[advance_explosives] -name = _("Explosives") -req1 = "Gunpowder" -req2 = "Chemistry" -flags = "" -graphic = "a.explosives" -graphic_alt = "-" -helptext = _("Obsoletes Workers.") -cost = 1560 - -[advance_feudalism] -name = _("Feudalism") -req1 = "Warrior Code" -req2 = "Monarchy" -flags = "" -graphic = "a.feudalism" -graphic_alt = "-" -cost = 146 - -[advance_flight] -name = _("Flight") -req1 = "Combustion" -req2 = "Theory of Gravity" -flags = "Build_Airborne" -graphic = "a.flight" -graphic_alt = "-" -helptext = _("Traderoutes give less first time revenue.") -cost = 4680 - -[advance_fundamentalism] -name = _("Fundamentalism") -req1 = "Theology" -req2 = "Conscription" -flags = "" -graphic = "a.fundamentalism" -graphic_alt = "-" -helptext = _("Allows government Fundamentalism.") - -[advance_fusion_power] -name = _("Fusion Power") -req1 = "Superconductors" -req2 = "None" -flags = "" -graphic = "a.fusion_power" -graphic_alt = "-" -cost = 8040 - -[advance_genetic_engineering] -name = _("Genetic Engineering") -req1 = "Medicine" -req2 = "The Corporation" -flags = "" -graphic = "a.genetic_engineering" -graphic_alt = "-" -cost = 3150 - -[advance_guerilla_warfare] -name = _("Guerilla Warfare") -req1 = "Communism" -req2 = "Tactics" -flags = "" -graphic = "a.guerilla_warfare" -graphic_alt = "-" -helptext = _("Obsoletes Explorer. Globally unlocks defensive partisans.") -cost = 3985 - -[advance_gunpowder] -name = _("Gunpowder") -req1 = "Invention" -req2 = "Iron Working" -flags = "" -graphic = "a.gunpowder" -graphic_alt = "-" -cost = 800 -helptext = _("Obsoletes Agōgē of Sparta, Barracks, earlier foot soldiers.") - -[advance_horseback_riding] -name = _("Horseback Riding") -req1 = "None" -req2 = "None" -flags = "" -graphic = "a.horseback_riding" -graphic_alt = "-" -cost = 24 - -[advance_industrialization] -name = _("Industrialization") -req1 = "Railroad" -req2 = "Banking" -graphic = "a.industrialization" -graphic_alt = "-" -helptext = _("Obsoletes Galleon. Population begins polluting.") -cost = 2330 - -[advance_invention] -name = _("Invention") -req1 = "Engineering" -req2 = "Literacy" -flags = "" -graphic = "a.invention" -graphic_alt = "-" -helptext = _("Extra vision for Fortress and Naval Base. Prevents Philosophy bonus.") - -[advance_iron_working] -name = _("Iron Working") -req1 = "Bronze Working" -req2 = "Warrior Code" -flags = "" -graphic = "a.iron_working" -graphic_alt = "-" - -[advance_labor_union] -name = _("Labor Union") -req1 = "Mass Production" -req2 = "Guerilla Warfare" -flags = "" -graphic = "a.labor_union" -graphic_alt = "-" -cost = 5430 -helptext = _("Upkeep paid is 1 gold for: Foot Soldiers, Mechanized Infantry.") - -[advance_laser] -name = _("Laser") -req1 = "Nuclear Power" -req2 = "None" -flags = "" -graphic = "a.laser" -graphic_alt = "-" -cost = 5790 - -[advance_leadership] -name = _("Leadership") -req1 = "Chivalry" -req2 = "Gunpowder" -flags = "" -graphic = "a.leadership" -graphic_alt = "-" -helptext = _("Obsoletes Horsemen, Chariot, Elephant, Knight, Crusader.") -cost = 1250 - -[advance_literacy] -name = _("Literacy") -req1 = "Writing" -req2 = "Code of Laws" -flags = "" -graphic = "a.literacy" -graphic_alt = "-" - -[advance_machine_tools] -name = _("Machine Tools") -req1 = "Steel" -req2 = "Tactics" -flags = "" -graphic = "a.machine_tools" -graphic_alt = "-" -helptext = _("Obsoletes Cannon. Globally obsoletes Great Wall.") -cost = 3985 - -[advance_magnetism] -name = _("Magnetism") -;req1 = "Iron Working" -;req2 = "Physics" -req1 = "Navigation" -req2 = "Invention" -flags = "" -graphic = "a.magnetism" -graphic_alt = "-" -helptext = _("Obsoletes Caravel.") -cost = 950 - -[advance_map_making] -name = _("Map Making") -req1 = "Alphabet" -req2 = "None" -flags = "" -graphic = "a.map_making" -graphic_alt = "-" -cost = 51 - -[advance_masonry] -name = _("Masonry") -req1 = "None" -req2 = "None" -flags = "" -graphic = "a.masonry" -graphic_alt = "-" -helptext = _("Allows Forts.") -cost = 24 - -[advance_mass_production] -name = _("Mass Production") -req1 = "Automobile" -req2 = "The Corporation" -graphic = "a.mass_production" -graphic_alt = "-" -helptext = _("+25% population pollution.") -cost = 4680 - -[advance_mathematics] -name = _("Mathematics") -req1 = "Alphabet" -req2 = "Masonry" -flags = "" -graphic = "a.mathematics" -graphic_alt = "-" - -[advance_medicine] -name = _("Medicine") -req1 = "Philosophy" -req2 = "Trade" -flags = "" -graphic = "a.medicine" -graphic_alt = "-" -cost = 468 - -[advance_metallurgy] -name = _("Metallurgy") -req1 = "Gunpowder" -req2 = "University" -flags = "" -graphic = "a.metallurgy" -graphic_alt = "-" -helptext = _("Obsoletes Catapult.") -cost = 1340 - -[advance_miniaturization] -name = _("Miniaturization") -req1 = "Machine Tools" -req2 = "Electronics" -flags = "" -graphic = "a.miniaturization" -graphic_alt = "-" -helptext = _("Obsoletes Lighthouse.") -cost = 4490 - -[advance_mobile_warfare] -name = _("Mobile Warfare") -req1 = "Automobile" -req2 = "Tactics" -flags = "" -graphic = "a.mobile_warfare" -graphic_alt = "-" -helptext = _("Obsoletes Barracks II, Cavalry, Sun Tzu, Genghis Khan.") -cost = 5120 - -[advance_monarchy] -name = _("Monarchy") -req1 = "Ceremonial Burial" -req2 = "Code of Laws" -flags = "" -graphic = "a.monarchy" -graphic_alt = "-" -helptext = _("Allows government Monarchy.") - -[advance_monotheism] -name = _("Monotheism") -req1 = "Philosophy" -req2 = "Polytheism" -flags = "" -graphic = "a.monotheism" -helptext = _("Obsoletes Elephants.") -graphic_alt = "-" -cost = 415 - -[advance_mysticism] -name = _("Mysticism") -req1 = "Ceremonial Burial" -req2 = "None" -flags = "" -graphic = "a.mysticism" -graphic_alt = "-" -helptext = _("Doubles the effect of Temples.") - -[advance_navigation] -name = _("Navigation") -req1 = "Seafaring" -req2 = "Astronomy" -flags = "" -graphic = "a.navigation" -graphic_alt = "-" -helptext = _("Obsoletes Galley, Longboat, War Galley, Ram Ship.") -cost = 486 - -[advance_nuclear_fission] -name = _("Nuclear Fission") -req1 = "Mass Production" -req2 = "Atomic Theory" -flags = "" -graphic = "a.nuclear_fission" -graphic_alt = "-" -cost = 5300 - -[advance_nuclear_power] -name = _("Nuclear Power") -req1 = "Nuclear Fission" -req2 = "Electronics" -flags = "" -graphic = "a.nuclear_power" -graphic_alt = "-" -helptext = _("+2 moves for Sea units.") -cost = 5650 - -[advance_philosophy] -name = _("Philosophy") -req1 = "Mysticism" -req2 = "Literacy" -flags = "" -graphic = "a.philosophy" -graphic_alt = "-" -helptext = _("Bonus tech before 1600AD if no next tier techs are possessed.") -cost = 276 - -[advance_physics] -name = _("Physics") -req1 = "Literacy" -req2 = "Navigation" -flags = "" -graphic = "a.physics" -graphic_alt = "-" -helptext = _("Increases unit vision. Prevents Philosophy bonus.") - -[advance_plastics] -name = _("Plastics") -req1 = "Space Flight" -req2 = "None" -graphic = "a.plastics" -graphic_alt = "-" -helptext = _("Obsoletes Armor. +25% population pollution.") -cost = 7860 - -[advance_polytheism] -name = _("Polytheism") -req1 = "Horseback Riding" -req2 = "Ceremonial Burial" -flags = "" -graphic = "a.polytheism" -graphic_alt = "-" - -[advance_pottery] -name = _("Pottery") -req1 = "None" -req2 = "None" -flags = "" -graphic = "a.pottery" -graphic_alt = "-" -helptext = _("Allows Quays.") -cost = 24 - -[advance_radar] -name = _("Radar") -req1 = "Electronics" -req2 = "Advanced Flight" -flags = "" -graphic = "a.radar" -graphic_alt = "-" -helptext = _("Allows building Radar on Airbases.") -cost = 6630 - -[advance_radio] -name = _("Radio") -req1 = "Flight" -req2 = "None" -flags = "" -graphic = "a.radio" -graphic_alt = "-" -helptext = _("Obsoletes Mausoleum. Allows Airbase, Buoy.") -cost = 5120 - -[advance_railroad] -name = _("?tech:Railroad") -req1 = "Steam Engine" -req2 = "Bridge Building" -flags = "" -graphic = "a.railroad" -graphic_alt = "-" -helptext = _("Obsoletes Hanging Gardens. Traderoutes less first time revenue. Allows Railroads.") -cost = 1820 - -[advance_recycling] -name = _("Recycling") -req1 = "Mass Production" -req2 = "None" -;req2 = "Democracy" ; The chance you get to Recycling without knowing Democracy is about 0.001%, so, just clean up the line mess -flags = "" -graphic = "a.recycling" -graphic_alt = "-" -helptext = _("Allows government Democracy.") -cost = 4460 - -[advance_refining] -name = _("Refining") -req1 = "Chemistry" -req2 = "Steel" -flags = "" -graphic = "a.refining" -graphic_alt = "-" -helptext = _("Allows Oil Wells on Glaciers.") -cost = 3630 - -[advance_refrigeration] -name = _("Refrigeration") -req1 = "Sanitation" -req2 = "Electricity" -flags = "" -graphic = "a.refrigeration" -graphic_alt = "-" -helptext = _("Allows Farmland.") -cost = 2775 - -[advance_robotics] -name = _("Robotics") -req1 = "Mobile Warfare" -req2 = "Computers" -flags = "" -graphic = "a.robotics" -graphic_alt = "-" -helptext = _("Obsoletes Artillery, King Richards Crusade.") -cost = 7250 - -[advance_rocketry] -name = _("Rocketry") -req1 = "Radar" -req2 = "Miniaturization" -flags = "" -graphic = "a.rocketry" -graphic_alt = "-" -helptext = _("Obsoletes Destroyer, Cruiser.") -cost = 7040 - -[advance_sanitation] -name = _("Sanitation") -req1 = "Engineering" -req2 = "Medicine" -flags = "" -graphic = "a.sanitation" -graphic_alt = "-" -cost = 950 - -[advance_seafaring] -name = _("Seafaring") -req1 = "Pottery" -req2 = "Map Making" -flags = "" -graphic = "a.seafaring" -helptext = _("Obsoletes Trireme.") -graphic_alt = "-" - -[advance_space_flight] -name = _("Space Flight") -req1 = "Computers" -req2 = "Rocketry" -flags = "" -graphic = "a.space_flight" -graphic_alt = "-" -helptext = _("Obsoletes earlier Bombers.") -cost = 7680 - -[advance_stealth] -name = _("Stealth") -req1 = "Superconductors" -req2 = "Avionics" -flags = "" -graphic = "a.stealth" -graphic_alt = "-" -cost = 11920 - -[advance_steam_engine] -name = _("Steam Engine") -;req1 = "Physics" -;req2 = "Invention" -req1 = "Physics" -req2 = "University" -flags = "" -graphic = "a.steam_engine" -graphic_alt = "-" -helptext = _("Obsoletes Frigate.") -cost = 1240 - -[advance_steel] -name = _("Steel") -req1 = "Electricity" -req2 = "Industrialization" -flags = "" -graphic = "a.steel" -graphic_alt = "-" -cost = 3280 - -[advance_superconductors] -name = _("Superconductors") -req1 = "Laser" -req2 = "Space Flight" -flags = "" -graphic = "a.superconductors" -graphic_alt = "-" -cost = 7750 -helptext = _("Allows MagLev.") - -[advance_tactics] -name = _("Tactics") -req1 = "Conscription" -req2 = "Leadership" -flags = "" -graphic = "a.tactics" -graphic_alt = "-" -helptext = _("Obsoletes Dragoons, Statue of Zeus.") -cost = 2530 - -[advance_the_corporation] -name = _("The Corporation") -req1 = "Economics" -req2 = "Industrialization" -flags = "" -graphic = "a.the_corporation" -graphic_alt = "-" -helptext = _("Obsoletes Caravan.") -cost = 2900 - -[advance_the_republic] -name = _("The Republic") -req1 = "Code of Laws" -req2 = "Literacy" -flags = "" -graphic = "a.the_republic" -graphic_alt = "-" -helptext = _("Allows government Republic.") - -[advance_the_wheel] -name = _("The Wheel") -req1 = "Horseback Riding" -req2 = "None" -flags = "" -graphic = "a.the_wheel" -graphic_alt = "-" - -[advance_theology] -name = _("Theology") -req1 = "Feudalism" -req2 = "Monotheism" -flags = "" -graphic = "a.theology" -graphic_alt = "-" -helptext = _("Obsoletes Oracle. +1 Effect on Cathedral, Michelangelos Chapel.") -cost = 725 - -[advance_theory_of_gravity] -name = _("Theory of Gravity") -req1 = "Astronomy" -req2 = "University" -flags = "" -graphic = "a.theory_of_gravity" -graphic_alt = "-" -cost = 585 - -[advance_trade] -name = _("Trade") -req1 = "Currency" -req2 = "Code of Laws" -flags = "" -graphic = "a.trade" -graphic_alt = "-" -helptext = _("Lets all Commerce units make Wonders, Traderoutes.") - -[advance_university] -name = _("University") -req1 = "Mathematics" -req2 = "Philosophy" -flags = "" -graphic = "a.university" -graphic_alt = "-" -cost = 415 - -[advance_warrior_code] -name = _("Warrior Code") -req1 = "None" -req2 = "None" -flags = "" -graphic = "a.warrior_code" -graphic_alt = "-" -cost = 24 -helptext = _("Foot soldiers may make Hideouts, if enabled.") - -[advance_writing] -name = _("Writing") -req1 = "Alphabet" -req2 = "None" -flags = "" -graphic = "a.writing" -graphic_alt = "-" - -; A placeholder tech used to ensure that when -; a game is reloaded, a player can`t rebuild -; the "Darwin's Voyage" small wonder and get -; two free advances again. -; THIS RULESET DOES NOT USE OLD DARWIN'S VOYAGE BEHAVIOUR OR THEORY OF EVOLUTION. -[advance_theory_of_evolution] -name = _("Theory of Evolution") -req1 = "None" -req2 = "None" -root_req = "Theory of Evolution" -flags = "" -graphic = "b.darwins_voyage" -graphic_alt = "-" -helptext = _("This technology is not researchable and has no effect.") diff --git a/freeciv/freeciv/data/maptest/terrain.ruleset b/freeciv/freeciv/data/maptest/terrain.ruleset deleted file mode 100644 index c93e3f4f6..000000000 --- a/freeciv/freeciv/data/maptest/terrain.ruleset +++ /dev/null @@ -1,2356 +0,0 @@ - -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes, -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -; Note that the freeciv AI may not cope well with anything more -; than minor changes. - -[datafile] -description="Avant-garde terrain data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -[control] -; Names for custom terrain flags. There can be up to 8 of these. -; name = rule name; In some circumstances user may see this -; as part of some sentences, so try to make it descriptive -; and sensible. -; helptxt = displayed in the help for terrains with this flag (optional) -flags = - { "name", "helptxt" - _("Oil"), _("Has Oil Well instead of Mine.") - _("NoPollution"), _("No Pollution nor Fallout appear here.") - _("Low Land"), _("Terrain suitable for canal digging.") - } - -; Names for custom extra flags. There can be up to 8 of these. -; name = rule name; In some circumstances user may see this -; as part of some sentences, so try to make it descriptive -; and sensible. -; helptxt = displayed in the help for extra types with this flag -; (optional) -extra_flags = - { "name", "helptxt" - _("Quayable"), _("Allows Quays to be built.") - _("IrrigationSource"), _("Allows Irrigation.") - } - -[parameters] - -; Percentage of "land" tiles required to be adjacent to a water tile before -; it may be "reclaimed" into a land tile (0-101; 0=anywhere, default 101=nowhere) -ocean_reclaim_requirement = 30 - -; Percentage of "water" tiles required to be adjacent to a land tile before -; it may be "channeled" into a water tile (0-101; 0=anywhere, default 101=nowhere) -land_channel_requirement = 10 - -; Percentage of unfrozen tiles (no "Frozen" flag) required to be adjacent -; to a frozen tile before it can thaw (0-101; 0=anywhere, default 101=nowhere) -thaw_requirement = 0 - -; Percentage of frozen tiles ("Frozen" flag) required to be adjacent to an -; unfrozen tile before it can freeze (0-101; 0=anywhere, default 101=nowhere) -freeze_requirement = 0 - -; Bodies of water up to this size are considered freshwater lakes, if there is -; also terrain type(s) with flag "FreshWater" in the ruleset. -lake_max_size = 14 - -; How many native tiles first startunit must be able to reach. -; 0 to disable check. -min_start_native_area = 0 - -; How many fragments each movement point has. -; For example road movement costs are relative to this. -move_fragments = 9 - -; How many move_fragments IgTer unit movement costs -igter_cost = 3 - -; Whether diagonal movement has increased cost (no effect with hex topology) -; The cost increase is more accurate with larger values for move_fragments -pythagorean_diagonal = FALSE - -; There is no resources in the middle of the oceans, only near coast -ocean_resources = FALSE - -; /* <-- avoid gettext warnings -; -; The individual terrain types, one per section. -; Roughly sorted by identifier. -; The actual tag used (the * in [terrain_*]) must be unique for each terrain, -; and may be used in debug output when reading this file. -; -; Notes: -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; -; if not present, "name" is used for this purpose too. -; Since the name used in savegames must not change, if -; you want to rename an item after a ruleset has been -; released, you should set "rule_name" to the original -; value of "name". -; graphic = preferred graphic; Tilespec [tile_*] section -; with 'tag' matching this will be used. -; graphic_alt = alternate graphic. When no tilespec 'tag' matching -; preferred graphic is not found, this will be used. -; Otherwise may be "-" -; identifier = single-character identifier used in savegames. This -; must be unique for each terrain. -; class = Terrain class terrain belongs to: "Land" or "Oceanic" -; movement_cost = in whole movement points, not move_fragments; -; typically 1 to 3 -; defense_bonus = percent added to defense; typically 0% to 200% -; food = normal food production -; shield = normal shield production -; trade = normal trade production -; resources = list of possible resources on this terrain -; road_food_incr_pct = percent of road food_incr applied to this terrain -; road_shield_incr_pct = percent of road shield_incr applied to this terrain -; road_trade_incr_pct = percent of road trade_incr applied to this terrain -; base_time = time to build bases; if 0, cannot build any bases. -; Nonzero values only affect extras with build_time 0. -; road_time = time to build roads; if 0, cannot build any roads. -; Nonzero values only affect extras with build_time 0. -; irrigation_result = result of 'irrigate' activity; one of: -; "no" -- cannot irrigate -; "yes" -- can build extra -; terrain section -- irrigation changes to that terrain -; irrigation_food_incr = increment to food if tile is 100% irrigated -; (actual bonus controlled by Irrigation_Pct effect) -; irrigation_time = time for 'irrigate' activity; if 0, cannot irrigate -; Nonzero values only affect extras with build_time 0. -; Such extras can modify time with build_time_factor. -; mining_result = result of 'mine' activity; one of: -; "no" -- cannot mine -; "yes" -- can build extra -; terrain section -- mining changes to that terrain -; mining_shield_incr = increment to shields if tile is 100% mined -; (actual bonus controlled by Mining_Pct effect) -; mining_time = time for 'mine' activity; if 0, cannot mine -; Nonzero values only affect extras with build_time 0. -; Such extras can modify time with build_time_factor. -; transform_result = result of transformation; one of: -; "no" -- cannot transform -; terrain section -- transformation changes to that -; terrain -; transform_time = time to transform; if 0, cannot transform -; pillage_time = time to pillage extra from the tile (0 = impossible) -; Nonzero values only affect extras with removal_time 0. -; clean_pollution_time = time for 'clean pollution' activity (0 = impossible) -; Nonzero values only affect extras with removal_time 0. -; clean_fallout_time = time for 'clean fallout' activity (0 = impossible) -; Nonzero values only affect extras with removal_time 0. -; animal = unit type that can appear as animal on the terrain -; warmer_wetter_result = result of global warming for wet terrains; one of: -; "no" -- no change; does not count for warming -; "yes" -- no change; counts for warming -; terrain section -- warming changes to that terrain -; warmer_drier_result = result of global warming for dry terrains; -; see warmer_wetter_result -; cooler_wetter_result = result of nuclear winter for wet terrains; -; see warmer_wetter_result -; cooler_drier_result = result of nuclear winter for dry terrains; -; see warmer_wetter_result -; native_to = List of unit classes that can move here -; flags = General flags for this terrain. List taken from the -; following, and/or any user flags defined above: -; - NoBarbs = Barbarians will not be spawned here. -; - NoCities = Cities may not be built or found on this terrain. -; - Starter = Players will only be started on "Starter" terrain. -; (Currently this cannot be Oceanic terrain.) -; - CanHaveRiver = Set to 1 if this terrain can have river on it (the -; actual chance of river generation is controlled -; separately). -; - UnsafeCoast = This terrain does not provide a safe voyage for -; units with flag "Trireme" -; - FreshWater = This terrain is used for small bodies of water. -; If this becomes adjacent to non-FreshWater terrain, -; the whole contiguous FreshWater area will be flooded -; with the non-FreshWater terrain. -; - NotGenerated = Map generator never places this terrain type. It can -; be added from editor only, or by ingame events -; (lua scripting) -; - NoZoc = Units on this terrain are not generating or subject -; to zoc -; - NoFortify = Units cannot fortify on this terrain -; - Frozen = Frozen/polar terrain. For water tiles, Frozen terrain -; is generated near poles. Conversion between frozen -; and unfrozen terrain can be controlled with -; thaw_requirement/freeze_requirement, and Frozen -; terrain is shown differently on the overview map. -; property_* = specific property % values used by mapgen. Most -; terrains will have 0 for most values. Properties -; other than ocean_depth are only used for land tiles. -; - mountainous = degree to which this terrain is mountainous -; - green = how much life this terrain has -; - foliage = how much thick undergrowth the terrain has -; - tropical = how "tropical" the terrain is (high temperature) -; - temperate = how "temperate" the terrain is (med temperature) -; - cold = how "cold" the terrain is (low temperature) -; - frozen = how "frozen" the terrain is (very low temperature) -; (does not necessarily have to have the "Frozen" flag) -; - wet = how "wet" the terrain is (moisture) -; - dry = how "dry" the terrain is (moisture) -; - ocean_depth = the depth of an ocean, as an average level -; color.r = color of the terrain (red value) -; color.g = color of the terrain (green value) -; color.b = color of the terrain (blue value) -; helptext = optional help text string; should escape all raw -; newlines so that xgettext parsing works -; -; */ <-- avoid gettext warnings - -[terrain_inaccesible] -name = _("Inaccessible") -graphic = "inaccessible" -graphic_alt = "arctic" -identifier = "i" -class = "Land" -movement_cost = 0 -defense_bonus = 0 -food = 0 -shield = 0 -trade = 0 -road_food_incr_pct = 0 -road_shield_incr_pct = 0 -road_trade_incr_pct = 0 -base_time = 0 -road_time = 0 -irrigation_result = "no" -irrigation_food_incr = 0 -irrigation_time = 0 -mining_result = "no" -mining_shield_incr = 0 -mining_time = 0 -transform_result = "no" -transform_time = 0 -pillage_time = 0 -clean_pollution_time = 0 -clean_fallout_time = 0 -animal = "None" -warmer_wetter_result = "no" -warmer_drier_result = "no" -cooler_wetter_result = "no" -cooler_drier_result = "no" -flags = "NotGenerated", "NoPollution", "NoCities", "UnsafeCoast", "Frozen" -color.r = 25 -color.g = 25 -color.b = 25 -helptext = _("\ -No unit can enter this terrain, nor can any city work its tiles.\ -") - -[terrain_lake] -name = _("Lake") -graphic = "lake" -graphic_alt = "coast" -identifier = "+" -class = "Oceanic" -movement_cost = 1 -defense_bonus = 0 -food = 1 -shield = 0 -trade = 2 -resources = "Fish" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 0 -irrigation_result = "no" -irrigation_food_incr = 0 -irrigation_time = 0 -mining_result = "no" -mining_shield_incr = 0 -mining_time = 0 -transform_result = "Swamp" -transform_time = 36 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "no" -warmer_drier_result = "Swamp" -cooler_wetter_result = "Arctic" -cooler_drier_result = "Tundra" -native_to = "Sea", "Air", "Balloon", "Missile", "Helicopter", "Trireme", "RiverShip", "Submarine", "AirProtect", "AirPillage", "Bomb" -flags = "NoCities", "NoBarbs", "NoPollution", "FreshWater", "NoZoc", "NoFortify" -property_ocean_depth = 0 -color.r = 46 -color.g = 120 -color.b = 182 -helptext = _("\ -Lakes are bodies of fresh water not connected to sea or ocean.\ -") - -[terrain_ocean] -name = _("Ocean") -graphic = "coast" -graphic_alt = "-" -identifier = " " -class = "Oceanic" -movement_cost = 1 -defense_bonus = 0 -food = 1 -shield = 0 -trade = 2 -resources = "Fish", "Whales" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 0 -irrigation_result = "no" -irrigation_food_incr = 0 -irrigation_time = 0 -mining_result = "no" -mining_shield_incr = 0 -mining_time = 0 -transform_result = "Swamp" -transform_time = 36 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "no" -warmer_drier_result = "Swamp" -cooler_wetter_result = "Arctic" -cooler_drier_result = "Arctic" -native_to = "Sea", "Air", "Balloon", "Missile", "Helicopter", "Trireme", "RiverShip", "Submarine", "AirProtect", "AirPillage", "Bomb" -flags = "NoCities", "NoPollution", "UnsafeCoast", "NoZoc", "NoFortify" -property_ocean_depth = 32 -color.r = 0 -color.g = 46 -color.b = 137 -helptext = _("\ -Shallow oceans are mostly found near coastlines, and are often rich\ - sources of food and other resources.\ -") - -[terrain_deep_ocean] -name = _("Deep Ocean") -graphic = "floor" -graphic_alt = "coast" -identifier = ":" -class = "Oceanic" -movement_cost = 1 -defense_bonus = 0 -food = 1 -shield = 0 -trade = 2 -;resources = "none" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 0 -irrigation_result = "no" -irrigation_food_incr = 0 -irrigation_time = 0 -mining_result = "no" -mining_shield_incr = 0 -mining_time = 0 -transform_result = "no" -transform_time = 0 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "no" -warmer_drier_result = "no" -cooler_wetter_result = "no" -cooler_drier_result = "no" -native_to = "Trireme", "Sea", "Air", "Balloon", "Missile", "Helicopter", "RiverShip", "Submarine", "AirProtect", "AirPillage", "Bomb" -flags = "NoCities", "NoPollution", "UnsafeCoast", "NoZoc", "NoFortify" -property_ocean_depth = 87 -color.r = 0 -color.g = 33 -color.b = 129 -helptext = _("\ -Deep oceans cover much of the world away from coastlines, and only\ - seaworthy units can travel on them.\ -") - -[terrain_arctic] -name = _("Arctic") -graphic = "arctic" -graphic_alt = "-" -identifier = "a" -class = "Land" -movement_cost = 2 -defense_bonus = 0 -food = 0 -shield = 0 -trade = 0 -resources = "Ivory", "Oil" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 4 -irrigation_result = "Tundra" -irrigation_food_incr = 0 -irrigation_time = 15 -mining_result = "yes" -mining_shield_incr = 2 -mining_time = 10 -transform_result = "Desert" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Tundra" -warmer_drier_result = "Tundra" -cooler_wetter_result = "no" -cooler_drier_result = "no" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "NoBarbs", "NoCities", "CanHaveRiver", "Oil", "Frozen" -property_frozen = 23 -color.r = 232 -color.g = 232 -color.b = 232 -helptext = _("\ -Arctic terrain is cold icy permafrost, found only in the far north or south.\ -"), _("\ - Oil wells can be built when Refining is known.\ -") - -[terrain_desert] -name = _("Desert") -graphic = "desert" -graphic_alt = "-" -identifier = "d" -class = "Land" -movement_cost = 1 -defense_bonus = 0 -food = 0 -shield = 1 -trade = 0 -resources = "Oasis", "Oil" -road_trade_incr_pct = 100 -base_time = 1 -road_time = 2 -irrigation_result = "yes" -irrigation_food_incr = 1 -irrigation_time = 5 -mining_result = "yes" -mining_shield_incr = 1 -mining_time = 5 -transform_result = "Plains" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Grassland" -warmer_drier_result = "no" -cooler_wetter_result = "Plains" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "CanHaveRiver", "Oil", "Low Land" -property_dry = 75 -property_tropical = 40 -property_temperate = 26 -color.r = 214 -color.g = 185 -color.b = 106 -helptext = _("\ -Deserts are very dry. Agriculture is difficult if not on a river or oasis. \ -"), _("\ -Oil wells can be built when Construction is known.\ -") - -[terrain_forest] -name = _("Forest") -graphic = "forest" -graphic_alt = "-" -identifier = "f" -class = "Land" -movement_cost = 2 -defense_bonus = 33 -food = 1 -shield = 2 -trade = 0 -resources = "Pheasant", "Silk" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 4 -irrigation_result = "Plains" -irrigation_food_incr = 0 -irrigation_time = 5 -mining_result = "Swamp" -mining_shield_incr = 0 -mining_time = 15 -transform_result = "Grassland" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Jungle" -warmer_drier_result = "Plains" -cooler_wetter_result = "Swamp" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "Starter", "CanHaveRiver", "Low Land" -property_cold = 35 -property_frozen = 7 -property_mountainous = 15 -property_wet = 30 -property_foliage = 50 -property_temperate = 50 -color.r = 43 -color.g = 107 -color.b = 19 -helptext = _("\ -Forests are densely wooded, providing lumber for production, but\ - making agriculture somewhat problematic.\ -") - -[terrain_grassland] -name = _("Grassland") -graphic = "grassland" -graphic_alt = "-" -identifier = "g" -class = "Land" -movement_cost = 1 -defense_bonus = 0 -food = 2 -shield = 0 -trade = 0 -resources = "Resources" -road_trade_incr_pct = 100 -base_time = 1 -road_time = 2 -irrigation_result = "yes" -irrigation_food_incr = 1 -irrigation_time = 5 -mining_result = "Forest" -mining_shield_incr = 0 -mining_time = 10 -transform_result = "Hills" -transform_time = 30 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Lake" -warmer_drier_result = "Desert" -cooler_wetter_result = "Arctic" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "Starter", "CanHaveRiver", "Low Land" -property_green = 50 -property_temperate = 50 -property_cold = 12 -property_dry = 10 -property_tropical = 20 -color.r = 11 -color.g = 138 -color.b = 4 -helptext = _("\ -Grassland affords exceptional agricultural opportunities.\ -") - -[terrain_hills] -name = _("Hills") -graphic = "hills" -graphic_alt = "-" -identifier = "h" -class = "Land" -movement_cost = 2 -defense_bonus = 100 -food = 1 -shield = 0 -trade = 0 -resources = "Coal", "Wine" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 4 -irrigation_result = "yes" -irrigation_food_incr = 1 -irrigation_time = 10 -mining_result = "yes" -mining_shield_incr = 3 -mining_time = 10 -transform_result = "Plains" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "no" -warmer_drier_result = "no" -cooler_wetter_result = "no" -cooler_drier_result = "no" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "Starter", "CanHaveRiver" -property_green = 50 -property_mountainous = 35 -property_cold = 35 -property_frozen = 20 -property_dry = 15 -color.r = 24 -color.g = 97 -color.b = 5 -helptext = _("\ -Hills are frequently rich in resources. Difficult access makes\ - them good for defense but poor for trade.\ -") - -[terrain_jungle] -name = _("Jungle") -graphic = "jungle" -graphic_alt = "-" -identifier = "j" -class = "Land" -movement_cost = 2 -defense_bonus = 50 -food = 1 -shield = 1 -trade = 0 -resources = "Gems", "Fruit", "Rubber" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 4 -irrigation_result = "Grassland" -irrigation_food_incr = 0 -irrigation_time = 8 -mining_result = "Forest" -mining_shield_incr = 0 -mining_time = 10 -transform_result = "Plains" -transform_time = 12 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Lake" -warmer_drier_result = "Desert" -cooler_wetter_result = "Swamp" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "CanHaveRiver", "Low Land" -property_foliage = 45 -property_tropical = 50 -property_wet = 45 -color.r = 55 -color.g = 156 -color.b = 38 -helptext = _("\ -Jungles are densely overgrown but sometimes provide rich resources and good defense.\ -") - -[terrain_mountains] -name = _("Mountains") -graphic = "mountains" -graphic_alt = "-" -identifier = "m" -class = "Land" -movement_cost = 3 -defense_bonus = 200 -food = 0 -shield = 1 -trade = 0 -resources = "Gold", "Iron" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 6 -irrigation_result = "no" -irrigation_food_incr = 0 -irrigation_time = 0 -mining_result = "yes" -mining_shield_incr = 1 -mining_time = 10 -transform_result = "Hills" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "no" -warmer_drier_result = "no" -cooler_wetter_result = "no" -cooler_drier_result = "no" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "CanHaveRiver" -property_mountainous = 65 -property_cold = 50 -color.r = 129 -color.g = 127 -color.b = 118 -helptext = _("\ -Mountains are regions of extreme altitude, excellent for defense but inferior\ - for trade and agriculture.\ -") - -[terrain_plains] -name = _("Plains") -graphic = "plains" -graphic_alt = "-" -identifier = "p" -class = "Land" -movement_cost = 1 -defense_bonus = 0 -food = 1 -shield = 1 -trade = 0 -resources = "Buffalo", "Wheat" -road_trade_incr_pct = 100 -base_time = 1 -road_time = 2 -irrigation_result = "yes" -irrigation_food_incr = 1 -irrigation_time = 5 -mining_result = "Forest" -mining_shield_incr = 0 -mining_time = 15 -transform_result = "Grassland" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Lake" -warmer_drier_result = "Desert" -cooler_wetter_result = "Arctic" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "Starter", "CanHaveRiver", "Low Land" -property_green = 50 -property_frozen = 5 -property_dry = 16 -property_cold = 28 -property_tropical = 10 -property_temperate = 50 -property_mountainous = 15 -color.r = 122 -color.g = 156 -color.b = 46 -helptext = _("\ -Plains are broad flat regions with decent potential for\ - agriculture, production, and trade.\ -") - -[terrain_swamp] -name = _("Swamp") -graphic = "swamp" -graphic_alt = "-" -identifier = "s" -class = "Land" -movement_cost = 2 -defense_bonus = 33 -food = 1 -shield = 0 -trade = 0 -resources = "Peat", "Spice" -road_trade_incr_pct = 0 -base_time = 1 -road_time = 4 -irrigation_result = "Grassland" -irrigation_food_incr = 0 -irrigation_time = 15 -mining_result = "Forest" -mining_shield_incr = 0 -mining_time = 15 -transform_result = "Lake" -transform_time = 12 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Lake" -warmer_drier_result = "Desert" -cooler_wetter_result = "Arctic" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "CanHaveRiver", "Low Land" -property_wet = 100 -property_frozen = 3 -property_tropical = 10 -property_temperate = 10 -property_cold = 17 -color.r = 48 -color.g = 85 -color.b = 97 -helptext = _("\ -Swamps suffer from an over-abundance of water, making agriculture\ - and trade problematic.\ -") - -[terrain_tundra] -name = _("Tundra") -graphic = "tundra" -graphic_alt = "-" -identifier = "t" -class = "Land" -movement_cost = 1 -defense_bonus = 0 -food = 1 -shield = 0 -trade = 0 -resources = "Game", "Furs", "Game", "Furs", "Gold" ; 40/40/20 instead of 33/33/33 -road_trade_incr_pct = 100 -base_time = 1 -road_time = 2 -irrigation_result = "yes" -irrigation_food_incr = 1 -irrigation_time = 5 -mining_result = "Desert" -mining_shield_incr = 0 -mining_time = 15 -transform_result = "Plains" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Lake" -warmer_drier_result = "Desert" -cooler_wetter_result = "Arctic" -cooler_drier_result = "no" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "Starter", "NoBarbs", "CanHaveRiver", "Low Land" -property_cold = 38 -property_frozen = 45 -color.r = 188 -color.g = 188 -color.b = 188 -helptext = _("\ -Tundra regions are cold and barren, only fit for mediocre agriculture and trade.\ -") - -; /* <-- avoid gettext warnings -; -; Resource types: -; -; The actual tag used (the * in [resource_*]) must be unique for each resource, -; and may be used in debug output when reading this file. -; -; Notes: -; -; extra = name of the extra this resource section is part of -; (must have "Resource" in its causes) -; identifier = single-character identifier used in old savegames. This -; must be unique for each resource, and changing it will -; break loading those old savegames. -; food = increased food production -; shield = increased shield production -; trade = increased trade production -; -; */ <-- avoid gettext warnings - -[resource_gold] -extra = "Gold" -identifier = "$" -trade = 8 -# mountains, tundra - -[resource_iron] -extra = "Iron" -identifier = "/" -shield = 3 -# mountains. - -[resource_game] -extra = "Game" -identifier = "e" -food = 2 -shield = 2 -# tundra. - -[resource_furs] -extra = "Furs" -identifier = "u" -food = 1 -shield = 1 -trade = 3 -# tundra - -[resource_coal] -extra = "Coal" -identifier = "c" -shield = 2 -# hills. - -[resource_fish] -extra = "Fish" -identifier = "y" -food = 2 -# ocean. - -[resource_fruit] -extra = "Fruit" -identifier = "f" -food = 4 -trade = 2 -# jungle. - -[resource_gems] -extra = "Gems" -identifier = "g" -trade = 5 -# jungle. - -[resource_rubber] -extra = "Rubber" -identifier = "^" -shield = 2 -trade = 2 -# jungle. - -; "h" reserved for strategic horses - -[resource_buffalo] -extra = "Buffalo" -identifier = "b" -shield = 2 -# plains (horses => buffalo => cattle). - -;[resource_forest_game] -;extra = "Deer" -;identifier = "d" -;food = 3 - -[resource_wheat] -extra = "Wheat" -identifier = "j" -food = 2 -# plains. - -; "k" reserved for (cane) sugar - -; "l" reserved for tobacco - -; "m" reserved for marble - -[resource_oasis] -extra = "Oasis" -identifier = "o" -food = 3 -# desert. - -[resource_peat] -extra = "Peat" -identifier = "a" -shield = 4 -# swamp (petroleum => peat => petroleum). - -[resource_pheasant] -extra = "Pheasant" -identifier = "p" -food = 2 -# forest, forested. - -; "r" reserved for rubber - -[resource_bonus] -extra = "Resources" -identifier = "r" -shield = 1 -# grassland. - -[resource_icy_ivory] -extra = "Ivory" -identifier = "i" -food = 1 -shield = 1 -trade = 4 -# arctic - -[resource_silk] -extra = "Silk" -identifier = "s" -trade = 3 -# forest - -[resource_spice] -extra = "Spice" -identifier = "t" -food = 2 -trade = 4 -# swamp-only. - -; "u" reserved for uranium - -[resource_whales] -extra = "Whales" -identifier = "v" -food = 1 -shield = 1 -# ocean (sea). - -[resource_wine] -extra = "Wine" -identifier = "w" -trade = 4 -# hills-only. - -[resource_oil] -extra = "Oil" -identifier = "x" -shield = 3 ; arctic used to have 4, now it's 3+2 allowing an 0 2 0 tile. -# arctic, desert - - -[extraui] -; Player visible names of the base gui types. -ui_name_base_fortress = _("?gui_type:Build Fort/Buoy") -ui_name_base_airbase = _("?gui_type:Build Airbase") - -; /* <-- avoid gettext warnings -; -; Each extra, including bases, roads, and resource, must have a section here. -; Bases, roads, and resources have additional sections for their specific features. -; -; -; Extra types: -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets -; etc; if not present, "name" is used for this -; purpose too. Since the name used in savegames must -; not change, if you want to rename an item after a -; ruleset has been released, you should set -; "rule_name" to the original value of "name". -; category = How UI should categorize this extra. One of -; "Infra", "Natural", "Nuisance", "Resource", -; or "Bonus" -; causes = events that can create extra type. -; "Irrigation", "Mine", "Hut", "Pollution", "Fallout", -; "Appear", "Resource", "Base", or "Road" -; (the last three require a corresponding -; [resource_*] / [base_*] / [road_*] section) -; rmcauses = events that can remove extra type. -; "CleanPollution", "CleanFallout", "Pillage", or -; "Disappear" -; graphic = tag specifying preferred graphic -; graphic_alt = tag for alternate graphic if preferred graphic is -; not present. Can use eg "-" for no alternate -; graphic -; activity_gfx = tag specifying graphic for unit building extra -; This can be "None" to indicate that graphic sprite -; is not needed. -; act_gfx_alt = tag for alternative graphic for unit building extra -; act_gfx_alt2 = tag for second alternative graphic for unit building extra -; rmact_gfx = tag specifying graphic for unit removing extra -; This can be "None" to indicate that graphic sprite -; is not needed. -; rmact_gfx_alt = tag for alternative graphic for unit removing extra -; reqs = requirements to build the extra (see effects.ruleset -; and README.effects for help on requirements) -; rmreqs = requirements to remove the extra -; appearance_reqs = spontaneous appearance requirements -; disappearance_reqs = spontaneous disappearance requirements -; visibility_req = Tech a player needs to have to see the extra -; This affects visibility only, for all the rules -; extra is still there even if player can't see it. -; buildable = Can extra be built? Defaults to TRUE if extra has -; any causes indicating it can result from worker -; activity. -; generated = Can map generator place the extra? Applicable -; for Hut, Resource, and River extras. -; build_time = how long it takes a unit to build this extra. -; Value of 0 (default) means that terrain- and -; build activity specific time is used instead. -; build_time_factor = This setting take effect only if build_time is 0. -; Terrain and activity specific build time will be -; multiplied by this value (default 1) -; removal_time = how long it takes a unit to remove this extra. -; Value of 0 (default) means that terrain- and -; removal activity specific time is used instead. -; removal_time_factor = This setting take effect only if removal_time is 0. -; Terrain and activity specific removal time will be -; multiplied by this value (default 1) -; defense_bonus = Percent added to defense when tile has the extra -; (default none) -; unit_seen = How opponents see units inside this extra -; "Normal" - Units are seen normally (default) -; "Hidden" - Units are hidden from opponents -; appearance_chance = If extra has cause "Appear" and other requirements -; for its appearance are fulfilled, this tells how big -; chance it has to appear each turn. The chance is 1/10000 -; times this value. -; disappearance_chance = If extra has rmcause "Disappear" and other requirements -; for its disappearance are fulfilled, this tells how big -; chance it has to disappear each turn. The chance is 1/10000 -; times this value. -; native_to = List of unit classes that are considered to -; be inside the extra when they are on same tile -; conflicts = List of extras that cannot be on the same tile. -; Bases with non-zero border_sq automatically conflict -; with each other. -; hidden_by = List of extra types that will make this extra -; type not to show on UI if both present. -; bridged_over = List of extra types that, if present in tile, will prevent -; building this extra if can't be bridged over -; flags -; - "NativeTile" = Native units consider tile native regardless of -; terrain -; - "Refuel" = Native units can use tile as refuel point -; - "TerrChangeRemoves" = Extra gets removed when ever terrain changes even -; if target terrain could support it -; - "AlwaysOnCityCenter" = City center tiles always have this extra type -; regardless of its other requirements -; - "AutoOnCityCenter" = City center tiles will automatically have this -; extra type if the player can build it -; - "ConnectLand" = Road style gfx on Oceanic tiles are drawn to -; connect to adjacent Land tiles even if they have -; no extra. This affects appearance only -; - "GlobalWarming" = Instances of this extra on map count towards -; Global Warming -; - "NuclearWinter" = Instances of this extra on map count towards -; Nuclear Winter -; - "ShowFlag" = Draw owner's flag -; - "NaturalDefense" = Extra's defense bonus will be counted to "Natural" -; defense layer. The defense bonus of all the extras -; located at the tile, native to defending unit, -; is calculated as a 1 + sum of bonuses from the extras -; on the default "Fortification" defense layer multiplied -; by the 1 + sum of bonuses from the extras on the -; "Natural" layer. -; - "NoStackDeath" = Units inside do not die all at once when attacked -; helptext = optional help text string; should escape all raw -; newlines so that xgettext parsing works -; -; */ <-- avoid gettext warnings - -[extra_irrigation] -name = _("Irrigation") -category = "Infra" -causes = "Irrigation" -rmcauses = "Pillage" -graphic = "tx.irrigation" -graphic_alt = "-" -activity_gfx = "unit.irrigation" -act_gfx_alt = "unit.irrigate" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -build_time = 0 -removal_time = 0 -conflicts = "Mine", "Oil Well" -hidden_by = "Farmland" -helptext = _("\ -Irrigating a suitable tile causes it to produce extra food each turn. Most\ - tiles yield +1 extra food. A desert river that does not already benefit\ - from an oasis will yield +2, or +3 if it is a city on a desert river.\ -"), _("\ -Irrigating a tile with a mine or oil well will destroy it.\ -"), _("\ -City center tiles get their terrain irrigation bonus automatically, \ -if there is no conflicting mine or oil well on the tile; however, \ -this does not make cities count as a water source for further \ -irrigation. Irrigation can be built on the city tile simply to allow \ -irrigating elsewhere, but will not give the tile any further bonus \ -except in the case of a desert river (see above.)\ -") - -[extra_mine] -name = _("Mine") -category = "Infra" -causes = "Mine" -rmcauses = "Pillage" -graphic = "tx.mine" -graphic_alt = "-" -activity_gfx = "unit.mine" -act_gfx_alt = "unit.plant" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "TerrainFlag", "Oil", "Local", FALSE, TRUE - } -build_time = 0 -removal_time = 0 -conflicts = "Irrigation", "Farmland" -helptext = _("\ -Mines can be built on some types of terrain, which increases the \ -number of production points produced by that tile. Hills get an extra \ -3 production points per tile; other terrains get 1 extra production \ -point.\ -"), _("\ -Building a mine on an irrigated tile will destroy the irrigation.\ -") - -[extra_oil_well] -name = _("Oil Well") -category = "Infra" -causes = "Mine" -rmcauses = "Pillage" -graphic = "tx.oil_mine" -graphic_alt = "tx.mine" -activity_gfx = "unit.oil_mine" -act_gfx_alt = "unit.mine" -act_gfx_alt2 = "unit.plant" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "quiet" - "TerrainFlag", "Oil", "Local", TRUE - } -build_time = 0 -removal_time = 0 -conflicts = "Irrigation", "Farmland" -helptext = _("\ -Oil wells behave like mines (giving an extra production point), but \ -require more technology. Oil wells can be built on Desert with knowledge \ -of Construction, and on Arctic terrain with knowledge of Refining.\ -"), _("\ -Building an oil well on an irrigated tile will destroy the irrigation.\ -") - -[extra_pollution] -name = _("Pollution") -category = "Nuisance" -causes = "Pollution" -rmcauses = "CleanPollution" -graphic = "tx.pollution" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "unit.pollution" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "TerrainFlag", "NoPollution", "Local", FALSE, TRUE - } -removal_time = 0 -flags = "GlobalWarming" -helptext = _("\ -Pollution appears on land tiles around cities with high production or \ -population. \ -It halves all output from its tile, and contributes to the risk of \ -global warming.\ -"), _("\ -The pollution can only be cleared by dispatching Workers, \ -Settlers, or Engineers with the \"clean pollution\" order.\ -"), _("\ -Pollution from production is likely to start becoming important as \ -your civilization becomes more industrialized, giving you buildings \ -such as Factory and Power Plant which boost production. Replacing a \ -Power Plant with cleaner forms of energy -- a Hydro Plant / Hoover \ -Dam, Nuclear Plant, or Solar Plant -- will reduce pollution from \ -production, as will a Recycling Center or knowledge of \ -Environmentalism.\ -"), _("\ -The city population starts adding to pollution with the discovery of \ -Industrialization, and Automobile, Mass Production, and Plastics make \ -this worse. Building a Mass Transit in a city eliminates the \ -populational contribution to pollution.\ -"), _("\ -The contribution of these factors can be seen in the city dialog; once \ -it exceeds a threshold, the excess is the percent chance of pollution \ -appearing each turn.\ -"), _("\ -When an unused tile becomes polluted, there is the temptation to avoid \ -the effort of cleaning it; but the spread of pollution has far more \ -terrible results than the immediate economic impact -- every polluted \ -tile increases the chance of global warming. Each time global warming \ -advances, the entire world loses coastal land to the sea and to jungles \ -and swamps, and inland tiles are lost to desert. This tends to \ -devastate cities and leads to global impoverishment.\ -"), _("\ -The risk of global warming is cumulative; the longer polluted tiles \ -are left uncleaned, the higher the risk becomes, and the risk can \ -linger for some time even after all pollution has been cleaned. If a \ -long time passes with an elevated risk of warming, its effects will be \ -all the more severe when it does occur.\ -") - -[extra_hut] -name = _("Minor Tribe Village") -rule_name = "Hut" -category = "Bonus" -causes = "Hut" -;rmcauses = "" -graphic = "tx.village" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range" - "TerrainClass", "Land", "Local" - } -helptext = _("\ -Villages (also called \"huts\") are primitive communities spread \ -across the world at the beginning of the game. Any land unit can enter \ -a village, making the village disappear and deliver a random response. \ -If the village proves hostile, it could produce barbarians or the unit \ -entering may simply be destroyed. If they are friendly, the player \ -could receive gold, a new technology, a military unit (occasionally a \ -settler; and sometimes a unit that the player cannot yet create), or \ -even a new city.\ -"), _("\ -Later in the game, helicopters may also enter villages, but overflight \ -by other aircraft will cause the villagers to take fright and disband.\ -") - -[extra_farmland] -name = _("Farmland") -category = "Infra" -causes = "Irrigation" -rmcauses = "Pillage" -graphic = "tx.farmland" -graphic_alt = "-" -activity_gfx = "unit.farmland" -act_gfx_alt = "unit.irrigation" -act_gfx_alt2 = "unit.irrigate" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range" - "Tech", "Refrigeration", "Player" - "Extra", "Irrigation", "Local" - } -build_time = 0 -removal_time = 0 -conflicts = "Mine", "Oil Well" -helptext = _("\ -Once Refrigeration is known, irrigation systems can be upgraded to \ -farmland by irrigating them a second time; if the city working the tile \ -has a Supermarket, a farmland tile provides twice as much food.\ -"), _("\ -Like irrigation, farmland is incompatible with mines and oil wells.\ -") - -[extra_fallout] -name = _("Fallout") -category = "Nuisance" -causes = "Fallout" -rmcauses = "CleanFallout" -graphic = "tx.fallout" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "unit.fallout" -rmact_gfx_alt = "unit.pollution" -reqs = - { "type", "name", "range", "present", "quiet" - "TerrainFlag", "NoPollution", "Local", FALSE, TRUE - } -removal_time = 0 -flags = "NuclearWinter" -helptext = _("\ -Nuclear fallout can appear on land tiles when a Nuclear unit is \ -detonated. It halves all output from its tile.\ -"), _("\ -Every tile with nuclear fallout also increases the risk of global \ -nuclear winter. If nuclear winter occurs, land across the globe \ -changes into desert, tundra, and ice, and lakes and oceans freeze.\ -"), _("\ -Settlers, Workers, and Engineers can clean up nuclear fallout.\ -") - -; ***************************** BASES **************************************** -[extra_hideout] -rule_name = "Hideout" -name = _("") ; null name is to prevent awareness of it. -category = "Infra" -causes = "Base" -rmcauses = "Pillage", "Disappear" -graphic = "None" -graphic_alt = "None" -activity_gfx = "unit.hideout" -act_gfx_alt = "unit.buoy" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range","present","quiet" - "CityTile","Center", "Local", FALSE, TRUE - "Terrain", "Hills", "Local", FALSE, FALSE - "Terrain", "Plains", "Local", FALSE, FALSE - "Terrain", "Grassland", "Local", FALSE, FALSE - "Terrain", "Tundra", "Local", FALSE, FALSE - "Terrain", "Desert", "Local", FALSE, FALSE - "Terrain", "Arctic", "Local", FALSE, FALSE - "Tech", "Warrior Code", "Player",TRUE, FALSE - "TerrainClass","Land", "Local", TRUE, FALSE - "UnitFlag","CanHide", "Local", TRUE, FALSE - "Extra", "Naval Base","Local", FALSE, FALSE - "Extra", "Fortress", "Local", FALSE, FALSE - "Extra", "Airbase", "Local", FALSE, FALSE - "Extra", "Fort", "Local", FALSE, FALSE - "Extra", "Quay", "Local", FALSE, FALSE - "ServerSetting","hideouts","World",TRUE, FALSE - } -disappearance_reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - "Extra", "Ruins","Local", FALSE - } -disappearance_chance = 1500 ; 1500/10000 = 15% per turn if unoccupied -build_time = 3 -removal_time = 0 -unit_seen = "Hidden" -native_to = "Land", "LandAirSea", "LandNoKill", "Helicopter" -flags = "NativeTile" -helptext = _("\ -Since the dawn of time, camouflaged and concealed terrain has been\ - enhanced to make Hideouts. Usually the intent is to evade an\ - aggressor or to set an ambush. Hideouts can only be put in Forests,\ - Swamps, Mountains, and Jungle. Warrior Code must be known. Tile must\ - be Friendly or Unclaimed. Only Foot soldiers can make Hideouts. Only\ - Land units and Helicopters can hide in them. Other types will be seen.\ - Invisibility is the only bonus of a Hideout. Hideouts can't stack with\ - other bases. Hideouts are invisible to anyone not occupying the tile with\ - a Land unit. For each turn it is unoccupied, a Hideout has a 15% chance\ - of being lost to the elements of nature. The only way to know if there is\ - a Hideout on a tile is to move a Land unit onto it.\ -"), _(" -TIP: Hideouts are good for guarding a border or setting a trap for\ - intruders. Be careful! An abandoned Hideout can be used against you!\ -") - -[extra_fort] -name = _("Fort") -category = "Infra" -causes = "Base" -rmcauses = "Pillage" -graphic = "base.outpost" -graphic_alt = "base.fortress" -activity_gfx = "unit.outpost" -act_gfx_alt = "unit.fortress" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Masonry", "Player", TRUE, FALSE - "TerrainClass", "Land", "Local", TRUE, FALSE - "UnitFlag", "CanFortress", "Local", TRUE, FALSE - "CityTile", "Center", "Local", FALSE, TRUE - "Extra", "Hideout", "Local", FALSE, FALSE - } -build_time = 3 -removal_time = 0 -native_to = "Land", "LandAirSea", "LandNoKill", "Helicopter", "Balloon", "AirProtect" -hidden_by = "Fortress", "Naval Base" -flags = "NativeTile", "NoStackDeath" ;, "Refuel" -;NOTE: effect_fortress_regen should give 25% of 20HP to helicopter, +1hp for being stationary -;thus a fortress should give +6hp -2hp for not being in refuel spot or +4hp/turn. Healing 67% -;as fast as an airbase. MEANWHILE, removing the refuel flag allows us to make Forts native -;to AirProtect so that they cannot prevent attacks on forts. This is debatable issue of -;Fort with no Killstack but not Airprotected vs no fort, Killstack and Airprotect, but -;many times fighters over forts have come up as a dynamic. -helptext = _("\ -Forts are rapidly built fortifications which give Land units +33% defense\ - against Land and Sea units. Defending units are lost one at a time instead\ - of the entire stack dying. A fort is necessary to start building a fortress.\ -"), _(" -TIP: Forts make great outposts for keeping watch on your borders. Be careful--\ -an unmanned Fort can be claimed by a foreign unit.\ -") - -[extra_fortress] -name = _("Fortress") -category = "Infra" -causes = "Base" -rmcauses = "Pillage" -graphic = "base.fortress" -graphic_alt = "-" -activity_gfx = "unit.fortress" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "Extra", "Fort", "Local", TRUE, FALSE - "Extra", "Hideout", "Local", FALSE, FALSE - "Tech", "Construction", "Player", TRUE, FALSE - "TerrainClass", "Land", "Local", TRUE, FALSE - "UnitFlag", "CanFortress", "Local", TRUE, FALSE - "CityTile", "Center", "Local", FALSE, TRUE - } -build_time = 5 -removal_time = 0 -defense_bonus = 67 -native_to = "Land", "LandAirSea", "LandNoKill", "Helicopter", "Balloon" -hidden_by = "Naval Base" -flags = "NativeTile", "Refuel", "NoStackDeath" -helptext = _("\ -Fortresses are improvements built on top of Forts which greatly improve defense.\ - A Land unit remaining in a fortress for a whole turn without moving recovers a\ - quarter of its hit points. With Invention, fortresses gain watchtowers from which\ - land units can see farther.\ -"), _("\ -Units in a Fortress die one at a time instead of the entire stack being lost.\ -Diplomatic units get a 25% defense bonus in diplomatic fights.\ -") - -[extra_navalbase] -name = _("Naval Base") -category = "Infra" -causes = "Base" -rmcauses = "Pillage" -graphic = "base.navalbase" -graphic_alt = "base.fortress" -activity_gfx = "unit.navalbase" -act_gfx_alt = "unit.fortress" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "Extra", "Fort", "Local", TRUE, FALSE - "Extra", "Hideout", "Local", FALSE, FALSE - "Tech", "Engineering", "Player", TRUE, FALSE - "TerrainFlag", "Low Land", "Local", TRUE, FALSE - "TerrainClass", "Oceanic", "CAdjacent", TRUE, FALSE - "UnitFlag", "CanFortress", "Local", TRUE, FALSE - "CityTile", "Center", "Local", FALSE, TRUE - } -build_time = 10 -removal_time = 0 -conflicts = "Airbase", "Fortress" -defense_bonus = 67 -native_to = "Trireme", "RiverShip", "Sea", "Submarine", "Balloon", - "Land", "LandAirSea", "LandNoKill", "Helicopter" -flags = "NativeTile", "NoStackDeath", "Refuel" -helptext = _("\ -Naval bases are coastal Fortresses with ocean access. They allow ships to enter and\ - receive a 1.33x bonus from superior fortifications and defensive position. Naval\ - Bases are built into Fortresses--all other units get the benefits of a Fortress.\ -"), _(" -NOTE: Naval bases are the only location where ships can be sure to avoid stack death without\ - suffering a defense disadvantage.\ -") - -[extra_airbase] -name = _("Airbase") -category = "Infra" -causes = "Base" -rmcauses = "Pillage" -graphic = "base.airbase" -graphic_alt = "-" -activity_gfx = "unit.airbase" -act_gfx_alt = "unit.fortress" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Radio", "Player", TRUE, FALSE - "Extra", "Hideout", "Local", FALSE, FALSE - "TerrainClass", "Land", "Local", TRUE, FALSE - "UnitFlag", "Airbase", "Local", TRUE, FALSE - "CityTile", "Center", "Local", FALSE, TRUE - } -build_time = 3 -removal_time = 0 -native_to = "Air", "Balloon", "Helicopter", "Missile", "Bomb", "AirProtect", "AirPillage" -flags = "Refuel", "NoStackDeath" -helptext = _("\ -Airbases allow your air units to land and refuel outside cities. \ -Air units in an airbase may be attacked by land units.\ -"), _("\ -Units can paradrop from this tile.\ -") - -[extra_radar] -name = _("Radar") -category = "Infra" -causes = "Base" -rmcauses = "Pillage" -graphic = "base.airbase" -graphic_alt = "-" -activity_gfx = "unit.radar" -act_gfx_alt = "unit.airbase" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Radar", "Player", TRUE, FALSE - "Extra", "Hideout", "Local", FALSE, FALSE - "Extra", "Airbase", "Local", TRUE, FALSE - "TerrainClass", "Land", "Local", TRUE, FALSE - "UnitFlag", "Airbase", "Local", TRUE, FALSE - "CityTile", "Center", "Local", FALSE, TRUE - } -build_time = 5 -removal_time = 0 -native_to = "Air", "Balloon", "Helicopter", "Missile", "Bomb", "AirProtect", "AirPillage" -flags = "Refuel", "NoStackDeath" -helptext = _("\ -With the available tech, Radar can be added to an Airbase, which significantly increases its vision.\ -") - -[extra_buoy] -name = _("Buoy") -category = "Infra" -causes = "Base" -rmcauses = "Pillage" -graphic = "base.buoy" -graphic_alt = "base.fortress" -activity_gfx = "unit.buoy" -act_gfx_alt = "unit.fortress" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Radio", "Player", TRUE, FALSE - "TerrainClass", "Oceanic", "Local", TRUE, FALSE - "UnitFlag", "Airbase", "Local", TRUE, FALSE - "CityTile", "Center", "Local", FALSE, TRUE - } -build_time = 3 -removal_time = 0 -flags = "ShowFlag" -helptext = _("\ -Buoys may be built in the ocean (by units on a sea-going vessel) to \ -allow their owner to see the surrounding tiles.\ -") - -[extra_ruins] -name = _("Ruins") -category = "Bonus" -;causes = "" -rmcauses = "Pillage" -graphic = "extra.ruins" -graphic_alt = "base.ruins" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "TerrainClass", "Land", "Local", TRUE, FALSE - "CityTile", "Center", "Local", FALSE, TRUE - } -buildable = FALSE -removal_time = 0 -flags = "TerrChangeRemoves" -helptext = _("\ -Ruins mark the former site of a city that was destroyed or abandoned.\ -") - -[extra_quay] -name = _("Quay") -category = "Infra" -causes = "Road" -rmcauses = "Pillage" -graphic = "base.quay" -graphic_alt = "base.fort" -activity_gfx = "unit.quay" -act_gfx_alt = "unit.outpost" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" -; "Extra", "River", "Local", TRUE, FALSE - "ExtraFlag", "Quayable", "Local", TRUE, FALSE - "Tech", "Pottery", "Player",TRUE, FALSE - "TerrainClass","Land", "Local", TRUE, FALSE - "UnitFlag", "CanFortress","Local", TRUE, TRUE - "Extra", "Hideout", "Local", FALSE, TRUE - } -build_time = 3 -removal_time = 0 -native_to = "Land", "LandAirSea", "LandNoKill", "Trireme", "Balloon", "RiverShip" -;hidden_by = "" -flags = "NativeTile", "AutoOnCityCenter" -helptext = _("\ -Quays are structures on both sides of rivers, where boats dock parallel to the\ - river bank for quick loading and unloading. River traffic can directly offload\ - onto nearby roads and be underway. Quays also have built-in infrastructure to ferry\ - units across a river——the ancient way to cross rivers before the advent of Bridge\ - Building. Stepping from a road onto a Quay uses a full move point: the time needed\ - to load up and use its infrastructure. Any unit already on a Quay can immediately\ - step onto connecting roads at no penalty. (Cargo units must first be unloaded by\ - the transport carrying them.)\ -"), _(" -TIP: Quays can boost transportational logistics for ancient civilisations who have\ - built on rivers. Don't be tempted to make too many Quays. The unloading and movement\ - bonus is often the extra edge an enemy needs for an effective surprise attack.\ -"), _("Moves needed to cross a river to a tile on the other side:\n -⁶⁄₃ moves: No infrastructure.\n\ -⁴⁄₃ moves: Quay connected to roads.\n\ -2⁄₃ moves: Bridge connected to roads.\n\ -") - -[extra_road] -name = _("Road") -category = "Infra" -causes = "Road" -rmcauses = "Pillage" -graphic = "road.road" -graphic_alt = "-" -activity_gfx = "unit.road" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range" - "UnitFlag", "CanRoad", "Local" - "TerrainClass", "Land", "Local" - } -build_time = 0 -removal_time = 0 -native_to = "Land", "LandNoKill", "LandAirSea" -hidden_by = "Railroad", "Maglev", "Naval Base" -flags = "AutoOnCityCenter" -bridged_over = "River" -helptext = _("\ -Roads allow your land units to move more quickly, and on some terrain,\ - also provide a trade bonus.\ -"), _("\ -Building roads on river tiles requires knowledge of Bridge Building.\ - City center tiles automatically get roads (unless they are on a river\ - tile and you do not yet know Bridge Building).\ -") - -[extra_railroad] -name = _("Railroad") -category = "Infra" -causes = "Road" -rmcauses = "Pillage" -graphic = "road.rail" -graphic_alt = "-" -activity_gfx = "unit.rail" -act_gfx_alt = "unit.road" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range" - "Tech", "Railroad", "Player" - "Extra", "Road", "Local" - "UnitFlag", "CanRoad", "Local" - "TerrainClass", "Land", "Local" - } -build_time = 3 -removal_time = 0 -native_to = "Land", "LandNoKill", "LandAirSea" -hidden_by = "Maglev", "Naval Base" -flags = "AutoOnCityCenter" -bridged_over = "River" -helptext = _("\ -Once you learn Railroad technology, you may upgrade your roads to\ - railroads. Units travel three times faster along railroads than\ - along roads.\ -"), _("\ -A railroad also increases any shield resources produced by a tile.\ - A tile whose road is upgraded to a railroad retains any trade bonus\ - from the road as well.\ -"), _("\ -City center tiles with roads are automatically upgraded to railroads\ - when you learn the Railroad technology.\ -") - -[extra_maglev] -name = _("Maglev") -category = "Infra" -causes = "Road" -rmcauses = "Pillage" -graphic = "road.maglev" -graphic_alt = "road.rail" -activity_gfx = "unit.maglev" -act_gfx_alt = "unit.road" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Superconductors", "Player", TRUE, FALSE -; "Extra", "Railroad", "Local", TRUE, FALSE - "UnitFlag", "CanRoad", "Local", TRUE, FALSE -; "UnitClass", "Sea", "Local", FALSE, TRUE -; "TerrainClass", "Land", "Local", TRUE, FALSE - } -build_time = 3 -removal_time = 0 -native_to = "Land", "LandNoKill", "LandAirSea" -hidden_by = "Naval Base" -flags = "NativeTile", "AutoOnCityCenter" -helptext = _("\ -With Superconductors, you may build MAGnetic LEVitation tracks\ - on your railroad routes. Land units expend no movement points\ - when riding a MagLev; you may ride indefinitely.\ -"), _("\ -City center tiles with railroads are automatically upgraded to MagLev\ - when you learn about Superconductors.\ -") - -[extra_river] -name = _("River") -category = "Infra" ;TEST for well-digger -causes = "Road" -;rmcauses = "" -graphic = "road.river" -graphic_alt = "-" -activity_gfx = "unit.canal" -act_gfx_alt = "unit.oil_mine" -act_gfx_alt2 = "unit.road" -rmact_gfx = "None" -rmact_gfx_alt = "-" -buildable = TRUE -generated = TRUE -defense_bonus = 33 -reqs = - { "type", "name", "range", "present" - "TerrainClass", "Land", "Local", TRUE - "Tech", "Pottery", "Player", FALSE - "Tech", "Alphabet","Player", FALSE - "Tech", "Writing", "World", FALSE - "UnitFlag", "Well-Digger", "Local", TRUE - "Age", "10", "Local", FALSE - } -build_time = 2 -removal_time = 0 -flags = "NativeTile", "Quayable", "IrrigationSource" -native_to = "Land", "LandNoKill", "LandAirSea", "Trireme", "RiverShip" -helptext = _("\ -Any land terrain type may have a River on it. A River adds 1\ - trade to the resources produced by that tile. It also increases the tile\ - defense factor by 50%. Finally, land units may move along a River (but\ - not diagonally) for fast travel.\ -"), _("\ -Roads, railroads and MagLev can only be built on River tiles if your\ - civilization has learned Bridge Building technology.\ -") - -[extra_canal] -name = _("Canal") -category = "Infra" -causes = "Road" -rmcauses = "Pillage" -graphic = "road.canal" -graphic_alt = "road.river" -activity_gfx = "unit.canal" -act_gfx_alt = "unit.convert" -act_gfx_alt2 = "unit.airstrip" -rmact_gfx = "None" -rmact_gfx_alt = "-" -generated = FALSE -reqs = - { "type", "name", "range", "present" - "TerrainFlag", "Low Land", "Local", TRUE - "TerrainClass", "Oceanic", "Adjacent", TRUE - "Tech", "Engineering", "Player", TRUE - "UnitFlag", "CanRoad", "Local", TRUE - } -build_time = 10 -removal_time = 0 -native_to = "Trireme", "Sea", "RiverShip", "Land", "LandAirSea", "LandNoKill", "Helicopter", "Submarine" -flags = "NativeTile", "Quayable" -helptext = _("\ -Canals allow ships to travel through land tiles. Canals can be built on \ -low land tiles only, and not far inland.\ -") -[extra_canal2] -name = _("Waterway") -category = "Infra" -causes = "Road" -rmcauses = "Pillage" -graphic = "road.canal" -graphic_alt = "road.river" -activity_gfx = "unit.canal" -act_gfx_alt = "unit.convert" -act_gfx_alt2 = "unit.airstrip" -rmact_gfx = "None" -rmact_gfx_alt = "-" -generated = FALSE -reqs = - { "type", "name", "range", "present" - "TerrainFlag", "Low Land", "Local", TRUE - "Extra", "River", "Adjacent", TRUE - "Tech", "Engineering", "Player", TRUE - "UnitFlag", "CanRoad", "Local", TRUE - } -build_time = 10 -removal_time = 0 -native_to = "Trireme", "Sea", "RiverShip", "Land", "LandAirSea", "LandNoKill", "Helicopter", "Submarine" -flags = "NativeTile", "Quayable" -helptext = _("\ -Waterways are navigational channels that connect canals with rivers. Essentially, they're the same as canals.\ -") - -[extra_gold] -name = _("Gold") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.gold" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_iron] -name = _("Iron") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.iron" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_game] -name = _("?animals:Game") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.tundra_game" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_furs] -name = _("Furs") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.furs" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_coal] -name = _("Coal") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.coal" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_fish] -name = _("Fish") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.fish" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_fruit] -name = _("Fruit") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.fruit" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_gems] -name = _("Gems") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.gems" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_rubber] -name = _("Rubber") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.rubber" -graphic_alt = "ts.peat" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_buffalo] -name = _("Buffalo") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.buffalo" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -;[extra_forest_game] ; cant do disappearing resource until server fix -;name = _("Deer") -;category = "Resource" -;causes = "Resource", "Appear" -;rmcauses = "Disappear" -;graphic = "ts.forest_game" -;graphic_alt = "-" -;activity_gfx = "None" -;act_gfx_alt = "-" -;act_gfx_alt2 = "-" -;rmact_gfx = "None" -;rmact_gfx_alt = "-" -;disappearance_chance = 500 -;disappearance_reqs = -; { "type", "name", "range" -; } -;appearance_chance = 500 -;appearance_reqs = -; { "type", "name", "range", "present" -; "Terrain", "Forest", "Local" -; } - -[extra_wheat] -name = _("Wheat") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.wheat" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_oasis] -name = _("Oasis") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.oasis" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_peat] -name = _("Peat") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.peat" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_pheasant] -name = _("Pheasant") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.pheasant" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_bonus] -name = _("Resources") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.grassland_resources" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_ivory] -name = _("Ivory") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.arctic_ivory" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_silk] -name = _("Silk") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.silk" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_spice] -name = _("Spice") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.spice" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_whales] -name = _("Whales") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.whales" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_wine] -name = _("Wine") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.wine" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -[extra_oil] -name = _("Oil") -category = "Resource" -causes = "Resource" -;rmcauses = "" -graphic = "ts.oil" -graphic_alt = "-" -act_gfx_alt2 = "-" -activity_gfx = "None" -act_gfx_alt = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" - -; /* <-- avoid gettext warnings -; -; Base types: -; -; extra = name of the extra this base section is part of -; (must have "Base" in its causes) -; gui_type = How gui should handle this base. -; Value can be "Fortress", "Airbase", or "Other" -; border_sq = Base will claim land ownership up to this radius, -; -1 to disable. If enabled, base cannot exist in city tile. -; vision_main_sq = Base will have main layer vision to this radius -; vision_invis_sq = Base will have invisible layer vision to this radius -; vision_subs_sq = Base will have subsurface layer vision to this radius -; flags -; - "NoAggressive" = Units inside are not considered aggressive if there`s -; friendly city within 3 tiles -; -; */ <-- avoid gettext warnings - -[base_hideout] -extra = "Hideout" -gui_type = "Other" -border_sq = -1 -vision_main_sq = 2 - -[base_fort] -extra = "Fort" -gui_type = "Fortress" -border_sq = -1 -vision_main_sq = 4 - -[base_fortress] -extra = "Fortress" -gui_type = "Fortress" -border_sq = 4 -vision_main_sq = 4 -flags = "NoAggressive" - -[base_airbase] -extra = "Airbase" -gui_type = "Airbase" - -[base_radar] -extra = "Radar" -gui_type = "Airbase" -vision_main_sq = 30 - -[base_buoy] -extra = "Buoy" -gui_type = "Fortress" -vision_main_sq = 5 - -[base_navalbase] -extra = "Naval Base" -gui_type = "Fortress" -border_sq = 3 ;this may be causing the nationality flip behaviour for allies co-occupying -vision_main_sq = 6 -vision_subs_sq = 4 -flags = "NoAggressive" - - -; /* <-- avoid gettext warnings -; -; Road types: -; -; extra = name of the extra this road section is part of -; (must have "Road" in its causes) -; first_reqs = additional requirements to build the first part of -; the road, when none of the adjacent tiles have any -; integrating roads (see effects.ruleset and -; README.effects for help on requirements) -; move_cost = how much movement it takes to travel -; via this road (in fractional move points, as -; defined by move_fragments) -; -1 means that road provides no speed bonus. -; move_mode = how movement costs are applied -; - "Cardinal" = Road cost applies only on cardinal moves -; - "Relaxed" = Road cost is normal for cardinal, double for diagonal moves -; - "FastAlways" = Road cost applies always between two tiles with the roads -; (default) -; food_incr_const = food production added to tile regardless of terrain -; shield_incr_const = shield production added to tile regardless of -; terrain -; trade_incr_const = trade production added to tile regardless of -; terrain -; food_incr = food production added to tile; multiplied by -; terrain-specific road_food_incr_pct -; shield_incr = shield production added to tile; multiplied by -; terrain-specific road_shield_incr_pct -; trade_incr = trade production added to tile; multiplied by -; terrain-specific road_trade_incr_pct -; food_bonus = percent added to food production -; shield_bonus = percent added to shield production -; trade_bonus = percent added to trade production -; In summary, output bonuses from roads are given by the formula: -; (base_prod + roads.incr_const + roads.incr*terrain.incr_pct) * roads.bonus -; compat_special = what kind of pre-2.5 special this road corresponds -; to, if any: "Road", "Railroad", "River", or "None". -; Used for UI and loading old savegames -; integrates = list of road types that are suitable next steps -; for travel from this road type -; flags -; - "River" = Automatically generated by map generator, always -; flowing from land tiles to ocean -; - "UnrestrictedInfra" = Use of the enemy owned road is not restricted -; even if server setting 'restrictinfra' is set -; - "JumpFrom" = Move to a tile nativity providing "JumpTo" -; road is considered native -; - "JumpTo" = Move from a tile nativity providing "JumpFrom" -; road is considered native -; -; */ <-- avoid gettext warnings - -[road_road] -extra = "Road" -move_cost = 3 -food_incr = 0 -shield_incr = 0 -trade_incr = 1 -food_bonus = 0 -shield_bonus = 0 -trade_bonus = 0 -integrates = "Quay" -compat_special = "Road" -flags = "UnrestrictedInfra" - -[road_quay] -extra = "Quay" -move_cost = 9 -food_incr = 0 -shield_incr = 0 -trade_incr = 0 -food_bonus = 0 -shield_bonus = 0 -trade_bonus = 0 -integrates = "Road" -flags = "UnrestrictedInfra" - -[road_railroad] -extra = "Railroad" -move_cost = 1 -food_incr = 0 -shield_incr = 0 -trade_incr = 0 -food_bonus = 0 -shield_bonus = 50 -trade_bonus = 0 -compat_special = "Railroad" - -[road_maglev] -extra = "Maglev" -move_cost = 0 -food_incr = 0 -shield_incr = 0 -trade_incr = 0 -food_bonus = 0 -shield_bonus = 0 -trade_bonus = 0 - -[road_river] -extra = "River" -move_cost = 3 -move_mode = "Cardinal" -trade_incr_const = 1 -compat_special = "River" -integrates = "Canal", "Waterway" -flags = "River", "UnrestrictedInfra" - -[road_canal] -extra = "Canal" -move_cost = 9 -move_mode = "Cardinal" -integrates = "River", "Waterway" -compat_special = "None" - -[road_waterway] -extra = "Waterway" -move_cost = 9 -move_mode = "Cardinal" -integrates = "River", "Canal" -compat_special = "None" diff --git a/freeciv/freeciv/data/maptest/units.ruleset b/freeciv/freeciv/data/maptest/units.ruleset deleted file mode 100644 index ee6914dba..000000000 --- a/freeciv/freeciv/data/maptest/units.ruleset +++ /dev/null @@ -1,4149 +0,0 @@ -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes, -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. -; -; You should sort role units from worst to better, as often the best -; available role unit of a given sort will be picked by choosing -; the first available (not obsolete) such unit, or by picking the last -; such unit directly. When determining starting units, the first -; unit with the relevant role that the player can build will be chosen. -; If no such unit can be found (eg Explorers that require Seafaring), -; then the first unit with this role will be chosen. - -[datafile] -description="Unit definitions for the Avant-garde ruleset." -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -[control] -; Names for custom unit type flags. There can be up to 45 of these. -; name = rule name; In some circumstances user may see this -; as part of some sentences, so try to make it descriptive -; and sensible. -; helptxt = displayed in the help for unit types with this flag (optional) -; ************** ANTYHING WHICH CHANGES THE SEQUENCE OR NUMBER OF THE USER CUSTOM FLAGS BELOW SHOULD BE -; ************** MADE COMPATIBLE BETWEEN MP+ AND MP2 RULESETS AND POSSIBLY CLASSIC AND CIV2CIV3 SO THAT -; ************** THERE IS UNIFORMITY IN FCW CLIENT which checks these flags based on index #. Not keeping -; ************** uniformity results in loss of features as ability to check these flags would be lost. -flags = - { "name", "helptxt" - _("Airbase") - _("Transform"), _("Can do advanced Terrain transformations.") - _("CanRoad"), _("Able to build Roads.") - _("CanFortress"), _("Can build Forts and Fortresses") - _("Bombarder"), _("Can safely conduct Ranged Attacks.") - _("AirAttacker"), _("Anti-Air units have a defense bonus against this unit.") - _("Horse"), _("Attack value halved when attacking Pikemen.\n\ -➤ Knights defend at 3 when attacked by this unit.") - _("FootSoldier"), _("Knights defend at 2 when attacked by this unit.") - _("Helicopter"), _("Loses 1hp for every turn in the air.\n\ -➤ Gets +1 move point if starting its turn in a City or Airbase.") - _("Submarine"), _("Attack value reduced against some ships.") - _("Unbribable"), _("Can't be bribed.") - _("TradeRoute"), _("Can establish a foreign trade route (must travel to target city).") - _("HelpWonder"), _("Can help build a Wonder in any non-hostile city.") - _("Capturer"), _("Can capture some enemy units.") - _("Capturable"), _("Can be captured by some enemy units.") - _("Cities") - _("AddToCity"), _("Can add itself to the population of a city.") - _("Nuclear"), _("Can perform a Nuclear Detonation obliterating all adjacent tiles.") - _("Missile"), _("AEGIS and Armor II have a defense bonus against this unit.") - _("Well-Digger"), _("Can dig a well and irrigate tiles with no water.") - _("Infra"), _("Can build infrastructure.") - _("Proletarian"), _("Controllable only by Communist governments.") - _("Paratroopers"), _("Can be paradropped from a friendly city or suitable base.") - _("Marines"), _("Can launch attack from non-native tiles.") - _("Expellable"), _("Can be peacefully expelled from foreign tiles.") - _("AirProtector"), _("Is Unreachable AND can protect its tile from units unable to attack this unit.") - _("CantReachAir"), _("Unable to attack air units.") - _("FortBuster"), _("Defending Forts get no bonus. +33% attack bonus vs. the 2x defense of a Fortress.") - _("FortressBuster"), _("Defending Fortresses get no bonus.") - _("AntiAir"), _("Anti-Air bonus of this unit is less effective against Stealth, which has a 25% bonus against this unit.") -;;; _("NeverProtects"), _("Does not protect other units on its tile.") ; UNCOMMENT THIS IF NOT USING SCL'S PATCH FOR THIS FLAG -;;; _("NeverBlocked"), _("Bypasses unreachable units when attacking a tile.") ; UNCOMMENT THIS IF NOT USING LEXXIE'S PATCH FOR THIS FLAG - _("MultiSlot"), _("Cities with proper requirements can produce more than one of these per turn.") ;uncomment if you don't have slot_control patch - _("CanHide"), _("In appropriate terrain, this unit can make a Hideout, which will conceal all land units on the tile.") - _("WillNever") -;;; The following flag MUST be #34 position to work with hack in movement.c which allows transported AAA to defend on non-native: -;;; this comment can be removed when we have some smarter way for unit_can_defend_here(..) to get ruleset control. - _("TransportDefender"), _("Can defend while transported on non-native tiles.") - } - -; Names for custom unit class flags. There can be up to 8 of these. -; name = rule name; In some circumstances user may see this -; as part of some sentences, so try to make it descriptive -; and sensible. -; helptxt = displayed in the help for unit types belonging to a class -; with this flag (optional) -class_flags = - { "name", "helptxt" - _("Airliftable"), _("Can be airlifted if it has remaining moves.") - _("BorderPolice"), _("Military units from this class can peacefully expel certain foreign units.") - _("AttFromNonNative"), _("Can launch attack from non-native tiles.") - _("CargoRestrained"), _("Can't attack as Cargo. Must first unload.") - } - -[veteran_system] -; What are the names of the levels? -veteran_names = _("green"), _("veteran"), _("hardened"), _("elite"), _("crack"), _("master"), _("champion") - -; The percentage chance of increasing level through combat -veteran_raise_chance = 50, 33, 20, 15, 15, 15, 0 - -; The percentage chance of a settler/engineer increasing level through -; performing useful work (per turn) -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 - -; Power factors are as a percentage. -; +50% is represented by 150 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 - -; The additional number of movement points granted for different veteran -; levels. These are fractional move points as defined by move_fragments in -; terrain.ruleset. -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 - -; /* <-- avoid gettext warnings -; -; Unit classes -; The number can be variable, up to 32 -; When adding new classes, remember to check effects.ruleset also. -; Eg. if you divide class 'Land' to two separate classes, you may -; want add effect giving City Walls defence bonus against new class -; too. -; -; The actual tag used (the * in [unitclass_*]) does not matter, except -; it must be unique within this file, and it may be used in debug -; output when reading this file. -; -; ** Fields ** -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; -; if not present, "name" is used for this purpose too. -; Since the name used in savegames must not change, if -; you want to rename an item after a ruleset has been -; released, you should set "rule_name" to the original -; value of "name". -; min_speed = Minimum speed after damage and effects (whole movement points) -; hp_loss_pct = Hitpoints lost each turn if unit not in city or native base -; non_native_def_pct = Defense power percentage applying when defending on -; non-native terrain (such as ship in harbour) -; hut_behavior = What happens to huts when unit enters tile: -; "Normal", "Nothing", or "Frighten" -; flags = List of unit class flags (from the following list; you -; cannot add custom unit class flags) -; helptext = optional help text string; should escape all raw newlines -; so that xgettext parsing works -; -; ** Unit class Flags ** -; -; "TerrainSpeed" = Unit Class uses terrain specific speed -; "TerrainDefense" = Unit Class gains defense bonus from terrain -; "DamageSlows" = Damaged units are slowed down -; "CanOccupyCity" = Military units of this class can occupy enemy cities -; "Missile" = Unit Class is destroyed when it attacks -; "BuildAnywhere" = Unit Class can be built even in the middle of non-native terrain -; "Unreachable" = Unit Class can be attacked only by units explicitly listing this -; class in its 'targets', unless on a city or native base. -; For class members which are transports, cargo cannot load/ -; unload except in a city or native base, unless that unit -; explicitly lists this class in its 'embarks'/'disembarks'. -; "CollectRansom" = Unit Class can collect ransom when killing lone barbarian leader -; "ZOC" = Unit Class is subject to ZOC rules. Unit type flag "IgZOC" can -; override this -; "CanFortify" = Unit can fortify at land tiles. Unit type flag -; "Cant_Fortify" can override this -; "CanPillage" = Unit Class can pillage tile infrastructure -; "DoesntOccupyTile" = Even if this class of enemy unit is on tile, cities can -; still work that tile -; "AttackNonNative" = Unit Class can attack units on non-native tiles. Unit type -; flag "Only_Native_Attack" can override this -; "AttFromNonNative" = Unit Class can launch attack from non-native tile (against -; native one) -; This applies for both attacking from transport or -; cities. If only some unit types of the class should -; get this property, use type flag "Marines" -; "KillCitizen" = Upon successful attack against a city, unit kills one -; citizen. The effect "Unit_No_Lose_Pop" and the server -; setting 'killcitizen' can disable this. - -; "Airliftable" = This Unit Class may be airlifted -; */ <-- avoid gettext warnings - - -; ********************************************************************************** -; ********************************************************************************** -; WARNING: ANY CHANGES TO WHAT TYPES OR CLASSES CAN LOAD ONTO WHICH TRANSPORTS MAY -; REQUIRE CHANGES TO FCW function unit_could_possibly_load() in unit.js -; ********************************************************************************** -; ********************************************************************************** -[unitclass_missile] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Missile") -min_speed = 1 -hp_loss_pct = 0 -hut_behavior = "Frighten" -flags = "Missile", "Unreachable", "DoesntOccupyTile", "Airliftable" - -; missile flag not class, indicates suicide explosion and possibly other things. -[unitclass_bomb] -name = _("?unitclass:Bomb") -min_speed = 1 -hp_loss_pct = 0 -hut_behavior = "Frighten" -flags = "Unreachable", "DoesntOccupyTile", "Airliftable" - -[unitclass_land] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Land") -min_speed = 1 -hp_loss_pct = 0 -flags = "TerrainSpeed", "DamageSlows", "CanOccupyCity", "BuildAnywhere", - "CollectRansom", "ZOC", "CanFortify", "CanPillage", - "TerrainDefense", "KillCitizen", "Airliftable", "BorderPolice", - "CargoRestrained" -helptext = _("\ - • Can be airlifted from a suitable city.\ -") - -[unitclass_landnokill] -name = _("?unitclass:LandNoKill") -min_speed = 1 -hp_loss_pct = 0 -flags = "TerrainSpeed", "DamageSlows", "CanOccupyCity", "BuildAnywhere", - "CollectRansom", "ZOC", "CanFortify", "CanPillage", - "TerrainDefense", "Airliftable", "BorderPolice", - "CargoRestrained" -helptext = _("\ - • Does not reduce population when attacking city.\ -") - -;Land units that are multipurpose for land/air/sea attacks (i.e., anti-aircraft, marines) -;include "Unreachable" in the targets for individual units -[unitclass_landairsea] -name = _("?unitclass:LandAirSea") -min_speed = 1 -hp_loss_pct = 0 -flags = "TerrainSpeed", "DamageSlows", "CanOccupyCity", "BuildAnywhere", - "CollectRansom", "ZOC", "CanFortify", "CanPillage", - "TerrainDefense", "KillCitizen", "Airliftable", - "AttackNonNative", "AttFromNonNative", "BorderPolice" -helptext = _("\ - • Can attack from Ships and Helicopters.\ -") - -[unitclass_sea] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Sea") -min_speed = 3 -hp_loss_pct = 0 -flags = "DamageSlows", "AttackNonNative", "AttFromNonNative", "CanPillage" -helptext = _("\ - • Crew Repair: each turn, regardless of movement, recovers 8% of its hit points (rounded down).\ -") - -; Separating the Submarine class finally allows it to be unreachable by Air. The old Submarine was -; far too offensively overpowered while simultaneously almost useless from ultra-vulnerability to Air units. -; Because it is now Unreachable, any unit able to attack it needs this class in its targets. -[unitclass_submarine] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Submarine") -min_speed = 3 -hp_loss_pct = 0 -flags = "DamageSlows", "AttackNonNative", "AttFromNonNative", "CanPillage", "Unreachable" -helptext = _("\ - • Visibility bonus: not visible to other players unless they have a unit or city adjacent to it.\n\ - • Crew Repair: each turn, regardless of movement, recovers 2 hit points.\ -") - -[unitclass_trireme] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Trireme") -min_speed = 2 -hp_loss_pct = 0 -flags = "DamageSlows", "AttFromNonNative" - -[unitclass_rivership] -; /* Extra class providing ability to travel rivers */ -name = _("?unitclass:RiverShip") -min_speed = 2 -hp_loss_pct = 0 -flags = "DamageSlows", "AttackNonNative", "AttFromNonNative" - -[unitclass_heli] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Helicopter") -min_speed = 1 -hp_loss_pct = 5 -flags = "Unreachable", "CanOccupyCity", "CollectRansom", "Airliftable" - -; This class is for air units that are unreachable but do not protect a stack. -[unitclass_air] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Air") -min_speed = 1 -hp_loss_pct = 0 -hut_behavior = "Frighten" -flags = "Unreachable", "DoesntOccupyTile", "Airliftable" - -; This class is for air units that can pillage terrain (i.e. Jet Bomber) -[unitclass_airpillage] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:AirPillage") -min_speed = 1 -hp_loss_pct = 0 -hut_behavior = "Frighten" -flags = "Unreachable", "DoesntOccupyTile", "Airliftable", "CanPillage" - -; This class is for air units that can also protect a stack. -; (Fighters) -- technically a separate AirProtect class is not needed, but -; Fighters also have Border Police abilities, and a separate class -; facilitates future adjustments and balancing in an isolated class. -[unitclass_air_protect] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:AirProtect") -min_speed = 1 -hp_loss_pct = 0 -hut_behavior = "Frighten" -flags = "Unreachable", "DoesntOccupyTile", "Airliftable", "BorderPolice" -helptext = _("\ - • INTERCEPTOR: can be given the Vigil order to auto-attack adjacent Air units.\n\ - • AIR COVER: Most units who cannot attack this unit also cannot attack other units on the tile.\ -") -[unitclass_balloon] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:Balloon") -min_speed = 1 -hp_loss_pct = 0 -hut_behavior = "Frighten" -flags = "Unreachable", "DoesntOccupyTile", "Airliftable" - - -; /* <-- avoid gettext warnings -; -; Below: The individual unit types, one per section. -; -; The number can be variable, up to 200. -; However for the "official" rulesets, units should not be removed -; because that would break backward compatability with savegames. -; -; The order here matters: later units are considered "better" for -; a given flag or role. -; -; The actual tag used (the * in [unit_*]) does not matter, except -; it must be unique within this file, and it may be used in debug -; output when reading this file. -; -; ** Fields ** -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; if -; not present, "name" is used for this purpose too. Since -; the name used in savegames must not change, if you want -; to rename an item after a ruleset has been released, you -; should set "rule_name" to the original value of "name". -; graphic = tag specifying preferred graphic -; graphic_alt = tag for alternate graphic if preferred graphic is not -; present; especially if preferred graphic is non-standard, -; this should be a standard tag. Otherwise can use eg "-" -; for no alternate graphic. -; tech_req = required advance, names from techs.ruleset, or special: -; "None" => available from start -; impr_req = required city improvement, names from buildings.ruleset -; gov_req = required government, names from governments.ruleset -; obsolete_by = can be upgraded to and made obsolete by another unit by name -; build_cost = production shields required to build -; pop_cost = population removed from city when built; for 'Join City' -; units this is also the population added to the destination -; attack = base attack strength (0 = cannot attack) -; defense = base defense strength (0 = cannot defend) -; hitpoints = how much damage unit can withstand -; firepower = number of hitpoints removed per round of combat; at least 1 -; move_rate = base move rate (whole movement points) -; vision_radius_sq = base vision of unit: unit can see tile up to the square -; root of this value away -; convert_to = can be converted to another type of unit by name -; convert_time = number of movement points it takes to convert to -; another unit type -; class = One of the classes listed above -; transport_cap = Number of units (ground, or air/missiles, depending on flags) -; fuel = Number of turns unit can spend outside refuel points. -; If more time passes without unit refueling over turn change, -; they are lost. If this is zero, unit has no need to refuel -; Units with "Coast" flag set consider any tile next to coast -; refuel point -; uk_* = upkeep costs, these are used as base values in the game -; cargo = Unit classes this unit can transport -; city_slots = How many of homecity's unit maintenance slots unit takes -; city_size = Initial size of the cities built by 'Found City' type units -; (but 'Join City' uses pop_cost) -; targets = list of unit classes this unit can attack against even -; if they have Unreachable unit class flag -; embarks = list of unit classes this unit may load into while not in -; native base or city even if transporter has Unreachable unit -; class flag -; disembarks = list of unit classes this unit may unload from while not in -; native base or city even if transporter has Unreachable unit -; class flag -; vision_layer = At which layer this unit is visible; "Main", "Stealth", -; or "Subsurface" -; bonuses = definitions of combat bonuses against specific other units -; bonuses.flag = flag of the unit that bonus applies against -; bonuses.type = type of the bonus. See below -; bonuses.value = value of the bonus. Sum of these is used if multiple apply. -; bonuses.quiet = don't auto generate help text for this bonus. Use this if -; the bonus is documented in the unit type's help text. -; This is useful when the combination of a unit's bonuses -; becomes complex enough to make the auto generated help -; ugly or inaccurate. -; flags = special flag strings; list of built-in flags described below -; and/or user flags defined above -; -; veteran_names = Special veteran level for this unit. See the definitions in -; game.ruleset. All of the veteran_* entries have to have the -; same length! -; veteran_raise_chance = -; veteran_work_raise_chance = -; veteran_power_fact = -; veteran_move_bonus = -; -; roles = special role strings -; sound_move = optional sound effect when the unit moves -; sound_move_alt = optional alternative sound effect if above not -; supported in client -; sound_fight = optional sound effect when the unit fights -; sound_fight_alt = optional alternative sound effect if above not -; supported in client -; helptext = optional help text string; should escape all raw newlines -; so that xgettext parsing works -; -; -; ** Bonuses ** -; -; "DefenseMultiplier" = Multiply defense value (1 + 'value') times. -; Value of 1 means multiplication by 2, value 2 by 3... -; Bonus is defined in defenders entry. -; "DefenseMultiplierPct" = Multiply defense by 1 + (value / 100). -; Value of 100 means multiplication by 2, -; value of 50 means multiplication by 1.5, etc. -; Effectively increases defense by value percent. -; Bonus is defined in defenders entry. -; "DefenseDivider" = Divide defense value with (1 + 'value'). -; Bonus is defined in attackers entry. -; "DefenseDividerPct" = Divide defense value by 1 + (value / 100). -; Value of 100 means division by 2, (2x for attacker) -; value of 50 means division by 1.5, (1.5x for attacker) -; i.e.: Effectively increases *attack* by value percent. -; "FirePower1" = Defender firepower is reduced to value 1 when -; ever this has non-zero value. -; Bonus is defined in attackers entry. -; -; ** Flags ** -; -; "IgZOC" = ignore Zones of Control (ZOC) even if unit class has -; "ZOC" flag -; "HasNoZOC" = unit has no Zone of Control (ZOC), thus any unit can move -; around it freely -; "NonMil" = a non-military unit: no attacks; no martial law; can enter -; peaceful borders; DoesntOccupyTile -; "IgTer" = use constant move cost defined in igter_cost (terrain.ruleset) -; rather than terrain/road etc cost, unless terrain cost is -; less -; "OneAttack" = can only make a single attack, regardless of movement points -; "FieldUnit" = cause unhappiness even when not being aggressive -; "BeachLander" = won't lose all its movement when moving from non-native -; terrain to native terrain even if slow_invasions is on. -; "Settlers" = "can irrigate and build roads" but really seems to be a required flag for -; any tile improvement at all. -; "Diplomat" = can defend against diplomat actions (see diplchance -; server option) -; "Spy" = strong in diplomatic battles. _Must_ be "Diplomat" also -; "CoastStrict" = (sea only) cannot leave coast -; "Coast" = (sea only) can refuel on coast. Set fuel to force unit -; to regularly end turn on coast -; "Only_Native_Attack" = cannot attack targets on non-native tiles even if -; unit class can -; "Cant_Fortify" = cannot fortify even if unit class has "CanFortify" flag -; "Fanatic" = can only be built by governments that allow them -; (see civ2/governments.ruleset, Fundamentalism government) -; "Unique" = a player can only have one of these units in the game at -; the same time; barbarians cannot use this at present -; "GameLoss" = losing one of these units means you lose the game, but it -; is produced without homecity and upkeep -; "EvacuateFirst" = the game will try to rescue units with this flag before -; it tries to rescue units without it when their transport -; is destroyed. Think of the Birkenhead drill ("women and -; children first"). Replace "women and children" with -; "units with the EvacuateFirst unit type flag". -; "SuperSpy" = this unit always wins diplomatic contests, that is, unless -; it encounters another SuperSpy, in which case defender wins; -; can also be used on non-diplomat units, in which case it can -; protect cities from diplomats; also 100% spy survival chance -; "NoHome" = this unit has no homecity and will be free of all upkeep, and -; therefore will not revolt along with its city of origin should -; it be incited -; "NoVeteran" = this unit cannot gain veteran levels through experience -; (as if both raise_chance and work_raise_chance were zero); -; it can still gain veterancy through Veteran_Build, etc -; "CityBuster" = this unit has double firepower against cities -; "NoBuild" = this unit cannot be built -; "BadWallAttacker" = the firepower of this unit is set to 1 if -; attacking a city -; defended by a city wall (or other city building defense) -; "BadCityDefender" = if attacked while in a city, firepower is set to 1 -; and firepower of attacker is doubled (the Pearl Harbour -; rule) -; "BarbarianOnly" = only barbarians can build this unit -; "Shield2Gold" = Switch from shield upkeep to gold upkeep possible -; "NewCityGamesOnly" = unit can't be built on scenarios where founding new cities -; is not allowed. Give this flag to units that would make no sense -; to have in a game with such a scenario -; "CanEscape" = this unit has, given that certain conditions are -; fulfilled, a 50% chance to escape rather than being -; killed when killstack is enabled and the defender of its -; tile is defeated. The conditions are that it has more move -; points than required to move to an adjacent tile plus the -; attackers move points and that the attacker doesn't have -; the "CanKillEscaping" unit type flag. -; "CanKillEscaping" = an attack from this unit ignores the "CanEscape" unit -; type flag. -; "Provoking" = Under autoattack_style=1 which this ruleset uses, only -; Fighter types will autoattack and will ONLY attack units -; marked with the Provoking flag. If overridden to autoattack_style=0, -; a unit considering to auto attack this unit will choose to -; do so even if has better odds when defending against it -; then when attacking it. Applies when the autoattack server -; setting is enabled. -; "NeverProtects" = doesn't protect reachable units on its tile from enemy -; attackers, even if the unreachableprotects server setting -; is enabled and the unit class is unreachable -; "NeverBlocked" = isn't blocked by unreachable units on targeted tile, -; even if the unreachableprotects server setting -; is enabled and the unit class is unreachable -; "MultiSlot" = if server setting slot_control is ON, only unit types with this -; flag can use extra city_build_slots -; -; Following actions require extra fields: -; "Attack" -; attack = base attack strength -; "Bombard" -; attack = base attack strength -; bombard_rate = the number of shots fired at enemy units when attacking -; FOR NUKES: the amount to add to the default radius of 1 tile -; "Join City" -; pop_cost = the number of population added to the target city -; "Paradrop Unit" -; paratroopers_range = the maximal range the unit can be paradropped to. -; Max range is 65534. -; paratroopers_mr_req = the move rate which is required at least for -; paradropping (whole movement points) -; paratroopers_mr_sub = the move rate which is subtracted after paradropping -; (whole movement points) -; "Upgrade Unit" -; obsolete_by = the unit type upgraded to. -; "Convert Unit" -; convert_to = the unit type converted to. -; -; ** Roles ** -; -; "FirstBuild" = first to be built when city founded -; "Explorer" = unit to use for exploring -; "Hut" = can be found in a hut -; "HutTech" = can be found in a hut, but its techs required -; "Partisan" = can be created as a partisan (only one unit can have this -; flag), see end of this file for its tech requirements option -; "DefendOk" = AI hint: ok for defending with -; "DefendGood" = AI hint: good for defending with -; "Ferryboat" = AI hint: useful for ferrying -; "Barbarian" = can be created as land barbarian -; "BarbarianTech" = can be created as land barbarian, if someone has -; researched its tech requirements -; "BarbarianBoat" = can be created as boat for sea barbarian -; "BarbarianBuild" = can be built by barbarians -; "BarbarianBuildTech" = can be built by barbarians if someone has -; researched its tech requirements -; "BarbarianLeader" = this unit is the barbarian leader (only one) -; "BarbarianSea" = can be created as a barbarian that disembarks from a barbarian boat -; "BarbarianSeaTech" = can be created as a barbarian that disembarks from a barbarian boat -; if someone has researched its tech requirements -; "Settlers" = can irrigate and build roads -; "Hunter" = AI hint: good for hunting other units -; "CitiesStartUnit" = Gets granted as 'c' startunit -; "WorkerStartUnit" = Gets granted as 'w' startunit -; "ExplorerStartUnit" = Gets granted as 'x' startunit -; "KingStartUnit" = Gets granted as 'k' startunit -; "DiplomatStartUnit" = Gets granted as 's' startunit -; "FerryStartUnit" = Gets granted as 'f' startunit -; "DefendOkStartUnit" = Gets granted as 'd' startunit -; "DefendGoodStartUnit" = Gets granted as 'D' startunit -; "AttackFastStartUnit" = Gets granted as 'a' startunit -; "AttackStrongStartUnit" = Gets granted as 'A' startunit -; -; */ <-- avoid gettext warnings - -[unit_settlers] -name = _("Settlers") -class = "Land" -tech_req = "None" -obsolete_by = "None" -graphic = "u.settlers" -graphic_alt = "-" -sound_move = "m_settlers" -sound_move_alt = "m_generic" -sound_fight = "f_settlers" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 1 -attack = 0 -defense = 1 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 1 -uk_food = 1 -uk_gold = 0 -flags = "Settlers", "Infra", "CanRoad", "CanFortress", "NonMil", "HasNoZOC", "AddToCity", "Cities", "Cant_Fortify", "Expellable" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "CitiesStartUnit" -helptext = _("\ -Settlers are your only means of founding new cities.\ -"), _("\ -Settlers can perform most of the terrain alterations as\ - Workers (but cannot build Airbases or Buoys).\ -"), _("\ -Upkeep for Settlers costs food as well as production. A Settler\ - can die if its supporting city runs out of food. Settlers in a\ - Republic, Democracy, or Fundamentalist nation require twice as\ - much food per turn.\ -") - -;A unique patch unit to provide fair starts regardless of lack of nearby water. -;to make as a start unit, use the letter "a": for example, cccwwwxxa -[unit_welldigger] -name = _("Well-Digger") -class = "Land" -tech_req = "None" -obsolete_by = "Workers" -graphic = "u.well_digger" -graphic_alt = "u.migrants" -sound_move = "m_worker" -sound_move_alt = "m_generic" -sound_fight = "f_worker" -sound_fight_alt = "f_generic" -build_cost = 5 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 3 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 5 -uk_food = 2 -uk_gold = 2 -flags = "Settlers", "Infra", "NonMil", "HasNoZOC", "Cant_Fortify", "Unique", "Well-Digger", "Expellable" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "AttackFastStartUnit" ;this role taken over for well-digger -helptext = _("\ -This unit can fix unlucky starts, but has very high upkeep.\ - If you have no water, make a Well-Digger in a city that can\ - support it, create a water source, then disband the unit.\n\ - This unit can dig wells or irrigate any lowland tile. It will cost its home city\ - -2 Food -2 Prod. This unit WILL NOT WORK: • Outside your borders,\ - • After Alphabet or Pottery, • After any player discovers Writing, • After 10 turns.\ - >> Don't fool around: high upkeep will permanently hinder you. Only make this unit if you\ - lack water when the game starts!\ -") - -[unit_proletarians] -name = _("Proletarians") -class = "Land" -tech_req = "Communism" -gov_req = "Communism" -obsolete_by = "None" -graphic = "u.proletarian" -graphic_alt = "u.migrants" -sound_move = "m_worker" -sound_move_alt = "m_generic" -sound_fight = "f_worker" -sound_fight_alt = "f_generic" -build_cost = 10 -pop_cost = 1 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 1 -uk_gold = 0 -embarks = "Helicopter" ; transport helicopter only -disembarks = "Helicopter" -flags = "Settlers", "Infra", "Cant_Fortify", "NonMil", "HasNoZOC", "AddToCity", "Capturable", "Expellable", "Airbase", "CanFortress", "CanRoad", "Proletarian" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 1 -roles = "Settlers" -helptext = _("\ -Proletarians can only be controlled by Communist governments.\ -"), _("\ -Communist States can assign Proletarians from one city to another, which transfers population\ - from one to the other. They can also be ordered to the same tasks as Workers.\ -"), _("\ -Large numbers of Proletarians can be used to rapidly complete important State projects,\ - which you may organize into Five-turn Plans.\ -") - -[unit_pilgrims] -name = _("Pilgrims") -class = "Land" -tech_req = "Fundamentalism" -gov_req = "Fundamentalism" -obsolete_by = "None" -graphic = "u.pilgrims" -graphic_alt = "u.migrants" -sound_move = "m_worker" -sound_move_alt = "m_generic" -sound_fight = "f_worker" -sound_fight_alt = "f_generic" -build_cost = 10 -pop_cost = 1 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 2 -uk_gold = 0 -embarks = "Helicopter" ; transport helicopter only -disembarks = "Helicopter" -flags = "Fanatic", "Cant_Fortify", "NonMil", "HasNoZOC", "AddToCity", "Capturable", "Expellable" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -helptext = _("\ -Pilgrims are wayfaring migrants from Fundamentalist nations. Like Fanatics,\ - they have no upkeep if under a Fundamentalist government. Heeding the call\ - of ecclesiastic authority, Pilgrims can be guided from one city to another in\ - order to transfer population from city to city.\ -") - - -[unit_worker] -name = _("?unit:Workers") -class = "Land" -tech_req = "Pottery" -obsolete_by = "Engineers" -graphic = "u.worker" -graphic_alt = "u.engineers" ; for compatibility -sound_move = "m_worker" -sound_move_alt = "m_generic" -sound_fight = "f_worker" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -convert_to = "Riflemen" -convert_time = 2 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter" ; transport helicopter only -disembarks = "Helicopter" -flags = "Settlers", "Infra", "CanRoad", "CanFortress", "NonMil", "HasNoZOC", "Airbase", "Cant_Fortify", "Capturable", "Expellable" -; No veteran levels (level name is never displayed) -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:army worker"), - _("?vet_rank:army engineer"), - _("?vet_rank:chief engineer") -veteran_raise_chance = 0, 0, 0, 0 -veteran_work_raise_chance = 0, 0, 0, 0 -veteran_power_fact = 100, 100, 100, 100 -veteran_move_bonus = 0, 1, 1, 1 -roles = "Settlers", "WorkerStartUnit" -helptext = _("\ -Workers can improve terrain tiles. See the manual on Terrain for details.\ -"), _("\ -Masonry lets Workers build Forts. Construction lets them build Fortresses and\ - Oil Wells. Engineering lets them build Canals and Naval Bases. Radio lets them\ - build Airbases and Buoys, which Settlers cannot. Workers must be on a ship to build Buoys.\ -"), _("\ -Communism tech allows Communist governments to conscript Workers into Riflemen via the\ - Convert order. And vice versa.\ -") - -[unit_engineers] -name = _("Engineers") -class = "Land" -tech_req = "Explosives" -obsolete_by = "None" -graphic = "u.engineers" -graphic_alt = "u.worker" -sound_move = "m_engineers" -sound_move_alt = "m_generic" -sound_fight = "f_engineers" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 0 -defense = 2 -hitpoints = 20 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter" ; transport helicopter only -disembarks = "Helicopter" -flags = "Settlers", "Infra", "CanRoad", "CanFortress", "NonMil", "HasNoZOC", "Transform", "Airbase", "Cant_Fortify", "Expellable" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "Settlers", "WorkerStartUnit" -helptext = _("\ -Engineers can do everything Workers can do, at twice the speed.\ - Unlike Workers, Engineers can Transform, such as converting\ - Desert to Plains. Converting Ocean to Swamp requires being on a ship\ - on a tile bordering 3 land tiles.\ -") - -[unit_warriors] -name = _("Warriors") -class = "Land" -tech_req = "None" -obsolete_by = "Pikemen" -graphic = "u.warriors" -graphic_alt = "-" -sound_move = "m_warriors" -sound_move_alt = "m_generic" -sound_fight = "f_warriors" -sound_fight_alt = "f_generic" -build_cost = 10 -pop_cost = 0 -attack = 1 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "FootSoldier", "CantReachAir", "Settlers", "CanHide", "MultiSlot", "Shield2Gold", "WillNever" -roles = "DefendOk", "DefendOkStartUnit", "FirstBuild", "Hut" -helptext = _("\ -The Warrior is the weakest military unit, but can also be very cost effective.\ -") - -[unit_phalanx] -name = _("Phalanx") -class = "Land" -tech_req = "Bronze Working" -obsolete_by = "Pikemen" -graphic = "u.phalanx" -graphic_alt = "-" -sound_move = "m_phalanx" -sound_move_alt = "m_generic" -sound_fight = "f_phalanx" -sound_fight_alt = "f_generic" -build_cost = 20 -pop_cost = 0 -attack = 1 -defense = 2 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "FootSoldier", "CantReachAir", "Settlers", "CanHide", "MultiSlot", "Shield2Gold", "WillNever" -roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild", "HutTech" -helptext = _("\ -The Phalanx is armored infantry, suitable for defending your cities. It offers good value\ - for defending.\ -") - -[unit_archers] -name = _("Archers") -class = "Land" -tech_req = "Warrior Code" -obsolete_by = "Musketeers" -graphic = "u.archers" -graphic_alt = "-" -sound_move = "m_archers" -sound_move_alt = "m_generic" -sound_fight = "f_archers" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 3 -defense = 2 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "FootSoldier", "Capturer", "CantReachAir", "Bombarder", "Settlers", "CanHide", "MultiSlot", "Shield2Gold", "WillNever" -roles = "DefendOk", "DefendOkStartUnit" -helptext = _("\ -Archers fight with bows and arrows. They have good offense and decent defense.\ - Rather than fight to the death, Archers can also do a Ranged Attack with no risk\ - of retaliatory damage: a single volley of arrows is fired over all enemy units on the tile,\ - causing 1hp of damage to any units who are hit. This is useful for softening\ - enemies prior to battle, or for deterring an approach to a strategic location.\ - (Ranged Attack is not possible on Cities or Fortresses.)\ -") -bombard_rate = 1 - - -[unit_legion] -name = _("Legion") -class = "Land" -tech_req = "Iron Working" -obsolete_by = "Musketeers" -graphic = "u.legion" -graphic_alt = "-" -sound_move = "m_legion" -sound_move_alt = "m_generic" -sound_fight = "f_legion" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 4 -defense = 2 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "FootSoldier", "Settlers", "CanHide", "Infra", "CanRoad", "CanFortress", "Capturer", - "CantReachAir", "MultiSlot", "Shield2Gold", "WillNever" -roles = "DefendOk", "DefendOkStartUnit", "BarbarianBuild", "BarbarianSea" -helptext = _("\ -Legions are heavily armed well disciplined soldiers with excellent offensive strength.\ - They are famous and feared for their engineering abilities: with the required\ - technology they can build Forts and Fortresses. They can build Roads outside domestic\ - national territory and inside Forts and Fortresses.\ -") - -[unit_pikemen] -name = _("Pikemen") -class = "Land" -tech_req = "Feudalism" -obsolete_by = "Musketeers" -graphic = "u.pikemen" -graphic_alt = "-" -sound_move = "m_pikemen" -sound_move_alt = "m_generic" -sound_fight = "f_pikemen" -sound_fight_alt = "f_generic" -build_cost = 20 -pop_cost = 0 -attack = 1 -defense = 2 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -bonuses = - { "flag", "type", "value" - "Horse", "DefenseMultiplier", 1 - } -flags = "FootSoldier", "CantReachAir", "Settlers", "CanHide", "MultiSlot", "Shield2Gold", "WillNever" -roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild" -helptext = _("\ -Equipped with long pikes and a 2x defence bonus against\ - mounted units, Pikemen replace the Phalanx as the\ - preferred city defender.\ -") - -[unit_musketeers] -name = _("Musketeers") -class = "Land" -tech_req = "Gunpowder" -obsolete_by = "Riflemen" -graphic = "u.musketeers" -graphic_alt = "-" -sound_move = "m_musketeers" -sound_move_alt = "m_generic" -sound_fight = "f_musketeers" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 3 -defense = 3 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter" ; transport helicopter only -disembarks = "Helicopter" -flags = "FootSoldier", "Capturer", "CantReachAir", "Settlers", "CanHide", "MultiSlot", "Shield2Gold", "WillNever" -roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild", - "BarbarianTech", "BarbarianBuildTech", "BarbarianSeaTech" -helptext = _("\ -Musketeers are infantry equipped with early\ - firearms and replace Pikemen as the preferred\ - city defender, and replace Archers and Legions\ - for offensive foot soldiers.\ -") - -[unit_fanatics] -name = _("Fanatics") -class = "Land" -tech_req = "Fundamentalism" -gov_req = "Fundamentalism" -obsolete_by = "None" -graphic = "u.fanatics" -graphic_alt = "-" -sound_move = "m_fanatics" -sound_move_alt = "m_generic" -sound_fight = "f_fanatics" -sound_fight_alt = "f_generic" -build_cost = 20 -pop_cost = 0 -attack = 4 -defense = 4 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 2 -uk_shield = 2 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter" ; transport helicopter only -disembarks = "Helicopter" -targets = "Balloon", "Helicopter" -flags = "Fanatic", "FootSoldier", "Capturer", "CantReachAir", "Unbribable", "Bombarder", - "Settlers", "CanHide", "MultiSlot", "Shield2Gold", "WillNever" -roles = "DefendGood", "DefendGoodStartUnit" -helptext = _("\ -Fanatics are warriors devoted to a higher cause. Their faith\ - is strong and they cannot be bribed.\ -"), _("\ -Fundamentalist nations can maintain Fanatics without paying\ - their steep upkeep. (Fanatics are unhappy if not under Fundamentalism,\ - requiring high upkeep to stay content.) Fanatics\ - produced in a city with Ecclesiastical Palace are inspired by\ - fervorous faith to +1 higher veteran level.\ -"), _("\ -Fanatics zealously defend their homeland, and can do surprise skirmish\ - assaults to snipe and injure foreign occupants: Each invader\ - on the tile will endure three combat rounds without defense.\ -"), _("\ -\nThe discovery of Labor Union changes upkeep from shields to gold.\ -") -bombard_rate = 3 - -[unit_partisan] -name = _("Partisan") -class = "Land" -tech_req = "Guerilla Warfare" -obsolete_by = "None" -graphic = "u.partisan" -graphic_alt = "-" -sound_move = "m_partisan" -sound_move_alt = "m_generic" -sound_fight = "f_partisan" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 4 -defense = 4 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter" ; transport helicopter only -disembarks = "Helicopter" -targets = "Balloon", "Helicopter" -flags = "MultiSlot", "IgTer", "IgZOC", "NoHome", "FootSoldier", "Capturer", "CantReachAir", - "Shield2Gold", "Settlers", "CanHide", "WillNever" -;yes Partisan has 0 upkeep so Shield2Gold is meaningless, but currently used to substitute MultiSlot inaccessible in c-server -roles = "DefendGood", "DefendGoodStartUnit", "Partisan", "BarbarianTech" -helptext = _("\ -Partisans are guerilla fighters who can use the terrain to their advantage. Like the Explorer\ - that they upgrade, they can slip through ZOC and live off the land with no upkeep.\ -"), _("\ -Proportional to city size, up to 8 Partisans appear when an enemy conquers your city. They\ - randomly fortify on any tile inside the circle defined by its workable radius. Partisans\ - prefer defensive tiles, and ignore tile nationality. They spawn only when:\n\ - ➣ Guerilla Warfare is known by any player.\n\ - ➣ The city was originally built by you.\n\ - ➣ You know Communism and Gunpowder.\n\ - ➣ You must be Democracy or Communist.\ -") - -[unit_alpine_troops] -name = _("Alpine Troops") -class = "Land" -tech_req = "Tactics" -obsolete_by = "None" -graphic = "u.alpine_troops" -graphic_alt = "-" -sound_move = "m_alpine_troops" -sound_move_alt = "m_generic" -sound_fight = "f_alpine_troops" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 5 -defense = 5 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter" ; transport helicopter only -disembarks = "Helicopter" -targets = "Balloon", "Helicopter" -flags = "MultiSlot", "IgTer", "FootSoldier", "Capturer", "CantReachAir", "Shield2Gold", "Settlers", "CanHide", "WillNever" -roles = "DefendGood", "DefendGoodStartUnit" -helptext = _("\ -Alpine Troops are highly mobile units and\ - excellent defenders. Similar to an Explorer, they\ - treat every land tile like a road were on it.\ -"), _("\ -\nThe discovery of Labor Union changes upkeep from shields to gold.\ -") - -[unit_riflemen] -name = _("Riflemen") -class = "Land" -tech_req = "Conscription" -obsolete_by = "None" -graphic = "u.riflemen" -graphic_alt = "-" -sound_move = "m_riflemen" -sound_move_alt = "m_generic" -sound_fight = "f_riflemen" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 5 -defense = 4 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -convert_to = "Workers" -convert_time = 2 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter" ; transport helicopter only -disembarks = "Helicopter" -targets = "Balloon", "Helicopter" -flags = "MultiSlot", "FootSoldier", "Capturer", "CantReachAir", "Shield2Gold", "Settlers", "CanHide", "WillNever" -roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild" -helptext = _("\ -Riflemen are World War-era infantry. They are good at defending cities and\ - strategic Fortresses. They also have good attack capability.\ -"), _("\ -Under Communism this unit costs 5 less. Also, Communism tech allows Communist\ - governments to de-commission Riflemen into Workers via the Convert order. And vice versa.\ -"), _("\ -\nThe discovery of Labor Union changes upkeep from shields to gold.\ -") - -[unit_marines] -name = _("Marines") -class = "LandAirSea" -tech_req = "Amphibious Warfare" -obsolete_by = "None" -graphic = "u.marines" -graphic_alt = "-" -sound_move = "m_marines" -sound_move_alt = "m_generic" -sound_fight = "f_marines" -sound_fight_alt = "f_generic" -build_cost = 60 -pop_cost = 0 -attack = 8 -defense = 5 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 8 ; hard-coded the +4 extra for effect_physics_vision since it is a pre-req anyway -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter", "Land", "Sea" -disembarks = "Helicopter", "Land", "Sea" -targets = "Sea", "Balloon", "Helicopter" -flags = "MultiSlot", "Marines", "FootSoldier", "BeachLander", "Capturer", - "NeverBlocked", "Shield2Gold", "Settlers", "CanHide", "WillNever" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:Ranger"), - _("?vet_rank:Commando"), - _("?vet_rank:Green Beret"), - _("?vet_rank:Navy SEAL") -veteran_raise_chance = 60, 50, 40, 30, 20, 15, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 250, 300, 350, 400 -veteran_move_bonus = 0, 0, 0, 1, 1, 1, 1 -roles = "DefendOk", "DefendOkStartUnit", "BarbarianSeaTech" -helptext = _("\ -Marines are experts at amphibious war. They are the strongest\ - foot unit in the game, and are armed with diverse weaponry.\n\ - Unlike other units, Marines can attack Sea units (at a penalty).\ - Air units do not stop them from attacking reachable targets.\ - They can attack from a Transport or Helicopter. Marines promoted to three\ - veteran levels become commandos suitable for special ops.\n\ - Marines built in a city with an Airport, Port Facility, and Barracks III\ - receive the second veteran level (hardened.)\ -"), _("\ -\nThe discovery of Labor Union changes upkeep from shields to gold.\ -") - -[unit_paratroopers] -name = _("Paratroopers") -class = "Land" -tech_req = "Combined Arms" -obsolete_by = "None" -graphic = "u.paratroopers" -graphic_alt = "-" -sound_move = "m_paratroopers" -sound_move_alt = "m_generic" -sound_fight = "f_paratroopers" -sound_fight_alt = "f_generic" -build_cost = 60 -pop_cost = 0 -attack = 6 -defense = 4 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter" ; transport helicopter only -disembarks = "Helicopter" -targets = "Balloon", "Helicopter" -flags = "Paratroopers", "FootSoldier", "Capturer", "CantReachAir", "Provoking", - "Shield2Gold", "MultiSlot", "Settlers", "CanHide", "WillNever" -roles = "DefendOk", "DefendOkStartUnit" -helptext = _("\ -Paratroopers are experts at airborne attacks.\ - From a friendly city or airbase, Paratroopers who have not used any\ - move points can paradrop directly to any tile in range, and be\ - immediately ready to act there. Beware dropping into unseen territory,\ - as Paratroopers landing on a tile occupied by enemy units will be lost.\ - Also note: Paradropping is assumed to be done from aircraft. Therefore,\ - Fighters on Vigil may auto-attack the tile you land on, if adjacent.\ -"), _("\ -\nThe discovery of Labor Union changes upkeep from shields to gold.\ -") -paratroopers_range = 14 -paratroopers_mr_req = 1 -paratroopers_mr_sub = 0 - -[unit_mech_inf] -name = _("Mechanized Infantry") -rule_name = "Mech. Inf." -class = "Land" -tech_req = "Labor Union" -obsolete_by = "None" -graphic = "u.mech_inf" -graphic_alt = "-" -sound_move = "m_mech_inf" -sound_move_alt = "m_generic" -sound_fight = "f_mech_inf" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 6 -defense = 6 -hitpoints = 30 -firepower = 1 -move_rate = 6 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter" ; transport helicopter only -;disembarks = "Helicopter" -targets = "Balloon", "Helicopter" -flags = "CantReachAir", "Shield2Gold", "MultiSlot", "WillNever" -roles = "DefendGood", "DefendGoodStartUnit" -helptext = _("\ -Mechanized Infantry have the strongest general defense strength of any land unit.\ - They have decent attack strength in open field engagements, and excellent mobility.\ -"), _("\ -\nUpkeep for Mechanized infantry is paid in gold instead of shields.\ -") - -[unit_horsemen] -name = _("Horsemen") -class = "Land" -tech_req = "Horseback Riding" -obsolete_by = "Knights" -graphic = "u.horsemen" -graphic_alt = "-" -sound_move = "m_horsemen" -sound_move_alt = "m_generic" -sound_fight = "f_horsemen" -sound_fight_alt = "f_generic" -build_cost = 20 -pop_cost = 0 -attack = 2 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "Horse", "CantReachAir", "WillNever" -roles = "AttackFastStartUnit", "Barbarian", "Hunter" -helptext = _("\ -Horsemen are mounted warriors and an early shock-troop that can penetrate deep into\ - enemy territory.\ -") - -[unit_chariot] -name = _("Chariot") -class = "Land" -tech_req = "The Wheel" -obsolete_by = "Knights" -graphic = "u.chariot" -graphic_alt = "-" -sound_move = "m_chariot" -sound_move_alt = "m_generic" -sound_fight = "f_chariot" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 3 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "Horse", "Capturer", "CantReachAir", "WillNever" -roles = "AttackFastStartUnit", "Hunter" -helptext = _("\ -Chariots are horse-pulled war wagons, stronger but more expensive than horsemen.\ -") - -[unit_elephants] -name = _("Elephants") -class = "Land" -tech_req = "Polytheism" -obsolete_by = "Crusaders" -graphic = "u.elephants" -graphic_alt = "-" -sound_move = "m_elephants" -sound_move_alt = "m_generic" -sound_fight = "f_elephants" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 4 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "Horse", "Capturer", "CantReachAir", "WillNever" -roles = "AttackFastStartUnit" -helptext = _("\ -Elephants are towering animals trained for war. Their mobility and formidable\ - attack strength make them excellent for offensive engagements, but they\ - defend poorly against most units.\ -") - -[unit_crusaders] -name = _("Crusaders") -class = "Land" -tech_req = "Monotheism" -obsolete_by = "Dragoons" -graphic = "u.crusaders" -graphic_alt = "-" -sound_move = "m_crusaders" -sound_move_alt = "m_generic" -sound_fight = "f_crusaders" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 5 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "Horse", "Capturer", "CantReachAir", "WillNever" -roles = "AttackFastStartUnit" -helptext = _("\ -Crusaders are mounted warriors driven by a higher cause.\ - They have superior attack to Knights, but are poor at defending.\ - They are ideally suited for leading the charge in offensive campaigns.\ -") - -[unit_knights] -name = _("Knights") -class = "LandNoKill" -tech_req = "Chivalry" -obsolete_by = "Dragoons" -graphic = "u.knights" -graphic_alt = "-" -sound_move = "m_knights" -sound_move_alt = "m_generic" -sound_fight = "f_knights" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 4 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -bonuses = - { "flag", "type", "value" - "Horse", "DefenseMultiplier", 2 - "FootSoldier", "DefenseMultiplier", 1 - } -flags = "Horse", "Capturer", "CantReachAir", "WillNever" -roles = "AttackFastStartUnit", "BarbarianTech", - "BarbarianBuildTech", "BarbarianSeaTech", "Hunter" -helptext = _("\ -Knights are heavily armored mounted warriors. They defend at D:3 against mounted units.\ - They defend at D:2 against foot units. They defend at D:1 against everything else.\ - Their noble status allows them to attack cities without population reduction.\ -") - -[unit_dragoons] -name = _("Dragoons") -class = "Land" -tech_req = "Leadership" -obsolete_by = "Cavalry" -graphic = "u.dragoons" -graphic_alt = "-" -sound_move = "m_dragoons" -sound_move_alt = "m_generic" -sound_fight = "f_dragoons" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 5 -defense = 2 -hitpoints = 20 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "Horse", "Capturer", "CantReachAir", "WillNever" -roles = "AttackFastStartUnit", "BarbarianBuildTech", "BarbarianSeaTech", "Hunter" -helptext = _("\ -Dragoons are mounted warriors carrying early firearms.\ - Being the first highly mobile gunpowder unit, they are\ - formidable for offensive campaigns.\ -") - -[unit_cavalry] -name = _("Cavalry") -class = "Land" -tech_req = "Tactics" -obsolete_by = "Armor" -graphic = "u.cavalry" -graphic_alt = "-" -sound_move = "m_cavalry" -sound_move_alt = "m_generic" -sound_fight = "f_cavalry" -sound_fight_alt = "f_generic" -build_cost = 60 -pop_cost = 0 -attack = 8 -defense = 3 -hitpoints = 20 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -bonuses = - { "flag", "type", "value" - "Helicopter", "DefenseDividerPct", -50 - ; the only ground unit not covered by "FootSoldier" or "Horse", gets an attack bonus of -50% instead of heli defend bonus of +50% - } -flags = "Capturer", "CantReachAir", "WillNever" -roles = "AttackFastStartUnit", "Hunter" -helptext = _("\ -The combination of mobility and superior attack strength make Cavalry\ - the most feared offensive unit in their era.\ -") - -[unit_armor] -name = _("Armor") -class = "Land" -tech_req = "Mobile Warfare" -obsolete_by = "Armor II" -graphic = "u.armor" -graphic_alt = "-" -sound_move = "m_armor" -sound_move_alt = "m_generic" -sound_fight = "f_armor" -sound_fight_alt = "f_generic" -build_cost = 80 -pop_cost = 0 -attack = 10 -defense = 5 -hitpoints = 30 -firepower = 1 -move_rate = 6 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter" ; transport helicopter only -;disembarks = "Helicopter" -targets = "Balloon", "Helicopter" -flags = "CantReachAir", "FortBuster", "WillNever" -roles = "AttackFastStartUnit", "Hunter" -helptext = _("\ -Armor is the mechanized equivalent of a Cavalry unit. They have high attack strength,\ - superb mobility, and the highest defense of any offensive unit. They are massive all-terrain\ - vehicles, well-suited for penetrating defensive fortifications: Units inside Forts get no defense\ - bonus against Armor. Units inside Fortresses get a reduced bonus of 1.67x instead of 2x.\ -") - -[unit_armor_ii] -name = _("Armor II") -class = "Land" -tech_req = "Plastics" -obsolete_by = "None" -graphic = "u.armor_ii" -graphic_alt = "u.armor" -sound_move = "m_armor_ii" -sound_move_alt = "m_armor" -sound_fight = "f_armor_ii" -sound_fight_alt = "f_armor" -build_cost = 80 -pop_cost = 0 -attack = 16 -defense = 6 -hitpoints = 30 -firepower = 1 -move_rate = 6 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter" ; transport helicopter only -;disembarks = "Helicopter" -targets = "Balloon", "Helicopter" -bonuses = - { "flag", "type", "value" - "Missile", "DefenseMultiplier", 1 - } -flags = "CantReachAir", "FortressBuster", "NeverBlocked", "WillNever" -roles = "AttackFastStartUnit", "Hunter" -helptext = _("\ -Armor II is the ultra-modern upgrade to Armor. It features high tech composite armor and\ - electronic countermeasures (ECM). Forts and Fortresses gain no bonus against\ - its ability to blast and break through fortifications. ECM and composite armor\ - give a 2x defense bonus against Missiles. Unlike most land units,\ - Armor II can attack reachable units regardless of whether unreachable units protect the tile.\ -") - -[unit_catapult] -name = _("Catapult") -class = "Land" -tech_req = "Mathematics" -obsolete_by = "Cannon" -graphic = "u.catapult" -graphic_alt = "-" -sound_move = "m_catapult" -sound_move_alt = "m_generic" -sound_fight = "f_catapult" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 6 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "CantReachAir", "WillNever" -roles = "" -helptext = _("\ -Catapults are war machines that hurl massive rocks to crush\ - and break their targets. They are strong attackers but equally\ - weak defenders, and will need an escort to be effective.\ -") - -[unit_cannon] -name = _("Cannon") -class = "Land" -tech_req = "Metallurgy" -obsolete_by = "Artillery" -graphic = "u.cannon" -graphic_alt = "-" -sound_move = "m_cannon" -sound_move_alt = "m_generic" -sound_fight = "f_cannon" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 8 -defense = 1 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter" ; transport helicopter only -disembarks = "Helicopter" -flags = "CantReachAir", "WillNever" -roles = "BarbarianTech", "BarbarianBuildTech" -helptext = _("\ -Cannons are huge guns that fire heavy metallic projectiles. They are strong\ - attackers but weak defenders, so they need an escort to be effective.\ -") - -[unit_artillery] -name = _("Artillery") -class = "Land" -tech_req = "Machine Tools" -obsolete_by = "Howitzer" -graphic = "u.artillery_o" -graphic_alt = "-" -sound_move = "m_artillery" -sound_move_alt = "m_generic" -sound_fight = "f_artillery" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 10 -defense = 1 -hitpoints = 20 -firepower = 2 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter" ; transport helicopter only -disembarks = "Helicopter" -targets = "Balloon" -flags = "CantReachAir", "WillNever" -roles = "" -helptext = _("\ -Artillery are a major upgrade to Cannons, with doubled firepower. They are\ - superb attackers but poor at defense. They need an escort to be effective.\ -") - -[unit_anti_aircraft] -name = _("Anti-Aircraft Artillery") -class = "LandAirSea" -tech_req = "Flight" -obsolete_by = "None" -graphic = "u.anti_aircraft" -graphic_alt = "u.howitzer" -sound_move = "m_anti_aircraft" -sound_move_alt = "m_generic" -sound_fight = "f_anti_aircraft" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 2 -defense = 2 -hitpoints = 20 -firepower = 2 -move_rate = 2 -vision_radius_sq = 8; hard-coding in physics bonus here since its a req, lets us cut making a new effect -convert_to = "Mobile SAM" -convert_time = 7 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter" -disembarks = "Helicopter" -targets = "Air", "AirProtect", "Sea", "Balloon", "Helicopter" -bonuses = - { "flag", "type", "value" - "AirAttacker", "DefenseDivider", 1 - "AirAttacker", "DefenseMultiplier", 1 - } -flags = "NeverBlocked", "AntiAir", "Marines", "WillNever", "TransportDefender" -roles = "" -helptext = _("\ -Anti-Aircraft Artillery (AAA) can attack almost anything from anywhere. AAA get a\ - 2x bonus against Air units. AAA qualify as weaponry for Marines and have the same\ - abilities: they can be transported on any unit that carries Marines, can attack from\ - or to non-native tiles, and do not lose a turn when unloading. (AAA cannot attack Submarines, Missiles,\ - or Jet Bombers.)\ -"), _(" -After Space Flight and 10 turns of service, AAA can be retrofitted to\ - Mobile SAM. The Convert order must be done in your capital, and takes 4 turns.\ -") - -[unit_mobile_sam] -name = _("Mobile SAM") -class = "Land" -tech_req = "Space Flight" -obsolete_by = "None" -graphic = "u.mobile_sam" -graphic_alt = "u.howitzer" -sound_move = "m_howitzer" -sound_move_alt = "m_generic" -sound_fight = "f_mobile_sam" -sound_fight_alt = "f_generic" -build_cost = 75 -pop_cost = 0 -attack = 2 -defense = 2 -hitpoints = 30 -firepower = 2 -move_rate = 6 -vision_radius_sq = 4 -transport_cap = 1 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter" ; transport helicopter only -disembarks = "Helicopter" -targets = "Air", "AirProtect", "AirPillage", "Balloon", "Helicopter" -cargo = "Missile" -bonuses = - { "flag", "type", "value" - "AirAttacker", "DefenseDivider", 1 - "AirAttacker", "DefenseMultiplier", 1 - } -flags = "NeverBlocked", "AntiAir", "WillNever" -roles = "" -helptext = _("\ -The Mobile SAM is the strongest Anti-Air unit on the ground. It can\ - attack nearby aircraft. It has a 2x bonus against all Air units. The\ - Mobile SAM can also carry one Missile of any type. Unlike the AAA, it\ - cannot attack non-native tiles or attack while transported.\ -"), _(" -AAA can upgrade to Mobile SAM for free on its 10th turn of service.\ - The Convert order must be done in the capital city and takes 4 turns.\ -") - -[unit_howitzer] -name = _("Howitzer") -class = "Land" -tech_req = "Robotics" -obsolete_by = "None" -graphic = "u.howitzer_o" -graphic_alt = "u.howitzer" -sound_move = "m_howitzer" -sound_move_alt = "m_generic" -sound_fight = "f_howitzer" -sound_fight_alt = "f_generic" -build_cost = 70 -pop_cost = 0 -attack = 12 -defense = 2 -hitpoints = 30 -firepower = 2 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter" ; transport helicopter only -disembarks = "Helicopter" -targets = "Balloon" -flags = "CantReachAir", "WillNever" -roles = "" -helptext = _("\ -Howitzers are upgraded Artillery with significant increase in mobility and attack strength. They can fire over city walls, ignoring their effect.\ -") - -[unit_balloon] -name = _("Balloon") -class = "Balloon" -tech_req = "Chemistry" -obsolete_by = "None" -graphic = "u.balloon" -graphic_alt = "u.trireme" -sound_move = "m_balloon" -sound_move_alt = "m_trireme" -sound_fight = "f_warrior" -sound_fight_alt = "f_generic" -build_cost = 25 -pop_cost = 0 -attack = 0 -defense = 0 -hitpoints = 10 -firepower = 1 -move_rate = 5 -vision_radius_sq = 17 -transport_cap = 0 -fuel = 2 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -flags = "Unbribable", "HasNoZOC", "NeverProtects", "NonMil" -roles = "" -helptext = _("\ -Balloons gather intel on potential battle areas. They have great vision and\ - are unreachable by units prior to Riflemen and Ironclads. They can stay in\ - the air for one Turn Change before landing in a City, Fortress, Naval Base,\ - Airbase, or ship with cargo capacity of 4+. Balloons do not block units under\ - them from being attacked, and cannot fly over mountains.\ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - - -[unit_fighter] -name = _("Fighter") -class = "AirProtect" -tech_req = "Flight" -obsolete_by = "Jet Fighter" -graphic = "u.fighter" -graphic_alt = "-" -sound_move = "m_fighter" -sound_move_alt = "m_generic" -sound_fight = "f_fighter" -sound_fight_alt = "f_generic" -build_cost = 60 -pop_cost = 0 -attack = 4 -defense = 3 -hitpoints = 20 -firepower = 2 -move_rate = 20 -vision_radius_sq = 12 -transport_cap = 0 -fuel = 1 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Air", "AirProtect", "Missile", "Balloon", "Helicopter" -bonuses = - { "flag", "type", "value" - } -flags = "AirAttacker", "Unbribable", "HasNoZOC", "CanEscape", - "AirProtector", "Provoking" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -Fighters are the first offensive Air units. Their superior mobility and firepower alter\ - the very nature of warfare. They can move anywhere and attack any unit (except Submarines\ - and Jet Bombers.)\n\ -"), _(" -INTERCEPTOR: the Vigil order lets Fighters auto-attack adjacent Air units if they\ - have better attack odds. A Fighter can Vigil if it uses 2 move points or less.\n\ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_escort_fighter] -name = _("Escort Fighter") -class = "AirProtect" -tech_req = "Radio" -obsolete_by = "Jet Fighter" -graphic = "u.escort_fighter" -graphic_alt = "u.fighter" -sound_move = "m_escort_fighter" -sound_move_alt = "m_generic" -sound_fight = "f_fighter" -sound_fight_alt = "f_generic" -build_cost = 80 -pop_cost = 0 -attack = 3 -defense = 5 -hitpoints = 20 -firepower = 2 -move_rate = 18 -vision_radius_sq = 12 -transport_cap = 0 -fuel = 2 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Air", "AirProtect", "Missile", "Balloon", "Helicopter" -bonuses = - { "flag", "type", "value" - } -flags = "AirAttacker", "Unbribable", "HasNoZOC", "CanEscape", "AirProtector", "Provoking" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 50, 33, 20, 15, 15, 15, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -Escort Fighters are large fighters with high fuel capacity. Higher mass and\ - stronger construction allow them to absorb more damage. They do not attack\ - as well as standard Fighters, but can return home on the next turn. They are\ - good for long-range missions, defensive air support, and escorting bombers.\ -"), _(" -INTERCEPTOR: the Vigil order lets Escort Fighters auto-attack adjacent Air units if they\ - have better attack odds. This unit can Vigil if it uses 3 move points or less.\n\ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_dive_bomber] -name = _("Dive Bomber") -class = "Air" -tech_req = "Radio" -obsolete_by = "Ground Strike Fighter" -graphic = "u.dive_bomber" -graphic_alt = "-" -sound_move = "m_dive_bomber" -sound_move_alt = "m_escort_fighter" -sound_fight = "f_medium_bomber" -sound_fight_alt = "f_artillery" -build_cost = 60 -pop_cost = 0 -attack = 3 -defense = 3 -hitpoints = 20 -firepower = 2 -move_rate = 18 -vision_radius_sq = 12 -transport_cap = 0 -fuel = 1 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Air", "AirProtect", "Balloon", "Helicopter" -bonuses = - { "flag", "type", "value" - ; A4.5 vs all Surface Units - "CantReachAir", "DefenseDividerPct", 50 - "NonMil", "DefenseDividerPct", 50 ; NonMil don't have CantReachAir flag - "AntiAir", "DefenseDividerPct", 50 ; AntiAir don't hav CantReachAir flag - - ; Cancel CantReachAir bonus on Bombers - "FieldUnit", "DefenseDividerPct", -50 - ; D4 vs Anti-Air - "AntiAir", "DefenseMultiplierPct", 33 - } -flags = "AirAttacker", "Unbribable", "CanEscape", - "NeverProtects", "Provoking", "WillNever" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -Dive Bombers are like Fighters but fitted for Ground Attack and Sea combat. Range\ - is reduced by heavy armor and armaments which help in attacking surface targets\ - and in defending against Anti-Air, but hurt in Air-to-Air combat. Though unreachable\ - to Land units, they lack agility to block attacks on their same tile. But over a wider\ - radius, they exert ZoC on adjacent land tiles. The Dive Bomber is not an interceptor.\ - Role specialization yields the following gains and losses over a Fighter:\n\n\ - GAINS:\n\ - • A:4½ vs Surface units (Land or Sea)\n\ - • D:4 vs Anti-Air\n\ - • ZoC\n\ -LOSSES:\n\ - • A3 instead of A4 in Air-to-Air\n\ - • Can't block its tile\n\ - • Can't intercept\ -"), _(" -Communists pay 10 less for this unit. GOTO prevents unit loss from lack of fuel.\ - Override this by ordering adjacent moves.\ -") - -[unit_medium_bomber] -name = _("Medium Bomber") -class = "Air" -tech_req = "Advanced Flight" -obsolete_by = "Jet Bomber" -graphic = "u.medium_bomber" -graphic_alt = "u.bomber" -sound_move = "m_medium_bomber" -sound_move_alt = "m_generic" -sound_fight = "f_medium_bomber" -sound_fight_alt = "f_generic" -build_cost = 85 -pop_cost = 0 -attack = 7 -defense = 2 -hitpoints = 20 -firepower = 2 -move_rate = 15 -vision_radius_sq = 12 -transport_cap = 0 -fuel = 2 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon" -bonuses = - { "flag", "type", "value" - } -flags = "FieldUnit", "Unbribable", "AirAttacker", "HasNoZOC", "CanEscape", - "CantReachAir", "NeverProtects", "Provoking", "WillNever" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -The Medium Bomber is well suited for moderately strong targets or multiple weak targets.\ - It may not attack other Air units. It is a Soft Field Unit and can't carry Bomb\ - units, causing less discontent than other types of Bombers.\n\ -➤ Unhappy effect for Soft Field units:\n\ -Republic:0 Democracy:1 (non-aggressive)\n\ -Republic:1 Democracy:2 (aggressive)\ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_bomber] -name = _("Heavy Bomber") -class = "Air" -tech_req = "Radar" -obsolete_by = "Jet Bomber" -graphic = "u.heavy_bomber_o" -graphic_alt = "u.bomber" -sound_move = "m_bomber" -sound_move_alt = "m_generic" -sound_fight = "f_heavy_bomber" -sound_fight_alt = "f_bomber" -build_cost = 120 -pop_cost = 0 -attack = 12 -defense = 3 -hitpoints = 20 -firepower = 2 -move_rate = 16 -vision_radius_sq = 12 -transport_cap = 1 -fuel = 2 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon" -cargo = "Bomb" -bonuses = - { "flag", "type", "value" - } -flags = "FieldUnit", "Unbribable", "AirAttacker", "HasNoZOC", "CanEscape", - "CantReachAir", "NeverProtects", "Provoking", "WillNever" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -Heavy Bombers are large and sturdy Bombers with larger payload and numerous gunner defense stations.\ - They are excellent for hitting strong well-defended ground targets.\ - They cannot attack Air units. They can carry one Bomb. Like most Bombers, the Heavy Bomber is a Field Unit.\ - Field Units cause the same unhappiness no matter if aggressively or peacefully deployed.\n\ -➤ Unhappy effect for Field units:\n\ -Republic:1 Democracy:2\ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_strategic_bomber] -name = _("Strategic Bomber") -class = "Air" -tech_req = "Rocketry" -obsolete_by = "Jet Bomber" -graphic = "u.ultra_heavy_bomber_o" -graphic_alt = "u.bomber" -sound_move = "m_strategic_bomber" -sound_move_alt = "m_bomber" -sound_fight = "f_strategic_bomber" -sound_fight_alt = "f_bomber" -build_cost = 135 -pop_cost = 0 -attack = 13 -defense = 4 -hitpoints = 20 -firepower = 2 -move_rate = 16 -vision_radius_sq = 12 -transport_cap = 2 -fuel = 3 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon" -cargo = "Bomb" -bonuses = - { "flag", "type", "value" - } -flags = "FieldUnit", "Unbribable", "AirAttacker", "HasNoZOC", "CanEscape", - "CantReachAir", "NeverProtects", "Provoking", "WillNever" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -The Strategic Bomber offers a small improvement in attack. Higher altitude offers a good upgrade in\ - defense. It has considerably longer range, with one more turn of fuel. May carry two Bombs.\ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_awacs] -name = _("AWACS") -class = "Air" -tech_req = "Radar" -obsolete_by = "None" -graphic = "u.awacs_o" -graphic_alt = "u.awacs" -sound_move = "m_awacs" -sound_move_alt = "m_generic" -sound_fight = "f_awacs" -sound_fight_alt = "f_generic" -build_cost = 140 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 20 -firepower = 1 -move_rate = 32 -vision_radius_sq = 46 -transport_cap = 0 -fuel = 2 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -flags = "HasNoZOC", "NoVeteran", "Unbribable", "Expellable", "NeverProtects", "CanEscape", "Provoking" -roles = "" -helptext = _("\ -The AWACS has great fuel capacity for long range flights, and advanced radar that can determine\ - the location of enemy units over a wide area.\ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_transport_helicopter] -; /* TRANS: unit type */ -name = _("Transport Helicopter") -class = "Helicopter" -tech_req = "Combined Arms" -obsolete_by = "None" -graphic = "u.t_helicopter" -graphic_alt = "u.helicopter" -sound_move = "m_helicopter" -sound_move_alt = "m_generic" -sound_fight = "f_helicopter" -sound_fight_alt = "f_generic" -build_cost = 90 -pop_cost = 0 -attack = 0 -defense = 3 -hitpoints = 21 -firepower = 2 -move_rate = 12 -vision_radius_sq = 12 -transport_cap = 3 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -bonuses = - { "flag", "type", "value" - "FootSoldier", "DefenseMultiplierPct", 50 ; all Infantry (Foot and Mech.) - "Horse", "DefenseMultiplierPct", 50 - ;Cavalry is covered by it getting a separate "attack bonus of -50%" - } -cargo = "Land", "LandAirSea", "LandNoKill" -flags = "Helicopter", "AirAttacker", "Unbribable", "Provoking", - "CanEscape", "WillNever", "HasNoZOC" - ; Tranport Heli is provoking; Fighters don't like them. -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 50, 33, 20, 15, 15, 15, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -Transport Helicopters can carry three land units.\ -"), _("\ - Foot and artillery types can load/unload on any tile. Other types\ - need a refuel-tile. Unloading on a non-refuel tile loses all moves\ - (except Marines)\n.\ -"), _("\ - Helicopters lose 1 hp for each turn not ended in a City, Base, or Carrier. +1 move\ - is awarded if starting a turn in a City or Airbase.\n\ -"), _("\ - All Helicopters can be attacked by land from Riflemen onward; by sea from Ironclad\ - onward; get +50% defence vs. foot units; and are unreachable to artillery types.\ - Unlike attack Helicopters, Transport Helicopters are intercepted by Fighters on vigil.\ -") - -[unit_helicopter] -; /* TRANS: unit type */ -name = _("Helicopter") -class = "Helicopter" -tech_req = "Combined Arms" -obsolete_by = "None" -graphic = "u.helicopter" -graphic_alt = "-" -sound_move = "m_helicopter" -sound_move_alt = "m_generic" -sound_fight = "f_helicopter" -sound_fight_alt = "f_generic" -build_cost = 95 -pop_cost = 0 -attack = 10 -defense = 5 -hitpoints = 21 -firepower = 2 -move_rate = 12 -vision_radius_sq = 12 -transport_cap = 1 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter" -bonuses = - { "flag", "type", "value" - "FootSoldier", "DefenseMultiplierPct", 50 ; all Infantry (Foot and Mech.) - "Horse", "DefenseMultiplierPct", 50 - ;Cavalry is covered by it getting a separate "attack bonus of -50%" - } -cargo = "LandAirSea" -flags = "Helicopter", "AirAttacker", "Unbribable", - "CanEscape", "WillNever" - ; Heli is low-altitude and non-provoking: if it's ever thought to be OP, - ; changing this flag fixes that right away. But currently it MIGHT be UnP - ; because hp_loss, range, city walls, and Ground Strike Fighter -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 50, 33, 20, 15, 15, 15, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -Helicopters are the Air Cavalry of modern armies. They can attack multiple targets\ - and conquer cities. Unaffected by terrain, they are good for Partisan suppression.\ - They can transport Marines and AAA and are thus well-suited for commando ops.\n\ -"), _("\ -For each turn not ended in a City, Base, or Carrier, 1hp is lost. +1 move\ - is awarded if starting a turn in a City or Airbase.\n\ -"), _("\ -Helicopters fly low to avoid Interception. This invites attacks by ground units from\ - Riflemen onward. They are unreachable to Artillery types and get +50% defense\ - vs. foot units. City Walls get a defense bonus against them;\ - SAM Batteries do not. Helicopters can be attacked by Sea from Ironclad onward.\n\ -"), _("\ -Helicopters can transport one Marines or AAA unit.\ -") - -[unit_jet_fighter] -name = _("Jet Fighter") -class = "AirProtect" -tech_req = "Avionics" -obsolete_by = "None" -graphic = "u.jet_fighter" -graphic_alt = "u.stealth_fighter" -sound_move = "m_jet_fighter" -sound_move_alt = "m_stealth_fighter" -sound_fight = "f_jet_fighter" -sound_fight_alt = "f_stealth_fighter" -build_cost = 70 -pop_cost = 0 -attack = 6 -defense = 5 -hitpoints = 20 -firepower = 2 -move_rate = 24 -vision_radius_sq = 12 -transport_cap = 0 -fuel = 1 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Air", "AirProtect", "AirPillage", "Missile", "Balloon", "Helicopter" -bonuses = - { "flag", "type", "value" - } -flags = "AirAttacker", "Unbribable", "HasNoZOC", "CanEscape", "AirProtector", "Provoking" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -Jet Fighters upgrade the Fighter with improved attack, defense, and range.\ -"), _(" -INTERCEPTOR: the Vigil order Jets Fighters auto-attack adjacent Air units if they\ - have better attack odds. This unit can Vigil if it uses 3 move points or less.\n\ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_strike_fighter] -name = _("Ground Strike Fighter") -class = "Air" -tech_req = "Avionics" -obsolete_by = "None" -graphic = "u.strike_fighter" -graphic_alt = "-" -sound_move = "m_strike_fighter" -sound_move_alt = "m_jet_fighter" -sound_fight = "f_medium_bomber" -sound_fight_alt = "f_artillery" -build_cost = 80 -pop_cost = 0 -attack = 7 -defense = 4 -hitpoints = 20 -firepower = 2 -move_rate = 21 -vision_radius_sq = 12 -transport_cap = 0 -fuel = 2 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Air", "AirPillage", "Balloon", "Helicopter" -bonuses = - { "flag", "type", "value" - "AntiAir", "DefenseMultiplierPct", 33 ; D5.33 vs Anti-Air - } -flags = "AirAttacker", "Unbribable", "CanEscape", "NeverBlocked", - "NeverProtects", "Provoking", "WillNever" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -Ground Strike Fighters upgrade the Dive Bomber. They cannot block attacks on other\ - units on their tile, nor engage against Fighters. However, like the Dive Bomber,\ - they can interdict ZoC over land tiles. High fuel capacity allows two turns in the\ - air. No unit can stop this unit from attacking surface units on a tile. This unit\ - can also do pinpointed surgical strikes to pillage tiles. This aircraft is a\ - specialized niche unit. It is not an interceptor.\n\ -NOTE: GOTO prevents unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_jet_bomber] -name = _("Jet Bomber") -class = "AirPillage" -tech_req = "Space Flight" -obsolete_by = "None" -graphic = "u.jet_bomber_o" -graphic_alt = "u.bomber" -sound_move = "m_jet_bomber" -sound_move_alt = "m_bomber" -sound_fight = "f_jet_bomber" -sound_fight_alt = "f_bomber" -build_cost = 145 -pop_cost = 0 -attack = 15 -defense = 1 -hitpoints = 20 -firepower = 2 -move_rate = 19 -vision_radius_sq = 12 -transport_cap = 3 -fuel = 3 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -cargo = "Bomb" -flags = "FieldUnit", "Unbribable", "AirAttacker", "HasNoZOC", "CanEscape", - "CantReachAir", "NeverProtects", "Provoking", "WillNever" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -Jet Bombers are stratospheric long-range bombers with 3 turns of fuel: they can be airborne for two\ - turn-changes. Their range makes them useful even after Stealth Bombers are available. Stratospheric\ - altitude is unreachable to propeller-based Fighters and AAA. Jet Bombers can carpet-bomb,\ - pillaging tiles from the air. May carry three Bombs.\ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_stealth_fighter] -name = _("Stealth Fighter") -class = "AirProtect" -tech_req = "Stealth" -obsolete_by = "None" -graphic = "u.stealth_fighter" -graphic_alt = "-" -sound_move = "m_stealth_fighter" -sound_move_alt = "m_generic" -sound_fight = "f_stealth_fighter" -sound_fight_alt = "f_generic" -build_cost = 80 -pop_cost = 0 -attack = 8 -defense = 4 -hitpoints = 20 -firepower = 2 -move_rate = 28 -vision_radius_sq = 12 -transport_cap = 0 -fuel = 1 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Air", "AirProtect", "AirPillage", "Missile", "Balloon", "Helicopter" -bonuses = - { "flag", "type", "value" - "AntiAir", "DefenseDividerPct", 25 - "AntiAir", "DefenseMultiplierPct", 25 - } -vision_layer = "Stealth" -flags = "AirAttacker", "Unbribable", "HasNoZOC", "CanEscape", "AirProtector", "Provoking" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -The most advanced Fighter, with improved attack and longer range. Stealth Fighters cannot be seen unless adjacent\ - to an enemy. Stealth evasion gives a 25% bonus against all Anti-Air units, and reduces\ - SAM Batteries down to a smaller 25% bonus.\ -"), _(" -INTERCEPTOR: the Vigil order lets Stealth Fighters auto-attack adjacent Air units if they\ - have better attack odds. This unit can Vigil if it uses 4 move points or less.\n\ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_stealth_bomber] -name = _("Stealth Bomber") -class = "Air" -tech_req = "Stealth" -obsolete_by = "None" -graphic = "u.stealth_bomber_o" -graphic_alt = "u.stealth_bomber" -sound_move = "m_stealth_bomber" -sound_move_alt = "m_generic" -sound_fight = "f_stealth_bomber" -sound_fight_alt = "f_generic" -build_cost = 160 -pop_cost = 0 -attack = 19 -defense = 5 -hitpoints = 20 -firepower = 2 -move_rate = 24 -vision_radius_sq = 12 -transport_cap = 2 -fuel = 2 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon" -bonuses = - { "flag", "type", "value" - "AntiAir", "DefenseDividerPct", 25 - "AntiAir", "DefenseMultiplierPct", 25 - } -vision_layer = "Stealth" -cargo = "Bomb" -flags = "FieldUnit", "AirAttacker", "HasNoZOC", "Unbribable", - "CanEscape", "CantReachAir", "NeverProtects", "Provoking", "WillNever" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:ace"), - _("?vet_rank:top gun") -veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 -veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 -roles = "" -helptext = _("\ -The deadliest Bomber, with improved attack and speed. Stealth Bombers cannot be seen\ - unless adjacent to an enemy. Stealth evasion gives a 25% bonus against all Anti-Air\ - units, and reduces SAM Batteries down to only a 25% bonus. May carry two Bombs.\ -"), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ -") - -[unit_boat] -name = _("Boat") -class = "RiverShip" -tech_req = "None" -obsolete_by = "Trireme" -graphic = "u.boat" -graphic_alt = "-" -sound_move = "m_trireme" -sound_move_alt = "m_generic" -sound_fight = "f_trireme" -sound_fight_alt = "f_generic" -build_cost = 10 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 1 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea" -flags = "BadCityDefender", "HelpWonder", "TradeRoute", "CoastStrict", "NonMil", "HasNoZOC" -roles = "Ferryboat", "FerryStartUnit" -helptext = _("\ -Boats were used pre-historically for exploration,\ - transport, and interaction with other tribes. They\ - can travel rivers and oceans, but must always stay\ - near shore. Boats can carry one unit and do ancient\ - commerce: building Wonders or setting up Traderoutes\ - without Trade tech. Primitive bartering generates little\ - or no extra trade, but may help you advance faster or\ - create relations with ancient neighbors. To build\ - Wonders with Boats requires Currency.\ -") - -[unit_trireme] -name = _("Trireme") -class = "Trireme" -tech_req = "Alphabet" -obsolete_by = "Galley" -graphic = "u.trireme" -graphic_alt = "-" -sound_move = "m_trireme" -sound_move_alt = "m_generic" -sound_fight = "f_trireme" -sound_fight_alt = "f_generic" -build_cost = 20 -pop_cost = 0 -attack = 1 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 6 -vision_radius_sq = 4 -transport_cap = 2 -fuel = 2 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea" -flags = "BadCityDefender", "CantReachAir", "HelpWonder", - "TradeRoute", "Coast", "WillNever" -roles = "Ferryboat", "FerryStartUnit" -helptext = _("\ -Triremes are used for exploration, transport, and Commerce.\ - The entry on Caravan explains what Commerce units may do.\ -"), _(" -Triremes can enter Deep Ocean, but there is risk: they must end every second\ - turn on river, coastline, or a city—or else be lost at sea. They can travel\ - and attack on rivers, but cannot attack the shore.\ -"), _(" -Like most ancient sea units, when it initiates combat there will be 15 rounds\ - of combat and 15 total hp lost between both units. This may or may not\ - result in a victor. Triremes do not cause unhappiness.\ -") - -[unit_longboat] -name = _("Longboat") -class = "RiverShip" -tech_req = "Map Making" -obsolete_by = "Caravel" -graphic = "u.longboat" -graphic_alt = "u.trireme" -sound_move = "m_longboat" -sound_move_alt = "m_trireme" -sound_fight = "f_trireme" -sound_fight_alt = "f_generic" -build_cost = 25 -pop_cost = 0 -attack = 2 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 6 -vision_radius_sq = 4 -transport_cap = 1 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea" -flags = "BadCityDefender", "CantReachAir", "WillNever" -roles = "Ferryboat", "Hunter" -helptext = _("\ -The Longboat is a warship. It can attack at sea, attack the shore, and carry one land\ - unit. It is useful for ancient sea campaigns. Longboats can travel on rivers.\ -"), _(" -Like most early sea units, when it initiates combat there will be 15 rounds\ - of combat and 15 total hp lost between both units. This may or may not\ - result in the loss of one of the units.\ -") - -[unit_galley] -name = _("Galley") -class = "RiverShip" -tech_req = "Seafaring" -obsolete_by = "Caravel" -graphic = "u.galley" -graphic_alt = "u.trireme" -sound_move = "m_galley" -sound_move_alt = "m_trireme" -sound_fight = "f_trireme" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 2 -defense = 2 -hitpoints = 10 -firepower = 1 -move_rate = 6 -vision_radius_sq = 4 -transport_cap = 2 -fuel = 0 -uk_happy = 0 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea" -flags = "BadCityDefender", "CantReachAir", "HelpWonder", - "Traderoute", "Only_Native_Attack", "WillNever" -roles = "Ferryboat", "FerryStartUnit", "BarbarianBoat" -helptext = _("\ -The Galley is an all-purpose sea unit and upgrades the Trireme. It has decent\ - combat strength, can transport, and is a Commerce unit. The entry on Caravan\ - explains what Commerce units may do. Galleys can travel and attack on rivers,\ - but cannot attack the shore. Galleys do not cause unhappiness.\ -"), _(" -Like most early sea units, when it initiates an attack, there will be 15 rounds\ - of combat and 15 total hp lost between both units. This may or may not\ - result in the loss of one of the units.\ -") - -[unit_war_galley] -name = _("War Galley") -class = "RiverShip" -tech_req = "Astronomy" -obsolete_by = "Caravel" -graphic = "u.war_galley" -graphic_alt = "u.trireme" -sound_move = "m_war_galley" -sound_move_alt = "m_trireme" -sound_fight = "f_trireme" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 3 -defense = 3 -hitpoints = 10 -firepower = 1 -move_rate = 6 -vision_radius_sq = 4 -transport_cap = 3 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea" -flags = "BadCityDefender", "CantReachAir", "WillNever" -roles = "Ferryboat", "FerryStartUnit", "BarbarianBoat", "Hunter" -helptext = _("\ -The War Galley has improved offense, defense, and cargo capacity, but lacks commerce\ - ability. War Galleys can travel and attack on rivers, and do shore attacks from the sea.\ -"), _(" -Like most ancient sea units, when it initiates combat there will be 15 rounds\ - of combat and 15 total hitpoints lost between both units. This may or may not\ - result in the loss of one of the units.\ -") - -[unit_ram_ship] -name = _("Ram Ship") -class = "Sea" -tech_req = "Engineering" -obsolete_by = "Caravel" -graphic = "u.ram_ship" -graphic_alt = "u.trireme" -sound_move = "m_ram_ship" -sound_move_alt = "m_trireme" -sound_fight = "f_ram_ship" -sound_fight_alt = "f_catapult" -build_cost = 35 -pop_cost = 0 -attack = 4 -defense = 2 -hitpoints = 10 -firepower = 1 -move_rate = 6 -vision_radius_sq = 1 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea" -flags = "BadCityDefender", "CantReachAir", "Only_Native_Attack", "WillNever" -roles = "Hunter" -helptext = _("\ -The Ram Ship has one purpose: to destroy other ships. It has poor vision, no transport or\ - commerce ability, and cannot travel rivers. Unlike other early ships, there will always be\ - a winner and a loser when Ram Ships attack. They are good for first-strike, and are good\ - counter units for nations not invested into sea tech. Ram Ships cannot do shore attacks.\ -") - -[unit_caravel] -name = _("Caravel") -class = "RiverShip" -tech_req = "Navigation" -obsolete_by = "Galleon" -graphic = "u.caravel" -graphic_alt = "u.trireme" -sound_move = "m_caravel" -sound_move_alt = "m_generic" -sound_fight = "f_caravel" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 4 -defense = 4 -hitpoints = 10 -firepower = 1 -move_rate = 7 -vision_radius_sq = 4 -transport_cap = 3 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea" -flags = "BadCityDefender", "CantReachAir", "Traderoute", "WillNever" -roles = "Ferryboat", "FerryStartUnit", "BarbarianBoat", "Hunter" -helptext = _("\ -Caravels upgrade older sea units, and are a big advance in combat, speed, range, and transport capacity. They have\ - the commerce ability of the Galley, but cannot build Wonders. Caravels can travel and attack on rivers and do shore attacks.\ -"), _(" -Like most early sea units, when it initiates an attack, there will be 15 rounds\ - of combat and 15 total hitpoints lost between both units. This may or may not\ - result in the loss of one of the units.\ -") - -[unit_galleon] -name = _("Galleon") -class = "RiverShip" -tech_req = "Magnetism" -obsolete_by = "Transport" -graphic = "u.galleon" -graphic_alt = "-" -sound_move = "m_galleon" -sound_move_alt = "m_generic" -sound_fight = "f_galleon" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 2 -defense = 3 -hitpoints = 20 -firepower = 1 -move_rate = 8 -vision_radius_sq = 4 -transport_cap = 4 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Submarine" -cargo = "Land", "LandNoKill", "LandAirSea", "Balloon" -flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever" -roles = "Ferryboat", "FerryStartUnit", "BarbarianBoat" -helptext = _("\ -The Galleon is a heavily armed transport ship that can carry up to 4 units. Galleons can travel and attack on rivers,\ - and also do shore attacks. Galleon crews repair their ship an extra +1hp per turn, regardless of whether it has moved.\ -"), _(" -Like most early sea units, when it initiates combat there will be 15 rounds\ - of combat and 15 total hitpoints lost between both units. This may or may not\ - result in the loss of one of the units.\ -"), _(" -Galleons can Stack-Escape: a 50% chance to escape a killed stack if they have more remaining moves than the attacker.\ -") - -[unit_frigate] -name = _("Frigate") -class = "RiverShip" -tech_req = "Magnetism" -obsolete_by = "Ironclad" -graphic = "u.frigate" -graphic_alt = "-" -sound_move = "m_frigate" -sound_move_alt = "m_generic" -sound_fight = "f_frigate" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 4 -defense = 3 -hitpoints = 20 -firepower = 1 -move_rate = 8 -vision_radius_sq = 4 -transport_cap = 2 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Submarine" -cargo = "Land", "LandNoKill", "LandAirSea" -bonuses = - { "flag", "type", "value" - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever" -roles = "Hunter" -helptext = _("\ -The Frigate is versatile — it's a superior offensive unit and also a decent transport ship. Frigates\ - can travel and attack on rivers, or make shore attacks from sea. Frigate crews repair their ship an\ - extra +1hp per turn, regardless of whether it has moved.\ -"), _(" -From Frigates onward, all sea attacks end with a single victor.\ - Frigates can Stack-Escape: a 50% chance to escape a killed stack if they have more remaining move points than the attacker.\ -") - -[unit_ironclad] -name = _("Ironclad") -class = "Sea" -tech_req = "Steam Engine" -obsolete_by = "Destroyer" -graphic = "u.ironclad" -graphic_alt = "-" -sound_move = "m_ironclad" -sound_move_alt = "m_generic" -sound_fight = "f_ironclad" -sound_fight_alt = "f_generic" -build_cost = 60 -pop_cost = 0 -attack = 4 -defense = 4 -hitpoints = 30 -firepower = 1 -move_rate = 8 -vision_radius_sq = 8 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter" -bonuses = - { "flag", "type", "value" - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever" -roles = "Hunter" -helptext = _("\ -The Ironclad is an armored ship that is much more sturdy than the Frigate but\ - loses transport capability and the ability to navigate rivers. From the Ironclad\ - onward, warships are excellent at attacking shore targets, and can also pillage\ - buoys.\ -"), _(" -Ironclads and all modern ships can Stack-Escape: a 50% chance to escape a killed stack if they have more remaining move points than the attacker.\ -") - -[unit_destroyer] -name = _("Destroyer") -class = "Sea" -tech_req = "Electricity" -obsolete_by = "Missile Destroyer" -graphic = "u.destroyer" -graphic_alt = "-" -sound_move = "m_missile_destroyer" -sound_move_alt = "m_destroyer" -sound_fight = "f_missile_destroyer" -sound_fight_alt = "f_destroyer" -build_cost = 60 -pop_cost = 0 -attack = 5 -defense = 5 -hitpoints = 30 -firepower = 1 -move_rate = 12 -vision_radius_sq = 15 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter" -bonuses = - { "flag", "type", "value" - "Submarine", "DefenseMultiplier", 3 - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever" -roles = "Hunter" -helptext = _("\ -Destroyers are the first of the modern ships to start your modern\ - navy. Their main roles are fast scouting, seek-and-destroy,\ - anti-submarine warfare, shore bombardment of lighter targets,\ - and supporting the needs of larger fleets. 4x ASW defence gives a\ - 35% chance defending vs Submarines.\ -") - -[unit_cruiser] -name = _("Cruiser") -class = "Sea" -tech_req = "Steel" -obsolete_by = "AEGIS Cruiser" -graphic = "u.cruiser" -graphic_alt = "-" -sound_move = "m_cruiser" -sound_move_alt = "m_generic" -sound_fight = "f_cruiser" -sound_fight_alt = "f_generic" -build_cost = 80 -pop_cost = 0 -attack = 6 -defense = 6 -hitpoints = 30 -firepower = 2 -move_rate = 11 -vision_radius_sq = 13 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter" -bonuses = - { "flag", "type", "value" - "Submarine", "DefenseMultiplier", 1 - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever" -roles = "Hunter" -helptext = _("\ -The Cruiser is a large and fast surface warship with equally strong offensive and defensive strength. More often than not, its\ - 2x ASW defence allows it to survive a Submarine attack.\ -"), _("\ -The main duties of the Cruiser are offensive strikes against lesser ships, and escorting weaker ships.\ -") - -[unit_missile_destroyer] -name = _("Missile Destroyer") -class = "Sea" -tech_req = "Rocketry" -obsolete_by = "None" -graphic = "u.missile_destroyer" -graphic_alt = "u.destroyer" -sound_move = "m_destroyer" -sound_move_alt = "m_generic" -sound_fight = "f_destroyer" -sound_fight_alt = "f_generic" -build_cost = 60 -pop_cost = 0 -attack = 5 -defense = 5 -hitpoints = 30 -firepower = 2 -move_rate = 12 -vision_radius_sq = 16 -transport_cap = 1 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter" -cargo = "Missile" -bonuses = - { "flag", "type", "value" - "Submarine", "DefenseMultiplier", 1 - "Marines", "DefenseMultiplier", 1 - "AirAttacker", "DefenseMultiplier", 1 - "Missile", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever" -roles = "Hunter" -helptext = _("\ -The Missile Destroyer has double the firepower of a Destroyer, and shares the same roles\ - as its ancestor. It gains 2x defense against Air and Missile units. It has a 2x ASW bonus\ - and can can carry one Missile.\ -") - -[unit_aegis_cruiser] -name = _("AEGIS Cruiser") -class = "Sea" -tech_req = "Rocketry" -obsolete_by = "None" -graphic = "u.aegis_cruiser" -graphic_alt = "-" -sound_move = "m_aegis_cruiser" -sound_move_alt = "m_generic" -sound_fight = "f_aegis_cruiser" -sound_fight_alt = "f_generic" -build_cost = 100 -pop_cost = 0 -attack = 8 -defense = 8 -hitpoints = 30 -firepower = 2 -move_rate = 11 -vision_radius_sq = 19 -transport_cap = 2 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Air", "AirProtect", "AirPillage", "Missile", "Helicopter", "Balloon", "Submarine" -cargo = "Missile" -bonuses = - { "flag", "type", "value" - "AirAttacker", "DefenseMultiplier", 2 - "Missile", "DefenseMultiplier", 2 - "Submarine", "DefenseMultiplier", 1 - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "CanEscape", "AntiAir", "WillNever" -roles = "Hunter" -helptext = _("\ -The AEGIS Cruiser has an Anti-Air missile system. Radar and sonar\ - give superior vision and 2x defense bonus against Submarines.\ - The AEGIS can carry two Missiles, and is the only ship that can attack\ - Air and Missile units.\ -"), _("\ -Excellent vision and 3x Anti-Air bonus are ideal for scouting and escorting.\ -") - -[unit_battleship] -name = _("Battleship") -class = "Sea" -tech_req = "Refining" -obsolete_by = "None" -graphic = "u.battleship" -graphic_alt = "u.battleship" -sound_move = "m_battleship" -sound_move_alt = "m_generic" -sound_fight = "f_battleship" -sound_fight_alt = "f_generic" -build_cost = 160 -pop_cost = 0 -attack = 12 -defense = 12 -hitpoints = 40 -firepower = 2 -move_rate = 10 -vision_radius_sq = 12 -transport_cap = 0 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter" -bonuses = - { "flag", "type", "value" - "Submarine", "DefenseMultiplier", 1 - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever" -roles = "" -helptext = _("\ -The Battleship is the supreme naval unit with excellent offensive and defensive strength. It has a 2x defense bonus vs Submarines.\ -") - -[unit_submarine] -name = _("Submarine") -class = "Submarine" -tech_req = "Automobile" -obsolete_by = "None" -graphic = "u.submarine" -graphic_alt = "-" -sound_move = "m_submarine" -sound_move_alt = "m_generic" -sound_fight = "f_submarine" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 12 -defense = 2 -hitpoints = 28 -firepower = 2 -move_rate = 10 -vision_radius_sq = 12 -transport_cap = 8 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Submarine" -cargo = "Missile" -vision_layer = "Subsurface" -bonuses = - { "flag", "type", "value" - "Submarine", "DefenseMultiplier", 1 - } -flags = "NeverProtects", "BadCityDefender", "Only_Native_Attack", - "Submarine", "CanEscape", "CantReachAir", "WillNever" -roles = "Hunter" -helptext = _("\ -Submarines are strong attackers but weak defenders. They can carry 8 Missiles.\ - They are unreachable by Air units, but do not block air attacks on surface ships.\ - Submarines cannot attack units on shore. Submarines cannot be seen by other players\ - unless they have a unit or city adjacent to it.\ -"), _("\ -Submarines have superior attrition rates when attacking in numbers. They excel\ - at hit-and-run against weaker ships.\ -") - -[unit_carrier] -name = _("Carrier") -class = "Sea" -tech_req = "Advanced Flight" -obsolete_by = "None" -graphic = "u.carrier" -graphic_alt = "-" -sound_move = "m_carrier" -sound_move_alt = "m_generic" -sound_fight = "f_carrier" -sound_fight_alt = "f_generic" -build_cost = 160 -pop_cost = 0 -attack = 1 -defense = 9 -hitpoints = 40 -firepower = 2 -move_rate = 10 -vision_radius_sq = 12 -transport_cap = 8 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter" -cargo = "Air", "AirProtect", "AirPillage", "Missile", "Helicopter", "Balloon", "LandAirSea" -bonuses = - { "flag", "type", "value" - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "Only_Native_Attack", "CanEscape", - "CantReachAir", "WillNever" -roles = "" -helptext = _("\ -The Carrier is a mobile airport that can carry Air units, Helicopters, AAA, Marines, and Missiles.\ - Fighters can Vigil on a Carrier if they have enough moves and the Carrier has not moved since the\ - Vigil order was given.\ -"), _("\ -Carriers are very expensive and thus, usually protected by a fleet of scouts and escorts.\ -") - -[unit_cargo_ship] -name = _("Cargo Ship") -class = "RiverShip" -tech_req = "Industrialization" -obsolete_by = "None" -graphic = "u.cargo_ship" -graphic_alt = "u.transport" -sound_move = "m_transport" -sound_move_alt = "m_transport" -sound_fight = "f_trireme" -sound_fight_alt = "f_generic" -build_cost = 45 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 30 -firepower = 1 -move_rate = 7 -vision_radius_sq = 4 -transport_cap = 4 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea", "Balloon" -flags = "BadCityDefender", "HelpWonder", "Traderoute", "NonMil", "HasNoZOC", "NoVeteran" -roles = "" -helptext = _("\ -Cargo ships are Commerce units: they can establish Trade Routes and help\ - build Wonders. They can travel rivers and oceans. Cargo ships can also carry\ - four land units: thus, they are useful for transporting units by river or sea.\ -") - -[unit_transport] -name = _("Transport") -class = "Sea" -tech_req = "Industrialization" -obsolete_by = "None" -graphic = "u.transport" -graphic_alt = "-" -sound_move = "m_transport" -sound_move_alt = "m_generic" -sound_fight = "f_transport" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 0 -defense = 3 -hitpoints = 30 -firepower = 1 -move_rate = 10 -vision_radius_sq = 12 -transport_cap = 8 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea", "Balloon" -bonuses = - { "flag", "type", "value" - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "CanEscape" -roles = "Ferryboat", "FerryStartUnit" -helptext = _("\ -The Transport cannot attack but can defend itself when under attack.\ - Marines and Anti-Aircraft Artillery can directly attack from a Transport. Its\ - large cargo capacity makes it a significant logistical upgrade in\ - sea transportation.\ -") - -[unit_cruise_missile] -name = _("Cruise Missile") -class = "Missile" -tech_req = "Rocketry" -obsolete_by = "None" -graphic = "u.cruise_missile" -graphic_alt = "-" -sound_move = "m_cruise_missile" -sound_move_alt = "m_generic" -sound_fight = "f_cruise_missile" -sound_fight_alt = "f_generic" -build_cost = 60 -pop_cost = 0 -attack = 18 -defense = 0 -hitpoints = 10 -firepower = 3 -move_rate = 24 -vision_radius_sq = 2 -transport_cap = 0 -fuel = 1 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "Submarine" -disembarks = "Submarine" -flags = "NeverProtects", "FieldUnit", "OneAttack", "HasNoZOC", "Unbribable", - "CantReachAir", "Missile", "NeverBlocked", "WillNever" -roles = "" -helptext = _("\ -A Cruise Missile can strike distant targets. It\ - cannot attack Air units, but Air units never block\ - a strike on reachable surface units. Cruise Missiles\ - can be relocated by ending their turn on a city,\ - airbase, Submarine, Missile Destroyer, AEGIS Cruiser,\ - Carrier, or Mobile SAM. A Cruise Missile cannot\ - block attacks on other units on its tile.\ -") - -[unit_atom_bomb] -name = _("Atom Bomb") -class = "Bomb" -tech_req = "Nuclear Fission" -obsolete_by = "None" -graphic = "u.atom_bomb" -graphic_alt = "u.nuclear" -sound_move = "m_atom_bomb" -sound_move_alt = "m_generic" -sound_fight = "f_atom_bomb" -sound_fight_alt = "f_nuclear" -build_cost = 150 -pop_cost = 0 -attack = 100 -defense = 0 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 0 -transport_cap = 0 -fuel = 1 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter", "Air", "AirProtect", "AirPillage", "Missile", "Submarine" -disembarks = "Air", "AirPillage" -flags = "NeverProtects", "FieldUnit", "OneAttack", "Nuclear", "HasNoZOC", "Unbribable", - "NeverBlocked", "WillNever", "NoVeteran" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "" -helptext = _("\ -If you have Nuclear Fission and the Manhattan Project has been built by any player, you can make Atom Bombs.\ - A Bomber can drop it within two tiles of its location. Unload the bomb and fly the Bomber out of range, then\ - attack the target (or detonate by pressing D twice.) The blast destroys ALL cardinally adjacent tiles. City population\ - is reduced by half. Land tiles may get nuclear fallout.\ -"), _("\ -Fallout reduces tile output and increases risk of nuclear winter.\ -") -bombard_rate = -1 ; default radius - 1 = just nuke single tile. - -[unit_hbomb] -name = _("Hydrogen Bomb") -class = "Bomb" -tech_req = "Fusion Power" -impr_req = "Enrichment Facility" -obsolete_by = "None" -graphic = "u.hbomb" -graphic_alt = "u.nuclear" -sound_move = "m_atom_bomb" -sound_move_alt = "m_generic" -sound_fight = "f_atom_bomb" -sound_fight_alt = "f_nuclear" -build_cost = 190 -pop_cost = 0 -attack = 100 -defense = 0 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 0 -transport_cap = 0 -fuel = 1 -uk_happy = 2 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter", "Air", "AirProtect", "AirPillage", "Missile", "Submarine" -disembarks = "Air", "AirPillage" -flags = "NeverProtects", "FieldUnit", "OneAttack", "Nuclear", "HasNoZOC", "Unbribable", - "NeverBlocked", "WillNever", "NoVeteran" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "" -helptext = _("\ -Hydrogen Bombs make Atom Bombs seem tame. Any unprotected city at Ground Zero will be absolutely annihilated.\ - In other cities in the blast radius, population is reduced by about 75%. Blast area is 21 tiles:\ - the same area as an entire city (5x5 minus the corners.) All units within the blast are destroyed.\n\ -A Bomber can drop a Hydrogen Bomb within two tiles of its location. Unload the bomb, fly the Bomber out of\ - range, then detonate by pressing D twice.\n\ -If you have Fusion Power and the Manhattan Project was built, a Hydrogen Bomb\ - can be made in a city with an Enrichment Facility. \ -"), _("\ -Fallout from a Hydrogen Bomb is grave, with more than double the contaminated area.\ -") -bombard_rate = 5 ; sq_radius = 2 + 5 = 7 (entire workable city area) - -[unit_doomsday_bomb] -name = _("Doomsday Bomb") -class = "Bomb" -tech_req = "Fusion Power" -impr_req = "Enrichment Facility" -obsolete_by = "None" -graphic = "u.ddomb" -graphic_alt = "u.atom_bomb" -sound_move = "m_atom_bomb" -sound_move_alt = "m_generic" -sound_fight = "f_atom_bomb" -sound_fight_alt = "f_nuclear" -build_cost = 1000 -pop_cost = 0 -attack = 100 -defense = 0 -hitpoints = 30 -firepower = 1 -move_rate = 2 -vision_radius_sq = 0 -transport_cap = 0 -fuel = 1 -uk_happy = 4 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -targets = "Balloon", "Helicopter", "Air", "AirProtect", "AirPillage", "Missile", "Submarine" -disembarks = "Air", "AirPillage" -flags = "NeverProtects", "FieldUnit", "OneAttack", "Nuclear", "HasNoZOC", "Unbribable", - "NeverBlocked", "WillNever", "Unique", "NoVeteran" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "" -helptext = _("\ -The Doomsday Bomb is the mother of all bombs. Blast area is about 100 tiles.\ - Only one can be made at a time. A city at Ground Zero will be\ - annihilated. Other cities in the blast area lose about 75% of their population.\ - All units within the blast are completely destroyed.\n\ -A Bomber can drop the Bomb within two tiles of its location. Unload the Bomb and\ - pray that you can fly the Bomber out of range. Detonate by pressing D twice.\n\ -If you have Fusion Power and the Manhattan Project was built, a Doomsday Bomb\ - can be made in a city with an Enrichment Facility. \ -"), _("\ -The Fallout from a Doomsday Bomb is a sure ticket to Nuclear Winter.\ -") -bombard_rate = 25 ; radius = sqrt(27) = 5.19 - -[unit_nuclear_missile] -name = _("Nuclear Missile") -class = "Missile" -tech_req = "Space Flight" -obsolete_by = "None" -graphic = "u.nuclear" -graphic_alt = "-" -sound_move = "m_nuclear" -sound_move_alt = "m_generic" -sound_fight = "f_nuclear" -sound_fight_alt = "f_generic" -build_cost = 160 -pop_cost = 0 -attack = 100 -defense = 0 -hitpoints = 10 -firepower = 1 -move_rate = 24 -vision_radius_sq = 2 -transport_cap = 0 -fuel = 1 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "Submarine" -disembarks = "Submarine" -targets = "Balloon", "Helicopter", "Air", "AirProtect", "AirPillage", "Missile", "Submarine" -flags = "NeverProtects", "FieldUnit", "OneAttack", "Nuclear", "HasNoZOC", "Unbribable", - "NeverBlocked", "WillNever", "NoVeteran" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "" -helptext = _("\ -If you have Space Flight and the Manhattan Project has been built by any player, you can make Nuclear Missiles.\ - Nuclear blasts destroy ALL units in a 3x3 area. City population is reduced by half. Land tiles may get nuclear fallout.\ - Fallout reduces tile output and increases risk of nuclear winter.\ -"), _("\ -If Fallout is cleaned on the turn it appears, the chance of nuclear winter is reduced.\ -") -bombard_rate = 0 ; default sq_radius of 2: every adjacent tile. - -[unit_tactical_nuke] -name = _("Tactical Nuke") -class = "Missile" -tech_req = "Fusion Power" -impr_req = "Enrichment Facility" -obsolete_by = "None" -graphic = "u.tnuke" -graphic_alt = "-" -sound_move = "m_nuclear" -sound_move_alt = "m_generic" -sound_fight = "f_nuclear" -sound_fight_alt = "f_generic" -build_cost = 140 -pop_cost = 0 -attack = 100 -defense = 0 -hitpoints = 10 -firepower = 1 -move_rate = 18 -vision_radius_sq = 2 -transport_cap = 0 -fuel = 1 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "Submarine" -disembarks = "Submarine" -targets = "Balloon", "Helicopter", "Air", "AirProtect", "AirPillage", "Missile", "Submarine" -flags = "NeverProtects", "FieldUnit", "OneAttack", "Nuclear", "HasNoZOC", "Unbribable", - "NeverBlocked", "WillNever", "NoVeteran" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "" -helptext = _("\ -Tactical Nukes are very small warheads attached to missiles. A Tactical Nuke destroys all units on\ - a single tile. City population is reduced by half. The target tile may get Fallout. In theory,\ - Tactical Nukes are small enough to get the advantages of nuclear armaments without the severity of\ - consequences. In reality, they might be a gateway that escalates toward mutual assured destruction.\n\ -If you have Fusion Power and the Manhattan Project was built, a Tactical Nuke\ - can be made in a city with an Enrichment Facility. \ -") -bombard_rate = -2 ; 2 - 2 = 0: only nukes target tile. - -[unit_diplomat] -name = _("Diplomat") -class = "Land" -tech_req = "Writing" -obsolete_by = "Spy" -graphic = "u.diplomat" -graphic_alt = "-" -sound_move = "m_diplomat" -sound_move_alt = "m_generic" -sound_fight = "f_diplomat" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 0 -defense = 0 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter" ; transport helicopter only -disembarks = "Helicopter" -flags = "Diplomat", "IgZOC", "NonMil", "HasNoZOC", "Expellable" -veteran_names = - _("?diplomatic_rank:attaché"), - _("?diplomatic_rank:secretary"), - _("?diplomatic_rank:envoy"), - _("?diplomatic_rank:ambassador"), - _("?diplomatic_rank:emissary"), - _("?diplomatic_rank:statesman"), - _("?diplomatic_rank:plenipotentiary") - -veteran_raise_chance = 50, 33, 20, 15, 15, 15, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 110, 115, 120, 125, 130, 135 -veteran_move_bonus = 0, 0, 0, 0, 0, 0, 0 -roles = "DiplomatStartUnit" -helptext = _("\ -A Diplomat performs official or covert actions. Covert acts make incidents\ - which let Senates break treaties. Diplomats in cities defend such acts with\ - combat. Diplomats can • Bribe a lone unit • Establish embassy • Investigate City\ - • Sabotage production/buildings • Steal tech • Steal maps • Incite city revolt.\n\ -"), _("\ -Full rules for Diplomats are in the Manual.\ -") - -[unit_spy] -name = _("Spy") -class = "Land" -tech_req = "Espionage" -obsolete_by = "None" -graphic = "u.spy" -graphic_alt = "-" -sound_move = "m_spy" -sound_move_alt = "m_generic" -sound_fight = "f_spy" -sound_fight_alt = "f_generic" -build_cost = 35 -pop_cost = 0 -attack = 0 -defense = 0 -hitpoints = 10 -firepower = 1 -move_rate = 6 -vision_radius_sq = 8 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter" ; transport helicopter only -disembarks = "Helicopter" -flags = "Diplomat", "IgZOC", "NonMil", "HasNoZOC", "Spy", "Expellable" -veteran_names = - _("?spy_level:informant"), - _("?spy_level:handler"), - _("?spy_level:agent"), - _("?spy_level:operative"), - _("?spy_level:secret agent"), - _("?spy_level:neutralizer"), - _("?spy_level:spymaster") - -veteran_raise_chance = 50, 33, 20, 15, 15, 15, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 110, 115, 120, 125, 130, 135 -veteran_move_bonus = 0, 0, 0, 0, 0, 0, 0 -roles = "DiplomatStartUnit" -helptext = _("\ -Spies can do what a Diplomat can, and also: • Survive ops\ - • Sabotage lone units • Poison city water • Steal specific tech\ - • Steal tech from cities more than once • Sabotage specific targets in cities.\ -"), _("\ -Spies who survive ops escape to the nearest friendly city. Spies have\ - a 25% advantage over Diplomats in combat: a base 75% chance to win.\ - Full rules are in the Manual.\ -") - -[unit_caravan] -name = _("Caravan") -class = "Land" -tech_req = "Trade" -obsolete_by = "Freight" -graphic = "u.caravan" -graphic_alt = "-" -sound_move = "m_caravan" -sound_move_alt = "m_generic" -sound_fight = "f_caravan" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter" ; transport helicopter only -disembarks = "Helicopter" -flags = "HelpWonder", "TradeRoute", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Expellable", "Shield2Gold" -roles = "AttackStrongStartUnit" ;note: MP2 doesn't start games with ASSU's so has co-opted this for caravan start unit. -helptext = _("\ -Caravans are Commerce units. Commerce units can help build Wonders in any city with whom\ - you are not at war. In foreign cities 12+ tiles distant, they can create Trade Routes,\ - increasing net trade in both cities relative to their combined trade. Routes are inactive\ - during war and (re)activate during peace.\n\ -Commerce units can enter the Marketplace of non-hostile foreign cities to sell goods: revenue derives\ - from total trade in both cities. This is only profitable between cities with very high trade.\n\ -Commerce units given at Game Start can build Wonders without tech requirements. To use them\ - for a Trade Route, first assign them a Home City.\n\ -➤ Caravans are the only Commerce unit that can be produced more than once per turn, if the city\ - has appropriate output bonuses.\ -") - -[unit_freight] -name = _("Freight") -class = "Land" -tech_req = "The Corporation" -obsolete_by = "None" -graphic = "u.freight" -graphic_alt = "-" -sound_move = "m_freight" -sound_move_alt = "m_generic" -sound_fight = "f_freight" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -flags = "HelpWonder", "TradeRoute", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Expellable" -roles = "" -helptext = _("\ -The Freight unit replaces the Caravan as the basic Commerce unit on Land. It moves at\ - twice the speed. Each Freight used to build a wonder will add 50 shields. See the\ - entry on Caravan to read what Commerce units may do.\ -") - -[unit_explorer] -name = _("Explorer") -class = "Land" -tech_req = "Seafaring" -obsolete_by = "Partisan" -graphic = "u.explorer" -graphic_alt = "-" -sound_move = "m_explorer" -sound_move_alt = "m_generic" -sound_fight = "f_explorer" -sound_fight_alt = "f_generic" -build_cost = 30 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 10 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter" ; transport helicopter only -disembarks = "Helicopter" -flags = "IgTer", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Expellable" -roles = "Explorer", "ExplorerStartUnit" -helptext = _("\ -Explorers are brave individuals who map unknown territory. They can slip through enemy\ - ZOC, and have no unit upkeep.\ -") - -[unit_leader] -name = _("?unit:Leader") -class = "Land" -tech_req = "None" -obsolete_by = "None" -graphic = "u.leader" -graphic_alt = "u.explorer" -sound_move = "m_leader" -sound_move_alt = "m_generic" -sound_fight = "f_leader" -sound_fight_alt = "f_generic" -build_cost = 10 -pop_cost = 0 -attack = 0 -defense = 2 -hitpoints = 20 -firepower = 1 -move_rate = 4 -vision_radius_sq = 8 -convert_to = "Queen" -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter" ; transport helicopter only -disembarks = "Helicopter" -flags = "IgZOC", "NonMil", "HasNoZOC", "NoBuild", "NoHome", "SuperSpy", - "EvacuateFirst", "Unbribable", "GameLoss", "Unique", "WillNever" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "KingStartUnit" -helptext = _("\ -This is you. If you lose this unit, you lose the game.\ -"), _("\ -Will not unleash barbarians from huts.\ -"), _("\ -You can use the DO command to change the gender of the Leader.\ -") - -[unit_queen] -name = _("?unit:Queen") -class = "Land" -tech_req = "None" -obsolete_by = "None" -graphic = "u.queen" -graphic_alt = "u.leader" -sound_move = "m_leader" -sound_move_alt = "m_generic" -sound_fight = "f_leader" -sound_fight_alt = "f_generic" -build_cost = 10 -pop_cost = 0 -attack = 0 -defense = 2 -hitpoints = 20 -firepower = 1 -move_rate = 4 -vision_radius_sq = 8 -convert_to = "Leader" -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -embarks = "Helicopter" ; transport helicopter only -disembarks = "Helicopter" -flags = "IgZOC", "NonMil", "HasNoZOC", "NoBuild", "NoHome", "SuperSpy", - "EvacuateFirst", "Unbribable", "GameLoss", "Unique", "WillNever" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "KingStartUnit" -helptext = _("\ -(Alternate form of Leader. Behaves identically in-game.)\ - This is you. If you lose this unit, you lose the game.\ -"), _("\ -Will not unleash barbarians from huts.\ -"), _("\ -You can use the DO command to change the gender of the Leader.\ -") - - -[unit_barbarian_leader] -name = _("Barbarian Leader") -class = "Land" -tech_req = "None" -obsolete_by = "None" -graphic = "u.barbarian_leader" -graphic_alt = "u.diplomat" -sound_move = "m_barbarian_leader" -sound_move_alt = "m_generic" -sound_fight = "f_barbarian_leader" -sound_fight_alt = "f_generic" -build_cost = 40 -pop_cost = 0 -attack = 0 -defense = 0 -hitpoints = 10 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -flags = "IgZOC", "NonMil", "HasNoZOC", "Unbribable", "WillNever", - "EvacuateFirst", "SuperSpy", "NoHome", "NoBuild" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "BarbarianLeader" -helptext = _("\ -One Barbarian Leader appears every time there is a barbarian uprising\ - somewhere in the world.\ -"), _("\ -When a Barbarian Leader is killed on a tile without any defending units,\ - the 100 gold ransom is paid, but only to land units and helicopters.\ -") diff --git a/freeciv/freeciv/data/misc/events.spec b/freeciv/freeciv/data/misc/events.spec index 4abd4b994..f2185d307 100644 --- a/freeciv/freeciv/data/misc/events.spec +++ b/freeciv/freeciv/data/misc/events.spec @@ -73,6 +73,7 @@ tiles = { "row", "column", "tag" 2, 5, "e_hut_settler" 2, 6, "e_hut_tech" 2, 7, "e_hut_barb_city_near" + 4, 10, "e_hut_map" 2, 8, "e_tech_gain" 2, 9, "e_tech_learned" @@ -83,6 +84,7 @@ tiles = { "row", "column", "tag" 3, 0, "e_unit_lost_att" 3, 1, "e_unit_win_att" 3, 1, "e_unit_action_actor_success" + 3, 1, "e_unit_sentry_wake" 3, 2, "e_unit_buy" 3, 3, "e_unit_built" 3, 4, "e_unit_lost_def" diff --git a/freeciv/freeciv/data/misc/techs.png b/freeciv/freeciv/data/misc/techs.png index 97fe5116e..aaba0b31f 100644 Binary files a/freeciv/freeciv/data/misc/techs.png and b/freeciv/freeciv/data/misc/techs.png differ diff --git a/freeciv/freeciv/data/misc/techs.spec b/freeciv/freeciv/data/misc/techs.spec index 233e0f4e3..7f97145a7 100644 --- a/freeciv/freeciv/data/misc/techs.spec +++ b/freeciv/freeciv/data/misc/techs.spec @@ -219,4 +219,5 @@ tiles = { "row", "column","tag" 9, 1, "a.theocracy" 9, 2, "a.microbiology" 9, 3, "a.blueprints" ; not an advance: icon for blueprints acquired for the advance + 9, 4, "a.mechanization" } diff --git a/freeciv/freeciv/data/misc/wonders-large.spec b/freeciv/freeciv/data/misc/wonders-large.spec index 5b59018d6..3437c0ee2 100644 --- a/freeciv/freeciv/data/misc/wonders-large.spec +++ b/freeciv/freeciv/data/misc/wonders-large.spec @@ -16,13 +16,18 @@ artists = " b.chand_baori b.citadel_aleppo b.colossus + b.commissariat b.copernicus_observatory b.eiffel_tower + b.fusion_reactor_wonder + b.genghis_khans_equestrian_school + b.gibraltar_fortress b.great_library b.great_wall b.hammurabi b.hanging_gardens b.hypogeum + b.internet b.isaac_newtons_college b.js_bachs_cathedral b.king_richards_crusade @@ -33,8 +38,10 @@ artists = " b.manhattan_project b.marco_polos_embassy b.mausoleum + b.medici_bank b.michelangelos_chapel b.pasteur_institute + b.propaganda_ministry b.pyramids b.olympics b.roman_colosseum @@ -42,6 +49,7 @@ artists = " b.sphinx b.statue_of_liberty b.statue_of_zeus + b.sun_tzus_war_academy b.temple_of_artemis b.teslas_laboratory b.united_nations @@ -75,6 +83,7 @@ sprites = "b.chand_baori", "wonders/chand_baori" "b.citadel_aleppo", "wonders/citadel_aleppo" "b.colossus", "wonders/colossus" + "b.commissariat", "wonders/commissariat" "b.copernicus_observatory", "wonders/copernicus_observatory" "b.cure_for_cancer", "wonders/cure_for_cancer" "b.darwins_voyage", "wonders/darwins_voyage" @@ -105,6 +114,7 @@ sprites = "b.oracle", "wonders/oracle" "b.pasteur_institute", "wonders/pasteur_institute" "b.pax_dei", "wonders/pax_dei" + "b.propaganda_ministry", "wonders/propagandaministry" "b.pyramids", "wonders/pyramids" "b.roman_colosseum", "wonders/colosseum" "b.seti_program", "wonders/seti_program" diff --git a/freeciv/freeciv/data/ag.serv b/freeciv/freeciv/data/mp2-ag.serv similarity index 86% rename from freeciv/freeciv/data/ag.serv rename to freeciv/freeciv/data/mp2-ag.serv index 6eb21c7f2..94246f5c5 100644 --- a/freeciv/freeciv/data/ag.serv +++ b/freeciv/freeciv/data/mp2-ag.serv @@ -1,6 +1,6 @@ # Server commands to make multiplayer-evo Freeciv rules # -rulesetdir ag +rulesetdir mp2-ag # changed game settings are defined in game.ruleset diff --git a/freeciv/freeciv/data/.historic/mp2-May2019-historic/Makefile.am b/freeciv/freeciv/data/mp2-ag/Makefile.am similarity index 83% rename from freeciv/freeciv/data/.historic/mp2-May2019-historic/Makefile.am rename to freeciv/freeciv/data/mp2-ag/Makefile.am index 642a1c89b..b7f4a46b5 100644 --- a/freeciv/freeciv/data/.historic/mp2-May2019-historic/Makefile.am +++ b/freeciv/freeciv/data/mp2-ag/Makefile.am @@ -1,7 +1,7 @@ ## Process this file with automake to produce Makefile.in ## Override automake so that "make install" puts these in proper place: -pkgdatadir = $(datadir)/$(PACKAGE)/mp2 +pkgdatadir = $(datadir)/$(PACKAGE)/mp2-ag pkgdata_DATA = \ buildings.ruleset \ @@ -10,12 +10,13 @@ pkgdata_DATA = \ game.ruleset \ governments.ruleset \ nations.ruleset \ + default.lua \ script.lua \ parser.lua \ styles.ruleset \ techs.ruleset \ terrain.ruleset \ units.ruleset \ - README.mp2 + README.ag EXTRA_DIST = $(pkgdata_DATA) diff --git a/freeciv/freeciv/data/mp2-ag/README.ag b/freeciv/freeciv/data/mp2-ag/README.ag new file mode 100644 index 000000000..3f3b6523e --- /dev/null +++ b/freeciv/freeciv/data/mp2-ag/README.ag @@ -0,0 +1,28 @@ +Full Game Manual +Multiplayer II Summary +Design Log +Click link for: Multiplayer Strategy Guide
+Useful supplements to the in-game manual (from the Full Game Manual): +Terrain +Bases +Combat +Governments +Economy +Diplomacy +Diplomatic Odds Charts +Terrain+Base Defense Bonus Quick-Reference +Hotkeys and Mouse Control + +The MP2 Avant-garde ruleset is the first official release of the Multiplayer-Evolution II ruleset. + +Multiplayer-Evolution II rulesets are a project to modernize the original Multiplayer ruleset by taking advantage of cutting-edge advancements in Freeciv Server development. For those unfamiliar with the original Multiplayer project, it aims to take a Civ 2 type of gameplay into a format that can be balanced to accomodate massive multiplayer play. + +Multiplayer II is more advanced than the previous MP-branch rulesets. It imports features, improvements, and novel ideas from all other versions of Freeciv, later versions of the commercial series, and original ideas from top-tier players. + +Compared to original Multiplayer 1.0, the most notable changes in MP2 are to early-game sea units, new late-game air units, and wholescale improvement of balance and tactical possibility in late-game Air and Sea units. Numerous smaller fixes to the original Multiplayer 1.0 ruleset are also logged below. + +A large number of contributors over an almost two-year period helped add and balance many other changes whose aim was to increase playability, strategic depth and creativity, realism, and overall richness. Enjoy! + +Changelog from Multiplayer 1.0 + + \ No newline at end of file diff --git a/freeciv/freeciv/data/ag/buildings.ruleset b/freeciv/freeciv/data/mp2-ag/buildings.ruleset similarity index 99% rename from freeciv/freeciv/data/ag/buildings.ruleset rename to freeciv/freeciv/data/mp2-ag/buildings.ruleset index 6c57bdeab..12e3367ee 100644 --- a/freeciv/freeciv/data/ag/buildings.ruleset +++ b/freeciv/freeciv/data/mp2-ag/buildings.ruleset @@ -1116,8 +1116,8 @@ sound = "b_supermarket" sound_alt = "b_generic" helptext = _("\ Increases the food resources by +100% on each farmland tile which\ - is being used around the city. An irrigable city centre tile receives a\ - +50% bonus immediately, but cannot receive a benefit from farmland.\ + is being used around the city. An irrigable city centre tile receives an\ + immediate +50% bonus if it does not have Farmland.\ Farmland tiles are those which have been irrigated a second time.\ ") diff --git a/freeciv/freeciv/data/.historic/ag2/cities.ruleset b/freeciv/freeciv/data/mp2-ag/cities.ruleset similarity index 100% rename from freeciv/freeciv/data/.historic/ag2/cities.ruleset rename to freeciv/freeciv/data/mp2-ag/cities.ruleset diff --git a/freeciv/freeciv/data/ag/default.lua b/freeciv/freeciv/data/mp2-ag/default.lua similarity index 100% rename from freeciv/freeciv/data/ag/default.lua rename to freeciv/freeciv/data/mp2-ag/default.lua diff --git a/freeciv/freeciv/data/ag/effects.ruleset b/freeciv/freeciv/data/mp2-ag/effects.ruleset similarity index 100% rename from freeciv/freeciv/data/ag/effects.ruleset rename to freeciv/freeciv/data/mp2-ag/effects.ruleset diff --git a/freeciv/freeciv/data/ag/game.ruleset b/freeciv/freeciv/data/mp2-ag/game.ruleset similarity index 99% rename from freeciv/freeciv/data/ag/game.ruleset rename to freeciv/freeciv/data/mp2-ag/game.ruleset index 3319407f1..27b282482 100644 --- a/freeciv/freeciv/data/ag/game.ruleset +++ b/freeciv/freeciv/data/mp2-ag/game.ruleset @@ -19,7 +19,7 @@ format_version=20 [ruledit] ; Which file to read description in from. -description_file = "ag/README.ag" +description_file = "mp2-ag/README.ag" [about] ; Ruleset name @@ -36,7 +36,7 @@ summary = _("") ; Detailed description ; When updating this, update also desciption_file in [ruledit] section to match -description = *ag/README.ag* +description = *mp2-ag/README.ag* ; What capabilities ruleset provides for the scenarios. ; mimimum-default-sets - Default units, terrains, buildings, etc @@ -1380,7 +1380,8 @@ actor_reqs = action = "Upgrade Unit" actor_reqs = { "type", "name", "range", "present" - "DiplRel", "Foreign", "Local", FALSE + "DiplRel", "Foreign", "Local", FALSE + "CityTile", "Center", "Local", TRUE } [actionenabler_airlift_unit] diff --git a/freeciv/freeciv/data/.historic/ag2/governments.ruleset b/freeciv/freeciv/data/mp2-ag/governments.ruleset similarity index 100% rename from freeciv/freeciv/data/.historic/ag2/governments.ruleset rename to freeciv/freeciv/data/mp2-ag/governments.ruleset diff --git a/freeciv/freeciv/data/.historic/ag2/nations.ruleset b/freeciv/freeciv/data/mp2-ag/nations.ruleset similarity index 100% rename from freeciv/freeciv/data/.historic/ag2/nations.ruleset rename to freeciv/freeciv/data/mp2-ag/nations.ruleset diff --git a/freeciv/freeciv/data/.historic/ag2/parser.lua b/freeciv/freeciv/data/mp2-ag/parser.lua similarity index 100% rename from freeciv/freeciv/data/.historic/ag2/parser.lua rename to freeciv/freeciv/data/mp2-ag/parser.lua diff --git a/freeciv/freeciv/data/ag/script.lua b/freeciv/freeciv/data/mp2-ag/script.lua similarity index 97% rename from freeciv/freeciv/data/ag/script.lua rename to freeciv/freeciv/data/mp2-ag/script.lua index 0b0ddf841..d2ee5a997 100644 --- a/freeciv/freeciv/data/ag/script.lua +++ b/freeciv/freeciv/data/mp2-ag/script.lua @@ -179,9 +179,8 @@ function turn_callback(turn, year) if turn == 1 then notify.event(nil, nil, E.SCRIPT, _("Welcome to the MP2 Avant-garde ruleset!\n\ -This developmental version of MP2 has features which are not\ -documented in the MP2 game manual. In-game helptext is accurate.\ -Inquire on Discord for the list of new features. Have fun!\n\ +This ruleset has features which are \ +documented in the MP2 game manual. Have fun!\n\ ")) end end diff --git a/freeciv/freeciv/data/.historic/ag2/styles.ruleset b/freeciv/freeciv/data/mp2-ag/styles.ruleset similarity index 100% rename from freeciv/freeciv/data/.historic/ag2/styles.ruleset rename to freeciv/freeciv/data/mp2-ag/styles.ruleset diff --git a/freeciv/freeciv/data/ag/techs.ruleset b/freeciv/freeciv/data/mp2-ag/techs.ruleset similarity index 100% rename from freeciv/freeciv/data/ag/techs.ruleset rename to freeciv/freeciv/data/mp2-ag/techs.ruleset diff --git a/freeciv/freeciv/data/ag/terrain.ruleset b/freeciv/freeciv/data/mp2-ag/terrain.ruleset similarity index 100% rename from freeciv/freeciv/data/ag/terrain.ruleset rename to freeciv/freeciv/data/mp2-ag/terrain.ruleset diff --git a/freeciv/freeciv/data/ag/units.ruleset b/freeciv/freeciv/data/mp2-ag/units.ruleset similarity index 96% rename from freeciv/freeciv/data/ag/units.ruleset rename to freeciv/freeciv/data/mp2-ag/units.ruleset index 529b9e6d2..ec6114fb9 100644 --- a/freeciv/freeciv/data/ag/units.ruleset +++ b/freeciv/freeciv/data/mp2-ag/units.ruleset @@ -1,3 +1,4 @@ +;:::::::::::::::::::::::::::::::::::::::::’ × ; Modifying this file: ; You should not modify this file except to make bugfixes or ; for other "maintenance". If you want to make custom changes, @@ -11,8 +12,9 @@ ; the first available (not obsolete) such unit, or by picking the last ; such unit directly. When determining starting units, the first ; unit with the relevant role that the player can build will be chosen. -; If no such unit can be found (eg Explorers that require Seafaring), +; If no such unit can be found (eg Explorers that require Map Making), ; then the first unit with this role will be chosen. +;:::::::::::::::::::::::::::::::::::::::::’ × [datafile] description="Unit definitions for the Avant-garde ruleset." @@ -64,14 +66,11 @@ flags = _("FortBuster"), _("Defending Forts get no bonus. +33% attack bonus vs. the 2× defense of a Fortress.") _("FortressBuster"), _("Defending Fortresses get no bonus.") _("AntiAir"), _("Anti-Air bonus of this unit is less effective against Stealth, which has a 25% bonus against this unit.") -;;; _("NeverProtects"), _("Does not protect other units on its tile.") ; UNCOMMENT THIS IF NOT USING SCL'S PATCH FOR THIS FLAG ;;; _("NeverBlocked"), _("Bypasses unreachable units when attacking a tile.") ; UNCOMMENT THIS IF NOT USING LEXXIE'S PATCH FOR THIS FLAG - _("MultiSlot"), _("Cities with proper requirements can produce more than one of these per turn.") ;uncomment if you don't have slot_control patch +;;; _("MultiSlot"), _("Cities with proper requirements can produce more than one of these per turn.") ;uncomment if you don't have slot_control patch _("CanHide"), _("In appropriate terrain, this unit can make a Hideout, which will conceal all land units on the tile.") _("WillNever") -;;; The following flag MUST be #34 position to work with hack in movement.c which allows transported AAA to defend on non-native: -;;; this comment can be removed when we have some smarter way for unit_can_defend_here(..) to get ruleset control. - _("TransportDefender"), _("Can defend while transported on non-native tiles.") +;;; _("TransportDefender"), _("Can defend while transported on non-native tiles.") ;uncomment if you don't have TransportDefender patch _("NonMilAttack"), _("Has military capacity but for peaceful purposes, can enter territories with whom you are at Peace") _("Cant_Pillage"), _("Unable to pillage tiles.") } @@ -151,7 +150,6 @@ veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 ; "TerrainDefense" = Unit Class gains defense bonus from terrain ; "DamageSlows" = Damaged units are slowed down ; "CanOccupyCity" = Military units of this class can occupy enemy cities -; "Missile" = Unit Class is destroyed when it attacks ; "BuildAnywhere" = Unit Class can be built even in the middle of non-native terrain ; "Unreachable" = Unit Class can be attacked only by units explicitly listing this ; class in its 'targets', unless on a city or native base. @@ -163,7 +161,6 @@ veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 ; override this ; "CanFortify" = Unit can fortify at land tiles. Unit type flag ; "Cant_Fortify" can override this -; "CanPillage" = Unit Class can pillage tile infrastructure ; "DoesntOccupyTile" = Even if this class of enemy unit is on tile, cities can ; still work that tile ; "AttackNonNative" = Unit Class can attack units on non-native tiles. Unit type @@ -176,19 +173,17 @@ veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 ; "KillCitizen" = Upon successful attack against a city, unit kills one ; citizen. The effect "Unit_No_Lose_Pop" and the server ; setting 'killcitizen' can disable this. - -; "Airliftable" = This Unit Class may be airlifted +; ; */ <-- avoid gettext warnings ; ********************************************************************************** ; ********************************************************************************** -; WARNING: ANY CHANGES TO WHAT TYPES OR CLASSES CAN LOAD ONTO WHICH TRANSPORTS MAY +; WARNING:ANY CHANGES TO WHAT TYPES OR CLASSES CAN LOAD ONTO WHICH TRANSPORTS MAY ; REQUIRE CHANGES TO FCW function unit_could_possibly_load() in unit.js ; ********************************************************************************** ; ********************************************************************************** [unitclass_missile] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Missile") min_speed = 1 hp_loss_pct = 0 @@ -201,10 +196,12 @@ name = _("?unitclass:Bomb") min_speed = 1 hp_loss_pct = 0 hut_behavior = "Frighten" -flags = "Unreachable", "DoesntOccupyTile", "Airliftable" +flags = "Unreachable", "DoesntOccupyTile", "Airliftable" +helptext = _("\ + • Can be airlifted from a suitable city.\ +") [unitclass_land] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Land") min_speed = 1 hp_loss_pct = 0 @@ -243,31 +240,28 @@ helptext = _("\ ") [unitclass_sea] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Sea") min_speed = 3 hp_loss_pct = 0 flags = "DamageSlows", "AttackNonNative", "AttFromNonNative", "CanPillage" helptext = _("\ - • Crew Repair: each turn, regardless of movement, recovers 8% of its hit points (rounded down).\ + • Crew Repair:each turn, regardless of movement, recovers 8% of its hit points (rounded down).\ ") ; Separating the Submarine class finally allows it to be unreachable by Air. The old Submarine was ; far too offensively overpowered while simultaneously almost useless from ultra-vulnerability to Air units. ; Because it is now Unreachable, any unit able to attack it needs this class in its targets. [unitclass_submarine] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Submarine") min_speed = 3 hp_loss_pct = 0 flags = "DamageSlows", "AttackNonNative", "AttFromNonNative", "CanPillage", "Unreachable" helptext = _("\ - • Visibility bonus: not visible to other players unless they have a unit or city adjacent to it.\n\ - • Crew Repair: each turn, regardless of movement, recovers 2 hit points.\ + • Visibility bonus:not visible to other players unless they have a unit or city adjacent to it.\n\ + • Crew Repair:each turn, regardless of movement, recovers 2 hit points.\ ") [unitclass_trireme] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Trireme") min_speed = 2 hp_loss_pct = 0 @@ -281,7 +275,6 @@ hp_loss_pct = 0 flags = "DamageSlows", "AttackNonNative", "AttFromNonNative" [unitclass_heli] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Helicopter") min_speed = 1 hp_loss_pct = 5 @@ -289,7 +282,6 @@ flags = "Unreachable", "CanOccupyCity", "CollectRansom", "Airliftable" ; This class is for air units that are unreachable but do not protect a stack. [unitclass_air] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Air") min_speed = 1 hp_loss_pct = 0 @@ -298,7 +290,6 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; This class is for air units that can pillage terrain (i.e. Jet Bomber) [unitclass_airpillage] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:AirPillage") min_speed = 1 hp_loss_pct = 0 @@ -306,22 +297,20 @@ hut_behavior = "Frighten" flags = "Unreachable", "DoesntOccupyTile", "Airliftable", "CanPillage" ; This class is for air units that can also protect a stack. -; (Fighters) -- technically a separate AirProtect class is not needed, but +; (Fighters) — technically a separate AirProtect class is not needed, but ; Fighters also have Border Police abilities, and a separate class ; facilitates future adjustments and balancing in an isolated class. [unitclass_air_protect] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:AirProtect") min_speed = 1 hp_loss_pct = 0 hut_behavior = "Frighten" flags = "Unreachable", "DoesntOccupyTile", "Airliftable", "BorderPolice" helptext = _("\ - • INTERCEPTOR: can be given the Vigil order to auto-attack adjacent Air units.\n\ - • AIR COVER: Most units who cannot attack this unit also cannot attack other units on the tile.\ + • INTERCEPTOR:can be given the Vigil order to auto-attack adjacent Air units.\n\ + • AIR COVER:Most units who cannot attack this unit also cannot attack other units on the tile.\ ") [unitclass_balloon] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Balloon") min_speed = 1 hp_loss_pct = 0 @@ -331,13 +320,13 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; /* <-- avoid gettext warnings ; -; Below: The individual unit types, one per section. +; Below:The individual unit types, one per section. ; ; The number can be variable, up to 200. ; However for the "official" rulesets, units should not be removed ; because that would break backward compatability with savegames. ; -; The order here matters: later units are considered "better" for +; The order here matters:later units are considered "better" for ; a given flag or role. ; ; The actual tag used (the * in [unit_*]) does not matter, except @@ -370,7 +359,7 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; hitpoints = how much damage unit can withstand ; firepower = number of hitpoints removed per round of combat; at least 1 ; move_rate = base move rate (whole movement points) -; vision_radius_sq = base vision of unit: unit can see tile up to the square +; vision_radius_sq = base vision of unit:unit can see tile up to the square ; root of this value away ; convert_to = can be converted to another type of unit by name ; convert_time = number of movement points it takes to convert to @@ -441,9 +430,9 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; "DefenseDivider" = Divide defense value with (1 + 'value'). ; Bonus is defined in attackers entry. ; "DefenseDividerPct" = Divide defense value by 1 + (value / 100). -; Value of 100 means division by 2, (2x for attacker) -; value of 50 means division by 1.5, (1.5x for attacker) -; i.e.: Effectively increases *attack* by value percent. +; Value of 100 means division by 2, (2× for attacker) +; value of 50 means division by 1.5, (1.5× for attacker) +; i.e.:Effectively increases *attack* by value percent. ; "FirePower1" = Defender firepower is reduced to value 1 when ; ever this has non-zero value. ; Bonus is defined in attackers entry. @@ -452,20 +441,20 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; ; "IgZOC" = ignore Zones of Control (ZOC) even if unit class has ; "ZOC" flag -; "HasNoZOC" = unit has no Zone of Control (ZOC), thus any unit can move -; around it freely -; "NonMil" = a non-military unit: no attacks; no martial law; can enter +; "HasNoZOC" = unit has no Zone of Control (ZOC), thus any unit can move +; around it freely +; "NonMil" = a non-military unit:no martial law; can enter ; peaceful borders; DoesntOccupyTile ; "IgTer" = use constant move cost defined in igter_cost (terrain.ruleset) ; rather than terrain/road etc cost, unless terrain cost is ; less -; "OneAttack" = can only make a single attack, regardless of movement points -; "FieldUnit" = cause unhappiness even when not being aggressive +; "OneAttack" = can only make a single attack, regardless of movement points +; "FieldUnit" = cause unhappiness even when not being aggressive ; "BeachLander" = won't lose all its movement when moving from non-native ; terrain to native terrain even if slow_invasions is on. -; "Settlers" = "can irrigate and build roads" but really seems to be a required flag for -; any tile improvement at all. -; "Diplomat" = can defend against diplomat actions (see diplchance +; "Settlers" = "can irrigate and build roads" but really seems to be a required flag for +; any tile improvement at all. +; "Diplomat" = can defend against diplomat actions (see diplchance ; server option) ; "Spy" = strong in diplomatic battles. _Must_ be "Diplomat" also ; "CoastStrict" = (sea only) cannot leave coast @@ -473,38 +462,36 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; to regularly end turn on coast ; "Only_Native_Attack" = cannot attack targets on non-native tiles even if ; unit class can -; "Cant_Fortify" = cannot fortify even if unit class has "CanFortify" flag -; "Fanatic" = can only be built by governments that allow them -; (see civ2/governments.ruleset, Fundamentalism government) -; "Unique" = a player can only have one of these units in the game at -; the same time; barbarians cannot use this at present -; "GameLoss" = losing one of these units means you lose the game, but it -; is produced without homecity and upkeep -; "EvacuateFirst" = the game will try to rescue units with this flag before +; "Cant_Fortify"= cannot fortify even if unit class has "CanFortify" flag +; "Fanatic" = can only be built by governments that allow them +; (see civ2/governments.ruleset, Fvndamentalist government) +; "Unique" = a player can only have one of these units in the game at +; the same time; barbarians cannot use this at present +; "GameLoss" = losing one of these units means you lose the game, but it +; is produced without homecity and upkeep +; "EvacuateFirst"=the game will try to rescue units with this flag before ; it tries to rescue units without it when their transport ; is destroyed. Think of the Birkenhead drill ("women and ; children first"). Replace "women and children" with ; "units with the EvacuateFirst unit type flag". -; "SuperSpy" = this unit always wins diplomatic contests, that is, unless -; it encounters another SuperSpy, in which case defender wins; -; can also be used on non-diplomat units, in which case it can -; protect cities from diplomats; also 100% spy survival chance -; "NoHome" = this unit has no homecity and will be free of all upkeep, and -; therefore will not revolt along with its city of origin should -; it be incited +; "SuperSpy" = this unit always wins diplomatic contests, that is, unless +; it encounters another SuperSpy, in which case defender wins; +; can also be used on non-diplomat units, in which case it can +; protect cities from diplomats; also 100% spy survival chance +; "NoHome" = this unit has no homecity and will be free of all upkeep, and +; therefore will not revolt along with its city of origin should +; it be incited ; "NoVeteran" = this unit cannot gain veteran levels through experience ; (as if both raise_chance and work_raise_chance were zero); ; it can still gain veterancy through Veteran_Build, etc ; "CityBuster" = this unit has double firepower against cities ; "NoBuild" = this unit cannot be built -; "BadWallAttacker" = the firepower of this unit is set to 1 if -; attacking a city -; defended by a city wall (or other city building defense) -; "BadCityDefender" = if attacked while in a city, firepower is set to 1 -; and firepower of attacker is doubled (the Pearl Harbour -; rule) +; "BadWallAttacker"=the firepower of this unit is set to 1 if attacking a city +; defended by a city wall (or other city building defense) +; "BadCityDefender"=if attacked while in a city, firepower is set to 1 +; and firepower of attacker is doubled (the Pearl Harbour rule) ; "BarbarianOnly" = only barbarians can build this unit -; "Shield2Gold" = Switch from shield upkeep to gold upkeep possible +; "Shield2Gold" = Switch from shield upkeep to gold upkeep possible. ; "NewCityGamesOnly" = unit can't be built on scenarios where founding new cities ; is not allowed. Give this flag to units that would make no sense ; to have in a game with such a scenario @@ -532,14 +519,22 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; is enabled and the unit class is unreachable ; "MultiSlot" = if server setting slot_control is ON, only unit types with this ; flag can use extra city_build_slots -; +; "TransportDefender" = Unit can always defend while transported, even on non-native +; terrain. +; "SentryAlways" = This unit always reports sentry-type information; give this flag to +; reconnaissance/scouting type units who can't sentry because they are +; fuel-type units (which can only sentry on refueling tiles.) +; "Reserved1" +; "Reserved2" +; "Reserved3" = reserved for future use. +; ------------------------------------------- ; Following actions require extra fields: -; "Attack" +; "Attack" and "Suicide Attack" ; attack = base attack strength ; "Bombard" ; attack = base attack strength ; bombard_rate = the number of shots fired at enemy units when attacking -; FOR NUKES: the amount to add to the default radius of 1 tile +; FOR NUKES:the amount to add to the default radius of 1 tile ; "Join City" ; pop_cost = the number of population added to the target city ; "Paradrop Unit" @@ -562,9 +557,9 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; "HutTech" = can be found in a hut, but its techs required ; "Partisan" = can be created as a partisan (only one unit can have this ; flag), see end of this file for its tech requirements option -; "DefendOk" = AI hint: ok for defending with -; "DefendGood" = AI hint: good for defending with -; "Ferryboat" = AI hint: useful for ferrying +; "DefendOk" = AI hint:ok for defending with +; "DefendGood" = AI hint:good for defending with +; "Ferryboat" = AI hint:useful for ferrying ; "Barbarian" = can be created as land barbarian ; "BarbarianTech" = can be created as land barbarian, if someone has ; researched its tech requirements @@ -577,7 +572,7 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; "BarbarianSeaTech" = can be created as a barbarian that disembarks from a barbarian boat ; if someone has researched its tech requirements ; "Settlers" = can irrigate and build roads -; "Hunter" = AI hint: good for hunting other units +; "Hunter" = AI hint:good for hunting other units ; "CitiesStartUnit" = Gets granted as 'c' startunit ; "WorkerStartUnit" = Gets granted as 'w' startunit ; "ExplorerStartUnit" = Gets granted as 'x' startunit @@ -588,8 +583,11 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; "DefendGoodStartUnit" = Gets granted as 'D' startunit ; "AttackFastStartUnit" = Gets granted as 'a' startunit ; "AttackStrongStartUnit" = Gets granted as 'A' startunit -; -; */ <-- avoid gettext warnings + +; "UserType1Startunit" = Gets granted as 'u' startunit +; "UserType2Startunit" = Gets granted as 'U' startunit +; "UserType3Startunit" = Gets granted as 'z' startunit +; "TradeStartUnit" = Gets granted as 't' startunit [unit_settlers] name = _("Settlers") @@ -1155,7 +1153,6 @@ disembarks = "Helicopter" targets = "Balloon", "Helicopter" flags = "MultiSlot", "IgTer", "IgZOC", "NoHome", "FootSoldier", "Capturer", "CantReachAir", "Shield2Gold", "Settlers", "CanHide", "WillNever" -;yes Partisan has 0 upkeep so Shield2Gold is meaningless, but currently used to substitute MultiSlot inaccessible in c-server roles = "DefendGood", "DefendGoodStartUnit", "Partisan", "BarbarianTech" helptext = _("\ Partisans are guerilla fighters who can use the terrain to their advantage. Like the Explorer\ @@ -3936,7 +3933,7 @@ uk_food = 0 uk_gold = 0 embarks = "Helicopter" ; transport helicopter only disembarks = "Helicopter" -flags = "HelpWonder", "TradeRoute", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Expellable", "Shield2Gold" +flags = "HelpWonder", "TradeRoute", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Expellable", "MultiSlot" roles = "AttackStrongStartUnit" ;note: MP2 doesn't start games with ASSU's so has co-opted this for caravan start unit. helptext = _("\ Caravans are Commerce units. Commerce units can help build Wonders in any city with whom\ diff --git a/freeciv/freeciv/data/mp2-brava/Makefile.am b/freeciv/freeciv/data/mp2-brava/Makefile.am new file mode 100644 index 000000000..54cb50b55 --- /dev/null +++ b/freeciv/freeciv/data/mp2-brava/Makefile.am @@ -0,0 +1,22 @@ +## Process this file with automake to produce Makefile.in + +## Override automake so that "make install" puts these in proper place: +pkgdatadir = $(datadir)/$(PACKAGE)/mp2-brava + +pkgdata_DATA = \ + buildings.ruleset \ + cities.ruleset \ + effects.ruleset \ + game.ruleset \ + governments.ruleset \ + nations.ruleset \ + default.lua \ + script.lua \ + parser.lua \ + styles.ruleset \ + techs.ruleset \ + terrain.ruleset \ + units.ruleset \ + README.brava + +EXTRA_DIST = $(pkgdata_DATA) diff --git a/freeciv/freeciv/data/mp2-brava/README.brava b/freeciv/freeciv/data/mp2-brava/README.brava index fef6b17a6..a716cb003 100644 --- a/freeciv/freeciv/data/mp2-brava/README.brava +++ b/freeciv/freeciv/data/mp2-brava/README.brava @@ -1,33 +1,26 @@ -Multiplayer II: Brava ruleset -------------------------------------- -LINKS: -Full Game Manual -Multiplayer II Summary -Design Log -Click link for: Multiplayer Strategy Guide
+Full Game Manual, MP2-Brava +Multiplayer II Summary +Design Log +Click link for: Multiplayer Strategy Guide
+Useful supplements to the in-game manual (from the Full Game Manual): +Terrain +Bases +Combat +Governments +Economy +Diplomacy +Diplomatic Odds Charts +Terrain+Base Defense Bonus Quick-Reference +Hotkeys and Mouse Control -... -Terrain -Bases -Combat -Governments -Economy -Diplomacy -Diplomatic Odds Charts -... -Terrain+Base Defense Bonus Quick-Reference -Hotkeys and Mouse Control +The MP2 Brava ruleset is the second official release of the Multiplayer-Evolution II ruleset. -The MP2-Brava ruleset is a modernized ruleset to take advantage of cutting-edge advancements in Freeciv Server development. -Compared to Multiplayer-Evolution (MP2), the differences are that it is less restrained to keep the same "DNA" as the other -MP-branch rulesets, and allows itself to import features, improvements, and novel ideas from all other versions of Freeciv, -later versions of the commercial series, as well as original ideas from players. +Multiplayer II Evolution rulesets are a project to modernize the original Multiplayer 1.0 ruleset by taking advantage of cutting-edge advancements in Freeciv Server development. -This ruleset began using MP2 as its base and added to it. Enjoy! +Earlier versions are closer to a version of Civ 2 that has been perfected for massive multiplayer game balance. ------------------------------ -Changelog for MP2-Brava: ------------------------------ -Changelog +Later versions evolve to import features, improvements, and novel ideas from all other versions of Freeciv, later versions of the commercial series, as well as original ideas from experienced players. -END. \ No newline at end of file +Changelog from Multiplayer 1.0 + + \ No newline at end of file diff --git a/freeciv/freeciv/data/mp2-brava/buildings.ruleset b/freeciv/freeciv/data/mp2-brava/buildings.ruleset index e3c704959..376d750d1 100644 --- a/freeciv/freeciv/data/mp2-brava/buildings.ruleset +++ b/freeciv/freeciv/data/mp2-brava/buildings.ruleset @@ -1115,8 +1115,8 @@ sound = "b_supermarket" sound_alt = "b_generic" helptext = _("\ Increases the food resources by +100% on each farmland tile which\ - is being used around the city. An irrigable city centre tile receives a\ - +50% bonus immediately, but cannot receive a benefit from farmland.\ + is being used around the city. An irrigable city centre tile receives an\ + immediate +50% bonus if it does not have Farmland.\ Farmland tiles are those which have been irrigated a second time.\ ") diff --git a/freeciv/freeciv/data/mp2-brava/game.ruleset b/freeciv/freeciv/data/mp2-brava/game.ruleset index 5925fc54c..81399b2c6 100644 --- a/freeciv/freeciv/data/mp2-brava/game.ruleset +++ b/freeciv/freeciv/data/mp2-brava/game.ruleset @@ -1388,7 +1388,8 @@ actor_reqs = action = "Upgrade Unit" actor_reqs = { "type", "name", "range", "present" - "DiplRel", "Foreign", "Local", FALSE + "DiplRel", "Foreign", "Local", FALSE + "CityTile", "Center", "Local", TRUE } [actionenabler_airlift_unit] diff --git a/freeciv/freeciv/data/mp2-brava/units.ruleset b/freeciv/freeciv/data/mp2-brava/units.ruleset index 299dffe04..9ff3a022b 100644 --- a/freeciv/freeciv/data/mp2-brava/units.ruleset +++ b/freeciv/freeciv/data/mp2-brava/units.ruleset @@ -1,3 +1,4 @@ +;:::::::::::::::::::::::::::::::::::::::::’ × ; Modifying this file: ; You should not modify this file except to make bugfixes or ; for other "maintenance". If you want to make custom changes, @@ -11,8 +12,9 @@ ; the first available (not obsolete) such unit, or by picking the last ; such unit directly. When determining starting units, the first ; unit with the relevant role that the player can build will be chosen. -; If no such unit can be found (eg Explorers that require Seafaring), +; If no such unit can be found (eg Explorers that require Map Making), ; then the first unit with this role will be chosen. +;:::::::::::::::::::::::::::::::::::::::::’ × [datafile] description="Unit definitions for the MP2-Brava ruleset." @@ -64,14 +66,11 @@ flags = _("FortBuster"), _("Defending Forts get no bonus. +33% attack bonus vs. the 2× defense of a Fortress.") _("FortressBuster"), _("Defending Fortresses get no bonus.") _("AntiAir"), _("Anti-Air bonus of this unit is less effective against Stealth, which has a 25% bonus against this unit.") -;;; _("NeverProtects"), _("Does not protect other units on its tile.") ; UNCOMMENT THIS IF NOT USING SCL'S PATCH FOR THIS FLAG ;;; _("NeverBlocked"), _("Bypasses unreachable units when attacking a tile.") ; UNCOMMENT THIS IF NOT USING LEXXIE'S PATCH FOR THIS FLAG - _("MultiSlot"), _("Cities with proper requirements can produce more than one of these per turn.") ;uncomment if you don't have slot_control patch +;;; _("MultiSlot"), _("Cities with proper requirements can produce more than one of these per turn.") ;uncomment if you don't have slot_control patch _("CanHide"), _("In appropriate terrain, this unit can make a Hideout, which will conceal all land units on the tile.") _("WillNever") -;;; The following flag MUST be #34 position to work with hack in movement.c which allows transported AAA to defend on non-native: -;;; this comment can be removed when we have some smarter way for unit_can_defend_here(..) to get ruleset control. - _("TransportDefender"), _("Can defend while transported on non-native tiles.") +;;; _("TransportDefender"), _("Can defend while transported on non-native tiles.") ;uncomment if you don't have TransportDefender patch _("NonMilAttack"), _("Has military capacity but for peaceful purposes, can enter territories with whom you are at Peace") _("Cant_Pillage"), _("Unable to pillage tiles.") } @@ -151,7 +150,6 @@ veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 ; "TerrainDefense" = Unit Class gains defense bonus from terrain ; "DamageSlows" = Damaged units are slowed down ; "CanOccupyCity" = Military units of this class can occupy enemy cities -; "Missile" = Unit Class is destroyed when it attacks ; "BuildAnywhere" = Unit Class can be built even in the middle of non-native terrain ; "Unreachable" = Unit Class can be attacked only by units explicitly listing this ; class in its 'targets', unless on a city or native base. @@ -163,7 +161,6 @@ veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 ; override this ; "CanFortify" = Unit can fortify at land tiles. Unit type flag ; "Cant_Fortify" can override this -; "CanPillage" = Unit Class can pillage tile infrastructure ; "DoesntOccupyTile" = Even if this class of enemy unit is on tile, cities can ; still work that tile ; "AttackNonNative" = Unit Class can attack units on non-native tiles. Unit type @@ -176,19 +173,17 @@ veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 ; "KillCitizen" = Upon successful attack against a city, unit kills one ; citizen. The effect "Unit_No_Lose_Pop" and the server ; setting 'killcitizen' can disable this. - -; "Airliftable" = This Unit Class may be airlifted +; ; */ <-- avoid gettext warnings ; ********************************************************************************** ; ********************************************************************************** -; WARNING: ANY CHANGES TO WHAT TYPES OR CLASSES CAN LOAD ONTO WHICH TRANSPORTS MAY +; WARNING:ANY CHANGES TO WHAT TYPES OR CLASSES CAN LOAD ONTO WHICH TRANSPORTS MAY ; REQUIRE CHANGES TO FCW function unit_could_possibly_load() in unit.js ; ********************************************************************************** ; ********************************************************************************** [unitclass_missile] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Missile") min_speed = 1 hp_loss_pct = 0 @@ -225,7 +220,6 @@ helptext = _("\ ") [unitclass_land] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Land") min_speed = 1 hp_loss_pct = 0 @@ -264,31 +258,28 @@ helptext = _("\ ") [unitclass_sea] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Sea") min_speed = 3 hp_loss_pct = 0 flags = "DamageSlows", "AttackNonNative", "AttFromNonNative", "CanPillage" helptext = _("\ - • Crew Repair: each turn, regardless of movement, recovers 8% of its hit points (rounded down).\ + • Crew Repair:each turn, regardless of movement, recovers 8% of its hit points (rounded down).\ ") ; Separating the Submarine class finally allows it to be unreachable by Air. The old Submarine was ; far too offensively overpowered while simultaneously almost useless from ultra-vulnerability to Air units. ; Because it is now Unreachable, any unit able to attack it needs this class in its targets. [unitclass_submarine] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Submarine") min_speed = 3 hp_loss_pct = 0 flags = "DamageSlows", "AttackNonNative", "AttFromNonNative", "CanPillage", "Unreachable" helptext = _("\ - • Visibility bonus: not visible to other players unless they have a unit or city adjacent to it.\n\ - • Crew Repair: each turn, regardless of movement, recovers 2 hit points.\ + • Visibility bonus:not visible to other players unless they have a unit or city adjacent to it.\n\ + • Crew Repair:each turn, regardless of movement, recovers 2 hit points.\ ") [unitclass_trireme] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Trireme") min_speed = 2 hp_loss_pct = 0 @@ -302,7 +293,6 @@ hp_loss_pct = 0 flags = "DamageSlows", "AttackNonNative", "AttFromNonNative" [unitclass_heli] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Helicopter") min_speed = 1 hp_loss_pct = 5 @@ -310,7 +300,6 @@ flags = "Unreachable", "CanOccupyCity", "CollectRansom", "Airliftable" ; This class is for air units that are unreachable but do not protect a stack. [unitclass_air] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Air") min_speed = 1 hp_loss_pct = 0 @@ -319,7 +308,6 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; This class is for air units that can pillage terrain (i.e. Jet Bomber) [unitclass_airpillage] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:AirPillage") min_speed = 1 hp_loss_pct = 0 @@ -327,22 +315,20 @@ hut_behavior = "Frighten" flags = "Unreachable", "DoesntOccupyTile", "Airliftable", "CanPillage" ; This class is for air units that can also protect a stack. -; (Fighters) -- technically a separate AirProtect class is not needed, but +; (Fighters) — technically a separate AirProtect class is not needed, but ; Fighters also have Border Police abilities, and a separate class ; facilitates future adjustments and balancing in an isolated class. [unitclass_air_protect] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:AirProtect") min_speed = 1 hp_loss_pct = 0 hut_behavior = "Frighten" flags = "Unreachable", "DoesntOccupyTile", "Airliftable", "BorderPolice" helptext = _("\ - • INTERCEPTOR: can be given the Vigil order to auto-attack adjacent Air units.\n\ - • AIR COVER: Most units who cannot attack this unit also cannot attack other units on the tile.\ + • INTERCEPTOR:can be given the Vigil order to auto-attack adjacent Air units.\n\ + • AIR COVER:Most units who cannot attack this unit also cannot attack other units on the tile.\ ") [unitclass_balloon] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Balloon") min_speed = 1 hp_loss_pct = 0 @@ -352,13 +338,13 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; /* <-- avoid gettext warnings ; -; Below: The individual unit types, one per section. +; Below:The individual unit types, one per section. ; ; The number can be variable, up to 200. ; However for the "official" rulesets, units should not be removed ; because that would break backward compatability with savegames. ; -; The order here matters: later units are considered "better" for +; The order here matters:later units are considered "better" for ; a given flag or role. ; ; The actual tag used (the * in [unit_*]) does not matter, except @@ -391,7 +377,7 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; hitpoints = how much damage unit can withstand ; firepower = number of hitpoints removed per round of combat; at least 1 ; move_rate = base move rate (whole movement points) -; vision_radius_sq = base vision of unit: unit can see tile up to the square +; vision_radius_sq = base vision of unit:unit can see tile up to the square ; root of this value away ; convert_to = can be converted to another type of unit by name ; convert_time = number of movement points it takes to convert to @@ -464,7 +450,7 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; "DefenseDividerPct" = Divide defense value by 1 + (value / 100). ; Value of 100 means division by 2, (2× for attacker) ; value of 50 means division by 1.5, (1.5× for attacker) -; i.e.: Effectively increases *attack* by value percent. +; i.e.:Effectively increases *attack* by value percent. ; "FirePower1" = Defender firepower is reduced to value 1 when ; ever this has non-zero value. ; Bonus is defined in attackers entry. @@ -473,20 +459,20 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; ; "IgZOC" = ignore Zones of Control (ZOC) even if unit class has ; "ZOC" flag -; "HasNoZOC" = unit has no Zone of Control (ZOC), thus any unit can move -; around it freely -; "NonMil" = a non-military unit: no martial law; can enter +; "HasNoZOC" = unit has no Zone of Control (ZOC), thus any unit can move +; around it freely +; "NonMil" = a non-military unit:no martial law; can enter ; peaceful borders; DoesntOccupyTile ; "IgTer" = use constant move cost defined in igter_cost (terrain.ruleset) ; rather than terrain/road etc cost, unless terrain cost is ; less -; "OneAttack" = can only make a single attack, regardless of movement points -; "FieldUnit" = cause unhappiness even when not being aggressive +; "OneAttack" = can only make a single attack, regardless of movement points +; "FieldUnit" = cause unhappiness even when not being aggressive ; "BeachLander" = won't lose all its movement when moving from non-native ; terrain to native terrain even if slow_invasions is on. -; "Settlers" = "can irrigate and build roads" but really seems to be a required flag for -; any tile improvement at all. -; "Diplomat" = can defend against diplomat actions (see diplchance +; "Settlers" = "can irrigate and build roads" but really seems to be a required flag for +; any tile improvement at all. +; "Diplomat" = can defend against diplomat actions (see diplchance ; server option) ; "Spy" = strong in diplomatic battles. _Must_ be "Diplomat" also ; "CoastStrict" = (sea only) cannot leave coast @@ -494,38 +480,36 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; to regularly end turn on coast ; "Only_Native_Attack" = cannot attack targets on non-native tiles even if ; unit class can -; "Cant_Fortify" = cannot fortify even if unit class has "CanFortify" flag -; "Fanatic" = can only be built by governments that allow them -; (see civ2/governments.ruleset, Fundamentalism government) -; "Unique" = a player can only have one of these units in the game at -; the same time; barbarians cannot use this at present -; "GameLoss" = losing one of these units means you lose the game, but it -; is produced without homecity and upkeep -; "EvacuateFirst" = the game will try to rescue units with this flag before +; "Cant_Fortify"= cannot fortify even if unit class has "CanFortify" flag +; "Fanatic" = can only be built by governments that allow them +; (see civ2/governments.ruleset, Fvndamentalist government) +; "Unique" = a player can only have one of these units in the game at +; the same time; barbarians cannot use this at present +; "GameLoss" = losing one of these units means you lose the game, but it +; is produced without homecity and upkeep +; "EvacuateFirst"=the game will try to rescue units with this flag before ; it tries to rescue units without it when their transport ; is destroyed. Think of the Birkenhead drill ("women and ; children first"). Replace "women and children" with ; "units with the EvacuateFirst unit type flag". -; "SuperSpy" = this unit always wins diplomatic contests, that is, unless -; it encounters another SuperSpy, in which case defender wins; -; can also be used on non-diplomat units, in which case it can -; protect cities from diplomats; also 100% spy survival chance -; "NoHome" = this unit has no homecity and will be free of all upkeep, and -; therefore will not revolt along with its city of origin should -; it be incited +; "SuperSpy" = this unit always wins diplomatic contests, that is, unless +; it encounters another SuperSpy, in which case defender wins; +; can also be used on non-diplomat units, in which case it can +; protect cities from diplomats; also 100% spy survival chance +; "NoHome" = this unit has no homecity and will be free of all upkeep, and +; therefore will not revolt along with its city of origin should +; it be incited ; "NoVeteran" = this unit cannot gain veteran levels through experience ; (as if both raise_chance and work_raise_chance were zero); ; it can still gain veterancy through Veteran_Build, etc ; "CityBuster" = this unit has double firepower against cities ; "NoBuild" = this unit cannot be built -; "BadWallAttacker" = the firepower of this unit is set to 1 if -; attacking a city -; defended by a city wall (or other city building defense) -; "BadCityDefender" = if attacked while in a city, firepower is set to 1 -; and firepower of attacker is doubled (the Pearl Harbour -; rule) +; "BadWallAttacker"=the firepower of this unit is set to 1 if attacking a city +; defended by a city wall (or other city building defense) +; "BadCityDefender"=if attacked while in a city, firepower is set to 1 +; and firepower of attacker is doubled (the Pearl Harbour rule) ; "BarbarianOnly" = only barbarians can build this unit -; "Shield2Gold" = Switch from shield upkeep to gold upkeep possible +; "Shield2Gold" = Switch from shield upkeep to gold upkeep possible. ; "NewCityGamesOnly" = unit can't be built on scenarios where founding new cities ; is not allowed. Give this flag to units that would make no sense ; to have in a game with such a scenario @@ -553,14 +537,22 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; is enabled and the unit class is unreachable ; "MultiSlot" = if server setting slot_control is ON, only unit types with this ; flag can use extra city_build_slots -; TO DO: make this a server UTYF flag that's used instead of Shield2Gold +; "TransportDefender" = Unit can always defend while transported, even on non-native +; terrain. +; "SentryAlways" = This unit always reports sentry-type information; give this flag to +; reconnaissance/scouting type units who can't sentry because they are +; fuel-type units (which can only sentry on refueling tiles.) +; "Reserved1" +; "Reserved2" +; "Reserved3" = reserved for future use. +; ------------------------------------------- ; Following actions require extra fields: -; "Attack" +; "Attack" and "Suicide Attack" ; attack = base attack strength ; "Bombard" ; attack = base attack strength ; bombard_rate = the number of shots fired at enemy units when attacking -; FOR NUKES: the amount to add to the default radius of 1 tile +; FOR NUKES:the amount to add to the default radius of 1 tile ; "Join City" ; pop_cost = the number of population added to the target city ; "Paradrop Unit" @@ -583,9 +575,9 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; "HutTech" = can be found in a hut, but its techs required ; "Partisan" = can be created as a partisan (only one unit can have this ; flag), see end of this file for its tech requirements option -; "DefendOk" = AI hint: ok for defending with -; "DefendGood" = AI hint: good for defending with -; "Ferryboat" = AI hint: useful for ferrying +; "DefendOk" = AI hint:ok for defending with +; "DefendGood" = AI hint:good for defending with +; "Ferryboat" = AI hint:useful for ferrying ; "Barbarian" = can be created as land barbarian ; "BarbarianTech" = can be created as land barbarian, if someone has ; researched its tech requirements @@ -598,7 +590,7 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; "BarbarianSeaTech" = can be created as a barbarian that disembarks from a barbarian boat ; if someone has researched its tech requirements ; "Settlers" = can irrigate and build roads -; "Hunter" = AI hint: good for hunting other units +; "Hunter" = AI hint:good for hunting other units ; "CitiesStartUnit" = Gets granted as 'c' startunit ; "WorkerStartUnit" = Gets granted as 'w' startunit ; "ExplorerStartUnit" = Gets granted as 'x' startunit @@ -609,8 +601,11 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; "DefendGoodStartUnit" = Gets granted as 'D' startunit ; "AttackFastStartUnit" = Gets granted as 'a' startunit ; "AttackStrongStartUnit" = Gets granted as 'A' startunit -; -; */ <-- avoid gettext warnings + +; "UserType1Startunit" = Gets granted as 'u' startunit +; "UserType2Startunit" = Gets granted as 'U' startunit +; "UserType3Startunit" = Gets granted as 'z' startunit +; "TradeStartUnit" = Gets granted as 't' startunit [unit_settlers] name = _("Settlers") @@ -1232,7 +1227,6 @@ disembarks = "LandRoad", "LandRail", "Helicopter" targets = "Balloon", "Helicopter", "LandRail" flags = "MultiSlot", "IgTer", "IgZOC", "NoHome", "FootSoldier", "Capturer", "CantReachAir", "Shield2Gold", "Settlers", "CanHide", "WillNever" -;yes Partisan has 0 upkeep so Shield2Gold is meaningless, but currently used to substitute MultiSlot inaccessible in c-server roles = "DefendGood", "DefendGoodStartUnit", "Partisan", "BarbarianTech" helptext = _("\ Partisans are guerilla fighters who can use the terrain to their advantage. Like the Explorer\ @@ -4120,7 +4114,7 @@ uk_food = 0 uk_gold = 0 embarks = "LandRoad", "Helicopter" ; transport helicopter only disembarks = "LandRoad", "Helicopter" -flags = "HelpWonder", "TradeRoute", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Expellable", "Shield2Gold" +flags = "HelpWonder", "TradeRoute", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Expellable", "MultiSlot" roles = "AttackStrongStartUnit" ;note: MP2 doesn't start games with ASSU's so has co-opted this for caravan start unit. helptext = _("\ Caravans are Commerce units. Commerce units can help build Wonders in any city with whom\ diff --git a/freeciv/freeciv/data/mp2-brava2/README.brava b/freeciv/freeciv/data/mp2-brava2/README.brava deleted file mode 100644 index eab60b55a..000000000 --- a/freeciv/freeciv/data/mp2-brava2/README.brava +++ /dev/null @@ -1,31 +0,0 @@ -AG: Avant-garde ruleset -------------------------------------- -LINKS: -Full Game Manual -Multiplayer II Summary -Design Log -... -Terrain -Bases -Combat -Governments -Economy -Diplomacy -Diplomatic Odds Charts -... -Terrain+Base Defense Bonus Quick-Reference -Hotkeys and Mouse Control - -The Avant-garde ruleset is a modernized ruleset to take advantage of cutting-edge advancements in Freeciv Server development. -Compared to Multiplayer-Evolution (MP2), the differences are that it is less restrained to keep the same "DNA" as the other -MP-branch rulesets, and allows itself to import features, improvements, and novel ideas from all other versions of Freeciv, -later versions of the commercial series, as well as original ideas from players. - -This ruleset began using MP2 as its base and added to it. Enjoy! - ------------------------------ -Changelog for MP2: ------------------------------ -Changelog - -END. \ No newline at end of file diff --git a/freeciv/freeciv/data/mp2-brava2/buildings.ruleset b/freeciv/freeciv/data/mp2-brava2/buildings.ruleset deleted file mode 100644 index e3c704959..000000000 --- a/freeciv/freeciv/data/mp2-brava2/buildings.ruleset +++ /dev/null @@ -1,2213 +0,0 @@ -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes, -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -; Note that the freeciv AI may not cope well with anything more -; than minor changes. - -[datafile] -description="Avant-garde buildings data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -; /* <-- avoid gettext warnings -; -; Below: The individual buildings, one per section. -; (Buildings = City Improvements and Wonders) -; -; The actual tag used (the * in [building_*]) does not matter, except -; it must be unique within this file, and it may be used in debug -; output when reading this file. -; -; Notes: -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; if -; not present, "name" is used for this purpose too. Since -; the name used in savegames must not change, if you want -; to rename an item after a ruleset has been released, you -; should set "rule_name" to the original value of "name". -; genus = genus; one of: -; "GreatWonder", "SmallWonder", "Improvement", "Special". -; reqs = requirements to build the building (see effects.ruleset -; and README.effects for help on requirements) -; graphic = icon of improvement (used in city dialog) -; graphic_alt = alternate icon of improvement -; obsolete_by = requirements for the building to become obsolete -; build_cost = production shields required to build -; upkeep = monetary upkeep value -; sabotage = percent chance of diplomat sabotage being successful -; flags = special flag strings -; -; ** Building flags ** -; "VisibleByOthers" = Anyone who can see your city knows whether it has -; this improvement. (Great and small wonders are -; always visible.) -; "SaveSmallWonder" = If you lose the city with this building in, and the -; "savepalace" server setting is enabled, another will -; be built for free in a random city. -; Should only be used with genus "SmallWonder". -; "Gold" = Not a real building; production turned into gold -; indefinitely (capitalization/coinage). -; Genus should be "Special". -; "DisasterProof" = Disasters never destroy this building. Is meaningful -; only for genus "Improvement" buildings as others are -; automatically disaster proof. -; -; */ <-- avoid gettext warnings - -[building_airport] -name = _("Airport") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Radio", "Player" - } -graphic = "b.airport" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 120 -upkeep = 3 -sabotage = 100 -sound = "b_airport" -sound_alt = "b_generic" -helptext = _("\ -Allows a city to produce veteran Air units, Helicopters, and Missiles.\ - Damaged Air units and Helicopters which stay in town for one full turn\ - without moving are completely repaired.\ -"), _("\ -Two cities with Airports can airlift units. Airlifting instantly transports\ - the unit from one city to another and will use up all movement\ - points. A unit must have some movement points left to be airlifted.\ -") - -[building_amphitheatre] -name = _("Amphitheater") -rule_name = "Amphitheatre" ; en_GB used originally -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Construction", "Player" - } -graphic = "b.colosseum" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 4 -sabotage = 100 -sound = "b_colosseum" -sound_alt = "b_generic" -helptext = _("\ -Entertains the citizens of a city, making 3 unhappy citizens content. \ - (Four after the discovery of Electricity.) However, it does not\ - affect citizens made unhappy by military activity.\ -") - -[building_aqueduct] -name = _("Aqueduct") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Construction", "Player" - } -graphic = "b.aqueduct" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 2 -sabotage = 100 -sound = "b_aqueduct" -sound_alt = "b_generic" -helptext = _("\ -Allows a city to grow larger than size 8. A Sewer System is also\ - required for a city to grow larger than size 12.\ -") -; There is also an effect to reduce the chance of plague, but you have to -; enable illness in game.ruleset for that to be relevant. - -[building_bank] -name = _("Bank") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Banking", "Player" - "Building", "Marketplace", "City" - } -graphic = "b.bank" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 80 -upkeep = 2 -sabotage = 100 -sound = "b_bank" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Together, a Bank and Marketplace double the tax and luxury production in a city.\ - That is, the Bank adds another +50% to the +50% of the Marketplace.\ -") - -[building_barracks] -name = _("Barracks") -genus = "Improvement" -reqs = - { "type", "name", "range" - - } -graphic = "b.barracks_i" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Gunpowder", "Player" - "Building", "Barracks II", "City" - "Building", "Barracks III", "City" - } -build_cost = 30 -upkeep = 1 -sabotage = 100 -sound = "b_barracks_i" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -With a Barracks I, each new land unit built in a city will\ - automatically have Veteran V1 status, which means that its attack and\ - defense strengths are increased by 50%. Also, damaged land units\ - which stay in town for one full turn without moving are completely\ - healed. Obsolete by: Gunpowder.\ -") - -[building_barracks_ii] -name = _("Barracks II") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Gunpowder", "Player" - } -graphic = "b.barracks_ii" -graphic_alt = "b.barracks_i" -obsolete_by = - { "type", "name", "range" - "Tech", "Mobile Warfare", "Player" - "Building", "Barracks III", "City" - } -build_cost = 30 -upkeep = 1 -sabotage = 100 -sound = "b_barracks_ii" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -With a Barracks II, each new land unit built in a city will\ - automatically have Veteran V1 status, which means that its attack and\ - defense strengths are increased by 50%. Also, damaged land units\ - which stay in town for one full turn without moving are completely\ - restored. Obsolete by: Mobile Warfare.\ -") - -[building_barracks_iii] -name = _("Barracks III") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Mobile Warfare", "Player" - } -graphic = "b.barracks_iii" -graphic_alt = "b.barracks_i" -obsolete_by = - { "type", "name", "range" - } -build_cost = 30 -upkeep = 1 -sabotage = 100 -sound = "b_barracks_iii" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -With a Barracks III, each new land unit built in a city will\ - automatically have Veteran V1 status, which means that its attack and\ - defense strengths are increased by 50%. Also, damaged land units\ - which stay in town for one full turn without moving are completely\ - restored.\ -"), _("\ -When combined with an Airport and Port Facility, Marines built in the city\ - will automatically have Hardened V2 status.\ -") - -[building_cathedral] -name = _("Cathedral") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Monotheism", "Player" - "Building", "Temple", "City" - } -graphic = "b.cathedral" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 75 -upkeep = 3 -sabotage = 100 -sound = "b_cathedral" -sound_alt = "b_generic" -helptext = _("\ -A Cathedral makes 3 unhappy citizens content, but does not affect citizens\ - made unhappy by military activity. Theology increases the effect by +1.\ - Communist government decreases the effect by -1. (Michelangelos Chapel enhances\ - the effect of Cathedrals by +1 happy citizen and +1 forced content citizen.)\ -") - -[building_city_walls] -name = _("City Walls") -genus = "Improvement" -flags = "VisibleByOthers" -reqs = - { "type", "name", "range" - "Tech", "Masonry", "Player" - } -graphic = "b.city_walls" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 0 -sabotage = 50 -sound = "b_city_walls" -sound_alt = "b_generic" -helptext = _("\ -City Walls give a 3x bonus to ALL units in a City against attacks from\ - Land units and Helicopters. City Walls are ineffective against Air, Sea, Missile, and\ - Howitzers. City Walls always prevent population loss when a defending unit\ - is destroyed by a Land unit. If an enemy attempts to sabotage City Walls,\ - the odds of success are halved.\ -") - -[building_coastal_defense] -name = _("Coastal Defense") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Gunpowder", "Player" - "TerrainClass", "Oceanic", "Adjacent" - } -graphic = "b.coastal_defense" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 1 -sabotage = 100 -sound = "b_coastal_defense" -sound_alt = "b_generic" -helptext = _("\ -Doubles the defense strength of all units in a city when defending against\ - against enemy ships.\ -") - -[building_courthouse] -name = _("Courthouse") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Code of Laws", "Player" - } -graphic = "b.courthouse" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 45 -upkeep = 1 -sabotage = 100 -sound = "b_courthouse" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Courthouses reduce corruption by about half (60% rounded down),\ - eliminate tile output penalties for Anarchy and Despotism, and\ - give +1 unit free of upkeep.\ -"), _("\ - Diplomatic combat gets a bonus of ¼ of base odds. (At general base odds\ - of ½, odds of losing become: ½ - ⅛ = ⅜). All other hostile diplomatic\ - actions are 20% less effective (80% - 20% = 60%).\ -"), _("\ - In Democracy, Courthouses make 1 unhappy citizen content, unless the\ - citizen is unhappy about military activity).\ -"), _("\ - Cost to incite revolt in the city is 2x if empty and 4x if occupied.\ -") - -[building_factory] -name = _("Factory") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Industrialization", "Player" - } -graphic = "b.factory" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 140 -upkeep = 4 -sabotage = 100 -sound = "b_factory" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Increases the shield production in a city by +50%. This increase may\ - contribute to pollution.\ -"), _("\ - This building lets you conscript one extra infantry/foot unit per turn.\ -") - -[building_enrichment_facility] -name = _("Enrichment Facility") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Fusion Power", "Player" - "Building", "Fusion Reactor","City" - "ServerSetting","nukes_major", "World" - } -graphic = "b.enrichment_facility" -graphic_alt = "b.capitalization" -obsolete_by = - { "type", "name", "range" - } -build_cost = 200 -upkeep = 3 -sabotage = 100 -sound = "b_enrichment_facility" -sound_alt = "b_generic" -helptext = _("\ -Allows refining the fissile isotopes needed to create nuclear fusion weapons.\ - To make these weapons, a city requires an Enrichment Facility, which first\ - requires a Fusion Reactor.\ -") - -[building_fusion_reactor] -name = _("Fusion Reactor") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Fusion Power", "Player" - } -graphic = "b.fusion_reactor" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 200 -upkeep = 4 -sabotage = 100 -sound = "b_fusion_reactor" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Increases the shield production in a city by +75% of base production levels.\ - Gives +1 build slot and +5 free shield upkeep on units.\ -") - -[building_granary] -name = _("Granary") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Pottery", "Player" - } -graphic = "b.granary" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 35 -upkeep = 1 -sabotage = 100 -sound = "b_granary" -sound_alt = "b_generic" -helptext = _("\ -The amount of stored food will be set to half full whenever a city\ - with a Granary 1) grows in size, or 2) loses size from starvation.\ - This helps a city to grow faster and more easily withstand famine.\ -") - -[building_harbour] -name = _("Harbor") -rule_name = "Harbour" ; en_GB spelling used originally -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Seafaring", "Player" - "TerrainClass", "Oceanic", "Adjacent" - } -graphic = "b.harbour" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 40 -upkeep = 1 -sabotage = 100 -sound = "b_harbour" -sound_alt = "b_generic" -helptext = _("\ -Gives one extra food resource on all Oceanic tiles. The city needs\ - to be coastal to build this improvement.\ -") - -[building_homeland_security] -name = _("Homeland Security") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Literacy", "Player" - "Building", "Supreme Court", "Player" - } -graphic = "b.homeland_security" -graphic_alt = "b.courthouse" -obsolete_by = - { "type", "name", "range" - } -build_cost = 30 -upkeep = 0 -sabotage = 0 -sound = "b_homeland_security" -sound_alt = "b_generic" -helptext = _("\ -You can build Homeland Security offices if you own the Supreme Court. Homeland Security\ - gives the same bonus as a Courthouse vs. all hostile diplomatic acts. As a ministry of the\ - Supreme Court, it has no upkeep and cannot be sabotaged.\ -") - -[building_hydro_plant] -name = _("Hydro Plant") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Electronics", "Player" - "Building", "Factory", "City" - "Extra", "River", "Adjacent" - } -graphic = "b.hydro_plant" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 180 -upkeep = 4 -sabotage = 100 -sound = "b_hydro_plant" -sound_alt = "b_generic" -helptext = _("\ -For each Factory or Mfg. Plant in a city, a Hydro Plant adds +25% to\ - base production, and reduces pollution from production by -25%.\ -"), _("\ -*If a city has either a Factory or Mfg. Plant, this makes a combined +75%\ - production bonus with a 25% decrease in pollution from production.\ -"), _("\ -*In a city with both a Factory and Mfg. Plant, this makes a combined +150%\ - production bonus with a 50% decrease in pollution from production.\ -"), _("\ -*Only one Power Plant, Hydro Plant, Nuclear Plant, or\ - Solar Plant can have an active effect in a city.\ -") - -[building_library] -name = _("Library") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Writing", "Player" - } -graphic = "b.library" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 1 -sabotage = 100 -sound = "b_library" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Increases the science output in a city by +100%.\ -") - -[building_marketplace] -name = _("Marketplace") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Currency", "Player" - } -graphic = "b.marketplace" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 0 -sabotage = 100 -sound = "b_marketplace" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Increases the luxury and tax output in a city by +50%.\ -") - -[building_mass_transit] -name = _("Mass Transit") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Mass Production", "Player" - } -graphic = "b.mass_transit" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 0 -sabotage = 100 -sound = "b_mass_transit" -sound_alt = "b_generic" -helptext = _("\ -Eliminates the pollution generated by population.\ - Production becomes the only source of pollution in\ - the city.\ -"), _("\ -Increased citizen mobility and ticket revenues\ - increase base trade on city centre tile by +2\ -") - -[building_mfg_plant] -name = _("Manufacturing Plant") -rule_name = "Mfg. Plant" -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Robotics", "Player" - "Building", "Factory", "City" - } -graphic = "b.mfg_plant" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 220 -upkeep = 6 -sabotage = 100 -sound = "b_mfg_plant" -sound_alt = "b_generic" -helptext = _("\ -A Manufacturing Plant increases base production by +50%.\ -"), _("\ -A Mfg. Plant & Factory together double the production in a city.\ - That is, the Mfg. Plant adds another +50% to the +50% of the Factory.\ -"), _("\ -A Mfg. Plant with a Factory AND a Power, Hydro, Nuclear, or Solar Plant\ - will combine for a total +150% increase over base production.\ -"), _("\ -The pollution reduction of a Hydro, Nuclear, or Solar Plant is applied one more\ - time to cities with Mfg. Plants, effectively doubling the bonus percentage.\ -"), _("\ - This building lets you conscript one extra infantry/foot unit per turn.\ -") - -[building_nuclear_plant] -name = _("Nuclear Plant") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Nuclear Power", "Player" - "Building", "Factory", "City" - } -graphic = "b.nuclear_plant" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 120 -upkeep = 2 -sabotage = 100 -sound = "b_nuclear_plant" -sound_alt = "b_generic" -helptext = _("\ -For each Factory or Mfg. Plant in a city, a Nuclear Plant adds +25% to\ - base production, and reduces pollution from production by -25%.\ -"), _("\ -*If a city has either a Factory or Mfg. Plant, this makes a combined +75%\ - production bonus with a 25% decrease in pollution from production.\ -"), _("\ -*In a city with both a Factory and Mfg. Plant, this makes a combined +150%\ - production bonus with a 50% decrease in pollution from production.\ -"), _("\ -*Only one Power Plant, Hydro Plant, Nuclear Plant, or\ - Solar Plant can have an active effect in a city.\ -") - -[building_offshore_platform] -name = _("Offshore Platform") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Miniaturization", "Player" - "TerrainClass", "Oceanic", "Adjacent" - } -graphic = "b.offshore_platform" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 120 -upkeep = 3 -sabotage = 100 -sound = "b_offshore_platform" -sound_alt = "b_generic" -helptext = _("\ -Adds 1 extra production to all Oceanic tiles worked by a city. The\ - city needs to be coastal to build this improvement.\ -") - -[building_police_station] -name = _("Police Station") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Communism", "Player" - } -graphic = "b.police_station" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 50 -upkeep = 2 -sabotage = 100 -sound = "b_police_station" -sound_alt = "b_generic" -helptext = _("\ -Police Stations neutralize the unhappiness caused by two military units, and\ - prevent enemies from estalishing embassies without first agreeing to cease-fire\ - or peace.\ -"), _("\ - Diplomatic combat gets a bonus of ¼ of base odds. (At general base odds\ - of ½, odds of losing become: ½ - ⅛ = ⅜). All other hostile diplomatic\ - actions are 20% less effective (80% - 20% = 60%).\ -"), _("\ - Diplomats and Spies made in a city with Police Station gain +1 veteran level.\ -") - -[building_port_facility] -name = _("Port Facility") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Amphibious Warfare", "Player" - "TerrainClass", "Oceanic", "Adjacent" - } -graphic = "b.port_facility" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 60 -upkeep = 3 -sabotage = 100 -sound = "b_port_facility" -sound_alt = "b_generic" -helptext = _("\ -Allows a city to build veteran sea units. Damaged sea units\ - which stay in town for one full turn without moving are completely\ - restored.\ -") - -[building_power_plant] -name = _("Power Plant") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Refining", "Player" - "Building", "Factory", "City" - } -graphic = "b.power_plant" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 130 -upkeep = 4 -sabotage = 100 -sound = "b_power_plant" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -For each Factory or Mfg. Plant in a city, a Power Plant adds +25% to\ - base production. The extra production may lead to more pollution.\ -"), _("\ -*If a city has either a Factory or Mfg. Plant, this makes a combined +75%\ - production bonus.\ -"), _("\ -*In a city with both a Factory and Mfg. Plant, this makes a combined +150%\ - production bonus.\ -"), _("\ -*Only one Power Plant, Hydro Plant, Nuclear Plant, or\ - Solar Plant can have an active effect in a city.\ -") - -[building_radar_tower] -name = _("Radar Tower") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Radar", "Player" - } -graphic = "b.radar_tower" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 55 -upkeep = 0 -sabotage = 100 -sound = "b_radar_tower" -sound_alt = "b_generic" -helptext = _("\ -Radar Towers use advanced technology to increase a city's vision to\ - approximately 6 tiles.\ -") - -[building_recycling_center] -name = _("Recycling Center") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Recycling", "Player" - } -graphic = "b.recycling_center" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 70 -upkeep = 1 -sabotage = 100 -sound = "b_recycling_center" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -A Recycling Center reduces the pollution\ - generated by production in a city by -66%. Supply of raw\ - recycled materials adds +2 producton to the city\ - center tile.\ -") - -[building_research_lab] -name = _("Research Lab") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Computers", "Player" - "Building", "University", "City" - } -graphic = "b.research_lab" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 120 -upkeep = 3 -sabotage = 100 -sound = "b_research_lab" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Adds +100% to base science output for each Library and University\ - in a city.\ -*In a city with a Library or University, the combined increase to science\ - output is +200%. \ -*In a city with a Library and a University, the combined increase\ - is +450%.\ -") - -[building_sam_battery] -name = _("SAM Battery") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Rocketry", "Player" - } -graphic = "b.sam_battery" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 70 -upkeep = 2 -sabotage = 100 -sound = "b_sam_battery" -sound_alt = "b_generic" -helptext = _("\ -Doubles the defense of all units inside the city when attacked by\ - aircraft (not including Helicopters or Missiles). Stealth aircraft\ - reduce the bonus to 25%.\ -") - -[building_sdi_defense] -name = _("SDI Defense") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Laser", "Player" - } -graphic = "b.sdi_defense" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 140 -upkeep = 4 -sabotage = 100 -sound = "b_sdi_defense" -sound_alt = "b_generic" -helptext = _("\ -Protects a city and its environs (up to 2 tiles away) from attacks\ - by Nuclear units. A Nuclear unit not owned by you or a teammate will\ - be shot down and have no effect if it tries to detonate in this area.\ - Nuclear units detonating outside this area will still affect all tiles\ - adjacent to ground zero, including tiles within the protected area.\ - SDI also doubles defense for units in the city against non-nuclear missiles.\ -") - -[building_sewer_system] -name = _("Sewer System") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Sanitation", "Player" - "Building", "Aqueduct", "City" - } -graphic = "b.sewer_system" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 80 -upkeep = 2 -sabotage = 100 -sound = "b_sewer_system" -sound_alt = "b_generic" -helptext = _("\ -Allows a city to grow larger than size 12. An Aqueduct is first\ - required for a city to grow larger than size 8.\ -") -; There is also an effect to reduce the chance of plague, but you have to -; enable illness in game.ruleset for that to be relevant. - -[building_solar_plant] -name = _("Solar Plant") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Environmentalism", "Player" - "Building", "Factory", "City" - } -graphic = "b.solar_plant" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 140 -upkeep = 4 -sabotage = 100 -sound = "b_solar_plant" -sound_alt = "b_generic" -helptext = _("\ -For each Factory or Mfg. Plant in a city, a Solar Plant adds +25% to\ - base production, and reduces pollution from production by -50%.\ -"), _("\ -*If a city has either a Factory or Mfg. Plant, this makes a combined +75%\ - production bonus with a 50% decrease in pollution from production.\ -"), _("\ -*In a city with both a Factory and Mfg. Plant, this makes a combined +150%\ - production bonus with 100% elimination of all pollution from production.\ -"), _("\ -*Only one Power Plant, Hydro Plant, Nuclear Plant, or\ - Solar Plant can have an active effect in a city.\ -") - -[building_space_component] -name = _("Space Component") -genus = "Special" -reqs = - { "type", "name", "range" - "Tech", "Plastics", "Player" - "Building", "Factory", "City" - } -graphic = "b.space_component" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 1000 -upkeep = 0 -sabotage = 100 -sound = "b_space_component" -sound_alt = "b_generic" -helptext = _("\ -Space Components can be differentiated into Propulsion and Fuel Components.\ - Each pair of them reduces spaceship travel time. You can build up to 8 pairs.\ -"), _("\ -Before you can build any spaceship parts, your nation must have built the\ - Apollo Program.\ -") - -[building_space_module] -name = _("Space Module") -genus = "Special" -reqs = - { "type", "name", "range" - "Tech", "Superconductors", "Player" - "Building", "Factory", "City" - } -graphic = "b.space_modules" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 2000 -upkeep = 0 -sabotage = 100 -sound = "b_space_module" -sound_alt = "b_generic" -helptext = _("\ -Space Modules are the most expensive parts of spaceships. There\ - are three different types of Space Module:\ -"), _("\ -- Habitation Module: provides living space for 10,000 people.\ -"), _("\ -- Life Support Module: provides food and water for the population of\ - one Habitation Module.\ -"), _("\ -- Solar Panels: provides the energy needed for any two of the other\ - Modules.\ -"), _("\ -You can build up to 4 Space Modules of each kind.\ -"), _("\ -Before you can build any spaceship parts, your nation must have built the\ - Apollo Program.\ -") - -[building_space_structural] -name = _("Space Structural") -genus = "Special" -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "Building", "Factory", "City" - } -graphic = "b.space_structural" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 500 -upkeep = 0 -sabotage = 100 -sound = "b_space_structural" -sound_alt = "b_generic" -helptext = _("\ -Space Structurals form the base of your spaceship. All other\ - spaceship parts need to be connected to Structurals in order to\ - function. You can build up to 32 Space Structurals.\ -"), _("\ -Before you can build any spaceship parts, your nation must have built the\ - Apollo Program.\ -") - -[building_stock_exchange] -name = _("Stock Exchange") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Economics", "Player" - "Building", "Bank", "City" - } -graphic = "b.stock_exchange" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 120 -upkeep = 3 -sabotage = 100 -sound = "b_stock_exchange" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -In cities with a Bank, a Stock Exchange boosts tax and luxury\ - production by an additional +50%.\ -"), _("\ -*A Bank and Stock Exchange together boost\ - tax and luxury production by +100%.\ -"), _("\ -*A Marketplace, Bank, and Stock Exchange together boost\ - tax and luxury production by +150%.\ -") - -[building_super_highways] -name = _("Super Highways") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Automobile", "Player" - } -graphic = "b.super_highways" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 120 -upkeep = 3 -sabotage = 100 -sound = "b_super_highways" -sound_alt = "b_generic" -helptext = _("\ -Increases trade by +50% on all tiles with roads, railroads, or MagLev (rounded down.) Improves transportation\ - logistics to an Airport, giving +1 airlift capacity to cities over size 12.\ -") - -[building_supermarket] -name = _("Supermarket") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Refrigeration", "Player" - } -graphic = "b.supermarket" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 80 -upkeep = 3 -sabotage = 100 -sound = "b_supermarket" -sound_alt = "b_generic" -helptext = _("\ -Increases the food resources by +100% on each farmland tile which\ - is being used around the city. An irrigable city centre tile receives a\ - +50% bonus immediately, but cannot receive a benefit from farmland.\ - Farmland tiles are those which have been irrigated a second time.\ -") - -[building_temple] -name = _("Temple") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Ceremonial Burial", "Player" - } -graphic = "b.temple" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 30 -upkeep = 1 -sabotage = 100 -sound = "b_temple" -sound_alt = "b_generic" -helptext = _("\ -Makes one unhappy citizen content. Mysticism doubles\ - this effect. With both Mysticism and the Oracle, +4 citizens are\ - made content. Does not affect citizens made unhappy by military\ - activity.\ -") - -[building_university] -name = _("University") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "University", "Player" - "Building", "Library", "City" - } -graphic = "b.university" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 120 -upkeep = 3 -sabotage = 100 -sound = "b_university" -sound_alt = "b_generic" -helptext = _("\ -Adds +150% to science output in a city with a Library.\ -"), _("\ -*A University and Library combine for a +250% increase\ - in science output.\ -") - -[building_palace] -name = _("Palace") -genus = "SmallWonder" -flags = "SaveSmallWonder" -reqs = - { "type", "name", "range" - "Tech", "Masonry", "Player" - } -graphic = "b.palace" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 70 -upkeep = 0 -sabotage = 0 -sound = "b_palace" -sound_alt = "b_generic" -helptext = _("\ -Sets the main capital of your nation. Loss of your main capital: \ - (1) creates a new Palace and capital in a random city,\ - (2) destroys any Spaceship you are building, (3) may cause civil war.\ -"), _("\ - Capital cities gain +1 happy citizen.\ -"), _("\ - Capitals cannot be incited to revolt. The closer a city is to a capital,\ - the higher the cost to bribe or incite revolt. In a capital, the chance of\ - enemy agents defeating your agents or sabotaging buildings is halved.\ -"), _("\ - Corruption in cities increases with distance from a capital. Capitals\ - enjoy a further reduction of corruption by half.\ -"), _("\ - You can rebuild your Palace in another city. This may secure\ - a safer location or reduce corruption for nearby cities.\ -"), _("\ - The Palace gives a production bonus of +75% under Despotism,\ - +50% under Monarchy, and +25% under Communism. Fundamentalism gets\ - a +50% gold bonus.\ -"), _("\ - A Palace automatically appears in your first city. This nullifies\ - the move bonus for nations who have no cities, due to sedentary\ - culture.\ -"), _("\ - With Conscription, a Palace allows producing one extra qualifying unit per turn.\ -") - -[building_ecclesiastical_palace] -name = _("Ecclesiastical Palace") -genus = "SmallWonder" -flags = "SaveSmallWonder" -reqs = - { "type", "name", "range" - "Tech", "Mysticism", "Player" - } -graphic = "b.ecclesiastical_palace" -graphic_alt = "b.palace" -obsolete_by = - { "type", "name", "range" - } -build_cost = 90 -upkeep = 0 -sabotage = 0 -sound = "b_palace" -sound_alt = "b_generic" -helptext = _("\ -Sets your religious capital and second center of government. Loss of this\ - city will create a new Ecclesiastical Palace in a random city.\ -"), _("\ - Capital cities gain +1 happy citizen.\ -"), _("\ - Capitals cannot be incited to revolt. The closer a city is to a capital,\ - the higher the cost to bribe or incite revolt. In a capital, the chance of\ - enemy agents defeating your agents or sabotaging buildings is halved.\ -"), _("\ - Corruption in cities increases with distance from the closest capital. Capitals\ - enjoy a further reduction of corruption by half.\ -"), _("\ - Religious capitals have a gold income bonus of +75% under Despotism,\ - +50% under Monarchy, +50% under Fundamentalism, and +25% under Communism.\ -"), _("\ - Under Fundamentalism, Fanatics produced in the city with this building\ - are inspired by fervorous faith to +1 higher veteran level.\ -"), _("\ - With Conscription, allows producing one extra qualifying unit per turn.\ -") - -[building_agoge] -name = _("Agōgē of Sparta") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Bronze Working", "Player", TRUE, FALSE - "Building", "Agōgē of Sparta", "Player", FALSE, TRUE - } -graphic = "b.agoge" -graphic_alt = "b.sun_tzus_war_academy" -obsolete_by = - { "type", "name", "range" - "Tech", "Gunpowder", "Player" - } -build_cost = 90 -upkeep = 0 -sabotage = 0 -sound = "w_agoge" -sound_alt = "w_generic" -helptext = _("\ -The Agōgē creates a culture of extreme fitness, and is famous for\ - vigilant patrols, secret shortcut trails, and battle readiness.\ - All your foot soldiers get +⅓ move. Phalanx and Pikemen receive a\ - +50% attack bonus. Foot units in the city with the Agōgē begin\ - their turn with +1 move. Obsolete by: Gunpowder.\ -") - -[building_apollo_program] -name = _("Apollo Program") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Space Flight", "Player", TRUE, FALSE - "Building", "Apollo Program", "Player", FALSE, TRUE - } -graphic = "b.apollo_program" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 600 -upkeep = 0 -sabotage = 0 -sound = "w_apollo_program" -sound_alt = "w_generic" -helptext = _("\ -Allows you to start building spaceship parts in cities\ - with factories (assuming you have researched the necessary\ - technologies).\ -") - -[building_asmiths_trading_co] -name = _("A.Smith's Trading Co.") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Economics", "Player", TRUE, FALSE - "Building", "A.Smith's Trading Co.", "Player", FALSE, TRUE - } -graphic = "b.asmiths_trading_co" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 300 -upkeep = 0 -sabotage = 0 -sound = "w_asmiths_trading_co" -sound_alt = "w_generic" -helptext = _("\ -In all your cities, Buildings with upkeep of 1 gold become free.\ - This Wonder also allows three new specialists:\ -"), _(" - * Each Laborer produces 1 production point for their city per turn;\ -"), _(" - * Each Merchant produces 1 gold and 2 trade points per turn.\ - Trade is then distributed by your national tax rates.\ -"), _(" - * Each Farmer provides 1 food for their city per turn;\ -"), _(" - This wonder is never obsolete.\ -") - -[building_colossus] -name = _("Colossus") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Bronze Working", "Player", TRUE, FALSE - "Building", "Colossus", "Player", FALSE, TRUE - } -graphic = "b.colossus" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Automobile", "Player" - } -build_cost = 100 -upkeep = 0 -sabotage = 0 -sound = "w_colossus" -sound_alt = "w_generic" -helptext = _("\ -In the city where this wonder is built, +1 trade is added to every tile\ - that generates trade on its own.\ - Obsolete by: Automobile.\ -") - - -[building_copernicus_observatory] -name = _("Copernicus' Observatory") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Astronomy", "Player", TRUE, FALSE - "Building", "Copernicus' Observatory", "Player", FALSE, TRUE - } -graphic = "b.copernicus_observatory" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 100 -upkeep = 0 -sabotage = 0 -sound = "w_copernicus_observatory" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Boosts science production by 100% in the city where it is built.\ - That is, the base science level before any improvements were made,\ - is added to the total science. This wonder is never obsolete.\ -") - -[building_cure_for_cancer] -name = _("Cure For Cancer") -genus = "GreatWonder" -reqs = - { "type", "name", "range" - "Tech", "Genetic Engineering", "Player" - } -graphic = "b.cure_for_cancer" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 400 -upkeep = 0 -sabotage = 0 -sound = "w_cure_for_cancer" -sound_alt = "w_generic" -helptext = _("\ -This stunning technological achievement makes two content citizens\ - happy in all cities of all players who know Genetic\ - Engineering. In the event where there are not enough\ - content citizens to benefit from this effect, the wonder\ - applies to unhappy citizens (including those unhappy about military\ - activity), making each content then happy. This wonder is never obsolete.\ -") - -[building_eiffel_tower] -name = _("Eiffel Tower") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Steam Engine", "Player", TRUE, FALSE - "Building", "Eiffel Tower", "Player", FALSE, TRUE - } -graphic = "b.eiffel_tower" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 100 -upkeep = 0 -sabotage = 0 -sound = "w_eiffel_tower" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -All your cities support one unit free of\ - shield upkeep. This wonder is never obsolete.\ -") - -[building_genghis_khans_equestrian_school] -name = _("Genghis Khan's Equestrian School") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Horseback Riding", "Player", TRUE, FALSE - "Building", "Genghis Khan's Equestrian School", "Player", FALSE, TRUE - "Building", "Barracks", "City", TRUE, FALSE - } -graphic = "b.genghis_khans_equestrian_school" -graphic_alt = "b.sun_tzus_war_academy" -obsolete_by = - { "type", "name", "range" - "Tech", "Mobile Warfare", "Player" - } -build_cost = 150 -upkeep = 0 -sabotage = 0 -sound = "w_sun_tzus_war_academy" -sound_alt = "w_generic" -helptext = _("\ -Gives all mounted units +1 movement point, except for Cavalry. Must be\ - built in a city with Barracks I (not II). Obsolete by: Mobile Warfare.\ -") - -[building_gibraltar_fortress] -name = _("Gibraltar Fortress") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Metallurgy", "Player", TRUE, FALSE - "Building", "Gibraltar Fortress", "Player", FALSE, TRUE - "TerrainClass", "Oceanic", "Adjacent", TRUE, FALSE - } -graphic = "b.gibraltar_fortress" -graphic_alt = "b.great_wall" -obsolete_by = - { "type", "name", "range" - } -build_cost = 350 -upkeep = 0 -sabotage = 0 -sound = "w_gibraltar_fortress" -sound_alt = "w_generic" -helptext = _("\ -Gives a Coastal Defense in all your coastal cities. This has no effect\ - when Coastal Defense is already present. This Wonder must be built\ - in a coastal city. It does not become obsolete.\ -") - -[building_great_wall] -name = _("Great Wall") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Masonry", "Player", TRUE, FALSE - "Building", "Great Wall", "Player", FALSE, TRUE - } -graphic = "b.great_wall" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Machine Tools", "Player" - } -build_cost = 275 -upkeep = 0 -sabotage = 0 -sound = "w_great_wall" -sound_alt = "w_generic" -helptext = _("\ -The Great Wall protects your cities with City Walls. It takes three\ - turns after founding a city for the Great Wall to extend protection\ - to the new city. Also, the city must have been founded by you, or\ - assimilated to where less than a fifth of its citizens are foreign.\n\ -The Great Wall gives no extra effect when City Walls are already present.\ - However, regular City Walls still protect a city in which the Great\ - Wall has not yet activated.\nWarning! This Wonder is obsolete when\ - ANY nation in the world discovers Machine Tools. You may not know\ - which nations have Machine Tools. This makes it possible for you to\ - build an obsolete wonder!\ -") - -[building_hanging_gardens] -name = _("Hanging Gardens") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Pottery", "Player", TRUE, FALSE - "Building", "Hanging Gardens", "Player", FALSE, TRUE - } -graphic = "b.hanging_gardens" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Railroad", "Player" - } -build_cost = 200 -upkeep = 0 -sabotage = 0 -sound = "w_hanging_gardens" -sound_alt = "w_generic" -helptext = _("\ -Makes two content citizens happy in every city in your nation.\ - In the event where there are no content citizens to get the\ - effect of Hanging Gardens, the wonder applies to unhappy citizens\ - (including those unhappy about military activity), making each content\ - then happy. Gives +2 luxury in the city where it is built.\ - Obsolete by: Railroad.\ -") - -[building_hoover_dam] -name = _("Hoover Dam") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Electronics", "Player", TRUE, FALSE - "Extra", "River", "Adjacent", TRUE, FALSE - "Building", "Hoover Dam", "Player", FALSE, TRUE - } -graphic = "b.hoover_dam" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 600 -upkeep = 0 -sabotage = 0 -sound = "w_hoover_dam" -sound_alt = "w_generic" -helptext = _("\ -Works exactly as a Hydro Plant in all your cities.\ - (This reduces pollution and increases the effects\ - of Factories and Mfg. Plants.) Must be built adjacent\ - to a river. This wonder is never obsolete.\ -") - -[building_isaac_newtons_college] -name = _("Isaac Newton's College") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Theory of Gravity", "Player", TRUE, FALSE - "Building", "Isaac Newton's College", "Player", FALSE, TRUE - } -graphic = "b.isaac_newtons_college" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 400 -upkeep = 0 -sabotage = 0 -sound = "w_isaac_newtons_college" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Adds 100% of base science production to every city in your\ - nation that has a University. That is, the boost that a\ - Library gives with no other science improvements is added\ - to the total science output in each city with a University.\ - This wonder is never obsolete.\ -") - -[building_jtids] -name = _("JTIDS") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Computers", "Player", TRUE, FALSE - "Building", "JTIDS", "Player", FALSE, TRUE - } -graphic = "b.seti_program" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 230 -upkeep = 0 -sabotage = 0 -sound = "w_seti_program" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -JTIDS (Joint Tactical Information Distribution System) is a radio\ - battlefield information network that provides real-time intel to forces\ - on the ground. Effectively, this Wonder modernizes the weaponry and info systems\ - for all the infantry in your army.\n\n\ -All foot soldiers and Mechanized Infantry are built with +1 vet level.\ - Odds of veteran promotion are increased.\ -") - -[building_js_bachs_cathedral] -name = _("J.S. Bach's Cathedral") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Theology", "Player", TRUE, FALSE - "Building", "J.S. Bach's Cathedral", "Player", FALSE, TRUE - } -graphic = "b.js_bachs_cathedral" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 300 -upkeep = 0 -sabotage = 0 -sound = "w_js_bachs_cathedral" -sound_alt = "w_generic" -helptext = _("\ -Makes two unhappy citizens content in every city in your nation\ - (including citizens unhappy about military activity).\ - This wonder is never obsolete.\ -") - -[building_king_richards_crusade] -name = _("King Richard's Crusade") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Engineering", "Player", TRUE, FALSE - "Building", "King Richard's Crusade", "Player", FALSE, TRUE - } -graphic = "b.king_richards_crusade" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Robotics", "Player" - } -build_cost = 150 -upkeep = 0 -sabotage = 0 -sound = "w_king_richards_crusade" -sound_alt = "w_generic" -helptext = _("\ -In the city where it is built, adds one extra shield resource on every\ - tile. Lets you build one extra qualifying unit per turn —— without\ - Conscription tech.\ - Obsolete by: Robotics.\ -") - -[building_leonardos_workshop] -name = _("Leonardo's Workshop") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Invention", "Player", TRUE, FALSE - "Building", "Leonardo's Workshop", "Player", FALSE, TRUE - } -graphic = "b.leonardos_workshop" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Automobile", "Player" - } -build_cost = 300 -upkeep = 0 -sabotage = 0 -sound = "w_leonardos_workshop" -sound_alt = "w_generic" -helptext = _("\ -Upgrades two obsolete units per game turn. Obsolete by:\ - Automobile.\ -") - -[building_lighthouse] -name = _("Lighthouse") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Map Making", "Player", TRUE, FALSE - "TerrainClass", "Oceanic", "Adjacent", TRUE, FALSE - "Building", "Lighthouse", "Player", FALSE, TRUE - } -graphic = "b.lighthouse" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Miniaturization", "Player" - } -build_cost = 170 -upkeep = 0 -sabotage = 0 -sound = "w_lighthouse" -sound_alt = "w_generic" -helptext = _("\ -Gives all your sea units 2 additional movement points,\ - while increasing their vision. Obsolete by: Miniaturization.\ -") - -[building_magellans_expedition] -name = _("Magellan's Expedition") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Navigation", "Player", TRUE, FALSE - "TerrainClass", "Oceanic", "Adjacent", TRUE, FALSE - "Building", "Magellan's Expedition", "Player", FALSE, TRUE - } -graphic = "b.magellans_expedition" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 400 -upkeep = 0 -sabotage = 0 -sound = "w_magellans_expedition" -sound_alt = "w_generic" -helptext = _("\ -All your new sea units built in cities in your nation start with an\ - additional veteran level (this is cumulative with any Port Facility.)\ - This wonder is never obsolete.\ -") - -[building_manhattan_project] -name = _("Manhattan Project") -genus = "GreatWonder" -reqs = - { "type", "name", "range" - "Tech", "Nuclear Fission", "Player" - } -graphic = "b.manhattan_project" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 600 -upkeep = 0 -sabotage = 0 -sound = "w_manhattan_project" -sound_alt = "w_generic" -;helptext is set in client/helpdata.c:helptext_wonder() -helptext = _("\ -Allows all nations who know Nuclear Fission to make nuclear weapons.\ - This Wonder does not become obsolete.\ -") - -[building_marco_polos_embassy] -name = _("Marco Polo's Embassy") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Trade", "Player", TRUE, FALSE - "Building", "Marco Polo's Embassy", "Player", FALSE, TRUE - } -graphic = "b.marco_polos_embassy" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 400 -upkeep = 0 -sabotage = 0 -sound = "w_marco_polos_embassy" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -This Wonder increases Trade, the very lifeblood of your tax income, science output,\ - and luxury for happiness. With this Wonder, Trade in each city increases by 40%.\ - This Wonder does not become obsolete.\ -") - -[building_michelangelos_chapel] -name = _("Michelangelo's Chapel") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Monotheism", "Player", TRUE, FALSE - "Building", "Michelangelo's Chapel", "Player", FALSE, TRUE - } -graphic = "b.michelangelos_chapel" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 300 -upkeep = 0 -sabotage = 0 -sound = "w_michelangelos_chapel" -sound_alt = "w_generic" -helptext = _("\ -This Wonder counts as a Cathedral in all cities which lack one.\ - That is, it makes 3 unhappy citizens content in each city,\ - but does not affect citizens unhappy about military activity.\ - (Theology increases the effect by +1. Communist government\ - reduces the effect by -1.)\ -"), _(" -In cities which already have a Cathedral, this Wonder enhances the\ - effects of the Cathedral, adding +1 happy citizen and +1 forced content.\ - This Wonder is never obsolete.\ -") - -;this is wonder #61 -[building_mausoleum_of_mausolos] -name = _("Mausoleum of Mausolos") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Ceremonial Burial", "Player", TRUE, FALSE - "Building", "Mausoleum of Mausolos", "Player", FALSE, TRUE - } -graphic = "b.mausoleum" -graphic_alt = "b.oracle" -obsolete_by = - { "type", "name", "range", "survives" - "Tech", "Radio", "Player", FALSE - } -build_cost = 200 -upkeep = 0 -sabotage = 0 -sound = "w_oracle" -sound_alt = "w_generic" -helptext = _("\ -With this wonder, City Walls and Courthouses each make one unhappy citizen\ - content in their city, unless that citizen is unhappy about military activity.\ - Also, no cities in the empire with this Wonder can be incited to revolt.\ - The discovery of Radio makes the Mausoleum obsolete.\ -") - -[building_oracle] -name = _("Oracle") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Mysticism", "Player", TRUE, FALSE - "Building", "Oracle", "Player", FALSE, TRUE - } -graphic = "b.oracle" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Theology", "Player" - } -build_cost = 100 -upkeep = 0 -sabotage = 0 -sound = "w_oracle" -sound_alt = "w_generic" -helptext = _("\ -Makes two of your unhappy citizens content in every city\ - with a Temple in your nation. Does not affect citizens made\ - unhappy by military activity. Obsolete by: Theology.\ -") - -[building_pyramids] -name = _("Pyramids") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Masonry", "Player", TRUE, FALSE - "Building", "Pyramids", "Player", FALSE, TRUE - } -graphic = "b.pyramids" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 160 -upkeep = 0 -sabotage = 0 -sound = "w_pyramids" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Every city will gain +25% to its food storage when population changes.\ - In addition, the city with the Pyramids can rapture when celebrating.\ - This Wonder does not become obsolete.\ -") - -[building_shakespeares_theatre] -name = _("Shakespeare's Theater") -rule_name = "Shakespeare's Theatre" ; en_GB used originally -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Medicine", "Player", TRUE, FALSE - "Building", "Shakespeare's Theatre", "Player", FALSE, TRUE - } -graphic = "b.shakespeares_theatre" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 200 -upkeep = 0 -sabotage = 0 -sound = "w_shakespeares_theatre" -sound_alt = "w_generic" -helptext = _("\ -Makes all angry and unhappy citizens content in the city where it\ - is located, including citizens unhappy about military activity.\ - This Wonder does not become obsolete.\ -") - -;this should be wonder #65 if we counted correctly and need it for the "statue hack" to determine if player can get gov. -[building_statue_of_liberty] -name = _("Statue of Liberty") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Democracy", "Player", TRUE, FALSE - "Building", "Statue of Liberty", "Player", FALSE, TRUE - } -graphic = "b.statue_of_liberty" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 400 -upkeep = 0 -sabotage = 0 -sound = "w_statue_of_liberty" -sound_alt = "w_generic" -helptext = _("\ -Allows you to instantly change government, including governments not\ - yet researched by your civilization, and without the transition period\ - of Anarchy. It also allows unprovoked declaration of war regardless of\ - any Senate or United Nations. Democracies cannot fall into Anarchy from\ - two turns of city disorder.\n\ - This Wonder does not become obsolete.\ -") - -[building_statue_of_zeus] -name = _("Statue of Zeus") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Polytheism", "Player", TRUE, FALSE - "Building", "Statue of Zeus", "Player", FALSE, TRUE - } -graphic = "b.statue_of_zeus" -graphic_alt = "b.oracle" -obsolete_by = - { "type", "name", "range", "survives" - } -build_cost = 100 -upkeep = 0 -sabotage = 0 -sound = "w_oracle" -sound_alt = "w_generic" -helptext = _("\ -The powerful Zeus gives order and organization to both city and nation.\ - In every city in your nation, this Wonder neutralizes the unhappiness\ - caused by one military unit. In the city the statue is located, it makes\ - one citizen happy and provides free upkeep to 4 units. Except for one permanent\ - happy citizen, the discovery of Tactics makes the Statue of Zeus obsolete.\ -") - -[building_supreme_court] -name = _("Supreme Court") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Literacy", "Player", TRUE, FALSE - "Building", "Supreme Court", "Player", FALSE, TRUE - } -graphic = "b.great_library" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 200 -upkeep = 0 -sabotage = 0 -sound = "w_great_library" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -With respect to corruption, incite protection, upkeep, and other bonuses, the\ - Supreme Court gives the same effect as an extra Courthouse in all your cities. By\ - itself, it gives no bonus against hostile diplomatic acts. However, owning the\ - Supreme Court enables each city to build a regional Homeland Security building\ - to acquire those additional bonuses. This Wonder is never obsolete.\ -") - -[building_sun_tzus_war_academy] -name = _("Sun Tzu's War Academy") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Feudalism", "Player", TRUE, FALSE - "Building", "Sun Tzu's War Academy", "Player", FALSE, TRUE - } -graphic = "b.sun_tzus_war_academy" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Mobile Warfare", "Player" - } -build_cost = 300 -upkeep = 0 -sabotage = 0 -sound = "w_sun_tzus_war_academy" -sound_alt = "w_generic" -helptext = _("\ -All your new military land units produced in cities in your nation\ - start with an additional veteran level (this is cumulative with any\ - Barracks in a city: with both, units are created as Hardened).\ - Obsolete by: Mobile Warfare.\ -") - -[building_temple_of_artemis] -name = _("Temple of Artemis") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Mysticism", "Player", TRUE, FALSE - "Building", "Temple", "City", TRUE, FALSE - "Building", "Temple of Artemis", "Player", FALSE, TRUE - - } -graphic = "b.temple_of_artemis" -graphic_alt = "b.oracle" -obsolete_by = - { "type", "name", "range", "survives" - "Tech", "Computers", "Player", FALSE - } -build_cost = 250 -upkeep = 0 -sabotage = 0 -sound = "w_oracle" -sound_alt = "w_generic" -helptext = _("\ -The bounteous Artemis bestows a multitudinous benefaction to all cities\ - with Temples: +1 production, +1 luxury, +1 science, and +1 gold.\ - Requires a Temple in the city where it will be built. (This wonder also\ - recovers the lost bonus shield in cities built on resources of +1 shield:\ - i.e. Grassland shield resource, Tundra fur.) Obsolete by: Computers.\ -") - -[building_teslas_laboratory] -name = _("Tesla's Laboratory") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Electricity", "Player", TRUE, FALSE - "Building", "Tesla's Laboratory", "Player", FALSE, TRUE - } -graphic = "b.teslas_laboratory" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 220 -upkeep = 0 -sabotage = 0 -sound = "w_teslas_laboratory" -sound_alt = "w_generic" -helptext = _("\ -Upgrades one obsolete unit per turn. Reduces price of unit upgrades by\ - 20%. This Wonder does not become obsolete.\ -") - -[building_internet] -name = _("The Internet") -genus = "SmallWonder" - reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Computers", "Player", TRUE, FALSE - "Building", "The Internet", "Player", FALSE, TRUE - } -graphic = "b.internet" -graphic_alt = "b.seti_program" -obsolete_by = - { "type", "name", "range" - } -build_cost = 600 -upkeep = 0 -sabotage = 0 -sound = "w_internet" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Adds to science production in all your cities with\ - a Research Lab, 100% of base output.\ - This Wonder does not become obsolete.\ -") - -[building_united_nations] -name = _("United Nations") -genus = "GreatWonder" -reqs = - { "type", "name", "range" - "Tech", "Communism", "Player" - } -graphic = "b.united_nations" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 600 -upkeep = 0 -sabotage = 0 -sound = "w_united_nations" -sound_alt = "w_generic" -helptext = _("\ -Creates a World Senate that may prevent declarations of war in some circumstances. If\ - any city in the world is in revolt for more than two turns, its whole government falls.\ - This Wonder does not become obsolete.\ -") - -[building_voyage_of_darwin] -name = _("Voyage of Darwin") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Railroad", "Player", TRUE, FALSE - "Building", "Voyage of Darwin", "Player", FALSE, TRUE - } -graphic = "b.darwins_voyage" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 200 -upkeep = 0 -sabotage = 0 -sound = "w_darwins_voyage" -sound_alt = "w_generic" -helptext = _("\ -In the city where this wonder is built, +1 trade is added to every tile\ - that generates trade on its own.\ - This Wonder is never obsolete.\ -") - -[building_womens_suffrage] -name = _("Women's Suffrage") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Industrialization", "Player", TRUE, FALSE - "Building", "Women's Suffrage", "Player", FALSE, TRUE - } -graphic = "b.womens_suffrage" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 300 -upkeep = 0 -sabotage = 0 -sound = "w_womens_suffrage" -sound_alt = "w_generic" -helptext = _("\ -In the capacity of reducing Military Unhappiness, this Wonder neutralizes the\ - unhappiness caused by two military units. This Wonder has no other\ - effect. It does not confer bonuses against hostile diplomats like a Police\ - Station. It gives no bonus to cities which already have a Police Station.\ - This Wonder does not become obsolete.\ -") - -[building_capitalization] -name = _("Coinage") -genus = "Special" -flags = "Gold" -reqs = - { "type", "name", "range" - - } -graphic = "b.capitalization" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 999 -upkeep = 0 -sabotage = 0 -helptext = _("\ -This is not a normal improvement. Setting production to Coinage converts\ - normal output into tax output (money, coins!)\ -") diff --git a/freeciv/freeciv/data/mp2-brava2/changelog.txt b/freeciv/freeciv/data/mp2-brava2/changelog.txt deleted file mode 100644 index 5c0ecafce..000000000 --- a/freeciv/freeciv/data/mp2-brava2/changelog.txt +++ /dev/null @@ -1,28 +0,0 @@ -1. Spy Plane upgrades AWACS -2. Airplane can carry diplomatic units. - a. can be expelled by fighter types -3. Train - a. capturable - b. foot units can embark/disembark - c. unreachable to pre-gunpowder - d. cargo: any unit with <=2 moves, also balloons -4. Transporting units can't fortify until unloaded -5. Trade is no longer a requirement for making wonders. - Having the required tech for a Wonder is the defacto minimalist/elegant control over this. - Availability and ease of commerce units is another control on this anyway. - Removes the artificial impossibility of making Bronze Age wonders in Bronze Age -6. Commerce units with military abilities can enter waters of nations with whom they are at Peace, but still cannot attack until a war declaration. -7. Stone Age herds of wild game appear in forests for first 15 turns 2500BC), during the age before they are overhunted and learn to be wary of humans. - a. this smooths effect of luck on starting position; micro-accelerates the slower starting turns -8. Robotics needed for Plastics, forces Armor I to be required before Armor II -9. On average, Fallout lasts 5 turns before randomly disappearing. -10. Clean pollution can be done by foot soldiers and also while transported -11. New server setting killcitizen_pct defaults to 60% (doc it) -12. Ecclesiastical Palace price drop to 90. Like a Palace, relocates when the city is lost. -13. Pre-civilized tribes enjoy a +1/3 move bonus. Building your first city increases sedentary culture and eliminates the bonus. -14. Tribesmen -- allows defending a city, early exploring, but mostly, a better unit than Explorer for giving the ability to disband for early shield acceleration. -15. Explorer -- cost reduced to 25, req changed to Map Making (was Seafaring), slight vision boost from sqrt(4) to sqrt(5) -16. Sea Bridge -- can be built with Steel tech, requires Worker type on sea transport, 6 turns. MagLevs can also be made over them. - Trains on Sea Bridge use 1/3 move instead of 1/9. - - diff --git a/freeciv/freeciv/data/mp2-brava2/effects.ruleset b/freeciv/freeciv/data/mp2-brava2/effects.ruleset deleted file mode 100644 index 150e96488..000000000 --- a/freeciv/freeciv/data/mp2-brava2/effects.ruleset +++ /dev/null @@ -1,5014 +0,0 @@ -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes, -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -; Note that the freeciv AI may not cope well with anything more -; than minor changes. - -[datafile] -description="Avant-garde effects data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -; /* <-- avoid gettext warnings -; -; Effects -; -; type = What the effect does. Values of multiple active effects -; of the same type get summed for the total. -; See README.effects for list of possible types -; value = Value added for the effect type when this effect is active, -; i.e., all requirements are fulfilled -; multiplier = Name of the policy that gives a multiplier for effect's value -; reqs = Requirements for the effect to be active. -; See README.effects for help on requirements -; -; */ <-- avoid gettext warnings - -; Med. Bomber is a "Soft Field Unit." If non-aggressively deployed, 0 unhappy in Republic, -; 1 unhappy in Democracy: -[effect_medium_bomber_field_unit_minus_one] -type = "Peaceful_Field_Unit_Bonus" -value = 1 -reqs = - { "type", "name", "range", "present" - "UnitType", "Medium Bomber", "Local", TRUE - } - -; EXAMPLE OF HOW TO USE NEW Unit_Unhappy_Cost EFFECT, almost same -; as the above effect (don't use both!) -;[effect_medium_bomber_field_unit_minus_one] -;type = "Unit_Unhappy_Cost" -;value = -1 -;reqs = -; { "type", "name", "range", "present" -; "UnitType", "Medium Bomber", "Local", TRUE -; "UnitState","OnDomesticTile","Local", TRUE -; } - -; Combat_rounds for ancient ships -[effect_combat_rounds_riverships] -type = "Combat_Rounds" -value = 15 -reqs = - { "type", "name", "range", "present" - "UnitClass", "RiverShip", "Local", TRUE - "UnitType", "Frigate", "Local", FALSE - } -[effect_combat_rounds_trireme] -type = "Combat_Rounds" -value = 15 -reqs = - { "type", "name", "range", "present" - "UnitType", "Trireme", "Local", TRUE - } - -; Cheating AI effects are in separate file -*include "default/ai_effects.ruleset" - -[effect_unhappysize] -type = "City_Unhappy_Size" -value = 4 - -; Percent foreign citizens who are unhappy if at war -; with their original nation -[effect_angry_conquered] -type = "Enemy_Citizen_Unhappy_Pct" -value = 34 ; handles proper rounding for 1/3 - -; Barbarian effects -[effect_barb1] -type = "No_Diplomacy" -value = 1 -reqs = - { "type", "name", "range" - "NationGroup", "Barbarian", "Player" - } - -; Barbarian disappearance -[effect_barb_disappear] -type = "Retire_Pct" -value = 10 -reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", TRUE - "Age", "5", "Local", TRUE - "CityTile", "Center", "Local", FALSE - } - -; Lone Leader might escape on coast (33% chance) -; Complement of the two effects should be 0.9 * 0.66 = 0.594 -; (100 - 59) - 10 = 31 -[effect_leader_escape] -type = "Retire_Pct" -value = 31 -reqs = - { "type", "name", "range" - "UnitType", "Barbarian Leader", "Local" - "Age", "5", "Local" - "TerrainClass", "Oceanic", "Adjacent" - "MaxUnitsOnTile", "1", "Local" - } - -; Specialist output bonuses -[effect_elvis] -type = "Specialist_Output" -value = 2 -reqs = - { "type", "name", "range" - "Specialist", "elvis", "Local" - "OutputType", "luxury", "Local" - } - -[effect_scientist] -type = "Specialist_Output" -value = 3 -reqs = - { "type", "name", "range" - "Specialist", "scientist", "Local" - "OutputType", "science", "Local" - } - -[effect_taxman] -type = "Specialist_Output" -value = 3 -reqs = - { "type", "name", "range" - "Specialist", "taxman", "Local" - "OutputType", "gold", "Local" - } - -[effect_merchant] -type = "Specialist_Output" -value = 2 -reqs = - { "type", "name", "range" - "Specialist", "merchant", "Local" - "OutputType", "trade", "Local" - "Building", "A.Smith's Trading Co.", "Player" - } -[effect_merchant2] -type = "Specialist_Output" -value = 1 -reqs = - { "type", "name", "range" - "Specialist", "merchant", "Local" - "OutputType", "gold", "Local" - "Building", "A.Smith's Trading Co.", "Player" - } - -[effect_worker] -type = "Specialist_Output" -value = 1 -reqs = - { "type", "name", "range" - "Specialist", "worker", "Local" - "OutputType", "shield", "Local" - "Building", "A.Smith's Trading Co.", "Player" - } - -[effect_farmer] -type = "Specialist_Output" -value = 1 -reqs = - { "type", "name", "range" - "Specialist", "farmer", "Local" - "OutputType", "food", "Local" - "Building", "A.Smith's Trading Co.", "Player" - } - -; Vision benefit from mountains (for every land unit) -[effect_mountains_vision] -type = "Unit_Vision_Radius_Sq" -value = 5 -reqs = - { "type", "name", "range" - "Terrain", "Mountains", "Local" - "UnitClass", "Land", "Local" - } -[effect_mountains_vision_1] -type = "Unit_Vision_Radius_Sq" -value = 5 -reqs = - { "type", "name", "range" - "Terrain", "Mountains", "Local" - "UnitClass", "LandAirSea", "Local" - } -[effect_mountains_vision_2] -type = "Unit_Vision_Radius_Sq" -value = 5 -reqs = - { "type", "name", "range" - "Terrain", "Mountains", "Local" - "UnitClass", "LandNoKill", "Local" - } - -; basic free tech upkeep -[effect_upkeep_tech_free] -type = "Tech_Upkeep_Free" -value = 3 -; *************************** TRADE ROUTES **************************** -[effect_trade_routes] -type = "Max_Trade_Routes" -value = 1 - -;pow(2, value/1000) -> Base = 50% -; ------------ ESTABLISH TRADE ROUTE, ONE TIME BONUS ----------------- -;pow(2, value/1000) = 19% or about 1/5 of normal -[effect_base_trade_revenue_reduce] -type = "Trade_Revenue_Bonus" -value = -1000 - -;Total = 25% -[effect_railroad_trade_revenue_reduce] -type = "Trade_Revenue_Bonus" -value = -1000 -reqs = - { "type", "name", "range" - "Tech", "Railroad", "Player" - } -;Total = 25% -[effect_flight_trade_revenue_reduce] -type = "Trade_Revenue_Bonus" -value = -1000 -reqs = - { "type", "name", "range" - "Tech", "Flight", "Player" - } - - -;If you don't acquire ongoing trade revenue from a trade route, -;a DECREASE in one-time bonus made NO SENSE AT ALL, -;Now it's a one time bonus with potentially slight ROI. -[effect_enter_marketplace_bonus_increase] -type = "Trade_Revenue_Bonus" -value = 2000 -reqs = - { "type", "name", "range" - "Action", "Enter Marketplace", "Local" - } -;TO-DO: pay x more than gold value of vessel entering marketplace, with ROI being somewhat inferior to most -;investments but hinting toward same order of magnitude. - -[effect_establish_traderoute_bonus] -type = "Trade_Revenue_Bonus" -value = -2400 -;this -2400 should go into base effect above -;then reqs action = "Establish Trade Route" can be an increase to counter both the -2400 subtracted above then to -;further tune upward any one time bonus to what it needs to be. reqs can look at unit type also to compensate higher cost -;of making certain units, since route-creating units now vary from 20 shields to 50 shields in cost. - -; ***************************** SEA UNIT REPAIR ******************************* -; Sea units have crews which pro-actively repair damage regardless of movement. -; This is almost comparable to land unit healing. Sea units being "Use once -; and dispose", and/or unable to re-enter action for literally centuries, had -; created issues in realism, playability, and balance. 8% repair/turn effect: -; 10hp units: +0 hp/turn 20hp units: +1 hp/turn -; 30hp units: +2 hp/turn 40hp units: +3 hp/turn -;[effect_sea_hp_regen] -;type = "Unit_Recover_Pct" -;value = 8 -;reqs = -; { "type", "name", "range" -; "UnitClass", "Sea", "Local" -; } -;[effect_sub_hp_regen] -;type = "Unit_Recover_Pct" -;value = 8 -;reqs = -; { "type", "name", "range" -; "UnitClass", "Submarine", "Local" -; } -;[effect_rivership_hp_regen] -;type = "Unit_Recover_Pct" -;value = 8 -;reqs = -; { "type", "name", "range" -; "UnitClass", "RiverShip", "Local" -; } -; The effects above replace the effects below after Unit_Recover_Pct is up -; The effects below substitute if Unit_Recover_Pct is missing from server -[effect_sea_hp_regen] -type = "Unit_Recover" ;30 hp units get + 2 -value = 2 -reqs = - { "type", "name", "range" - "UnitClass", "Sea", "Local" - } -[effect_sub_hp_regen] ;30 hp units get + 2 -type = "Unit_Recover" -value = 2 -reqs = - { "type", "name", "range" - "UnitClass", "Submarine", "Local" - } -[effect_rivership_hp_regen] ;20 hp units get + 1 -type = "Unit_Recover" -value = 1 -reqs = - { "type", "name", "range", "present" - "UnitClass", "RiverShip", "Local", TRUE - "UnitType", "Boat", "Local", FALSE ;have to exclude all 10hp ships - "UnitType", "Galley", "Local", FALSE - "UnitType", "War Galley", "Local", FALSE - "UnitType", "Longboat", "Local", FALSE - "UnitType", "Caravel", "Local", FALSE - "UnitType", "Ram Ship", "Local", FALSE - } -[effect_battleship_hp_regen] ;40 hp units get + 3 -type = "Unit_Recover" -value = 1 ; 2+1=3 -reqs = - { "type", "name", "range" - "UnitType", "Battleship", "Local" - } -[effect_carrier_hp_regen] ;40 hp units get + 3 -type = "Unit_Recover" -value = 1 ; 2+1=3 -reqs = - { "type", "name", "range" - "UnitType", "Carrier", "Local" - } - -; *************************** Ruleset Fortify Bonus *********************** -[effect_fortified] -type = "Fortify_Defense_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "UnitState", "Fortified", "Local" - } - -[effect_city_fortified] -type = "Fortify_Defense_Bonus" -value = 50 -reqs = - { "type", "name", "range", "present" - "CityTile", "Center", "Local", TRUE - "UnitState", "Fortified", "Local", FALSE - "UnitClassFlag", "CanFortify", "Local", TRUE - "UnitFlag", "Cant_Fortify", "Local", FALSE - } - -; ****************************** RECYCLE SHIELDS ************************** -[effect_unit_shield_value_recycle] -type = "Unit_Shield_Value_Pct" -value = -50 -reqs = - { "type", "name", "range", "present" - "Action", "Recycle Unit", "Local", TRUE - } - -[effect_unit_shield_value_in_upgrade_price_calc] -type = "Unit_Shield_Value_Pct" -value = -50 -reqs = - { "type", "name", "range", "present" - "Action", "Upgrade Unit", "Local", TRUE - } - -; *********************************** BASES ******************************* - -; **** FORT ***** -[effect_fort_defense] -type = "Defend_Bonus" -value = 33 -reqs = - { "type", "name", "range", "present" - "Extra", "Fort", "Local", TRUE - "Extra", "Fortress", "Local", FALSE ; Fortress calculated separately even if a fort is under it. - "Extra", "Naval Base", "Local", FALSE ; Naval base calculated separately even if a fort is under it. - "UnitClass", "Helicopter", "Local", FALSE ; ... these attackers do not activate Fort defense bonus - "UnitClass", "Air", "Local", FALSE ; ... " " " " " " " " - "UnitClass", "AirPillage", "Local", FALSE ; ... " " " " " " " " - "UnitClass", "AirProtect", "Local", FALSE ; ... " " " " " " " " - "UnitType", "Armor", "Local", FALSE ; ... " " " " " " " " - "UnitType", "Armor II", "Local", FALSE ; ... " " " " " " " " - } -; Fort HP regen -[effect_fort_hp_regen] -type = "HP_Regen" -value = 10 -reqs = - { "type", "name", "range" - "Extra", "Fort", "Tile" - "UnitClass", "Land", "Local" - } -[effect_fort_hp_regen_1] -type = "HP_Regen" -value = 10 -reqs = - { "type", "name", "range" - "Extra", "Fort", "Tile" - "UnitClass", "LandAirSea", "Local" - } -[effect_fort_hp_regen_2] -type = "HP_Regen" -value = 10 -reqs = - { "type", "name", "range" - "Extra", "Fort", "Tile" - "UnitClass", "LandNoKill", "Local" - } - -; **** FORTRESS/NAVAL BASE *************************************************** - -; Adjust the 1.67xdefense_bonus in terrain.ruleset for some attackers: -; **************************************************************************** -[effect_nonfortbuster_vs_fortress] -type = "Defend_Bonus" -value = 20 ;increase 1.67x to 2x except when defending against FortBuster types. -;note: 1.20*1.67=2.0 (this bonus is multiplied after terrain defense_bonus was multiplied) -reqs = - { "type", "name", "range", "present" - "Extra", "Fortress", "Local", TRUE - "UnitFlag", "FortBuster", "Local", FALSE - "UnitFlag", "FortressBuster", "Local", FALSE - "UnitFlag", "AirAttacker", "Local", FALSE - } -[effect_nonfortbuster_vs_navalbase] ;same as above but for naval base -type = "Defend_Bonus" -value = 20 ;increase 1.67x to 2x except when defending against FortBuster types. -;note: 1.20*1.67=2.0 (this bonus is multiplied after terrain defense_bonus was multiplied) -reqs = - { "type", "name", "range", "present" - "Extra", "Naval Base", "Local", TRUE - "UnitFlag", "FortBuster", "Local", FALSE - "UnitFlag", "FortressBuster", "Local", FALSE - "UnitFlag", "AirAttacker", "Local", FALSE - } -[effect_fortressbuster_fortress] -type = "Attack_Bonus" -value = 67 ;Cancel defender's 1.67x with attacker getting 1.67x -reqs = - { "type", "name", "range", "present" - "Extra", "Fortress", "Local", TRUE - "UnitFlag", "FortressBuster", "Local", TRUE - } -[effect_fortressbuster_navalbase] -type = "Attack_Bonus" -value = 67 ;Cancel defender's 1.67x with attacker getting 1.67x -reqs = - { "type", "name", "range", "present" - "Extra", "Naval Base", "Local", TRUE - "UnitFlag", "FortressBuster", "Local", TRUE - } - -; ****** ^^ defense_bonus_correctives ^^ ************************************* - -; Vision benefit from fortress watchtowers -[effect_fortress_vision] -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "tile" - "Tech", "Invention", "Player" - "UnitClass", "Land", "Local" - } -[effect_fortress_vision_1] ;Marines, AAA -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "tile" - "Tech", "Invention", "Player" - "UnitClass", "LandAirSea", "Local" - } -[effect_fortress_vision_2] ;Knights -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "tile" - "Tech", "Invention", "Player" - "UnitClass", "LandNoKill", "Local" - } - -; Fortress HP regen -[effect_fortress_hp_regen] -; Cumulative with fort: 10+15=25 -type = "HP_Regen" -value = 15 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "Tile" - "UnitClass", "Land", "Local" - } -[effect_fortress_hp_regen_1] -type = "HP_Regen" -value = 15 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "Tile" - "UnitClass", "LandAirSea", "Local" - } -[effect_fortress_hp_regen_2] -type = "HP_Regen" -value = 15 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "Tile" - "UnitClass", "LandNoKill", "Local" - } -[effect_fortress_hp_regen_3] -type = "HP_Regen" -value = 25 ;25 because not cumulative with Fort -reqs = - { "type", "name", "range" - "Extra", "Fortress", "Tile" - "UnitClass", "Helicopter", "Local" - } - -[effect_airbase_hp_regen] -type = "HP_Regen" -value = 25 -reqs = - { "type", "name", "range" - "Extra", "Airbase", "Tile" - "UnitClass", "Helicopter", "Local" - } -[effect_airbase_hp_regen1] -type = "HP_Regen" -value = 15 -reqs = - { "type", "name", "range" - "Extra", "Airbase", "Tile" - "UnitClass", "AirProtect", "Local" - } -[effect_airbase_hp_regen2] -type = "HP_Regen" -value = 15 -reqs = - { "type", "name", "range" - "Extra", "Airbase", "Tile" - "UnitClass", "Air", "Local" - } -[effect_airbase_hp_regen3] -type = "HP_Regen" -value = 15 -reqs = - { "type", "name", "range" - "Extra", "Airbase", "Tile" - "UnitClass", "AirPillage", "Local" - } - -; ****************** NAVAL BASE ****************************** -[effect_navbase_vision] -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "tile" - "Tech", "Invention", "Player" - "UnitClass", "Trireme", "Local" - } -[effect_navbase_vision1] -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "tile" - "Tech", "Invention", "Player" - "UnitClass", "RiverShip", "Local" - } -[effect_navbase_vision2] -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "tile" - "Tech", "Invention", "Player" - "UnitClass", "Sea", "Local" - } -; Naval Base HP regen -[effect_navbase_hp_regen] -type = "HP_Regen" -value = 20 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "Tile" - "UnitClass", "Sea", "Local" - } -[effect_navbase_hp_regen_1] -type = "HP_Regen" -value = 20 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "Tile" - "UnitClass", "RiverShip", "Local" - } -[effect_navbase_hp_regen_2] -type = "HP_Regen" -value = 20 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "Tile" - "UnitClass", "Trireme", "Local" - } -[effect_navbase_hp_regen_3] -type = "HP_Regen" -value = 20 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "Tile" - "UnitClass", "Submarine", "Local" - } -; *********************************************************** - -; Base vision range - radius of vision is sqrt(5) = 2.24 -[effect_city_vision] -type = "City_Vision_Radius_Sq" -value = 5 - -;PERCENTAGE CHANCE OF STEALING A TECH WHEN CONQUERING A CITY. -[effect_conquest_tech] -type = "Conquest_Tech_Pct" -value = 100 - -;Freshly fueled full hp helicopters get +1 move per turn -[effect_fresh_helicopter] -type = "Move_Bonus" -value = 9 -reqs = - { "type", "name", "range" - "UnitClass", "Helicopter", "Local" - "Extra", "Airbase", "Local" - } -;Freshly fueled full hp helicopters get +1 move per turn -[effect_fresh_helicopter2] -type = "Move_Bonus" -value = 9 -reqs = - { "type", "name", "range" - "UnitClass", "Helicopter", "Local" - "CityTile", "Center", "Local" - } - -; Nuclear power gives +1 moves to sea units (+2 under 2x) -[effect_nuclear_powered_boats] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Tech", "Nuclear Power", "Player" - "UnitClass", "Sea", "Local" - } -; Nuclear power gives +1 moves to sea units (+2 under 2x) -[effect_nuclear_powered_subs] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Tech", "Nuclear Power", "Player" - "UnitClass", "Submarine", "Local" - } - -[effect_anarchy_upkeep] -type = "Upkeep_Free" -value = 99 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } -[effect_upkeep_communism] -type = "Upkeep_Free" -value = 1 -reqs = - { "type", "name", "range", "quiet" - "Gov", "Communism", "Player", TRUE - } - -[effect_anarchy_upkeep_tech_free] -type = "Tech_Upkeep_Free" -value = 9999 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_republic] -type = "Make_Content_Mil" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_corruption_anarchy0] -type = "Output_Waste" -value = 25 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_anarchy1] -type = "Output_Waste_By_Distance" -value = 200 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_despotism0] -type = "Output_Waste" -value = 37 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_despotism1] -type = "Output_Waste_By_Distance" -value = 400 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_monarchy0] -type = "Output_Waste" -value = 15 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_monarchy1] -type = "Output_Waste_By_Distance" -value = 200 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_communism0] -type = "Output_Waste" -value = 20 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_republic0] -type = "Output_Waste" -value = 15 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_republic1] -type = "Output_Waste_By_Distance" -value = 200 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - "OutputType", "Trade", "Local" - } - -[effect_base_unit_upkeep] -type = "Upkeep_Factor" -value = 1 - -[effect_republic_unit_upkeep] -type = "Upkeep_Factor" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - "OutputType", "Food", "Local" - } - -[effect_democracy_unit_upkeep] -type = "Upkeep_Factor" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - "OutputType", "Food", "Local" - } - -[effect_republic_unit_unhappiness] -type = "Unhappy_Factor" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_democracy_unit_unhappiness] -type = "Unhappy_Factor" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_upkeep_free_units_anarchy] -type = "Unit_Upkeep_Free_Per_City" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - "OutputType", "Shield", "Local" - } - -[effect_upkeep_free_units_despotism] -type = "Unit_Upkeep_Free_Per_City" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - "OutputType", "Shield", "Local" - } - -[effect_upkeep_free_units_monarchy] -type = "Unit_Upkeep_Free_Per_City" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - "OutputType", "Shield", "Local" - } - -[effect_upkeep_free_units_communism] -type = "Unit_Upkeep_Free_Per_City" -value = 4 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - "OutputType", "Shield", "Local" - } - -[effect_civil_war_0] -type = "Civil_War_Chance" -value = 90 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_civil_war_1] -type = "Civil_War_Chance" -value = 80 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_civil_war_2] -type = "Civil_War_Chance" -value = 70 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -[effect_civil_war_3] -type = "Civil_War_Chance" -value = 50 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - } - -[effect_civil_war_4] -type = "Civil_War_Chance" -value = 40 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_civil_war_5] -type = "Civil_War_Chance" -value = 30 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_empire_size_base_0] -type = "Empire_Size_Base" -value = 9 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_empire_size_base_1] -type = "Empire_Size_Base" -value = 10 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_empire_size_base_2] -type = "Empire_Size_Base" -value = 11 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -[effect_empire_size_base_3] -type = "Empire_Size_Base" -value = 12 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - } - -[effect_empire_size_base_4] -type = "Empire_Size_Base" -value = 13 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_empire_size_base_5] -type = "Empire_Size_Base" -value = 14 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_empire_size_base_6] -type = "Empire_Size_Base" -value = 14 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_empire_size_step_0] -type = "Empire_Size_Step" -value = 6 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_empire_size_step_1] -type = "Empire_Size_Step" -value = 10 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_empire_size_step_2] -type = "Empire_Size_Step" -value = 12 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -; Empire_Size_Step disabled for Communism - -[effect_empire_size_step_3] -type = "Empire_Size_Step" -value = 14 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_empire_size_step_4] -type = "Empire_Size_Step" -value = 16 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_empire_size_step_5] -type = "Empire_Size_Step" -value = 15 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_max_rates_0] -type = "Max_Rates" -value = 100 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_max_rates_1] -type = "Max_Rates" -value = 60 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_max_rates_2] -type = "Max_Rates" -value = 70 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -[effect_max_rates_3] -type = "Max_Rates" -value = 80 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - } - -[effect_max_rates_4] -type = "Max_Rates" -value = 80 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_max_rates_5] -type = "Max_Rates" -value = 100 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_martial_law_each_0] -type = "Martial_Law_Each" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_martial_law_each_1] -type = "Martial_Law_Each" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_martial_law_each_2] -type = "Martial_Law_Each" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -[effect_martial_law_each_3] -type = "Martial_Law_Each" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - } - -[effect_martial_law_each_4] -type = "Martial_Law_Each" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_martial_law_max_0] -type = "Martial_Law_Max" -value = 100 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_martial_law_max_1] -type = "Martial_Law_Max" -value = 100 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_martial_law_max_2] -type = "Martial_Law_Max" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - } - -[effect_martial_law_max_3] -type = "Martial_Law_Max" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - } - -[effect_martial_law_max_4] -type = "Martial_Law_Max" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_rapture_grow_0] -type = "Rapture_Grow" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_rapture_grow_1] -type = "Rapture_Grow" -value = 3 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_communism_0] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - "UnitFlag", "Diplomat", "Local" - } - -[effect_gov_tile_bonus_anarchy] -type = "Output_Penalty_Tile" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Anarchy", "Player" - } - -[effect_gov_tile_bonus_despotism] -type = "Output_Penalty_Tile" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - } - -[effect_gov_tile_bonus_2] -type = "Output_Inc_Tile_Celebrate" -value = 1 -reqs = - { "type", "name", "range" - "OutputType", "Trade", "Local" - "Gov", "Monarchy", "Player" - } - -[effect_gov_tile_bonus_3] -type = "Output_Inc_Tile_Celebrate" -value = 1 -reqs = - { "type", "name", "range" - "OutputType", "Trade", "Local" - "Gov", "Communism", "Player" - } - -[effect_gov_tile_bonus_4] -type = "Output_Inc_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - "OutputType", "Trade", "Local" - } - -[effect_gov_tile_bonus_5] -type = "Output_Inc_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_gov_tile_bonus_6] -type = "Output_Inc_Tile_Celebrate" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Trade", "Local" - } - -[effect_revolution_0] -type = "Revolution_Unhappiness" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_senate_0] -type = "Has_Senate" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - } - -[effect_senate_1] -type = "Has_Senate" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - } - -[effect_partisans_communism] -type = "Inspire_Partisans" -value = 1 -reqs = - { "type", "name", "range", "present" - "Gov", "Communism", "Player", TRUE - "Tech", "Communism", "Player", TRUE - "Tech", "Gunpowder", "Player", TRUE - "Tech", "Guerilla Warfare", "World", TRUE - "NationGroup", "Barbarian", "Player", FALSE - } - -[effect_partisans_democracy] -type = "Inspire_Partisans" -value = 1 -reqs = - { "type", "name", "range", "present" - "Gov", "Democracy", "Player", TRUE - "Tech", "Communism", "Player", TRUE - "Tech", "Gunpowder", "Player", TRUE - "Tech", "Guerilla Warfare", "World", TRUE - "NationGroup", "Barbarian", "Player", FALSE - } - -[effect_airport_2] -type = "Airlift" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Airport", "City" - } - -[effect_airport_v0] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Airport", "City", TRUE - "UnitClass", "Air", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_airport_v1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Airport", "City", TRUE - "UnitClass", "AirProtect", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_airport_v2] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Airport", "City", TRUE - "UnitClass", "AirPillage", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_airport_v3] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Airport", "City", TRUE - "UnitClass", "Helicopter", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_airport_v4] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Airport", "City", TRUE - "UnitClass", "Missile", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } - -[effect_airport_h1] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Airport", "City" - "UnitClass", "Air", "Local" - } -[effect_airport_h2] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Airport", "City" - "UnitClass", "AirProtect", "Local" - } -[effect_airport_h3] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Airport", "City" - "UnitClass", "AirPillage", "Local" - } -[effect_airport_h4] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Airport", "City" - "UnitClass", "Helicopter", "Local" - } - -; Base max city size of 8 -[effect_aqueduct_size] -type = "Size_Adj" -value = 8 - -[effect_aqueduct] -type = "Size_Adj" -value = 4 -reqs = - { "type", "name", "range" - "Building", "Aqueduct", "City" - } - -[effect_aqueduct_health] -type = "Health_Pct" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Aqueduct", "City" - } - -[effect_bank] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - "Building", "Bank", "City" - "OutputType", "Gold", "Local" - } - -[effect_bank_1] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - "Building", "Bank", "City" - "OutputType", "Luxury", "Local" - } - -[effect_barracks] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "Land", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_a] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "Land", "Local", TRUE - } -[effect_barracks_b] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE ; might be resting in allied city with Barracks I - } -[effect_barracks_c] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - } - -[effect_barracks_ii] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "Land", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_ii_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_ii_2] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_ii_a] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "Land", "Local", TRUE - } -[effect_barracks_ii_b] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - } -[effect_barracks_ii_c] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - } - -[effect_barracks_iii] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "Land", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_iii_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_iii_2] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_iii_a] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Barracks III", "City" - "UnitClass", "Land", "Local" - } -[effect_barracks_iii_b] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - } -[effect_barracks_iii_c] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - } - -;prolongs time-window relevance of amphibious invasions later in game -[effect_triple_training_marines] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "Building", "Port Facility", "City", TRUE - "Building", "Airport", "City", TRUE - "UnitType", "Marines", "Local", TRUE - } - -;--- STANDARD CATHEDRAL sans Michelangelo ------------------------ -[effect_cathedral] -type = "Make_Content" -value = 3 -reqs = - { "type", "name", "range", "present" - "Building", "Cathedral", "City", TRUE - "Building", "Michelangelo's Chapel", "Player", FALSE - } -[effect_cathedral_1] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range", "present" - "Tech", "Theology", "Player", TRUE - "Building", "Cathedral", "City", TRUE - "Building", "Michelangelo's Chapel", "Player", FALSE - } -[effect_cathedral_2] -type = "Make_Content" -value = -1 -reqs = - { "type", "name", "range", "present" - "Gov", "Communism", "Player", TRUE - "Building", "Cathedral", "City", TRUE - "Building", "Michelangelo's Chapel", "Player", FALSE - } -;--- ENHANCED CATHEDRAL with Michelangelo: *** -[effect_cathedral_ma] -type = "Make_Happy" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Cathedral", "City", TRUE - "Building", "Michelangelo's Chapel", "Player", TRUE - } -[effect_cathedral_ma2] -type = "Force_Content" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Cathedral", "City", TRUE - "Building", "Michelangelo's Chapel", "Player", TRUE - } -;------------------------------------------------------------ -[effect_city_walls] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "UnitClass", "Land", "Local", TRUE - "UnitType", "Howitzer", "Local", FALSE - } -[effect_city_walls_0a] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - } -[effect_city_walls_0b] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - } -[effect_city_walls_1] -type = "Unit_No_Lose_Pop" -value = 1 -reqs = - { "type", "name", "range" - "Building", "City Walls", "City" - } -[effect_city_walls_visible] -type = "Visible_Walls" -value = 1 -reqs = - { "type", "name", "range" - "Building", "City Walls", "City" - } - -[effect_coastal_defense] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Coastal Defense", "City" - "UnitClass", "Sea", "Local" - } -[effect_coastal_defense_1] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Coastal Defense", "City" - "UnitClass", "RiverShip", "Local" - } -[effect_coastal_defense_2] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Coastal Defense", "City" - "UnitClass", "Submarine", "Local" - } -[effect_coastal_defense_trireme] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Coastal Defense", "City" - "UnitClass", "Trireme", "Local" - } - -[effect_gibraltar_fortress] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Gibraltar Fortress", "Player", TRUE - "Building", "Coastal Defense", "City", FALSE - "UnitClass", "Sea", "Local" - } -[effect_gibraltar_fortress_1] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Gibraltar Fortress", "Player", TRUE - "Building", "Coastal Defense", "City", FALSE - "UnitClass", "RiverShip", "Local" - } -[effect_gibraltar_fortress_2] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Gibraltar Fortress", "Player", TRUE - "Building", "Coastal Defense", "City", FALSE - "UnitClass", "Submarine", "Local" - } -[effect_gibraltar_fortress_trireme] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Gibraltar Fortress", "Player", TRUE - "Building", "Coastal Defense", "City", FALSE - "UnitClass", "Trireme", "Local" - } - -[effect_amphitheatre] -type = "Make_Content" -value = 3 -reqs = - { "type", "name", "range" - "Building", "Amphitheatre", "City" - } - -[effect_amphitheatre_1] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Tech", "Electricity", "Player" - "Building", "Amphitheatre", "City" - } - -; BECAUSE OF ROUNDING, AVERAGE EFFECT OF 50 ENDS UP BEING 41%, WHEREAS 60 YIELDS ABOUT 53% WHICH IS CLOSER TO ADVERTISED -[effect_courthouse_corruption1] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "OutputType", "Trade", "Local", TRUE - } -[effect_courthouse_corruption2] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "OutputType", "shield", "local", TRUE - } -[effect_courthouse_tile_corruption] ; Removes output penalties (Despotism/Anarchy) for cities with courthouses -type = "Output_Penalty_Tile" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Courthouse", "City", TRUE - } -[effect_courthouse_democracy] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - "Building", "Courthouse", "City" - } -[effect_courthouse_incite_cost_occupied] -type = "Incite_Cost_Pct" -value = 300 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "MaxUnitsOnTile", "0", "Local", FALSE - } -[effect_courthouse_incite_cost_empty] -type = "Incite_Cost_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - "Building", "Courthouse", "City", TRUE - } -[effect_courthouse_upkeep] ; Law and order provides +1 upkeep -type = "Unit_Upkeep_Free_Per_City" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Courthouse", "City", TRUE - "OutputType", "Shield", "Local" - } -[effect_courthouse_spy_resistance] -type = "Spy_Resistant" -value = 25 ;25% reduction of 50% base chance is 12.5% bonus. 50%-12.5%=37.5% success rate - ; No protection= 1/2, HL = 3/8, CH+HL = 1/4, CH+HL+PS = 1/8 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - } -[effect_courthouse_hostile_diplomat0] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Steal Tech", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_1] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Steal Tech Escape Expected", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_2] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Targeted Steal Tech", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_3] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_4] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Sabotage City", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_5] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Sabotage City Escape", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_6] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Targeted Sabotage City", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_7] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Targeted Sabotage City Escape", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_8] -type = "Action_Odds_Pct" -value = -25 ;40 minus 25%*80 = 20% -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Steal Maps Escape", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_9] -type = "Action_Odds_Pct" -value = -25 ;40 minus 25%*80 = 20% -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Steal Maps", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_10] -type = "Action_Odds_Pct" -value = -25 ;40 minus 25%*80 = 20% -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Poison City Escape", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_11] -type = "Action_Odds_Pct" -value = -25 ;40 minus 25%*80 = 20% -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Incite City", "Local", TRUE - } -[effect_courthouse_hostile_diplomat_12] -type = "Action_Odds_Pct" -value = -25 ;40 minus 25%*80 = 20% -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Action", "Incite City Escape", "Local", TRUE - } - -[effect_diplomat_defense_fortress] -type = "Spy_Resistant" -value = 25 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "Local" - } - -[effect_incite_cost_empty] -type = "Incite_Cost_Pct" -value = -50 -reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - "Building", "Courthouse", "City", FALSE - "Building", "Supreme Court", "Player", FALSE - } - -[effect_factory] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Factory", "City" - "OutputType", "Shield", "Local" - } - -[effect_fusion_reactor] -type = "Output_Bonus" -value = 75 -reqs = - { "type", "name", "range" - "Building", "Fusion Reactor", "City" - "OutputType", "Shield", "Local" - } -[effect_fusion_reactor1] -type = "Unit_Upkeep_Free_Per_City" -value = 5 -reqs = - { "type", "name", "range" - "Building", "Fusion Reactor", "City", TRUE - "OutputType", "Shield", "Local" - } -[effect_fusion_reactor2] -type = "City_Build_Slots" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Fusion Reactor", "City", TRUE - } - -[effect_granary] -type = "Growth_Food" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Granary", "City" - } - -[effect_harbour] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "TerrainClass", "Oceanic", "Local" - "Building", "Harbour", "City" - "OutputType", "Food", "Local" - } - -[effect_deer] -type = "Output_Add_Tile" -value = 3 -reqs = - { "type", "name", "range" - "Extra", "Deer", "Local" - "OutputType", "Food", "Local" - } - -[effect_wild_boar] -type = "Output_Add_Tile" -value = 3 -reqs = - { "type", "name", "range" - "Extra", "Wild Boar", "Local" - "OutputType", "Food", "Local" - } - -[effect_hydro_plant] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Hydro Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_hydro_plant_1] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Hydro Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_hydro_plant_2] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Hydro Plant", "City", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_hydro_plant_3] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Hydro Plant", "City", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_library] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Library", "City" - "OutputType", "Science", "Local" - } - -[effect_marketplace] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - "OutputType", "Gold", "Local" - } - -[effect_marketplace_1] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - "OutputType", "Luxury", "Local" - } - -; No population pollution until certain techs researched -[effect_pollu_pop_base] -type = "Pollu_Pop_Pct_2" -value = -100 - -[effect_pollu_pop_automobile] -type = "Pollu_Pop_Pct_2" -value = 25 -reqs = - { "type", "name", "range" - "Tech", "Automobile", "Player" - } - -[effect_pollu_pop_industrialization] -type = "Pollu_Pop_Pct_2" -value = 25 -reqs = - { "type", "name", "range" - "Tech", "Industrialization", "Player" - } - -[effect_pollu_pop_mass_production] -type = "Pollu_Pop_Pct_2" -value = 25 -reqs = - { "type", "name", "range" - "Tech", "Mass Production", "Player" - } - -[effect_pollu_pop_plastics] -type = "Pollu_Pop_Pct_2" -value = 25 -reqs = - { "type", "name", "range" - "Tech", "Plastics", "Player" - } - -[effect_mass_transit] -type = "Pollu_Pop_Pct" -value = -100 -reqs = - { "type", "name", "range" - "Building", "Mass Transit", "City" - } -; Increased citizen mobility and ticket revenues increase city base trade by +2 -[effect_mass_transit_1] -type = "Output_Add_Tile" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Mass Transit", "City" - "CityTile", "Center", "Local" - "OutputType", "Trade", "Local" - } - -[effect_mfg_plant] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Mfg. Plant", "City" - "OutputType", "Shield", "Local" - } - -[effect_nuclear_plant] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Nuclear Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_nuclear_plant_1] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Nuclear Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_nuclear_plant_2] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Nuclear Plant", "City", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_nuclear_plant_3] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Nuclear Plant", "City", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_offshore_platform] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "TerrainClass", "Oceanic", "Local" - "Building", "Offshore Platform", "City" - "OutputType", "Shield", "Local" - } - -;Having a Palace means having a city, the beginning of -;sedentary culture and loss of game-start move bonus. -[effect_sedentary_people_are_slow] -type = "Move_Bonus" -value = 3 -reqs = - { - "type", "name", "range", "present" - "Building", "Palace", "Player", FALSE - "UnitClass", "Land", "Local", TRUE - } -[effect_palace] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - "OutputType", "Trade", "Local" - } -[effect_palace_1] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - "OutputType", "shield", "local" - } -[effect_palace_2] -type = "Spy_Resistant" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - } -[effect_palace_2_sabotage] -type = "Building_Saboteur_Resistant" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - } -[effect_palace_3] -type = "Capital_City" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - } -[effect_palace_gov_center] -type = "Gov_Center" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - } -[effect_palace_5] -type = "Output_Bonus" -value = 75 -reqs = - { "type", "name", "range" - "Gov", "Despotism", "Player" - "Building", "Palace", "City" - "OutputType", "Shield", "Local" - } - -[effect_palace_6] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Gov", "Monarchy", "Player" - "Building", "Palace", "City" - "OutputType", "Shield", "Local" - } -[effect_palace_6a] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range" - "Gov", "Communism", "Player" - "Building", "Palace", "City" - "OutputType", "Shield", "Local" - } -[effect_palace_7] -type = "Make_Happy" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Palace", "City" - } -[effect_palace_fundamentalism] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range", "present", "quiet" - "Gov", "Fundamentalism", "Player", TRUE, TRUE - "Building", "Palace", "City", TRUE, FALSE - "OutputType", "Gold", "Local", TRUE, FALSE - } - -[effect_ecclesiastical_palace] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "OutputType", "Trade", "Local", TRUE - "Building", "Palace", "City", FALSE - } -[effect_ecclesiastical_palace_1] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "OutputType", "Shield", "local", TRUE - "Building", "Palace", "City", FALSE - } -[effect_ecclesiastical_palace_2] -type = "Spy_Resistant" -value = 50 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "Building", "Palace", "City", FALSE - } -[effect_ecclestiastical_palace_3] -type = "Make_Happy" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Ecclesiastical Palace", "City" - } -[effect_ecclesiastical_palace_4] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "UnitType", "Fanatics", "Local", TRUE - } -[effect_ecclesiastical_palace_gov_center] -type = "Gov_Center" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "Building", "Palace", "City", FALSE - } -[effect_ecclesiastical_palace_despotism] -type = "Output_Bonus" -value = 75 -reqs = - { "type", "name", "range", "present", "quiet" - "Gov", "Despotism", "Player", TRUE, TRUE - "Building", "Ecclesiastical Palace", "City", TRUE, FALSE - "OutputType", "Gold", "Local", TRUE, FALSE -; "Building", "Palace", "City", FALSE, FALSE - } -[effect_ecclesiastical_palace_monarchy] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range", "present", "quiet" - "Gov", "Monarchy", "Player", TRUE, TRUE - "Building", "Ecclesiastical Palace", "City", TRUE, FALSE - "OutputType", "Gold", "Local", TRUE, FALSE -; "Building", "Palace", "City", FALSE, FALSE - } -[effect_ecclesiastical_palace_fundamentalism] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range", "present", "quiet" - "Gov", "Fundamentalism", "Player", TRUE, TRUE - "Building", "Ecclesiastical Palace", "City", TRUE, FALSE - "OutputType", "Gold", "Local", TRUE, FALSE - ; "Building", "Palace", "City", FALSE, FALSE - } -[effect_ecclesiastical_palace_communism] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present", "quiet" - "Gov", "Communism", "Player", TRUE, TRUE - "Building", "Ecclesiastical Palace", "City", TRUE, FALSE - "OutputType", "Gold", "Local", TRUE, FALSE - ; "Building", "Palace", "City", FALSE, FALSE - } - -[effect_ecclesiastical_palace_culture] -type = "History" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Ecclesiastical Palace", "City", TRUE - "Building", "Palace", "City", FALSE - } -[effect_ecclesiastical_palace_2_sabotage] -type = "Building_Saboteur_Resistant" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Ecclesiastical Palace", "City" - } - -[effect_police_station] -type = "Make_Content_Mil" -value = 2 -reqs = - { "type", "name", "range", "present" - "Gov", "Republic", "Player", TRUE - "Building", "Police Station", "City", TRUE - "Building", "Women's Suffrage", "Player", FALSE - } -[effect_police_station_1] -type = "Make_Content_Mil" -value = 4 -reqs = - { "type", "name", "range", "present" - "Gov", "Democracy", "Player", TRUE - "Building", "Police Station", "City", TRUE - "Building", "Women's Suffrage", "Player", FALSE - } -[effect_police_station_vet_diplo] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "UnitFlag", "NoVeteran", "Local", FALSE - "UnitFlag", "Diplomat", "Local", TRUE - } -[effect_police_station_spy_resistant] -type = "Spy_Resistant" -value = 25 ; 25% of 50% = -12.5% 4/8-1/8 = 3/8 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - } -[effect_police_station_hostile_diplomat_0] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Steal Tech", "Local", TRUE - } -[effect_police_station_hostile_diplomat_1] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Steal Tech Escape Expected", "Local", TRUE - } -[effect_police_station_hostile_diplomat_2] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Targeted Steal Tech", "Local", TRUE - } -[effect_police_station_hostile_diplomat_3] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE - } -[effect_police_station_hostile_diplomat_4] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Sabotage City", "Local", TRUE - } -[effect_police_station_hostile_diplomat_5] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Sabotage City Escape", "Local", TRUE - } -[effect_police_station_hostile_diplomat_6] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Targeted Sabotage City", "Local", TRUE - } -[effect_police_station_hostile_diplomat_7] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Targeted Sabotage City Escape", "Local", TRUE - } -[effect_police_station_hostile_diplomat_8] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Steal Maps Escape", "Local", TRUE - } -[effect_police_station_hostile_diplomat_9] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Steal Maps", "Local", TRUE - } -[effect_police_station_hostile_diplomat_10] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Poison City Escape", "Local", TRUE - } -[effect_police_station_hostile_diplomat_11] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Incite City", "Local", TRUE - } -[effect_police_station_hostile_diplomat_12] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Police Station", "City", TRUE - "Action", "Incite City Escape", "Local", TRUE - } - -[effect_port_facility] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Port Facility", "City", TRUE - "UnitClass", "Sea", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_port_facility_a] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Port Facility", "City", TRUE - "UnitClass", "RiverShip", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_port_facility_b] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Port Facility", "City", TRUE - "UnitClass", "Submarine", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_port_facility_1] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Port Facility", "City" - "UnitClass", "Sea", "Local" - } -[effect_port_facility_1a] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Port Facility", "City" - "UnitClass", "RiverShip", "Local" - } -[effect_port_facility_1b] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Port Facility", "City" - "UnitClass", "Submarine", "Local" - } -[effect_port_facility_trireme] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Port Facility", "City", TRUE - "UnitClass", "Trireme", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_port_facility_trireme_1] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Port Facility", "City" - "UnitClass", "Trireme", "Local" - } - -[effect_power_plant] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Power Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Hydro Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_power_plant_1] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Power Plant", "City", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Hoover Dam", "Player", FALSE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Hydro Plant", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_recycling_center] -type = "Pollu_Prod_Pct" -value = -66 -reqs = - { "type", "name", "range", "present" - "Building", "Recycling Center", "City", TRUE -; A Solar Plant can give a stronger effect than a Recycling Center, in which -; case we want only the Solar Plant's effect (not the addition of the two). - "Building", "Solar Plant", "City", FALSE - } - -; Nasty special cases: where a Solar Plant is present but its effect is less -; than that of a Recycling Center, top up so that the net effect is that of the -; Recycling Center. -; (This would be so much easier if effects could be combined by functions -; other than addition...) - -; Factory and no Mfg. Plant: Solar Plant saves 50%, less than 66%; add 16% -[effect_recycling_center_1] -type = "Pollu_Prod_Pct" -value = -16 -reqs = - { "type", "name", "range", "present" - "Building", "Recycling Center", "City", TRUE - "Building", "Solar Plant", "City", TRUE - "Building", "Factory", "City", TRUE - "Building", "Mfg. Plant", "City", FALSE - } - -; Mfg. Plant and no Factory: Solar Plant saves 50%, less than 66%; add 16% -[effect_recycling_center_2] -type = "Pollu_Prod_Pct" -value = -16 -reqs = - { "type", "name", "range", "present" - "Building", "Recycling Center", "City", TRUE - "Building", "Solar Plant", "City", TRUE - "Building", "Mfg. Plant", "City", TRUE - "Building", "Factory", "City", FALSE - } - -; Neither Factory nor Mfg. Plant: Solar Plant saves 0%; add 66% -[effect_recycling_center_3] -type = "Pollu_Prod_Pct" -value = -66 -reqs = - { "type", "name", "range", "present" - "Building", "Recycling Center", "City", TRUE - "Building", "Solar Plant", "City", TRUE - "Building", "Factory", "City", FALSE - "Building", "Mfg. Plant", "City", FALSE - } - -; Raw materials generated from Recycling add +2 base shields to city production. -[effect_recycling_center_4] -type = "Output_Add_Tile" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Recycling Center", "City" - "CityTile", "Center", "Local" - "OutputType", "Shield", "Local" - } - - -[effect_research_lab] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Library", "City" - "Building", "Research Lab", "City" - "OutputType", "Science", "Local" - } - -[effect_research_lab_1] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "University", "City" - "Building", "Research Lab", "City" - "OutputType", "Science", "Local" - } - -[effect_sam_battery] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "SAM Battery", "City", TRUE - "UnitClass", "Air", "Local", TRUE - "UnitType", "Stealth Bomber", "Local", FALSE - } -[effect_sam_battery_1] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "SAM Battery", "City", TRUE - "UnitClass", "AirProtect", "Local", TRUE - "UnitType", "Stealth Fighter", "Local", FALSE - } -[effect_sam_battery_2] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "SAM Battery", "City" - "UnitClass", "AirPillage", "Local" - } -[effect_sam_battery_3] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "SAM Battery", "City" - "UnitClass", "Helicopter", "Local" - } -[effect_sam_battery_stealth_bomber] -type = "Defend_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "SAM Battery", "City", TRUE - "UnitType", "Stealth Bomber", "Local", TRUE - } -[effect_sam_battery_stealth_fighter] -type = "Defend_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "SAM Battery", "City", TRUE - "UnitType", "Stealth Fighter", "Local", TRUE - } - -[effect_sdi_defense] -type = "Nuke_Proof" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "SDI Defense", "City", TRUE - "DiplRel", "Foreign", "Local", TRUE - "DiplRel", "Team", "Local", FALSE - } - -[effect_sdi_defense_1] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "SDI Defense", "City" - "UnitClass", "Missile", "Local" - } - -[effect_sewer_system] -type = "Size_Unlimit" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Aqueduct", "City" - "Building", "Sewer System", "City" - } - -[effect_sewer_system_health] -type = "Health_Pct" -value = 30 -reqs = - { "type", "name", "range" - "Building", "Aqueduct", "City" - "Building", "Sewer System", "City" - } - -[effect_solar_plant] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range" - "Building", "Factory", "City" - "Building", "Solar Plant", "City" - "OutputType", "Shield", "Local" - } - -[effect_solar_plant_1] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range" - "Building", "Mfg. Plant", "City" - "Building", "Solar Plant", "City" - "OutputType", "Shield", "Local" - } - -[effect_solar_plant_2] -type = "Pollu_Prod_Pct" -value = -50 -reqs = - { "type", "name", "range" - "Building", "Factory", "City" - "Building", "Solar Plant", "City" - } - -[effect_solar_plant_3] -type = "Pollu_Prod_Pct" -value = -50 -reqs = - { "type", "name", "range" - "Building", "Mfg. Plant", "City" - "Building", "Solar Plant", "City" - } - -[effect_space_component] -type = "SS_Component" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Space Component", "City" - } - -[effect_space_module] -type = "SS_Module" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Space Module", "City" - } - -[effect_space_structural] -type = "SS_Structural" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Space Structural", "City" - } - -;Timeline is already way behind and too slow, REMOVE: -;[effect_plastics_slowdown] -;type = "Slow_Down_Timeline" -;value = 1 -;reqs = -; { "type", "name", "range", "survives" -; "Tech", "Plastics", "World", TRUE -; } - -;[effect_superconductor_slowdown] -;type = "Slow_Down_Timeline" -;value = 1 -;reqs = -; { "type", "name", "range", "survives" -; "Tech", "Superconductors", "World", TRUE -; } -;1 year per turn ensures spaceship travel time calibrated. -;this can be removed after game.info.spacerace bug of not changing -;timeline gets fixed in server. -[effect_spaceflight_slowdown] -type = "Turn_Years" -value = 1 -reqs = - { "type", "name", "range", "survives" - "Tech", "Space Flight", "World", TRUE - } - -[effect_stock_exchange] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Bank", "City" - "Building", "Stock Exchange", "City" - "OutputType", "Gold", "Local" - } - -[effect_stock_exchange_1] -type = "Output_Bonus" -value = 50 -reqs = - { "type", "name", "range" - "Building", "Bank", "City" - "Building", "Stock Exchange", "City" - "OutputType", "Luxury", "Local" - } - -[effect_super_highways] -type = "Output_Per_Tile" -value = 50 -reqs = - { "type", "name", "range" - "Extra", "Road", "Local" - "Building", "Super Highways", "City" - "OutputType", "Trade", "Local" - } - -; Super Highways increase logistical efficiency to -; get more use out of an airport in size 12+ city. -[effect_super_highways_airlift_facilitation] -type = "Airlift" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Super Highways", "City" - "Building", "Airport", "City" - "Building", "Sewer System", "City" - } - -[effect_mine] -type = "Mining_Pct" -value = 100 -reqs = - { "type", "name", "range" - "Extra", "Mine", "Local" - } - -[effect_oil_well] -type = "Mining_Pct" -value = 100 -reqs = - { "type", "name", "range" - "Extra", "Oil Well", "Local" - } - -[effect_irrigation] -type = "Irrigation_Pct" -value = 100 -reqs = - { "type", "name", "range" - "Extra", "Irrigation", "Local" - } -; Desert with river (and no Oasis) gets 1 extra food from irrigation (total 2) -; ("Nile floods" effect) -[effect_irrigation_2] -type = "Irrigation_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "Terrain", "Desert", "Local", TRUE - "Extra", "River", "Local", TRUE - "Extra", "Oasis", "Local", FALSE - "Extra", "Irrigation", "Local", TRUE - } -; ...same for city centers -[effect_irrigation_3] -type = "Irrigation_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "Terrain", "Desert", "Local", TRUE - "Extra", "River", "Local", TRUE - "Extra", "Oasis", "Local", FALSE - "CityTile", "Center", "Local", TRUE -; "Extra", "Irrigation", "Local", FALSE - "TerrainAlter", "CanIrrigate", "Local", TRUE - "Extra", "Mine", "Local", FALSE - "Extra", "Oil Well", "Local", FALSE - } - -[effect_irrigation_center] -type = "Irrigation_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "CityTile", "Center", "Local", TRUE - "Extra", "Irrigation", "Local", FALSE - "TerrainAlter", "CanIrrigate", "Local", TRUE - "Extra", "Mine", "Local", FALSE - "Extra", "Oil Well", "Local", FALSE - } - -[effect_supermarket] -type = "Output_Per_Tile" -value = 100 -reqs = - { "type", "name", "range" - "Extra", "Farmland", "Local" - "Building", "Supermarket", "City" - "OutputType", "Food", "Local" - } - -[effect_supermarket_center] -type = "Output_Per_Tile" -value = 50 -reqs = - { "type", "name", "range", "present" - "CityTile", "Center", "Local", TRUE - "Extra", "Farmland", "Local", FALSE - "TerrainAlter", "CanIrrigate", "Local", TRUE - "Building", "Supermarket", "City", TRUE - "OutputType", "Food", "Local", TRUE - "Extra", "Mine", "Local", FALSE - "Extra", "Oil Well", "Local", FALSE - } - -[effect_temple] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - } - -[effect_temple_1] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Tech", "Mysticism", "Player" - "Building", "Temple", "City" - } - -[effect_university] -type = "Output_Bonus" -value = 150 -reqs = - { "type", "name", "range" - "Building", "Library", "City" - "Building", "University", "City" - "OutputType", "Science", "Local" - } - -[effect_apollo_program] -type = "Enable_Space" -value = 1 -reqs = - { "type", "name", "range", "survives" - "Building", "Apollo Program", "Player", TRUE - } - -[effect_telegraph_border_vision] -type = "Border_Vision" -value = 1 -reqs = - { "type", "name", "range" - "Tech", "Electricity", "Player" - } - - ; Air+Sea+LandAirSea CLASS units REQUIRE PHYSICS so their BONUS is in their stats to AVOID more [effect_] entries. -[effect_physics_vision] -type = "Unit_Vision_Radius_Sq" -value = 4 -reqs = - { "type", "name", "range" - "Tech", "Physics", "Player" - "UnitClass", "Land", "Local" - } -[effect_physics_vision_1] -type = "Unit_Vision_Radius_Sq" -value = 4 -reqs = - { "type", "name", "range" - "Tech", "Physics", "Player" - "UnitClass", "LandNoKill", "Local" - } -[effect_physics_vision_2] -type = "Unit_Vision_Radius_Sq" -value = 4 -reqs = - { "type", "name", "range" - "Tech", "Physics", "Player" - "UnitClass", "Trireme", "Local" - } -[effect_physics_vision_3] -type = "Unit_Vision_Radius_Sq" -value = 4 -reqs = - { "type", "name", "range" - "Tech", "Physics", "Player" - "UnitClass", "RiverShip", "Local" - } - -[effect_satellite_vision] ;Vision benefit from satellite communication to land units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "Land", "Local" - } -[effect_satellite_vision_1] ;Vision benefit from satellite communication to land units (Marines) -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "LandAirSea", "Local" - } -[effect_satellite_vision_2] ;Vision benefit from satellite communication to sea units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "Sea", "Local" - } -[effect_satellite_vision_2a] ;Vision benefit from satellite communication to sea units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "Submarine", "Local" - } -[effect_satellite_vision_3] ;Vision benefit from satellite communication to sea units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "Air", "Local" - } -[effect_satellite_vision_3a] ;Vision benefit from satellite communication to sea units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "AirProtect", "Local" - } -[effect_satellite_vision_4] ;Vision benefit from satellite communication to cities -type = "City_Vision_Radius_Sq" -value = 36 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - } -[effect_radar_vision] -type = "City_Vision_Radius_Sq" -value = 50 ;7 cardinal, 5 diagonal -reqs = - { "type", "name", "range" - "Tech", "Radar", "Player" - "Building", "Radar Tower", "City" - } -;[effect_radar_vision2] -;type = "Unit_Vision_Radius_Sq" -;value = 16 -;reqs = -; { "type", "name", "range", "present" -; "Extra", "Airbase", "tile", TRUE -; "Tech", "Radar", "Player", TRUE -; "MaxUnitsOnTile", "0", "Local", FALSE ;occupied base -; } - -[effect_agoge_move_bonus_1] -type = "Move_Bonus" -value = 3 -reqs = - { "type", "name", "range", "present" - "Building", "Agōgē of Sparta", "Player", TRUE - "UnitFlag", "FootSoldier", "Local", TRUE - } -[effect_agoge_move_bonus_2] -type = "Move_Bonus" -value = 6 ; 3/9 + 6/9 = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Agōgē of Sparta", "City", TRUE - "UnitFlag", "FootSoldier", "Local", TRUE - } -[effect_agoge_phalanx] -type = "Attack_Bonus" -value = 50 -reqs = - { "type", "name", "range", "present" - "Building", "Agōgē of Sparta", "Player", TRUE - "UnitType", "Phalanx", "Local", TRUE - } -[effect_agoge_pikemen] -type = "Attack_Bonus" -value = 50 -reqs = - { "type", "name", "range", "present" - "Building", "Agōgē of Sparta", "Player", TRUE - "UnitType", "Pikemen", "Local", TRUE - } - -[effect_asmiths_trading_co] -type = "Upkeep_Free" -value = 1 -reqs = - { "type", "name", "range" - "Building", "A.Smith's Trading Co.", "Player" - } - -[effect_colossus] -type = "Output_Inc_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Colossus", "City" - "OutputType", "Trade", "Local" - } - -[effect_copernicus_observatory] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Copernicus' Observatory", "City" - "OutputType", "Science", "Local" - } - -[effect_cure_for_cancer] -type = "Make_Happy" -value = 2 - reqs = - { "type", "name", "range" - "Building", "Cure For Cancer", "World" - "Tech", "Genetic Engineering", "Player" - } - -; HACK: there's all kinds of nasty hard-coded stuff to this Wonder, so it had to be -; given a different name (Voyage of Darwin) to avoid potential messyness -[effect_darwins_voyage] -type = "Output_Inc_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Voyage of Darwin", "City" - "OutputType", "Trade", "Local" - } - -[effect_eiffel_tower] -type = "Unit_Upkeep_Free_Per_City" -value = 1 - reqs = - { "type", "name", "range" - "Building", "Eiffel Tower", "Player" - "OutputType", "Shield", "Local" - } - -[effect_supreme_court_corruption1] -type = "Output_Waste_Pct" -value = 60 - reqs = - { "type", "name", "range" - "Building", "Supreme Court", "Player" - "OutputType", "Trade", "Local" - } -[effect_supreme_court_corruption2] -type = "Output_Waste_Pct" -value = 60 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player", TRUE - "OutputType", "Shield", "local", TRUE - } -[effect_supreme_court_democracy] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - "Building", "Supreme Court", "Player" - } -[effect_supreme_court_incite_occupied] -type = "Incite_Cost_Pct" -value = 300 -reqs = - { "type", "name", "range", "present" - "Building", "Supreme Court", "Player", TRUE - "MaxUnitsOnTile", "0", "Local", FALSE - } -[effect_supreme_court_incite_empty] -type = "Incite_Cost_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - "Building", "Supreme Court", "Player", TRUE - } -[effect_supreme_court_upkeep] -type = "Unit_Upkeep_Free_Per_City" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Supreme Court", "Player" - "OutputType", "Shield", "Local" - } -; Removes penalties (Despotism/Anarchy) for tiles >3 output -[effect_supreme_court_tile_corruption] -type = "Output_Penalty_Tile" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Supreme Court", "Player" - } -; HOMELAND SECURITY EFFECTS -; ********************************************************** -[effect_homeland_security_spy_resistance] -type = "Spy_Resistant" -value = 25 ;25% reduction of 50% base chance is 12.5% bonus. 50%-12.5%=37.5% success rate - ; No protection= 1/2, HL = 3/8, CH+HL = 1/4, CH+HL+PS = 1/8 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - } -[effect_homeland_security_hostile_diplomat0] -type = "Action_Odds_Pct" -value = -25 ; 25% of 80% base rate = 20% - ; No protection = 4/5, HL = 3/5, CH+HL = 2/5, CH+HL+PS = 1/5 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Steal Tech", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_1] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Steal Tech Escape Expected", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_2] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Targeted Steal Tech", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_3] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_4] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Sabotage City", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_5] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Sabotage City Escape", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_6] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Targeted Sabotage City", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_7] -type = "Action_Odds_Pct" -value = -25 ;// -25*.8 = -20 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Targeted Sabotage City Escape", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_8] -type = "Action_Odds_Pct" -value = -25 ;40 minus 25%*80 = 20% -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Steal Maps Escape", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_9] -type = "Action_Odds_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Steal Maps", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_10] -type = "Action_Odds_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Poison City Escape", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_11] -type = "Action_Odds_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Incite City", "Local", TRUE - } -[effect_homeland_security_hostile_diplomat_12] -type = "Action_Odds_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Homeland Security", "City", TRUE - "Action", "Incite City Escape", "Local", TRUE - } - -;============================================================== -; GREAT Wall -;============================================================== -[effect_great_wall_0_original] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", TRUE - "UnitClass", "Land", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "UnitType", "Howitzer", "Local", FALSE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_0_assimilated] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", FALSE - "MinForeignPct", "19", "City", FALSE - "UnitClass", "Land", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "UnitType", "Howitzer", "Local", FALSE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_2_original] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "UnitType", "Howitzer", "Local", FALSE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_2_assimilated] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", FALSE - "MinForeignPct", "19", "City", FALSE - "UnitClass", "LandNoKill", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "UnitType", "Howitzer", "Local", FALSE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_3_original] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "UnitType", "Howitzer", "Local", FALSE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_3_assimilated] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", FALSE - "MinForeignPct", "19", "City", FALSE - "UnitClass", "LandAirSea", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "UnitType", "Howitzer", "Local", FALSE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_poploss_original] -type = "Unit_No_Lose_Pop" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", TRUE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_poploss_assimilated] -type = "Unit_No_Lose_Pop" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", FALSE - "MinForeignPct", "19", "City", FALSE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_visible_original] -type = "Visible_Walls" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", TRUE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_visible_assimilated] -type = "Visible_Walls" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", FALSE - "MinForeignPct", "19", "City", FALSE - "Tech", "Machine Tools", "World", FALSE - } -;============================================================== - -[effect_hanging_gardens] -type = "Make_Happy" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Hanging Gardens", "Player" - } -[effect_hanging_gardens_1] -type = "Output_Add_Tile" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Hanging Gardens", "City" - "CityTile", "Center", "Local" - "OutputType", "Luxury", "Local" - } - -[effect_hoover_dam] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Hoover Dam", "Player", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Solar Plant", "City", FALSE - } -[effect_hoover_dam_1] -type = "Output_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Hoover Dam", "Player", TRUE - "OutputType", "Shield", "Local", TRUE - "Building", "Solar Plant", "City", FALSE - } -[effect_hoover_dam_2] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Factory", "City", TRUE - "Building", "Hoover Dam", "Player", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } -[effect_hoover_dam_3] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Hoover Dam", "Player", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } - -[effect_isaac_newtons_college] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "University", "City" - "Building", "Isaac Newton's College", "Player" - "OutputType", "Science", "Local" - } - -[effect_jtids] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "JTIDS", "Player", TRUE - "UnitFlag", "FootSoldier", "Local", TRUE - } -[effect_jtids_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "JTIDS", "Player", TRUE - "UnitType", "Mech. Inf.", "Local", TRUE ; uses rule_name - } -[effect_jtids_2] -type = "Veteran_Combat" -value = 75 ; 87 57::35 26 26 26 -reqs = - { "type", "name", "range", "present" - "Building", "JTIDS", "Player", TRUE - "UnitFlag", "FootSoldier", "Local", TRUE - "UnitType", "Marines", "Local", FALSE - } -[effect_jtids_3] -type = "Veteran_Combat" -value = 60 ; 80 52::32 24 24 24 -reqs = - { "type", "name", "range", "present" - "Building", "JTIDS", "Player", TRUE - "UnitType", "Mech. Inf.", "Local", TRUE ; uses rule_name - } -[effect_jtids_4] -type = "Veteran_Combat" -value = 40 ;84 70::56 42 28 21 -reqs = - { "type", "name", "range", "present" - "Building", "JTIDS", "Player", TRUE - "UnitFlag", "FootSoldier", "Local", TRUE - "UnitType", "Marines", "Local", TRUE - } - -[effect_js_bachs_cathedral] -type = "Force_Content" -value = 2 -reqs = - { "type", "name", "range" - "Building", "J.S. Bach's Cathedral", "Player" - } - -[effect_king_richards_crusade] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "King Richard's Crusade", "City" - "OutputType", "Shield", "Local" - } -[effect_city_build_slots_kr] -type = "City_Build_Slots" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "King Richard's Crusade", "City", TRUE - } - -[effect_leonardos_workshop] -type = "Upgrade_Unit" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Leonardo's Workshop", "Player" - } - -[effect_genghis_khans_equestrian_school] -type = "Move_Bonus" -value = 9 -reqs = - { "type", "name", "range", "present" - "Building", "Genghis Khan's Equestrian School", "Player", TRUE - "UnitFlag", "Horse", "Local", TRUE - } -[effect_genghis_khans_equestrian_school2] -type = "Move_Bonus" -value = 9 -reqs = - { "type", "name", "range", "present" - "Building", "Genghis Khan's Equestrian School", "Player", TRUE - "UnitType", "Explorer", "Local", TRUE - } - -[effect_airplane_range_1] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Tech", "Radio", "Player" - "UnitType", "Airplane", "Local" - } -[effect_airplane_range_2] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Tech", "Advanced Flight", "Player" - "UnitType", "Airplane", "Local" - } -[effect_airplane_range_3] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Tech", "Radar", "Player" - "UnitType", "Airplane", "Local" - } -[effect_airplane_range_4] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Tech", "Rocketry", "Player" - "UnitType", "Airplane", "Local" - } -[effect_airplane_range_5] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitType", "Airplane", "Local" - } -[effect_airplane_range_6] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Tech", "Avionics", "Player" - "UnitType", "Airplane", "Local" - } - -[effect_rail_electricity] -type = "Move_Bonus" -value = 9 -reqs = - { "type", "name", "range" - "Tech", "Electricity", "Player" - "UnitClass", "LandRail", "Local" - } -[effect_rail_combustion] -type = "Move_Bonus" -value = 9 -reqs = - { "type", "name", "range" - "Tech", "Combustion", "Player" - "UnitClass", "LandRail", "Local" - } - -[effect_lighthouse] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Sea", "Local" - } -[effect_lighthouse_a] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Submarine", "Local" - } -[effect_lighthouse_1] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Trireme", "Local" - } -[effect_lighthouse_2] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "RiverShip", "Local" - } -[effect_lighthouse_3] -type = "Unit_Vision_Radius_Sq" -value = 6 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Sea", "Local" - } -[effect_lighthouse_3a] -type = "Unit_Vision_Radius_Sq" -value = 6 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Submarine", "Local" - } -[effect_lighthouse_4] -type = "Unit_Vision_Radius_Sq" -svalue = 6 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Trireme", "Local" - } -[effect_lighthouse_5] -type = "Unit_Vision_Radius_Sq" -svalue = 6 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "RiverShip", "Local" - } - -[effect_magellans_expedition] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Magellan's Expedition", "Player", TRUE - "UnitClass", "Sea", "Local", TRUE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_magellans_expedition_a] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Magellan's Expedition", "Player", TRUE - "UnitClass", "RiverShip", "Local", TRUE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_magellans_expedition_b] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Magellan's Expedition", "Player", TRUE - "UnitClass", "Submarine", "Local", TRUE - "UnitFlag", "NoVeteran", "Local", FALSE - } - -[effect_manhattan_project] -type = "Enable_Nuke" -value = 1 -reqs = - { "type", "name", "range", "survives" - "Building", "Manhattan Project", "World", TRUE - } - -[effect_marco_polos_embassy] -type = "Output_Bonus" -value = 40 -reqs = - { "type", "name", "range" - "Building", "Marco Polo's Embassy", "Player" - "OutputType", "Trade", "Local" - } - -[effect_michelangelos_chapel] -type = "Make_Content" -value = 3 -reqs = - { "type", "name", "range" - "Building", "Michelangelo's Chapel", "Player" - } -[effect_michelangelos_chapel_1] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Tech", "Theology", "Player" - "Building", "Michelangelo's Chapel", "Player" - } -[effect_michelangelos_chapel_2] -type = "Make_Content" -value = -1 -reqs = - { "type", "name", "range" - "Building", "Michelangelo's Chapel", "Player" - "Gov", "Communism", "Player" - } - -[effect_mausoleum_of_mausolos_1] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "Building", "Great Wall", "Player", FALSE - "Building", "Mausoleum of Mausolos", "Player", TRUE - } - -;Great Wall counts as City Walls in every city. -[effect_mausoleum_of_mausolos_1a] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Great Wall", "Player" - "Building", "Mausoleum of Mausolos", "Player" - } -[effect_mausoleum_of_mausolos_2] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Courthouse", "City", TRUE - "Building", "Mausoleum of Mausolos", "Player", TRUE - } -;Mausoleum respects that Supreme Court counts as extra Courthouse in every city. -[effect_mausoleum_of_mausolos_2a] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Supreme Court", "Player" - "Building", "Mausoleum of Mausolos", "Player" - } -[effect_mausoleum_of_mausolos_culture] -type = "History" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Mausoleum of Mausolos", "City" - } - -[effect_statue_of_zeus_content_republic] -type = "Make_Content_Mil" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Statue of Zeus", "Player", TRUE - "Gov", "Republic", "Player", TRUE - "Tech", "Tactics", "Player", FALSE - } -[effect_statue_of_zeus_content_democracy] -type = "Make_Content_Mil" -value = 2 -reqs = - { "type", "name", "range", "present" - "Building", "Statue of Zeus", "Player", TRUE - "Gov", "Democracy", "Player", TRUE - "Tech", "Tactics", "Player", FALSE - } -[effect_statue_of_zeus_1] -type = "Unit_Upkeep_Free_Per_City" -value = 4 -reqs = - { "type", "name", "range", "present" - "Building", "Statue of Zeus", "City", TRUE - "Tech", "Tactics", "Player", FALSE - "OutputType", "Shield", "Local", TRUE - } -[effect_statue_of_zeus_2] -type = "Make_Happy" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Statue of Zeus", "City" - } - -[effect_temple_of_artemis] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Luxury", "Local" - } -;Note: the city applies +1 to 0-shield city tiles on grass,swamp,hills,tundra -;Thus this bonus negates the condition of getting that +1 and needs a -;compensating +1 further below -[effect_temple_of_artemis_1] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Shield", "Local" - } -;-------- -;Give the city its extra shield if it was built on a 0-shield (grass/hills/swamp/tundra) -;tile or +1-shield resource (grass-shield,fur) -[effect_temple_of_artemis_1a] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Terrain", "Grassland", "Local" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Shield", "Local" - } -[effect_temple_of_artemis_1b] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range", "present" - "Terrain", "Hills", "Local", TRUE - "Extra", "Coal", "Local", FALSE ; only apply to 0 shield tile - "Extra", "Mine", "Local", FALSE ; only apply to 0 shield tile - "Building", "Temple", "City", TRUE - "Building", "Temple of Artemis", "Player", TRUE - "CityTile", "Center", "Local", TRUE - "OutputType", "Shield", "Local", TRUE - } -[effect_temple_of_artemis_1d] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range", "present" - "Terrain", "Swamp", "Local", TRUE - "Extra", "Peat", "Local", FALSE ; only apply to 0 shield tile - "Building", "Temple", "City", TRUE - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local", TRUE - "OutputType", "Shield", "Local", TRUE - } -[effect_temple_of_artemis_1e] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range", "present" - "Terrain", "Tundra", "Local", TRUE - "Extra", "Game", "Local", FALSE ; only apply to 0 shield tile - "Building", "Temple", "City", TRUE - "Building", "Temple of Artemis", "Player", TRUE - "CityTile", "Center", "Local", TRUE - "OutputType", "Shield", "Local", TRUE - } -;------ - -[effect_temple_of_artemis_2] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Gold", "Local" - } - -[effect_temple_of_artemis_3] -type = "Output_Add_Tile" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - "Building", "Temple of Artemis", "Player" - "CityTile", "Center", "Local" - "OutputType", "Science", "Local" - } - - -[effect_teslas_laboratory] -type = "Upgrade_Unit" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Tesla's Laboratory", "Player" - } -[effect_tesla_laboratory2] -type = "Upgrade_Price_Pct" -value = -20 -reqs = - { "type", "name", "range" - "Building", "Tesla's Laboratory", "Player" - } - -[effect_oracle] -type = "Make_Content" -value = 2 -reqs = - { "type", "name", "range" - "Building", "Temple", "City" - "Building", "Oracle", "Player" - } - -[effect_pyramids] -type = "Growth_Food" -value = 25 -reqs = - { "type", "name", "range" - "Building", "Pyramids", "Player" - } - -[effect_pyramids_1] -type = "Rapture_Grow" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Pyramids", "City" - } - -[effect_internet] -type = "Output_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Research Lab", "City" - "Building", "The Internet", "Player" - "OutputType", "Science", "Local" - } - -[effect_shakespeares_theatre] -type = "No_Unhappy" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Shakespeare's Theatre", "City" - } - -[effect_statue_of_liberty] -type = "Any_Government" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Statue of Liberty", "Player" - } - -[effect_statue_of_liberty_1] -type = "No_Anarchy" -value = 1 -reqs = - { "type", "name", "range" - "Building", "Statue of Liberty", "Player" - } - -[effect_sun_tzus_war_academy] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Sun Tzu's War Academy", "Player", TRUE - "UnitClass", "Land", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_sun_tzus_war_academy_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Sun Tzu's War Academy", "Player", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - } -[effect_sun_tzus_war_academy_2] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Sun Tzu's War Academy", "Player", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - } - -[effect_united_nations] -type = "Has_Senate" -value = 1 -reqs = - { "type", "name", "range" - "Building", "United Nations", "World" - } - -[effect_united_nations_1] -type = "Revolution_Unhappiness" -value = 2 -reqs = - { "type", "name", "range", "present" - "Building", "United Nations", "World", TRUE -; Without !present UN would make revolution less likely instead -; of enabling it with Democracy (value 2 -> 4 instead of 0 -> 2) - "Gov", "Democracy", "Player", FALSE - } - -[effect_womens_suffrage] -type = "Make_Content_Mil" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Republic", "Player" - "Building", "Women's Suffrage", "Player" - } - -[effect_womens_suffrage_1] -type = "Make_Content_Mil" -value = 4 -reqs = - { "type", "name", "range" - "Gov", "Democracy", "Player" - "Building", "Women's Suffrage", "Player" - } - -[effect_fanatics_fundamentalism] -type = "Fanatics" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_corruption_fundamentalism0] -type = "Output_Waste" -value = 2 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Trade", "Local" - } - -[effect_corruption_fundamentalism1] -type = "Output_Waste_By_Distance" -value = 200 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Trade", "Local" - } - -;Shield waste is not a proper feature of mp rulesets -;[effect_waste_fundamentalism0] -;type = "Output_Waste" -;value = 2 -;reqs = -; { "type", "name", "range" -; "Gov", "Fundamentalism", "Player" -; "OutputType", "Shield", "Local" -; } - -;[effect_waste_fundamentalism1] -;type = "Output_Waste_By_Distance" -;value = 100 -;reqs = -; { "type", "name", "range" -; "Gov", "Fundamentalism", "Player" -; "OutputType", "Shield", "Local" -; } - -[effect_fundamentalism_unit_upkeep] -type = "Upkeep_Factor" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Food", "Local" - } - -[effect_upkeep_free_units_fundamentalism] -type = "Unit_Upkeep_Free_Per_City" -value = 10 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "Shield", "Local" - } - -[effect_bad_sci_fundamentalism] -type = "Output_Bonus_2" -value = -50 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - "OutputType", "science", "local" - } - -[effect_tithes_fundamentalism] -type = "Happiness_To_Gold" -value = 1 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_sabotage_bonus_fundamentalism1] -type = "Action_Odds_Pct" -value = 13 ;// 13%*80% = 10.4% -reqs = - { "type", "name", "range", "present" - "Gov", "Fundamentalism", "Player", TRUE - "Action", "Sabotage City", "Local", TRUE - } -[effect_sabotage_bonus_fundamentalism2] -type = "Action_Odds_Pct" -value = 13 ;// 13%*80% = 10.4% -reqs = - { "type", "name", "range", "present" - "Gov", "Fundamentalism", "Player", TRUE - "Action", "Sabotage City Escape", "Local", TRUE - } -[effect_sabotage_bonus_fundamentalism3] -type = "Action_Odds_Pct" -value = 13 ;// 13%*80% = 10.4% (int rounds to 10%) -reqs = - { "type", "name", "range", "present" - "Gov", "Fundamentalism", "Player", TRUE - "Action", "Targeted Sabotage City", "Local", TRUE - } -[effect_sabotage_bonus_fundamentalism4] -type = "Action_Odds_Pct" -value = 13 ;// 13%*80% = 10.4% (int rounds to 10%) -reqs = - { "type", "name", "range", "present" - "Gov", "Fundamentalism", "Player", TRUE - "Action", "Targeted Sabotage City Escape", "Local", TRUE - } - -[effect_max_rates_fundamentalism] -type = "Max_Rates" -value = 80 -reqs = - { "type", "name", "range" - "Gov", "Fundamentalism", "Player" - } - -[effect_enviromentalism] -type = "Pollu_Prod_Pct" -value = -50 -reqs = - { "type", "name", "range" - "Tech", "Environmentalism", "Player" - } - -[effect_calendar_base] -type = "Turn_Years" -value = 100 - -; 100 - 50 = 50 -[effect_calendar_1] -type = "Turn_Years" -value = -50 -reqs = - { "type", "name", "range" - "MinYear", "0", "World" - } - -; 50 - 25 = 25 -[effect_calendar_2] -type = "Turn_Years" -value = -25 -reqs = - { "type", "name", "range" - "MinYear", "1000", "World" - } - -; 25 - 15 = 10 -[effect_calendar_3] -type = "Turn_Years" -value = -15 -reqs = - { "type", "name", "range" - "MinYear", "1800", "World" - } - -; 10 - 5 = 5 -[effect_calendar_4] -type = "Turn_Years" -value = -5 -reqs = - { "type", "name", "range" - "MinYear", "1900", "World" - } - -; 5 - 3 = 2 -[effect_calendar_5] -type = "Turn_Years" -value = -3 -reqs = - { "type", "name", "range" - "MinYear", "1950", "World" - } - -; 2 - 1 = 1 -[effect_calendar_6] -type = "Turn_Years" -value = -1 -reqs = - { "type", "name", "range" - "MinYear", "2012", "World" - } - -[effect_tech_cost_base] -type = "Tech_Cost_Factor" -value = 1 - -; Cities can always work tiles -[effect_tile_workable] -type = "Tile_Workable" -value = 1 -reqs = - { "type", "name", "range", "present" - "Terrain", "Inaccessible", "Local", FALSE - } - -; Each city has at least one slot to build units -[effect_city_build_slots_basic] -type = "City_Build_Slots" -value = 1 - -; Capital has two slots -[effect_city_build_slots_capital] -type = "City_Build_Slots" -value = 1 -reqs = - { "type", "name", "range", "present" - "Tech", "Conscription", "Player", TRUE - "Building", "Palace", "City", TRUE - } -[effect_city_build_slots_capital2] -type = "City_Build_Slots" -value = 1 -reqs = - { "type", "name", "range", "present" - "Tech", "Conscription", "Player", TRUE - "Building", "Ecclesiastical Palace", "City", TRUE - } -[effect_city_build_slots_factory] -type = "City_Build_Slots" -value = 1 -reqs = - { "type", "name", "range", "present" - "Tech", "Conscription", "Player", TRUE - "Building", "Factory", "City", TRUE - } -[effect_city_build_slots_mfg_plant] -type = "City_Build_Slots" -value = 1 -reqs = - { "type", "name", "range", "present" - "Tech", "Conscription", "Player", TRUE - "Building", "Mfg. Plant", "City", TRUE - } - -[effect_city_image_1] -type = "City_Image" -value = 1 -reqs = - { "type", "name", "range" - "MinSize", "4", "City" - } - -[effect_city_image_2] -type = "City_Image" -value = 1 -reqs = - { "type", "name", "range" - "MinSize", "8", "City" - } - -[effect_city_image_3] -type = "City_Image" -value = 1 -reqs = - { "type", "name", "range" - "MinSize", "12", "City" - } - -[effect_city_image_4] -type = "City_Image" -value = 1 -reqs = - { "type", "name", "range" - "MinSize", "16", "City" - } - -[effect_pollution] -type = "Output_Tile_Punish_Pct" -value = 50 -reqs = - { "type", "name", "range", "present" - "Extra", "Pollution", "Local", TRUE - "Extra", "Fallout", "Local", FALSE - } - -[effect_fallout] -type = "Output_Tile_Punish_Pct" -value = 50 -reqs = - { "type", "name", "range", "present" - "Extra", "Fallout", "Local", TRUE - "Extra", "Pollution", "Local", FALSE - } - -; This would bring back bridges in cities without Bridge Building, -; but not get the trade bonus until BB discovered. Not needed now -; since Quay was added. -; collect trade from them until Bridge Building. -;[effect_bridge_without_bridge_building] -;type = "Output_Add_Tile" -;value = -1 -;reqs = -; { "type", "name", "range", "present" -; "Tech", "Bridge Building", "Player", FALSE -; "CityTile", "Center", "Local", TRUE -; "Extra", "River", "Local", TRUE -; "OutputType","Trade", "Local", TRUE -; -; ;Don't subtract a non-existent bonus. -; "Terrain", "Glacier", "Local", FALSE -; "Terrain", "Forest", "Local", FALSE -; "Terrain", "Hills", "Local", FALSE -; "Terrain", "Jungle", "Local", FALSE -; "Terrain", "Mountains", "Local", FALSE -; "Terrain", "Swamp", "Local", FALSE -; } - -[effect_pollution_fallout] -type = "Output_Tile_Punish_Pct" -value = 75 -reqs = - { "type", "name", "range" - "Extra", "Fallout", "Local" - "Extra", "Pollution", "Local" - } - -; **** Action Odds for Hostile Diplomatic Actions ******* -;******************************************************** -[effect_reduced_chance_steal_maps_escape] -type = "Action_Odds_Pct" -value = -32 ;80 minus 31%*80 = 55% -reqs = - { "type", "name", "range", "present" - "Action", "Steal Maps Escape", "Local", TRUE - } -[effect_reduced_chance_steal_maps] -type = "Action_Odds_Pct" -value = -13 ;80 minus 13%*80 = 70% -reqs = - { "type", "name", "range", "present" - "Action", "Steal Maps", "Local", TRUE - } -[effect_reduced_targeted_sabotage_city] -type = "Action_Odds_Pct" -value = -32 ;80 minus 31%*80 = 55% -reqs = - { "type", "name", "range", "present" - "Action", "Targeted Sabotage City Escape", "Local", TRUE - } -[effect_reduced_poison_city_escape] -type = "Action_Odds_Pct" -value = -13 ;80 minus 13%*80 = 70% -reqs = - { "type", "name", "range", "present" - "Action", "Poison City Escape", "Local", TRUE - } -;********************************************************* -; Bribe and Incite Costs ********************************* -[effect_unit_bribe_cost_settlers] -type = "Unit_Bribe_Cost_Pct" -value = -50 -reqs = - { "type", "name", "range" - "UnitFlag", "NonMil", "Local" - } -;********************************************************* - - -;LOSING MOVES FROM ILLEGAL ACTION NEVER MADE SENSE. JUST FORBID IT AND LET THEM PICK A LEGAL ACTION. -;[effect_illegal_action_move_cost_base] -;type = "Illegal_Action_Move_Cost" -;value = 0 -;reqs = -; { "type", "name", "range", "present" -; "Action", "Found City", "Local", FALSE -; "Action", "Join City", "Local", FALSE -; } - -;CASUS BELLI INCIDENTS -;******************************************************** -[effect_incident_success_pillage] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Pillage", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } - -[effect_incident_caught_steal_maps1] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Maps Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_steal_maps1] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Maps Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_steal_maps2] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Maps", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_steal_maps2] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Maps", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_steal_tech] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Tech", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_steal_tech] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Tech", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_steal_tech_esc] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Tech Escape Expected", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_steal_tech_esc] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Steal Tech Escape Expected", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_tgt_steal_tech] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_tgt_steal_tech] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_bribe_unit] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Bribe Unit", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_capture_unit] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Capture Units", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_sabotage_unit] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Sabotage Unit Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_sabotage_unit] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Sabotage Unit Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_incite] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Incite City", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_incite] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Incite City", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_incite_esc] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Incite City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_incite_esc] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Incite City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_poison] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Poison City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_poison] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Poison City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_sabotage_city] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Sabotage City", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_sabotage_city] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Sabotage City", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_sabotage_city_esc] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Sabotage City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_sabotage_city_esc] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Sabotage City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_tgt_sabotage_city] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Targeted Sabotage City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_tgt_sabotage_city] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Targeted Sabotage City Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_sabotage_city_production] -type = "Casus_Belli_Success" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Sabotage City Production Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_caught_sabotage_city_production] -type = "Casus_Belli_Caught" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Sabotage City Production Escape", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -[effect_incident_success_explode_nuke] -type = "Casus_Belli_Success" -value = 1000 -reqs = - { "type", "name", "range", "present" - "Action", "Explode Nuclear", "Local", TRUE - } -;******************************************************************** - -; Double (+100%) buy cost for Great Wonders -[effect_great_wonder_buy_cost] -type = "Building_Buy_Cost_Pct" -value = 100 -reqs = - { "type", "name", "range" - "BuildingGenus", "GreatWonder", "Local" - } - -; Double buy cost for Small Wonders except Palaces -[effect_small_wonder_buy_cost] -type = "Building_Buy_Cost_Pct" -value = 100 -reqs = - { "type", "name", "range", "present" - "BuildingGenus", "SmallWonder", "Local", TRUE - "Building", "Palace", "Local", FALSE - "Building", "Ecclesiastical Palace", "Local", FALSE - } - -;******************************************************************** MOVE COSTS -[effect_action_success_move_cost_embassy] -type = "Action_Success_Actor_Move_Cost" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Establish Embassy", "Local", TRUE - } - -[effect_action_success_move_cost_investigate] -type = "Action_Success_Actor_Move_Cost" -value = 1 -reqs = - { "type", "name", "range", "present" - "Action", "Investigate City", "Local", TRUE - } - -[effect_action_success_move_cost_capture] -type = "Action_Success_Actor_Move_Cost" -value = 9 -reqs = - { "type", "name", "range", "present" - "Action", "Capture Units", "Local", TRUE - } - -[effect_action_success_move_cost_expel] -type = "Action_Success_Actor_Move_Cost" -value = 9 -reqs = - { "type", "name", "range", "present" - "Action", "Expel Unit", "Local", TRUE - } - -[effect_action_success_move_cost_bombard] -type = "Action_Success_Actor_Move_Cost" -value = 65535 -reqs = - { "type", "name", "range", "present" - "Action", "Bombard", "Local", TRUE - } - -;Expelled units lose all move points. -[effect_action_success_move_cost_expelled] -type = "Action_Success_Target_Move_Cost" -value = 65535 -reqs = - { "type", "name", "range", "present" - "Action", "Expel Unit", "Local", TRUE - } - -;******************************************************************** - - -; The Well-Digger can move 3 before you know Pottery or Alphabet. -[effect_welldigger_movement] -type = "Move_Bonus" -value = -27 -reqs = - { - "type", "name", "range", "present" - "UnitFlag", "Well-Digger", "Local", TRUE - "Tech", "Alphabet", "Player", TRUE - } -[effect_welldigger_movement_1] -type = "Move_Bonus" -value = -27 -reqs = - { - "type", "name", "range", "present" - "UnitFlag", "Well-Digger", "Local", TRUE - "Tech", "Pottery", "Player", TRUE - } - -;Can't give orders to Proletarians unless communist. -[effect_proletarian_movement] -type = "Move_Bonus" -value = -18 -reqs = - { - "type", "name", "range", "present" - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player", FALSE - } - -;5 shield discount Riflemen -[effect_communist_riflemen] -type = "Unit_Build_Cost_Pct" -value = -12 -reqs = - { - "type", "name", "range", "present" - "UnitType", "Riflemen", "Local", TRUE - "Gov", "Communism", "Player", TRUE - } - -;10 shield discount "Sturmovik Effect". -[effect_communist_dive_bombers] -type = "Unit_Build_Cost_Pct" -value = -16 -reqs = - { - "type", "name", "range", "present" - "UnitType", "Dive Bomber", "Local", TRUE - "Gov", "Communism", "Player", TRUE - } - -;Labor Union changes upkeep of foot units and mech.inf to gold -[effect_labor_union_upkeep] -type = "Shield2Gold_Factor" -value = 100 -reqs = - { - "type", "name", "range", "present" - "Tech", "Labor Union", "Player", TRUE - } diff --git a/freeciv/freeciv/data/mp2-brava2/nations.ruleset b/freeciv/freeciv/data/mp2-brava2/nations.ruleset deleted file mode 100644 index 85937b425..000000000 --- a/freeciv/freeciv/data/mp2-brava2/nations.ruleset +++ /dev/null @@ -1,62 +0,0 @@ - -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -[datafile] -description="Avant-garde nations data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -; This section contains meta information for freeciv-ruledit to recreate the ruleset -; file in a form wanted. These have no in-game effect whatsoever -[ruledit] - -; Nationlist to add include statement for. If this entry is omitted, all the nations -; will be saved to nations.ruleset itself. -nationlist = "default/nationlist.ruleset" - -; List of nations to embed to main nations.ruleset despite separate nationlist -; being used for other nations. -embedded_nations = "barbarian", "pirate" - -[compatibility] -; Initial government for all the nations that do not -; have it explicitly defined -default_government = "Despotism" - -[default_traits] -; Default values for the AI traits. These are used if nation specific -; value for some trait has not been used. If these default too are -; not defined, the ultimate default is 50. -; _min and _max give the range from which the trait value -; is randomly chosen for a given AI player unless 'traitdistribution' -; server setting is 'FIXED' -; _default is the exaxt trait value used when 'traitdistribution' -; is 'FIXED'. If _default has not been given, it's set to the -; midpoint between _min and _max. - -; Value of trait "expansionist" defines how much AI wants to settle new territory. -expansionist_min = 30 -expansionist_max = 90 -expansionist_default = 50 - -; Value of trait "trader" defines how much AI wants to establish trade routes. -trader_min = 30 -trader_max = 90 -trader_default = 50 - -; Value of trait "aggressive" defines how easily AI declares war. -aggressive_min = 30 -aggressive_max = 90 -aggressive_default = 50 - -; Please keep [ruledit] section in sync with these includes -*include "default/nationlist.ruleset" -; This ruleset uses model of two separate barbarian nations -*include "nation/barbarian.ruleset" -*include "nation/pirate.ruleset" diff --git a/freeciv/freeciv/data/mp2-brava2/parser.lua b/freeciv/freeciv/data/mp2-brava2/parser.lua deleted file mode 100644 index ea4bf8c53..000000000 --- a/freeciv/freeciv/data/mp2-brava2/parser.lua +++ /dev/null @@ -1,13 +0,0 @@ --- Freeciv - Copyright (C) 2007 - The Freeciv Project --- This program is free software; you can redistribute it and/or modify --- it under the terms of the GNU General Public License as published by --- the Free Software Foundation; either version 2, or (at your option) --- any later version. --- --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU General Public License for more details. - --- This file is for lua-functionality for parsing luadata.txt --- of this ruleset. diff --git a/freeciv/freeciv/data/mp2-brava2/styles.ruleset b/freeciv/freeciv/data/mp2-brava2/styles.ruleset deleted file mode 100644 index cc690357f..000000000 --- a/freeciv/freeciv/data/mp2-brava2/styles.ruleset +++ /dev/null @@ -1,265 +0,0 @@ - -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -[datafile] -description="Nation theme data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -; /* <-- avoid gettext warnings -; -; Nation styles -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; if -; not present, "name" is used for this purpose too. Since -; the name used in savegames must not change, if you want -; to rename an item after a ruleset has been released, you -; should set "rule_name" to the original value of "name". -; -; */ <-- avoid gettext warnings - -[style_european] -name = _("?style:European") - -[style_classical] -name = _("?style:Classical") - -[style_tropical] -name = _("?style:Tropical") - -[style_asian] -name = _("?style:Asian") - -[style_babylonian] -name = _("?style:Babylonian") - -[style_celtic] -name = _("?style:Celtic") - -; /* <-- avoid gettext warnings -; -; City styles define the way cities are drawn -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; if -; not present, "name" is used for this purpose too. Since -; the name used in savegames must not change, if you want -; to rename an item after a ruleset has been released, you -; should set "rule_name" to the original value of "name". -; graphic = group of tiles to use, see cities spec for -; more info on city tiles -; citizens_graphic = group of citizens tiles to use, see citizens/small -; spec for more info on citizens tiles -; FIXME: this and _alt not currently used! -; reqs = requirements for this city style (see README.effects) -; -; */ <-- avoid gettext warnings - -[citystyle_european] -name = _("?citystyle:European") -graphic = "city.european" -graphic_alt = "-" -citizens_graphic = "ancient" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "Style", "European", "Player" - } - -[citystyle_classical] -name = _("?citystyle:Classical") -graphic = "city.classical" -graphic_alt = "-" -citizens_graphic = "ancient" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "Style", "Classical", "Player" - } - -[citystyle_tropical] -name = _("?citystyle:Tropical") -graphic = "city.tropical" -graphic_alt = "city.european" -citizens_graphic = "ancient" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "Style", "Tropical", "Player" - } - -[citystyle_asian] -name = _("?citystyle:Asian") -graphic = "city.asian" -graphic_alt = "city.classical" -citizens_graphic = "ancient" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "Style", "Asian", "Player" - } - -[citystyle_babylonian] -name = _("?citystyle:Babylonian") -graphic = "city.babylonian" -graphic_alt = "city.classical" -citizens_graphic = "ancient" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "Style", "Babylonian", "Player" - } - -[citystyle_celtic] -name = _("?citystyle:Celtic") -graphic = "city.celtic" -graphic_alt = "city.european" -citizens_graphic = "ancient" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "Style", "Celtic", "Player" - } - -[citystyle_industrial] -name = _("?citystyle:Industrial") -graphic = "city.industrial" -graphic_alt = "-" -citizens_graphic = "industrial" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "tech", "Railroad", "Player" - } - -[citystyle_electric] -name = _("?citystyle:ElectricAge") -graphic = "city.electricage" -graphic_alt = "city.modern" -citizens_graphic = "electricage" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "tech", "Automobile", "Player" - } - -[citystyle_modern] -name = _("?citystyle:Modern") -graphic = "city.modern" -graphic_alt = "-" -citizens_graphic = "modern" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "tech", "Rocketry", "Player" - } - -[citystyle_postmodern] -name = _("?citystyle:PostModern") -graphic = "city.postmodern" -graphic_alt = "-" -citizens_graphic = "postmodern" -citizens_graphic_alt = "generic" -reqs = { "type", "name", "range" - "tech", "Superconductors", "Player" - } - -; /* <-- avoid gettext warnings -; -; Music styles -; -; Order is important. The last one for which activation requirements -; are fulfilled is the one that plays. -; -; music_peaceful = Music to play when nation in peaceful mood -; music_combat = Music to play when nation in combat mood -; reqs = requirements to activate the style (see effects.ruleset -; and README.effects for help on requirements) -; -; */ <-- avoid gettext warnings - -[musicstyle_european] -music_peaceful = "music_european_peace" -music_combat = "music_european_combat" -reqs = - { "type", "name", "range" - "Style", "European", "Player" - } - -[musicstyle_classical] -music_peaceful = "music_classical_peace" -music_combat = "music_classical_combat" -reqs = - { "type", "name", "range" - "Style", "Classical", "Player" - } - -[musicstyle_tropical] -music_peaceful = "music_tropical_peace" -music_combat = "music_tropical_combat" -reqs = - { "type", "name", "range" - "Style", "Tropical", "Player" - } - -[musicstyle_asian] -music_peaceful = "music_asian_peace" -music_combat = "music_asian_combat" -reqs = - { "type", "name", "range" - "Style", "Asian", "Player" - } - -[musicstyle_babylonian] -music_peaceful = "music_babylonian_peace" -music_combat = "music_babylonian_combat" -reqs = - { "type", "name", "range" - "Style", "Babylonian", "Player" - } - -[musicstyle_celtic] -music_peaceful = "music_celtic_peace" -music_combat = "music_celtic_combat" -reqs = - { "type", "name", "range" - "Style", "Celtic", "Player" - } - -[musicstyle_renaissance] -music_peaceful = "music_renaissance_peace" -music_combat = "music_renaissance_combat" -reqs = - { "type", "name", "range" - "Tech", "University", "Player" - } - -[musicstyle_industrial] -music_peaceful = "music_industrial_peace" -music_combat = "music_industrial_combat" -reqs = - { "type", "name", "range" - "Tech", "Railroad", "Player" - } - -[musicstyle_electricage] -music_peaceful = "music_electricage_peace" -music_combat = "music_electricage_combat" -reqs = - { "type", "name", "range" - "Tech", "Automobile", "Player" - } - -[musicstyle_modern] -music_peaceful = "music_modern_peace" -music_combat = "music_modern_combat" -reqs = - { "type", "name", "range" - "Tech", "Rocketry", "Player" - } - -[musicstyle_postmodern] -music_peaceful = "music_postmodern_peace" -music_combat = "music_postmodern_combat" -reqs = - { "type", "name", "range" - "Tech", "Superconductors", "Player" - } diff --git a/freeciv/freeciv/data/mp2-brava2/techs.ruleset b/freeciv/freeciv/data/mp2-brava2/techs.ruleset deleted file mode 100644 index 86d8e127e..000000000 --- a/freeciv/freeciv/data/mp2-brava2/techs.ruleset +++ /dev/null @@ -1,980 +0,0 @@ - -; Modifying this file: -; You should not modify this file except to make bugfixes or -; for other "maintenance". If you want to make custom changes, -; you should create a new datadir subdirectory and copy this file -; into that directory, and then modify that copy. Then use the -; command "rulesetdir " in the server to have freeciv -; use your new customized file. - -[datafile] -description="Avant-garde technology data for Freeciv" -options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" -format_version=20 - -[control] -; Names for custom tech flags. There can be up to 8 of these. -; name = rule name; In some circumstances user may see this -; as part of some sentences, so try to make it descriptive -; and sensible. -; helptxt = displayed in the help for advances with this flag (optional) -;flags = -; { "name", "helptxt" -; } - -; /* <-- avoid gettext warnings -; -; Tech classes: -; -; First one is the default one. -; If there is none, tech classes feature is disabled -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets -; etc; if not present, "name" is used for this -; purpose too. Since the name used in savegames must -; not change, if you want to rename an item after a -; ruleset has been released, you should set -; "rule_name" to the original value of "name". -; cost_pct = how much techs of the class cost compared -; to normal. Default is 100%. -; -; */ <-- avoid gettext warnings - -;[techclass_default] -;name = - -; /* <-- avoid gettext warnings -; -; Below: The individual advances, one per section. -; The number can be variable, up to 250. -; -; The actual tag used (the * in [advance_*]) does not matter, except -; it must be unique within this file, and it may be used in debug -; output when reading this file. -; -; Notes: -; -; name = translatable name as seen by user -; rule_name = (optional) internal name for savegames, rulesets etc; if -; not present, "name" is used for this purpose too. Since -; the name used in savegames must not change, if you want -; to rename an item after a ruleset has been released, you -; should set "rule_name" to the original value of "name". -; class = tech class this tech belongs to, if they have been defined. -; Default is first one defined above. -; req1, req2 = advances required before researching this one -; root_req = tech required before acquiring this tech, by any means. -; All techs with any direct or indirect dependency on this -; one will *also* have this root_req, as well as their own -; and any others they inherit. -; Giving "None" explicitly here prevents a tech from -; inheriting root_reqs in this way, and stops root_req -; inheritance through that tech. -; Specifying a tech's root_req as itself means that the tech -; can only be acquired by special means (nation's init_techs, -; scripting, etc). -; research_reqs = requirements before researching this one. Can have non -; tech requirements because it is a requirement vector. -; See doc/README.effects to learn more about requirement -; vectors. -; Requireing a tech here in stead of in req1, req2 or -; root_req is not supported yet. -; Requirements that may become fulfilled during the game -; when they weren't at the start of the game is not -; supported yet. -; flags = special flag strings -; graphic = icon for technology -; graphic_alt = alternate icon -; helptext = optional help text string (set units ruleset for examples) -; bonus_message = text seen when a player is the first to discover -; an bonus tech. Must contain '%s' to mark place of the tech -; gained. -; cost = if tech_cost_style is set to "Classic+" or "Experimental+", -; this field is read for information on how much a tech -; costs. -; -; Special values for req1 and req2 are "None" (first section below) -; and "Never" (never available). If only one tech is required, -; it should be listed as req1. -; -; As well as custom flags defined above, the following flag strings are -; possible: -; -; "Bonus_Tech" = player gets extra tech if reached first -; "Bridge" = "Settler" unit types can build roads with -; "RequiresBridge" flag over roads with -; "PreventsOtherRoads" flag (rivers) -; "Build_Airborne" = from now on can build air units (for use by AI) -; "Claim_Ocean" = Player claims ocean tiles even if they are not -; adjacent to border source -; "Claim_Ocean_Limited" = Oceanic border sources claim ocean tiles even if -; they are not adjacent to border source -; -; */ <-- avoid gettext warnings - -[advance_advanced_flight] -name = _("Advanced Flight") -req1 = "Radio" -req2 = "Machine Tools" -flags = "" -graphic = "a.advanced_flight" -graphic_alt = "-" -cost = 5430 - -[advance_alphabet] -name = _("Alphabet") -req1 = "None" -req2 = "None" -flags = "" -graphic = "a.alphabet" -graphic_alt = "-" -cost = 24 -helptext = _("Obsoletes Boat.") - -[advance_amphibious_warfare] -name = _("Amphibious Warfare") -req1 = "Navigation" -req2 = "Tactics" -flags = "" -graphic = "a.amphibious_warfare" -graphic_alt = "-" -cost = 3280 - -[advance_astronomy] -name = _("Astronomy") -req1 = "Mysticism" -req2 = "Mathematics" -flags = "" -graphic = "a.astronomy" -graphic_alt = "-" -cost = 146 - -[advance_atomic_theory] -name = _("Atomic Theory") -req1 = "Theory of Gravity" -req2 = "Physics" -flags = "" -graphic = "a.atomic_theory" -graphic_alt = "-" -cost = 1080 - -[advance_automobile] -name = _("Automobile") -req1 = "Combustion" -req2 = "Steel" -graphic = "a.automobile" -graphic_alt = "-" -helptext = _("Obsoletes Leonardos Workshop, Colossus. +25% population pollution.") -cost = 4230 - -[advance_avionics] -name = _("Avionics") -req1 = "Computers" -req2 = "Rocketry" -flags = "" -graphic = "a.avionics" -graphic_alt = "-" -helptext = _("Obsoletes Dive Bomber, prior Fighters") -cost = 7250 - -[advance_banking] -name = _("Banking") -req1 = "Trade" -req2 = "The Republic" -flags = "" -graphic = "a.banking" -graphic_alt = "-" -helptext = _("Prevents Philosophy from awarding bonus tech.") -cost = 364 - -[advance_bridge_building] -name = _("Bridge Building") -req1 = "Iron Working" -req2 = "Construction" -flags = "Bridge" -graphic = "a.bridge_building" -graphic_alt = "-" -helptext = _("Allows roads on rivers.") - -[advance_bronze_working] -name = _("Bronze Working") -req1 = "None" -req2 = "None" -flags = "" -graphic = "a.bronze_working" -graphic_alt = "-" -cost = 24 - -[advance_ceremonial_burial] -name = _("Ceremonial Burial") -req1 = "None" -req2 = "None" -flags = "" -graphic = "a.ceremonial_burial" -graphic_alt = "-" -cost = 24 - -[advance_chemistry] -name = _("Chemistry") -req1 = "University" -req2 = "Medicine" -flags = "" -graphic = "a.chemistry" -graphic_alt = "-" -cost = 800 - -[advance_chivalry] -name = _("Chivalry") -req1 = "Feudalism" -req2 = "Horseback Riding" -flags = "" -graphic = "a.chivalry" -graphic_alt = "-" -helptext = _("Obsoletes Horsemen, Chariots. Does not block Philosophy bonus.") -cost = 226 - -[advance_code_of_laws] -name = _("Code of Laws") -req1 = "Alphabet" -req2 = "None" -flags = "" -graphic = "a.code_of_laws" -graphic_alt = "-" - -[advance_combined_arms] -name = _("Combined Arms") -req1 = "Mobile Warfare" -req2 = "Advanced Flight" -flags = "" -graphic = "a.combined_arms" -graphic_alt = "-" -cost = 5650 - -[advance_combustion] -name = _("Combustion") -req1 = "Refining" -req2 = "Explosives" -flags = "" -graphic = "a.combustion" -graphic_alt = "-" -helptext = _("+1 move for Trains.") -cost = 3810 - -[advance_communism] -name = _("Communism") -req1 = "Philosophy" -req2 = "Industrialization" -flags = "" -graphic = "a.communism" -graphic_alt = "-" -helptext = _("Allows government Communism.") - -[advance_computers] -name = _("Computers") -req1 = "Mass Production" -req2 = "Miniaturization" -flags = "" -graphic = "a.computers" -graphic_alt = "-" -helptext = _("Obsoletes Temple of Artemis.") -cost = 5650 - -[advance_conscription] -name = _("Conscription") -req1 = "Democracy" -req2 = "Metallurgy" -flags = "" -graphic = "a.conscription" -graphic_alt = "-" -helptext = _("Obsoletes Musketeers. Capable cities can make extra units per turn.") -cost = 1890 - -[advance_construction] -name = _("Construction") -req1 = "Masonry" -req2 = "Currency" -flags = "" -graphic = "a.construction" -graphic_alt = "-" -helptext = _("Allows Fortresses, Oil Wells.") - -[advance_currency] -name = _("Currency") -req1 = "Bronze Working" -req2 = "None" -flags = "" -graphic = "a.currency" -graphic_alt = "-" -helptext = _("Boats can build Wonders.") - -[advance_democracy] -name = _("Democracy") -req1 = "Banking" -req2 = "Invention" -flags = "" -graphic = "a.democracy" -graphic_alt = "-" -helptext = _("Allows government Democracy.") -cost = 875 - -[advance_economics] -name = _("Economics") -req1 = "Banking" -req2 = "University" -flags = "" -graphic = "a.economics" -graphic_alt = "-" -cost = 875 - -[advance_electricity] -name = _("Electricity") -req1 = "Metallurgy" -req2 = "Magnetism" -flags = "" -graphic = "a.electricity" -graphic_alt = "-" -helptext = _("Obsoletes Ironclad. +1 Effect for Amphitheaters. +1 move for Trains.") -cost = 2220 - -[advance_electronics] -name = _("Electronics") -req1 = "The Corporation" -req2 = "Electricity" -flags = "" -graphic = "a.electronics" -graphic_alt = "-" -cost = 3630 - -[advance_engineering] -name = _("Engineering") -req1 = "The Wheel" -req2 = "Construction" -flags = "" -graphic = "a.engineering" -graphic_alt = "-" -helptext = _("Allows Canals and Naval Bases.") - -[advance_environmentalism] -name = _("Environmentalism") -req1 = "Recycling" -req2 = "Space Flight" -flags = "" -graphic = "a.environmentalism" -graphic_alt = "-" -helptext = _("-50% Pollution in all cities.") -cost = 8040 - -[advance_espionage] -name = _("Espionage") -req1 = "Communism" -req2 = "Democracy" -flags = "" -graphic = "a.espionage" -graphic_alt = "-" -helptext = _("Obsoletes Diplomat.") -cost = 2900 - -[advance_explosives] -name = _("Explosives") -req1 = "Gunpowder" -req2 = "Chemistry" -flags = "" -graphic = "a.explosives" -graphic_alt = "-" -helptext = _("Obsoletes Workers.") -cost = 1560 - -[advance_feudalism] -name = _("Feudalism") -req1 = "Warrior Code" -req2 = "Monarchy" -flags = "" -graphic = "a.feudalism" -graphic_alt = "-" -cost = 146 - -[advance_flight] -name = _("Flight") -req1 = "Combustion" -req2 = "Theory of Gravity" -flags = "Build_Airborne" -graphic = "a.flight" -graphic_alt = "-" -helptext = _("Traderoutes give less first time revenue.") -cost = 4680 - -[advance_fundamentalism] -name = _("Fundamentalism") -req1 = "Theology" -req2 = "Conscription" -flags = "" -graphic = "a.fundamentalism" -graphic_alt = "-" -helptext = _("Allows government Fundamentalism.") - -[advance_fusion_power] -name = _("Fusion Power") -req1 = "Superconductors" -req2 = "None" -flags = "" -graphic = "a.fusion_power" -graphic_alt = "-" -cost = 8040 - -[advance_genetic_engineering] -name = _("Genetic Engineering") -req1 = "Medicine" -req2 = "The Corporation" -flags = "" -graphic = "a.genetic_engineering" -graphic_alt = "-" -cost = 3150 - -[advance_guerilla_warfare] -name = _("Guerilla Warfare") -req1 = "Communism" -req2 = "Tactics" -flags = "" -graphic = "a.guerilla_warfare" -graphic_alt = "-" -helptext = _("Obsoletes Explorer. Globally unlocks defensive partisans.") -cost = 3985 - -[advance_gunpowder] -name = _("Gunpowder") -req1 = "Invention" -req2 = "Iron Working" -flags = "" -graphic = "a.gunpowder" -graphic_alt = "-" -cost = 800 -helptext = _("Obsoletes Agōgē of Sparta, Barracks, earlier foot soldiers.") - -[advance_horseback_riding] -name = _("Horseback Riding") -req1 = "None" -req2 = "None" -flags = "" -graphic = "a.horseback_riding" -graphic_alt = "-" -cost = 24 - -[advance_industrialization] -name = _("Industrialization") -req1 = "Railroad" -req2 = "Banking" -graphic = "a.industrialization" -graphic_alt = "-" -helptext = _("Obsoletes Galleon. Population begins polluting.") -cost = 2330 - -[advance_invention] -name = _("Invention") -req1 = "Engineering" -req2 = "Literacy" -flags = "" -graphic = "a.invention" -graphic_alt = "-" -helptext = _("Extra vision for Fortress and Naval Base. Prevents Philosophy bonus.") - -[advance_iron_working] -name = _("Iron Working") -req1 = "Bronze Working" -req2 = "Warrior Code" -flags = "" -graphic = "a.iron_working" -graphic_alt = "-" - -[advance_labor_union] -name = _("Labor Union") -req1 = "Mass Production" -req2 = "Guerilla Warfare" -flags = "" -graphic = "a.labor_union" -graphic_alt = "-" -cost = 5430 -helptext = _("Upkeep paid is 1 gold for: Foot Soldiers, Mechanized Infantry.") - -[advance_laser] -name = _("Laser") -req1 = "Nuclear Power" -req2 = "None" -flags = "" -graphic = "a.laser" -graphic_alt = "-" -cost = 5790 - -[advance_leadership] -name = _("Leadership") -req1 = "Chivalry" -req2 = "Gunpowder" -flags = "" -graphic = "a.leadership" -graphic_alt = "-" -helptext = _("Obsoletes Horsemen, Chariot, Elephant, Knight, Crusader.") -cost = 1250 - -[advance_literacy] -name = _("Literacy") -req1 = "Writing" -req2 = "Code of Laws" -flags = "" -graphic = "a.literacy" -graphic_alt = "-" - -[advance_machine_tools] -name = _("Machine Tools") -req1 = "Steel" -req2 = "Tactics" -flags = "" -graphic = "a.machine_tools" -graphic_alt = "-" -helptext = _("Obsoletes Cannon. Globally obsoletes Great Wall.") -cost = 3985 - -[advance_magnetism] -name = _("Magnetism") -;req1 = "Iron Working" -;req2 = "Physics" -req1 = "Navigation" -req2 = "Invention" -flags = "" -graphic = "a.magnetism" -graphic_alt = "-" -helptext = _("Obsoletes Caravel.") -cost = 950 - -[advance_map_making] -name = _("Map Making") -req1 = "Alphabet" -req2 = "None" -flags = "" -graphic = "a.map_making" -graphic_alt = "-" -cost = 51 - -[advance_masonry] -name = _("Masonry") -req1 = "None" -req2 = "None" -flags = "" -graphic = "a.masonry" -graphic_alt = "-" -helptext = _("Allows Forts.") -cost = 24 - -[advance_mass_production] -name = _("Mass Production") -req1 = "Automobile" -req2 = "The Corporation" -graphic = "a.mass_production" -graphic_alt = "-" -helptext = _("+25% population pollution.") -cost = 4680 - -[advance_mathematics] -name = _("Mathematics") -req1 = "Alphabet" -req2 = "Masonry" -flags = "" -graphic = "a.mathematics" -graphic_alt = "-" - -[advance_medicine] -name = _("Medicine") -req1 = "Philosophy" -req2 = "Trade" -flags = "" -graphic = "a.medicine" -graphic_alt = "-" -cost = 468 - -[advance_metallurgy] -name = _("Metallurgy") -req1 = "Gunpowder" -req2 = "University" -flags = "" -graphic = "a.metallurgy" -graphic_alt = "-" -helptext = _("Obsoletes Catapult.") -cost = 1340 - -[advance_miniaturization] -name = _("Miniaturization") -req1 = "Machine Tools" -req2 = "Electronics" -flags = "" -graphic = "a.miniaturization" -graphic_alt = "-" -helptext = _("Obsoletes Lighthouse.") -cost = 4490 - -[advance_mobile_warfare] -name = _("Mobile Warfare") -req1 = "Automobile" -req2 = "Tactics" -flags = "" -graphic = "a.mobile_warfare" -graphic_alt = "-" -helptext = _("Obsoletes Barracks II, Cavalry, Sun Tzu, Genghis Khan.") -cost = 5120 - -[advance_monarchy] -name = _("Monarchy") -req1 = "Ceremonial Burial" -req2 = "Code of Laws" -flags = "" -graphic = "a.monarchy" -graphic_alt = "-" -helptext = _("Allows government Monarchy.") - -[advance_monotheism] -name = _("Monotheism") -req1 = "Philosophy" -req2 = "Polytheism" -flags = "" -graphic = "a.monotheism" -helptext = _("Obsoletes Elephants.") -graphic_alt = "-" -cost = 415 - -[advance_mysticism] -name = _("Mysticism") -req1 = "Ceremonial Burial" -req2 = "None" -flags = "" -graphic = "a.mysticism" -graphic_alt = "-" -helptext = _("Doubles the effect of Temples.") - -[advance_navigation] -name = _("Navigation") -req1 = "Seafaring" -req2 = "Astronomy" -flags = "" -graphic = "a.navigation" -graphic_alt = "-" -helptext = _("Obsoletes Galley, Longboat, War Galley, Ram Ship.") -cost = 486 - -[advance_nuclear_fission] -name = _("Nuclear Fission") -req1 = "Mass Production" -req2 = "Atomic Theory" -flags = "" -graphic = "a.nuclear_fission" -graphic_alt = "-" -cost = 5300 - -[advance_nuclear_power] -name = _("Nuclear Power") -req1 = "Nuclear Fission" -req2 = "Electronics" -flags = "" -graphic = "a.nuclear_power" -graphic_alt = "-" -helptext = _("+2 moves for Sea units.") -cost = 5650 - -[advance_philosophy] -name = _("Philosophy") -req1 = "Mysticism" -req2 = "Literacy" -flags = "" -graphic = "a.philosophy" -graphic_alt = "-" -helptext = _("Bonus tech before 1600AD if no next tier techs are possessed.") -cost = 276 - -[advance_physics] -name = _("Physics") -req1 = "Literacy" -req2 = "Navigation" -flags = "" -graphic = "a.physics" -graphic_alt = "-" -helptext = _("Increases unit vision. Prevents Philosophy bonus.") - -[advance_plastics] -name = _("Plastics") -req1 = "Space Flight" -req2 = "Robotics" -graphic = "a.plastics" -graphic_alt = "-" -helptext = _("Obsoletes Armor. +25% population pollution.") -cost = 7860 - -[advance_polytheism] -name = _("Polytheism") -req1 = "Horseback Riding" -req2 = "Ceremonial Burial" -flags = "" -graphic = "a.polytheism" -graphic_alt = "-" - -[advance_pottery] -name = _("Pottery") -req1 = "None" -req2 = "None" -flags = "" -graphic = "a.pottery" -graphic_alt = "-" -helptext = _("Allows Quays.") -cost = 24 - -[advance_radar] -name = _("Radar") -req1 = "Electronics" -req2 = "Advanced Flight" -flags = "" -graphic = "a.radar" -graphic_alt = "-" -helptext = _("Allows building Radar on Airbases.") -cost = 6630 - -[advance_radio] -name = _("Radio") -req1 = "Flight" -req2 = "None" -flags = "" -graphic = "a.radio" -graphic_alt = "-" -helptext = _("Obsoletes Mausoleum. Allows Airbase, Buoy.") -cost = 5120 - -[advance_railroad] -name = _("?tech:Railroad") -req1 = "Steam Engine" -req2 = "Bridge Building" -flags = "" -graphic = "a.railroad" -graphic_alt = "-" -helptext = _("Obsoletes Hanging Gardens. Traderoutes less first time revenue. Allows Railroads.") -cost = 1820 - -[advance_recycling] -name = _("Recycling") -req1 = "Mass Production" -req2 = "None" -;req2 = "Democracy" ; The chance you get to Recycling without knowing Democracy is about 0.001%, so, just clean up the line mess -flags = "" -graphic = "a.recycling" -graphic_alt = "-" -cost = 4460 - -[advance_refining] -name = _("Refining") -req1 = "Chemistry" -req2 = "Steel" -flags = "" -graphic = "a.refining" -graphic_alt = "-" -helptext = _("Allows Oil Wells on Glaciers.") -cost = 3630 - -[advance_refrigeration] -name = _("Refrigeration") -req1 = "Sanitation" -req2 = "Electricity" -flags = "" -graphic = "a.refrigeration" -graphic_alt = "-" -helptext = _("Allows Farmland.") -cost = 2775 - -[advance_robotics] -name = _("Robotics") -req1 = "Mobile Warfare" -req2 = "Computers" -flags = "" -graphic = "a.robotics" -graphic_alt = "-" -helptext = _("Obsoletes Artillery, King Richards Crusade.") -cost = 7250 - -[advance_rocketry] -name = _("Rocketry") -req1 = "Radar" -req2 = "Miniaturization" -flags = "" -graphic = "a.rocketry" -graphic_alt = "-" -helptext = _("Obsoletes Destroyer, Cruiser.") -cost = 7040 - -[advance_sanitation] -name = _("Sanitation") -req1 = "Engineering" -req2 = "Medicine" -flags = "" -graphic = "a.sanitation" -graphic_alt = "-" -cost = 950 - -[advance_seafaring] -name = _("Seafaring") -req1 = "Pottery" -req2 = "Map Making" -flags = "" -graphic = "a.seafaring" -helptext = _("Obsoletes Trireme.") -graphic_alt = "-" - -[advance_space_flight] -name = _("Space Flight") -req1 = "Computers" -req2 = "Rocketry" -flags = "" -graphic = "a.space_flight" -graphic_alt = "-" -helptext = _("Obsoletes earlier Bombers.") -cost = 7680 - -[advance_stealth] -name = _("Stealth") -req1 = "Superconductors" -req2 = "Avionics" -flags = "" -graphic = "a.stealth" -graphic_alt = "-" -cost = 11920 - -[advance_steam_engine] -name = _("Steam Engine") -;req1 = "Physics" -;req2 = "Invention" -req1 = "Physics" -req2 = "University" -flags = "" -graphic = "a.steam_engine" -graphic_alt = "-" -helptext = _("Obsoletes Frigate.") -cost = 1240 - -[advance_steel] -name = _("Steel") -req1 = "Electricity" -req2 = "Industrialization" -flags = "" -graphic = "a.steel" -graphic_alt = "-" -helptext = _("Allows Sea Bridge.") -cost = 3280 - -[advance_superconductors] -name = _("Superconductors") -req1 = "Laser" -req2 = "Space Flight" -flags = "" -graphic = "a.superconductors" -graphic_alt = "-" -cost = 7750 -helptext = _("Allows MagLev.") - -[advance_tactics] -name = _("Tactics") -req1 = "Conscription" -req2 = "Leadership" -flags = "" -graphic = "a.tactics" -graphic_alt = "-" -helptext = _("Obsoletes Dragoons, Statue of Zeus.") -cost = 2530 - -[advance_the_corporation] -name = _("The Corporation") -req1 = "Economics" -req2 = "Industrialization" -flags = "" -graphic = "a.the_corporation" -graphic_alt = "-" -helptext = _("Obsoletes Caravan.") -cost = 2900 - -[advance_the_republic] -name = _("The Republic") -req1 = "Code of Laws" -req2 = "Literacy" -flags = "" -graphic = "a.the_republic" -graphic_alt = "-" -helptext = _("Allows government Republic.") - -[advance_the_wheel] -name = _("The Wheel") -req1 = "Horseback Riding" -req2 = "None" -flags = "" -graphic = "a.the_wheel" -graphic_alt = "-" - -[advance_theology] -name = _("Theology") -req1 = "Feudalism" -req2 = "Monotheism" -flags = "" -graphic = "a.theology" -graphic_alt = "-" -helptext = _("Obsoletes Oracle. +1 Effect on Cathedral, Michelangelos Chapel.") -cost = 725 - -[advance_theory_of_gravity] -name = _("Theory of Gravity") -req1 = "Astronomy" -req2 = "University" -flags = "" -graphic = "a.theory_of_gravity" -graphic_alt = "-" -cost = 585 - -[advance_trade] -name = _("Trade") -req1 = "Currency" -req2 = "Code of Laws" -flags = "" -graphic = "a.trade" -graphic_alt = "-" -helptext = _("Commerce may do Traderoutes, Enter Marketplace.") - -[advance_university] -name = _("University") -req1 = "Mathematics" -req2 = "Philosophy" -flags = "" -graphic = "a.university" -graphic_alt = "-" -cost = 415 - -[advance_warrior_code] -name = _("Warrior Code") -req1 = "None" -req2 = "None" -flags = "" -graphic = "a.warrior_code" -graphic_alt = "-" -cost = 24 -helptext = _("Foot soldiers may make Hideouts, if enabled.") - -[advance_writing] -name = _("Writing") -req1 = "Alphabet" -req2 = "None" -flags = "" -graphic = "a.writing" -graphic_alt = "-" - -; A placeholder tech used to ensure that when -; a game is reloaded, a player can`t rebuild -; the "Darwin's Voyage" small wonder and get -; two free advances again. -; THIS RULESET DOES NOT USE OLD DARWIN'S VOYAGE BEHAVIOUR OR THEORY OF EVOLUTION. -[advance_theory_of_evolution] -name = _("Theory of Evolution") -req1 = "None" -req2 = "None" -root_req = "Theory of Evolution" -flags = "" -graphic = "b.darwins_voyage" -graphic_alt = "-" -helptext = _("This technology is not researchable and has no effect.") diff --git a/freeciv/freeciv/data/mp2-caravel/Makefile.am b/freeciv/freeciv/data/mp2-caravel/Makefile.am new file mode 100644 index 000000000..2878f7b0d --- /dev/null +++ b/freeciv/freeciv/data/mp2-caravel/Makefile.am @@ -0,0 +1,22 @@ +## Process this file with automake to produce Makefile.in + +## Override automake so that "make install" puts these in proper place: +pkgdatadir = $(datadir)/$(PACKAGE)/mp2-caravel + +pkgdata_DATA = \ + buildings.ruleset \ + cities.ruleset \ + effects.ruleset \ + game.ruleset \ + governments.ruleset \ + nations.ruleset \ + default.lua \ + script.lua \ + parser.lua \ + styles.ruleset \ + techs.ruleset \ + terrain.ruleset \ + units.ruleset \ + README.txt + +EXTRA_DIST = $(pkgdata_DATA) diff --git a/freeciv/freeciv/data/mp2-caravel/README.txt b/freeciv/freeciv/data/mp2-caravel/README.txt index 1c021bd9d..1444887e6 100644 --- a/freeciv/freeciv/data/mp2-caravel/README.txt +++ b/freeciv/freeciv/data/mp2-caravel/README.txt @@ -1,28 +1,44 @@ -Full Game Manual, MP2-Caravel -
+Full Game Manual, MP2-Caravel Useful supplements to the in-game manual (from the Full Game Manual): -Combat -Economy -Diplomacy -Zone of Control (ZOC) -
-Multiplayer Strategy Guide
-
+Combat +Economy +Diplomacy +Zone of Control (ZOC) +City Output Sequence +Multiplayer Strategy Guide Charts: -Bases -Terrain -Governments -Special Unit Attacks -Special Unit Defense -Terrain+Base Defense Bonus Quick-Reference -Diplomatic Odds Charts -Hotkeys and Mouse Control -
-The MP2-Caravel ruleset is a modernized ruleset to take advantage of cutting-edge advancements in Freeciv Server development. -This ruleset is an evolutionary step in the multiplayer-branch. Enjoy! -
-Changelog for MP2-Caravel: -MP2 Caravel changelog -
-Design Log for MP2 Caravel: -MP2 Caravel Design Log +Bases +Terrain +Governments +Special Unit Attacks +Special Unit Defense +Terrain+Base Defense Bonus Quick-Reference +Diplomatic Odds Charts +Vigil Engagement Chart +Hotkeys and Mouse Control + +The MP2 Caravel ruleset is the third official release of the Multiplayer-Evolution II ruleset, and is a major revision. Multiplayer II Evolution rulesets are modernized rulesets to take advantage of cutting-edge advancements in Freeciv Server development. Earlier versions are closer to a version of Civ 2 that has been perfected for massive multiplayer game balance. Later versions evolve to import features, improvements, and novel ideas from all other versions of Freeciv, later versions of the commercial series, as well as original ideas from experienced players. + +Major changes to MP2-Caravel include: +• Technology blueprints +• Re-design and re-balance of governments +• New governments +• Reworking of the Bronze Age: greater strategic diversity and engagement +• Integration of Trade routes as a significant aspect of the game +• Special Unit Attacks + Special Unit Defense: broadens tactical depth and realism +• Expanded transportational units, especially on Land +• Expansion and re-balance of Migrant-type units +• New units +• New wonders +• Civil Wonders force civilizations to uniquely define themselves +• Major overhaul of Power Plants to meaningfully integrate into the game +• Coinage made meaningful by mechanics that enhance its exchange rate +• Casus belli and diplomatic states: greatly expanded to be more meaningful +• Castles, Bunkers, and Tile Claims +• Numerous other fixes and improvements +For more details, see links below: + +MP2 Caravel changelog +MP2 Caravel Design Log + + \ No newline at end of file diff --git a/freeciv/freeciv/data/mp2-caravel/buildings.ruleset b/freeciv/freeciv/data/mp2-caravel/buildings.ruleset index 439d8f126..3df2c882e 100644 --- a/freeciv/freeciv/data/mp2-caravel/buildings.ruleset +++ b/freeciv/freeciv/data/mp2-caravel/buildings.ruleset @@ -847,7 +847,7 @@ sound_alt = "b_generic" helptext = _("\ Police Stations neutralize the unhappiness caused by two military units or two\ unhappy Foreign Nationals. Under Nationalism the effect is +1, affecting three\ - citizens. Police Stations prevent Estalishing Embassy without first agreeing to\ + citizens. Police Stations prevent Establishing Embassy without first agreeing to\ Cease-Fire or Peace. They also half the odds to Investigate City under all governments\ except Democracy.\ "), _("\ @@ -922,7 +922,7 @@ sabotage = 100 sound = "b_recycling_center" sound_alt = "b_generic" helptext = _("\ -A Recycling Center supercedes bonuses from Hydro and Nuclear\ +A Recycling Center replaces pollution bonuses from Hydro and Nuclear\ Plants with its own superior bonus. It reduces pollution\ generated by production in a city by -66%. Supply of raw recycled\ materials adds +2 producton to the city center tile. \n\ @@ -962,6 +962,7 @@ Adds +100% to base science output for each Library and University\ [building_sam_battery] name = _("SAM Battery") genus = "Improvement" +flags = "VisibleByOthers" reqs = { "type", "name", "range" "Tech", "Rocketry", "Player" @@ -1195,9 +1196,9 @@ sabotage = 100 sound = "b_supermarket" sound_alt = "b_generic" helptext = _("\ -Increases the food resources by +100% on each farmland tile which\ - is being used around the city. An irrigable city centre tile receives a\ - +50% bonus immediately, but cannot receive a benefit from farmland.\ +Increases the food resources by +100% on each farmland tile used\ + by the city. An irrigable city centre tile receives an\ + immediate +50% bonus even without Farmland.\ Farmland tiles are those which have been irrigated a second time.\ ") @@ -1248,8 +1249,9 @@ helptext = _("\ Gives two luxury to a city. In small tribal settlements, this can\ be more effective than a Temple for aiding celebration. \n\ The process of building a Totem Pole is sometimes more useful than\ - finishing it. It keeps your tribe productive by storing shields for\ - completing a building after an upcoming scientific discovery. \n\ + finishing it. It keeps your tribe productive by storing shields that\ + can transfer into a building made available by a future scientific\ + discovery. \n\ Obsolete by:Temple, Ceremonial Burial.\ ") @@ -1361,6 +1363,8 @@ Sets your religious capital and second center of government. Loss of this\ Under Theocracy, Zealots produced in the city with this building\ are inspired by fervorous faith to +1 higher veteran level.\ "), _("\ + Allows instantly switching to Theocracy government if Theocracy tech is\ + known.\ With Conscription, allows producing one extra qualifying unit per turn.\ ") @@ -1383,15 +1387,16 @@ sabotage = 0 sound = "w_asmiths_trading_co" sound_alt = "w_generic" helptext = _("\ -In all your cities, Buildings with upkeep of 1 gold become free.\ - This Wonder also allows three new specialists:\ +Adam Smith’s Trading Company increases your nation’s knowledge of\ + economics. In all your cities, Buildings with upkeep of 1 gold become\ + free. This Wonder enables three new specialists:\n\ "), _(" - * Each Laborer produces 1 production point for their city per turn; \ + * Each Laborer produces 1 production point for their city per turn; \n\ "), _(" * Each Merchant produces 1 gold and 2 trade points per turn.\ - Trade is then distributed by your national tax rates. \ + Trade is then distributed by your national tax rates. \n\ "), _(" - * Each Farmer provides 1 food for their city per turn; \ + * Each Farmer provides 1 food for their city per turn. \n\ "), _(" This wonder is never obsolete.\ ") @@ -1522,7 +1527,6 @@ The city with the Appian Way gets additional bonuses:\n\ Obsolete by:Railroad.\ ") - [building_chand_baori] name = _("Chand Baori") genus = "SmallWonder" @@ -1546,15 +1550,15 @@ sound_alt = "w_generic" helptext = _("\ Chand Baori can only be built during your first Despotism regime. All city\ centers become irrigation sources, and you can irrigate diagonal to any irrigation\ - source. Your Tribesmen can still irrigate after turn 20. \n\ -Chand Baori’s home city gets a free well on the city center (i.e., river).\ + source. Your Tribesmen can still irrigate after turn 20. \ +Chand Baori’s home city gets a free well on the city center (i.e., river). \n\n\ "), _("\ -During Despotism, Chand Baori gets two more bonuses: (1) In its city\ +During Despotism, Chand Baori gets two more bonuses:\n(1) In its city\ there is no tile penalty on food output. \n\ "), _("\ -(2) Workers irrigate, cultivate, and plant faster on Grasslands, Plains, and Swamp: \n\n\ +(2) Workers irrigate, cultivate, and plant faster on Grasslands, Plains, and Swamp: \n\ • Irrigate is 2 turns instead of 3. On Swamp, Cultivate and Plant\ - are 4 turns instead of 7. Plant time on Grassland and Plains is 4 and 5 turns. \n\n\ + are 4 turns instead of 7. Plant time on Grassland and Plains is 4 and 5 turns. \n\ • Tribesmen: Irrigate:3; Cultivate/Plant on Swamp:8; Plant on Grassland/Plains: 6,9. \n\n\ Chand Baori is never obsolete.\ ") @@ -1621,8 +1625,8 @@ sound = "w_colossus" sound_alt = "w_generic" helptext = _("\ In the coastal city where this wonder is built, +1 trade is added to every\ - tile worked. The city center tile gets an additional +1 trade on\ - top of the first bonus. Until you discover Steam Engine, the\ + tile that makes trade. The city center tile gets an additional +1 trade.\ + Until you discover Steam Engine, the\ Colossus city receives a discount on all maritime Commerce units:\n\ Boat: 7 shields. \n\ Trireme: 15 shields. \n\ @@ -1696,9 +1700,9 @@ obsolete_by = } build_cost = 700 upkeep = 0 -sabotage = 100 -sound = "b_fusion_reactor_wonder" -sound_alt = "b_generic" +sabotage = 0 +sound = "w_fusion_reactor_wonder" +sound_alt = "w_generic" helptext = _("\ Replaces Power Plants with Fusion Reactor power in all your\ cities. This boosts the +50% bonus of a Factory or Mfg. Plant to +90%. \n\ @@ -2395,10 +2399,10 @@ sabotage = 0 sound = "w_pyramids" sound_alt = "w_generic" helptext = _("\ -Every city will gain +25% to its food storage when the city grows,\ - starves, or is founded. In addition, the city with the Pyramids\ - can rapture when celebrating.\ - This Wonder does not become obsolete.\ +Every city will gain +25% to its food storage when the city grows from\ + from reaching its grain ceiling, or starves, or is founded. In addition,\ + the city with the Pyramids can rapture when celebrating, regardless of\ + government. \nThis Wonder does not become obsolete.\ ") [building_roman_colosseum] @@ -2530,8 +2534,8 @@ sound_alt = "w_generic" helptext = _("\ The powerful Zeus gives order and organization to both city and nation.\ In every city in your nation, this Wonder neutralizes one unhappy\ - citizen caused by military units. (For governments who do not experience\ - discontent from military activity, it simply makes one citizen content.) \n\ + citizen caused by military units. In Monarchies and non-representative\ + government, the Statue of Zeus makes one citizen content. \n\ "), _(" Before the discovery of The Republic, increases odds of promotion by one third. \n\ "), _(" @@ -2768,7 +2772,6 @@ reqs = "Tech", "Masonry", "Player", TRUE, FALSE "Building", "Ziggurat", "Player", FALSE, TRUE "Gov", "Despotism","Player", TRUE, FALSE - "Extra", "River", "Adjacent",TRUE, FALSE } graphic = "b.ziggurat" graphic_alt = "-" @@ -2789,7 +2792,6 @@ The Ziggurat gathers all ruling functions of early civilization into one\ without Walls or Fortifications, it gives a defense bonus similar to\ Fortifications, but gives a guaranteed 1.75× defense, regardless of attacker\ or terrain type. \n\ -The Ziggurat must be built adjacent to a river. \n\ Obsolete by:Monarchy or switching from Despotism.\ ") diff --git a/freeciv/freeciv/data/mp2-caravel/default.lua b/freeciv/freeciv/data/mp2-caravel/default.lua index 70878fc27..ad45837c6 100644 --- a/freeciv/freeciv/data/mp2-caravel/default.lua +++ b/freeciv/freeciv/data/mp2-caravel/default.lua @@ -47,16 +47,16 @@ function _deflua_hut_get_tech(unit) if tech then notify.event(owner, unit.tile, E.HUT_TECH, - _("💡 You found %s in ancient scrolls of wisdom."), + _("[`bulb`] You found %s in ancient scrolls of wisdom."), tech:name_translation()) notify.research(owner, false, E.TECH_GAIN, -- /* TRANS: One player got tech for the whole team. */ - _("💡 The %s found %s in ancient scrolls of wisdom for you."), + _("[`bulb`] The %s found %s in ancient scrolls of wisdom for you."), owner.nation:plural_translation(), tech:name_translation()) notify.research_embassies(owner, E.TECH_EMBASSY, -- /* TRANS: first %s is leader or team name */ - _("💡 The %s have acquired %s from ancient scrolls of wisdom."), + _("[`bulb`] The %s have acquired %s from ancient scrolls of wisdom."), owner:research_name_translation(), tech:name_translation()) return true @@ -128,10 +128,10 @@ function _deflua_hut_get_barbarians(unit) local alive = tile:unleash_barbarians() if alive then notify.event(owner, tile, E.HUT_BARB, - _("⚠️ You have unleashed a horde of barbarians!")); + _("[`warning`] You have unleashed a horde of barbarians!")); else notify.event(owner, tile, E.HUT_BARB_KILLED, - _("⚠️ Your %s has been killed by barbarians!"), + _("[`warning`] Your %s has been killed by barbarians!"), utype:name_translation()); end return alive @@ -206,9 +206,9 @@ function _deflua_make_partisans_callback(city, loser, winner, reason) partisan_spawns = partisan_spawns + 1 if partisan_spawns < 5 then notify.event(loser, city.tile, E.CITY_LOST, - _("[`events/partisans`]
[`partisan`] The loss of %s has inspired %d partisans!"), partisans, city.name) + _("[`events/partisans`]
[`partisan`] The loss of %s inspires %d Partisans!"), city.name, partisans) notify.event(winner, city.tile, E.UNIT_WIN_ATT, - _("[`events/partisans`]
[`partisan`] The loss of %s has inspired %d partisans!"), partisans, city.name) + _("[`events/partisans`]
[`partisan`] The loss of %s inspires %d Partisans!"), city.name, partisans) end end diff --git a/freeciv/freeciv/data/mp2-caravel/effects.ruleset b/freeciv/freeciv/data/mp2-caravel/effects.ruleset index 672e2be2c..583a30730 100644 --- a/freeciv/freeciv/data/mp2-caravel/effects.ruleset +++ b/freeciv/freeciv/data/mp2-caravel/effects.ruleset @@ -97,6 +97,8 @@ value = 45 ; The above is rounded down, so use y=mx+b to get a better algorithm: ; Unhappy = (0.45 * of Foreign citizens) + 1 +; Note this actually makes the Make_Content effects of buildigs one less +; and should eventually be replaced by "Enemy_Citizen_Unhappy_Add", val=1 [effect_angry_conquered_2] type = "Make_Content" value = -1 @@ -3844,6 +3846,14 @@ reqs = "Building", "Solar Plant", "City", FALSE "Building", "Fusion Reactor", "Player", FALSE } +[effect_hoover_dam_city_3] +type = "Pollu_Prod_Pct" ;-25 for factory, -25 for mfg_plant +value = -80 +reqs = + { "type", "name", "range", "present" + "Building", "Hoover Dam", "City", TRUE + "Building", "Fusion Reactor", "Player", TRUE + } ; _ _ _ Bonuses for Hydro Plants in other cities: _ _ _ [effect_hoover_hydro_plant_bonus_1] type = "Output_Bonus" @@ -3963,6 +3973,17 @@ reqs = "Building", "Mfg. Plant", "City", TRUE "OutputType", "Shield", "Local", TRUE } +[effect_fusion_reactor_1a_hoover] +type = "Output_Bonus" +value = 80 +reqs = + { "type", "name", "range", "present" + "Building", "Fusion Reactor", "Player", TRUE + "Building", "Hoover Dam", "City", TRUE + "Building", "Mfg. Plant", "City", FALSE + "Building", "Factory", "City", FALSE + "OutputType", "Shield", "Local", TRUE + } [effect_fusion_reactor_2] type = "Pollu_Prod_Pct" value = -80 @@ -4053,9 +4074,9 @@ value = 2 ; .... ; A Solar Plant combines with Recycling Center to eliminate 90% ; pollution. A Fusion Reactor saves 80% instead of 66%, in which case -; we prefer the Fuction Reactor's bonus. A Fusion reactor supercedes +; we prefer the Fuction Reactor's bonus. A Fusion reactor supersedes ; the Solar Plant's 75% bonus but doesn't get the combination bonus, so -; has to "unsupercede" in the case of Recycling and Solar both present: +; has to "unsupersede" in the case of Recycling and Solar both present: ; .... ; Case 1: neither SP or FR is present. Highest in food chain, full 66%: [effect_recycling_center_1] @@ -4079,11 +4100,11 @@ reqs = "Building", "Solar Plant", "City", TRUE } ; Case 3: SP and Fusion Reactor both present and higher on food chain. -; Solar Plant "wakes up" from being superceded by Fusion Reactor to +; Solar Plant "wakes up" from being superseded by Fusion Reactor to ; deliver its promised 90% combinatorial bonus with Recycling Center: [effect_recycling_center_3] type = "Pollu_Prod_Pct" -value = -10 ; Fusion reactor superceded to -80%. -10 = -90% +value = -10 ; Fusion reactor superseded to -80%. -10 = -90% reqs = { "type", "name", "range", "present" "Building", "Recycling Center", "City", TRUE @@ -4130,7 +4151,13 @@ reqs = "Building", "Research Lab", "City" "OutputType", "Science", "Local" } - +[effect_sam_battery_visible] +type = "Visible_Walls" +value = 16 +reqs = + { "type", "name", "range" + "Building", "SAM Battery", "City" + } [effect_sam_battery] type = "Defend_Bonus" value = 100 @@ -5927,7 +5954,7 @@ reqs = } [effect_statue_of_liberty_1] type = "No_Anarchy" -value = 1 +value = 11 ; (val >= 10) means, no anarchy but switch is NOT immediate reqs = { "type", "name", "range" "Building", "Statue of Liberty", "Player" @@ -6326,13 +6353,6 @@ reqs = "Gov", "Democracy", "Player", FALSE } -;[effect_foreign_national_tuner] -;type = "Enemy_Citizen_Unhappy_Pct" -;value = 50 -;reqs = -; { -; -; } ;************************************************************************ Voyage of Darwin ; There are nasty hard-coded things to the original Wonder, so it had ; to be given a name change (Voyage of Darwin) to avoid messy problems. @@ -6881,6 +6901,7 @@ reqs = "Action", "Investigate City", "Local", TRUE "DiplRel", "War", "Local", FALSE "DiplRel", "Alliance", "Local", FALSE + "DiplRel", "Team", "Local", FALSE } [effect_incident_success_spy_attack] type = "Casus_Belli_Success" @@ -6906,6 +6927,7 @@ reqs = "Action", "Pillage", "Local", TRUE "DiplRel", "War", "Local", FALSE "DiplRel", "Alliance", "Local", FALSE + "DiplRel", "Team", "Local", FALSE } [effect_incident_success_sneaky_road] type = "Casus_Belli_Success" @@ -6915,6 +6937,7 @@ reqs = "Action", "Build Road", "Local", TRUE "DiplRel", "War", "Local", FALSE "DiplRel", "Alliance", "Local", FALSE + "DiplRel", "Team", "Local", FALSE } [effect_incident_success_sneaky_fort] type = "Casus_Belli_Success" @@ -6924,6 +6947,7 @@ reqs = "Action", "Build Base", "Local", TRUE "DiplRel", "War", "Local", FALSE "DiplRel", "Alliance", "Local", FALSE + "DiplRel", "Team", "Local", FALSE } [effect_incident_success_sneaky_transform] type = "Casus_Belli_Success" @@ -6933,6 +6957,7 @@ reqs = "Action", "Transform Terrain", "Local", TRUE "DiplRel", "War", "Local", FALSE "DiplRel", "Alliance", "Local", FALSE + "DiplRel", "Team", "Local", FALSE } [effect_incident_caught_steal_maps1] type = "Casus_Belli_Caught" @@ -7207,6 +7232,7 @@ reqs = "Action", "Found City", "Local", TRUE "DiplRel", "War", "Local", FALSE "DiplRel", "Alliance", "Local", FALSE + "DiplRel", "Team", "Local", FALSE } [effect_incident_paradrop_invasion] type = "Casus_Belli_Success" @@ -7216,6 +7242,7 @@ reqs = "Action", "Paradrop Unit", "Local", TRUE "DiplRel", "War", "Local", FALSE "DiplRel", "Alliance", "Local", FALSE + "DiplRel", "Team", "Local", FALSE } ;******************************************************************** @@ -7563,6 +7590,7 @@ reqs = { "type", "name", "range", "present" "DiplRel", "War", "Local", FALSE "DiplRel", "Alliance", "Local", FALSE + "DiplRel", "Team", "Local", FALSE "DiplRel", "Armistice", "Local", FALSE ; Time to get units out of the territory "DiplRel", "Foreign", "Local", TRUE "UnitFlag", "NonMil", "Local", FALSE @@ -7643,6 +7671,7 @@ reqs = { "type", "name", "range", "present" "DiplRel", "War", "Local", FALSE "DiplRel", "Alliance", "Local", FALSE + "DiplRel", "Team", "Local", FALSE "DiplRel", "Armistice", "Local", FALSE ; Time to get units out of the territory "DiplRel", "Foreign", "Local", TRUE "UnitFlag", "NonMil", "Local", FALSE diff --git a/freeciv/freeciv/data/mp2-caravel/game.ruleset b/freeciv/freeciv/data/mp2-caravel/game.ruleset index 968f2d098..b17ab8ee1 100644 --- a/freeciv/freeciv/data/mp2-caravel/game.ruleset +++ b/freeciv/freeciv/data/mp2-caravel/game.ruleset @@ -1015,19 +1015,22 @@ actor_reqs = "UnitState", "HasHomeCity", "Local", TRUE } -[actionenabler_marketplace] -action = "Enter Marketplace" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "TradeRoute", "Local", TRUE - "UnitState", "Transporting", "Local", FALSE ; avoids bug where land cargo "drowns" even on land terrain - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -target_reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - } +;S12 cities with colossus giving 486 gold from a wagon; this has to be turned OFF until if/when +;we balance it or make a whole new formula for that stuff, based on simple value of the +;commerce unit times a simple multiplier. +;[actionenabler_marketplace] +;action = "Enter Marketplace" +;actor_reqs = +; { "type", "name", "range", "present" +; "UnitFlag", "TradeRoute", "Local", TRUE +; "UnitState", "Transporting", "Local", FALSE ; avoids bug where land cargo "drowns" even on land terrain +; "MinMoveFrags", "1", "Local", TRUE +; "DiplRel", "War", "Local", FALSE +; } +;target_reqs = +; { "type", "name", "range" +; "Building", "Marketplace", "City" +; } [actionenabler_help_build_great_wonder] action = "Help Wonder" @@ -1186,6 +1189,7 @@ actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Bombarder", "Local", TRUE "UnitType", "Archers", "Local", TRUE + "UnitState", "Transported", "Local", TRUE "MinMoveFrags", "1", "Local", TRUE "DiplRel", "War", "Local", TRUE } @@ -1377,6 +1381,7 @@ actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Bombarder", "Local", TRUE "UnitType", "Marines", "Local", TRUE + "UnitState", "Transported", "Local", TRUE "MinMoveFrags", "1", "Local", TRUE "DiplRel", "War", "Local", TRUE "MinVeteran", "2", "Local", TRUE @@ -2217,7 +2222,8 @@ actor_reqs = action = "Upgrade Unit" actor_reqs = { "type", "name", "range", "present" - "DiplRel", "Foreign", "Local", FALSE + "DiplRel", "Foreign", "Local", FALSE + "CityTile", "Center", "Local", TRUE } [actionenabler_airlift_unit] @@ -2245,17 +2251,25 @@ actor_reqs = "Terrain", "Grassland", "Local", FALSE } -[actionenabler_irrigate_tf] +[actionenabler_cultivate] action = "Cultivate" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE "UnitFlag", "CanHide", "Local", FALSE "UnitFlag", "CanClaim", "Local", FALSE -; "UnitType", "Legion", "Local", FALSE + "UnitType", "Tribesmen", "Local", FALSE "UnitType", "Proletarians", "Local", FALSE } -[actionenabler_irrigate_tf_prole] +[actionenabler_cultivate_tribesmen] +action = "Cultivate" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Settlers", "Local", TRUE + "UnitType", "Tribesmen", "Local", TRUE + "MinYear", "-2000", "World", FALSE ; they get old + } +[actionenabler_cultivate_prole] action = "Cultivate" actor_reqs = { "type", "name", "range", "present" @@ -2264,19 +2278,28 @@ actor_reqs = "Gov", "Communism", "Player", TRUE } -[actionenabler_mine_tf_outside_city] +[actionenabler_plant_outside_city] action = "Plant" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE - "UnitFlag", "CanHide", "Local", FALSE - "UnitFlag", "CanClaim", "Local", FALSE -; "UnitType", "Legion", "Local", FALSE + "UnitFlag", "CanHide", "Local", FALSE + "UnitFlag", "CanClaim", "Local", FALSE + "UnitType", "Tribesmen", "Local", FALSE "UnitType", "Proletarians","Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE + "UnitFlag", "Well-Digger", "Local", FALSE + "CityTile", "Center", "Local", FALSE + } +[actionenabler_plant_outside_city_tribesmen] +action = "Plant" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Settlers", "Local", TRUE + "UnitType", "Tribesmen", "Local", TRUE "CityTile", "Center", "Local", FALSE + "MinYear", "-2000", "World", FALSE ; they get old } -[actionenabler_mine_tf_outside_city_prole] +[actionenabler_plant_outside_city_prole] action = "Plant" actor_reqs = { "type", "name", "range", "present" @@ -2285,19 +2308,18 @@ actor_reqs = "Gov", "Communism", "Player", TRUE "CityTile", "Center", "Local", FALSE } -[actionenabler_mine_tf_inside_city] ;you can't plant a forest in an existing city +[actionenabler_plant_inside_city] ;you can't plant a forest in an existing city action = "Plant" actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE -; "UnitType", "Legion", "Local", FALSE - "UnitFlag", "CanHide", "Local", FALSE - "UnitFlag", "CanClaim", "Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - "CityTile", "Center", "Local", TRUE - "Terrain", "Grassland", "Local", FALSE - "Terrain", "Plains", "Local", FALSE + { "type", "name", "range", "present" + "UnitFlag", "Settlers", "Local", TRUE + "UnitFlag", "CanHide", "Local", FALSE + "UnitFlag", "CanClaim", "Local", FALSE + "UnitFlag", "Well-Digger", "Local", FALSE + "UnitType", "Proletarians","Local", FALSE + "CityTile", "Center", "Local", TRUE + "Terrain", "Grassland", "Local", FALSE + "Terrain", "Plains", "Local", FALSE } [actionenabler_pillage] @@ -2336,6 +2358,13 @@ actor_reqs = "UnitType", "Jet Bomber", "Local", TRUE "MinMoveFrags", "1", "Local", TRUE } +[actionenabler_pillage4] +action = "Pillage" +actor_reqs = + { "type", "name", "range", "present" + "UnitType", "Stealth Bomber", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + } [actionenabler_clean_pollution] action = "Clean Pollution" @@ -2395,7 +2424,7 @@ actor_reqs = "UnitFlag", "Settlers", "Local", TRUE "UnitFlag", "CanHide", "Local", FALSE "UnitFlag", "CanClaim", "Local", FALSE - "Tech", "Explosives", "Player", TRUE + "Tech", "Steel", "Player", TRUE "UnitType", "Proletarians", "Local", FALSE "UnitType", "Tribesmen", "Local", FALSE } @@ -2479,9 +2508,7 @@ actor_reqs = "UnitType", "Marines", "Local", FALSE "UnitFlag", "Well-Digger", "Local", FALSE } -;Somewhat counterintuitive but this results in Marines able to build -;Forts and airbases, though no airbase inside an existing fort, -;because otherwise they'd also be able to build Fortresses. +;Marines are able to build Forts and Airbases [actionenabler_marines_can_fort_only] action = "Build Base" actor_reqs = @@ -2490,10 +2517,7 @@ actor_reqs = "UnitState", "Transported", "Local", FALSE "UnitFlag", "CanFortress", "Local", TRUE } -target_reqs = - { "type", "name", "range", "present" - "Extra", "Fort", "Local", FALSE - } + [actionenabler_base_prole] action = "Build Base" actor_reqs = @@ -2696,7 +2720,6 @@ actor_reqs = "UnitFlag", "Settlers", "Local", TRUE "UnitFlag", "CanHide", "Local", FALSE "UnitFlag", "CanClaim", "Local", FALSE - "Tech", "Monarchy", "Player",FALSE "Building", "Chand Baori", "Player",TRUE } target_reqs = @@ -2731,6 +2754,18 @@ target_reqs = { "type", "name", "range", "present" "TerrainClass", "Oceanic", "CAdjacent", TRUE } +[actionenabler_irrigate_src_ocean_tribesmen_chand_baori] +action = "Build Irrigation" +actor_reqs = + { "type", "name", "range", "present" + "Building", "Chand Baori", "Player", TRUE + "UnitFlag", "Settlers", "Local", TRUE + "UnitType", "Tribesmen", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" + "TerrainClass", "Oceanic", "CAdjacent", TRUE + } [actionenabler_irrigate_src_ocean_prole] action = "Build Irrigation" actor_reqs = @@ -2975,9 +3010,9 @@ base_tech_cost = 20 ; all players (human, AI and barbarians) which already ; know the tech. ; "Normal Players" - Technology cost is reduced depending on the number of -; normal players (human and AI) which already know the -; tech. -tech_leakage = "All Players" +; normal living players (human and AI) which already know +; the tech. (FCW: and if human, are not idle 5 or more turns) +tech_leakage = "Normal Players" ; Method of paying tech upkeep ; "None" - no upkeep @@ -3344,10 +3379,6 @@ names = ; RESTRICTINFRA ENABLED ONLY RESTRICTS ENEMY RAILS TO FUNCTION AS ROADS [settings] -; TO DISABLE SPACERACE INCLUDE THESE LINES BELOW: -; "endspaceship", DISABLED, FALSE -; "victories", "ALLIED", FALSE - set = { "name", "value", "lock" "mapsize", "PLAYER", FALSE @@ -3366,8 +3397,9 @@ set = "autoattack", "enabled", FALSE "autoattack_style", 1, FALSE "barbarians", "DISABLED", FALSE - "blueprints", 80, FALSE + "blueprints", 70, FALSE "borders", "SEE_INSIDE", FALSE + "casusbelli_allies", 1, FALSE ; casus belli on one, is casus belli on all (allies). "casusbelliturns", 12, FALSE ; how many turns casus belli lasts after an incident, if not reset. will go +1 higher for further incidents. will be reset by any new non-aggression pact. "ceasefirelength", 15, FALSE "city_output_style", 1, FALSE ; whether tiles and specialists have WYSIWYG output, or calculate output for gold/science AFTER city growth/shrink events. @@ -3377,9 +3409,9 @@ set = "diplgoldcost", 5, FALSE "diplbulbcost", 0, FALSE ; tech trades are overridden by blueprint %; if blueprints are off, there is no tax on theft/conquest. "dispersion", 0, FALSE - "endspaceship", "ENABLED", FALSE + "endspaceship", "DISABLED", FALSE ; prevent game from instantly ending "foggedborders", TRUE, FALSE - "fixedlength", "ENABLED", TRUE ; Turn done doesn't advance turn if there is a timeout. + "fixedlength", "ENABLED", FALSE ; Turn done doesn't advance turn if there is a timeout. "freecost", 1, FALSE ; 0 would get overridden by the 'blueprints' setting: 1 gives 99% of the bulbs of the tech awarded by Philosophy. "fulldisorder", "ENABLED", FALSE ; disorder fully halts one turn of production or buying in a city: closes lots of complex time-consuming micromanaged exploits one would feel obligated to do to be competitive "generator", "RANDOM", FALSE @@ -3391,7 +3423,7 @@ set = "huts", 10, FALSE "killcitizen_pct", 50, FALSE ; regulates % chance of pop kill by city pop-killer units "landmass", 63, FALSE - "looting", "BASE_TRADE", FALSE + "looting", "PROPERTY", FALSE "minplayers", 0, FALSE "move_bonus_in_frags", "ENABLED", TRUE ;locked "multiresearch", "ENABLED", FALSE diff --git a/freeciv/freeciv/data/mp2-caravel/governments.ruleset b/freeciv/freeciv/data/mp2-caravel/governments.ruleset index 8d5597e93..c79f96c24 100644 --- a/freeciv/freeciv/data/mp2-caravel/governments.ruleset +++ b/freeciv/freeciv/data/mp2-caravel/governments.ruleset @@ -212,7 +212,7 @@ The people are devoted and often willing to die for their faith. Cities very\ bribe units is 2x, but Zealots cannot be bribed. Enemies cannot establish\ embassies without first making Ceasefire or Peace. \ "), _("\ -Improvements that appease unhappy citizens produce 1 gold in tithes for each\ +Improvements that appease unhappy citizens add +1 base gold in tithes for each\ citizen appeased. Tithes also boost gold income by +20%, but science output\ suffers -20%. Palace gives +50% to gold income in its city. In cities, two\ military units may impose martial law, affecting one citizen each. Pilgrims\ @@ -220,7 +220,8 @@ Improvements that appease unhappy citizens produce 1 gold in tithes for each\ "), _("\ No citizens are made unhappy by each aggressive unit. \n\ 2% Base corruption in cities\n\ -2% Extra corruption per each tile in distance from capital\n\ +2% Extra corruption per each tile in distance from capital \n\n\ +Having an Ecclesiastical Palace allows instant and orderly transition to this government.\ ") ;------------------------------------------------------------------------ @@ -273,7 +274,7 @@ ruler_female_title = _("Dictator %s") helptext = _("\ Nationalism glorifies national supremacy over other peoples.\ - Zealous citizens and corporatations align under a dictator\ + Citizens and corporatations align under a dictator\ who rules over a unified populace, military, and isolationist economy. \n\ "), _("\ Content cities get a +1 trade bonus on Land tiles only.\ diff --git a/freeciv/freeciv/data/mp2-caravel/script.lua b/freeciv/freeciv/data/mp2-caravel/script.lua index adc6faf03..82e260a26 100644 --- a/freeciv/freeciv/data/mp2-caravel/script.lua +++ b/freeciv/freeciv/data/mp2-caravel/script.lua @@ -34,7 +34,7 @@ function history_turn_notifications(turn, year) notify.all("Philosophers around the world mourn the execution of Giordano Bruno. Philosophy no longer gives a bonus advance.") philosophy_possible = 0 notify.event(nil, nil, E.BEGINNER_HELP, -_("[`events/giordano`]
🔥 Philosophers hide their books after Giordano Bruno is burned.
Philosophy no longer gives a bonus advance.")) +_("[`events/giordano`]
[`fire`] Philosophers hide their books after Giordano Bruno is burned.
Philosophy no longer gives a bonus advance.")) end return false @@ -86,16 +86,18 @@ function tech_researched_handler(tech, player, how) for c in player:cities_iterate() do if c:has_building(find.building_type("Palace")) and first_horse_warning > 0 then notify.event(NIL, c.tile, E.TECH_GAIN, - _("🐎 Travellers say the %s now ride horses, near %s. (%i,%i)"), + _("[`horsemen`] Travellers say the %s now ride horses, near %s. (%i,%i)"), player.nation:plural_translation(), c.name, c.tile.x, c.tile.y ) - notify.all( _("🐎 Tribesmen have learned to ride horses near %s (%i,%i)"), c.name, c.tile.x, c.tile.y) + notify.all( _(" A tribe has learned to ride horses near %s (%i,%i)"), + c.name, c.tile.x, c.tile.y) end if c:has_building(find.building_type("Palace")) and first_horse_warning == 0 then first_horse_warning = 1 notify.event(NIL, c.tile, E.TECH_GAIN, - _("[`events/wildbeasts`]
🐎 Travellers tell of the %s, who ride horses near %s! (%i,%i)"), + _("[`events/wildbeasts`]
[`horsemen`] Travellers tell of the %s, who ride horses near %s! (%i,%i)"), player.nation:plural_translation(), c.name, c.tile.x, c.tile.y ) - notify.all( _("🐎 Tribesmen have learned to ride wild beasts near %s (%i,%i)"), c.name, c.tile.x, c.tile.y) + notify.all( _(" A tribe has learned to ride wild beasts near %s (%i,%i)"), + c.name, c.tile.x, c.tile.y) end end end diff --git a/freeciv/freeciv/data/mp2-caravel/techs.ruleset b/freeciv/freeciv/data/mp2-caravel/techs.ruleset index 2b389bc94..1ce62adf3 100644 --- a/freeciv/freeciv/data/mp2-caravel/techs.ruleset +++ b/freeciv/freeciv/data/mp2-caravel/techs.ruleset @@ -405,16 +405,6 @@ graphic_alt = "-" helptext = _("Traderoutes give less first time revenue.") cost = 4680 -[advance_theocracy] -name = _("Theocracy") -req1 = "Theology" -req2 = "None" -flags = "" -graphic = "a.theocracy" -graphic_alt = "-" -helptext = _("Obsoletes Pax Dei. Allows government Theocracy.") -cost = 725 - [advance_fusion_power] name = _("Fusion Power") req1 = "Superconductors" @@ -914,6 +904,16 @@ flags = "" graphic = "a.the_wheel" graphic_alt = "-" +[advance_theocracy] +name = _("Theocracy") +req1 = "Theology" +req2 = "None" +flags = "" +graphic = "a.theocracy" +graphic_alt = "-" +helptext = _("Obsoletes Pax Dei. Allows government Theocracy.") +cost = 725 + [advance_theology] name = _("Theology") req1 = "Feudalism" @@ -958,7 +958,7 @@ flags = "" graphic = "a.warrior_code" graphic_alt = "-" cost = 24 -helptext = _("Foot soldiers may make Hideouts, if enabled.") +helptext = _("Foot soldiers may make Hideouts.") [advance_writing] name = _("Writing") diff --git a/freeciv/freeciv/data/mp2-caravel/terrain.ruleset b/freeciv/freeciv/data/mp2-caravel/terrain.ruleset index 351d2d927..672f93526 100644 --- a/freeciv/freeciv/data/mp2-caravel/terrain.ruleset +++ b/freeciv/freeciv/data/mp2-caravel/terrain.ruleset @@ -1584,6 +1584,7 @@ reqs = "Tech", "Construction", "Player", TRUE, FALSE "TerrainClass", "Land", "Local", TRUE, FALSE "UnitFlag", "CanFortress", "Local", TRUE, FALSE + "UnitType", "Marines", "Local", FALSE, TRUE ; Marines can do Forts only "CityTile", "Center", "Local", FALSE, TRUE } build_time = 5 @@ -1625,6 +1626,7 @@ reqs = "TerrainFlag", "Low Land", "Local", TRUE, FALSE "TerrainClass", "Oceanic", "CAdjacent", TRUE, FALSE "UnitFlag", "CanFortress", "Local", TRUE, FALSE + "UnitType", "Marines", "Local", FALSE, TRUE ; Marines can do Forts only "CityTile", "Center", "Local", FALSE, TRUE } build_time = 8 @@ -1666,7 +1668,7 @@ reqs = "CityTile", "Center", "Local", FALSE, TRUE ; "Extra", "River", "Local", FALSE, FALSE } -build_time = 21 +build_time = 11 removal_time = 0 unit_seen = "Hidden" native_to = "Land", "LandAirSea", "LandNoKill", "LandRoad", "Cargo", "Helicopter", "Balloon", "Zeppelin" @@ -1703,6 +1705,7 @@ reqs = "TerrainClass", "Land", "Local", TRUE, FALSE "UnitFlag", "CanFortress", "Local", TRUE, FALSE "CityTile", "Center", "Local", FALSE, TRUE + "UnitType", "Marines", "Local", FALSE, TRUE ; Marines can do Forts only ; "Extra", "River", "Local", FALSE, FALSE } build_time = 36 @@ -1739,7 +1742,7 @@ reqs = } build_time = 3 removal_time = 0 -native_to = "Air", "Balloon", "Zeppelin", "Helicopter", "Missile", "Bomb", "AirProtect", "Air_High_Altitude" +native_to = "Air", "Balloon", "Zeppelin", "Helicopter", "Missile", "Bomb", "AirProtect", "Air_High_Altitude", "Cargo" conflicts = "Castle", "Bunker" flags = "Refuel", "NoStackDeath" helptext = _("\ @@ -1825,9 +1828,10 @@ reqs = } buildable = FALSE removal_time = 0 -flags = "TerrChangeRemoves" +flags = "TerrChangeRemoves", "NoStackDeath" helptext = _("\ -Ruins mark the former site of a city that was destroyed or abandoned.\ +Ruins mark the former site of a city that was destroyed or abandoned. Units in Ruins\ + do not experience Stack-Kill. Also, Hideouts made in Ruins will never disappear.\ ") [extra_quay] @@ -1949,7 +1953,7 @@ City center tiles with roads are automatically upgraded to railroads\ name = _("Maglev") category = "Infra" causes = "Road" -rmcauses = "Pillage" +rmcauses = "Pillage", "Disappear" graphic = "road.maglev" graphic_alt = "road.rail" activity_gfx = "unit.maglev" @@ -1957,13 +1961,17 @@ act_gfx_alt = "unit.road" act_gfx_alt2 = "-" rmact_gfx = "None" rmact_gfx_alt = "-" +;For now this is how we disallow MagLev on ocean: it disappears if you make it. +disappearance_chance = 10000 +disappearance_reqs = + { "type", "name", "range", "present" + "TerrainClass", "Oceanic", "Local", TRUE + "Extra", "Sea Bridge","Local", FALSE + } reqs = { "type", "name", "range", "present", "quiet" "Tech", "Superconductors", "Player", TRUE, FALSE -; "Extra", "Railroad", "Local", TRUE, FALSE "UnitFlag", "CanRoad", "Local", TRUE, FALSE -; "UnitClass", "Sea", "Local", FALSE, TRUE -; "TerrainClass", "Land", "Local", TRUE, FALSE } build_time = 3 removal_time = 0 @@ -2133,6 +2141,8 @@ appearance_chance = 1000 ; +10% if no adjacent resource appearance_reqs = { "type", "name", "range", "present" "Terrain", "Mountains","Local", TRUE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE "MinYear", "-4000", "World", TRUE "MinYear", "-3900", "World", FALSE "Extra", "Gold", "Adjacent", FALSE @@ -2159,6 +2169,8 @@ appearance_chance = 1100 ; +11% if no adjacent resource appearance_reqs = { "type", "name", "range", "present" "Terrain", "Tundra", "Local", TRUE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE "MinYear", "-4000", "World", TRUE "MinYear", "-3900", "World", FALSE "Extra", "Elk", "Adjacent", FALSE @@ -2195,6 +2207,8 @@ appearance_reqs = "Terrain", "Swamp", "Local", FALSE "Terrain", "Plains", "Local", FALSE "TerrainClass","Oceanic","Local", FALSE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE "MinYear", "-4000", "World", TRUE "MinYear", "-3900", "World", FALSE "Extra", "Elk", "Adjacent", FALSE @@ -2260,6 +2274,8 @@ appearance_chance = 200 ; +2% if no adjacent resource appearance_reqs = { "type", "name", "range", "present" "Terrain", "Jungle", "Local", TRUE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE "MinYear", "-4000", "World", TRUE "MinYear", "-3900", "World", FALSE "Extra", "Rubber", "Adjacent", FALSE @@ -2287,6 +2303,8 @@ appearance_chance = 300 ; +3% if no adjacent resource appearance_reqs = { "type", "name", "range", "present" "Terrain", "Jungle", "Local", TRUE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE "MinYear", "-4000", "World", TRUE "MinYear", "-3900", "World", FALSE "Extra", "Rubber", "Adjacent", FALSE @@ -2340,6 +2358,8 @@ appearance_chance = 400 ; +4% if no adjacent resource appearance_reqs = { "type", "name", "range", "present" "Terrain", "Desert", "Local", TRUE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE "MinYear", "-4000", "World", TRUE "MinYear", "-3900", "World", FALSE "Extra", "Oasis", "Adjacent", FALSE @@ -2366,6 +2386,8 @@ appearance_chance = 2280 ; +22.8% if no adjacent resource appearance_reqs = { "type", "name", "range", "present" "Terrain", "Swamp", "Local", TRUE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE "MinYear", "-4000", "World", TRUE "MinYear", "-3900", "World", FALSE "Extra", "Spice", "Adjacent", FALSE @@ -2418,6 +2440,8 @@ appearance_reqs = { "type", "name", "range", "present" "Terrain", "Glacier", "Local", TRUE "TerrainClass","Oceanic","Adjacent",TRUE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE "MinYear", "-4000", "World", TRUE "MinYear", "-3900", "World", FALSE "Extra", "Ivory", "CAdjacent",FALSE @@ -2454,6 +2478,8 @@ appearance_chance = 2420 ;+24.2% extra chance if non-adjacent extra appearance_reqs = { "type", "name", "range", "present" "Terrain", "Swamp", "Local", TRUE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE "MinYear", "-4000", "World", TRUE "MinYear", "-3900", "World", FALSE "Extra", "Spice", "Adjacent", FALSE @@ -2529,6 +2555,8 @@ appearance_chance = 700 ; +7% iff no adjacent rivers or resources i.e., far le appearance_reqs = { "type", "name", "range", "present" "Terrain", "Forest", "Local", TRUE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE "MinYear", "-4000", "World", TRUE "MinYear", "-3900", "World", FALSE "Extra", "Berries", "Adjacent", FALSE @@ -2751,7 +2779,7 @@ trade_incr = 1 food_bonus = 0 shield_bonus = 0 trade_bonus = 0 -integrates = "Quay", "Sea Bridge" +integrates = "Quay", "Sea Bridge", "Maglev" compat_special = "Road" flags = "UnrestrictedInfra" @@ -2776,7 +2804,7 @@ trade_incr = 0 food_bonus = 0 shield_bonus = 50 trade_bonus = 0 -integrates = "Sea Bridge" +integrates = "Sea Bridge", "Maglev" compat_special = "Railroad" [road_maglev] @@ -2788,6 +2816,7 @@ trade_incr = 0 food_bonus = 0 shield_bonus = 0 trade_bonus = 0 +integrates = "Sea Bridge", "Road", "Railroad" [road_river] extra = "River" @@ -2806,7 +2835,7 @@ trade_incr = 0 food_bonus = 0 shield_bonus = 0 trade_bonus = 0 -integrates = "Road", "Railroad" +integrates = "Road", "Railroad", "Maglev" flags = "UnrestrictedInfra" [road_canal] diff --git a/freeciv/freeciv/data/mp2-caravel/units.ruleset b/freeciv/freeciv/data/mp2-caravel/units.ruleset index a0b8b6ca7..a332db9f2 100644 --- a/freeciv/freeciv/data/mp2-caravel/units.ruleset +++ b/freeciv/freeciv/data/mp2-caravel/units.ruleset @@ -12,7 +12,7 @@ ; the first available (not obsolete) such unit, or by picking the last ; such unit directly. When determining starting units, the first ; unit with the relevant role that the player can build will be chosen. -; If no such unit can be found (eg Explorers that require Seafaring), +; If no such unit can be found (eg Explorers that require Map Making), ; then the first unit with this role will be chosen. ;:::::::::::::::::::::::::::::::::::::::::’ × @@ -66,14 +66,11 @@ flags = _("FortBuster"), _("Defending Forts get no bonus. +33% attack bonus vs. the 2× defense of a Fortress.") _("FortressBuster"), _("Defending Fortresses get no bonus.") _("AntiAir"), _("Anti-Air bonus of this unit is less effective against Stealth, which has a 25% bonus against this unit.") -;;; _("NeverProtects"), _("Does not protect other units on its tile.") ; UNCOMMENT THIS IF NOT USING SCL'S PATCH FOR THIS FLAG ;;; _("NeverBlocked"), _("Bypasses unreachable units when attacking a tile.") ; UNCOMMENT THIS IF NOT USING LEXXIE'S PATCH FOR THIS FLAG - _("MultiSlot"), _("Cities with proper requirements can produce more than one of these per turn.") ;uncomment if you don't have slot_control patch +;;; _("MultiSlot"), _("Cities with proper requirements can produce more than one of these per turn.") ;uncomment if you don't have slot_control patch _("CanHide"), _("In appropriate terrain, this unit can make a Hideout, which will conceal all land units on the tile.") _("WillNever") -;;; The following flag MUST be #34 position to work with hack in movement.c which allows transported AAA to defend on non-native: -;;; this comment can be removed when we have some smarter way for unit_can_defend_here(..) to get ruleset control. - _("TransportDefender"), _("Can defend while transported on non-native tiles.") +;;; _("TransportDefender"), _("Can defend while transported on non-native tiles.") ;uncomment if you don't have TransportDefender patch _("NonMilAttack"), _("Has military capacity but for peaceful purposes, can enter territories with whom you are at Peace") _("Cant_Pillage"), _("Unable to pillage tiles.") _("CanClaim"), _("Is able to claim sovereignty of foreign tiles bordering domestic territory.") @@ -218,7 +215,8 @@ helptext = _("\ name = _("?unitclass:LandRoad") min_speed = 3 hp_loss_pct = 0 -flags = "BuildAnywhere", "ZOC", "TerrainDefense", "DamageSlows", "TerrainSpeed", "CanFortify" +flags = "BuildAnywhere", "ZOC", "TerrainDefense", "DamageSlows", "TerrainSpeed", "CanFortify", + "CargoRestrained" helptext = _("\ • Only able to move on road tiles.\ ") @@ -501,20 +499,20 @@ flags = "Unreachable", "DoesntOccupyTile" ; ; "IgZOC" = ignore Zones of Control (ZOC) even if unit class has ; "ZOC" flag -; "HasNoZOC" = unit has no Zone of Control (ZOC), thus any unit can move -; around it freely -; "NonMil" = a non-military unit:no martial law; can enter +; "HasNoZOC" = unit has no Zone of Control (ZOC), thus any unit can move +; around it freely +; "NonMil" = a non-military unit:no martial law; can enter ; peaceful borders; DoesntOccupyTile ; "IgTer" = use constant move cost defined in igter_cost (terrain.ruleset) ; rather than terrain/road etc cost, unless terrain cost is ; less -; "OneAttack" = can only make a single attack, regardless of movement points -; "FieldUnit" = cause unhappiness even when not being aggressive +; "OneAttack" = can only make a single attack, regardless of movement points +; "FieldUnit" = cause unhappiness even when not being aggressive ; "BeachLander" = won't lose all its movement when moving from non-native ; terrain to native terrain even if slow_invasions is on. -; "Settlers" = "can irrigate and build roads" but really seems to be a required flag for -; any tile improvement at all. -; "Diplomat" = can defend against diplomat actions (see diplchance +; "Settlers" = "can irrigate and build roads" but really seems to be a required flag for +; any tile improvement at all. +; "Diplomat" = can defend against diplomat actions (see diplchance ; server option) ; "Spy" = strong in diplomatic battles. _Must_ be "Diplomat" also ; "CoastStrict" = (sea only) cannot leave coast @@ -522,40 +520,36 @@ flags = "Unreachable", "DoesntOccupyTile" ; to regularly end turn on coast ; "Only_Native_Attack" = cannot attack targets on non-native tiles even if ; unit class can -; "Cant_Fortify" = cannot fortify even if unit class has "CanFortify" flag -; "Fanatic" = can only be built by governments that allow them -; (see civ2/governments.ruleset, Fvndamentalist government) -; "Unique" = a player can only have one of these units in the game at -; the same time; barbarians cannot use this at present -; "GameLoss" = losing one of these units means you lose the game, but it -; is produced without homecity and upkeep -; "EvacuateFirst" = the game will try to rescue units with this flag before +; "Cant_Fortify"= cannot fortify even if unit class has "CanFortify" flag +; "Fanatic" = can only be built by governments that allow them +; (see civ2/governments.ruleset, Fvndamentalist government) +; "Unique" = a player can only have one of these units in the game at +; the same time; barbarians cannot use this at present +; "GameLoss" = losing one of these units means you lose the game, but it +; is produced without homecity and upkeep +; "EvacuateFirst"=the game will try to rescue units with this flag before ; it tries to rescue units without it when their transport ; is destroyed. Think of the Birkenhead drill ("women and ; children first"). Replace "women and children" with ; "units with the EvacuateFirst unit type flag". -; "SuperSpy" = this unit always wins diplomatic contests, that is, unless -; it encounters another SuperSpy, in which case defender wins; -; can also be used on non-diplomat units, in which case it can -; protect cities from diplomats; also 100% spy survival chance -; "NoHome" = this unit has no homecity and will be free of all upkeep, and -; therefore will not revolt along with its city of origin should -; it be incited +; "SuperSpy" = this unit always wins diplomatic contests, that is, unless +; it encounters another SuperSpy, in which case defender wins; +; can also be used on non-diplomat units, in which case it can +; protect cities from diplomats; also 100% spy survival chance +; "NoHome" = this unit has no homecity and will be free of all upkeep, and +; therefore will not revolt along with its city of origin should +; it be incited ; "NoVeteran" = this unit cannot gain veteran levels through experience ; (as if both raise_chance and work_raise_chance were zero); ; it can still gain veterancy through Veteran_Build, etc ; "CityBuster" = this unit has double firepower against cities ; "NoBuild" = this unit cannot be built -; "BadWallAttacker" = the firepower of this unit is set to 1 if -; attacking a city -; defended by a city wall (or other city building defense) -; "BadCityDefender" = if attacked while in a city, firepower is set to 1 -; and firepower of attacker is doubled (the Pearl Harbour -; rule) +; "BadWallAttacker"=the firepower of this unit is set to 1 if attacking a city +; defended by a city wall (or other city building defense) +; "BadCityDefender"=if attacked while in a city, firepower is set to 1 +; and firepower of attacker is doubled (the Pearl Harbour rule) ; "BarbarianOnly" = only barbarians can build this unit ; "Shield2Gold" = Switch from shield upkeep to gold upkeep possible. -; Also, currently substitutes for "MultiSlot" flag due to inability -; to add another UTYF flag to the server. ; "NewCityGamesOnly" = unit can't be built on scenarios where founding new cities ; is not allowed. Give this flag to units that would make no sense ; to have in a game with such a scenario @@ -583,7 +577,15 @@ flags = "Unreachable", "DoesntOccupyTile" ; is enabled and the unit class is unreachable ; "MultiSlot" = if server setting slot_control is ON, only unit types with this ; flag can use extra city_build_slots -; TO DO:make this a server UTYF flag that's used instead of Shield2Gold +; "TransportDefender" = Unit can always defend while transported, even on non-native +; terrain. +; "SentryAlways" = This unit always reports sentry-type information; give this flag to +; reconnaissance/scouting type units who can't sentry because they are +; fuel-type units (which can only sentry on refueling tiles.) +; "Reserved1" +; "Reserved2" +; "Reserved3" = reserved for future use. +; ------------------------------------------- ; Following actions require extra fields: ; "Attack" and "Suicide Attack" ; attack = base attack strength @@ -1205,7 +1207,7 @@ convert_to = "Musketeers" convert_time = 2 transport_cap = 0 fuel = 0 -city_size = 1850 ; 000000,000,111,001110,1,0 = atk_bonus=0, max_kills=0, targets=7, move_cost=14 frags, stay_fortfy=1, reserved = 0 +city_size = 826 ; 000000,000,011,001110,1,0 = atk_bonus=0, max_kills=0, targets=3, move_cost=14 frags, stay_fortfy=1, reserved = 0 paratroopers_mr_sub = 4096 ; 00010,00,0000,000,0,0 - bbd_retal_rate=2, iPill_rand_tgts=0, iPill_odds=0, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 ;NOTE:iPillage changes in rules require client_rules_flag and get_what_can_unit_pillage_from() changes. uk_happy = 1 @@ -1220,7 +1222,7 @@ roles = "DefendOk", "DefendOkStartUnit" helptext = _("\ Archers fight with bows and arrows. They have good offense and decent defense.\ Rather than fight to the death, Archers can also do a ranged Volley Attack which\ - avoids hand-to-hand retaliation:two volleys of arrows are fired on up to 7 enemy units on the tile,\ + avoids hand-to-hand retaliation:two volleys of arrows are fired on up to 3 enemy units on the tile,\ causing 1-2hp of damage to any units who are hit. This includes Oceanic tiles if not\ transported. This is useful for softening enemies prior to battle, or for deterring an\ approach to a strategic location. (Volley Attack is not possible on Cities or Fortresses.)\ @@ -1360,7 +1362,7 @@ roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild", helptext = _("\ Musketeers are infantry equipped with early firearms. They replace Pikemen as the preferred\ city defender, and replace Archers and Legions for offensive foot soldiers.\ - The discovery of Labor Union allows upgrading Musketeers to Riflemen for free\ + The discovery of Labor Union allows converting Musketeers to Riflemen for free\ in any domestic city. \ "), _("\ \nThe discovery of Banking changes upkeep from shields to gold.\ @@ -1462,8 +1464,9 @@ uk_gold = 0 embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only disembarks = "LandRoad", "LandRail", "Helicopter" targets = "Balloon", "Helicopter", "LandRail" -flags = "Fanatic", "FootSoldier", "Capturer", "CantReachAir", "Unbribable", "Bombarder", - "Settlers", "CanHide", "MultiSlot", "WillNever", "Shield2Gold" +flags = "MultiSlot", "Shield2Gold", "Fanatic", "FootSoldier", "Capturer", + "CantReachAir", "Unbribable", "Bombarder", + "Settlers", "CanHide", "WillNever" roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild" helptext = _("\ Zealots are warriors devoted to a higher cause. Their faith\ @@ -1475,7 +1478,7 @@ Theocratic nations can maintain Zealots without paying\ produced in a city with Ecclesiastical Palace are inspired by\ fervorous faith to +1 higher veteran level. \ "), _("\ -Zealots zealously defend their homeland, and can do surprise skirmish\ +Zealots fervently defend their homeland, and can do surprise skirmish\ assaults to snipe and injure foreign occupants:Up to 4 invaders\ on the tile will endure three combat rounds without defense. Skirmish\ assaults can also be done to foreign occupied cities if they have\ @@ -1511,9 +1514,8 @@ uk_gold = 0 embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only disembarks = "LandRoad", "LandRail", "Helicopter" targets = "Balloon", "Helicopter", "LandRail" -flags = "MultiSlot", "IgTer", "IgZOC", "NoHome", "FootSoldier", "Capturer", "CantReachAir", - "Shield2Gold", "Settlers", "CanHide", "WillNever" -;yes Partisan has 0 upkeep so Shield2Gold is meaningless, but currently used to substitute MultiSlot inaccessible in c-server +flags = "MultiSlot", "Shield2Gold", "IgTer", "IgZOC", "NoHome", "FootSoldier", "Capturer", "CantReachAir", + "Settlers", "CanHide", "WillNever" roles = "DefendGood", "DefendGoodStartUnit", "Partisan", "BarbarianTech" helptext = _("\ Partisans are guerilla fighters who can use the terrain to their advantage. Like the Explorer\ @@ -1561,7 +1563,7 @@ uk_gold = 0 embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only disembarks = "LandRoad", "LandRail", "Helicopter" targets = "Balloon", "Helicopter", "LandRail" -flags = "MultiSlot", "FootSoldier", "Capturer", "CantReachAir", "Shield2Gold", "Settlers", "CanHide", "WillNever" +flags = "MultiSlot", "Shield2Gold", "FootSoldier", "Capturer", "CantReachAir", "Settlers", "CanHide", "WillNever" roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild" helptext = _("\ Riflemen are World War-era infantry. They are good at defending cities and\ @@ -1601,8 +1603,8 @@ uk_gold = 0 embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only disembarks = "LandRoad", "LandRail", "Helicopter" targets = "Balloon", "Helicopter", "LandRail" -flags = "MultiSlot", "IgTer", "FootSoldier", "Capturer", "CantReachAir", "Shield2Gold", - "Settlers", "CanHide", "WillNever" +flags = "MultiSlot", "Shield2Gold", "IgTer", "FootSoldier", "Capturer", + "CantReachAir", "Settlers", "CanHide", "WillNever" roles = "DefendGood", "DefendGoodStartUnit" helptext = _("\ Alpine Troops are highly mobile units and\ @@ -1643,8 +1645,8 @@ uk_gold = 0 embarks = "Helicopter", "Land", "Sea", "LandRoad", "LandRail" disembarks = "Helicopter", "Land", "Sea", "LandRoad", "LandRail" targets = "Sea", "Balloon", "Helicopter", "LandRail", "Zeppelin" -flags = "MultiSlot", "Marines", "FootSoldier", "BeachLander", "Capturer", - "NeverBlocked", "Shield2Gold", "Settlers", "CanHide", "WillNever", +flags = "MultiSlot", "Shield2Gold", "Marines", "FootSoldier", "BeachLander", "Capturer", + "NeverBlocked", "Settlers", "CanHide", "WillNever", "Airbase", "CanFortress", "Bombarder"; can Fort only, actually. veteran_names = _("?vet_rank:green"), @@ -1708,7 +1710,7 @@ embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter o disembarks = "LandRoad", "LandRail", "Helicopter" targets = "Balloon", "Helicopter", "LandRail", "Zeppelin" flags = "Paratroopers", "FootSoldier", "Capturer", "CantReachAir", "Provoking", - "Shield2Gold", "MultiSlot", "Settlers", "CanHide", "WillNever" + "MultiSlot", "Shield2Gold", "Settlers", "CanHide", "WillNever" roles = "DefendOk", "DefendOkStartUnit" helptext = _("\ Paratroopers are experts at airborne attacks.\ @@ -1754,7 +1756,7 @@ uk_gold = 0 embarks = "Helicopter" ; transport helicopter only ;disembarks = "Helicopter" targets = "Balloon", "Helicopter", "LandRail", "Zeppelin" -flags = "CantReachAir", "Shield2Gold", "MultiSlot", "WillNever" +flags = "CantReachAir", "MultiSlot", "Shield2Gold", "WillNever" roles = "DefendGood", "DefendGoodStartUnit" helptext = _("\ Mechanized Infantry have the strongest general defense strength of any land unit.\ @@ -1928,7 +1930,8 @@ roles = "AttackFastStartUnit", "BarbarianTech", helptext = _("\ Knights are heavily armored mounted warriors. They defend at D:3 against mounted units.\ They defend at D:2 against foot units. They defend at D:1 against everything else.\ - Their noble status allows them to attack cities without population reduction.\ + Their noble status allows them to attack cities without population reduction, and\ + conquer a size 1 city without destroying it.\ ") [unit_dragoons] @@ -2040,6 +2043,7 @@ Armor is the mechanized equivalent of a Cavalry unit. They have high attack stre superb mobility, and the highest defense of any offensive unit. They are massive all-terrain\ vehicles, well-suited for penetrating defensive fortifications:Units inside Forts get no defense\ bonus against Armor. Units inside Fortresses get a reduced bonus of 1.67× instead of 2×.\ +Communists pay 10 less for this unit.\ ") [unit_armor_ii] @@ -2310,7 +2314,7 @@ Anti-Aircraft Artillery (AAA) can attack almost anything from anywhere. AAA get or Jet Bombers.)\ "), _(" After Space Flight and 10 turns of service, AAA can be retrofitted to\ - Mobile SAM. The Convert order must be done in your capital, and takes 4 turns.\ + Mobile SAM. The Convert order must be done in a capital, and takes 4 turns.\ ") [unit_mobile_sam] @@ -2425,7 +2429,7 @@ uk_happy = 0 uk_shield = 0 uk_food = 0 uk_gold = 0 -flags = "Unbribable", "HasNoZOC", "NeverProtects", "NonMil", "NoVeteran" +flags = "Unbribable", "HasNoZOC", "NeverProtects", "NonMil", "NoVeteran", "SentryAlways" ; No veteran levels (level name is never displayed) veteran_names = _("green") veteran_base_raise_chance = 0 @@ -2437,11 +2441,12 @@ helptext = _("\ Balloons gather intel on potential battle areas. They have great vision and\ are unreachable by units prior to Riflemen and Ironclads. They can stay in\ the air for one Turn Change before landing in a City, Base, Quay, or transport\ - unit with cargo capacity of 4+. Balloons do not block units under\ - them from being attacked, and can’t fly over mountains.\ + unit with cargo capacity of 4+. Balloons give sentry reports of nearby unit\ + movements even when not on sentry. Balloons do not block units under them\ + from being attacked, and can’t fly over mountains.\ "), _(" NOTE:GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ + can override this by moving to adjacent tiles.\ ") [unit_zeppelin] @@ -2471,7 +2476,8 @@ uk_happy = 0 uk_shield = 0 uk_food = 0 uk_gold = 0 -flags = "Unbribable", "AirAttacker", "HasNoZOC", "NeverProtects", "Bombarder", "Provoking" +flags = "Unbribable", "AirAttacker", "HasNoZOC", "NeverProtects", "Bombarder", + "Provoking", "SentryAlways" veteran_names = _("?vet_rank:green"), _("?vet_rank:veteran"), @@ -2493,11 +2499,12 @@ As new technology inspires the upgrade of Balloons, the Zeppelin appears.\ for two Turn Changes before landing in a City, Quay, Fortress, Naval Base,\ Airbase, or transport with 6+ capacity. \n\ Zeppelins have great vision and are unreachable by units prior to Marines and\ - Destroyers. Zeppelins do not block units under them from being attacked. Unlike\ + Destroyers. Zeppelins do not block units under them from being attacked. Zeppelins\ + give sentry reports of nearby unit movements even when not on sentry. Unlike\ Balloons, they can fly over Mountains.\ "), _(" NOTE:GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ + can override this by moving to adjacent tiles.\ ") bombard_rate = 4 @@ -2526,7 +2533,7 @@ uk_happy = 0 uk_shield = 1 uk_food = 0 uk_gold = 0 -flags = "HasNoZOC", "NoVeteran", "Unbribable", "Expellable", "NeverProtects", "CanEscape", "Provoking", "NoVeteran" +flags = "HasNoZOC", "NoVeteran", "Unbribable", "Expellable", "NeverProtects", "CanEscape", "Provoking", "NonMil" ; No veteran levels (level name is never displayed) veteran_names = _("green") veteran_base_raise_chance = 0 @@ -2536,13 +2543,13 @@ veteran_move_bonus = 0 roles = "" cargo = "Land", "Cargo" helptext = _("\ -Airplanes can carry a single diplomatic unit or single Freight unit. They can land in any domestic\ +Airplanes can carry a diplomatic unit or a Freight unit. They can land in any domestic\ or allied city. For diplomatic missions to non-allied nations, an empty Airbase must be available for landing.\ Airplanes have two turns of fuel. Each new aviation tech upgrades range by +2 moves per turn. \n\ "), _(" Airplanes can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker.\ NOTE:GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ + can override this by moving to adjacent tiles.\ ") [unit_fighter] @@ -2600,7 +2607,7 @@ INTERCEPTOR:the Vigil order lets Fighters auto-attack adjacent Air units if th "), _(" Fighters can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker.\ NOTE:GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ + can override this by moving to adjacent tiles.\ ") [unit_escort_fighter] @@ -2663,7 +2670,7 @@ INTERCEPTOR:the Vigil order lets Escort Fighters auto-attack adjacent Air unit "), _(" This aircraft can Stack-Escape:a 60% chance to escape a killed stack if it has more remaining moves than the attacker.\ NOTE:GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ + can override this by moving to adjacent tiles.\ ") [unit_dive_bomber] @@ -2796,7 +2803,7 @@ Republic:1 Democracy:2 (aggressive) \n\ "), _(" This aircraft can Stack-Escape:a 60% chance to escape a killed stack if it has more remaining moves than the attacker.\ NOTE:GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ + can override this by moving to adjacent tiles.\ ") [unit_heavy_bomber] @@ -2854,7 +2861,7 @@ Republic:1 Democracy:2 \n\ "), _(" This aircraft can Stack-Escape:a 60% chance to escape a killed stack if it has more remaining moves than the attacker.\ NOTE:GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ + can override this by moving to adjacent tiles.\ ") [unit_strategic_bomber] @@ -2911,7 +2918,7 @@ The Strategic Bomber offers a small improvement in attack. Higher altitude offer "), _(" This aircraft can Stack-Escape:a 60% chance to escape a killed stack if it has more remaining moves than the attacker.\ NOTE:GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ + can override this by moving to adjacent tiles.\ ") [unit_awacs] @@ -2953,7 +2960,7 @@ The AWACS has great fuel capacity for long range flights, and advanced radar tha "), _(" AWACS can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker.\ NOTE:GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ + can override this by moving to adjacent tiles.\ ") [unit_spy_plane] @@ -2998,7 +3005,7 @@ The Spy Plane is an ultrasonic high altitude aircraft with long range. It gather "), _(" Spy Planes can Stack-Escape:a 67% chance to escape a killed stack if they have more remaining moves than the attacker.\ NOTE:GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ + can override this by moving to adjacent tiles.\ ") [unit_satellite] name = _("Satellite") @@ -3234,8 +3241,8 @@ Jet Fighters upgrade the Fighter with improved attack, defense, and range.\ INTERCEPTOR:the Vigil order lets Jet Fighters auto-attack adjacent Air units if they\ have better attack odds. This unit can Vigil if it uses 3 move points or less. \n\ "), _(" -Helicopters can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker.\ - NOTE:GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.\ +Jet Fighters can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker.\ + NOTE:GOTO disallows unit loss from lack of fuel. You can override this by moving to adjacent tiles.\ ") [unit_ground_strike_fighter] @@ -3294,7 +3301,7 @@ Ground Strike Fighters upgrade the Dive Bomber. They can’t block attacks on ot specialized niche unit. It is not an interceptor. \n\ This aircraft can Stack-Escape:a 60% chance to escape a killed stack if it has more remaining moves than the attacker.\ NOTE:GOTO prevents unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ + can override this by moving to adjacent tiles.\ ") [unit_jet_bomber] @@ -3349,7 +3356,7 @@ Jet Bombers are stratospheric long-range bombers with 3 turns of fuel:they can "), _(" Jet Bombers can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker.\ NOTE:GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ + can override this by moving to adjacent tiles.\ ") [unit_stealth_fighter] @@ -3409,7 +3416,7 @@ INTERCEPTOR:the Vigil order lets Stealth Fighters auto-attack adjacent Air uni Stealth Fighters can Stack-Escape:a 67% chance to escape a killed stack if they have more remaining moves than the attacker.\ "), _(" NOTE:GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ + can override this by moving to adjacent tiles.\ ") [unit_stealth_bomber] @@ -3433,6 +3440,7 @@ move_rate = 24 vision_radius_sq = 12 transport_cap = 2 fuel = 2 +paratroopers_mr_sub = 146 ;000,00000,00,0100,100,1,0 - max_ATKs=0, bbd_retal_rate=0, iPill_rand_tgts=0, iPill_odds=-4 pentads=80%, iPill_moves=4, iPillage=1, ATK_Stay_Fortified=0 uk_happy = 1 uk_shield = 1 uk_food = 0 @@ -3463,11 +3471,12 @@ roles = "" helptext = _("\ The deadliest Bomber, with improved attack and speed. Stealth Bombers can’t be seen\ unless adjacent to an enemy. Stealth evasion gives a 25% bonus against all Anti-Air\ - units, and reduces SAM Batteries down to only a 25% bonus. May carry two Bombs. \n\ + units, and reduces SAM Batteries down to only a 25% bonus. Stealth Bombers can\ + iPillage. May carry two Bombs. \n\ "), _(" Stealth Bombers can Stack-Escape:a 67% chance to escape a killed stack if they have more remaining moves than the attacker.\ NOTE:GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ + can override this by moving to adjacent tiles.\ ") [unit_boat] @@ -3743,12 +3752,13 @@ hitpoints = 10 firepower = 1 move_rate = 6 vision_radius_sq = 2 -transport_cap = 0 +transport_cap = 1 fuel = 0 uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 +cargo = "Land", "LandNoKill", "LandAirSea", "LandRoad", "Cargo" flags = "BadCityDefender", "CantReachAir", "Only_Native_Attack", "WillNever" veteran_names = _("?vet_rank:green"), @@ -4235,7 +4245,7 @@ roles = "Hunter" helptext = _("\ The Missile Destroyer has double the firepower of a Destroyer, and shares the same roles\ as its ancestor. It gains 2× defense against Air and Missile units. It has a 2× ASW bonus\ - and can can carry one Missile.\ + and can carry one Missile.\ "), _(" Missile Destroyers can Stack-Escape:a 67% chance to escape a killed stack if they have more remaining move points than the attacker.\ ") @@ -4852,7 +4862,7 @@ Spies who survive ops escape to the nearest friendly city. Spies have\ a 25% advantage over Diplomats in combat:a base 75% chance to win.\ Spies may claim a tile for your nation if adjacent to a tile claim made\ inside your own national border. Tile claims require the Spy to be accompanied\ - by a military unit.\ + by another unit.\ Full rules are in the Manual.\ ") @@ -4906,9 +4916,6 @@ Commerce units can help build Wonders in any city with whom\ you are not at war. In foreign cities 15+ tiles distant, they can create Trade Routes,\ increasing net trade in both cities relative to their combined trade. Routes are inactive\ during war and (re)activate during peace. \n\ -Commerce units can enter the Marketplace of non-hostile foreign cities to sell their - wares:revenue derives from total trade in both cities. This is only profitable between - cities with very high trade. \n\ Commerce units can build any Wonders for which you have the tech requirement. To use them\ for a Trade Route, they need to have given a Home City. \n\ All Commerce units can carry Goods as cargo.\ @@ -4940,7 +4947,7 @@ uk_shield = 0 uk_food = 0 uk_gold = 0 cargo = "Land", "Cargo", "LandAirSea" -flags = "HelpWonder", "TradeRoute", "Cant_Fortify", "NonMil", "HasNoZOC", "Capturable", "Expellable", "Shield2Gold", "NoVeteran" +flags = "HelpWonder", "TradeRoute", "Cant_Fortify", "NonMil", "HasNoZOC", "Capturable", "Expellable", "NoVeteran" roles = "" ; No veteran levels (level name is never displayed) veteran_names = _("green") @@ -5032,7 +5039,7 @@ uk_shield = 0 uk_food = 0 uk_gold = 0 cargo = "Land", "LandAirSea", "Bomb", "Cargo" -flags = "HelpWonder", "TradeRoute", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Expellable", "NoVeteran", "Cant_Pillage" +flags = "HelpWonder", "TradeRoute", "NonMil", "HasNoZOC", "Capturable", "Expellable", "NoVeteran", "Cant_Pillage" roles = "" helptext = _("\ The Truck replaces the Caravan as the basic Commerce unit on Land. It moves at\ @@ -5077,13 +5084,13 @@ helptext = _("\ Goods are commodities.\ The cargo containers of the ancient world were amphorae, which carried\ trade goods. \n\ -Goods can be used to establish Trade Routes or Enter Marketplace. They can\ +Goods can be used to establish Trade Routes. They can\ be carried by Commerce units, allowing you to establish multiple\ trade routes in one voyage. Also, Goods can Recycle Production with only\ a 25% penalty, rendering 19 shields into a city production target. \n\ "), _("\ By themselves, Goods can only move onto tiles with a City, Quay, Fortress,\ - or Naval Base. Commerce units, Tribesmen, and Galleons must carry them as cargo.\ + Airbase, or Naval Base. Commerce units, Tribesmen, and Galleons must carry them as cargo.\ If adjacent to a foreign city, use the Do command (D) for Commerce functions.\ ") @@ -5113,18 +5120,18 @@ uk_shield = 0 uk_food = 0 uk_gold = 0 disembarks = "Air", "LandRoad", "LandRail", "Sea", "RiverShip" -flags = "HelpWonder", "TradeRoute", "NonMil", "HasNoZOC", "Capturable", "Cant_Fortify", "NoVeteran", "Cant_Pillage" +flags = "HelpWonder", "TradeRoute", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Cant_Fortify", "NoVeteran", "Cant_Pillage" roles = "" helptext = _("\ The methodical logistics of modern shipping render the Freight unit:a cargo\ container separate from the transport vehicle. Freight brings benefits of\ organized efficiency. Like all Commerce units, it can Help Build\ - Wonders, and Establish Trade Route or Enter Marketplace (with a lower unit cost.)\ + Wonders, and Establish Trade Route.\ Unlike other Commerce units, it can Disband to Recycle Production with\ no net loss in shields. This gives Freight a variety of creative industrial uses. \n\ "), _("\ By itself, Freight is only able to move to tiles with loading infrastructure:\ - Cities, Quays, Fortresses, and Naval Bases. To be transported, it must be carried\ + Cities, Quays, Fortresses, Airbases, and Naval Bases. To be transported, it must be carried\ by Train, Truck, Airplane, or ship. If adjacent to a foreign city, use the D key to\ do Commerce functions.\ ") @@ -5332,7 +5339,7 @@ uk_food = 0 uk_gold = 0 embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only disembarks = "LandRoad", "LandRail", "Helicopter" -flags = "Cant_Fortify", "NonMil", "HasNoZOC", "AddToCity", "Capturable", "Expellable", "Cant_Pillage", "Shield2Gold" +flags = "Cant_Fortify", "NonMil", "HasNoZOC", "AddToCity", "Capturable", "Expellable", "Cant_Pillage", "MultiSlot" ; No veteran levels (level name is never displayed) veteran_names = _("green") veteran_base_raise_chance = 0 @@ -5384,7 +5391,7 @@ Peasants can only be made in one city, but you can make more than one per\ ;vision_layer = "Subsurface" ;embarks = "Sea" ;disembarks = "Sea" -;flags = "IgZOC", "IgTer", "NonMil", "HasNoZOC", "Unbribable", "WillNever", "NoHome", "NoVeteran", "Shield2Gold" +;flags = "IgZOC", "IgTer", "NonMil", "HasNoZOC", "Unbribable", "WillNever", "NoHome", "NoVeteran", "MultiSlot" ;helptext = _("\ ;A Sonar Ping represents active focusing of ship sonar on a\ ; specific area. Destroyer class and AEGIS Cruisers may take\ @@ -5412,7 +5419,7 @@ build_cost = 10 pop_cost = 0 attack = 2 defense = 1 -hitpoints = 10 +hitpoints = 5 firepower = 1 move_rate = 2 vision_radius_sq = 2 @@ -5444,7 +5451,7 @@ build_cost = 10 pop_cost = 0 attack = 2 defense = 1 -hitpoints = 10 +hitpoints = 4 firepower = 1 move_rate = 2 vision_radius_sq = 2 @@ -5476,7 +5483,7 @@ build_cost = 10 pop_cost = 0 attack = 2 defense = 1 -hitpoints = 10 +hitpoints = 5 firepower = 1 move_rate = 2 vision_radius_sq = 2 @@ -5572,7 +5579,7 @@ build_cost = 10 pop_cost = 0 attack = 2 defense = 1 -hitpoints = 7 +hitpoints = 6 firepower = 1 move_rate = 1 vision_radius_sq = 2 @@ -5604,7 +5611,7 @@ build_cost = 10 pop_cost = 0 attack = 1 defense = 1 -hitpoints = 10 +hitpoints = 9 firepower = 1 move_rate = 1 vision_radius_sq = 2 diff --git a/freeciv/freeciv/data/mp2-dragoon/(un)Load (de)Board (dis)Embark rules.txt b/freeciv/freeciv/data/mp2-dragoon/(un)Load (de)Board (dis)Embark rules.txt index ca1daca08..a206aae79 100644 --- a/freeciv/freeciv/data/mp2-dragoon/(un)Load (de)Board (dis)Embark rules.txt +++ b/freeciv/freeciv/data/mp2-dragoon/(un)Load (de)Board (dis)Embark rules.txt @@ -5,18 +5,12 @@ USING THE RULESET FOR TRANSPORT LOGISTICS CONTROL. Transport swapping ============================================================================ -Transport swapping at sea between Ship types (maybe create a "Ship" flag) +Transport swapping at sea between WaterVessels OR between RiverShip class on a river: uses all moves; EXCEPT: LandAirSea, uses 1 5/9 moves can't be done if cargo has no moves left -Transport swapping on SHIP units in a Quay, Naval Base, City - Legal, uses no moves - -Transport swapping on other transporters: - Legal in all cases where Unload is legal (assumes Load is also legal) - Disembarking and Embarking ============================================================================= Disembarking LandAirSea to adjacent transport on blank sea tile should cost 1 5/9 moves, not 1 move. @@ -26,12 +20,12 @@ Disembarking LandAirSea to adjacent transport on blank sea tile should cost 1 5/ Wagon type: - Allowed for all at full cost to all units (except LandAirSea) + disembarking allowed for all at full cost to all units (except LandAirSea) This means an making an "Unload" enabler for emulating "Disembark to same tile" LandAirSea costs 1 move for each. Truck type: - Disallowed except for Foot Soldiers, costs full moves. + Disallowed except for Foot Soldiers, for whom it costs full moves. This means an making an "Unload" enabler for emulating "Disembark to same tile" LandAirSea costs 1 move for each. @@ -41,7 +35,7 @@ LandRail class: LandAirSea costs 1 move for each. Helicopter class: - Allowed only for "Foot" and Artillery types, at full cost (emulating disembark to same tile) + Allowed only for "Foot" (and Artillery?) types, at full cost (emulating disembark to same tile) Boarding/Loading @@ -49,27 +43,15 @@ Boarding/Loading note: if it's legal cargo server already allows it. If not, it doesn't. Forbid only cases the ruleset wants to "outlaw": -Wagons - Unit Types with less than 3 moves can do the Board command AND Cargo-class, all else cannot: - If we can't check base move score, we can make a UnitFlag, otherwise we need a separate - UnitClass and change cargo characteristics. - Trucks - Unit Types with less than 3 moves can do the Board command, AND Bomb, AND Cargo-class, but: Boarding on a blank tile (no base or city) is illegal except for "Foot" soldiers Trains (LandRail class) - Unit Types with less than 3 moves can do the Board command AND Bomb, AND Cargo-class AND Zeppelin Boarding on a blank tile (no base or city) is illegal except for "Foot soldiers" and Zeppelins -Sea class: - Allowed in all cases where Sea units are allowed to go: City, Quay, Naval Base, Blank Sea tile (e.g., Fighter on Carrier) - -RiverShip class: - Allowed in all cases: City, Quay, Naval Base, Blank River tile. - Helicopter class: - Loading allowed for all legal cargo, anywhere. (rescue pick-up!) + Loading allowed for all legal cargo, anywhere? The rescue pick-up rule was nerfed, + but can be reconsidered one more time. Analyse it. =============================================================================== diff --git a/freeciv/freeciv/data/mp2-dragoon/README.txt b/freeciv/freeciv/data/mp2-dragoon/README.txt index 99e94787e..8c2d88028 100644 --- a/freeciv/freeciv/data/mp2-dragoon/README.txt +++ b/freeciv/freeciv/data/mp2-dragoon/README.txt @@ -1,28 +1,48 @@ -Full Game Manual, MP2-Dragoon -
+Full Game Manual, MP2-Dragoon Useful supplements to the in-game manual (from the Full Game Manual): -Combat -Economy -Diplomacy -Zone of Control (ZOC) -
-Multiplayer Strategy Guide
-
+Combat +Economy +Diplomacy +Zone of Control (ZOC) +City Output Sequence +Multiplayer Strategy Guide Charts: -Bases -Terrain -Governments -Special Unit Attacks -Special Unit Defense -Terrain+Base Defense Bonus Quick-Reference -Diplomatic Odds Charts -Hotkeys and Mouse Control -
-The MP2-Dragoon ruleset is a modernized ruleset to take advantage of cutting-edge advancements in Freeciv Server development. -This ruleset is an evolutionary step in the multiplayer-branch. Enjoy! -
-Changelog for MP2-Dragoon: -MP2 Dragoon changelog -
-Design Log for MP2 Dragoon: -MP2 Dragoon Design Log +Bases +Terrain +Governments +Special Unit Attacks +Special Unit Defense +Terrain+Base Defense Bonus Quick-Reference +Diplomatic Odds Charts +Vigil Engagement Chart +Hotkeys and Mouse Control + +The MP2 Dragoon ruleset is the fourth official release of the Multiplayer-Evolution II ruleset. Multiplayer II Evolution rulesets are modernized rulesets to take advantage of cutting-edge advancements in Freeciv Server development. Earlier versions are closer to a version of Civ 2 that has been perfected for massive multiplayer game balance. Later versions evolve to import features, improvements, and novel ideas from all other versions of Freeciv, later versions of the commercial series, as well as original ideas from experienced players. + +Major changes to MP2-Dragoon include: +• Food needed to grow cities: now shaves several turns from growth, and softens dynamics that discouraged cities of size 3-5 in the early game. +— MP2C: 20 30 40 50 60 70 70 70 70... +— MP2D: 15 20 25 31 37 45 53 60 60... +• Rapture is possible in all modern governments with different rates and conditions +• Corruption reduction from buildings/wonders improved for small-, mid-size cities +• "Goods" unit enhanced to broaden the flexibility of ancient economies +• Under Despotism, all new cities get +2 food when founded (+4 for capital) +• Partisans can investigate conquered cities +• Hills now get half the vision bonus of mountains +• Quay now has a uniform bi-directional 2/3 move cost +• Magnetism/Frigates now finally a pre-requirement for Steam Engine/Ironclads +• No sea commerce units cause unhappiness, for consistency and simplification +• Re-balance of late game air units +— Jet aircraft air/ground strength rebalanced similar to propeller aircraft +— Multirole Fighter upgrades Escort Fighter to better represent modern air support +• Re-balance anti-Air/anti-Missile defenses for Mobile SAM and Armor II +• New wonders +• Tuning, smoothing, and re-balance improvement for new wonders introduced in MP2 Caravel +• New units +• Numerous other fixes and improvements +For more details, see links below: + +MP2 Dragoon changelog +MP2 Dragoon Design Log + + \ No newline at end of file diff --git a/freeciv/freeciv/data/mp2-dragoon/buildings.ruleset b/freeciv/freeciv/data/mp2-dragoon/buildings.ruleset index 5885e35a9..4618de48c 100644 --- a/freeciv/freeciv/data/mp2-dragoon/buildings.ruleset +++ b/freeciv/freeciv/data/mp2-dragoon/buildings.ruleset @@ -57,7 +57,15 @@ format_version=20 ; "DisasterProof" = Disasters never destroy this building. Is meaningful ; only for genus "Improvement" buildings as others are ; automatically disaster proof. -; +; "PaxDeiCounter" = This wonder will set Pax Dei effects going. See +; pax_dei_counter and pax_dei_set game settings. basically +; the building just sets off a turn counter which the ruleset +; can create its own effects for. See the Pax Dei wonder +; for an example of one way this can be used. +; "User_Flag_1" = A custom user flag one can use if serveral kinds of +; buildings make the same effect. +; "User_Flag_2" = A custom user flag one can use if serveral kinds of +; buildings make the same effect. ; */ <-- avoid gettext warnings [building_temple] @@ -81,7 +89,8 @@ helptext = _("\ Makes one unhappy citizen content. Mysticism doubles\ this effect. With both Mysticism and the Oracle, +4 citizens are\ made content. Does not affect citizens made unhappy by military\ - activity.\ + activity. \n\ +Odds of loss from razing are halved.\ ") [building_marketplace] @@ -104,7 +113,8 @@ sound_alt = "b_generic" helptext = _("\ Increases the luxury and tax output in a city by +50%.\ Also increases the conversion rate of Coinage by +25%,\ - yielding a rate of 1.75 gold per 1 shield invested.\ + yielding a rate of 1.75 gold per 1 shield invested. \n\ +Odds of loss from razing are halved.\ ") [building_harbour] @@ -128,7 +138,8 @@ sound = "b_harbour" sound_alt = "b_generic" helptext = _("\ Gives one extra food resource on all Oceanic tiles. The city needs\ - to be coastal to build this improvement.\ + to be coastal to build this improvement. \n\ +Odds of loss from razing are halved.\ ") [building_aqueduct] @@ -150,7 +161,8 @@ sound = "b_aqueduct" sound_alt = "b_generic" helptext = _("\ Allows a city to grow larger than size 8. A Sewer System is also\ - required for a city to grow larger than size 12.\ + required for a city to grow larger than size 12. \n\ +Odds of loss from razing are halved.\ ") ; There is also an effect to reduce the chance of plague, but you have to ; enable illness in game.ruleset for that to be relevant. @@ -208,7 +220,7 @@ flags = "VisibleByOthers" reqs = { "type", "name", "range", "present" "Tech", "Masonry", "Player", TRUE - "Building", "Citadel of Aleppo", "City", FALSE + "Terrain", "Mountains", "Local", FALSE } graphic = "b.fortifications" graphic_alt = "b.city_walls" @@ -221,24 +233,19 @@ sabotage = 50 sound = "b_fortifications" sound_alt = "b_generic" helptext = _("\ -Fortifications give 1.5× defense to every unit in a City vs. attacks by Land.\ - This bonus is reduced if attacked by Catapult or the units to which it upgrades.\ - Fortifications prevent population loss when a defending unit is killed. \n\ +Fortifications are modifications to non-mountainous terrain to increase\ + its defense. Fortifications raise the defense bonus of Flatland\ + by +0.50, and other land by +0.33. (Flatland: 1.5×. Forest and Swamp: 1.66×,\ + Jungle: 1.83×, Hills: 2.33×.) Fortifications may combine with other defense\ + improvements in the city.\n\n NOTE: Terrain Bonuses give defending\ + Land units extra defense against attacks from units of all types. \n\n\ "), _("\ -Fortifications raise the terrain bonus of Lowlands tiles by +17%.\ - (Flatland is 1.17×, Forest and Swamp are 1.5×, and Jungle is 1.67×.)\ - A terrain bonus helps defending Land units against attacks from units\ - of all types. \n\ +Fortifications prevent population loss when a defending unit is killed.\ + Fortifications are unassailable by Siege Rams. If an enemy attempts to\ + sabotage Fortifications, the odds of success are halved. \n\n\ "), _("\ -Fortifications are unassailable by Siege Rams.\ - If an enemy attempts sabotage, odds of success are halved. \n\ -"), _("\ -➤ Except for any possible terrain bonus, this improvement offers no bonus when\ - City Walls are in place. \n\ -➤ AFTER making City Walls, you can sell Fortifications with a full return of gold\ - cost.\ +Discovery of Metallurgy increases cost to 45 shields.\ ") - [building_barracks] name = _("Barracks") genus = "Improvement" @@ -314,7 +321,8 @@ sound = "b_sewer_system" sound_alt = "b_generic" helptext = _("\ Allows a city to grow larger than size 12. An Aqueduct is first\ - required for a city to grow larger than size 8.\ + required for a city to grow larger than size 8. \n\ +Odds of loss from razing are halved.\ ") ; There is also an effect to reduce the chance of plague, but you have to ; enable illness in game.ruleset for that to be relevant. @@ -337,8 +345,9 @@ sabotage = 100 sound = "b_courthouse" sound_alt = "b_generic" helptext = _("\ -Courthouses reduce corruption by half, eliminate\ - tile output penalties for Anarchy and Despotism, and\ +Courthouses reduce corruption by half. (If there is any\ + corruption at all, it’s reduced by a minimum of 1.) Courthouses\ + eliminate tile output penalties for Anarchy and Despotism, and\ give +1 shield of free unit upkeep.\ "), _("\ Diplomatic combat gets a bonus of ¼ of base odds. (At general base odds\ @@ -350,9 +359,8 @@ Courthouses reduce corruption by half, eliminate\ "), _("\ Cost to incite revolt in the city is 2× if empty and 4× if occupied.\ "), _("\ - A unique bonus that only a local Courthouse provides to its city: \ - Diplomats can’t establish embassies unless you permit it through\ - Cease-fire or Peace. (Spies require a Police Station to block them.)\ + Emissaries can’t establish embassies unless you permit it through\ + Cease-fire or Peace. (Diplomats with Espionage tech may do so.)\ ") [building_city_walls] @@ -375,15 +383,15 @@ sabotage = 50 sound = "b_city_walls" sound_alt = "b_generic" helptext = _("\ -City Walls give a 3× bonus to every unit in a City against Land unit attacks.\ +City Walls give a 2× bonus to every unit in a City against Land unit attacks.\ + (For defending land units with free-fortify bonus, this results in a 3× total bonus.)\ City Walls are useless against Air, Sea, and Missile units; and the bonus is\ reduced when attacked by Catapults, Cannons, Artillery, and Howitzers.\n\ "), _("\ City Walls prevent population loss when a defending unit is killed. If an enemy\ - attempts to sabotage City Walls, the odds of success are halved. In a city with\ - Fortifications, only the terrain bonus adds to the City Wall bonus. \n\ - "), _("\ - Discovery of Metallurgy increases cost to 75 shields.\ + attempts to sabotage City Walls, the odds of success are halved. \n\n\ +"), _("\ +Discovery of Metallurgy increases cost to 75 shields.\ ") [building_stock_exchange] @@ -437,10 +445,10 @@ sabotage = 100 sound = "b_factory" sound_alt = "b_generic" helptext = _("\ -Increases the shield production in a city by +50%. This increase may\ - contribute to pollution.\ +Increases the shield production in a city by +50%. This increase may\ + contribute to pollution. \n\ "), _("\ - This building lets you build one extra infantry unit per turn.\ +A Factory lets you build one extra multislot unit per turn.\ ") [building_supermarket] @@ -462,9 +470,12 @@ sound = "b_supermarket" sound_alt = "b_generic" helptext = _("\ Increases the food resources by +100% on each farmland tile which\ - is being used around the city. An irrigable city centre tile receives a\ - +50% bonus immediately, but cannot receive a benefit from farmland.\ - Farmland tiles are those which have been irrigated a second time.\ + is being used by the city. An irrigable city centre tile receives an\ + immediate +50% bonus even without Farmland.\ + Farmland tiles are those which have been irrigated a second time. \n\ +Communist government has these effects for free, and gets no bonus\ + from this building. \n\ +Odds of loss from razing are halved.\ ") [building_barracks_iii] @@ -539,8 +550,9 @@ sabotage = 100 sound = "b_offshore_platform" sound_alt = "b_generic" helptext = _("\ -Adds 1 extra production to all Oceanic tiles worked by a city. The\ - city needs to be coastal to build this improvement.\ +Offshore Platforms can be built in coastal cities. They add\ + +1 production to all oceanic tiles worked by a city. Increased\ + production may contribute to pollution.\ ") [building_mfg_plant] @@ -563,24 +575,15 @@ sabotage = 100 sound = "b_mfg_plant" sound_alt = "b_generic" helptext = _("\ -A Manufacturing Plant increases base production by +50%. \n\ -"), _("\ - A Mfg. Plant & Factory together double the production in a city.\ - That is, the Mfg. Plant adds another +50% to the +50% of the Factory. \n\ -"), _("\ - A Mfg. Plant with a Factory AND a Power or Hydro Plant\ - will combine for a total +140% increase over base production.\ - (With Nuclear Plant: +160%) \n\ -"), _("\ - The pollution reduction of a Hydro, Nuclear, or Solar Plant is applied one more\ - time to cities with Mfg. Plants, doubling the pollution reduction bonus.\n\ -"), _("\ - This building lets you build one extra infantry unit per turn.\ +A Manufacturing Plant increases base production by +50%,\ + and gives its city an extra build slot to produce one extra\ + multislot unit per turn.\ ") [building_sam_battery] name = _("SAM Battery") genus = "Improvement" +flags = "VisibleByOthers" reqs = { "type", "name", "range" "Tech", "Rocketry", "Player" @@ -623,7 +626,10 @@ helptext = _("\ A Cathedral makes 3 unhappy citizens content, but does not affect citizens\ made unhappy by military activity. Theology increases the effect by +1.\ Communist government decreases the effect by -1. (Michelangelo’s Chapel enhances\ - the effect of Cathedrals by +1 happy citizen and +1 forced content citizen.)\ + the effect of Cathedrals by +1 happy citizen and +1 forced content citizen.)\n\ +Under Theocracy, the rapture rate increases to 4 out of 7 turns when the\ + Cathedral improvement is physically present inside the city. \n\ +Odds of loss from razing are halved.\ ") [building_airport] @@ -748,7 +754,8 @@ sound_alt = "b_generic" helptext = _("\ Entertains the citizens of a city, making three unhappy citizens content. \ (Four after the discovery of Electricity.) However, it does not\ - affect citizens made unhappy by military activity.\ + affect citizens made unhappy by military activity. \n\ +Odds of loss from razing are halved.\ ") [building_police_station] @@ -770,10 +777,11 @@ sound = "b_police_station" sound_alt = "b_generic" helptext = _("\ Police Stations neutralize the unhappiness caused by two military units or two\ - unhappy Foreign Nationals. Under Nationalism the effect is +1, affecting three\ - citizens. Police Stations prevent Estalishing Embassy without first agreeing to\ - Cease-Fire or Peace. They also half the odds to Investigate City under all governments\ - except Democracy.\ + unhappy Foreign Nationals. Under authoritarian government, they also force\ + two additional citizens to be content (Despotism, Communism, and Nationalism.)\ + Police Stations prevent ALL units from Establishing Embassy without first agreeing\ + to Cease-Fire or Peace. They also half the odds to Investigate City under all\ + governments except Democracy.\ "), _("\ Diplomatic combat gets a bonus of ¼ of base odds. (At general base odds\ of ½, odds of losing become:½ - ⅛ = ⅜). All other hostile diplomatic\ @@ -782,118 +790,114 @@ Police Stations neutralize the unhappiness caused by two military units or two\ Diplomats and Spies made in a city with Police Station gain +1 veteran level.\ ") -[building_hydro_plant] -name = _("Hydro Plant") +[building_coal_plant] +name = _("Coal Plant") genus = "Improvement" reqs = { "type", "name", "range", "present" - "Tech", "Electronics", "Player", TRUE - "Building", "Factory", "City", TRUE - "Extra", "River", "Adjacent",TRUE + "Tech", "Refining", "Player", TRUE + "Building", "Factory", "City", TRUE + ;Shortens Production List choices when unwanted: "Building", "Hoover Dam", "City", FALSE "Building","Fusion Reactor","Player",FALSE + "Building", "Hydro Plant", "City", FALSE "Building", "Nuclear Plant","City", FALSE + } -graphic = "b.hydro_plant" +graphic = "b.power_plant" graphic_alt = "-" obsolete_by = { "type", "name", "range" } -build_cost = 175 -upkeep = 3 +build_cost = 120 +upkeep = 4 sabotage = 100 -sound = "b_hydro_plant" +sound = "b_power_plant" sound_alt = "b_generic" helptext = _("\ -A Hydro Plant boosts the +50% bonus of the Factory and Mfg. Plant to\ - +70%. For each of those, it reduces pollution from production by -25%. \n\ -"), _("\ -➤ In a city with both a Factory and Mfg. Plant, this makes a combined +140%\ - production bonus with a 50% decrease in pollution from production. \n\ +Coal Plants boost the base production of a city by +30%. The\ + discovery of Mass Production increases the bonus to +50%. Increased\ + production may contribute to pollution. \n\ "), _("\ -➤ For both Factory and Mfg. Plant, -25% in production-based\ - pollution cancels slightly more than the pollution generated by\ - the 20% increase in production. \n\ +➤ With a Factory and Mass Production technology, this makes a\ + combined +150% production bonus. \n\ "), _("\ -➤ Only one Coal Plant, Hydro Plant, Nuclear Plant, or\ - Fusion Reactor can have an active effect in a city. \n\ -"), _("\ -➤ The sale price of a Coal Plant becomes 85% original value\ - instead of 50% original value, after a city has built a Hydro Plant. \n\n\ -Hydro Plants can only be built in cities adjacent to rivers.\ +➤ Only one Coal Plant, Hydro Plant, Nuclear Plant, or Fusion Reactor\ + can have an active effect in a city.\ ") -[building_nuclear_plant] -name = _("Nuclear Plant") +[building_hydro_plant] +name = _("Hydro Plant") genus = "Improvement" reqs = - { "type", "name", "range", "present" - "Tech", "Nuclear Power","Player", TRUE - "Building", "Factory", "City", TRUE - "Building", "Hoover Dam", "City", FALSE - "Building","Fusion Reactor","Player",FALSE + { "type", "name", "range", "present" + "Tech", "Electronics", "Player", TRUE + "Building", "Factory", "City", TRUE + "Extra", "River", "Adjacent", TRUE + "Building", "Hoover Dam", "City", FALSE + "Building","Fusion Reactor","Player", FALSE + "Building", "Nuclear Plant","City", FALSE } -graphic = "b.nuclear_plant" +graphic = "b.hydro_plant" graphic_alt = "-" obsolete_by = { "type", "name", "range" } -build_cost = 185 -upkeep = 4 +build_cost = 175 +upkeep = 2 sabotage = 100 -sound = "b_nuclear_plant" +sound = "b_hydro_plant" sound_alt = "b_generic" helptext = _("\ -A Nuclear Plant boosts the +50% bonus of the Factory and Mfg. Plant to\ - +80%. For each of those, it reduces pollution from production by -25%. \n\ -"), _("\ -➤ In a city with both a Factory and Mfg. Plant, this makes a combined +160%\ - production bonus with a 50% decrease in pollution from production. \n\ +A Hydro Plant boosts the base production of a city by +30%. The\ + discovery of Mass Production increases this to +50%. The extra\ + output of a Hydro Plant generates no pollution. \n\ "), _("\ -➤ For both Factory and Mfg. Plant, -25% in production-based\ - pollution cancels most of the pollution generated by\ - the 30% increase in production. \n\ +➤ With a Factory and Mass Production technology, this makes a\ + combined +150% production bonus. \n\ "), _("\ ➤ Only one Coal Plant, Hydro Plant, Nuclear Plant, or\ Fusion Reactor can have an active effect in a city. \n\ "), _("\ ➤ The sale price of a Coal Plant becomes 85% original value\ - instead of 50% original value, after a city has built a Nuclear Plant.\ + after a city has built a Hydro Plant. \n\n\ +Hydro Plants can only be built on or adjacent to rivers. \n\ +Odds of loss from razing are halved.\ ") -[building_coal_plant] -name = _("Coal Plant") +[building_nuclear_plant] +name = _("Nuclear Plant") genus = "Improvement" reqs = { "type", "name", "range", "present" - "Tech", "Refining", "Player", TRUE + "Tech", "Nuclear Power","Player", TRUE "Building", "Factory", "City", TRUE - ;Shortens Production List choices when unwanted: "Building", "Hoover Dam", "City", FALSE "Building","Fusion Reactor","Player",FALSE - "Building", "Hydro Plant", "City", FALSE - "Building", "Nuclear Plant","City", FALSE - } -graphic = "b.power_plant" +graphic = "b.nuclear_plant" graphic_alt = "-" obsolete_by = { "type", "name", "range" } -build_cost = 120 +build_cost = 185 upkeep = 4 sabotage = 100 -sound = "b_power_plant" +sound = "b_nuclear_plant" sound_alt = "b_generic" helptext = _("\ -A Coal Plant boosts the +50% bonus of the Factory and Mfg. Plant to\ - +70%. The extra production may lead to more pollution. \n\ +A Nuclear Plant boosts the base production of a city by +60%,\ + while reducing pollution from production by -50%. (i.e., only\ + 1/6 of the extra output contributes to pollution.) \n\ "), _("\ -➤ In a city with both a Factory and Mfg. Plant, this makes a combined +140%\ - production bonus. \n\ +➤ With a Factory and Mass Production technology, this makes a\ + combined +160% production bonus. \n\ "), _("\ -➤ Only one Coal Plant, Hydro Plant, Nuclear Plant, or Fusion Reactor\ - can have an active effect in a city.\ +➤ Only one Coal Plant, Hydro Plant, Nuclear Plant, or\ + Fusion Reactor can have an active effect in a city. \n\ +"), _("\ +➤ The sale price of a Coal Plant becomes 85% original value\ + after a city has built a Nuclear Plant.\ ") [building_homeland_security] @@ -916,8 +920,12 @@ sound = "b_homeland_security" sound_alt = "b_generic" helptext = _("\ You can build Homeland Security offices if you own the Supreme Court. Homeland Security\ - gives the same bonus as a Courthouse vs. hostile diplomatic acts. As a ministry of the\ - Supreme Court, it has no upkeep and cannot be sabotaged.\ + gives the same bonus as a Courthouse vs. hostile diplomatic acts. In addition, it\ + prevents its city from being poisoned by spies. As a ministry of the Supreme Court,\ + it has no upkeep and cannot be sabotaged. \n\ +"), _("\ + Emissaries can’t establish embassies unless you permit it through\ + Cease-fire or Peace. (Diplomats with Espionage tech may do so.)\ ") [building_super_highways] @@ -960,14 +968,18 @@ sabotage = 100 sound = "b_recycling_center" sound_alt = "b_generic" helptext = _("\ -A Recycling Center supercedes bonuses from Hydro and Nuclear\ - Plants with its own superior bonus. It reduces pollution\ - generated by production in a city by -66%. Supply of raw recycled\ - materials adds +2 producton to the city center tile. \n\ +A Recycling Center eliminates two thirds of all pollution\ + generated by production. (That is, the pollution generated\ + from base production, Factory, Coal Plant, and Mfg. Plant, + will all be reduced by -66%.) +In the case of Hydro and Nuclear Plants, which already have a\ + pollution bonus, the Recycling Center supercedes their bonus\ + and replaces it with its own superior bonus.\n\ +A Recycling Center supplies raw recycled materials, adding +2\ + producton to the city center tile. \n\ "), _("\ When combined with a Solar Plant, pollution from production is\ - nearly eliminated by -90%, leaving pollution from population\ - as the only significant polluting factor.\ + reduced by -90%.\ ") [building_mass_transit] @@ -975,7 +987,7 @@ name = _("Mass Transit") genus = "Improvement" reqs = { "type", "name", "range" - "Tech", "Mass Production", "Player" + "Tech", "Combustion", "Player" } graphic = "b.mass_transit" graphic_alt = "-" @@ -990,8 +1002,8 @@ sound_alt = "b_generic" helptext = _("\ Eliminates the pollution generated by population.\ Production becomes the only source of pollution in\ - the city.\ -"), _("\ + the city. \n\ +"), _("\ Increased citizen mobility and ticket revenues\ increase base trade on city centre tile by +2\ ") @@ -1160,7 +1172,8 @@ sound_alt = "b_generic" helptext = _("\ The amount of stored food will be set to half full whenever a city\ with a Granary 1) grows in size, or 2) loses size from starvation.\ - This helps a city to grow faster and more easily withstand famine.\ + This helps a city to grow faster and more easily withstand famine. \n\ +Odds of loss from razing are halved.\ ") [building_totem_pole] @@ -1186,8 +1199,9 @@ helptext = _("\ Gives two luxury to a city. In small tribal settlements, this can\ be more effective than a Temple for aiding celebration. \n\ The process of building a Totem Pole is sometimes more useful than\ - finishing it. It keeps your tribe productive by storing shields for\ - completing a building after an upcoming scientific discovery. \n\ + finishing it. It keeps your tribe productive by storing shields that\ + can transfer into a building made available by a future scientific\ + discovery. Odds of loss from razing are halved. \n\ Obsolete by:Temple, Ceremonial Burial.\ ") @@ -1280,8 +1294,6 @@ Before you can build any spaceship parts, your nation must have built the\ Apollo Program; and a city needs a Factory.\ ") - - [building_palace] name = _("Palace") genus = "SmallWonder" @@ -1324,7 +1336,7 @@ Sets the main capital of your nation. Loss of your main capital:\ the move bonus for nations who have no cities, due to sedentary\ culture.\ "), _("\ - With Conscription, a Palace allows producing one extra qualifying unit per turn.\ + With Conscription, a Palace allows producing one extra multislot unit per turn.\ ") [building_ecclesiastical_palace] @@ -1365,7 +1377,9 @@ Sets your religious capital and second center of government. Loss of this\ Under Theocracy, Zealots produced in the city with this building\ are inspired by fervorous faith to +1 higher veteran level.\ "), _("\ - With Conscription, allows producing one extra qualifying unit per turn.\ + Allows instantly switching to Theocracy government if Theocracy tech is\ + known.\ + With Conscription, allows producing one extra multislot unit per turn.\ ") [building_asmiths_trading_co] @@ -1389,14 +1403,14 @@ sound_alt = "w_generic" helptext = _("\ Adam Smith’s Trading Company increases your nation’s knowledge of\ economics. In all your cities, Buildings with upkeep of 1 gold become\ - free. This Wonder enables three new specialists:\ + free. This Wonder enables three new specialists:\n\ "), _(" - * Each Laborer produces 1 production point for their city per turn; \ + * Each Laborer produces 1 production point for their city per turn; \n\ "), _(" * Each Merchant produces 1 gold and 2 trade points per turn.\ - Trade is then distributed by your national tax rates. \ + Trade is then distributed by your national tax rates. \n\ "), _(" - * Each Farmer provides 1 food for their city per turn; \ + * Each Farmer provides 1 food for their city per turn. \n\ "), _(" This wonder is never obsolete.\ ") @@ -1425,8 +1439,14 @@ The Agōgē creates a culture of extreme fitness, and is famous for\ vigilant patrols, secret shortcut trails, and battle readiness.\ All your foot soldiers get +⅓ move. Phalanx and Pikemen receive a\ +50% attack bonus. Phalanx promotions are 50% more frequent, and\ - cost is reduced by 3 shields. \n\n\ -In the city with the Agōgē, Foot units begin their turn with +1 move,\ + their cost is reduced by 3 shields. \n\ +"), _(" +In the city with the Agōgē, a Barracks is not needed to make veteran\ + land units. If you have a Barracks, then Phalanxes will be made at\ + +2 veteran level; but other units still will be made with +1 veteran\ + level. \ +"), _(" +In all your cities, Foot units begin their turn with +1 move.\ and the wonder counts as a Barracks. \n\n\ Obsolete by:Gunpowder.\ ") @@ -1439,7 +1459,6 @@ reqs = "Tech", "Code of Laws", "Player", TRUE, FALSE, FALSE "Building", "Angkor Wat", "Player", FALSE, TRUE, FALSE "Gov", "Democracy", "Player", FALSE, TRUE, FALSE - "Gov", "Theocracy", "Player", FALSE, TRUE, FALSE "Gov", "Communism", "Player", FALSE, TRUE, FALSE "Gov", "Nationalism", "Player", FALSE, TRUE, FALSE ;requires 23Sept2021 changes to requirements.c, so obsolete wonders don't re-enable others @@ -1458,15 +1477,15 @@ sabotage = 0 sound = "w_angkor" sound_alt = "w_generic" helptext = _("\ -Angkor Wat gives you the glorious ancient city of\ - splendor and culture. In Despotism and Monarchy,\ - cities of size 3+ get the tile celebration bonus even if not celebrating.\ - All cities gain +1 happy citizen. Work done on Jungle and Swamp tiles\ - is 2× faster. In addition, the cost of Elephants is reduced by 5\ - shields. \n\ +Angkor Wat is a glorious ancient city of culture.\ + All your cities gain +1 happy citizen, and can begin\ + celebration at size 2. Additionally, all cities of size 2 or\ + more get the tile celebration bonus even if not celebrating.\ + Work done on Jungle and Swamp tiles is 2× faster. The cost of\ + Elephants is reduced by 5 shields. \n\ "), _(" -This Wonder is never obsolete, but it only has an effect in\ - Despotism, Monarchies, and Republic. \ +This Wonder is never obsolete, but has no effect in Democracy,\ + Communism, or Nationalism.\ "), _(" Angkor Wat is a Civil Wonder. You can build only one Civil Wonder.\ ") @@ -1545,7 +1564,7 @@ graphic_alt = "-" obsolete_by = { "type", "name", "range" } -build_cost = 80 +build_cost = 65 upkeep = 0 sabotage = 0 sound = "w_chand_baori" @@ -1553,15 +1572,15 @@ sound_alt = "w_generic" helptext = _("\ Chand Baori can only be built during your first Despotism regime. All city\ centers become irrigation sources, and you can irrigate diagonal to any irrigation\ - source. Your Tribesmen can still irrigate after turn 20. \n\ -Chand Baori’s home city gets a free well on the city center (i.e., river).\ + source. Your Tribesmen can still irrigate after turn 20. \ +Chand Baori’s home city gets a free well on the city center (i.e., river). \n\n\ "), _("\ -During Despotism, Chand Baori gets two more bonuses: (1) In its city\ +During Despotism, Chand Baori gets two more bonuses:\n(1) In its city\ there is no tile penalty on food output. \n\ "), _("\ -(2) Workers irrigate, cultivate, and plant faster on Grasslands, Plains, and Swamp: \n\n\ +(2) Workers irrigate, cultivate, and plant faster on Grasslands, Plains, and Swamp: \n\ • Irrigate is 2 turns instead of 3. On Swamp, Cultivate and Plant\ - are 4 turns instead of 7. Plant time on Grassland and Plains is 4 and 5 turns. \n\n\ + are 4 turns instead of 7. Plant time on Grassland and Plains is 4 and 5 turns. \n\ • Tribesmen: Irrigate:3; Cultivate/Plant on Swamp:8; Plant on Grassland/Plains: 6,9. \n\n\ Chand Baori is never obsolete.\ ") @@ -1572,10 +1591,9 @@ genus = "SmallWonder" reqs = { "type", "name", "range", "present", "quiet" "Tech", "Engineering", "Player", TRUE, FALSE - "Tech", "Gunpowder", "Player", FALSE, FALSE + "Tech", "Metallurgy", "Player", FALSE, FALSE "Building", "Citadel of Aleppo", "Player", FALSE, TRUE "Building", "City Walls", "City", FALSE, TRUE - "Building", "Fortifications", "City", FALSE, TRUE } graphic = "b.citadel_aleppo" graphic_alt = "-" @@ -1589,13 +1607,11 @@ sound = "w_citadel_aleppo" sound_alt = "w_generic" helptext = _("\ The great Citadel of Aleppo turns an entire city into a formidable fortress.\ - It must be built before Gunpowder is discovered. It provides 3x defense\ - against all Land attacks: the thick walls are impervious to any bonuses\ - from Ballistic units such as Catapults, Cannons, and Howitzers. Siege\ - Rams are ineffective against it. \n\ -The Citadel of Aleppo cannot be made in a city that has City Walls or\ - Fortifications, but it is possible to sell those in order to allow for\ - the Citadel.\ + It must be built before Metallurgy is discovered. It provides 3× defense\ + against all Land attacks: the thick walls are impervious to sabotage, Siege\ + Rams, and any bonuses from Catapults, Cannons, Artillery, and Howitzers. \n\ +The Citadel of Aleppo cannot be made in a city that has City Walls,\ + but it is possible to sell those in order to allow for the Citadel.\ ") [building_code_of_hammurabi] @@ -1660,8 +1676,8 @@ sound = "w_colossus" sound_alt = "w_generic" helptext = _("\ In the coastal city where this wonder is built, +1 trade is added to every\ - tile worked. The city center tile gets an additional +1 trade on\ - top of the first bonus. Until you discover Steam Engine, the\ + tile that makes trade. The city center tile gets an additional +1 trade.\ + Until you discover Steam Engine, the\ Colossus city receives a discount on all maritime Commerce units:\n\ Boat: 7 shields. \n\ Trireme: 15 shields. \n\ @@ -1673,6 +1689,34 @@ A trade route established from the city with Colossus gets +40% one-time revenue Obsolete by:Automobile.\ ") +[building_commissariat_of_agriculture] +name = _("Commissariat of Agriculture") +genus = "SmallWonder" +reqs = + { "type", "name", "range", "present", "quiet" + "Tech", "Communism", "Player", TRUE, FALSE + "Gov", "Communism", "Player", TRUE, FALSE + "Building", "Commissariat of Agriculture","Player", FALSE, TRUE + } +graphic = "b.commissariat" +graphic_alt = "b.pyramids" +obsolete_by = + { "type", "name", "range" + } +build_cost = 150 +upkeep = 0 +sabotage = 0 +sound = "w_commissariat" +sound_alt = "w_generic" +helptext = _("\ +The Commissariat of Agriculture submits all agricultural output\ + to State methods and planning. Newly founded cities start\ + with +5 food. Time to create Farmland is reduced to 2\ + worker-turns. Gross food output in every city receives a +10%\ + multiplier.\n\n\ +This Wonder is never obsolete, but only works in Communism.\ +") + [building_copernicus_observatory] name = _("Copernicus' Observatory") genus = "SmallWonder" @@ -1686,7 +1730,7 @@ graphic_alt = "-" obsolete_by = { "type", "name", "range" } -build_cost = 100 +build_cost = 90 upkeep = 0 sabotage = 0 sound = "w_copernicus_observatory" @@ -1735,20 +1779,18 @@ obsolete_by = } build_cost = 700 upkeep = 0 -sabotage = 100 -sound = "b_fusion_reactor_wonder" -sound_alt = "b_generic" +sabotage = 0 +sound = "w_fusion_reactor_wonder" +sound_alt = "w_generic" helptext = _("\ -Replaces Power Plants with Fusion Reactor power in all your\ - cities. This boosts the +50% bonus of a Factory or Mfg. Plant to +90%. \n\ -➤ In a city with both a Factory and Mfg. Plant present, there is a\ - combined +180% production bonus. \n\ -"), _("\ -Pollution reduction from Recycling Center and Power Plants\ - is upgraded to a higher bonus of a flat -80%. \n\ +Obsoletes the effects of Power Plants in all your cities,\ + replacing them with Fusion Reactor power. This boosts base\ + production by +80%. The extra output generates no pollution. \n\ "), _("\ +➤ In a city with a Factory and Mfg. Plant, this makes a\ + combined +180% production bonus. \n\ ➤ Only one Coal Plant, Hydro Plant, Nuclear Plant, or Fusion\ - Plant can have an active effect in a city. A nation that owns\ + Reactor can take effect for a city. A nation that owns\ the Fusion Reactor can sell off all Power Plants and gain a\ large savings in ongoing upkeep costs. \n\ "), _("\ @@ -1843,7 +1885,9 @@ The Great Wall protects your cities with City Walls. Unlike normal\ "), _("\ The Great Wall gives no extra effect when City Walls are already present.\ However, regular City Walls still protect a city in which the Great\ - Wall has not yet activated. \n Warning! This Wonder is obsolete when\ + Wall has not yet activated. \n\ +The Great Wall also allows you to build Walls over the land terrain\ + itself. See the manual for more information. \n WARNING! This Wonder is obsolete when\ ANY nation in the world discovers Machine Tools.\ ") @@ -1903,16 +1947,17 @@ sound_alt = "w_generic" helptext = _("\ In the city where it’s built, Hoover Dam counts exactly as a Hydro Plant,\ Factory, and Manufacturing Plant. If any of those buildings already\ - exist in the city, they will have no effect and can be sold. \n\ + exist in the city, they have no effect and can be sold. \n\ "), _(" -In all cities with a Hydro Plant, Hoover Dam increases their +20% production\ - bonus for each Factory and Mfg. Plant to +27%. (In other words, it increases\ - the production bonus on your Hydro Plants by +35%.) \n\ +Hoover Dam increases the production bonus of all Hydro Plants in all\ + your cities to +30%, the same as a Nuclear Plant. The increase does NOT\ + contribute to pollution. \n\ "), _(" -➤ In the city with Hoover Dam, the above bonuses make for a combined +154%\ - production bonus, and a 50% decrease in pollution from production. \n\ +➤ In the city with Hoover Dam, the +20% output from Mass Production\ + is received without needing that tech. The total of all combined\ + production bonuses is +160%. \n\ "), _("\ -Hoover Dam reduces the cost of other Hydro Plants by 5 shields. The\ +Hoover Dam reduces the cost of Hydro Plants by 5 shields. The\ excess power from Hoover Dam is so great that in its home city, it\ supports up to 15 free upkeep for other buildings!\ "), _(" @@ -2006,7 +2051,7 @@ graphic_alt = "-" obsolete_by = { "type", "name", "range" } -build_cost = 230 +build_cost = 275 upkeep = 0 sabotage = 0 sound = "w_seti_program" @@ -2042,7 +2087,7 @@ sound = "w_king_richards_crusade" sound_alt = "w_generic" helptext = _("\ In the city where it’s built, adds one extra shield resource on every\ - tile and lets you build one extra infantry unit per turn —— without\ + tile and lets you build one extra multislot unit per turn —— without\ Conscription tech.\ Obsolete by:Robotics.\ ") @@ -2059,7 +2104,6 @@ graphic = "b.leonardos_workshop" graphic_alt = "-" obsolete_by = { "type", "name", "range" - "Tech", "Automobile", "Player" } build_cost = 300 upkeep = 0 @@ -2067,8 +2111,9 @@ sabotage = 0 sound = "w_leonardos_workshop" sound_alt = "w_generic" helptext = _("\ -Upgrades two obsolete units per game turn. Obsolete by:\ - Automobile.\ +Upgrades two obsolete units per turn until the discovery of\ + Robotics or Rocketry, after which it upgrades 1 obsolete unit\ + per turn. This wonder is never obsolete.\ ") [building_lighthouse] @@ -2077,6 +2122,7 @@ genus = "SmallWonder" reqs = { "type", "name", "range", "present", "quiet" "Tech", "Map Making", "Player", TRUE, FALSE + "Tech", "Electricity","Player", FALSE, FALSE "TerrainClass", "Oceanic", "Adjacent", TRUE, FALSE "Building", "Lighthouse", "Player", FALSE, TRUE } @@ -2084,7 +2130,6 @@ graphic = "b.lighthouse" graphic_alt = "-" obsolete_by = { "type", "name", "range" - "Tech", "Miniaturization", "Player" } build_cost = 170 upkeep = 0 @@ -2092,9 +2137,13 @@ sabotage = 0 sound = "w_lighthouse" sound_alt = "w_generic" helptext = _("\ -Gives all your sea units 2 additional movement points,\ - while increasing their vision. Must be built adjacent\ - to Ocean. Obsolete by:Miniaturization.\ +The Lighthouse gives all your sea units +2 movement points\ + and increases their vision. It must be built in a city adjacent\ + to Ocean before the discovery of Electricity.\n\n\ +The Lighthouse movement bonus reduces to +1 when combined with\ + any bonus from Magellan or Nuclear Power technology.\n\ +Damaged sea units which stay in town for one full turn without moving\ + are completely restored. The Lighthouse is never obsolete.\ ") [building_magellans_expedition] @@ -2119,7 +2168,10 @@ sound_alt = "w_generic" helptext = _("\ All your new sea units built in cities in your nation start with an\ additional veteran level (this is cumulative with any Port Facility.)\ - Must be built in a coastal city. This wonder is never obsolete.\ + Must be built in a coastal city. Gives +1 move bonus to sea vessels\ + (but does not add to Lighthouse.) Damaged sea units\ + which stay in town for one full turn without moving are completely\ + restored. This wonder is never obsolete.\ ") [building_magna_carta] @@ -2147,9 +2199,9 @@ If you are a Monarchy, the Magna Carta establishes Constitutional Monarchy.\ Constitutional Monarchy summary:\n\ ➣ Empire base size goes from 11 to 23 (identical to +1 content citizen.) \n\ ➣ All Land tiles get celebration bonus for free. (+1 trade) \n\ - ➣ Allows rapture in cities founded by you. \n\ + ➣ Allows your cities to rapture. See manual for Constitutional Monarchy. \n\ ➣ Magna Carta city can build Peasants. \n\ - ➣ Magna Carta city can build an extra infantry or Peasant per turn, without Conscription. \n\ + ➣ Magna Carta city can build 1 extra multislot unit per turn, without Conscription. \n\ "), _(" Setbacks from standard Monarchy:\n\ ➣ One unit may be used for Martial Law (not 3). \n\ @@ -2242,6 +2294,7 @@ The Mausoleum brings prudence to your nation. \n\ • Having both also adds +1 happy citizen. \n\ ➤ Acts like half a Courthouse in cities with no Courthouse: \n\ • 30% corruption reduction \n\ + • If there is any corruption at all, it’s reduced by a minimum of 1. \n\ • Tile output penalty lifted +1 in Anarchy, Despotism \n\ • 10% bonus vs hostile diplomats \n\ ➤ Your units cost 35% more to bribe. \n\ @@ -2298,7 +2351,7 @@ sabotage = 0 sound = "w_michelangelos_chapel" sound_alt = "w_generic" helptext = _("\ -This Wonder counts as a Cathedral in all cities which lack one.\ +This Wonder gives the primary effect of a Cathedral to all cities which lack one.\ That is, it makes 3 unhappy citizens content in each city,\ but does not affect citizens unhappy about military activity.\ (Theology increases the effect by +1. Communist government\ @@ -2416,13 +2469,40 @@ Obsolete by: Theocracy, or 13 turns after built. \n\ alter this wonder’s effects in specific games.)\ ") +[building_propaganda_ministry] +name = _("Propaganda Ministry") +genus = "SmallWonder" +reqs = + { "type", "name", "range", "present", "quiet" + "Tech", "Communism", "Player", TRUE, FALSE + "Building", "Propaganda Ministry", "Player", FALSE, TRUE + } +graphic = "b.propaganda_ministry" +graphic_alt = "-" +obsolete_by = + { "type", "name", "range" + } +build_cost = 200 +upkeep = 0 +sabotage = 0 +sound = "w_pyramids" +sound_alt = "w_generic" +helptext = _("\ +The Propaganda Ministry manages news and public belief toward\ + national solidarity. It also ensures entertainment and cultural\ + gatherings are aligned on message for the populace to love its\ + leadership. The Propagandra Ministry gives every city in\ + authoritarian governments +1 happy and +2 luxury. \n\n\ +This Wonder is never obsolete, but only has an effect in Despotism, Communism,\ + and Nationalism.\ +") + [building_pyramids] name = _("Pyramids") genus = "SmallWonder" reqs = { "type", "name", "range", "present", "quiet" "Tech", "Mathematics", "Player", TRUE, FALSE - "Tech", "Democracy", "Player", FALSE, FALSE "Building", "Pyramids", "Player", FALSE, TRUE } graphic = "b.pyramids" @@ -2430,17 +2510,18 @@ graphic_alt = "-" obsolete_by = { "type", "name", "range" } -build_cost = 200 +build_cost = 180 upkeep = 0 sabotage = 0 sound = "w_pyramids" sound_alt = "w_generic" helptext = _("\ -Every city will gain +25% to its food storage when the city grows\ - or starves. Newly founded cities start with +6 food. In addition,\ - the city with the Pyramids can rapture when celebrating. \n\ -This Wonder is never obsolete, but can only be built before you\ - discover Democracy.\ +The Pyramids are especially effective for non-representative governments. \n\ + Every city gains +5 to grain storage when founded, and +25% to grain\ + storage when it starves or grows from reaching its grain ceiling.\ + Also, the city with the Pyramids can rapture every turn when celebrating\ + — at a 100% rate — regardless of government. \n\ +This Wonder is never obsolete.\ ") [building_roman_colosseum] @@ -2456,7 +2537,7 @@ graphic_alt = "-" obsolete_by = { "type", "name", "range" } -build_cost = 400 +build_cost = 360 upkeep = 0 sabotage = 0 sound = "w_roman_colosseum" @@ -2519,7 +2600,8 @@ helptext = _("\ The Sphinx is said to watch over all citizens to ensure they are good.\ The result is loss of tile corruption penalties on all worked tiles in\ the city it’s built. As a shared work of community art and culture, it\ - adds +1 luxury. In addition, it reduces corruption in the city by half. \n\ + adds +1 luxury. In addition, it reduces corruption in the city by half.\ + (If there is any corruption at all, it’s reduced by a minimum of 1.) \n\ Obsolete by:Philosophy.\ ") @@ -2573,11 +2655,11 @@ sound_alt = "w_generic" helptext = _("\ The powerful Zeus gives order and organization to both city and nation.\ In every city in your nation, this Wonder neutralizes one unhappy\ - citizen caused by military units. (For governments who do not experience\ - discontent from military activity, it simply makes one citizen content.) \n\ + citizen caused by military units. In Monarchies and non-representative\ + government, the Statue of Zeus makes one citizen content. \n\ "), _(" -Before Republic and later governments, the Statue of Zeus increases promotion\ - frequency by one third:\ +Before the discovery of Monotheism or Communism, the Statue of Zeus increases\ + veteran promotion frequency by one third:\ [50,33,20,15]% → [67,44,26,20]% \n\ "), _(" In the city the statue is located, it makes one citizen happy and provides\ @@ -2829,15 +2911,16 @@ sound_alt = "w_generic" helptext = _("\ The Ziggurat gathers all ruling functions of early civilization into one\ wondrous building: \n\n\ -1. If your Palace is in another city: the Ziggurat receives +1 happy citizen;\ - reduces corruption in nearby cities; and RELOCATES the capital production bonus\ - to its city.\n\ -2. Shield output suffers no tile penalties. \n\ -3. The food capacity of the Ziggurat is legendary: it counts as a Granary,\ +1. Shield output suffers no tile penalties. \n\ +2. The food capacity of the Ziggurat is legendary: it counts as a Granary,\ and receives an additional +1 food on the city center. All Settlers in your nation\ have no food upkeep. \n\ -4. The Ziggurat acts as a Temple and a Barracks. \n\ -5. The Ziggurat gives 1.75× defense vs. all attacks, regardless of terrain or attacker. \n\n\ +3. The Ziggurat acts as a Temple and a Barracks. \n\ +4. The Ziggurat gives 1.75× defense vs. all attacks, regardless of terrain or attacker. \n\ +5. If your Palace is in another city:\n + a. The Ziggurat receives +1 happy citizen;\n\ + b. Reduces corruption in nearby cities;\n\ + c. RELOCATES the capital production bonus to its city.\n\n\ The construction of a Granary, Temple, Barracks, Fortifications, or City Walls\ will replace the corresponding Ziggurat effects. \n\n\ Obsolete by:Monarchy or switching from Despotism.\ diff --git a/freeciv/freeciv/data/mp2-dragoon/changelog.txt b/freeciv/freeciv/data/mp2-dragoon/changelog.txt index 78f7dc98f..d26cfd6f7 100644 --- a/freeciv/freeciv/data/mp2-dragoon/changelog.txt +++ b/freeciv/freeciv/data/mp2-dragoon/changelog.txt @@ -7,31 +7,42 @@ Focus goals for MP2-Dragoon ============================= CHANGES ====================== 1. Granary Size, Population Changes: - S2 S3 S4 S5 S6 S7 S8 S9 S10 -MP2C: 20 30 40 50 60 70 70 70 70... -MP2D: 16 23 31 40 50 60 70 71 72... + S2 S3 S4 S5 S6 S7 S8 S9 S10 +MP2C: 20 30 40 50 60 70 70 70 70... +ttg @+2 10 15 20 25 30 35 35 35 35 +pyramid 8 12 15 19 ... +granary -- 8 10 13 +pyr+gran. -- 5 5 7 + +MP2D X2: 15 20 25 31 37 45 53 60 60... +ttg @+2 8 10 13 16 19 22 27 30 30 +pyramid 8 12 15 19 ... +granary -- 8 10 13 +pyr+gran. -- 5 5 7 + This speeds the early game with a tightly controlled -mathematical solution: a needle in a haystack of infinite -other ways to accelerate the foodbox that all have bad side -effects, and skew the proportional balance of all other game -elements. Speeding up the game with foodbox changes has -been done by others for a long time, but these all had -"mathematically diseased side effects". Finally, the -perfect solution is here, with the magic formula! +mathematical solution: a sweet spot to accelerate the foodbox +without bad side effects on the proportional balance of other +game elements. Speeding up the foodbox has been tried by +others for a long time, but with "mathematically diseased side +effects". This simple solution is a magic formula for +preserving the magic of the original classical balance. This change does more than just that. It simultaneously -cures 2 other flaws in the Discrete Mathematics of the foodbox -system. Those flaws heavily discouraged size 3 cities under -Despotism AND discouraged new cities for the last 40% of the -game. +improves 2 flaws in the Discrete Mathematics of the system. +Those flaws heavily discouraged size 3 cities under Despotism, +and discouraged making new cities for the last 40% +of the game. Those phenomena are now softened. +Mathematical processing of 3 other models from X1 to X4, +mildest to extreme, were also balanced. X2 as the middle +was chosen for main default mp2d rules. ============================================================ 2. Mountain Goats (3 1 0) & Hippopotami (3 1 0) ============================================================ -3. Goods available with Pottery and cost 20. 25% recycle -penalty changed to -15%. Besides giving starting Tribesmen -and Caravan something to carry, and being more realistic, -it brings to life the original purpose of this virtual unit -for the early game. The cheaper cost makes this unit more -favorable to early game economics. +3. Goods are now available with Pottery and cost 20. Can now +help build wonders. Recycle penalty reduced to 3 shields. +The tech, cost, wonder, and recycle changes allow Goods to +to fulfill their purpose of enhancing early game depth and +richness. ============================================================ 4. "Advisor" for buildings suggests an order similar to an experienced player, instead of alphabetic. @@ -40,7 +51,7 @@ favorable to early game economics. unhappiness. (Units with 0 Attack do not cause unhappy) ============================================================ 6. Under Despotism, All new cities get +2 food when - founded (+4 for capital). + founded (+4 for capital). This stacks with Pyramids. ... Scarcity and hard survivalism both under despotism and resourcefulness of nomadic ways, resulted in people @@ -51,15 +62,19 @@ favorable to early game economics. Gradually people will wake up into realising a multiplicity of Bronze Age diversity exists. ============================================================ -7. With Pyramids, cities start with +6 food. (Was 5 in MP2C). - 6/16 rather than 5/20 compensates the increase in cost and - science requirements. Pyramid strategies will be more - non-conformist, rare, and more of a commitment, but also - more interesting. Pyramids must be built before - discovering Democracy. +7. With Pyramids, cities start with 33% or +5 food for 5/15. + (MP2C was: 25% or 5/20.). + This compensates the increase in Pyramids cost and the + higher science requirements. Pyramid strategies will be + more interesting. + Cost: 180 (was 200) + Gives its city a rapture rate of 100% regardless of gov. ============================================================ 8. Partisans can investigate conquered cities not owned - by the original owner. + by the original owner. Partisans join the sentry always + class of units. Partisans gain +2/9 moves per veteran + level. Partisans also gain whatever vet level effects + are operative from Barracks or wonders (all rulesets). ============================================================ 9. Ziggurat was least popular Tribe Wonder: @@ -67,7 +82,7 @@ favorable to early game economics. NOW: * shield output has no tile penalties * +1 food on city centre, Settlers have no food upkeep - *no longer requires river + * no longer requires river ============================================================= 10. Riflemen and Alpines upgrade to Ground Troops * cost is only 4 gold. @@ -78,23 +93,35 @@ favorable to early game economics. same as a temple. ============================================================= 12. Hills Vision - like mountains, hills give half the vision bonus of mountains; - a smaller bonus that fills out corners of radius rather than - extend a full tile. (sees 4 more tiles instead of 8) + hills give half the vision bonus of mountains; + (sees 4 more tiles instead of 8 [corner tiles] ============================================================= 13. Agoge reduces Phalanx price 3 shields. - Counts as a Barracks in its home city. - increases chance of veteran promotion 50% for phalanxes - (this is not +50% odds, it's +50% frequency) + Counts as a Barracks in its home city. + +1 move bonus for starting turn in city now applies to + all cities, not just Agoge city. + Increases chance of veteran promotion 50% for phalanxes + (this is not +50% odds, it's +50% frequency), i.e: + 50 33 20 15 becomes 75 50 30 22 + Agoge + Barracks in a city allows making hardened Phalanxes ============================================================= -14. New cities get a +2 nomad food bonus in Despotism. Stacks - with Pyramids. Capital city gets 2x nomad food bonus on - founding. (+4) +14. Techs and Costs: + Monotheism 300 (384), Theology 400 (600), Theocracy 500 (725) + Invention 490 (468), Democracy 950 (875), Banking 475 (364) + Medicine 475 (468) Ironworking 65 (80). Philosophy 325 (276) + Navigation 500 (485). University 450 (415). + Chemistry 900 (800) + Astronomy, Feudalism, Trade, Republic 150 (145) + + Misc techs rounded to clean numbers. + Philosophy now gives a 70% blueprint instead of a full tech. ============================================================= -15. Explorer renamed to Scout. Available with Horseback Riding, - moves 4 tiles (6 with Map Making, which then makes it identical - to previous Explorer. Cost reduced 2 shields, same as - Horsemen.) +15. Explorer changed to Scout. Available with Horseback Riding, + moves 4 tiles (6 with Map Making, which makes it identical + to the Explorer.) Cost reduced 2 shields to be the same + as Horsemen. Gains +2/9 move per veteran level. + Gain same vet bonuses as are given Horsemen, by buildings + and wonders. ============================================================= 16. QUAY upgrades a. Quay-to-Road and Road-to-Quay uses 2/3 move point. (was 1/3, 3/3) @@ -105,28 +132,25 @@ favorable to early game economics. A new server feature simplifies this. ============================================================= 17. Ecclesiastical Palace, cost:70 (was 90). (same as Palace) +allows instant transition to Theocracy. ============================================================= -18. Zeus promotion bonus simplified: instead of The Republic - tech turning it off, it's having Republic government - (or any later government) that turns off the bonus. - This would allows monarchies and despotism to pursue - Banking without the Statue losing its "pre-Republic bonus - effect." +18. Zeus promotion bonus changed: instead of The Republic + tech turning it off, it's Monotheism or Communism that + turns off the bonus. The two different "make content" + bonuses were clarified. ============================================================= -19. Adam Smith wonder adjusted back to 300 gold; the former +19. Adam Smith wonder adjusted back to 300 cost; the former cost increase had been implemented before the WYSIWYG upgrade, which now makes this wonder less OP and no longer justifying the cost increase. ============================================================= -20. Legion price adjust 31 (was 32) - got 10% discount like - all other units, off classic price, but was overpriced in - classic. should be 36 or 37 with 20% reduction giving 29-30 - in cost. Legion's extra abilities worth +1 shield from - that. +20. Legion price adjust 30 (was 32) - got 20% discount like + all other foot units, off the classic price, but it was + overpriced in classic. ============================================================= 21. Hideouts temporary patch requirement for unit to be alone - was fixed after a bug fig no longer requires this. + was fixed after a bug fix no longer requires this. ============================================================= 22. Tile Claims Fixed a bug where tile claims were only cardinally adjacent @@ -136,8 +160,10 @@ favorable to early game economics. Conflict where Tile Claim can't be made in a base, was fixed. ============================================================= -23. New tech tiers allow making Magnetism a pre-req for - Steam Engine ..... FINALLY !!!! +23. University Pre-req for Steam Engine changed to + Magnetism. In most cases this will mean Frigates now + come two techs before Ironclads; rather than possibly + after. ============================================================= 24. No sea commerce units cause unhappiness, for consistency and simplification. @@ -147,11 +173,562 @@ favorable to early game economics. 26. Nationalism is +20% sci in original cities balances that -15% is global for lux ============================================================= -27. Clarification: AAA are infantry as considered part of +27. Clarification: AAA are considered as part of Marine corps land/air/sea. Thus, have gold upkeep not - shield upkeep. + shield upkeep. They are not multislot however. +============================================================= +28. Zeppelin 7 moves, 7 turns of fuel. More realistic and + provides more possible use for this special unit. +============================================================= +29. Fixed bug (also mp2c) where Airplane was not counted + as non-military and couldn't do diplomatic missions + to nations with whom you're at peace. +============================================================= +30. Jet fighter types, upgrades +Were underpowered relative to other units. + +A:D ratio of jets:mech.inf is now only slightly less than +A:D fighters:alpines (was substantially less, at a time when + SAM Battery becomes available to make it even worse.) + +Stealth Fighter + A9 D6 Cost:85 was A8 D4. +Jet Fighter + A7 D6, was A6 D5. (better defender than escort fighter) +Ground Strike Fighter + A8 D5, was A7 D4 + +Multirole Fighter, upgrades Escort Fighter + A6 D7 two turns fuel. Cost: 90 + Range fighter +============================================================= +31. Rapture Rate is here. Allows most govs to participate in + it at different rates; which allows finer balancing of + the govs to make them more usable and interesting. + +Not original +----------------- +C.Monarchy 25 25 25 25 25 25 25 60 +Republic 33 33 33 33 33 33 33 80 +Democracy 25 25 25 25 25 50 100 100 +Nationalism 33 33 33 33 33 33 33 67 +Theocracy 40 40 40 40 40 40 40 40 * (57.2% with cathedral) +Communism 40 40 40 40 40 40 40 40 + +Original w/ Foreign +----------------- +C.Monarchy 80 80 80 80 80 80 80 80 +Republic 90 90 90 90 90 90 90 90 +Democracy 25 25 25 25 25 50 100 100 +Nationalism 50 50 50 50 50 50 50 100 +Theocracy 40 40 40 40 40 40 40 40 * (57.2% with cathedral) +Communism 40 40 40 40 40 40 40 40 ============================================================= -28. Zepplein 5 turns of fuel: more realistic and provides - more possible use for this special unit. +32. Terrain Walls - The Great Wall wonder allows +one to build walls right on the map. The terrain properties +are: +1. Takes one turn to build. +2. Takes four turns to pillage. +3. Can't be built on a Base, River, or Canal +4. Non-allied units lose all move points moving onto a wall, +and lose all move points moving off of a wall +5. Enemy units who are on a non-allied wall tile and have +no moves left, are considered as 'attempting to scale the +wall' and in a vulnerable state, and have a -50% defense +while caught on the wall with no moves left. +6. Allied units on a wall are considered fortified for free, +even if not in a fortified state. ============================================================= +33. SentryAlways + scout, balloon, zeppelin, e.fighter, m.fighter, + partisan, awacs, spy plane, satellite +============================================================= +34. Destroy City - Massacre a city (gives global casus belli) +Requires 2 units on tile, actor must be capturer-type. +Foreign city: destroyer gov mustn't be Demo, Theo; +city size 2-8; +Domestic city: only avail to Despo, Commie; +15% foreign, must use (D)o command. size 1-8; +============================================================== +35. Huts can now also give: + * Small bulb awards (1-5 bulbs). + * a Boat (if on a river) + * Goods (if discovered by a unit who can carry Goods) + * A map of the surrounding area (14 tile diameter) +============================================================== +36. Nomadism / Early game balance bonuses +During the first 5 turns, each Settler gets 1 bulb/turn; this +represents the fact that nomads can learn things too, and +causes less penalty for players in bad starting position +who must migrate to decent starting position. +============================================================== +37. Boats 8hp - Triremes and Warriors can beat them; similar + to what was done with Workers/Tribesmen. +============================================================== +38. DUPLICATE OF 32. Terrain Walls are available to be made for any nation + who owns The Great Wall. To build them you must select + Tile Target with the (D)o command. Features: non-allied + units lose all moves when entering or exiting a tile with + walls. Domestic units get a free fortify bonus on walls, + which stacks with real fortification. Foreign units who + are caught on walls with no move points left get a -50% + defense penalty. Can't be built on Mountains, Rivers, Bases. + Be careful, pillage time is 4 turns. +============================================================== +39. Theocracy spawns Zealots instead of Partisans +============================================================== +40. Wild Animal hunting now gives food (for edible types). +/set animals >0 +============================================================== +41. Mobile SAM gets 2x defense against Missile units, + and can now carry two missiles. +42. Armor II bonus vs. Missiles cut to 50% was (100% i.e. 2x) +this buffs the little used Mobile SAM to more usefulness in +tactical operations and nerfs the Armor II which was getting +too much use as an anti-cruise missile defender unit instead +of its intended purpose. +============================================================== +43. EFT_REHOME_PCT alters the likelihood of units disbanding + from conquered/razed cities based on gov type. + Despotism:15,Monarchy:30,CM/Comm:45,Repub/Natl:60, + Demo:75,Theo:90 +============================================================== +44. Angkor Wat reduces city celebration from 3 to 2. + Angkor Wat now also works for Theocracy government. +============================================================== +45.Lighthouse never obsolete, but must be built before + Electricity. Movement bonus reduces to +1 when combined + with Nuclear Power bonus. Magellan gives +1 move to + nations who don't have Lighthouse. +============================================================== +46. Citadel of Aleppo - 3x defense impervious to ballistic + units and siege ram. Allows each nation to make one + special fortress city with the same strength as old + city walls, to feel safe about it. Cost:120 +============================================================== +47. Ballista unit - +============================================================== +48. Chand Baori - cost 65 (was 80) +============================================================== +49. Diplomatic Units + Emissary - early diplomat, costs 24 (was 26), cannot sabotage cities, moves 3 + Diplomat - req:Economics, costs 30 (was 26), can establish embassy without spent + Spy - can no longer establish embassy. Emissaries upgrade to Diplomats for free. + + Results: + (1) Reduced cost with less speed and ability to sabotage, + is more appreciated for early game use and balance. + (2) Siege Ram needed for taking out city walls, makes the + unit more purposeful. + (3) Ability to establish multiple embassies for slightly + higher cost, is more appreciated around the time the + Diplomat now becomes availiable; improves globalness + of the game. + (4) Inability for Spy to make hostile embassy (especially + having 6 moves), repurposes the unit better for + espionage, decreases OPness, and increases game + depth and intrigue in having multiple types of + diplomatic units. +============================================================== +50. Corruption reducing buildings and wonders will always be +guaranteed to reduce at least 1 corruption (if there is any). +This finally solves an age-old freeciv problem that came from +"double-truncation-rounding" error, which made corruption +reduction nearly worthless in small despotism cities +or medium monarchy cities; yet these are the exact contexts +when corruption loss as a percentage of GDP are at their +worst and when the game can greatly benefit by an improvement +to help with corruption. +Courthouse, Palace, Ecclesiastical Palace, Sphinx, Ziggurat, +Supreme Court, and Mausoleum of Mausolos will all reduce +a minimum of 1 corruption, if there is any corruption. +============================================================== +51. JTIDS cost 275 (was 230). +============================================================== +52. AAA need 9 turns of service + 3 turns to convert to M.Sam + (was 10 + 4). +============================================================== +53. Small balance adjust to early starting techs, gives micro- +expansion of early bronze age strategic pathways, decreases +new-gov rush slightly. Most techs go to 22, masonry and +bronze working go to 20. +============================================================== +54. Theology gives blueprints for Theocracy. +============================================================== +55. Theocracies can make the Patriarch unique unit, which is a +diplomatic unit that bribes and incites at 1/3 the cost. +============================================================== +56. Zealots can change home city to a foreign ally who is + Theocratic. This allows more fluid strategies of bringing + all Zealots to fight together under the same command, and + even for former Theocracies to re-home Zealots into allied + Theocracies in order to avoid the double-unhappiness + upkeep which Zealots suffer when not under Theocracy. +============================================================== +57. Theocracy can incite other cities at a 33% discount. +============================================================== +58. Crew Repair simplified: every type of ship gets 10% repair: +i.e., effectively +1 hp more than previously: providing a +slight buff to ship durability and usability, and bringing the +successfully tested crew repair to the ancient (wooden ships) +This combines with improved Lighthouse/Nuclear Power effects. +============================================================== +59. req #2 for Gunpowder changed from Iron Working to +Feudalism (which needs Iron Working anyway)...fixes some +issues with tech tree flow. +============================================================== +60. Theocracy corruption changed from 2% + 2% per tile to + 0% + 1% per tile. +============================================================== +61. Theocracy gets a free +1 happy per city. +============================================================== +62. Police Station does +2 forced content under authoritarian + govs. No longer does +1 make_content_mil under nationalism +============================================================== +63. No stack death takes place on ruins. Undocumented effect + that hideouts don't disappear in ruins is now documented. +============================================================== +64. Homeland Security prevents Poison City from taking place. +============================================================== +65. Communism: celebrating cities with granaries get +1 food +to city tile. +============================================================== +66. City Walls are 2x defense like all other defense-types. +Fixes a confusion where 3x was wrongly attributed because it +was customary to consider City Walls as 3x because the free- +fortify bonus of 1.5x means the total bonus of defenders in +cities with walls was 3x. However, this resulted in the +free-fortify bonus being multiplied twice for units in +cities with walls, creating 4.5x. The result of this mistake +made some dramatic changes to gameplay: +-the ability to rapid-buy walls in an emergency for chokepoint +cities for 4.5x instead of 3x meant the game became skewed to +not needing to buy as many military units, and thus +more heavily economic until post-gunpowder heavy +weaponry was discovered. +-greatly force-multiplied the strategic dynamics of +"playing sim city while gunpowder rushing" +-took away from bronze age and iron age warfare +-made the game heavily "aerocentric" since SAM Batteries +are only 2x defense (instead of 4.5x); this resulted in: +-"flight rushing" being force multiplied more than it should +-the "chess tactics" of ground warfare, zoc, positional +warfare, etc., being greatly reduced. +-land conquest and control of non-city terrestrial positions +and borders were greatly reduced and replaced with a game of +"city pounding" +-disrupted tactical integrity of the game. +============================================================== +67. City Fortifications cleaned and simplified. +Simply adds +0.33 to the terrain defense bonus +(+0.50 for Flatland). Gets same +10 cost increase as +City walls, after metallurgy. All other iffy conditionals +cleaned out and removed. +============================================================== +68. All Ballistic type units can now SUA iff they haven't +moved; are also able to SUA against oceanic tiles (if not +trasported.) +============================================================== +69. Most ships gain +1 move. Adjusts a discrepancy between +their speed and that of corresponding land units using roads. +Ships to not gain +1 = Trireme, Longboat, Ram Ship, Transport +Frigate gets +2 (had received a +1 adjustment prior to all +ships getting a general +1). This changes also lessens +the "molasses effect" in island games, where all sea-based +operations are excessively slower than land operations. +============================================================== +70. Shore attacks for modern ships changed: + • Battle will last 20 combat rounds, which may or may not result + in a victor. + • Chance of attacker promotion is half frequency: 2 battles + required for same chance of promotion as 1 sea battle. + • Firepower is reduced to 1. Attack strength is increased +33% + * Overall effect is -33% reduction in attack strength, less + chance of promotion, less chance of fatality for either + combatant, but generally in spite of this, more effective + and tactically usable with more frequency in more + contextual situations. +============================================================== +71. Bunkers have 90% chance to resist nuclear detonation. +i.e., units inside won't die. +============================================================== +72. All ships gain +1 to their minimum speed when damaged: +Boat, Trireme, Riverships: 3 (was 2) +Submarines: 5 (was 4) +all other Sea Units: 4 (was 3) +============================================================== +73. If ending turn in a city and not qualified for any other +healing effect, a minimum +1 hp healing takes place. (e.g., +no healing from barracks, being fortified, +1/3hp for staying +1 turn in city and not moving, or +10% for being on a tile +and not moving for a whole turn.) +============================================================== +74. Default blueprints is 65 (was 70) + Default techleak is 50 (was 40) +Slight penalty for "technology gangs" and slightly more help +for those not in one. Note the slightly more bulbs needed +at 65% blueprint is somewhat lessened by higher techleak. +============================================================== +75. Latejoin gold is 14/turn instead of 13, as early game is +somewhat faster in mp2d +============================================================== +76. Capture and Expel both cost 2/3 move. (Was 1, 2/3) +============================================================== +77. Fishtraps become available with Refrigeration technology. + A Fishtrap provides +2 food to its tile. Any Fish adjacent to + the tile will be raised to +6 food output and gain +1 trade. + Fishtraps must be made adjacent to Fish, but cannot be made + cardinally adjacent to each other. Nor can they be built + directly on a tile with Fish, Whales, or a Buoy. +============================================================== +78. Except for Aircraft, Missiles, and Marines: +* the move cost to Deboard and Board is 1/3, likewise a Transport + doing Load or Unload causes 1/3 move cost to all the units which + that command causes to Deboard or Board. +* the requirement to be able to Board (or Load a unit) is the + cargo must have remaining moves left. This is not the case + for Deboard/Unload (it lets a unit who spent its moves + boarding, safely land at destination and transport to move + on to other things.) + +All the above is the current evolution of "balanced compromise" +to (1) reducing "double move" phenomena using mulitple load/unload +on multiple transports, while (2) at same time not excessively +slowing the longturn pace and aggravating the already +cumbersome transport logistics. +============================================================== +79. Techleak, when tallying the total number of players vs. +the number of players having a tech: doesn't count dead +players, Barbarian players, NewAvailablePlayers, and players +who are idle 5 or more turns. +============================================================== +80. MagLevs can only be built wherever railroads may be built, +(i.e. Road and SeaBridge). A railroad is not required. They +can't be built on ocean (unless SeaBridge.) Railroads take +1.5 worker-turns to complete, not 2; this can assist +economic pace in some cases of never vet Workers and work +bonuses. +============================================================== +82. Copernicus costs 90 (was 100). +============================================================== +83. Trawlers are work-boats that can do Fishtraps, Buoys, + Roads, Quays, Canals, Sea Bridges, & clean pollution/fallout. + Trawlers can carry one Land unit, usually Engineers or + Workers, to expedite their water work. Trawlers can tow ships + who haven't moved, but at a reduced rate of -3 move points. + Towing gets damaged ships back to port for repair and helps + crew repair rates if the damaged is resting while towed. If + a Trawler stops towing it recovers pro-rated move points. +============================================================== +84. New feature, cargo on some types of transports is openly +visible. Current test case are Wagons and Trawlers. +============================================================== +85. Battleships get same vision radius as Cruiser. +============================================================== +86. Freight can use multiple build slots, like Infantry. +============================================================== +87. Boarding a transport requires having moves left. This +works in conjunction with the 1/3 move cost of boarding/deboarding +for a limiting factor on double moving and transporter-swapping +============================================================== +88. Ballistic sub-class of units can vigil if in a city or +base of any type. They auto-bombard instead of auto-attack, +based on if they have a higher probability of winning a +standard attack. Unlike air interception, they only target +non-civilian military units. +This relieves some issues vis-a-vis unfair camping advantages, +by letting people who aren't on all the time to set up +retaliatory defense structures in some areas. Also gives +is a balance adjustment for weaker city walls. +============================================================== +89. New unit Magnum Turret, unique unit. +============================================================== +90. Communism gets +40% capital prod bonus +============================================================== +91. New wonder: Commissariat of Agriculture: +5 starting food +in each city. Work-rate for Farmland is 2 worker-turns, not 3. ++10% gross food output per city. +============================================================== +92. Communist cities get the effects of a free Supermarket. +============================================================== +93. Leonardo's Workshop is now never obsolete, but the +discovery of Robotics or Rocketry reduces the effect to 1 +upgrade turn. Reasons: more quantitative easing on upgrade +retadation syndrome; reduce overly strong penalties on +discovery of automobile. +============================================================== +95. Communism completely unaffected by empire size/# cities +(was 12, then none) +============================================================== +96. Communism +1 trade on irrigated tiles that produce trade. +============================================================== +97. Monarchy, CM, Theocracy: 1 free gold upkeep on units. +Communism: 3 free gold upkeep on units. +============================================================== +98. Colosseum costs 360 +============================================================== +99. New wonder: Propaganda Ministry, +1 happy +2 lux for +authoritarian governments. +============================================================== +100. FORMERLY: courthouse/homeland/police/theocracy blocked +diplomats from hostile embassy (needs ceasefire/peace first); +only police station/theocracy blocked hostile spies. +NOW: courthouse/homeland/police/theo blocks emissary and diplo; +only police/theo blocks diplo who has espionage tech +============================================================== +101.Helicopters types gain half hp first turn arriving and +staying in city: (hp is "half" like a kind of fuel, and "half" +the amount of damage it got.) This rightly sets healing to 1 turn +for short sortie, 2 turns for damaged <50%, and 3 turns for badly +damaged if there's no airport. +============================================================== +102.Abilities of Marines and AAA were cleaned up and clarified +in better documentation. +============================================================== +103.Ecclesiastical Palace allows instant switching to +Theocracy with no anarchy or revolution delay (if you have +Theocracy) +============================================================== +104.Combustion increases pollution 25% instead of Automobile: +the Leo/Sun Tzu/Colossus/Barracks II/Pollution quintuple +penalty was too excessive and one-pathed tech strategies. +============================================================== +105. Mass Transit moved to Combustion : realism, balance, and +playability. (Allow pollution reduction on the second pop. +polluting effect instead of third). +============================================================== +106. Freight moved to the Corporation - allows earlier use +of Freight advantages at a time when they're more appropriate, +during the difficult ramp up of industrial revolution. Also, +the bonuses of the unit suit the represented technology. +============================================================== +107.Truck moved to Automobile, for obvious reasons, but also, +this unit is quite powerful and was available too early +(too hard to make wonders at this stage, allowed Marines on +Trucks to make Cavalry less meaningful.) +============================================================== +108.Power Plants, all are +30%, and +20% with Mass Prod. +Nuclear remains at +60% (automatic since one has Mass Prod.) +Hydro Upkeep reduced from 3 to 2. Hoover makes all Hydros +act like Nuclear but still producing no extra pollution. +============================================================== +109.No stack death in hideouts; this helps give the hideout +more parity as a strategic option, compared to a Fort. Too +often, people wanting to make hideouts did not choose them +because stack death made it always a worse choice than a fort +which has a bonus defense AND no stack death. +============================================================== +110.Missile carrying ships -- changes: +AEGIS can carry 5 (was 2) +Missile Destroyer can carry 2 (was 1) +Submarine can carry 0 (was 8) +Missile Submarine can carry 4 (new unit!) +============================================================== +111.Lighthouse and Magellan's Expedition get the Port Facility +effect of healing ships which stay in town for one full turn. +============================================================== +112.Submarine class loses 1 less move point than other units when +attacking and succeeding. Submarine unit can no longer carry +missiles... +============================================================== +113.New unit Missile Submarine...can carry missiles and do +"deep dive". 2 more hp and better defense also. +============================================================== +114. Cities go from 5x5 without corners to +5x5 with corners, at size 21. +7x7 without corners, at size 30. +This is experimental feature to gradually progress to managing +fewer, but larger, cities. In addition it will help some +cities reach their potential by getting more ocean later. +============================================================== +115.Caravan can carry 3 goods/freight +============================================================== +116.Crusaders defend at 1.5 +============================================================== +117. Knights simplified to D2 with D3 vs mounted. +============================================================== +118. Armor unit changes (the units were a little underpowered) +Armor I: A10 goes to A11 +Armor I & II: Each unit gains 40% odds of Stack-Escape when +its stack is killed +============================================================== +119. Tech changes + +Labor Union, name changed to Mechanization +Mass Production,Machine Tools(was:Guerilla Warfare) + +Computers +Mechanization(was:Mass Prod), Radio(was:Miniaturization) +tech is now a 3x cost tech to solve some balance playability +1. too easy to ignore earlier techs and unrealistically race to a "killer" +2. late game tech pace accelerated too fast out of WW2 era and players didn't +even complete WW2 techs before having rockets and jet fighters and such. +3.could slightly de-pressurise the arms race to WW3 tech +4.JTIDS which is to give infantry greater power vis-a-vis stronger +WW3 era units and loss of Sun Tzu, was being obtained prior to even +having Flight, Mobile Warfare, etc. + +Avionics +Rocketry, Computers + +Combined Arms +Advanced Flight, Computers(was:Mobile Warfare) +all ww3 techs require Computers as the expensive breakthrough + +Radar +Advanced Flight, Mechanization(was:Electronics) +more expensive second req balances availability of Strategic Bomber +one tech sooner. (it was available "too late" in WW3 era which one +could nevertheless enter too soon.) + +Radio +Flight, Miniaturization (was Flight only) +ups the cost to getting planes available one tech level sooner + +Rocketry +Radar, Computers(was:Miniaturization) +all ww3 techs require Computers as the expensive breakthrough + +Space Flight +Rocketry,Nuclear Power (was:Computers) +Rocketry already has Computers as a req. +all ww3 techs require Computers as the expensive breakthrough +============================================================== +120. max_attacks per turn +Fighter, Escort Fighter: 2 +Dive Bomber, Medium Bomber, Heavy Bomber: 1 +Strategic Bomber, Jet Bomber, 2 +Stealth Bomber, 3 + +new unit Bomb + +new carry capacities +Med.Bomber 1 +============================================================== +121. Buoys report nearby visible activity like a sentry, and + are even able to see enemy submarines, if cardinally adjacent. +============================================================== +122.Frigates and Galleons can't attack Subs +============================================================== +123.Missiles must be loaded on transports: +(a) in a city, or (b) as cargo from one transport to another +on the same tile, (c) so-called parachute-catch-delivery, +where a missile floating at TC auto-returns to the nearest +unit who can carry it +============================================================== +124.chance of razed building goes from 1/5 to 1/7 (20>14) +anarchy,despotism,communism conquerors have +50% (21%) +democracy,theocracy conquerors have -50% (7%) +liberating your own city reduces it by -50% + normal: 7%, anarchy/despotism/commie: 14%, demo/theo: 0% +certain buildings have a reduced chance of razing: +amphitheatre,aqueduct,cathedral,granary,harbor,marketplace, +hydro plant,sewer,supermarket,temple,totem pole +============================================================== +125. +============================================================== +126. +============================================================== +127. +============================================================== diff --git a/freeciv/freeciv/data/mp2-dragoon/changelog2.txt b/freeciv/freeciv/data/mp2-dragoon/changelog2.txt new file mode 100644 index 000000000..8efa48252 --- /dev/null +++ b/freeciv/freeciv/data/mp2-dragoon/changelog2.txt @@ -0,0 +1,775 @@ +Brief Explanations of goals and challenges. + Simplicity vs. Complexity. + + What motivates Ruleset additions + +Focus goals for MP2-Dragoon + Simplify unnecessary complexities. + Boost early game action, growth. + Rebalance governments, mostly through finer mathematical control of population growth. + Project Neptune, improve sea. + +I. Simplification: +================================================================================================================ +1. Goods are now available with Pottery and cost 20. Can now +help build wonders. Recycle penalty reduced to 3 shields. +The tech, cost, wonder, and recycle changes allow Goods to +to fulfill their purpose of enhancing early game depth and +richness. +============================================================ +2. "Advisor" for buildings suggests an order similar to + an experienced player, instead of alphabetic. +============================================================ +3. QUAY upgrades + a. Quay-to-Road and Road-to-Quay uses 2/3 move point. (was 1/3, 3/3) + b. Exiting a city with a quay remains 1/3 move point (was 1/3) + c. Time to build Quay is now 1 worker-turn: encourage ancient river importance. + d. Exiting quay now being 2/3 instead of 1/3 or 1/9 (rail), reduces territorial + risk of making quays, somewhat. + A new server feature simplifies this. +============================================================= +4. No sea commerce units cause unhappiness, for consistency + and simplification. +============================================================= +5. City Walls are 2x defense like all other defense-types. +Fixes a confusion where 3x was wrongly attributed because it +was customary to consider City Walls as 3x because the free- +fortify bonus of 1.5x means the total bonus of defenders in +cities with walls was 3x. However, this resulted in the +free-fortify bonus being multiplied twice for units in +cities with walls, creating 4.5x. The result of this mistake +made some dramatic changes to gameplay: +-the ability to rapid-buy walls in an emergency for chokepoint +cities for 4.5x instead of 3x meant the game became skewed to +not needing to buy as many military units, and thus +more heavily economic until post-gunpowder heavy +weaponry was discovered. +-greatly force-multiplied the strategic dynamics of +"playing sim city while gunpowder rushing" +-took away from bronze age and iron age warfare +-made the game heavily "aerocentric" since SAM Batteries +are only 2x defense (instead of 4.5x); this resulted in: +-"flight rushing" being force multiplied more than it should +-the "chess tactics" of ground warfare, zoc, positional +warfare, etc., being greatly reduced. +-land conquest and control of non-city terrestrial positions +and borders were greatly reduced and replaced with a game of +"city pounding" +-disrupted tactical integrity of the game. +============================================================== +6. City Fortifications cleaned and simplified. +Simply adds +0.33 to the terrain defense bonus +(+0.50 for Flatland). Gets same +10 cost increase as +City walls, after Metallurgy. All other iffy conditionals +cleaned out and removed. +============================================================== +7. Capture and Expel both cost 2/3 move. (Was 1, 2/3) + + +II. Early game action +================================================================================================================ +1. Granary Size, Population Changes: + S2 S3 S4 S5 S6 S7 S8 S9 S10 +MP2C: 20 30 40 50 60 70 70 70 70... +ttg @+2 10 15 20 25 30 35 35 35 35 +pyramid 8 12 15 19 ... +granary -- 8 10 13 +pyr+gran. -- 5 5 7 + +MP2D X2: 15 20 25 31 37 45 53 60 60... +ttg @+2 8 10 13 16 19 22 27 30 30 +pyramid 8 12 15 19 ... +granary -- 8 10 13 +pyr+gran. -- 5 5 7 + +This speeds the early game with a tightly controlled +mathematical solution: a sweet spot to accelerate the foodbox +without bad side effects on the proportional balance of other +game elements. Speeding up the foodbox has been tried by +others for a long time, but with "mathematically diseased side +effects". This simple solution is a magic formula for +preserving the magic of the original classical balance. +This change does more than just that. It simultaneously +improves 2 flaws in the Discrete Mathematics of the system. +Those flaws heavily discouraged size 3 cities under Despotism, +and discouraged making new cities for the last 40% +of the game. Those phenomena are now softened. +Mathematical processing of 3 other models from X1 to X4, +mildest to extreme, were also balanced. X2 as the middle +was chosen for main default mp2d rules. + +In addition it continues quantitative balancing for governments +not rapturing. +============================================================ +2. Mountain Goats (3 1 0) & Hippopotami (3 1 0), more food +for early growth, more balance for desert/mountain terrain +============================================================ +3. Under Despotism, All new cities get +2 food when + founded (+4 for capital). + ... + Scarcity and hard survivalism both under despotism and + resourcefulness of nomadic ways, resulted in people + hoarding preserved food sources. + 1. This reduces the early game "slow period" by about 1 turn. + 2. It furthers the project of quantitative easing against the + forcing-effect of "leave Despotism for Monarchy ASAP". + Gradually people will wake up into realising a multiplicity + of Bronze Age diversity exists. +============================================================ +4. With Pyramids, cities start with 33% or +5 food for 5/15. + (MP2C was: 25% or 5/20.). + This compensates the increase in Pyramids cost and the + higher science requirements. Pyramid strategies will be + more interesting. + Cost: 180 (was 200) + Gives its city a rapture rate of 100% regardless of gov. +============================================================ +5. Ziggurat + was least popular Tribe Wonder: + no economic bonus except from relocating capital; + NOW: + * shield output has no tile penalties + * +1 food on city centre, Settlers have no food upkeep + * no longer requires river +============================================================== +6. Nomadism / Early game balance bonuses +During the first 5 turns, each Settler gets 1 bulb/turn; this +represents the fact that nomads can learn things too, and +causes less penalty for players in bad starting position +who must migrate to decent starting position. +============================================================== +7. Latejoin gold is 14/turn instead of 13, as early game is +somewhat faster in mp2d + +III. Rebalance governments, mostly through finer mathematical control of population growth. +================================================================================================================ +1. Rapture Rate is here. Allows most govs to participate in + it at different rates; which allows finer balancing of + the govs to make them more usable and interesting. + +Not original +----------------- +C.Monarchy 25 25 25 25 25 25 25 60 +Republic 33 33 33 33 33 33 33 80 +Democracy 25 25 25 25 25 50 100 100 +Nationalism 33 33 33 33 33 33 33 67 +Theocracy 40 40 40 40 40 40 40 40 * (57.2% with cathedral) +Communism 40 40 40 40 40 40 40 40 + +Original w/ Foreign +----------------- +C.Monarchy 80 80 80 80 80 80 80 80 +Republic 90 90 90 90 90 90 90 90 +Democracy 25 25 25 25 25 50 100 100 +Nationalism 50 50 50 50 50 50 50 100 +Theocracy 40 40 40 40 40 40 40 40 * (57.2% with cathedral) +Communism 40 40 40 40 40 40 40 40 +============================================================== +2. Nationalism is +20% sci in original cities + balances that -15% is global for lux +============================================================== +3. Ecclesiastical Palace, cost:70 (was 90). (same as Palace) + Now allows instant switching to Theocracy with no anarchy + or revolution delay (if you have Theocracy) +============================================================== +4. Theology gives blueprints for Theocracy. +============================================================== +5. Theocracies can make the Patriarch unique unit, which is a +diplomatic unit that bribes and incites at 1/3 the cost. +============================================================== +6. Zealots can change home city to a foreign ally who is + Theocratic. This allows more fluid strategies of bringing + all Zealots to fight together under the same command, and + even for former Theocracies to re-home Zealots into allied + Theocracies in order to avoid the double-unhappiness + upkeep which Zealots suffer when not under Theocracy. +============================================================== +7. Theocracy can incite other cities at a 33% discount. +============================================================== +8. Theocracy corruption changed from 2% + 2% per tile to + 0% + 1% per tile. +============================================================== +9. Theocracy gets a free +1 happy per city. +============================================================== +10. Communism: celebrating cities with granaries get +1 food +to city tile. +============================================================== +11. Communism gets +40% capital prod bonus +============================================================== +12. New wonder: Commissariat of Agriculture: +5 starting food +in each city. Work-rate for Farmland is 2 worker-turns, not 3. ++10% gross food output per city. +============================================================== +13. Communist cities get the effects of a free Supermarket. +============================================================== +14. Communism completely unaffected by empire size/# cities +(was 12, then none) +============================================================== +15. Communism +1 trade on irrigated tiles that produce trade. +============================================================== +16. Police Station does +2 forced content under authoritarian + govs. No longer does +1 make_content_mil under nationalism +============================================================== +17. Angkor Wat reduces city celebration size from 3 to 2. + Angkor Wat now also works for Theocracy government. +============================================================== +18. New wonder: Propaganda Ministry, +1 happy +2 lux for +authoritarian governments. +============================================================== +19. Monarchy, CM, Theocracy: 1 free gold upkeep on units. +Communism: 3 free gold upkeep on units. + + +IV. Units* +================================================================================================================ +1. Partisans can investigate conquered cities not owned + by the original owner. Partisans join the sentry always + class of units. Partisans gain +2/9 moves per veteran + level. Partisans also gain whatever vet level effects + are operative from Barracks or wonders (all rulesets). +============================================================ +2. Riflemen and Alpines upgrade to Ground Troops + * cost is only 4 gold. +============================================================= +3. Explorer changed to Scout. Available with Horseback Riding, + moves 4 tiles (6 with Map Making, which makes it identical + to the Explorer.) Cost reduced 2 shields to be the same + as Horsemen. Gains +2/9 move per veteran level. + Gain same vet bonuses as are given Horsemen, by buildings + and wonders. +============================================================= +4. AAA re-balance and Mobile SAM rebalance/simplify. + ... + * AAA are an integral part of ground infantry forces so + get gold upkeep instead of shield upkeep. Compensates + some losses to this unit: + * In other respects AAA are no longer like Marines who + attack while transported or BeachLander moves, but + are same as any other ballistic unit. Still retain + ability to attack non-native tiles. + * AAA need 9 turns of service + 3 turns to convert to M.Sam + (was 10 + 4). + * Upgrades to Mobile SAM like any other unit (simplicity) +5. Mobile SAM + * Mobile SAMs 2x defense now also against Missile units + * Can now carry two missiles (was 1) + * Can now attack non-native tiles like AAA + * After discovery of Laser, Mobile SAMS provide a 33% chance + of defending all units on their tile from a nuclear blast. + * Mobile SAM convert from AAA in 3 turns after 9 turns of + service and the order can be done in any domestic city. + (was: 10, capital city) +============================================================= +6. Armor II bonus vs. Missiles cut to 50% (was 100% i.e. 2x) +this buffs the little used Mobile SAM to more usefulness in +tactical operations and nerfs the Armor II which was getting +too much use as an anti-cruise missile defender unit instead +of its intended purpose. +7. Zeppelin 7 moves, 7 turns of fuel. More realistic and + provides more possible use for this special unit. +============================================================= +8. Jet fighter types, upgrades +Were underpowered relative to other units. + +A:D ratio of jets:mech.inf is now only slightly less than +A:D fighters:alpines (was substantially less, at a time when + SAM Battery becomes available to make it even worse.) + +Stealth Fighter + A9 D6 Cost:85 was A8 D4. +Jet Fighter + A7 D6, was A6 D5. (better defender than escort fighter) +Ground Strike Fighter + A8 D5, was A7 D4 + +Multirole Fighter, upgrades Escort Fighter + A6 D7 two turns fuel. Cost: 90 + Range fighter +============================================================= +9. SentryAlways + scout, balloon, zeppelin, e.fighter, m.fighter, + partisan, awacs, spy plane, satellite +============================================================== +10. Boats 8hp - Triremes and Warriors can beat them; similar + to what was done with Workers/Tribesmen. +============================================================== +11. Diplomatic Units + Emissary - early diplomat, costs 24 (was 26), cannot sabotage cities, moves 3 + Diplomat - req:Economics, costs 30 (was 26), can establish embassy without spent + Spy - can no longer establish embassy. Emissaries upgrade to Diplomats for free. + + Results: + (1) Reduced cost with less speed and ability to sabotage, + is more appreciated for early game use and balance. + (2) Siege Ram needed for taking out city walls, makes the + unit more purposeful. + (3) Ability to establish multiple embassies for slightly + higher cost, is more appreciated around the time the + Diplomat now becomes availiable; improves globalness + of the game. + (4) Inability for Spy to make hostile embassy (especially + having 6 moves), repurposes the unit better for + espionage, decreases OPness, and increases game + depth and intrigue in having multiple types of + diplomatic units. +============================================================== +12. All Ballistic type units can now SUA iff they haven't +moved; are also able to SUA against oceanic tiles (if not +trasported.) +============================================================== +13. Trawlers are work-boats that can do Fishtraps, Buoys, + Roads, Quays, Canals, Sea Bridges, & clean pollution/fallout. + Trawlers can carry one Land unit, usually Engineers or + Workers, to expedite their water work. Trawlers can tow ships + who haven't moved, but at a reduced rate of -3 move points. + Towing gets damaged ships back to port for repair and helps + crew repair rates if the damaged is resting while towed. If a + Trawler stops towing it recovers pro-rated move points. +============================================================== +14. Ballista unit, new tactical use type of unit +============================================================== +15. Ballistic sub-class of units can vigil if in a city or +base of any type. They auto-bombard instead of auto-attack, +based on if they have a higher probability of winning a +standard attack. Unlike air interception, they only target +non-civilian military units. +This relieves some issues vis-a-vis unfair camping advantages, +by letting people who aren't on all the time to set up +retaliatory defense structures in some areas. Also gives +is a balance adjustment for weaker city walls. +============================================================== +16. New unit Magnum Turret, unique unit. +============================================================== +17. Freight can use multiple build slots, like Infantry. +============================================================= +18. Legion price adjust 30 (was 32) - got 20% discount like + all other foot units, off the classic price, but it was + overpriced in classic. +============================================================== +19. Helicopters types gain half hp first turn arriving and +staying in city: (hp is "half" like a kind of fuel, and "half" +the amount of damage it got.) This rightly sets healing to 1 turn +for short sortie, 2 turns for damaged <50%, and 3 turns for badly +damaged if there's no airport. +============================================================== +20. Abilities of Marines and AAA were cleaned up and clarified +in better documentation. +============================================================== +21. Freight moved to the Corporation - allows earlier use +of Freight advantages at a time when they're more appropriate, +during the difficult ramp up of industrial revolution. Also, +the bonuses of the unit suit the represented technology. +============================================================== +22. Truck moved to Automobile, for obvious reasons, but also, +this unit is quite powerful and was available too early +(too hard to make wonders at this stage, allowed Marines on +Trucks to make Cavalry less meaningful.) + + + +V. Misc* +================================================================================================================ +1. Mausoleum + Effectively, upkeep on Courthouses is free. + Courthouses cost 5 less; during Despotism, they cost the + same as a temple. +============================================================ +2. Hills Vision + hills give half the vision bonus of mountains; + (sees 4 more tiles instead of 8 [corner tiles] +============================================================ +3. Agoge reduces Phalanx price 3 shields. + Counts as a Barracks in its home city. + +1 move bonus for starting turn in city now applies to + all cities, not just Agoge city. + Increases chance of veteran promotion 50% for phalanxes + (this is not +50% odds, it's +50% frequency), i.e: + 50 33 20 15 becomes 75 50 30 22 + Agoge + Barracks in a city allows making hardened Phalanxes +============================================================= +4. Techs and Costs: + Monotheism 300 (384), Theology 400 (600), Theocracy 500 (725) + Invention 490 (468), Democracy 950 (875), Banking 475 (364) + Medicine 475 (468) Ironworking 65 (80). Philosophy 325 (276) + Navigation 500 (485). University 450 (415). + Chemistry 900 (800) + Astronomy, Feudalism, Trade, Republic 150 (145) + + Misc techs rounded to clean numbers. + Philosophy now gives a 70% blueprint instead of a full tech. +============================================================= +5. Zeus promotion bonus changed: instead of The Republic + tech turning it off, it's Monotheism or Communism that + turns off the bonus. The two different "make content" + bonuses were clarified. +============================================================= +6. University Pre-req for Steam Engine changed to + Magnetism. In most cases this will mean Frigates now + come two techs before Ironclads; rather than possibly + after. +============================================================= +7. Terrain Walls - The Great Wall wonder allows +one to build walls right on the map. The terrain properties +are: +1. Takes one turn to build, set Tile target with (D)o +2. Takes four turns to pillage. +3. Can't be built on a Base, River, or Canal +4. Non-allied units lose all move points moving onto a wall, +and lose all move points moving off of a wall +5. Foreign units who are on a wall tile and have +no moves left, are considered as 'attempting to scale the +wall' and in a vulnerable state, and have a -50% defense +while caught on the wall with no moves left. +6. Domestic units on a wall are considered fortified for free, +even if not in a fortified state. (NB:not allies, yours only) +7. Can't be built on Mountains, Rivers, Bases. +8. Be careful, pillage time is 4 turns. +============================================================= +8. Destroy City - Massacre a city (gives global casus belli) +Requires 2 units on tile, actor must be capturer-type. +Foreign city: destroyer gov mustn't be Demo, Theo; +city size 2-8; +Domestic city: only avail to Despo, Commie; +15% foreign, must use (D)o command. size 1-8; +============================================================== +9. Huts can now also give: + * Small bulb awards (1-5 bulbs). + * a Boat (if on a river) + * Goods (if discovered by a unit who can carry Goods) + * A map of the surrounding area (14 tile diameter) +============================================================== +10. EFT_REHOME_PCT alters the likelihood of units disbanding + from conquered/razed cities based on gov type. + Despotism:15,Monarchy:30,CM/Comm:45,Repub/Natl:60, + Demo:75,Theo:90 +============================================================== +11. Citadel of Aleppo - 3x defense impervious to ballistic + units and siege ram. Allows each nation to make one + special fortress city with the same strength as old + city walls, to feel safe about it. Cost:120 +============================================================== +12. Chand Baori - cost 65 (was 80) +============================================================== +13. Corruption reducing buildings and wonders will always be +guaranteed to reduce at least 1 corruption (if there is any). +This finally solves an age-old freeciv problem that came from +"double-truncation-rounding" error, which made corruption +reduction nearly worthless in small despotism cities +or medium monarchy cities; yet these are the exact contexts +when corruption loss as a percentage of GDP are at their +worst and when the game can greatly benefit by an improvement +to help with corruption. +Courthouse, Palace, Ecclesiastical Palace, Sphinx, Ziggurat, +Supreme Court, and Mausoleum of Mausolos will all reduce +a minimum of 1 corruption, if there is any corruption. +============================================================== +14. JTIDS cost 275 (was 230). +============================================================== +15. Small balance adjust to early starting techs, gives micro- +expansion of early bronze age strategic pathways, decreases +new-gov rush slightly. Most techs go to 22, masonry and +bronze working go to 20. +============================================================== +16. req #2 for Gunpowder changed from Iron Working to +Feudalism (which needs Iron Working anyway)...fixes some +issues with tech tree flow. +============================================================== +17. No stack death takes place on ruins. Undocumented effect + that hideouts don't disappear in ruins is now documented. +============================================================== +18. Homeland Security prevents Poison City from taking place. +============================================================== +19. Bunkers have 90% chance to resist nuclear detonation. +i.e., units inside won't die. +============================================================== +20. If ending turn in a city and not qualified for any other +healing effect, a minimum +1 hp healing takes place. (e.g., +no healing from barracks, being fortified, +1/3hp for staying +1 turn in city and not moving, or +10% for being on a tile +and not moving for a whole turn.) +============================================================== +21. Default blueprints is 65 (was 70) + Default techleak is 50 (was 40) +Slight penalty for "technology gangs" and slightly more help +for those not in one. Note the slightly more bulbs needed +at 65% blueprint is somewhat lessened by higher techleak. + +Techleak, when tallying the total number of players vs. +the number of players having a tech: doesn't count dead +players, Barbarian players, NewAvailablePlayers, and players +who are idle 5 or more turns. +============================================================== +22. Fishtraps become available with Refrigeration technology. + A Fishtrap provides +2 food to its tile. Any Fish adjacent to + the tile will be raised to +6 food output and gain +1 trade. + Fishtraps must be made adjacent to Fish, but cannot be made + cardinally adjacent to each other. Nor can they be built + directly on a tile with Fish, Whales, or a Buoy. +============================================================== +23. Except for Aircraft, Missiles, and Marines: +* the move cost to Deboard and Board is 1/3, likewise a Transport + doing Load or Unload causes 1/3 move cost to all the units which + that command causes to Deboard or Board. +* the requirement to be able to Board (or Load a unit) is the + cargo must have remaining moves left. This is not the case + for Deboard/Unload (it lets a unit who spent its moves + boarding, safely land at destination and transport to move + on to other things.) (doesn't apply to missiles) + +All the above is the current evolution of "balanced compromise" +to (1) reducing "double move" phenomena using mulitple load/unload +on multiple transports, while (2) at same time not excessively +slowing the longturn pace and aggravating the already +cumbersome transport logistics. +============================================================== +24. Copernicus costs 90 (was 100). +============================================================== +25. New feature, cargo on some types of transports is openly +visible. Current test case are Wagons and Trawlers. +============================================================== +26. Boarding a transport requires having moves left. This +works in conjunction with the 1/3 move cost of boarding/deboarding +for a limiting factor on double moving and transporter-swapping +============================================================== +27. Leonardo's Workshop is now never obsolete, but the +discovery of Robotics or Rocketry reduces the effect to 1 +upgrade turn. Reasons: more quantitative easing on upgrade +retadation syndrome; reduce overly strong penalties on +discovery of automobile. +============================================================== +28. Colosseum costs 360 +============================================================== +29. FORMERLY: courthouse/homeland/police/theocracy blocked +diplomats from hostile embassy (needs ceasefire/peace first); +only police station/theocracy blocked hostile spies. +NOW: courthouse/homeland/police/theo blocks emissary and diplo; +only police/theo blocks diplo who has espionage tech +============================================================== +30. Combustion increases pollution 25% instead of Automobile: +the Leo/Sun Tzu/Colossus/Barracks II/Pollution quintuple +penalty was too excessive and one-pathed tech strategies. +============================================================== +31. Mass Transit moved to Combustion : realism, balance, and +playability. (Allow pollution reduction on the second pop. +polluting effect instead of third). +============================================================== +32. Power Plants, all are +30%, and +20% with Mass Prod. +Nuclear remains at +60% (automatic since one has Mass Prod.) +Hydro Upkeep reduced from 3 to 2. Hoover makes all Hydros +act like Nuclear but still producing no extra pollution. +============================================================== +33. No stack death in hideouts; this helps give the hideout +more parity as a strategic option, compared to a Fort. Too +often, people wanting to make hideouts did not choose them +because stack death made it always a worse choice than a fort +which has a bonus defense AND no stack death. + +VI. Minor* +================================================================================================================ +1. MagLevs can only be built wherever railroads may be built, +(i.e. Road and SeaBridge). A railroad is not required. They +can't be built on ocean (unless SeaBridge.) Railroads take +1.5 worker-turns to complete, not 2; this can assist +economic pace in some cases of never vet Workers and work +bonuses. +============================================================== +2. Battleships get same vision radius as Cruiser. +============================================================== +3. Fix, Transport inaccurately documented as causing + unhappiness. (Units with 0 Attack do not cause unhappy) +============================================================= +4. Adam Smith wonder adjusted back to 300 cost; the former + cost increase had been implemented before the WYSIWYG + upgrade, which now makes this wonder less OP and no + longer justifying the cost increase. +============================================================= +5. Hideouts + temporary patch requirement for unit to be alone + was fixed after a bug fix no longer requires this. +============================================================= +6. Tile Claims + Fixed a bug where tile claims were only cardinally adjacent + Requirement for diplomat to be accompanied is only if not + in domestic territory. + Can be now be made on any tile adjacent to existing claim. + Conflict where Tile Claim can't be made in a base, was + fixed. +============================================================= +7. Cathedral costs 70 (was 75) +============================================================= +8. Fixed bug (also mp2c) where Airplane was not counted + as non-military and couldn't do diplomatic missions + to nations with whom you're at peace. +============================================================== +9. Theocracy spawns Zealots instead of Partisans +============================================================== +10. Wild Animal hunting now gives food (for edible types). +/set animals >0 + + +Project Neptune +================================================================================================================ +1. Lighthouse never obsolete, but must be built before + Electricity. Movement bonus reduces to +1 when combined + with Nuclear Power bonus. Magellan gives +1 move to + nations who don't have Lighthouse. +============================================================== +2. Missile carrying ships -- changes: +AEGIS can carry 5 (was 2) +Missile Destroyer can carry 2 (was 1) +Submarine can carry 0 (was 8) +Missile Submarine can carry 4 (new unit!) +============================================================== +3. Lighthouse and Magellan's Expedition get the Port Facility +effect of healing ships which stay in town for one full turn. +============================================================== +4. Submarine class loses 1 less move point than other units when +attacking and succeeding. Submarine unit can no longer carry +missiles... +============================================================== +5. New unit Missile Submarine...can carry missiles and do +"deep dive". 2 more hp and better defense also. +============================================================== +6. Crew Repair simplified: every type of ship gets 10% repair: +i.e., effectively +1 hp more than previously: providing a +slight buff to ship durability and usability, and bringing the +successfully tested crew repair to the ancient (wooden ships) +This combines with improved Lighthouse/Nuclear Power effects. +============================================================== +7. All ships gain +1 to their minimum speed when damaged: +Boat, Trireme, Riverships: 3 (was 2) +Submarines: 5 (was 4) +all other Sea Units: 4 (was 3) +============================================================== +8. Most ships gain +1 move. Adjusts a discrepancy between +their speed and that of corresponding land units using roads. +Ships to not gain +1 = Trireme, Longboat, Ram Ship, Transport +Frigate gets +2 (had received a +1 adjustment prior to all +ships getting a general +1). This change also lessens +the "molasses effect" in island games, where all sea-based +operations are excessively slower than land operations. +============================================================== +9. Shore attacks for modern ships changed: + • Battle will last 20 combat rounds, which may or may not result + in a victor. + • Chance of attacker promotion is half frequency: 2 battles + required for same chance of promotion as 1 sea battle. + • Firepower is reduced to 1. Attack strength is increased +33% + * Overall effect is -33% reduction in attack strength, less + chance of promotion, less chance of fatality for either + combatant, but generally in spite of this, more effective + and tactically usable with more frequency in more + contextual situations. + +Unclassified yet +================================================================================================================ + +============================================================== +114. Cities go from 5x5 without corners to +5x5 with corners, at size 21. +7x7 without corners, at size 30. +This is experimental feature to gradually progress to managing +fewer, but larger, cities. It helps non-rapturing govs access +more food tiles. In addition it will help some +cities reach their potential by getting more ocean later. +============================================================== +115. Caravan can carry 3 goods and freight. +============================================================== +116. Crusaders defend at 1.5 +============================================================== +117. Knights simplified to D2 with D3 vs mounted. +============================================================== +118. Armor unit changes (the units were a little underpowered) +Armor I: A10 goes to A11 +Armor I & II: Each unit gains 40% odds of Stack-Escape when +its stack is killed +============================================================== +119. Tech changes + +Flight +gets Dive Bomber (was:Radio) + +Radio +Flight, Miniaturization (was Flight only) +gets Medium Bomber (was:Advanced Flight) +ups the cost to getting planes available one tech level sooner + +Advanced Flight +gets Heavy Bomber (was:Medium Bomober) + +Labor Union, name changed to Mechanization +Mass Production,Machine Tools(was:Guerilla Warfare) + +Radar +Advanced Flight, Mechanization(was:Electronics) +gets Strategic Bomber (was: Heavy Bomber) +more expensive second req balances availability of Strategic Bomber +one tech sooner. (it was available "too late" in WW3 era which one +could nevertheless enter too soon.) + +Computers +Mechanization(was:Mass Prod), Radio(was:Miniaturization) +tech is now a 3x cost tech to solve some balance playability +1. too easy to ignore earlier techs and unrealistically race to a "killer" +2. late game tech pace accelerated too fast out of WW2 era and players didn't +even complete WW2 techs before having rockets and jet fighters and such. +3.could slightly de-pressurise the arms race to WW3 tech +4.JTIDS which is to give infantry greater power vis-a-vis stronger +WW3 era units and loss of Sun Tzu, was being obtained prior to even +having Flight, Mobile Warfare, etc. + +Avionics +Rocketry + +Combined Arms +Advanced Flight, Computers(was:Mobile Warfare) +all ww3 techs require Computers as the expensive breakthrough + +Rocketry +Radar, Computers(was:Miniaturization) +all ww3 techs require Computers as the expensive breakthrough + +Space Flight +Rocketry,Nuclear Power (was:Computers) +Rocketry already has Computers as a req. +all ww3 techs require Computers as the expensive breakthrough +============================================================== +120. max_attacks per turn +Fighter, Escort Fighter: 2 +Dive Bomber, Medium Bomber, Heavy Bomber: 1 +Strategic Bomber, Jet Bomber, 2 +Stealth Bomber, 3 + +new unit Bomb + +new carry capacities +Med.Bomber 1 + +stealth bomber can ipillage +============================================================== +121. Buoys report nearby visible activity like a sentry, and + are even able to see enemy submarines, if cardinally adjacent. +============================================================== +122.Frigates and Galleons can't attack Subs +============================================================== +123.Missiles must be loaded on transports: +(a) in a city, or (b) as cargo from one transport to another +on the same tile, (c) so-called parachute-catch-delivery, +where a missile floating at TC auto-returns to the nearest +unit who can carry it +============================================================== +124.chance of razed building goes from 1/5 to 1/7 (20>14) +anarchy,despotism,communism conquerors have +50% (21%) +democracy,theocracy conquerors have -50% (7%) +liberating your own city reduces it by -50% + normal: 7%, anarchy/despotism/commie: 14%, demo/theo: 0% +certain buildings have a reduced chance of razing: +amphitheatre,aqueduct,cathedral,granary,harbor,marketplace, +hydro plant,sewer,supermarket,temple,totem pole +============================================================== +125. +============================================================== +126. +============================================================== +127. +============================================================== diff --git a/freeciv/freeciv/data/mp2-dragoon/default.lua b/freeciv/freeciv/data/mp2-dragoon/default.lua index 70878fc27..24fca9f6c 100644 --- a/freeciv/freeciv/data/mp2-dragoon/default.lua +++ b/freeciv/freeciv/data/mp2-dragoon/default.lua @@ -22,8 +22,8 @@ function _deflua_hut_get_gold(unit, gold) gold) owner:change_gold(gold) elseif gold == 5 then - notify.event(owner, unit.tile, E.HUT_GOLD, PL_("[`gold`] You found stone tools worth %d gold.", - "[`gold`] You found stone tools worth %d gold.", gold), + notify.event(owner, unit.tile, E.HUT_GOLD, PL_("[`gold`] You found bronze tools worth %d gold.", + "[`gold`] You found bronze tools worth %d gold.", gold), gold) owner:change_gold(gold) elseif gold == 10 then @@ -35,6 +35,16 @@ function _deflua_hut_get_gold(unit, gold) end +-- Get bulbs from entering a hut. +function _deflua_hut_get_bulbs(unit, bulbs) + local owner = unit.owner + + notify.event(owner, unit.tile, E.HUT_TECH, PL_("[`bulb`] You found ancient tablets worth %d bulb.", + "[`bulb`] You found ancient tablets worth %d bulbs.", bulbs), + bulbs) + owner:give_bulbs(bulbs) +end + -- Default if intended hut behavior wasn`t possible. function _deflua_hut_consolation_prize(unit) _deflua_hut_get_gold(unit, 2) @@ -47,16 +57,16 @@ function _deflua_hut_get_tech(unit) if tech then notify.event(owner, unit.tile, E.HUT_TECH, - _("💡 You found %s in ancient scrolls of wisdom."), + _("[`bulb`] You found %s in ancient scrolls of wisdom."), tech:name_translation()) notify.research(owner, false, E.TECH_GAIN, -- /* TRANS: One player got tech for the whole team. */ - _("💡 The %s found %s in ancient scrolls of wisdom for you."), + _("[`bulb`] The %s found %s in ancient scrolls of wisdom for you."), owner.nation:plural_translation(), tech:name_translation()) notify.research_embassies(owner, E.TECH_EMBASSY, -- /* TRANS: first %s is leader or team name */ - _("💡 The %s have acquired %s from ancient scrolls of wisdom."), + _("[`bulb`] The %s have acquired %s from ancient scrolls of wisdom."), owner:research_name_translation(), tech:name_translation()) return true @@ -80,11 +90,67 @@ function _deflua_hut_get_mercenaries(unit) if utype then notify.event(owner, unit.tile, E.HUT_MERC, _("[`warriors`] A band of friendly mercenaries joins your cause.")) - owner:create_unit(unit.tile, utype, 0, unit:get_homecity(), -1) + owner:create_unit(unit.tile, utype, 0, nil, -1) return true - else + end + + return false +end + +-- Get a boat from entering a hut on a river. +function _deflua_hut_get_boat(unit) + if not unit.tile:has_extra("River") then return false end + + local owner = unit.owner + local utype = find.unit_type('Goods') + local board = find.action('Transport Board') + local capital = nil + + for c in owner:cities_iterate() do + if c:has_building(find.building_type("Palace")) then + capital = c + break + end + end + + if owner:create_unit(unit.tile, find.unit_type("Boat"), 0, capital, -1) then + notify.event(owner, unit.tile, E.HUT_GOLD, + _("[`boat`] You found a boat!")) + return true + end + + return false +end + +-- Get Goods from entering a hut. +function _deflua_hut_get_goods(unit) + local owner = unit.owner + local utype = find.unit_type('Goods') + local board = find.action('Transport Board') + local capital = nil + + for c in owner:cities_iterate() do + if c:has_building(find.building_type("Palace")) then + capital = c + break + end + end + + -- if there is a capital set home city to it (otherwise nil=no_home) + if edit.create_unit_full(owner, unit.tile, utype, 0, capital, 1, 1, unit) then + notify.event(owner, unit.tile, E.HUT_GOLD, + _("[`goods`] You found a stash of exotic goods.")) + return true + end + + -- What a shame, can't get Goods... possible consolation to get a Boat instead + if unit.tile:has_extra("River") then + return _deflua_hut_get_boat(unit) + end + + return false end -- Get new city from hut, or settlers (nomads) if terrain is poor. @@ -128,34 +194,63 @@ function _deflua_hut_get_barbarians(unit) local alive = tile:unleash_barbarians() if alive then notify.event(owner, tile, E.HUT_BARB, - _("⚠️ You have unleashed a horde of barbarians!")); + _("[`warning`] You have unleashed a horde of barbarians!")); else notify.event(owner, tile, E.HUT_BARB_KILLED, - _("⚠️ Your %s has been killed by barbarians!"), + _("[`warning`] Your %s has been killed by barbarians!"), utype:name_translation()); end return alive end +-- Reveal map around the hut +function _deflua_hut_reveal_map(unit) + local owner = unit.owner + + notify.event(owner, unit.tile, E.HUT_MAP, + _("You find a map of the surrounding terrain.")) + for revealtile in unit.tile:circle_iterate(63) do + revealtile:show(owner) + end +end + -- Randomly choose a hut event function _deflua_hut_enter_callback(unit) - local chance = random(0, 6) + local chance = random(0, 14) local alive = true - if chance == 0 or chance == 1 then + if chance == 0 then _deflua_hut_get_gold(unit, 1) - elseif chance == 2 or chance == 3 then + elseif chance >= 1 and chance <= 3 then _deflua_hut_get_gold(unit, 2) elseif chance == 4 then _deflua_hut_get_gold(unit, 5) elseif chance == 5 then _deflua_hut_get_gold(unit, 10) elseif chance == 6 then + _deflua_hut_get_bulbs(unit, 1) + elseif chance == 7 then + _deflua_hut_get_bulbs(unit, 2) + elseif chance == 8 then + _deflua_hut_get_bulbs(unit, 5) + elseif chance == 9 then + if unit.tile:has_extra("River") then + if not _deflua_hut_get_boat(unit) then + _deflua_hut_reveal_map(unit) + end + else + _deflua_hut_reveal_map(unit) + end + elseif chance == 10 then + if not _deflua_hut_get_goods(unit) then + _deflua_hut_reveal_map(unit) + end + elseif chance == 11 then if not _deflua_hut_get_mercenaries(unit) then - _deflua_hut_consolation_prize(unit) + _deflua_hut_reveal_map(unit) end - elseif chance == 7 then - alive = _deflua_hut_get_barbarians(unit) + elseif chance >= 12 then + _deflua_hut_reveal_map(unit) end -- continue processing if unit is alive @@ -198,17 +293,30 @@ function _deflua_make_partisans_callback(city, loser, winner, reason) return end + local partisan_utype = 18 + local partisan_name = "Partisan" local partisans = random(0, 1 + (city.size + 1) / 2) + 1 if partisans > 8 then partisans = 8 end - city.tile:place_partisans(loser, partisans, city:map_sq_radius()) + + if loser.government:rule_name() == "Theocracy" then + partisan_name = "Zealot" + partisan_utype = 17 + end + + city.tile:place_partisans(loser, partisans + (partisan_utype*256), city:map_sq_radius()) + partisan_spawns = partisan_spawns + 1 if partisan_spawns < 5 then notify.event(loser, city.tile, E.CITY_LOST, - _("[`events/partisans`]
[`partisan`] The loss of %s has inspired %d partisans!"), partisans, city.name) + PL_("[`events/partisans`]
[`partisan`] The loss of %s inspires %d %s!", + "[`events/partisans`]
[`partisan`] The loss of %s inspires %d %ss!", partisans), + city.name, partisans, partisan_name) notify.event(winner, city.tile, E.UNIT_WIN_ATT, - _("[`events/partisans`]
[`partisan`] The loss of %s has inspired %d partisans!"), partisans, city.name) + PL_("[`events/partisans`]
[`partisan`] The loss of %s inspires %d %s!", + "[`events/partisans`]
[`partisan`] The loss of %s inspires %d %ss!", partisans), + city.name, partisans, partisan_name) end end diff --git a/freeciv/freeciv/data/mp2-dragoon/effects.ruleset b/freeciv/freeciv/data/mp2-dragoon/effects.ruleset index 983292c8c..b6cdcfd7b 100644 --- a/freeciv/freeciv/data/mp2-dragoon/effects.ruleset +++ b/freeciv/freeciv/data/mp2-dragoon/effects.ruleset @@ -38,7 +38,6 @@ reqs = { "type", "name", "range", "present" "UnitType", "Medium Bomber", "Local", TRUE } - ; EXAMPLE OF HOW TO USE NEW Unit_Unhappy_Cost EFFECT, almost same ; as the above effect (don't use both!) ;[effect_medium_bomber_field_unit_minus_one] @@ -49,6 +48,54 @@ reqs = ; "UnitType", "Medium Bomber", "Local", TRUE ; "UnitState","OnDomesticTile","Local", TRUE ; } + +; Combat_rounds, modern sea units attacking land +[effect_combat_rounds_shore_bombardment] +type = "Combat_Rounds" +value = 20 +reqs = + { "type", "name", "range", "present" + "UnitClass", "Sea", "Local", TRUE + ; scope resolves to tile being attacked so effect can be influnced by things like terrain, tile nativity + "TerrainClass", "Land", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" + } + +; Non-native battles limited by combat_rounds don't usually +; result in a victor, and often the attacker uses multiple +; attack moves on a single defender, which artificially +; raises the chance of promotion. Therefore, we adjust promotion +; odds downward such that chance of promotion after 2 attacks +; is identical to standard chance of promotion after 1 attack. +[effect_shore_bombardment_vet_reduce] +type = "Veteran_Combat" +value = -41 ; = (1-sqrt(2)*100) = (50% - (.41*50%=20.5%) = 29.5%. (100%-29.5%=70.5%)^2 = 50% ) +reqs = + { "type", "name", "range", "present" + "UnitClass", "Sea", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" + "TerrainClass", "Land", "Local", TRUE + } +;FP2 to FP1 in non-native attacks is a legitimately needed balance penalty, +;but it's overcorrective. Reducing firepower by half but then increasing +;attack by 1/3 results in overall -33% penalty instead of -50%. That is, +;Attack becomes 67% strength instead of 50% strength. +[effect_shore_bombardment_fp_reduction_compensation] +type = "Attack_Bonus" +value = 34 +reqs = + { "type", "name", "range", "present" + "UnitClass", "Sea", "Local", TRUE + "UnitType", "Ironclad", "Local", FALSE + "UnitType", "Destroyer", "Local", FALSE + "UnitType", "Transport", "Local", FALSE ; just in case we give it A1 some day. + "TerrainClass", "Land", "Local", TRUE ; Attack_Bonus resolves to defender's tile. + } + ; Combat_rounds Tribesmen [effect_combat_rounds_tribesmen] type = "Combat_Rounds" @@ -97,6 +144,8 @@ value = 45 ; The above is rounded down, so use y=mx+b to get a better algorithm: ; Unhappy = (0.45 * of Foreign citizens) + 1 +; Note this actually makes the Make_Content effects of buildigs one less +; and should eventually be replaced by "Enemy_Citizen_Unhappy_Add", val=1 [effect_angry_conquered_2] type = "Make_Content" value = -1 @@ -520,6 +569,37 @@ reqs = "Extra", "Oil", "Local", TRUE "OutputType", "Shield", "Local", TRUE } + +; *** FISH TRAPS *** +[effect_fishtrap_fish_1] +type = "Output_Add_Tile" +value = 2 +reqs = + { "type", "name", "range" + "Extra", "Fish", "Local" + "Extra", "Fishtrap", "Adjacent" + "OutputType", "Food", "Local" + "Tech", "Refrigeration", "Player" + } +[effect_fishtrap_fish_2] +type = "Output_Inc_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Extra", "Fish", "Local" + "Extra", "Fishtrap", "Adjacent" + "OutputType", "Trade", "Local" + "Tech", "Refrigeration", "Player" + } +[effect_fishtrap] +type = "Output_Add_Tile" +value = 2 +reqs = + { "type", "name", "range" + "Extra", "Fishtrap", "Local" + "OutputType", "Food", "Local" + "Tech", "Refrigeration", "Player" + } ; ***************************************************** ; Vision benefit from mountains (for every land unit) @@ -527,25 +607,9 @@ reqs = type = "Unit_Vision_Radius_Sq" value = 5 reqs = - { "type", "name", "range" - "Terrain", "Mountains", "Local" - "UnitClass", "Land", "Local" - } -[effect_mountains_vision_1] -type = "Unit_Vision_Radius_Sq" -value = 5 -reqs = - { "type", "name", "range" - "Terrain", "Mountains", "Local" - "UnitClass", "LandAirSea", "Local" - } -[effect_mountains_vision_2] -type = "Unit_Vision_Radius_Sq" -value = 5 -reqs = - { "type", "name", "range" - "Terrain", "Mountains", "Local" - "UnitClass", "LandNoKill", "Local" + { "type", "name", "range" + "Terrain", "Mountains", "Local" + "UnitClassFlag", "TerrainSpeed", "Local" ;all Land__ classes } [effect_hills_vision] type = "Unit_Vision_Radius_Sq" @@ -553,27 +617,9 @@ value = 3 reqs = { "type", "name", "range" "Terrain", "Hills", "Local" - "UnitClass", "Land", "Local" - } -[effect_hills_vision_1] -type = "Unit_Vision_Radius_Sq" -value = 3 -reqs = - { "type", "name", "range" - "Terrain", "Hills", "Local" - "UnitClass", "LandAirSea", "Local" - } -[effect_hills_vision_2] -type = "Unit_Vision_Radius_Sq" -value = 3 -reqs = - { "type", "name", "range" - "Terrain", "Hills", "Local" - "UnitClass", "LandNoKill", "Local" + "UnitClassFlag", "TerrainSpeed", "Local" ;all Land__ classes } - - ; basic free tech upkeep [effect_upkeep_tech_free] type = "Tech_Upkeep_Free" @@ -647,48 +693,27 @@ reqs = ; This is almost comparable to land unit healing. Sea units being "Use once ; and dispose", and/or unable to re-enter action for literally centuries, had ; created issues in realism, playability, and balance. 8% repair/turn effect: -; 10hp units: +0 hp/turn 20hp units: +1 hp/turn -; 30hp units: +2 hp/turn 40hp units: +3 hp/turn -;[effect_sea_hp_regen] -;type = "Unit_Recover_Pct" -;value = 8 -;reqs = -; { "type", "name", "range" -; "UnitClass", "Sea", "Local" -; } -;[effect_sub_hp_regen] -;type = "Unit_Recover_Pct" -;value = 8 -;reqs = -; { "type", "name", "range" -; "UnitClass", "Submarine", "Local" -; } -;[effect_rivership_hp_regen] -;type = "Unit_Recover_Pct" -;value = 8 -;reqs = -; { "type", "name", "range" -; "UnitClass", "RiverShip", "Local" -; } -; The effects above replace the effects below after Unit_Recover_Pct is up -; The effects below substitute if Unit_Recover_Pct is missing from server -[effect_sea_hp_regen] -type = "Unit_Recover" ;30 hp units get + 2 -value = 2 +; 10hp units: +1 hp/turn 20hp units: +2 hp/turn +; 30hp units: +3 hp/turn 40hp units: +4 hp/turn + +[effect_trireme_hp_regen] ;all riverships get + 1 +type = "Unit_Recover" +value = 1 reqs = - { "type", "name", "range" - "UnitClass", "Sea", "Local" - } -[effect_sub_hp_regen] ;30 hp units get + 2 + { "type", "name", "range", "present" + "UnitClass", "Trireme", "Local", TRUE + } +[effect_rivership_hp_regen] ;all riverships get + 1 type = "Unit_Recover" -value = 2 +value = 1 reqs = - { "type", "name", "range" - "UnitClass", "Submarine", "Local" + { "type", "name", "range", "present" + "UnitClass", "RiverShip", "Local", TRUE } -[effect_rivership_hp_regen] ;20 hp units get + 1 + +[effect_rivership_20hp_regen] ;20hp riverships units get + 2 type = "Unit_Recover" -value = 1 +value = 1 ; 1+1 = 2 reqs = { "type", "name", "range", "present" "UnitClass", "RiverShip", "Local", TRUE @@ -699,16 +724,30 @@ reqs = "UnitType", "Caravel", "Local", FALSE "UnitType", "Ram Ship", "Local", FALSE } -[effect_battleship_hp_regen] ;40 hp units get + 3 +[effect_sea_hp_regen] +type = "Unit_Recover" ;30hp units get + 3 +value = 3 +reqs = + { "type", "name", "range" + "UnitClass", "Sea", "Local" + } +[effect_sub_hp_regen] ;28hp gets + 3 +type = "Unit_Recover" +value = 3 +reqs = + { "type", "name", "range" + "UnitClass", "Submarine", "Local" + } +[effect_battleship_hp_regen] ;40 hp units get + 4 type = "Unit_Recover" -value = 1 ; 2+1=3 +value = 1 ; 3+1=4 reqs = { "type", "name", "range" "UnitType", "Battleship", "Local" } -[effect_carrier_hp_regen] ;40 hp units get + 3 +[effect_carrier_hp_regen] ;40 hp units get + 4 type = "Unit_Recover" -value = 1 ; 2+1=3 +value = 1 ; 3+1=4 reqs = { "type", "name", "range" "UnitType", "Carrier", "Local" @@ -718,6 +757,20 @@ reqs = type = "Stack_Escape_Pct" value = 10 ; 50% → = 60% +[effect_armor_stack_escape_odds] +type = "Stack_Escape_Pct" +value = -20 ; 60%-20 → 40% +reqs = + { "type", "name", "range" + "UnitType", "Armor", "Local" + } +[effect_armor2_stack_escape_odds] +type = "Stack_Escape_Pct" +value = -20 ; 60%-20 → 40% +reqs = + { "type", "name", "range" + "UnitType", "Armor II", "Local" + } [effect_satellite_stack_escape_odds] type = "Stack_Escape_Pct" value = 40 ; 60% → 100% @@ -730,7 +783,7 @@ type = "Stack_Escape_Pct" value = 15 ; 60% → 75% reqs = { "type", "name", "range" - "UnitType", "Submarine", "Local" + "UnitClass", "Submarine", "Local" } [effect_destroyer_stack_escape_odds] type = "Stack_Escape_Pct" @@ -777,6 +830,27 @@ reqs = "Activity", "Fortified", "Local" } +[effect_free_fortify_on_walls] +type = "Fortify_Defense_Bonus" +value = 50 +reqs = + { "type", "name", "range", "present" + "Extra", "Walls", "Local", TRUE + "UnitState", "OnDomesticTile", "Local", TRUE ; TODO: Bring in ability to check DiplRel on tile and change to Alliance + } + +;Enemies who moved onto walls and lost all moves are considered as scaling +;and messing around, and get -50% penalty. +[effect_climbing_enemy_walls] +type = "Fortify_Defense_Bonus" +value = -50 +reqs = + { "type", "name", "range", "present" + "Extra", "Walls", "Local", TRUE + "UnitState", "OnDomesticTile", "Local", FALSE ; TODO: Bring in ability to check DiplRel on tile and change to Alliance,FALSE + "MinMoveFrags", "1", "Local", FALSE + } + [effect_city_fortified] type = "Fortify_Defense_Bonus" value = 50 @@ -797,6 +871,37 @@ value = 50 "UnitClassFlag", "TerrainDefense", "Local" } +;This effect is triggered in a city if no other healing effects are. +[effect_city_1hp_heal_minimum] +type = "Unit_Recover" +value = 1 +reqs = + { "type", "name", "range", "present" + "CityTile", "Center", "Local", TRUE + "UnitState", "MovedThisTurn","Local", TRUE + } +[effect_city_helicopter_first_arrival_in_city] +type = "Unit_Recover" +value = 9 ; 9+1 = 10 +reqs = + { "type", "name", "range", "present" + "UnitClass", "Helicopter", "Local", TRUE + "CityTile", "Center", "Local", TRUE + "UnitState", "MovedThisTurn","Local", TRUE + } + +;Kill off Tribesmen after 100AD for those with no Chand Baori +;[effect_tribesmen_dying] +;type = "Unit_Recover" +;value = -4 +;reqs = +; { "type", "name", "range", "present" +; "UnitType", "Tribesmen", "Local", TRUE +; "MinYear", "100", "World", TRUE +; "Building", "Chand Baori", "Player",FALSE +; } + + ; ****************************** RECYCLE SHIELDS ************************** [effect_unit_shield_value_recycle] type = "Unit_Shield_Value_Pct" @@ -828,7 +933,7 @@ reqs = "UnitType", "Tribesmen", "Local", TRUE "MinYear", "-2000", "World", FALSE } - +; ****************************** CHEAPER UPGRADES ************************** [effect_unit_shield_value_in_upgrade_price_calc] type = "Unit_Shield_Value_Pct" value = -50 @@ -855,7 +960,23 @@ reqs = "Action", "Upgrade Unit", "Local", TRUE "UnitType", "Alpine Troops","Local", TRUE } - +[effect_free_workers_ii] +type = "Unit_Shield_Value_Pct" +value = 50 +reqs = + { "type", "name", "range", "present" + "Action", "Upgrade Unit", "Local", TRUE + "Tech", "Explosives", "Player", FALSE + "UnitType", "Workers", "Local", TRUE + } +[effect_free_diplomats] +type = "Unit_Shield_Value_Pct" +value = 75 +reqs = + { "type", "name", "range", "present" + "Action", "Upgrade Unit", "Local", TRUE + "UnitType", "Emissary", "Local", TRUE + } ; *********************************** BASES ******************************* ; **** FORT ***** @@ -879,25 +1000,9 @@ reqs = type = "HP_Regen" value = 10 reqs = - { "type", "name", "range" - "Extra", "Fort", "Tile" - "UnitClass", "Land", "Local" - } -[effect_fort_hp_regen_1] -type = "HP_Regen" -value = 10 -reqs = - { "type", "name", "range" - "Extra", "Fort", "Tile" - "UnitClass", "LandAirSea", "Local" - } -[effect_fort_hp_regen_2] -type = "HP_Regen" -value = 10 -reqs = - { "type", "name", "range" - "Extra", "Fort", "Tile" - "UnitClass", "LandNoKill", "Local" + { "type", "name", "range" + "Extra", "Fort", "Tile" + "UnitClassFlag", "TerrainSpeed", "Local" ; all Land_ classes } ; **** FORTRESS/NAVAL BASE *************************************************** @@ -949,82 +1054,28 @@ reqs = type = "Unit_Vision_Radius_Sq" value = 8 reqs = - { "type", "name", "range" - "Extra", "Fortress", "tile" - "Tech", "Invention", "Player" - "UnitClass", "Land", "Local" - } -[effect_fortress_vision_1] ;Marines, AAA -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "tile" - "Tech", "Invention", "Player" - "UnitClass", "LandAirSea", "Local" - } -[effect_fortress_vision_2] ;Knights -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Fortress", "tile" - "Tech", "Invention", "Player" - "UnitClass", "LandNoKill", "Local" + { "type", "name", "range" + "Extra", "Fortress", "tile" + "Tech", "Invention", "Player" + "UnitClassFlag", "TerrainSpeed", "Local" ;all Land_ classes } [effect_castle_vision] type = "Unit_Vision_Radius_Sq" value = 8 reqs = - { "type", "name", "range" - "Extra", "Castle", "tile" - "Tech", "Invention", "Player" - "UnitClass", "Land", "Local" - } -[effect_castle_vision_1] ;Marines, AAA -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Castle", "tile" - "Tech", "Invention", "Player" - "UnitClass", "LandAirSea", "Local" - } -[effect_castle_vision_2] ;Knights -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Castle", "tile" - "Tech", "Invention", "Player" - "UnitClass", "LandNoKill", "Local" + { "type", "name", "range" + "Extra", "Castle", "tile" + "Tech", "Invention", "Player" + "UnitClassFlag", "TerrainSpeed", "Local" ;all Land_ classes } [effect_navalbase_vision] type = "Unit_Vision_Radius_Sq" value = 8 reqs = - { "type", "name", "range" - "Extra", "Naval Base", "tile" - "Tech", "Invention", "Player" - "UnitClass", "Land", "Local" - } -[effect_navalbase_vision_1] ;Marines, AAA -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "tile" - "Tech", "Invention", "Player" - "UnitClass", "LandAirSea", "Local" - } -[effect_navalbase_vision_2] ;Knights -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "tile" - "Tech", "Invention", "Player" - "UnitClass", "LandNoKill", "Local" + { "type", "name", "range" + "Extra", "Naval Base", "tile" + "Tech", "Invention", "Player" + "UnitClassFlag", "TerrainSpeed", "Local" ;all Land_ classes } ; Fortress types, HP regen -------------------------------------------- @@ -1033,28 +1084,12 @@ reqs = type = "HP_Regen" value = 15 reqs = - { "type", "name", "range" - "ExtraFlag", "FortressHeal", "Tile" - "UnitClass", "Land", "Local" - } -[effect_fortress_hp_regen_1] -type = "HP_Regen" -value = 15 -reqs = - { "type", "name", "range" - "ExtraFlag", "FortressHeal", "Tile" - "UnitClass", "LandAirSea", "Local" + { "type", "name", "range" + "ExtraFlag", "FortressHeal", "Tile" + "UnitClassFlag", "TerrainSpeed", "Local" ;all Land_ classes } [effect_fortress_hp_regen_2] type = "HP_Regen" -value = 15 -reqs = - { "type", "name", "range" - "ExtraFlag", "FortressHeal", "Tile" - "UnitClass", "LandNoKill", "Local" - } -[effect_fortress_hp_regen_3] -type = "HP_Regen" value = 25 ;25 because not cumulative with Fort (Fort only nullfies hp loss each turn) reqs = { "type", "name", "range" @@ -1101,63 +1136,48 @@ reqs = type = "Unit_Vision_Radius_Sq" value = 8 reqs = - { "type", "name", "range" - "Extra", "Naval Base", "tile" - "Tech", "Invention", "Player" - "UnitClass", "Trireme", "Local" - } -[effect_navbase_vision1] -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "tile" - "Tech", "Invention", "Player" - "UnitClass", "RiverShip", "Local" - } -[effect_navbase_vision2] -type = "Unit_Vision_Radius_Sq" -value = 8 -reqs = - { "type", "name", "range" - "Extra", "Naval Base", "tile" - "Tech", "Invention", "Player" - "UnitClass", "Sea", "Local" + { "type", "name", "range" + "Extra", "Naval Base", "tile" + "Tech", "Invention", "Player" + "UnitClassFlag", "WaterVessel", "Local" } ; Naval Base HP regen [effect_navbase_hp_regen] type = "HP_Regen" value = 20 reqs = - { "type", "name", "range" - "Extra", "Naval Base", "Tile" - "UnitClass", "Sea", "Local" + { "type", "name", "range" + "Extra", "Naval Base", "Tile" + "UnitClassFlag", "WaterVessel", "Local" } -[effect_navbase_hp_regen_1] -type = "HP_Regen" -value = 20 +; *********************************************************** + +; ****************** BUNKER ********************************* +[effect_bunker_nuke_proof] +type = "Tile_Nuke_Proof" +value = 90 ; 90% probability of survival reqs = - { "type", "name", "range" - "Extra", "Naval Base", "Tile" - "UnitClass", "RiverShip", "Local" + { "type", "name", "range" + "Extra", "Bunker", "Local" } -[effect_navbase_hp_regen_2] -type = "HP_Regen" -value = 20 +; *********************************************************** + +[effect_aegis_nuke_proof] +type = "Tile_Nuke_Proof" +value = 50 ; 50% probability of survival reqs = - { "type", "name", "range" - "Extra", "Naval Base", "Tile" - "UnitClass", "Trireme", "Local" + { "type", "name", "range", "present" + "UnitType", "AEGIS Cruiser", "Local", TRUE + "Tech", "Laser", "Player", TRUE } -[effect_navbase_hp_regen_3] -type = "HP_Regen" -value = 20 +[effect_mobile_sam_nuke_proof] +type = "Tile_Nuke_Proof" +value = 33 ; 33% probability of survival reqs = - { "type", "name", "range" - "Extra", "Naval Base", "Tile" - "UnitClass", "Submarine", "Local" + { "type", "name", "range", "present" + "UnitType", "Mobile SAM", "Local", TRUE + "Tech", "Laser", "Player", TRUE } -; *********************************************************** ; Base vision range - radius of vision is sqrt(5) = 2.24 [effect_city_vision] @@ -1228,23 +1248,23 @@ reqs = "CityTile", "Center", "Local" } -; Nuclear power gives +1 moves to sea units (+2 under 2x) -[effect_nuclear_powered_boats] +; Nuclear power gives +2 moves to sea units (+1 if Lighthouse in effect) +[effect_nuclear_powered_ships] type = "Move_Bonus" -value = 18 +value = 9 reqs = - { "type", "name", "range" - "Tech", "Nuclear Power", "Player" - "UnitClass", "Sea", "Local" + { "type", "name", "range" + "Tech", "Nuclear Power", "Player" + "UnitClassFlag", "WaterVessel", "Local" } -; Nuclear power gives +1 moves to sea units (+2 under 2x) -[effect_nuclear_powered_subs] +[effect_nuclear_powered_ships2] type = "Move_Bonus" -value = 18 +value = 9 reqs = - { "type", "name", "range" - "Tech", "Nuclear Power", "Player" - "UnitClass", "Submarine", "Local" + { "type", "name", "range", "present" + "Tech", "Nuclear Power", "Player", TRUE + "Building", "Lighthouse", "Player", FALSE + "UnitClassFlag", "WaterVessel", "Local", TRUE } ;************************************* GOVERNMENT CORRUPTION @@ -1341,7 +1361,7 @@ reqs = [effect_corruption_theocracy_2] type = "Output_Waste" -value = 2 +value = 0 reqs = { "type", "name", "range" "Gov", "Theocracy", "Player" @@ -1349,7 +1369,7 @@ reqs = } [effect_corruption_theocracy1] type = "Output_Waste_By_Distance" -value = 200 +value = 100 reqs = { "type", "name", "range" "Gov", "Theocracy", "Player" @@ -1415,6 +1435,14 @@ reqs = "OutputType", "Shield", "Local", TRUE "Building", "Magna Carta", "Player", FALSE } +[effect_gold_upkeep_free_units_both_monarchies] +type = "Unit_Upkeep_Free_Per_City" +value = 1 +reqs = + { "type", "name", "range", "present" + "Gov", "Monarchy", "Player", TRUE + "OutputType", "Gold", "Local", TRUE + } [effect_upkeep_free_units_magna_carta] type = "Unit_Upkeep_Free_Per_City" value = 1 @@ -1485,6 +1513,14 @@ reqs = "Gov", "Communism", "Player" "OutputType", "Shield", "Local" } +[effect_gold_upkeep_free_units_communism] +type = "Unit_Upkeep_Free_Per_City" +value = 3 +reqs = + { "type", "name", "range", "present" + "Gov", "Communism", "Player", TRUE + "OutputType", "Gold", "Local", TRUE + } [effect_building_upkeep_communism] type = "Upkeep_Free" ; value = 1 @@ -1508,6 +1544,14 @@ reqs = "Gov", "Theocracy", "Player" "OutputType", "Shield", "Local" } +[effect_gold_upkeep_free_units_theocracy] +type = "Unit_Upkeep_Free_Per_City" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Theocracy", "Player" + "OutputType", "Gold", "Local" + } [effect_nationalism_unit_upkeep] type = "Upkeep_Factor" value = 1 @@ -1590,6 +1634,40 @@ reqs = ; { "type", "name", "range" ; "Gov", "Theocracy", "Player" ; } +;******************************************* RAZED BUILDINGS IN LIBERATED CITIES +[effect_razings_mean_govs] ;anarchy, despotism, communism +type = "Raze_Building_Pct" +value = 50 +reqs = + { "type","name", "range", "present" + "Gov", "Monarchy", "Player", FALSE + "Gov", "Republic", "Player", FALSE + "Gov", "Democracy", "Player", FALSE + "Gov", "Theocracy", "Player", FALSE + "Gov", "Nationalism","Player", FALSE + } +;Monarchy,Republic,Nationalism = Standard razechance: no effect. + +[effect_razings_nice_govs] ;theocracy, democracy +type = "Raze_Building_Pct" +value = -50 +reqs = + { "type","name", "range", "present" + "Gov", "Anarchy", "Player", FALSE + "Gov", "Despotism", "Player", FALSE + "Gov", "Monarchy", "Player", FALSE + "Gov", "Republic", "Player", FALSE + "Gov", "Communism", "Player", FALSE + "Gov", "Nationalism","Player", FALSE + } + +[effect_liberation_on_razing] +type = "Raze_Building_Pct" +value = -50 ; "mean" = razechance, "std" = 1/2 raze chance, "nice" = 0% +reqs = + { "type", "name", "range", "present" + "CityStatus", "OwnedByOriginal", "City", TRUE + } ;******************************************* EMPIRE SIZE / cities [effect_empire_size_base_anarchy] type = "Empire_Size_Base" @@ -1641,16 +1719,6 @@ reqs = { "type", "name", "range" "Gov", "Monarchy", "Player" } -;Replaced by [effect_empire_size_base_constitutional_monarchy] in order to make the Happy Tab more "accurately" -;portray the cause as the 'government' constitutional monarchy rather than caused by the 'building' -;[effect_23_12_empire_base_step_magna_carta] -;type = "Make_Content" -;value = 1 ; One extra content creates a 23/12 base/step -;reqs = -; { "type", "name", "range", "present" -; "Gov", "Monarchy", "Player", TRUE -; "Building", "Magna Carta", "Player", TRUE -; } [effect_empire_size_base_republic] type = "Empire_Size_Base" value = 13 @@ -1695,7 +1763,7 @@ reqs = } [effect_empire_size_base_communism] type = "Empire_Size_Base" -value = 12 +value = 9999 reqs = { "type", "name", "range" "Gov", "Communism", "Player" @@ -1774,6 +1842,64 @@ reqs = { "type", "name", "range" "Gov", "Nationalism", "Player" } +;********************************************** REHOME PROBABILITIES, governments +[effect_rehome_pct_despotism] +type = "Rehome_Pct" +value = 15 +reqs = + { "type", "name", "range" + "Gov", "Despotism", "Player" + } +[effect_rehome_pct_monarchy] +type = "Rehome_Pct" +value = 30 +reqs = + { "type", "name", "range" + "Gov", "Monarchy", "Player" + } +[effect_rehome_pct_const_monarchy] +type = "Rehome_Pct" +value = 15 ; 45 % +reqs = + { "type", "name", "range" + "Gov", "Monarchy", "Player" + "Building", "Magna Carta", "Player" + } +[effect_rehome_pct_communism] +type = "Rehome_Pct" +value = 45 +reqs = + { "type", "name", "range" + "Gov", "Communism", "Player" + } +[effect_rehome_pct_republic] +type = "Rehome_Pct" +value = 60 +reqs = + { "type", "name", "range" + "Gov", "Republic", "Player" + } +[effect_rehome_pct_nationalism] +type = "Rehome_Pct" +value = 60 +reqs = + { "type", "name", "range" + "Gov", "Nationalism", "Player" + } +[effect_rehome_pct_democracy] +type = "Rehome_Pct" +value = 75 +reqs = + { "type", "name", "range" + "Gov", "Democracy", "Player" + } +[effect_rehome_pct_theocracy] +type = "Rehome_Pct" +value = 90 +reqs = + { "type", "name", "range" + "Gov", "Theocracy", "Player" + } ;********************************************** MARTIAL LAW, governments [effect_martial_law_each_anarchy] type = "Martial_Law_Each" @@ -1869,37 +1995,182 @@ reqs = "Gov", "Nationalism", "Player" } ;********************************************* RAPTURE -[effect_rapture_grow_magna_carta] +[effect_rapture_grow_constitutional_monarchy] type = "Rapture_Grow" -value = 3 +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Magna Carta", "Player", TRUE + "Gov", "Monarchy", "Player", TRUE + } +[effect_rapture_rate_constitutional_monarchy] +type = "Rapture_Rate_Pm" +value = 800 ; 80% (4 out of 5) reqs = { "type", "name", "range", "present" - "CityStatus", "OwnedByOriginal", "City", TRUE "Building", "Magna Carta", "Player", TRUE + "Building", "Pyramids", "City", FALSE "Gov", "Monarchy", "Player", TRUE } +[effect_rapture_rate_constitutional_monarchy_not_founded] +type = "Rapture_Rate_Pm" +value = -550 ; 800-550 = 25% (1 out of 4) +reqs = + { "type", "name", "range", "present" + "Building", "Magna Carta", "Player", TRUE + "Building", "Pyramids", "City", FALSE + "Gov", "Monarchy", "Player", TRUE + "CityStatus", "OwnedByOriginal", "City", FALSE + } +[effect_rapture_rate_constitutional_monarchy_not_founded_no_nationals] +type = "Rapture_Rate_Pm" +value = 350 ; 250+350 = 600 = 60% (3 out of 5) +reqs = + { "type", "name", "range", "present" + "Building", "Magna Carta", "Player", TRUE + "Building", "Pyramids", "City", FALSE + "Gov", "Monarchy", "Player", TRUE + "CityStatus", "OwnedByOriginal", "City", FALSE + "MinForeignPct", "1", "City", FALSE + } + [effect_rapture_grow_republic] type = "Rapture_Grow" -value = 3 +value = 1 reqs = { "type", "name", "range" "Gov", "Republic", "Player" } +[effect_rapture_rate_republic] +type = "Rapture_Rate_Pm" +value = 900 ; 90% (9 out of 10) +reqs = + { "type", "name", "range", "present" + "Building", "Pyramids", "City", FALSE + "Gov", "Republic", "Player", TRUE + } +[effect_rapture_rate_republic_not_founded] +type = "Rapture_Rate_Pm" +value = -566 ; 900-566 = 334 = 33% (1 out of 3) +reqs = + { "type", "name", "range", "present" + "Building", "Pyramids", "City", FALSE + "Gov", "Republic", "Player", TRUE + "CityStatus", "OwnedByOriginal", "City", FALSE + } +[effect_rapture_rate_republic_not_founded_no_nationals] +type = "Rapture_Rate_Pm" +value = 466 ; 334+466 = 800 = 80% (8 out of 10) +reqs = + { "type", "name", "range", "present" + "Building", "Pyramids", "City", FALSE + "Gov", "Republic", "Player", TRUE + "CityStatus", "OwnedByOriginal", "City", FALSE + "MinForeignPct", "1", "City", FALSE + } + [effect_rapture_grow_democracy] type = "Rapture_Grow" -value = 3 +value = 1 reqs = { "type", "name", "range", "present" "Gov", "Democracy", "Player", TRUE - "MinForeignPct", "9", "City", FALSE } +[effect_rapture_rate_democracy_foreigners] +type = "Rapture_Rate_Pm" +value = 500 ; 50% +reqs = + { "type", "name", "range", "present" + "Building", "Pyramids", "City", FALSE + "Gov", "Democracy", "Player", TRUE + "MinForeignPct", "20", "City", TRUE + } +[effect_rapture_rate_democracy_foreigners2] +type = "Rapture_Rate_Pm" +value = -250 ; 500 - 250 = 25% +reqs = + { "type", "name", "range", "present" + "Building", "Pyramids", "City", FALSE + "Gov", "Democracy", "Player", TRUE + "MinForeignPct", "33", "City", TRUE + } + +[effect_rapture_grow_theocracy] +type = "Rapture_Grow" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Theocracy", "Player" + } +[effect_rapture_rate_theocracy1] +type = "Rapture_Rate_Pm" +value = 400 +reqs = + { "type", "name", "range", "present" + "Building", "Pyramids", "City", FALSE + "Gov", "Theocracy", "Player", TRUE + } +[effect_rapture_rate_theocracy2] +type = "Rapture_Rate_Pm" +value = 172 ; 400 + 172 = 57.2% (4 out of 7) +reqs = + { "type", "name", "range", "present" + "Building", "Pyramids", "City", FALSE + "Gov", "Theocracy", "Player", TRUE + "Building", "Cathedral", "City", TRUE + } + +[effect_rapture_grow_communism] +type = "Rapture_Grow" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Communism", "Player" + } +[effect_rapture_rate_communism1] +type = "Rapture_Rate_Pm" +value = 400 ; 2 out of 5 +reqs = + { "type", "name", "range", "present" + "Building", "Pyramids", "City", FALSE + "Gov", "Communism", "Player", TRUE + } + [effect_rapture_grow_nationalism] type = "Rapture_Grow" -value = 3 +value = 1 reqs = { "type", "name", "range" "Gov", "Nationalism", "Player" - "CityStatus", "OwnedByOriginal", "City" + } +[effect_rapture_rate_nationalism_original_with_foreign] +type = "Rapture_Rate_Pm" +value = 500 ; 1 out of 3 +reqs = + { "type", "name", "range", "present" + "Building", "Pyramids", "City", FALSE + "Gov", "Nationalism", "Player", TRUE + "CityStatus", "OwnedByOriginal", "City", TRUE + "MinForeignPct", "1", "City", TRUE + } +[effect_rapture_rate_nationalism_not_founded] +type = "Rapture_Rate_Pm" +value = 334 ; 1 out of 3 +reqs = + { "type", "name", "range", "present" + "Building", "Pyramids", "City", FALSE + "Gov", "Nationalism", "Player", TRUE + "CityStatus", "OwnedByOriginal", "City", FALSE + } +[effect_rapture_rate_nationalism_not_founded_no_foreign] +type = "Rapture_Rate_Pm" +value = 333 ; 333+334 = 667 = 67% (2 out of 3) +reqs = + { "type", "name", "range", "present" + "Building", "Pyramids", "City", FALSE + "Gov", "Nationalism", "Player", TRUE + "CityStatus", "OwnedByOriginal", "City", FALSE + "MinForeignPct", "1", "City", FALSE } ;********************************************** GOVERNMENT VET BONUSES @@ -2005,33 +2276,59 @@ type = "Output_Inc_Tile" value = 1 reqs = { "type", "name", "range" - "Gov", "Republic", "Player" - "OutputType", "Trade", "Local" + "Gov", "Republic", "Player" + "OutputType", "Trade", "Local" } [effect_gov_tile_bonus_democracy] type = "Output_Inc_Tile" value = 1 reqs = { "type", "name", "range" - "Gov", "Democracy", "Player" - "OutputType", "Trade", "Local" + "Gov", "Democracy", "Player" + "OutputType", "Trade", "Local" } [effect_gov_tile_bonus_theocracy] type = "Output_Inc_Tile_Celebrate" value = 1 reqs = - { "type", "name", "range" - "Gov", "Theocracy", "Player" - "OutputType", "Trade", "Local" + { "type", "name", "range", "present" + "Gov", "Theocracy", "Player", TRUE + "Building", "Angkor Wat", "Player", FALSE ;handled separately by the wonder + "OutputType", "Trade", "Local", TRUE } + +;Communism gets free +1 trade on irrigated road/river... [effect_gov_tile_bonus_communism] +type = "Output_Inc_Tile" +value = 1 +reqs = + { "type", "name", "range", "present" + "OutputType", "Trade", "Local", TRUE + "Extra", "Irrigation","Local", TRUE + "Gov", "Communism", "Player", TRUE + } +;..if it celebrates we add +1 only if it lacks irrigation: +[effect_gov_tile_bonus_communism_1] type = "Output_Inc_Tile_Celebrate" value = 1 reqs = - { "type", "name", "range" - "OutputType", "Trade", "Local" - "Gov", "Communism", "Player" + { "type", "name", "range", "present" + "OutputType", "Trade", "Local", TRUE + "Extra", "Irrigation","Local", FALSE + "Gov", "Communism", "Player", TRUE + } + +[effect_gov_city_center_food_bonus_communism] +type = "Output_Inc_Tile_Celebrate" +value = 1 +reqs = + { "type", "name", "range", "present" + "Gov", "Communism", "Player", TRUE + "CityTile", "Center", "Local", TRUE + "Building", "Granary", "City", TRUE + "OutputType", "Food", "Local", TRUE } + ; Nationalism gets trade bonus only on Land tiles unless celebrating. [effect_gov_tile_bonus_7] type = "Output_Inc_Tile" @@ -2147,6 +2444,13 @@ reqs = "Gov", "Theocracy", "Player" "OutputType", "Gold", "local" } +[effect_happy_believers_theocracy] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Theocracy", "Player" + } [effect_bad_lux_nationalism] type = "Output_Bonus_2" value = -15 @@ -2258,6 +2562,31 @@ reqs = "UnitClass", "Helicopter", "Local" } +[effect_amphitheatre] +type = "Make_Content" +value = 3 +reqs = + { "type", "name", "range" + "Building", "Amphitheatre", "City" + } + +[effect_amphitheatre_1] +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range" + "Tech", "Electricity", "Player" + "Building", "Amphitheatre", "City" + } + +[effect_amphitheatre_razings] +type = "Raze_Building_Pct" +value = -50 +reqs = + { "type", "name", "range" + "Building", "Amphitheatre", "Local" + } + ; Base max city size of 8 [effect_aqueduct_size] type = "Size_Adj" @@ -2279,23 +2608,31 @@ reqs = "Building", "Aqueduct", "City" } +[effect_aqueduct_razings] +type = "Raze_Building_Pct" +value = -50 +reqs = + { "type", "name", "range" + "Building", "Aqueduct", "Local" + } + [effect_bank_gold] type = "Output_Bonus" value = 50 reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - "Building", "Bank", "City" - "OutputType", "Gold", "Local" + { "type", "name", "range" + "Building", "Marketplace", "City" + "Building", "Bank", "City" + "OutputType", "Gold", "Local" } [effect_bank_luxury] type = "Output_Bonus" value = 50 reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - "Building", "Bank", "City" - "OutputType", "Luxury", "Local" + { "type", "name", "range" + "Building", "Marketplace", "City" + "Building", "Bank", "City" + "OutputType", "Luxury", "Local" } ;Changes require changes to city_force_income_update() in city.js [effect_bank_coinage] @@ -2312,169 +2649,85 @@ reqs = type = "Veteran_Build" value = 1 reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "Land", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE + { "type", "name", "range", "present" + "Building", "Barracks", "City", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", TRUE ;all land classes + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE } -[effect_barracks_2] +[effect_barracks_3] type = "Veteran_Build" value = 1 reqs = { "type", "name", "range", "present" "Building", "Barracks", "City", TRUE - "UnitClass", "LandRoad", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } + "UnitType", "Scout", "Local", TRUE + } [effect_barracks_a] type = "HP_Regen" value = 100 reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "Land", "Local", TRUE - } -[effect_barracks_b] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE ; might be resting in allied city with Barracks I - } -[effect_barracks_c] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE + { "type", "name", "range" + "Building", "Barracks", "City" + "UnitClassFlag", "TerrainSpeed", "Local" ;all land classes } [effect_barracks_ii] type = "Veteran_Build" value = 1 reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "Land", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_ii_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE + { "type", "name", "range", "present" + "Building", "Barracks II", "City", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", TRUE ;all land classes + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE } [effect_barracks_ii_2] type = "Veteran_Build" value = 1 reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE + { "type", "name", "range", "present" + "Building", "Barracks II", "City", TRUE + "UnitType", "Scout", "Local", TRUE } [effect_barracks_ii_a] type = "HP_Regen" value = 100 reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "Land", "Local", TRUE + { "type", "name", "range", "present" + "Building", "Barracks II", "City", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", TRUE ;all land classes } -[effect_barracks_ii_b] -type = "HP_Regen" -value = 100 + +[effect_barracks_iii] +type = "Veteran_Build" +value = 1 reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE + { "type", "name", "range", "present" + "Building", "Barracks III", "City", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", TRUE ;all land classes + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_barracks_iii_3] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks III", "City", TRUE + "UnitType", "Scout", "Local", TRUE } -[effect_barracks_ii_c] +[effect_barracks_iii_a] type = "HP_Regen" value = 100 reqs = - { "type", "name", "range", "present" - "Building", "Barracks II", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE + { "type", "name", "range" + "Building", "Barracks III", "City" + "UnitClassFlag", "TerrainSpeed", "Local" ;all land classes } -[effect_barracks_iii] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "Land", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_iii_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_iii_2] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_barracks_iii_a] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Barracks III", "City" - "UnitClass", "Land", "Local" - } -[effect_barracks_iii_b] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - } -[effect_barracks_iii_c] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Barracks III", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - } - -;prolongs time-window relevance of amphibious invasions later in game -[effect_triple_training_marines] +;prolongs time-window relevance of amphibious invasions later in game +[effect_triple_training_marines] type = "Veteran_Build" value = 1 reqs = @@ -2512,6 +2765,13 @@ reqs = "Building", "Cathedral", "City", TRUE "Building", "Michelangelo's Chapel", "Player", FALSE } +[effect_cathedral_razings] +type = "Raze_Building_Pct" +value = -50 +reqs = + { "type", "name", "range" + "Building", "Cathedral", "Local" + } ;--- ENHANCED CATHEDRAL with Michelangelo: *** [effect_cathedral_ma] type = "Make_Happy" @@ -2532,19 +2792,19 @@ reqs = ;============================================================== [effect_city_walls_vs_Land] type = "Defend_Bonus" -value = 200 ; 3x vs most Land +value = 100 ; 3x vs most Land reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "UnitClass", "Land", "Local", TRUE - "UnitType", "Catapult", "Local", FALSE - "UnitType", "Cannon", "Local", FALSE - "UnitType", "Artillery", "Local", FALSE - "UnitType", "Howitzer", "Local", FALSE + { "type", "name", "range", "present" + "Building", "City Walls", "City", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", TRUE + "UnitType", "Catapult", "Local", FALSE + "UnitType", "Cannon", "Local", FALSE + "UnitType", "Artillery", "Local", FALSE + "UnitType", "Howitzer", "Local", FALSE } [effect_city_walls_vs_Catapult_25pct_bonus] type = "Defend_Bonus" -value = 175 ; 2.75x vs Catapult +value = 75 ; 1.75x vs Catapult reqs = { "type", "name", "range", "present" "Building", "City Walls", "City", TRUE @@ -2552,36 +2812,20 @@ reqs = } [effect_city_walls_vs_Cannon_50pct_bonus] type = "Defend_Bonus" -value = 150 ; 2.5x vs Cannon +value = 50 ; 1.5x vs Cannon reqs = { "type", "name", "range", "present" "Building", "City Walls", "City", TRUE "UnitType", "Cannon", "Local", TRUE } -[effect_city_walls_vs_Artillery_75pct_bonus] +[effect_city_walls_vs_Artillery_50_pct_bonus] type = "Defend_Bonus" -value = 125 ; 2.25x vs Artillery +value = 50 ; 1.5x vs Artillery reqs = { "type", "name", "range", "present" "Building", "City Walls", "City", TRUE "UnitType", "Artillery", "Local", TRUE } -[effect_city_walls_vs_Land_2] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - } -[effect_city_walls_vs_Land_3] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "City Walls", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - } [effect_city_walls_1] type = "Unit_No_Lose_Pop" value = 1 @@ -2615,76 +2859,22 @@ reqs = { "type", "name", "range" "Building", "Fortifications", "City" } -[effect_fortifications_in_lowlands_bonus] + +[effect_fortifications_bonus] type = "Terrain_Defend_Add_Bonus" -value = 17 +value = 33 ; +0.33 added to base terrain bonus reqs = - { "type", "name", "range", "present" - "Building", "Fortifications", "City", TRUE - "Terrain", "Mountains", "Local", FALSE - "Terrain", "Hills", "Local", FALSE - } -[effect_fortifications_vs_Land] -type = "Defend_Bonus" -value = 50 ; 1.50x vs most Land; (1.5 * 1.17= 1.755; WAS: 75,1.75 on lowlands) -reqs = - { "type", "name", "range", "present" - "Building", "Fortifications", "City", TRUE - "Building", "City Walls", "City", FALSE - "Building", "Great Wall", "Player", FALSE - "UnitClass", "Land", "Local", TRUE - "UnitType", "Catapult", "Local", FALSE - "UnitType", "Cannon", "Local", FALSE - "UnitType", "Artillery", "Local", FALSE - "UnitType", "Howitzer", "Local", FALSE - } -[effect_fortifications_vs_Catapult] -type = "Defend_Bonus" -value = 25 ; 1.25x vs Catapult's 25% bonus hills,lowlands: 1.25,1.4625; WAS: 1.50,1.50 hills @50% -reqs = - { "type", "name", "range", "present" - "Building", "Fortifications", "City", TRUE - "Building", "City Walls", "City", FALSE - "Building", "Great Wall", "Player", FALSE - "UnitType", "Catapult", "Local", TRUE + { "type", "name", "range", "present" + "Building", "Fortifications", "City", TRUE + "Terrain", "Mountains", "Local", FALSE } - -;NOTE: -50% from Cannon nullifies +50% bonus: -;[effect_fortifications_vs_Cannon] -;type = "Defend_Bonus" -;value = 0 ; 1.00x vs Cannon's 50% bonus hills,lowlands: 1.00,1.17; WAS: 1.25,1.25 @ 25% -;reqs = -; { "type", "name", "range", "present" -; "Building", "Fortifications", "City", TRUE -; "Building", "City Walls", "City", FALSE -; "Building", "Great Wall", "Player", FALSE -; "UnitType", "Cannon", "Local", TRUE -; } - -;-75% from Artillery nullifies +50% bonus: 1.00,1.17; WAS: 1.00,1.00 @0% -;no need for an effect, therefore. - -; HOWITZER nullifies bonus: 1.00,1.17; WAS: 1.00,1.00 @0% - -[effect_fortifications_vs_Land_2] -type = "Defend_Bonus" -value = 50 -reqs = - { "type", "name", "range", "present" - "Building", "Fortifications", "City", TRUE - "Building", "City Walls", "City", FALSE - "Building", "Great Wall", "Player", FALSE - "UnitClass", "LandAirSea", "Local", TRUE - } -[effect_fortifications_vs_Land_3] -type = "Defend_Bonus" -value = 50 -reqs = - { "type", "name", "range", "present" - "Building", "Fortifications", "City", TRUE - "Building", "City Walls", "City", FALSE - "Building", "Great Wall", "Player", FALSE - "UnitClass", "LandNoKill", "Local", TRUE +[effect_fortifications_bonus2] +type = "Terrain_Defend_Add_Bonus" +value = 17 ;Grass,Plains,Desert,Tundra get extra +0.17 = +0.50 +reqs = + { "type", "name", "range", "present" + "Building", "Fortifications", "City", TRUE + "TerrainFlag", "Flat Land", "Local", TRUE } [effect_fortifications_1] type = "Unit_No_Lose_Pop" @@ -2693,38 +2883,40 @@ reqs = { "type", "name", "range" "Building", "Fortifications", "City" } -[effect_fortifications_sale_value] -type = "Improvement_Sale_Pct" -value = 100 ; full 'recycle value' after City Walls go up. -reqs = - { "type", "name", "range" - "Building", "Fortifications", "Local" - "Building", "City Walls", "City" - } +;Metallurgy increases cost of fortifications +[effect_fortifications_metallurgy_price_increase] +type = "Building_Build_Cost_Pct" +value = 29 +reqs = + { + "type", "name", "range", "present" + "Tech", "Metallurgy", "Player", TRUE + "Building", "Fortifications", "Local", TRUE + } ; GREAT Wall ;-------------------------------------------------------- [effect_great_wall_0_vs_Land_original] type = "Defend_Bonus" -value = 200 ; 3x vs most Land -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Building", "Citadel of Aleppo", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", TRUE - "UnitClass", "Land", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "UnitType", "Catapult", "Local", FALSE - "UnitType", "Cannon", "Local", FALSE - "UnitType", "Artillery", "Local", FALSE - "UnitType", "Howitzer", "Local", FALSE - "Tech", "Machine Tools", "World", FALSE +value = 100 ; 2x vs most Land +reqs = + { "type", "name", "range", "present" + "Building", "Great Wall", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Building", "Citadel of Aleppo", "City", FALSE + "Age", "3", "City", TRUE + "CityStatus", "OwnedByOriginal", "City", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", TRUE ;all land classes + "CityTile", "Center", "Local", TRUE + "UnitType", "Catapult", "Local", FALSE + "UnitType", "Cannon", "Local", FALSE + "UnitType", "Artillery", "Local", FALSE + "UnitType", "Howitzer", "Local", FALSE + "Tech", "Machine Tools", "World", FALSE } [effect_great_wall_0_vs_Catapult25pct_bonus_original] type = "Defend_Bonus" -value = 175 ; 2.75x vs Catapult +value = 75 ; 1.75x vs Catapult reqs = { "type", "name", "range", "present" "Building", "Great Wall", "Player", TRUE @@ -2738,7 +2930,7 @@ reqs = } [effect_great_wall_0_vs_Cannon50pct_bonus_original] type = "Defend_Bonus" -value = 150 ; 2.5x vs Cannon +value = 50 ; 1.5x vs Cannon reqs = { "type", "name", "range", "present" "Building", "Great Wall", "Player", TRUE @@ -2750,12 +2942,11 @@ reqs = "UnitType", "Cannon", "Local", TRUE "Tech", "Machine Tools", "World", FALSE } - -; 2.25x vs Artillery not needed since Machine Tools expires it. +; 1.5x vs Artillery not needed since Machine Tools expires it. [effect_great_wall_0_assimilated] type = "Defend_Bonus" -value = 200 ; 3x vs most Land +value = 100 ; 2x vs most Land reqs = { "type", "name", "range", "present" "Building", "Great Wall", "Player", TRUE @@ -2764,7 +2955,7 @@ reqs = "Age", "3", "City", TRUE "CityStatus", "OwnedByOriginal", "City", FALSE "MinForeignPct", "19", "City", FALSE - "UnitClass", "Land", "Local", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", TRUE ; all land classes "CityTile", "Center", "Local", TRUE "UnitType", "Catapult", "Local", FALSE "UnitType", "Cannon", "Local", FALSE @@ -2774,7 +2965,7 @@ reqs = } [effect_great_wall_0_vs_Catapult25pct_bonus_assimilated] type = "Defend_Bonus" -value = 175 ; 2.75x vs Catapult +value = 75 ; 1.75x vs Catapult reqs = { "type", "name", "range", "present" "Building", "Great Wall", "Player", TRUE @@ -2789,7 +2980,7 @@ reqs = } [effect_great_wall_0_vs_Cannon50pct_bonus_assimilated] type = "Defend_Bonus" -value = 150 ; 2.5x vs. Cannon +value = 50 ; 1.5x vs. Cannon reqs = { "type", "name", "range", "present" "Building", "Great Wall", "Player", TRUE @@ -2802,67 +2993,8 @@ reqs = "UnitType", "Cannon", "Local", TRUE "Tech", "Machine Tools", "World", FALSE } +; 1.5x vs Artillery not needed since Machine Tools expires it. -; 2.25x vs Artillery not needed since Machine Tools expires it. - -[effect_great_wall_1_original] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Building", "Citadel of Aleppo", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", TRUE - "UnitClass", "LandNoKill", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_1_assimilated] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Building", "Citadel of Aleppo", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", FALSE - "MinForeignPct", "19", "City", FALSE - "UnitClass", "LandNoKill", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_3_original] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Building", "Citadel of Aleppo", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", TRUE - "UnitClass", "LandAirSea", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "Tech", "Machine Tools", "World", FALSE - } -[effect_great_wall_3_assimilated] -type = "Defend_Bonus" -value = 200 -reqs = - { "type", "name", "range", "present" - "Building", "Great Wall", "Player", TRUE - "Building", "City Walls", "City", FALSE - "Building", "Citadel of Aleppo", "City", FALSE - "Age", "3", "City", TRUE - "CityStatus", "OwnedByOriginal", "City", FALSE - "MinForeignPct", "19", "City", FALSE - "UnitClass", "LandAirSea", "Local", TRUE - "CityTile", "Center", "Local", TRUE - "Tech", "Machine Tools", "World", FALSE - } [effect_great_wall_poploss_original] type = "Unit_No_Lose_Pop" value = 1 @@ -2919,33 +3051,9 @@ reqs = type = "Defend_Bonus" value = 100 reqs = - { "type", "name", "range" - "Building", "Coastal Defense", "City" - "UnitClass", "Sea", "Local" - } -[effect_coastal_defense_1] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Coastal Defense", "City" - "UnitClass", "RiverShip", "Local" - } -[effect_coastal_defense_2] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Coastal Defense", "City" - "UnitClass", "Submarine", "Local" - } -[effect_coastal_defense_trireme] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Coastal Defense", "City" - "UnitClass", "Trireme", "Local" + { "type", "name", "range" + "Building", "Coastal Defense", "City" + "UnitClassFlag", "WaterVessel", "Local" } [effect_coastal_defense_visible] type = "Visible_Walls" @@ -2959,77 +3067,20 @@ reqs = type = "Defend_Bonus" value = 100 reqs = - { "type", "name", "range", "present" - "Building", "Gibraltar Fortress", "City", TRUE - "Building", "Coastal Defense", "City", TRUE - "UnitClass", "Sea", "Local" - } -[effect_gibraltar_fortress_city_1] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Gibraltar Fortress", "City", TRUE - "Building", "Coastal Defense", "City", TRUE - "UnitClass", "RiverShip", "Local" - } -[effect_gibraltar_fortress_city_2] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Gibraltar Fortress", "City", TRUE - "Building", "Coastal Defense", "City", TRUE - "UnitClass", "Submarine", "Local" - } -[effect_gibraltar_fortress_city_trireme] -type = "Defend_Bonus" -value = 100 -reqs = - { "type", "name", "range", "present" - "Building", "Gibraltar Fortress", "City", TRUE - "Building", "Coastal Defense", "City", TRUE - "UnitClass", "Trireme", "Local" + { "type", "name", "range", "present" + "Building", "Gibraltar Fortress", "City", TRUE + "Building", "Coastal Defense", "City", TRUE + "UnitClassFlag", "WaterVessel", "Local", TRUE } [effect_gibraltar_fortress] type = "Defend_Bonus" value = 25 reqs = - { "type", "name", "range", "present" - "Building", "Gibraltar Fortress", "Player", TRUE - "Building", "Gibraltar Fortress", "City", FALSE - "Building", "Coastal Defense", "City", TRUE - "UnitClass", "Sea", "Local" - } -[effect_gibraltar_fortress_1] -type = "Defend_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Gibraltar Fortress", "Player", TRUE - "Building", "Gibraltar Fortress", "City", FALSE - "Building", "Coastal Defense", "City", TRUE - "UnitClass", "RiverShip", "Local" - } -[effect_gibraltar_fortress_2] -type = "Defend_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Gibraltar Fortress", "Player", TRUE - "Building", "Gibraltar Fortress", "City", FALSE - "Building", "Coastal Defense", "City", TRUE - "UnitClass", "Submarine", "Local" - } -[effect_gibraltar_fortress_trireme] -type = "Defend_Bonus" -value = 25 -reqs = - { "type", "name", "range", "present" - "Building", "Gibraltar Fortress", "Player", TRUE - "Building", "Gibraltar Fortress", "City", FALSE - "Building", "Coastal Defense", "City", TRUE - "UnitClass", "Trireme", "Local" + { "type", "name", "range", "present" + "Building", "Gibraltar Fortress", "Player", TRUE + "Building", "Gibraltar Fortress", "City", FALSE + "Building", "Coastal Defense", "City", TRUE + "UnitClassFlag", "WaterVessel", "Local", TRUE } [effect_gibraltar_fortress_coastal_defense_discount] type = "Building_Build_Cost_Pct" @@ -3050,27 +3101,19 @@ reqs = ; } ;------------------------------------------------------------ -[effect_amphitheatre] -type = "Make_Content" -value = 3 -reqs = - { "type", "name", "range" - "Building", "Amphitheatre", "City" - } - -[effect_amphitheatre_1] -type = "Make_Content" -value = 1 -reqs = - { "type", "name", "range" - "Tech", "Electricity", "Player" - "Building", "Amphitheatre", "City" - } - ; BECAUSE OF ROUNDING, AVERAGE EFFECT OF 50 ENDS UP BEING 41%, WHEREAS 60 YIELDS ABOUT 53% WHICH IS CLOSER TO ADVERTISED [effect_courthouse_corruption1] type = "Output_Waste_Pct" value = 60 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "OutputType", "Trade", "Local", TRUE + } +; If there is corruption, a Courthouse is never worthless: it will always reduce at least 1 corruption. +[effect_courthouse_corruption2] +type = "Output_Waste_Min_Reduce" +value = 1 reqs = { "type", "name", "range", "present" "Building", "Courthouse", "City", TRUE @@ -3265,6 +3308,13 @@ reqs = { "type", "name", "range" "Building", "Granary", "City" } +[effect_granary_razings] +type = "Raze_Building_Pct" +value = -50 +reqs = + { "type", "name", "range" + "Building", "Granary", "Local" + } [effect_harbour] type = "Output_Add_Tile" @@ -3275,6 +3325,13 @@ reqs = "Building", "Harbour", "City" "OutputType", "Food", "Local" } +[effect_harbour_razings] +type = "Raze_Building_Pct" +value = -50 +reqs = + { "type", "name", "range" + "Building", "Harbour", "Local" + } [effect_library] type = "Output_Bonus" @@ -3306,9 +3363,32 @@ reqs = type = "Coinage_Bonus_Pm" value = 250; 250‰=25% reqs = - { "type", "name", "range", "present" - "Building", "Marketplace", "City", TRUE - "Gov", "Communism", "Player", FALSE + { "type", "name", "range", "present" + "Building", "Marketplace", "City", TRUE + "Gov", "Communism", "Player", FALSE + } +[effect_marketplace_razings] +type = "Raze_Building_Pct" +value = -50 +reqs = + { "type", "name", "range" + "Building", "Marketplace", "Local" + } + +;City Radius +[effect_bigger_size_21_cities] +type = "City_Radius_Sq" ;size 21 cities get 5x5+corners +value = 3 +reqs = + { "type", "name", "range", "present" + "MinSize", "21", "City", TRUE + } +[effect_bigger_size_30_cities] +type = "City_Radius_Sq" ;size 30 cities get 7x7-corners +value = 2 +reqs = + { "type", "name", "range", "present" + "MinSize", "30", "City", TRUE } ; No population pollution until certain techs researched @@ -3316,12 +3396,12 @@ reqs = type = "Pollu_Pop_Pct_2" value = -100 -[effect_pollu_pop_automobile] +[effect_pollu_pop_combustion] type = "Pollu_Pop_Pct_2" value = 25 reqs = { "type", "name", "range" - "Tech", "Automobile", "Player" + "Tech", "Combustion", "Player" } [effect_pollu_pop_industrialization] type = "Pollu_Pop_Pct_2" @@ -3417,6 +3497,15 @@ reqs = [effect_palace_corruption_reduction] type = "Output_Waste_Pct" value = 60 +reqs = + { "type", "name", "range" + "Building", "Palace", "City" + "OutputType", "Trade", "Local" + } +; If there is corruption, a Palace is never worthless: it will always reduce at least 1 corruption. +[effect_palace_corruption_reduction2] +type = "Output_Waste_Min_Reduce" +value = 1 reqs = { "type", "name", "range" "Building", "Palace", "City" @@ -3473,7 +3562,7 @@ reqs = } [effect_palace_communism] type = "Output_Bonus" -value = 25 +value = 40 reqs = { "type", "name", "range" "Gov", "Communism", "Player" @@ -3493,6 +3582,15 @@ reqs = [effect_ecclesiastical_palace] type = "Output_Waste_Pct" value = 60 +reqs = + { "type", "name", "range", "present" + "Building", "Ecclesiastical Palace", "City", TRUE + "OutputType", "Trade", "Local", TRUE + } +; If there is corruption, an Ecc. Palace is never worthless: it will always reduce at least 1 corruption. +[effect_ecclesiastical_palace_1] +type = "Output_Waste_Min_Reduce" +value = 1 reqs = { "type", "name", "range", "present" "Building", "Ecclesiastical Palace", "City", TRUE @@ -3604,14 +3702,22 @@ reqs = "Gov", "Democracy", "Player", TRUE "Building", "Police Station", "City", TRUE } -[effect_police_station_nationalism] -type = "Make_Content_Mil" -value = 1 ; 2+1 = 3 effect for police station +[effect_police_station_authoritarian] +type = "Force_Content" +value = 2 reqs = { "type", "name", "range", "present" "Building", "Police Station", "City", TRUE - "Gov", "Nationalism", "Player", TRUE - } + "Gov", "Anarchy", "Player", FALSE +; "Gov", "Despotism", "Player", FALSE + "Gov", "Monarchy", "Player", FALSE + "Gov", "Republic", "Player", FALSE + "Gov", "Democracy", "Player", FALSE + "Gov", "Theocracy", "Player", FALSE +; "Gov", "Communism", "Player", FALSE +; "Gov", "Nationalism", "Player", FALSE + } + [effect_police_station_vet_diplo] type = "Veteran_Build" value = 1 @@ -3757,78 +3863,24 @@ reqs = type = "Veteran_Build" value = 1 reqs = - { "type", "name", "range", "present" - "Building", "Port Facility", "City", TRUE - "UnitClass", "Sea", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_port_facility_a] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Port Facility", "City", TRUE - "UnitClass", "RiverShip", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_port_facility_b] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Port Facility", "City", TRUE - "UnitClass", "Submarine", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE + { "type", "name", "range", "present" + "Building", "Port Facility", "City", TRUE + "UnitClassFlag", "WaterVessel", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE } [effect_port_facility_1] type = "HP_Regen" value = 100 reqs = - { "type", "name", "range" - "Building", "Port Facility", "City" - "UnitClass", "Sea", "Local" - } -[effect_port_facility_1a] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Port Facility", "City" - "UnitClass", "RiverShip", "Local" - } -[effect_port_facility_1b] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Port Facility", "City" - "UnitClass", "Submarine", "Local" - } -[effect_port_facility_trireme] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Port Facility", "City", TRUE - "UnitClass", "Trireme", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_port_facility_trireme_1] -type = "HP_Regen" -value = 100 -reqs = - { "type", "name", "range" - "Building", "Port Facility", "City" - "UnitClass", "Trireme", "Local" + { "type", "name", "range" + "Building", "Port Facility", "City" + "UnitClassFlag", "WaterVessel", "Local" } ;************************************************************************** POWER PLANTS [effect_coal_plant] type = "Output_Bonus" -value = 20 +value = 30 reqs = { "type", "name", "range", "present" "Building", "Factory", "City", TRUE @@ -3844,7 +3896,7 @@ type = "Output_Bonus" value = 20 reqs = { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE + "Tech", "Mass Production","Player", TRUE "Building", "Coal Plant", "City", TRUE "OutputType", "Shield", "Local", TRUE "Building", "Nuclear Plant", "City", FALSE @@ -3854,7 +3906,7 @@ reqs = } [effect_coal_plant_upgrade_1] type = "Improvement_Sale_Pct" -value = 70 ; full 'recycle value' after City Walls go up. +value = 70 ; 'recycle value' after Hydro goes in reqs = { "type", "name", "range" "Building", "Coal Plant", "Local" @@ -3862,7 +3914,7 @@ reqs = } [effect_coal_plant_upgrade_2] type = "Improvement_Sale_Pct" -value = 70 ; full 'recycle value' after City Walls go up. +value = 70 ; 'recycle value' after Hydro goes in reqs = { "type", "name", "range" "Building", "Coal Plant", "Local" @@ -3870,7 +3922,7 @@ reqs = } [effect_coal_plant_upgrade_3] type = "Improvement_Sale_Pct" -value = 70 ; full 'recycle value' after City Walls go up. +value = 70 ; 'recycle value' after Hydro goes in reqs = { "type", "name", "range","present" "Building", "Coal Plant", "Local", TRUE @@ -3881,7 +3933,7 @@ reqs = ;--------------------------------------------------------- [effect_hydro_plant] type = "Output_Bonus" -value = 20 +value = 30 reqs = { "type", "name", "range", "present" "Building", "Factory", "City", TRUE @@ -3895,17 +3947,17 @@ reqs = type = "Output_Bonus" value = 20 reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Hydro Plant", "City", TRUE - "OutputType","Shield", "Local", TRUE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Hoover Dam", "City", FALSE - "Building", "Fusion Reactor","Player", FALSE + { "type", "name", "range", "present" + "Tech", "Mass Production","Player", TRUE + "Building", "Hydro Plant", "City", TRUE + "OutputType","Shield", "Local", TRUE + "Building", "Nuclear Plant", "City", FALSE + "Building", "Hoover Dam", "City", FALSE + "Building", "Fusion Reactor", "Player", FALSE } [effect_hydro_plant_2] type = "Pollu_Prod_Pct" -value = -25 +value = -30 reqs = { "type", "name", "range", "present" "Building", "Factory", "City", TRUE @@ -3918,10 +3970,10 @@ reqs = } [effect_hydro_plant_3] type = "Pollu_Prod_Pct" -value = -25 +value = -20 reqs = { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE + "Tech", "Mass Production", "Player", TRUE "Building", "Hydro Plant", "City", TRUE "Building", "Recycling Center", "City", FALSE "Building", "Fusion Reactor", "Player",FALSE @@ -3929,18 +3981,25 @@ reqs = "Building", "Hoover Dam", "City", FALSE "Building", "Nuclear Plant", "City", FALSE } +[effect_hydro_plant_razings] +type = "Raze_Building_Pct" +value = -50 +reqs = + { "type", "name", "range" + "Building", "Hydro Plant", "Local" + } ;--------------------------------------------------------- [effect_hoover_dam_city_1] type = "Output_Bonus" -value = 154 +value = 160 reqs = - { "type", "name", "range" - "Building", "Hoover Dam", "City" - "OutputType", "Shield", "Local" + { "type", "name", "range", "present" + "Building", "Hoover Dam", "City", TRUE + "OutputType", "Shield", "Local", TRUE } [effect_hoover_dam_city_2] -type = "Pollu_Prod_Pct" ;-25 for factory, -25 for mfg_plant -value = -50 +type = "Pollu_Prod_Pct" ;-60: zero excess pollution +value = -60 reqs = { "type", "name", "range", "present" "Building", "Hoover Dam", "City", TRUE @@ -3948,28 +4007,23 @@ reqs = "Building", "Solar Plant", "City", FALSE "Building", "Fusion Reactor", "Player", FALSE } -; _ _ _ Bonuses for Hydro Plants in other cities: _ _ _ -[effect_hoover_hydro_plant_bonus_1] -type = "Output_Bonus" -value = 7 +[effect_hoover_dam_city_3] +type = "Pollu_Prod_Pct" ;-30 for factory, -20 for mass prod, -30 for fusion reactor +value = -80 reqs = - { "type", "name", "range", "present" - "Building", "Hoover Dam", "Player", TRUE - "Building", "Hoover Dam", "City", FALSE - "Building", "Factory", "City", TRUE - "Building", "Hydro Plant", "City", TRUE - "OutputType","Shield", "Local", TRUE - "Building", "Nuclear Plant", "City", FALSE - "Building", "Fusion Reactor", "Player", FALSE + { "type", "name", "range", "present" + "Building", "Hoover Dam", "City", TRUE + "Building", "Fusion Reactor", "Player", TRUE } -[effect_hoover_hydro_plant_bonus_2] +; _ _ _ Bonuses for Hydro Plants in other cities: _ _ _ +[effect_hoover_hydro_plant_is_like_nuclear] ; effect on other hydro plants type = "Output_Bonus" -value = 7 +value = 10 reqs = { "type", "name", "range", "present" "Building", "Hoover Dam", "Player", TRUE "Building", "Hoover Dam", "City", FALSE - "Building", "Mfg. Plant", "City", TRUE + "Tech", "Mass Production","Player",TRUE "Building", "Hydro Plant", "City", TRUE "OutputType","Shield", "Local", TRUE "Building", "Nuclear Plant", "City", FALSE @@ -3992,19 +4046,12 @@ reqs = "Tech", "Conscription", "Player", TRUE "Building", "Hoover Dam", "City", TRUE } -;Waiting on an Effect which can compare or inject range value. -;[effect_hoover_hydro_upkeep] -;type = "Upkeep_Reduce" -;value = 1 -;reqs = -; { "type", "name", "range", "present" -; "Building", "Hoover Dam", "Player", TRUE -; "Building", "Hydro Plant", "Local", TRUE -; } ;--------------------------------------------------------- +;... +;Nuclear Plants require Mass Production so are a flat +60 [effect_nuclear_plant] type = "Output_Bonus" -value = 30 +value = 60 reqs = { "type", "name", "range", "present" "Building", "Factory", "City", TRUE @@ -4013,20 +4060,9 @@ reqs = "Building", "Hoover Dam", "City", FALSE "Building", "Fusion Reactor","Player", FALSE } -[effect_nuclear_plant_1] -type = "Output_Bonus" -value = 30 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Nuclear Plant", "City", TRUE - "OutputType","Shield", "Local", TRUE - "Building", "Fusion Reactor", "Player", FALSE - "Building", "Hoover Dam", "City", FALSE - } [effect_nuclear_plant_2] type = "Pollu_Prod_Pct" -value = -25 +value = -50 reqs = { "type", "name", "range", "present" "Building", "Factory", "City", TRUE @@ -4036,35 +4072,26 @@ reqs = "Building", "Hoover Dam", "City", FALSE "Building", "Solar Plant", "City", FALSE } -[effect_nuclear_plant_3] -type = "Pollu_Prod_Pct" -value = -25 -reqs = - { "type", "name", "range", "present" - "Building", "Mfg. Plant", "City", TRUE - "Building", "Nuclear Plant", "City", TRUE - "Building", "Recycling Center", "City", FALSE - "Building", "Fusion Reactor", "Player", FALSE - "Building", "Hoover Dam", "City", FALSE - "Building", "Solar Plant", "City", FALSE - } ;--------------------------------------------------------- -[effect_fusion_reactor] +;... +;Fusion Reactor requires Mass Production so is a flat +80 +[effect_fusion_reactor_1] type = "Output_Bonus" -value = 40 +value = 80 reqs = { "type", "name", "range", "present" "Building", "Fusion Reactor", "Player", TRUE + "Building", "Hoover Dam", "City", FALSE "Building", "Factory", "City", TRUE "OutputType", "Shield", "Local", TRUE } -[effect_fusion_reactor_1] +[effect_fusion_reactor_1a_hoover] type = "Output_Bonus" -value = 40 +value = 20 reqs = { "type", "name", "range", "present" "Building", "Fusion Reactor", "Player", TRUE - "Building", "Mfg. Plant", "City", TRUE + "Building", "Hoover Dam", "City", TRUE "OutputType", "Shield", "Local", TRUE } [effect_fusion_reactor_2] @@ -4157,9 +4184,9 @@ value = 2 ; .... ; A Solar Plant combines with Recycling Center to eliminate 90% ; pollution. A Fusion Reactor saves 80% instead of 66%, in which case -; we prefer the Fuction Reactor's bonus. A Fusion reactor supercedes +; we prefer the Fuction Reactor's bonus. A Fusion reactor supersedes ; the Solar Plant's 75% bonus but doesn't get the combination bonus, so -; has to "unsupercede" in the case of Recycling and Solar both present: +; has to "unsupersede" in the case of Recycling and Solar both present: ; .... ; Case 1: neither SP or FR is present. Highest in food chain, full 66%: [effect_recycling_center_1] @@ -4183,11 +4210,11 @@ reqs = "Building", "Solar Plant", "City", TRUE } ; Case 3: SP and Fusion Reactor both present and higher on food chain. -; Solar Plant "wakes up" from being superceded by Fusion Reactor to +; Solar Plant "wakes up" from being superseded by Fusion Reactor to ; deliver its promised 90% combinatorial bonus with Recycling Center: [effect_recycling_center_3] type = "Pollu_Prod_Pct" -value = -10 ; Fusion reactor superceded to -80%. -10 = -90% +value = -10 ; Fusion reactor superseded to -80%. -10 = -90% reqs = { "type", "name", "range", "present" "Building", "Recycling Center", "City", TRUE @@ -4234,7 +4261,13 @@ reqs = "Building", "Research Lab", "City" "OutputType", "Science", "Local" } - +[effect_sam_battery_visible] +type = "Visible_Walls" +value = 16 +reqs = + { "type", "name", "range" + "Building", "SAM Battery", "City" + } [effect_sam_battery] type = "Defend_Bonus" value = 100 @@ -4320,6 +4353,13 @@ reqs = "Building", "Aqueduct", "City" "Building", "Sewer System", "City" } +[effect_sewer_razings] +type = "Raze_Building_Pct" +value = -50 +reqs = + { "type", "name", "range" + "Building", "Sewer System", "Local" + } [effect_space_component] type = "SS_Component" @@ -4492,24 +4532,55 @@ reqs = type = "Output_Per_Tile" value = 100 reqs = - { "type", "name", "range" - "Extra", "Farmland", "Local" - "Building", "Supermarket", "City" - "OutputType", "Food", "Local" + { "type", "name", "range", "present" + "Gov", "Communism", "Player", FALSE + "Building", "Supermarket", "City", TRUE + "Extra", "Farmland", "Local", TRUE + "OutputType", "Food", "Local", TRUE } - [effect_supermarket_center] type = "Output_Per_Tile" value = 50 reqs = - { "type", "name", "range", "present" - "CityTile", "Center", "Local", TRUE - "Extra", "Farmland", "Local", FALSE - "TerrainAlter", "CanIrrigate", "Local", TRUE - "Building", "Supermarket", "City", TRUE - "OutputType", "Food", "Local", TRUE - "Extra", "Mine", "Local", FALSE - "Extra", "Oil Well", "Local", FALSE + { "type", "name", "range", "present" + "Gov", "Communism", "Player", FALSE + "CityTile", "Center", "Local", TRUE + "Extra", "Farmland", "Local", FALSE + "TerrainAlter", "CanIrrigate", "Local", TRUE + "Building", "Supermarket", "City", TRUE + "OutputType", "Food", "Local", TRUE + "Extra", "Mine", "Local", FALSE + "Extra", "Oil Well", "Local", FALSE + } +[effect_supermarket_razings] +type = "Raze_Building_Pct" +value = -50 +reqs = + { "type", "name", "range" + "Building", "Supermarket", "Local" + } +[effect_communism_free_supermarket_effect] +type = "Output_Per_Tile" +value = 100 +reqs = + { "type", "name", "range" + "Gov", "Communism", "Player" + "Extra", "Farmland", "Local" + "OutputType", "Food", "Local" + } +[effect_communism_free_supermarket_center] +type = "Output_Per_Tile" +value = 50 +reqs = + { "type", "name", "range", "present" + "Gov", "Communism", "Player", TRUE + "CityTile", "Center", "Local", TRUE + "Extra", "Farmland", "Local", FALSE + "TerrainAlter", "CanIrrigate", "Local", TRUE + "Building", "Supermarket", "City", TRUE + "OutputType", "Food", "Local", TRUE + "Extra", "Mine", "Local", FALSE + "Extra", "Oil Well", "Local", FALSE } [effect_temple] @@ -4528,6 +4599,13 @@ reqs = "Tech", "Mysticism", "Player" "Building", "Temple", "City" } +[effect_temple_razings] +type = "Raze_Building_Pct" +value = -50 +reqs = + { "type", "name", "range" + "Building", "Temple", "Local" + } [effect_totem_pole] type = "Output_Add_Tile" @@ -4538,6 +4616,13 @@ reqs = "CityTile", "Center", "Local" "OutputType", "Luxury", "Local" } +[effect_totem_pole_razings] +type = "Raze_Building_Pct" +value = -50 +reqs = + { "type", "name", "range" + "Building", "Totem Pole", "Local" + } [effect_university] type = "Output_Bonus" @@ -4557,22 +4642,16 @@ reqs = "Tech", "Electricity", "Player" } ; Air+Sea+LandAirSea CLASS units REQUIRE PHYSICS so their BONUS -; is in their stats to AVOID more [effect_] entries. +; is in their stats for better documentation generation. [effect_physics_vision] type = "Unit_Vision_Radius_Sq" value = 4 reqs = - { "type", "name", "range" - "Tech", "Physics", "Player" - "UnitClass", "Land", "Local" - } -[effect_physics_vision_1] -type = "Unit_Vision_Radius_Sq" -value = 4 -reqs = - { "type", "name", "range" - "Tech", "Physics", "Player" - "UnitClass", "LandNoKill", "Local" + { "type", "name", "range", "present" + "Tech", "Physics", "Player", TRUE + "UnitClassflag", "TerrainSpeed", "Local", TRUE + "UnitClass", "LandAirSea", "Local", FALSE + } [effect_physics_vision_2] type = "Unit_Vision_Radius_Sq" @@ -4590,37 +4669,21 @@ reqs = "Tech", "Physics", "Player" "UnitClass", "RiverShip", "Local" } -[effect_satellite_vision] ;Vision benefit from satellite communication to land units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "Land", "Local" - } -[effect_satellite_vision_1] ;Vision benefit from satellite communication to land units (Marines) +[effect_satellite_vision] ;Vision benefit from satellite communication to Land units type = "Unit_Vision_Radius_Sq" value = 7 reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "LandAirSea", "Local" + { "type", "name", "range" + "Tech", "Space Flight", "Player" + "UnitClassFlag", "TerrainSpeed", "Local" } [effect_satellite_vision_2] ;Vision benefit from satellite communication to sea units type = "Unit_Vision_Radius_Sq" value = 7 reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "Sea", "Local" - } -[effect_satellite_vision_2a] ;Vision benefit from satellite communication to sea units -type = "Unit_Vision_Radius_Sq" -value = 7 -reqs = - { "type", "name", "range" - "Tech", "Space Flight", "Player" - "UnitClass", "Submarine", "Local" + { "type", "name", "range" + "Tech", "Space Flight", "Player" + "UnitClassFlag", "WaterVessel", "Local" } [effect_satellite_vision_3] ;Vision benefit from satellite communication to sea units type = "Unit_Vision_Radius_Sq" @@ -4749,10 +4812,11 @@ reqs = } [effect_agoge_move_bonus_2] type = "Move_Bonus" -value = 9 ; 3/9 + 6/9 = 1 +value = 6 ; 3/9 + 6/9 = 1 reqs = { "type", "name", "range", "present" - "Building", "Agōgē of Sparta", "City", TRUE + "Building", "Agōgē of Sparta", "Player", TRUE + "CityTile", "Center", "Local", TRUE "UnitFlag", "FootSoldier", "Local", TRUE } [effect_agoge_phalanx] @@ -4793,23 +4857,32 @@ type = "Veteran_Build" value = 1 reqs = { "type", "name", "range", "present" - "Building", "Agōgē of Sparta", "Player", TRUE + "Building", "Agōgē of Sparta", "City", TRUE "Building", "Barracks", "City", FALSE - "UnitClass", "Land", "Local", TRUE + "UnitClassFlag","TerrainSpeed", "Local", TRUE + "UnitType", "Phalanx", "Local", FALSE "UnitFlag", "NonMil", "Local", FALSE "UnitFlag", "NoVeteran", "Local", FALSE } -[effect_agoge_veteran_build2] +[effect_agoge_veteran_build_phalanx] type = "Veteran_Build" value = 1 reqs = { "type", "name", "range", "present" - "Building", "Agōgē of Sparta", "Player", TRUE - "Building", "Barracks", "City", FALSE - "UnitClass", "LandNoKill", "Local", TRUE + "Building", "Agōgē of Sparta", "City", TRUE + "UnitType", "Phalanx", "Local", TRUE "UnitFlag", "NonMil", "Local", FALSE "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_agoge_barracks_a] +type = "HP_Regen" +value = 100 +reqs = + { "type", "name", "range", "present" + "Building", "Agōgē of Sparta", "City", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", TRUE } + ; ------------------------------------------------------------- ; This can't be done properly as fortified attack bonus because ; attacking resets fortified state right before it happens. This @@ -4830,24 +4903,28 @@ reqs = } ;************************************************************************ Angkor Wat -[effect_angkor_wat_free_tile_bonus_monarchy] ;free celebration tile output -type = "Output_Inc_Tile" +[effect_angkor_wat_free_tile_celeb_bonus] ;free celebration tile output +type = "Output_Inc_Tile" ; monarchy and theocracy value = 1 reqs = - { "type", "name", "range" - "Building", "Angkor Wat", "Player" - "Gov", "Monarchy", "Player" - "OutputType", "Trade", "Local" - "MinSize", "3", "City" - } -[effect_angkor_wat_free_tile_bonus_despotism] ;free celebration tile output + { "type", "name", "range", "present" + "Building", "Angkor Wat", "Player", TRUE + "Gov", "Anarchy", "Player", FALSE + "Gov", "Despotism", "Player", FALSE + "Gov", "Republic", "Player", FALSE + "Gov", "Democracy", "Player", FALSE + "Gov", "Communism", "Player", FALSE + "Gov", "Nationalism","Player", FALSE + "OutputType", "Trade", "Local", TRUE + "MinSize", "2", "City", TRUE + } +[effect_angkor_wat_free_tile_bonus] ;simulates celebration for anarchy/despotism type = "Output_Penalty_Tile" value = 100 reqs = { "type", "name", "range" "Building", "Angkor Wat", "Player" - "Gov", "Despotism", "Player" - "MinSize", "3", "City" + "MinSize", "2", "City" } [effect_angkor_wat_happy] type = "Make_Happy" @@ -4856,7 +4933,6 @@ reqs = { "type", "name", "range", "present" "Building", "Angkor Wat", "Player", TRUE "Gov", "Democracy", "Player", FALSE - "Gov", "Theocracy", "Player", FALSE "Gov", "Communism", "Player", FALSE "Gov", "Nationalism","Player", FALSE } @@ -4867,10 +4943,8 @@ reqs = { "type", "name", "range","present" "Building", "Angkor Wat", "Player",TRUE "Gov", "Democracy", "Player", FALSE - "Gov", "Theocracy", "Player", FALSE "Gov", "Communism", "Player", FALSE "Gov", "Nationalism", "Player", FALSE -; "Activity", "Irrigate", "Local", TRUE ; all work is 50% bonus "UnitFlag", "Infra", "Local", TRUE "Terrain", "Grassland", "Local", FALSE ; exclude everything but Swamp/Jungle. "Terrain", "Plains", "Local", FALSE @@ -4892,7 +4966,6 @@ reqs = "Building", "Angkor Wat", "Player", TRUE "UnitType", "Elephants", "Local", TRUE "Gov", "Democracy", "Player", FALSE - "Gov", "Theocracy", "Player", FALSE "Gov", "Communism", "Player", FALSE "Gov", "Nationalism", "Player", FALSE } @@ -4903,6 +4976,16 @@ reqs = { "type", "name", "range", "present" "Building", "Angkor Wat", "City", TRUE } +[effect_angkor_wat_celebrate_size] +type = "Celebrate_Size_Add" +value = -1 +reqs = + { "type", "name", "range", "present" + "Building", "Angkor Wat", "Player", TRUE + "Gov", "Democracy", "Player", FALSE + "Gov", "Communism", "Player", FALSE + "Gov", "Nationalism","Player", FALSE + } ;************************************************************************ Apollo Program [effect_apollo_program] type = "Enable_Space" @@ -5015,7 +5098,7 @@ value = 3 reqs = { "type", "name", "range","present" "Building", "Appian Way", "Player",TRUE - "UnitType", "Workers", "Local", TRUE + "UnitFlag", "Workers", "Local", TRUE "Extra", "Fallout", "Local", FALSE ; UnitState tile check will segfault without a tile target in the reqs list. "UnitState", "OnDomesticTile","Local",TRUE } @@ -5124,33 +5207,12 @@ reqs = ;************************************************************************ Citadel of Aleppo [effect_citadel_vs_Land] type = "Defend_Bonus" -value = 200 ; 3x vs most Land -reqs = - { "type", "name", "range", "present" - "Building", "Citadel of Aleppo", "City", TRUE - "Building", "City Walls", "City", FALSE ;shouldn't happen - "Building", "Fortifications", "City", FALSE ;shouldn't happen - "UnitClass", "Land", "Local", TRUE - } -[effect_citadel_vs_Land2] -type = "Defend_Bonus" -value = 200 ; 3x vs most Land -reqs = - { "type", "name", "range", "present" - "Building", "Citadel of Aleppo", "City", TRUE - "Building", "City Walls", "City", FALSE ;shouldn't happen - "Building", "Fortifications", "City", FALSE ;shouldn't happen - "UnitClass", "Land", "Local", TRUE - } -[effect_citadel_vs_Land3] -type = "Defend_Bonus" -value = 200 ; 3x vs most Land +value = 200 ; 3x vs Land reqs = - { "type", "name", "range", "present" - "Building", "Citadel of Aleppo", "City", TRUE - "Building", "City Walls", "City", FALSE ;shouldn't happen - "Building", "Fortifications", "City", FALSE ;shouldn't happen - "UnitClass", "Land", "Local", TRUE + { "type", "name", "range", "present" + "Building", "Citadel of Aleppo", "City", TRUE + "Building", "City Walls", "City", FALSE ;shouldn't happen + "UnitClassFlag", "TerrainSpeed", "Local", TRUE ;all Land classes } [effect_citadel_visible] type = "Visible_Walls" @@ -5291,7 +5353,7 @@ reqs = } [effect_colossus_goods_discount] type = "Unit_Build_Cost_Pct" -value = -25 ;20-5 = 15 = -25% +value = -14 ;20-5 = 15 = -25% reqs = { "type", "name", "range","present" @@ -5299,6 +5361,43 @@ reqs = "UnitType", "Goods", "Local", TRUE "Tech", "Steam Engine", "Player",FALSE } +;************************************************************************ Commissariat of Agriculture +[effect_commissariat_1] +type = "Growth_Food" +value = 34 ; 34% = 5/15 = 33.3% +reqs = + { "type", "name", "range", "present" + "Building", "Commissariat of Agriculture", "Player", TRUE + "Gov", "Communism", "Player", TRUE + "Building", "Granary", "City", FALSE ;won't happen + "Age", "2", "City", FALSE + } +[effect_commissariat_2] +type = "Output_Bonus_2" +; Output_Bonus_2 uses trunc rounding. True +10% is achieved knowing the following: +; 10% with trunc rounding: x̄ = +8.11% food. (median is slightly lower) +; 12% with trunc rounding: x̄ = +9.92% food. (median is lower) +; (NB: bonus suffers somewhat more in low pop cities) +; If changing from 10% to another value, use "commisariat_rounding.ods" to calibrate +value = 12 +reqs = + { "type", "name", "range", "present" + "Building", "Commissariat of Agriculture", "Player", TRUE + "OutputType", "Food", "Local", TRUE + "Gov", "Communism", "Player", TRUE + } +[effect_commissariat_3] +type = "Unit_Work_Pct" ;Unit_Work_Frag_Bonus +value = 50 +reqs = + { + "type", "name", "range", "present" + "UnitFlag", "Infra", "Local", TRUE + "Gov", "Communism", "Player", TRUE + "Extra", "Irrigation","Local", TRUE + "Activity", "Irrigate", "Local", TRUE + } + ;************************************************************************ Copernicus [effect_copernicus_observatory] type = "Output_Bonus" @@ -5360,50 +5459,50 @@ reqs = type = "Veteran_Build" value = 1 reqs = - { "type", "name", "range", "present" - "Building", "JTIDS", "Player", TRUE - "UnitFlag", "FootSoldier", "Local", TRUE + { "type", "name", "range" + "Building", "JTIDS", "Player" + "UnitFlag", "FootSoldier", "Local" } [effect_jtids_1] type = "Veteran_Build" value = 1 reqs = - { "type", "name", "range", "present" - "Building", "JTIDS", "Player", TRUE - "UnitType", "Mech. Inf.", "Local", TRUE ; uses rule_name + { "type", "name", "range" + "Building", "JTIDS", "Player" + "UnitType", "Mech. Inf.", "Local" ; uses rule_name } [effect_jtids_2] type = "Veteran_Combat" value = 75 ; 87 57::35 26 26 26 reqs = - { "type", "name", "range", "present" - "Building", "JTIDS", "Player", TRUE - "UnitFlag", "FootSoldier", "Local", TRUE - "UnitType", "Marines", "Local", FALSE + { "type", "name", "range", "present" + "Building", "JTIDS", "Player", TRUE + "UnitFlag", "FootSoldier", "Local", TRUE + "UnitType", "Marines", "Local", FALSE } [effect_jtids_3] type = "Veteran_Combat" value = 60 ; 80 52::32 24 24 24 reqs = - { "type", "name", "range", "present" - "Building", "JTIDS", "Player", TRUE - "UnitType", "Mech. Inf.", "Local", TRUE ; uses rule_name + { "type", "name", "range" + "Building", "JTIDS", "Player" + "UnitType", "Mech. Inf.", "Local" ; uses rule_name } [effect_jtids_4] type = "Veteran_Combat" value = 40 ;84 70::56 42 28 21 reqs = - { "type", "name", "range", "present" - "Building", "JTIDS", "Player", TRUE - "UnitFlag", "FootSoldier", "Local", TRUE - "UnitType", "Marines", "Local", TRUE + { "type", "name", "range" + "Building", "JTIDS", "Player" + "UnitFlag", "FootSoldier", "Local" + "UnitType", "Marines", "Local" } ;************************************************************************ J.S. Bach [effect_js_bachs_cathedral] type = "Force_Content" value = 2 reqs = - { "type", "name", "range" + { "type", "name", "range" "Building", "J.S. Bach's Cathedral", "Player" } ;************************************************************************ King Richard @@ -5423,13 +5522,23 @@ reqs = "Building", "King Richard's Crusade", "City", TRUE } ;************************************************************************ Leonardo -[effect_leonardos_workshop] +[effect_leonardos_workshop_1] type = "Upgrade_Unit" -value = 2 +value = 1 reqs = - { "type", "name", "range" + { "type", "name", "range" "Building", "Leonardo's Workshop", "Player" } +;Discovery of Robotics OR Rocketry reduces the effect to only 1 +[effect_leonardos_workshop_2] +type = "Upgrade_Unit" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Leonardo's Workshop", "Player", TRUE + "Tech", "Robotics", "Player", FALSE + "Tech", "Rocketry", "Player", FALSE + } ;************************************************************************ Genghis Khan [effect_genghis_khans_equestrian_school] type = "Move_Bonus" @@ -5439,14 +5548,6 @@ reqs = "Building", "Genghis Khan's Equestrian School", "Player", TRUE "UnitFlag", "Horse", "Local", TRUE } -[effect_genghis_khans_equestrian_school2] -type = "Move_Bonus" -value = 9 -reqs = - { "type", "name", "range", "present" - "Building", "Genghis Khan's Equestrian School", "Player", TRUE - "UnitType", "Scout", "Local", TRUE - } ;************************************************************************ Lighthouse [effect_lighthouse] type = "Move_Bonus" @@ -5454,91 +5555,51 @@ value = 18 reqs = { "type", "name", "range" "Building", "Lighthouse", "Player" - "UnitClass", "Sea", "Local" - } -[effect_lighthouse_a] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Submarine", "Local" - } -[effect_lighthouse_1] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Trireme", "Local" + "UnitClassFlag", "WaterVessel", "Local" } [effect_lighthouse_2] -type = "Move_Bonus" -value = 18 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "RiverShip", "Local" - } -[effect_lighthouse_3] -type = "Unit_Vision_Radius_Sq" -value = 6 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Sea", "Local" - } -[effect_lighthouse_3a] type = "Unit_Vision_Radius_Sq" value = 6 reqs = { "type", "name", "range" "Building", "Lighthouse", "Player" - "UnitClass", "Submarine", "Local" - } -[effect_lighthouse_4] -type = "Unit_Vision_Radius_Sq" -value = 6 -reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "Trireme", "Local" + "UnitClassFlag", "WaterVessel", "Local" } -[effect_lighthouse_5] -type = "Unit_Vision_Radius_Sq" -value = 6 +[effect_lighthouse_3] +type = "HP_Regen" +value = 100 reqs = - { "type", "name", "range" - "Building", "Lighthouse", "Player" - "UnitClass", "RiverShip", "Local" + { "type", "name", "range" + "Building", "Lighthouse", "City" + "UnitClassFlag", "WaterVessel", "Local" } ;************************************************************************ Magellan [effect_magellans_expedition] type = "Veteran_Build" value = 1 reqs = - { "type", "name", "range", "present" - "Building", "Magellan's Expedition", "Player", TRUE - "UnitClass", "Sea", "Local", TRUE - "UnitFlag", "NoVeteran", "Local", FALSE + { "type", "name", "range", "present" + "Building", "Magellan's Expedition", "Player", TRUE + "UnitClassFlag", "WaterVessel", "Local", TRUE + "UnitFlag", "NoVeteran", "Local", FALSE } -[effect_magellans_expedition_a] -type = "Veteran_Build" -value = 1 +;Magellan gives +1 move to nations without Lighthouse +[effect_magellan_minor_lighthouse_effect] +type = "Move_Bonus" +value = 9 reqs = - { "type", "name", "range", "present" - "Building", "Magellan's Expedition", "Player", TRUE - "UnitClass", "RiverShip", "Local", TRUE - "UnitFlag", "NoVeteran", "Local", FALSE + { "type", "name", "range", "present" + "Building", "Magellan's Expedition", "Player", TRUE + "Building", "Lighthouse", "Player", FALSE + "UnitClassFlag", "WaterVessel", "Local", TRUE } -[effect_magellans_expedition_b] -type = "Veteran_Build" -value = 1 +[effect_magellan_quick_repair] +type = "HP_Regen" +value = 100 reqs = - { "type", "name", "range", "present" - "Building", "Magellan's Expedition", "Player", TRUE - "UnitClass", "Submarine", "Local", TRUE - "UnitFlag", "NoVeteran", "Local", FALSE + { "type", "name", "range" + "Building", "Magellan's Expedition", "City" + "UnitClassFlag", "WaterVessel", "Local" } ;************************************************************************ Manhattan [effect_manhattan_project] @@ -5868,6 +5929,25 @@ reqs = "Building", "Mausoleum of Mausolos","Player", TRUE } ;----------------------------------------------- +[effect_patriarch_conversion] +type = "Actor_Bribe_Cost_Pct" +value = -67 +reqs = + { "type", "name", "range" + "Action", "Bribe Unit", "Local" + "Gov", "Theocracy", "Player" + "UnitType", "Patriarch", "Local" + } +[effect_patriarch_incite] +type = "Actor_Incite_Cost_Pct" +value = -34 +reqs = + { "type", "name", "range" + "Action", "Incite City Escape", "Local" + "Gov", "Theocracy", "Player" + "UnitType", "Patriarch", "Local" + } + [effect_mausoleum_of_mausolos_bribe] type = "Unit_Bribe_Cost_Pct" value = 35 @@ -5877,7 +5957,17 @@ reqs = } [effect_mausoleum_of_mausolos_half_courthouse_corruption] type = "Output_Waste_Pct" -value = 34 ; makes cities with 3 corruption lose 1 corruption; also compensates for cities with <=2 corruption getting no effect +value = 34 ; best simulation of "half a courthouse" given trunc rounding dynamics + reqs = + { "type", "name", "range", "present" + "Building", "Mausoleum of Mausolos", "Player", TRUE + "Building", "Supreme Court", "Player", FALSE + "Building", "Courthouse", "City", FALSE + "OutputType", "Trade", "Local", TRUE + } +[effect_mausoleum_of_mausolos_half_courthouse_corruption1] +type = "Output_Waste_Min_Reduce" +value = 1 ; cities with <=2 corruption reduce corruption by 1 as a min.floor reqs = { "type", "name", "range", "present" "Building", "Mausoleum of Mausolos", "Player", TRUE @@ -6089,6 +6179,34 @@ reqs = "Tech", "Theocracy", "World", FALSE } +;************************************************************************ Propaganda Ministry +[effect_propaganda_ministry_1] +type = "Output_Add_Tile" +value = 2 +reqs = + { "type", "name", "range", "present" + "Building", "Propaganda Ministry", "Player", TRUE + "CityTile", "Center", "Local", TRUE + "OutputType", "Luxury", "Local", TRUE + "Gov", "Anarchy", "Player", FALSE + "Gov", "Monarchy", "Player", FALSE + "Gov", "Republic", "Player", FALSE + "Gov", "Democracy", "Player", FALSE + "Gov", "Theocracy", "Player", FALSE + } +[effect_propaganda_ministry_2] +type = "Make_Happy" +value = 1 + reqs = + { "type", "name", "range", "present" + "Building", "Propaganda Ministry", "Player", TRUE + "Gov", "Anarchy", "Player", FALSE + "Gov", "Monarchy", "Player", FALSE + "Gov", "Republic", "Player", FALSE + "Gov", "Democracy", "Player", FALSE + "Gov", "Theocracy", "Player", FALSE + } + ;************************************************************************ Pyramids [effect_pyramids] type = "Growth_Food" @@ -6099,7 +6217,7 @@ reqs = } [effect_pyramids_1] type = "Growth_Food" -value = 13 +value = 9 ; 9+25 = 34% = 5/15 = 33.3% reqs = { "type", "name", "range", "present" "Building", "Pyramids", "Player", TRUE @@ -6153,6 +6271,14 @@ reqs = [effect_sphinx_corruption] type = "Output_Waste_Pct" value = 60 +reqs = + { "type", "name", "range" + "Building", "The Sphinx", "City" + "OutputType", "Trade", "Local" + } +[effect_sphinx_corruption1] +type = "Output_Waste_Min_Reduce" +value = 1 ; if there is corruption, then at least 1 corruption will be removed reqs = { "type", "name", "range" "Building", "The Sphinx", "City" @@ -6176,7 +6302,7 @@ reqs = } [effect_statue_of_liberty_1] type = "No_Anarchy" -value = 1 +value = 11 ; (val >= 10) means, no anarchy but switch is NOT immediate reqs = { "type", "name", "range" "Building", "Statue of Liberty", "Player" @@ -6246,38 +6372,28 @@ value = 34 ; [50,33,20,15,15,15] → [67,44,26,20,20,20] reqs = { "type", "name", "range", "present" "Building", "Statue of Zeus", "Player", TRUE - "Gov", "Republic", "Player", FALSE - "Gov", "Democracy", "Player", FALSE - "Gov", "Theocracy", "Player", FALSE - "Gov", "Communism", "Player", FALSE - "Gov", "Nationalism", "Player", FALSE + "Tech", "Tactics", "Player", FALSE + "Tech", "Monotheism", "Player", FALSE + "Tech", "Communism", "Player", FALSE } ;************************************************************************ Sun Tzu [effect_sun_tzus_war_academy] type = "Veteran_Build" value = 1 reqs = - { "type", "name", "range", "present" - "Building", "Sun Tzu's War Academy", "Player", TRUE - "UnitClass", "Land", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE - } -[effect_sun_tzus_war_academy_1] -type = "Veteran_Build" -value = 1 -reqs = - { "type", "name", "range", "present" - "Building", "Sun Tzu's War Academy", "Player", TRUE - "UnitClass", "LandAirSea", "Local", TRUE + { "type", "name", "range", "present" + "Building", "Sun Tzu's War Academy", "Player", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE } -[effect_sun_tzus_war_academy_2] +[effect_sun_tzus_war_academy_3] type = "Veteran_Build" value = 1 reqs = - { "type", "name", "range", "present" + { "type", "name", "range", "present" "Building", "Sun Tzu's War Academy", "Player", TRUE - "UnitClass", "LandNoKill", "Local", TRUE + "UnitType", "Scout", "Local", TRUE } ;************************************************************************ Supreme Court [effect_supreme_court_corruption1] @@ -6288,6 +6404,14 @@ value = 60 "Building", "Supreme Court", "Player" "OutputType", "Trade", "Local" } +[effect_supreme_court_corruption2] +type = "Output_Waste_Min_Reduce" +value = 1 ; reduce at least 1 corruption, if there is any + reqs = + { "type", "name", "range" + "Building", "Supreme Court", "Player" + "OutputType", "Trade", "Local" + } [effect_supreme_court_all_govs] type = "Make_Content" ; keeping in equal with courthouse value = 1 @@ -6583,13 +6707,6 @@ reqs = "Gov", "Democracy", "Player", FALSE } -;[effect_foreign_national_tuner] -;type = "Enemy_Citizen_Unhappy_Pct" -;value = 50 -;reqs = -; { -; -; } ;************************************************************************ Voyage of Darwin ; There are nasty hard-coded things to the original Wonder, so it had ; to be given a name change (Voyage of Darwin) to avoid messy problems. @@ -6682,13 +6799,21 @@ reqs = type = "Veteran_Build" value = 1 reqs = - { "type", "name", "range", "present" - "Building", "Ziggurat", "City", TRUE - "Gov", "Despotism", "Player",TRUE - "Building", "Barracks", "City", FALSE - "UnitClass","Land", "Local", TRUE - "UnitFlag", "NonMil", "Local", FALSE - "UnitFlag", "NoVeteran", "Local", FALSE + { "type", "name", "range", "present" + "Building", "Ziggurat", "City", TRUE + "Gov", "Despotism", "Player",TRUE + "Building", "Barracks", "City", FALSE + "UnitClassFlag","TerrainSpeed", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_ziggurat_barracks_a] +type = "HP_Regen" +value = 100 +reqs = + { "type", "name", "range", "present" + "Building", "Ziggurat", "City", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", TRUE } [effect_ziggurat_temple] type = "Make_Content" @@ -6727,16 +6852,18 @@ reqs = "Gov", "Despotism","Player", TRUE "OutputType", "Food", "Local", TRUE } -[effect_ziggurat_fortifications] +[effect_ziggurat_defense] type = "Defend_Bonus" value = 75 ; 1.75x vs everything reqs = - { "type", "name", "range","present" - "Building", "Ziggurat", "City", TRUE - "Gov", "Despotism", "Player",TRUE - "Building", "Fortifications", "City", FALSE - "Building", "City Walls", "City", FALSE - "Building", "Great Wall", "Player",FALSE + { "type", "name", "range","present" + "Building", "Ziggurat", "City", TRUE + "Gov", "Despotism", "Player",TRUE + "Building", "Fortifications", "City", FALSE + "Building", "City Walls", "City", FALSE + "Building", "Great Wall", "Player",FALSE + "Building", "Citadel of Aleppo","Player",FALSE + ;if this wonder is later made to not expire, need to add SAM Battery, Coastal Defense, SDI. } ;Ziggurat semi-relocation of capital effects-------------------------- [effect_ziggurat_palace_gov_center] @@ -6751,6 +6878,16 @@ reqs = [effect_ziggurat_palace_corruption] type = "Output_Waste_Pct" value = 60 +reqs = + { "type", "name", "range","present" + "Building", "Ziggurat","City", TRUE + "Gov", "Despotism","Player",TRUE + "Building", "Palace", "City", FALSE + "OutputType","Trade", "Local", TRUE + } +[effect_ziggurat_palace_corruption1] +type = "Output_Waste_Min_Reduce" +value = 1 reqs = { "type", "name", "range","present" "Building", "Ziggurat","City", TRUE @@ -7174,6 +7311,14 @@ reqs = { "type", "name", "range", "present" "Gov", "Theocracy", "Player", TRUE } +[effect_cheaper_incite_theocracy] +type = "Actor_Incite_Cost_Pct" +value = -33 +reqs = + { "type", "name", "range" + "Gov", "Theocracy", "Player" + } + [effect_incite_democracy] type = "Incite_Cost_Pct" value = 200 @@ -7201,7 +7346,7 @@ reqs = ;********************************************************* -;LOSING MOVES FROM ILLEGAL ACTION NEVER MADE SENSE. JUST FORBID IT AND LET THEM PICK A LEGAL ACTION. +;NO ILLEGAL ACTION MOVE COST IN MP2D ;[effect_illegal_action_move_cost_base] ;type = "Illegal_Action_Move_Cost" ;value = 0 @@ -7213,6 +7358,13 @@ reqs = ;CASUS BELLI INCIDENTS ;******************************************************** +[effect_incident_destroy_city] +type = "Casus_Belli_Success" +value = 1000 +reqs = + { "type", "name", "range", "present" + "Action", "Destroy City", "Local", TRUE + } [effect_incident_caught_spying_on_city] type = "Casus_Belli_Caught" value = 1 @@ -7221,6 +7373,7 @@ reqs = "Action", "Investigate City", "Local", TRUE "DiplRel", "War", "Local", FALSE "DiplRel", "Alliance", "Local", FALSE + "DiplRel", "Team", "Local", FALSE } [effect_incident_success_spy_attack] type = "Casus_Belli_Success" @@ -7246,6 +7399,7 @@ reqs = "Action", "Pillage", "Local", TRUE "DiplRel", "War", "Local", FALSE "DiplRel", "Alliance", "Local", FALSE + "DiplRel", "Team", "Local", FALSE } [effect_incident_success_sneaky_road] type = "Casus_Belli_Success" @@ -7255,6 +7409,7 @@ reqs = "Action", "Build Road", "Local", TRUE "DiplRel", "War", "Local", FALSE "DiplRel", "Alliance", "Local", FALSE + "DiplRel", "Team", "Local", FALSE } [effect_incident_success_sneaky_fort] type = "Casus_Belli_Success" @@ -7264,6 +7419,7 @@ reqs = "Action", "Build Base", "Local", TRUE "DiplRel", "War", "Local", FALSE "DiplRel", "Alliance", "Local", FALSE + "DiplRel", "Team", "Local", FALSE } [effect_incident_success_sneaky_transform] type = "Casus_Belli_Success" @@ -7273,6 +7429,7 @@ reqs = "Action", "Transform Terrain", "Local", TRUE "DiplRel", "War", "Local", FALSE "DiplRel", "Alliance", "Local", FALSE + "DiplRel", "Team", "Local", FALSE } [effect_incident_caught_steal_maps1] type = "Casus_Belli_Caught" @@ -7547,6 +7704,7 @@ reqs = "Action", "Found City", "Local", TRUE "DiplRel", "War", "Local", FALSE "DiplRel", "Alliance", "Local", FALSE + "DiplRel", "Team", "Local", FALSE } [effect_incident_paradrop_invasion] type = "Casus_Belli_Success" @@ -7556,6 +7714,7 @@ reqs = "Action", "Paradrop Unit", "Local", TRUE "DiplRel", "War", "Local", FALSE "DiplRel", "Alliance", "Local", FALSE + "DiplRel", "Team", "Local", FALSE } ;******************************************************************** @@ -7580,37 +7739,38 @@ reqs = "Building", "Ecclesiastical Palace", "Local", FALSE } -;******************************************************************** MOVE COSTS -;TODO: by having control over embark/board and disembark/deboard, -;we can gracefully upgrade mechanics to minimalist nirvana: -;[effect_action_success_move_cost_embark] -;type = "Action_Success_Actor_Move_Cost" -;value = 0 -;reqs = -; { "type", "name", "range", "present" -; "Action", "Transport Embark", "Local", TRUE -; } -;[effect_action_success_move_cost_disembark] -;type = "Action_Success_Actor_Move_Cost" -;value = 0 -;reqs = -; { "type", "name", "range", "present" -; "Action", "Transport Disembark", "Local", TRUE -; } -;[effect_action_success_move_cost_board] -;type = "Action_Success_Actor_Move_Cost" -;value = 0 -;reqs = -; { "type", "name", "range", "present" -; "Action", "Transport Board", "Local", TRUE -; } -;[effect_action_success_move_cost_deboard] -;type = "Action_Success_Actor_Move_Cost" -;value = 0 -;reqs = -; { "type", "name", "range", "present" -; "Action", "Transport Deboard", "Local", TRUE ;renamed to Transport Deboard later. -; } +;************************************************************************************ MOVE COSTS +;By having control over embark/board and disembark/deboard, we can gracefully upgrade mechanics +;to tamp down double-move and transport-swap dynamics while still leaving a little flex in +;smoothing logistics and transportation issues via transportation bonnses instead of OP 3x +;movement: +[effect_action_success_move_cost_board] +type = "Action_Success_Actor_Move_Cost" +value = 3 +reqs = + { "type", "name", "range", "present" + "Action", "Transport Board", "Local", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", TRUE ; Does not affect Aircraft, Missiles, etc. + "UnitType", "Marines", "Local", FALSE ; Does not affect Marines + } +[effect_action_success_move_cost_deboard] +type = "Action_Success_Actor_Move_Cost" +value = 3 +reqs = + { "type", "name", "range", "present" + "Action", "Transport Deboard", "Local", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", TRUE ; Does not affect Aircraft, Missiles, etc. + "UnitType", "Marines", "Local", FALSE ; Does not affect Marines + } +[effect_action_success_move_cost_transport_unload] +type = "Action_Success_Target_Move_Cost" ; "Local" scope on unit pertains to target, not actor. +value = 3 +reqs = + { "type", "name", "range", "present" + "Action", "Transport Unload", "Local", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", TRUE ; Does not affect Aircraft, Missiles, etc. + "UnitType", "Marines", "Local", FALSE ; Does not affect Marines + } ;[effect_action_success_siege_ram_city_walls] ;type = "Action_Success_Actor_Move_Cost" @@ -7639,7 +7799,7 @@ reqs = [effect_action_success_move_cost_capture] type = "Action_Success_Actor_Move_Cost" -value = 9 ; 1 move +value = 6 ; 1 move reqs = { "type", "name", "range", "present" "Action", "Capture Units", "Local", TRUE @@ -7670,6 +7830,182 @@ reqs = { "type", "name", "range", "present" "Action", "Expel Unit", "Local", TRUE } + +;Hit and run bonus of subs, attack has no move cost (except damage to the sub) +[effect_action_success_move_cost_sub_attack] +type = "Action_Success_Actor_Move_Cost" +value = -9 +reqs = + { "type", "name", "range", "present" + "Action", "Attack", "Local", TRUE + "UnitClass", "Submarine", "Local", TRUE + } + +;\/ \/ ---------------------- TRAWLERS ---------------------- \/ \/ +;Loaded Trawlers move at 6 instead of 9. Changing state changes +;speed but is proportional to the % of remaining move points +;(similar to what happens to move points upgrading Cav to Armor) +[effect_action_success_tugging_trawler_move_penalty_board_1] +type = "Action_Success_Target_Move_Cost" +value = 9 +reqs = + { "type", "name", "range" + "Action", "Transport Board", "Local" + "UnitType", "Trawler", "Local" + "MinMoveFrags", "27", "Local" + } +[effect_action_success_tugging_trawler_move_penalty_board_2] +type = "Action_Success_Target_Move_Cost" +value = 9 +reqs = + { "type", "name", "range" + "Action", "Transport Board", "Local" + "UnitType", "Trawler", "Local" + "MinMoveFrags", "54", "Local" + } +[effect_action_success_tugging_trawler_move_penalty_board_3] +type = "Action_Success_Target_Move_Cost" +value = 9 +reqs = + { "type", "name", "range" + "Action", "Transport Board", "Local" + "UnitType", "Trawler", "Local" + "MinMoveFrags", "81", "Local" + } +[effect_action_success_tugging_trawler_move_penalty_embark_1] +type = "Action_Success_Target_Move_Cost" +value = 9 +reqs = + { "type", "name", "range" + "Action", "Transport Embark", "Local" + "UnitType", "Trawler", "Local" + "MinMoveFrags", "18", "Local" + } +[effect_action_success_tugging_trawler_move_penalty_embark_2] +type = "Action_Success_Target_Move_Cost" +value = 9 +reqs = + { "type", "name", "range" + "Action", "Transport Embark", "Local" + "UnitType", "Trawler", "Local" + "MinMoveFrags", "36", "Local" + } +[effect_action_success_tugging_trawler_move_penalty_embark_3] +type = "Action_Success_Target_Move_Cost" +value = 9 +reqs = + { "type", "name", "range" + "Action", "Transport Embark", "Local" + "UnitType", "Trawler", "Local" + "MinMoveFrags", "54", "Local" + } +;TODO WHEN IMPLEMENTED: "Transport Load" WILL NEED need Actor_Success_Actor_Move_Cost <<<<<<<<<<<<<<<<<<<<<< ** +;[effect_action_success_tugging_trawler_move_penalty_load] +;type = "Action_Success_Target_Move_Cost" +;value = 27 +;reqs = +; { "type", "name", "range" +; "Action", "Transport Load", "Local" +; "UnitType", "Trawler", "Local" +; } +;... +;TODO: Disembark action should be like Deboard and test the transporter +;as the target in Action_Success_Target_Move_Cost, then a trawler whose +;cargo disembarks can get the same pro-rated moves back just like for Deboard +;and unload. +[effect_action_success_release_tugging_speed_recoup_1] +type = "Action_Success_Target_Move_Cost" +value = -9 ;returns 1 move if done towing while moves are left +reqs = + { "type", "name", "range" + "Action", "Transport Deboard", "Local" + "UnitType", "Trawler", "Local" + "MinMoveFrags", "18", "Local" + } +[effect_action_success_release_tugging_speed_recoup_2] +type = "Action_Success_Target_Move_Cost" +value = -9 ;returns 1 move if done towing while moves are left +reqs = + { "type", "name", "range" + "Action", "Transport Deboard", "Local" + "UnitType", "Trawler", "Local" + "MinMoveFrags", "36", "Local" + } +[effect_action_success_release_tugging_speed_recoup_3] ;Trawler was loaded but never moved, goes back to 9. +type = "Action_Success_Target_Move_Cost" +value = -9 ;returns 1 move if done towing while moves are left +reqs = + { "type", "name", "range" + "Action", "Transport Deboard", "Local" + "UnitType", "Trawler", "Local" + "MinMoveFrags", "54", "Local" + } +;... +[effect_action_success_release_tugging_speed_recoup_4] +type = "Action_Success_Actor_Move_Cost" +value = -9 ;returns 1 move if done towing while moves are left +reqs = + { "type", "name", "range" + "Action", "Transport Unload", "Local" + "UnitType", "Trawler", "Local" + "MinMoveFrags", "18", "Local" + } +[effect_action_success_release_tugging_speed_recoup_5] +type = "Action_Success_Actor_Move_Cost" +value = -9 ;returns 1 move if done towing while moves are left +reqs = + { "type", "name", "range" + "Action", "Transport Unload", "Local" + "UnitType", "Trawler", "Local" + "MinMoveFrags", "36", "Local" + } +[effect_action_success_release_tugging_speed_recoup_6] ;Trawler was loaded but never moved, goes back to 9. +type = "Action_Success_Actor_Move_Cost" +value = -9 ;returns 1 move if done towing while moves are left +reqs = + { "type", "name", "range" + "Action", "Transport Unload", "Local" + "UnitType", "Trawler", "Local" + "MinMoveFrags", "54", "Local" + } +;... +[effect_tugging_trawler_has_6_moves_at_TC] +type = "Move_Bonus" +value = -27 +reqs = + { "type", "name", "range" + "UnitType", "Trawler", "Local" + "UnitState", "Transporting", "Local" + } +;... +;No Double Move Attacks by tugging your warships farther. +[effect_disembarking_from_trawler_lost_moves] +type = "Action_Success_Actor_Move_Cost" +value = 65535 +reqs = + { "type", "name", "range" + "UnitClassFlag", "WaterVessel", "Local" + "Action", "Transport Disembark", "Local" + } +[effect_deboarding_from_trawler_lost_moves] +type = "Action_Success_Actor_Move_Cost" +value = 65535 +reqs = + { "type", "name", "range" + "UnitClassFlag", "WaterVessel", "Local" + "Action", "Transport Deboard", "Local" + } +[effect_unloading_from_trawler_lost_moves] +type = "Action_Success_Target_Move_Cost" +value = 65535 +reqs = + { "type", "name", "range" + "UnitClassFlag", "WaterVessel", "Local" + "Action", "Transport Unload", "Local" + } +;OPTIONAL PROBLEM KILLER if the above 3 don't cover all cases: "Transport Board" loses all moves on WaterVessels +;/\ /\ ---------------------- TRAWLERS ---------------------- /\ /\ + ;******************************************************************** ; The Well-Digger can move 3 before you know Pottery or Alphabet. @@ -7705,7 +8041,7 @@ reqs = [effect_despotism_city_founding_nomad_food_bonus] type = "Growth_Food" -value = 13 ; 13% of 16 = +2 +value = 15 ; 15% of 15 = +2 reqs = { "type", "name", "range", "present" "Gov", "Despotism", "Player", TRUE @@ -7714,7 +8050,7 @@ reqs = } [effect_despotism_capital_founding_nomad_food_bonus] type = "Growth_Food" -value = 12 ; 12+13=25% of 16 = +4 +value = 15 ; 15+15=30% of 15 = +4 reqs = { "type", "name", "range", "present" "Gov", "Despotism", "Player", TRUE @@ -7924,6 +8260,7 @@ reqs = { "type", "name", "range", "present" "DiplRel", "War", "Local", FALSE "DiplRel", "Alliance", "Local", FALSE + "DiplRel", "Team", "Local", FALSE "DiplRel", "Armistice", "Local", FALSE ; Time to get units out of the territory "DiplRel", "Foreign", "Local", TRUE "UnitFlag", "NonMil", "Local", FALSE @@ -8004,6 +8341,7 @@ reqs = { "type", "name", "range", "present" "DiplRel", "War", "Local", FALSE "DiplRel", "Alliance", "Local", FALSE + "DiplRel", "Team", "Local", FALSE "DiplRel", "Armistice", "Local", FALSE ; Time to get units out of the territory "DiplRel", "Foreign", "Local", TRUE "UnitFlag", "NonMil", "Local", FALSE diff --git a/freeciv/freeciv/data/mp2-dragoon/game.ruleset b/freeciv/freeciv/data/mp2-dragoon/game.ruleset index 1e81137b4..57fec8528 100644 --- a/freeciv/freeciv/data/mp2-dragoon/game.ruleset +++ b/freeciv/freeciv/data/mp2-dragoon/game.ruleset @@ -85,9 +85,15 @@ food_cost = 2 ; if city_size > num_inis; ; city_granary_size = (granary_food_ini[num_inis] + ; granary_food_inc * (city_size - num_inis)) * foodbox / 100 -;granary_food_ini = 20, 30, 40, 50, 60, 70 -granary_food_ini = 16, 23, 31, 40, 50, 60, 70 -granary_food_inc = 1 +; S2 S3 S4 S5 S6 S7 S8 +;granary_food_ini = 20, 30, 40, 50, 60, 70, 70 ;MP2A-C +;granary_food_ini = 16, 23, 30, 40, 50, 60, 70 ;MP2D alpha, 3 turns shaved off s1-s2 growth. +;granary_food_ini = 16, 22, 27, 33, 40, 50, 60 ;MP2D EX1 - mild acceleration +granary_food_ini = 15, 20, 25, 31, 37, 45, 53, 60 ;MP2D EX2 - moderate " +;granary_food_ini = 14, 18, 23, 29, 35, 42, 49, 56, 57, 58, 59, 60 ;MP2D EX3 - fast " +;granary_food_ini = 13, 16, 19, 23, 28, 33, 39, 45, 51, 52, 53, 54 ;MP2D EX4 - fastest " + +granary_food_inc = 0 ; City center minimum outputs min_city_center_food = 1 @@ -257,8 +263,8 @@ nuke_defender_survival_chance_pct = 0 ; NOTE: "will_never" was replaced by if_attacker req vector in 2021. ; will_never - units with this unit type flag will never auto attack. -;possible attack_actions= "Capture Units", "Bombard", "Attack", "Suicide Attack" -attack_actions= "Attack" +;possible attack_actions= "Capture Units", "Bombard", "Bombard 2", "Bombard 3", "Attack", "Suicide Attack" +attack_actions= "Bombard", "Attack" ; Non-fighters don't auto-attack. will_never = "WillNever" @@ -468,8 +474,8 @@ ui_name_spy_attack = _("Eliminate %sSpy%s") ; /* TRANS: _Bombard (100% chance of success). */ ui_name_bombard = _("%sSpecial Attack%s") -; /* TRANS: _Explode Missile (100% chance of success). */ -ui_name_suicide_attack = _("%sExplode Missile%s") +; /* TRANS: _Explode (100% chance of success). */ +ui_name_suicide_attack = _("%sExplode%s") ; /* TRANS: _Conquer City (100% chance of success). */ ui_name_conquer_city = _("%sConquer City%s") @@ -579,7 +585,7 @@ actor_reqs = action = "Convert Unit" actor_reqs = { "type", "name", "range" - "UnitType", "Workers", "Local" + "UnitFlag", "Workers", "Local" "Gov", "Communism", "Player" "Tech", "Communism", "Player" "Tech", "Conscription", "Player" @@ -595,44 +601,32 @@ actor_reqs = "UnitType", "Anti-Aircraft Artillery", "Local" "UnitState","OnDomesticTile", "Local" "CityTile", "Center", "Local" - "Building", "Palace", "City" - "Tech", "Space Flight", "Player" - "Age", "10", "Local" - } -[actionenabler_convert_AAA_in_capital_2] -action = "Convert Unit" -actor_reqs = - { "type", "name", "range" - "UnitType", "Anti-Aircraft Artillery", "Local" - "UnitState","OnDomesticTile", "Local" - "CityTile", "Center", "Local" - "Building", "Ecclesiastical Palace", "City" "Tech", "Space Flight", "Player" - "Age", "10", "Local" + "Age", "9", "Local" } + [actionenabler_foot_to_musket] ;;old foot units become muskets with Conscription action = "Convert Unit" actor_reqs = { "type", "name", "range", "present" "UnitClass","Land", "Local", TRUE "UnitFlag", "FootSoldier", "Local", TRUE - "UnitType", "Riflemen", "Local", FALSE ; Don't allow Riflemen to become Workers with this enabler - "UnitType", "Musketeers", "Local", FALSE ; SAFETY: block future convert features that Musketeers might get - "UnitType", "Alpine Troops", "Local", FALSE ; SAFETY: block future convert features that Alpines might get - "UnitType", "Marines", "Local", FALSE ; SAFETY: block future convert features that Marines might get + "UnitType", "Riflemen", "Local", FALSE ; SAFETY: Don't allow Riflemen to become Workers with this enabler + "UnitType", "Musketeers", "Local", FALSE ; SAFETY: Musketeers become Riflemen with Mechanization + "UnitType", "Alpine Troops", "Local", FALSE ; SAFETY: Alpines become Ground Troops with Combined Arms "UnitType", "Paratroopers", "Local", FALSE ; SAFETY: block future convert features that Paratroopers might get "UnitState","OnDomesticTile", "Local", TRUE "CityTile", "Center", "Local", TRUE "Tech", "Conscription", "Player",TRUE } -[actionenabler_musket_to_rifle] ;;Musketeers become Riflemen with Labor Union +[actionenabler_musket_to_rifle] ;;Musketeers become Riflemen with Mechanization action = "Convert Unit" actor_reqs = { "type", "name", "range", "present" "UnitType", "Musketeers", "Local", TRUE "UnitState","OnDomesticTile", "Local", TRUE "CityTile", "Center", "Local", TRUE - "Tech", "Labor Union", "Player",TRUE + "Tech", "Mechanization", "Player",TRUE } [actionenabler_sabotage_city] @@ -644,6 +638,7 @@ actor_reqs = "UnitState", "OnLivableTile", "Local", TRUE "MinMoveFrags", "1", "Local", TRUE "UnitFlag", "Spy", "Local", FALSE + "UnitType", "Emissary", "Local", FALSE } [actionenabler_sabotage_city_spy] @@ -693,7 +688,7 @@ actor_reqs = ; ************************ ESTABLISH EMBASSY *********************** ; DIPLOMAT: normal establish embassy--if not at war -[actionenabler_establish_embassy] +[actionenabler_emissary_establish_embassy] action = "Establish Embassy Stay" actor_reqs = { "type", "name", "range", "present" @@ -703,14 +698,15 @@ actor_reqs = "MinMoveFrags", "1", "Local", TRUE "DiplRel", "Foreign", "Local", TRUE "UnitFlag", "Spy", "Local", FALSE + "UnitType", "Emissary", "Local", TRUE "DiplRel", "War", "Local", FALSE } target_reqs = { "type", "name", "range", "present" "NationGroup", "Barbarian", "Player", FALSE } -;if at war, courthouse/police station/fundie will block embassy: do a cease-fire first! -[actionenabler_establish_embassy_war] +;if at war, courthouse/police station/homeland_sec/theocracy will block embassy: do a cease-fire first! +[actionenabler_emissary_establish_embassy_war] action = "Establish Embassy Stay" actor_reqs = { "type", "name", "range", "present" @@ -720,6 +716,7 @@ actor_reqs = "MinMoveFrags", "1", "Local", TRUE "DiplRel", "Foreign", "Local", TRUE "UnitFlag", "Spy", "Local", FALSE + "UnitType", "Emissary", "Local", TRUE "DiplRel", "War", "Local", TRUE } target_reqs = @@ -731,12 +728,14 @@ target_reqs = "Gov", "Theocracy", "Player", FALSE } -; SPY: normal establish embassy--if not at war -[actionenabler_establish_embassy_spy] +; Diplomat & Patriarch: normal establish embassy--if not at war +[actionenabler_establish_embassy_diplomat_patriarch] action = "Establish Embassy" actor_reqs = { "type", "name", "range", "present" - "UnitFlag", "Spy", "Local", TRUE + "UnitFlag", "Diplomat", "Local", TRUE + "UnitType", "Emissary", "Local", FALSE + "UnitType", "Spy", "Local", FALSE "UnitType", "Siege Ram", "Local", FALSE "UnitState", "OnLivableTile", "Local", TRUE "UnitState", "Transported", "Local", FALSE @@ -748,12 +747,14 @@ target_reqs = { "type", "name", "range", "present" "NationGroup", "Barbarian", "Player", FALSE } -;if at war, police station or fundie will block embassy: do a cease-fire first! -[actionenabler_establish_embassy_spy_war] +;if at war, courthouse/police station/homeland_sec/theocracy will block embassy: do a cease-fire first! +[actionenabler_establish_embassy_diplomat_patriarch_war] action = "Establish Embassy" actor_reqs = { "type", "name", "range", "present" - "UnitFlag", "Spy", "Local", TRUE + "UnitFlag", "Diplomat", "Local", TRUE + "UnitType", "Emissary", "Local", FALSE + "UnitType", "Spy", "Local", FALSE "UnitType", "Siege Ram", "Local", FALSE "UnitState", "OnLivableTile", "Local", TRUE "UnitState", "Transported", "Local", FALSE @@ -761,12 +762,37 @@ actor_reqs = "DiplRel", "Foreign", "Local", TRUE "DiplRel", "War", "Local", TRUE } +target_reqs = + { "type", "name", "range", "present" + "NationGroup", "Barbarian", "Player", FALSE + "Building", "Courthouse", "City", FALSE + "Building", "Homeland Security", "City", FALSE + "Building", "Police Station", "City", FALSE ; to do: when we can check for spy present to stop it + "Gov", "Theocracy", "Player", FALSE + } +;Diplomat with espionage tech: when at war, only police station and fundie block hostile embassies +[actionenabler_establish_embassy_diplomat_patriarch_war_espionage_tech] +action = "Establish Embassy" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Diplomat", "Local", TRUE + "UnitType", "Emissary", "Local", FALSE + "UnitType", "Spy", "Local", FALSE + "UnitType", "Siege Ram", "Local", FALSE + "UnitState", "OnLivableTile", "Local", TRUE + "UnitState", "Transported", "Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "DiplRel", "Foreign", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "Tech", "Espionage", "Player",TRUE ;actor unit's owner needs espionage tech <<<<<< + } target_reqs = { "type", "name", "range", "present" "NationGroup", "Barbarian", "Player", FALSE "Building", "Police Station","City", FALSE ; to do: when we can check for spy present to stop it "Gov", "Theocracy", "Player", FALSE } + ; *************************************************** [actionenabler_investigate_city] @@ -838,7 +864,8 @@ actor_reqs = "MinMoveFrags", "1", "Local", TRUE } target_reqs = - { "type", "name", "range" + { "type", "name", "range", "present" + "Building", "Homeland Security", "City", FALSE ; "MinSize", "2", "City" ;; use poison to stop colonialism } @@ -929,6 +956,7 @@ action = "Incite City" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Diplomat", "Local", TRUE + "UnitType", "Patriarch", "Local", FALSE "DiplRel", "Alliance", "Local", FALSE "DiplRel", "Team", "Local", FALSE "UnitState", "OnLivableTile", "Local", TRUE @@ -948,8 +976,10 @@ target_reqs = action = "Incite City Escape" actor_reqs = { "type", "name", "range", "present" - "UnitFlag", "Spy", "Local", TRUE + "UnitFlag", "Diplomat", "Local", TRUE "UnitType", "Siege Ram", "Local", FALSE + "UnitType", "Diplomat", "Local", FALSE + "UnitType", "Emissary", "Local", FALSE "DiplRel", "Alliance", "Local", FALSE "DiplRel", "Team", "Local", FALSE "UnitState", "OnLivableTile", "Local", TRUE @@ -1030,19 +1060,22 @@ actor_reqs = "UnitState", "HasHomeCity", "Local", TRUE } -[actionenabler_marketplace] -action = "Enter Marketplace" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "TradeRoute", "Local", TRUE - "UnitState", "Transporting", "Local", FALSE ; avoids bug where land cargo "drowns" even on land terrain - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -target_reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - } +;S12 cities with colossus giving 486 gold from a wagon; this has to be turned OFF until if/when +;we balance it or make a whole new formula for that stuff, based on simple value of the +;commerce unit times a simple multiplier. +;[actionenabler_marketplace] +;action = "Enter Marketplace" +;actor_reqs = +; { "type", "name", "range", "present" +; "UnitFlag", "TradeRoute", "Local", TRUE +; "UnitState", "Transporting", "Local", FALSE ; avoids bug where land cargo "drowns" even on land terrain +; "MinMoveFrags", "1", "Local", TRUE +; "DiplRel", "War", "Local", FALSE +; } +;target_reqs = +; { "type", "name", "range" +; "Building", "Marketplace", "City" +; } [actionenabler_help_build_great_wonder] action = "Help Wonder" @@ -1193,6 +1226,48 @@ target_reqs = } ; ***************** BOMBARDS ***************************** +; **************************************** !!!!!!!!!!!!!!!!!!!!!!!!! NOTE, for every new unit who can bombard, you have to +; **************************************** !!!!!!!!!!!!!!!!!!!!!!!!! add it to the UnitType, FALSE list below for general Ballistic class +;Ballistic units who haven't moved can bombard: i.e., Catapult, Ballista, Canon, Artillery, Howitzer +[actionenabler_ballistic_SUA_unmoved] +action = "Bombard" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Bombarder", "Local", TRUE + "UnitType", "Archers", "Local", FALSE + "UnitType", "Phalanx", "Local", FALSE + "UnitType", "Legion", "Local", FALSE + "UnitType", "Siege Ram", "Local", FALSE + "UnitType", "Zealots", "Local", FALSE + "UnitType", "Zeppelin", "Local", FALSE + "UnitType", "Marines", "Local", FALSE + "UnitType", "Battleship", "Local", FALSE + "UnitState", "Transported", "Local", FALSE + "UnitState", "MovedThisTurn", "Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "DiplRel", "War", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" + "CityTile", "Center", "Local", FALSE + "Extra", "Fortress", "Local", FALSE + "Extra", "Naval Base","Local", FALSE +; "TerrainClass", "Oceanic", "Local", FALSE can bombard ocean tiles. + } +[actionenabler_ballistic_SUA_magnum_turret] +action = "Bombard 2" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Bombarder", "Local", TRUE + "UnitType", "Magnum Turret", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE ; can do multiple Bombards @ 1 move each. NB: tamps exploit of suicide sacrifice. + "DiplRel", "War", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" +; "TerrainClass", "Oceanic", "Local", FALSE can bombard ocean tiles. + } + ;Archers can do volley attacks ; can hit ocean from land, and land from ocean. [actionenabler_archer_volley] @@ -1201,6 +1276,7 @@ actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Bombarder", "Local", TRUE "UnitType", "Archers", "Local", TRUE + "UnitState", "Transported", "Local", TRUE "MinMoveFrags", "1", "Local", TRUE "DiplRel", "War", "Local", TRUE } @@ -1269,6 +1345,7 @@ target_reqs = "Extra", "Naval Base","Local", FALSE "TerrainClass","Oceanic", "Local", FALSE } + ;Legions can do Pilum assault [actionenabler_legion_pilum_assault] action = "Bombard" @@ -1288,6 +1365,7 @@ target_reqs = "Extra", "Naval Base", "Local", FALSE "TerrainClass", "Oceanic", "Local", FALSE } + ;Siege Rams can assault Fortress Perimeter [actionenabler_siege_ram_fortress_assault] action = "Bombard" @@ -1392,6 +1470,7 @@ actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Bombarder", "Local", TRUE "UnitType", "Marines", "Local", TRUE + "UnitState", "Transported", "Local", TRUE "MinMoveFrags", "1", "Local", TRUE "DiplRel", "War", "Local", TRUE "MinVeteran", "2", "Local", TRUE @@ -1588,41 +1667,59 @@ target_reqs= "CityTile", "Center", "Local", FALSE } -;DESTROY CITY -; The GameLoss unit requirement makes sending units on a suicide mission to -; capture and destroy cities deep inside enemy terrain national suicide. -; The risk of moving a GameLoss unit to the target city increases the cost -; of the action. Rationalization for the requirement: the physical presence -; of the Leader makes it easier to comply with the order to destroy the -; city. (See the "orders by phone" Milgram experiment variation) -; -; The domestic city requirement forces the player to invade a city before -; he can destroy it. If this limit is weakened by allowing the destruction -; of undefended (MaxUnitsOnTile) foreign cities during war it will lead to -; situations where a player can destroy a city but is unable to occupy it. -; Rationalization: the resistance must be crushed before the destruction. -; -; TODO: create an international incident (set the Casus_Belli_Success -; effect value to 1000) if "Destroy City" still is overpowered. -[actionenabler_scorched_earth] +;DESTROY CITY; +[actionenabler_destroy_foreign_city] action = "Destroy City" actor_reqs = { "type", "name", "range", "present" - "UnitFlag", "GameLoss", "Local", TRUE - "DiplRel", "Foreign", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE + "Gov", "Democracy", "Player", FALSE ; Despotism, Monarchy, Republic, Nationalism, Communism can do it. + "Gov", "Theocracy", "Player", FALSE + "Gov", "Anarchy", "Player", FALSE + ;------------------------------------------------- + "UnitFlag", "Capturer", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "UnitState", "OnLivableTile", "Local", TRUE + "MaxUnitsOnTile","1", "Local", FALSE ; At least 2 units needed for genocidal operation + ;------------------------------------------------- + "DiplRel", "Foreign", "Local", TRUE ; Must be at war and foreign city + "DiplRel", "War", "Local", TRUE } target_reqs = - { "type", "name", "range", "present" - "MaxUnitsonTile","0", "Local", TRUE + { "type", "name", "range", "present" + "MinSize", "2", "City", TRUE ; sizes 2 through 8 + "MinSize", "9", "City", FALSE ; + "MaxUnitsonTile","0", "Local", TRUE ; must defeat defenders first + } +[actionenabler_destroy_domestic_city] +action = "Destroy City" +actor_reqs = + { "type", "name", "range", "present" + "Gov", "Anarchy", "Player", FALSE + "Gov", "Monarchy", "Player", FALSE + "Gov", "Democracy", "Player", FALSE ; Despotism, Communism can do it + "Gov", "Theocracy", "Player", FALSE + "Gov", "Republic", "Player", FALSE + "Gov", "Nationalism", "Player", FALSE + ;------------------------------------------------- + "UnitFlag", "Capturer", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "UnitState", "OnLivableTile", "Local", TRUE + "MaxUnitsOnTile","1", "Local", FALSE ; At least 2 units needed for genocidal operation + ;------------------------------------------------- + "DiplRel", "Foreign", "Local", FALSE ; Must be at war and foreign city + } +target_reqs = + { "type", "name", "range", "present" + "MinSize", "9", "City", FALSE ; sizes 1 through 8 + "MinForeignPct","14", "City", TRUE } ;ATTACKS every enabler below has 2 more duplicates in sections below, to ;handle Pax Dei logic. Always keep them identical except for Pax Dei ;reqs, which fall below the ;... marker. -;--------------------------------------------------------------------------- -;Tribesmen can attack: +;----------------------------------------------------------------------------ATTACK ENABLERS +;-----------------------------------------------------------TRIBESMEN ONLY +;NB: Pax Dei not invalidated by Monotheism [actionenabler_attack_native_tribesmen] action = "Attack" actor_reqs = @@ -1631,124 +1728,211 @@ actor_reqs = "MinMoveFrags", "1", "Local", TRUE "UnitState", "OnNativeTile", "Local", TRUE "UnitState", "Transported", "Local", FALSE + ;... "DiplRel", "War", "Local", TRUE - "UnitClassFlag", "Missile", "Local", FALSE + "UnitClassFlag","Missile", "Local", FALSE ;... "Building", "Pax Dei", "World", FALSE } -;Native attack ALWAYS allowed for units who aren't CargoRestrained -[actionenabler_landclass_attacker_native_unrestrained] +;----------------------- +[actionenabler_magnum_turret_attack] action = "Attack" actor_reqs = { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE - "UnitClassFlag","CargoRestrained","Local", FALSE + "UnitType", "Magnum Turret", "Local", TRUE ;Magnum Turret Only + ;... NB: not affected by Pax Dei + "DiplRel", "War", "Local", TRUE + "UnitClassFlag","Missile", "Local", FALSE + } +;-----------------------------------------------------------MISSILES ONLY +;NB: not affected by Pax DEI +[actionenabler_explode_missile] +action = "Suicide Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitClassFlag", "Missile", "Local", TRUE + "UnitClass", "Bomb2", "Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + ;... + "DiplRel", "War", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + } +[actionenabler_explode_conventional_bomb] +action = "Suicide Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitClassFlag", "Missile", "Local", TRUE + "UnitClass", "Bomb2", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "CityTile", "Center", "Local", FALSE + "UnitState", "Transported", "Local", TRUE + ;... + "DiplRel", "War", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + } + +;-----------------------------------------------------------------------NATIVE ATTACKS +;-----------------------------------------------------------all Land___ except LandAirSea +;Native attack for CargoRestrained units allowed, if not Transported +[actionenabler_land_attacker_native_restrained] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitClassFlag","TerrainSpeed", "Local", TRUE ;all Land___ (CargoRestrained && !CargoRestrained) "MinMoveFrags", "1", "Local", TRUE "UnitState", "OnNativeTile", "Local", TRUE - "UnitClassFlag", "TerrainSpeed", "Local", TRUE + "UnitState", "Transported", "Local", FALSE ;forced CargoRestrained condition + ;... "DiplRel", "War", "Local", TRUE - "UnitClassFlag", "Missile", "Local", FALSE + "UnitClassFlag","Missile", "Local", FALSE + "UnitFlag", "CantAttack", "Local", FALSE + "UnitFlag", "NonMil", "Local", FALSE ;!Tribesmen ;... "Building", "Pax Dei", "World", FALSE } +;-----------------------------------------------------------LANDAIRSEA +;LandAirSea = (Land__) && (!Land && !LandNoKill) ;Native attack ALWAYS allowed for units who aren't CargoRestrained -[actionenabler_non_landclass_attacker_native_unrestrained] +[actionenabler_land_attacker_native_unrestrained] action = "Attack" actor_reqs = { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE - "UnitClassFlag","CargoRestrained","Local", FALSE + "UnitClassFlag","TerrainSpeed", "Local", TRUE ;all Land___ types. + "UnitClassFlag","CargoRestrained","Local", FALSE ;!Land, !LandNoKill, !LandRoad + "UnitType", "Anti-Aircraft Artillery","Local",FALSE ;AAA has to fall through to use CargoRestrained enablers because it is indeed a restrained exception "MinMoveFrags", "1", "Local", TRUE - "UnitState", "OnNativeTile", "Local", TRUE - "UnitClassFlag", "TerrainSpeed", "Local", FALSE + "UnitState", "OnNativeTile", "Local", TRUE ; No "Transported" restriction + ;... "DiplRel", "War", "Local", TRUE - "UnitClassFlag", "Missile", "Local", FALSE + "UnitClassFlag","Missile", "Local", FALSE + "UnitFlag", "CantAttack", "Local", FALSE + "UnitFlag", "NonMil", "Local", FALSE ;... "Building", "Pax Dei", "World", FALSE } -target_reqs = - { "type", "name", "range", "present" - "Extra", "Bunker", "Local", FALSE - } -;Native attack for CargoRestrained units allowed, if not Transported -[actionenabler_landclass_attacker_native_restrained] +;-----------------------------------------------------------all AIR__ types +;Native attack ALWAYS allowed for units who aren't CargoRestrained +;Sea,RiverShip,Trireme,Air,Air_High_Altitude,AirProtect = (!Land__) +[actionenabler_non_land_attacker_native_unrestrained] action = "Attack" actor_reqs = { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE - "UnitClassFlag","CargoRestrained","Local", TRUE + "UnitClassFlag","TerrainSpeed", "Local", FALSE ;!Land___ == everything else + "UnitClassFlag","CargoRestrained","Local", FALSE ;!Land,!LandNoKill,!LandRoad [redundant (for now)...] "MinMoveFrags", "1", "Local", TRUE "UnitState", "OnNativeTile", "Local", TRUE - "UnitState", "Transported", "Local", FALSE - "UnitClassFlag","TerrainSpeed", "Local", TRUE + ;... "DiplRel", "War", "Local", TRUE - "UnitClassFlag", "Missile", "Local", FALSE + "UnitClassFlag","Missile", "Local", FALSE + "UnitFlag", "CantAttack", "Local", FALSE + "UnitFlag", "NonMil", "Local", FALSE ;... "Building", "Pax Dei", "World", FALSE } -;Non-Land units can't attack Bunkers -[actionenabler_non_landclass_attacker_native_restrained] +target_reqs = + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE + } +;-----------------------------------------------------------all SEA types +[actionenabler_non_land_attacker_native_restrained] action = "Attack" actor_reqs = { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE - "UnitClassFlag","CargoRestrained","Local", TRUE + "UnitClassFlag","TerrainSpeed", "Local", FALSE + "UnitClassFlag","CargoRestrained","Local", TRUE "MinMoveFrags", "1", "Local", TRUE "UnitState", "OnNativeTile", "Local", TRUE - "UnitState", "Transported", "Local", FALSE - "UnitClassFlag", "TerrainSpeed", "Local", FALSE - "DiplRel", "War", "Local", TRUE - "UnitClassFlag", "Missile", "Local", FALSE + "UnitState", "Transported", "Local", FALSE ; Can't attack while towed on Trawler + ;... + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + "UnitFlag", "CantAttack", "Local", FALSE + "UnitFlag", "NonMil", "Local", FALSE ;... "Building", "Pax Dei", "World", FALSE } target_reqs = - { "type", "name", "range", "present" - "Extra", "Bunker", "Local", FALSE - } -;Marines -[actionenabler_attack_marines] + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE + } +;-----------------------------------------------------------------------NON-NATIVE ATTACK + +;-----------------------------------------------------------Marines have no "transported" restriction +[actionenabler_attack_marines_from_non_native] action = "Attack" actor_reqs = { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE "MinMoveFrags", "1", "Local", TRUE - "UnitFlag", "Marines", "Local", TRUE + "UnitType", "Marines", "Local", TRUE ;if more types get this, it will become UnitFlag "TransportedAttacker" + ;... "DiplRel", "War", "Local", TRUE - "UnitClassFlag", "Missile", "Local", FALSE + "UnitClassFlag", "Missile", "Local", FALSE + "UnitFlag", "NonMil", "Local", FALSE ;... - "Building", "Pax Dei", "World", FALSE + "Building", "Pax Dei", "World", FALSE } -[actionenabler_landclass_attack_from_non_native] +;-----------------------------------------------------------Land___ +;This is all Land__ classes where the Unit also has a NonNativeAttack flag +[actionenabler_land_attack_from_non_native] action = "Attack" actor_reqs = { "type", "name", "range", "present" + "UnitClassFlag", "TerrainSpeed", "Local", TRUE ; All land classes + "MinMoveFrags", "1", "Local", TRUE + "UnitFlag", "NonNativeAttack", "Local", TRUE ; AAA, Mobile SAM, (ad redundantly), Marines. + "UnitState", "Transported", "Local", FALSE ; Can't attack on Truck or Transport. + ;... + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + "UnitFlag", "CantAttack", "Local", FALSE "UnitFlag", "NonMil", "Local", FALSE + ;... + "Building", "Pax Dei", "World", FALSE + } +;-----------------------------------------------------------all AIR__ types +[actionenabler_non_land_attack_from_non_native_unrestrained] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitClassFlag", "TerrainSpeed", "Local", FALSE "MinMoveFrags", "1", "Local", TRUE "UnitClassFlag", "AttFromNonNative", "Local", TRUE - "UnitClassFlag", "TerrainSpeed", "Local", TRUE + "UnitClassFlag","CargoRestrained", "Local", FALSE + ;... "DiplRel", "War", "Local", TRUE - "UnitClassFlag", "Missile", "Local", FALSE + "UnitClassFlag", "Missile", "Local", FALSE + "UnitFlag", "CantAttack", "Local", FALSE + "UnitFlag", "NonMil", "Local", FALSE ;... - "Building", "Pax Dei", "World", FALSE + "Building", "Pax Dei", "World", FALSE } -[actionenabler_non_landclass_attack_from_non_native] +target_reqs = + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE + } +;-----------------------------------------------------------all SEA types +[actionenabler_non_land_attack_from_non_native] action = "Attack" actor_reqs = { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE + "UnitClassFlag", "TerrainSpeed", "Local", FALSE "MinMoveFrags", "1", "Local", TRUE "UnitClassFlag", "AttFromNonNative", "Local", TRUE - "UnitClassFlag", "TerrainSpeed", "Local", FALSE + "UnitClassFlag", "CargoRestrained", "Local", TRUE + "UnitState", "Transported", "Local", FALSE ; Can't attack while towed on Trawler + ;... "DiplRel", "War", "Local", TRUE - "UnitClassFlag", "Missile", "Local", FALSE + "UnitClassFlag", "Missile", "Local", FALSE + "UnitFlag", "CantAttack", "Local", FALSE + "UnitFlag", "NonMil", "Local", FALSE ;... - "Building", "Pax Dei", "World", FALSE + "Building", "Pax Dei", "World", FALSE } target_reqs = - { "type", "name", "range", "present" - "Extra", "Bunker", "Local", FALSE + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE } +;-----------------------------------------------------------------------NONMIL EXCEPTIONS ; ***** NON-MIL ATTACKER rules (commerce units) ;Commerce units have to be NonMil to enter peaceful waters ;but they can also attack those with whom they are at war: @@ -1757,168 +1941,199 @@ action = "Attack" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "NonMilAttack", "Local", TRUE - "UnitClassFlag","CargoRestrained","Local", FALSE + "UnitState", "Transported", "Local", FALSE ; Tribesmen aren't Marines, Ships can't attack while towed on Trawler "MinMoveFrags", "1", "Local", TRUE "UnitState", "OnNativeTile", "Local", TRUE + ;... "DiplRel", "War", "Local", TRUE - "UnitClassFlag", "Missile", "Local", FALSE + "UnitClassFlag","Missile", "Local", FALSE + "UnitFlag", "CantAttack", "Local", FALSE ;... "Building", "Pax Dei", "World", FALSE } target_reqs = - { "type", "name", "range", "present" - "Extra", "Bunker", "Local", FALSE + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE } [actionenabler_attack_from_non_native_nonmil_attacker] action = "Attack" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "NonMilAttack", "Local", TRUE + "UnitState", "Transported", "Local", FALSE ; Ships can't attack while towed on Trawler "MinMoveFrags", "1", "Local", TRUE "UnitClassFlag", "AttFromNonNative", "Local", TRUE + ;... "DiplRel", "War", "Local", TRUE - "UnitClassFlag", "Missile", "Local", FALSE + "UnitClassFlag", "Missile", "Local", FALSE + "UnitFlag", "CantAttack", "Local", FALSE ;... - "Building", "Pax Dei", "World", FALSE + "Building", "Pax Dei", "World", FALSE } target_reqs = - { "type", "name", "range", "present" - "Extra", "Bunker", "Local", FALSE - } - -[actionenabler_explode_missile] -action = "Suicide Attack" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE - "UnitClassFlag", "Missile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "War", "Local", TRUE + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE } ;--------------------------------------------------------------------------- ; Same as above. For PAX DEI without Monotheism, it's legal. ;--------------------------------------------------------------------------- -;Native attack ALWAYS allowed for units who aren't CargoRestrained -[actionenabler_landclass_attacker_native_unrestrained_pd_no_m] +;----------------------------------------------------------------------------PAX DEI ATTACK ENABLERS + +;-----------------------------------------------------------------------NATIVE ATTACKS + +;-----------------------------------------------------------all Land___ except LandAirSea +;Native attack for CargoRestrained units allowed, if not Transported +[actionenabler_land_attacker_native_restrained_pd_no_m] action = "Attack" actor_reqs = { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE - "UnitClassFlag","CargoRestrained","Local", FALSE + "UnitClassFlag","TerrainSpeed", "Local", TRUE ;all Land___ +; "UnitClassFlag","CargoRestrained","Local", TRUE ;no need to prevent LandAirSea from using this because we have CargoRestrained sub-members of that class (i.e. AAA) "MinMoveFrags", "1", "Local", TRUE "UnitState", "OnNativeTile", "Local", TRUE - "UnitClassFlag", "TerrainSpeed", "Local", TRUE + "UnitState", "Transported", "Local", FALSE + ;... "DiplRel", "War", "Local", TRUE - "UnitClassFlag", "Missile", "Local", FALSE + "UnitClassFlag","Missile", "Local", FALSE + "UnitFlag", "CantAttack", "Local", FALSE + "UnitFlag", "NonMil", "Local", FALSE ;!Tribesmen ;... "Building", "Pax Dei", "World", TRUE "Tech", "Monotheism", "Player",FALSE } + +;-----------------------------------------------------------LANDAIRSEA +;LandAirSea = (Land__) && (!Land && !LandNoKill) ;Native attack ALWAYS allowed for units who aren't CargoRestrained -[actionenabler_non_landclass_attacker_native_unrestrained_pd_no_m] +[actionenabler_land_attacker_native_unrestrained_pd_no_m] action = "Attack" actor_reqs = { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE - "UnitClassFlag","CargoRestrained","Local", FALSE + "UnitClassFlag","TerrainSpeed", "Local", TRUE ;all Land___ types + "UnitClassFlag","CargoRestrained","Local", FALSE ;!Land, !LandNoKill, !LandRoad + "UnitType", "Anti-Aircraft Artillery","Local",FALSE ;AAA is CargoRestrained but in a !CargoRestrained unitclass:it falls thru to enabler above. "MinMoveFrags", "1", "Local", TRUE - "UnitState", "OnNativeTile", "Local", TRUE - "UnitClassFlag", "TerrainSpeed", "Local", FALSE + "UnitState", "OnNativeTile", "Local", TRUE ; No "Transported" restriction + ;... "DiplRel", "War", "Local", TRUE - "UnitClassFlag", "Missile", "Local", FALSE + "UnitClassFlag","Missile", "Local", FALSE + "UnitFlag", "CantAttack", "Local", FALSE + "UnitFlag", "NonMil", "Local", FALSE ;... "Building", "Pax Dei", "World", TRUE "Tech", "Monotheism", "Player",FALSE } -target_reqs = - { "type", "name", "range", "present" - "Extra", "Bunker", "Local", FALSE - } -;Native attack for CargoRestrained units allowed, if not Transported -[actionenabler_landclass_attacker_native_restrained_pd_no_m] + +;-----------------------------------------------------------all AIR__, SEA types +;Native attack ALWAYS allowed for units who aren't CargoRestrained +;Sea,RiverShip,Trireme,Air,Air_High_Altitude,AirProtect = (!Land__) +;Native attack ALWAYS allowed for units who aren't CargoRestrained +[actionenabler_non_land_attacker_native_unrestrained_pd_no_m] action = "Attack" actor_reqs = { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE - "UnitClassFlag","CargoRestrained","Local", TRUE + "UnitClassFlag","TerrainSpeed", "Local", FALSE ;!Land___ == everything else + "UnitClassFlag","CargoRestrained","Local", FALSE ;!Land,!LandNoKill,!LandRoad [redundant (for now)...] "MinMoveFrags", "1", "Local", TRUE "UnitState", "OnNativeTile", "Local", TRUE - "UnitState", "Transported", "Local", FALSE - "UnitClassFlag","TerrainSpeed", "Local", TRUE - "DiplRel", "War", "Local", TRUE - "UnitClassFlag", "Missile", "Local", FALSE ;... - "Building", "Pax Dei", "World", TRUE - "Tech", "Monotheism", "Player",FALSE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag","Missile", "Local", FALSE + "UnitFlag", "CantAttack", "Local", FALSE + "UnitFlag", "NonMil", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "Tech", "Monotheism", "Player",FALSE } +target_reqs = + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE + } + +;-----------------------------------------------------------all AIR__, SEA types ;Non-Land units can't attack Bunkers -[actionenabler_non_landclass_attacker_native_restrained_pd_no_m] +[actionenabler_non_land_attacker_native_restrained_pd_no_m] action = "Attack" actor_reqs = { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE - "UnitClassFlag","CargoRestrained","Local", TRUE + "UnitClassFlag","TerrainSpeed", "Local", FALSE + "UnitClassFlag","CargoRestrained","Local", TRUE ; <<<<<<<<<< no air sea types are cargorestrained! "MinMoveFrags", "1", "Local", TRUE "UnitState", "OnNativeTile", "Local", TRUE "UnitState", "Transported", "Local", FALSE - "UnitClassFlag", "TerrainSpeed", "Local", FALSE - "DiplRel", "War", "Local", TRUE - "UnitClassFlag", "Missile", "Local", FALSE + ;... + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + "UnitFlag", "CantAttack", "Local", FALSE + "UnitFlag", "NonMil", "Local", FALSE ;... "Building", "Pax Dei", "World", TRUE "Tech", "Monotheism", "Player",FALSE } target_reqs = - { "type", "name", "range", "present" - "Extra", "Bunker", "Local", FALSE - } -;Marines + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE + } +;-----------------------------------------------------------------------NON-NATIVE ATTACK + +;-----------------------------------------------------------Marines have no "transported" restriction +;Marines can always attack non-natively [actionenabler_attack_marines_pd_no_m] action = "Attack" actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - "UnitFlag", "Marines", "Local", TRUE - "DiplRel", "War", "Local", TRUE - "UnitClassFlag", "Missile", "Local", FALSE + { "type", "name", "range", "present" + "MinMoveFrags", "1", "Local", TRUE + "UnitType", "Marines", "Local", TRUE ;... - "Building", "Pax Dei", "World", TRUE - "Tech", "Monotheism", "Player",FALSE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + "UnitFlag", "NonMil", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "Tech", "Monotheism","Player",FALSE } -[actionenabler_landclass_attack_from_non_native_pd_no_m] +;-----------------------------------------------------------Land___ +;This is all Land__ classes where the Unit also has a NonNativeAttack flag +[actionenabler_land_attack_from_non_native_pd_no_m] action = "Attack" actor_reqs = { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE + "UnitClassFlag", "TerrainSpeed", "Local", TRUE ; All Land classes "MinMoveFrags", "1", "Local", TRUE - "UnitClassFlag", "AttFromNonNative", "Local", TRUE - "UnitClassFlag", "TerrainSpeed", "Local", TRUE + "UnitFlag", "NonNativeAttack", "Local", TRUE ; AAA, Mobile SAM, (and redundantly), Marines. + "UnitState", "Transported", "Local", FALSE ; Can't attack on Truck or Transport. + ;... "DiplRel", "War", "Local", TRUE - "UnitClassFlag", "Missile", "Local", FALSE + "UnitClassFlag", "Missile", "Local", FALSE + "UnitFlag", "CantAttack", "Local", FALSE + "UnitFlag", "NonMil", "Local", FALSE ;... "Building", "Pax Dei", "World", TRUE "Tech", "Monotheism", "Player",FALSE } -[actionenabler_non_landclass_attack_from_non_native_pd_no_m] +;-----------------------------------------------------------all AIR__, SEA types +[actionenabler_non_land_attack_from_non_native_pd_no_m] action = "Attack" actor_reqs = { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE + "UnitClassFlag", "TerrainSpeed", "Local", FALSE "MinMoveFrags", "1", "Local", TRUE "UnitClassFlag", "AttFromNonNative", "Local", TRUE - "UnitClassFlag", "TerrainSpeed", "Local", FALSE + ;... "DiplRel", "War", "Local", TRUE - "UnitClassFlag", "Missile", "Local", FALSE + "UnitClassFlag", "Missile", "Local", FALSE + "UnitFlag", "CantAttack", "Local", FALSE + "UnitFlag", "NonMil", "Local", FALSE ;... - "Building", "Pax Dei", "World", TRUE - "Tech", "Monotheism", "Player",FALSE + "Building", "Pax Dei", "World", TRUE + "Tech", "Monotheism", "Player",FALSE } target_reqs = - { "type", "name", "range", "present" - "Extra", "Bunker", "Local", FALSE + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE } +;-----------------------------------------------------------------------NONMIL EXCEPTIONS ; ***** NON-MIL ATTACKER rules (commerce units) ;Commerce units have to be NonMil to enter peaceful waters ;but they can also attack those with whom they are at war: @@ -1927,159 +2142,194 @@ action = "Attack" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "NonMilAttack", "Local", TRUE - "UnitClassFlag","CargoRestrained","Local", FALSE + "UnitState", "Transported", "Local", FALSE ; Tribesmen aren't Marines, Ships can't attack while towed on Trawler "MinMoveFrags", "1", "Local", TRUE "UnitState", "OnNativeTile", "Local", TRUE + ;... "DiplRel", "War", "Local", TRUE - "UnitClassFlag", "Missile", "Local", FALSE + "UnitClassFlag","Missile", "Local", FALSE + "UnitFlag", "CantAttack", "Local", FALSE ;... "Building", "Pax Dei", "World", TRUE "Tech", "Monotheism", "Player",FALSE } target_reqs = - { "type", "name", "range", "present" - "Extra", "Bunker", "Local", FALSE + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE } [actionenabler_attack_from_non_native_nonmil_attacker_pd_no_m] action = "Attack" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "NonMilAttack", "Local", TRUE + "UnitState", "Transported", "Local", FALSE ; Ships can't attack while towed on Trawler "MinMoveFrags", "1", "Local", TRUE "UnitClassFlag", "AttFromNonNative", "Local", TRUE + ;... "DiplRel", "War", "Local", TRUE - "UnitClassFlag", "Missile", "Local", FALSE + "UnitClassFlag", "Missile", "Local", FALSE + "UnitFlag", "CantAttack", "Local", FALSE ;... - "Building", "Pax Dei", "World", TRUE - "Tech", "Monotheism", "Player",FALSE + "Building", "Pax Dei", "World", TRUE + "Tech", "Monotheism", "Player",FALSE } target_reqs = - { "type", "name", "range", "present" - "Extra", "Bunker", "Local", FALSE + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE } ;--------------------------------------------------------------------------- ; Last one. For PAX DEI on your own territory, it's legal. ;--------------------------------------------------------------------------- -;Native attack ALWAYS allowed for units who aren't CargoRestrained -[actionenabler_landclass_attacker_native_unrestrained_pd_m_domestic] +;-----------------------------------------------------------------------NATIVE ATTACKS + +;-----------------------------------------------------------all Land___ except LandAirSea +;Native attack for CargoRestrained units allowed, if not Transported +[actionenabler_land_attacker_native_restrained_pd_m_domestic] action = "Attack" actor_reqs = { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE - "UnitClassFlag","CargoRestrained","Local", FALSE + "UnitClassFlag","TerrainSpeed", "Local", TRUE +; "UnitClassFlag","CargoRestrained","Local", TRUE ;allow CR unitclass exceptions to fall thru and use this enabler (AAA) "MinMoveFrags", "1", "Local", TRUE "UnitState", "OnNativeTile", "Local", TRUE - "UnitClassFlag", "TerrainSpeed", "Local", TRUE + "UnitState", "Transported", "Local", FALSE + ;... "DiplRel", "War", "Local", TRUE - "UnitClassFlag", "Missile", "Local", FALSE + "UnitClassFlag","Missile", "Local", FALSE + "UnitFlag", "CantAttack", "Local", FALSE + "UnitFlag", "NonMil", "Local", FALSE ;... "Building", "Pax Dei", "World", TRUE "UnitState", "OnDomesticTile", "Local", TRUE } +;-----------------------------------------------------------LANDAIRSEA +;LandAirSea = (Land__) && (!Land && !LandNoKill) ;Native attack ALWAYS allowed for units who aren't CargoRestrained -[actionenabler_non_landclass_attacker_native_unrestrained_pd_m_domestic] +[actionenabler_land_attacker_native_unrestrained_pd_m_domestic] action = "Attack" actor_reqs = { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE - "UnitClassFlag","CargoRestrained","Local", FALSE + "UnitClassFlag","TerrainSpeed", "Local", TRUE ;all Land___ types. + "UnitClassFlag","CargoRestrained","Local", FALSE ;!Land, !LandNoKill, !LandRoad + "UnitType","Anti-Aircraft Artillery","Local",FALSE ;AAA is CR in a !CR class, and must fall thru to use enabler above. "MinMoveFrags", "1", "Local", TRUE - "UnitState", "OnNativeTile", "Local", TRUE - "UnitClassFlag", "TerrainSpeed", "Local", FALSE + "UnitState", "OnNativeTile", "Local", TRUE ; No "Transported" restriction + ;... "DiplRel", "War", "Local", TRUE - "UnitClassFlag", "Missile", "Local", FALSE + "UnitClassFlag","Missile", "Local", FALSE + "UnitFlag", "CantAttack", "Local", FALSE + "UnitFlag", "NonMil", "Local", FALSE ;... "Building", "Pax Dei", "World", TRUE "UnitState", "OnDomesticTile", "Local", TRUE } -target_reqs = - { "type", "name", "range", "present" - "Extra", "Bunker", "Local", FALSE - } -;Native attack for CargoRestrained units allowed, if not Transported -[actionenabler_landclass_attacker_native_restrained_pd_m_domestic] +;-----------------------------------------------------------all AIR__ types +;Native attack ALWAYS allowed for units who aren't CargoRestrained +;Sea,RiverShip,Trireme,Air,Air_High_Altitude,AirProtect = (!Land__) +[actionenabler_non_land_attacker_native_unrestrained_pd_m_domestic] action = "Attack" actor_reqs = { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE - "UnitClassFlag","CargoRestrained","Local", TRUE + "UnitClassFlag","TerrainSpeed", "Local", FALSE ;!Land___ == everything else + "UnitClassFlag","CargoRestrained","Local", FALSE ;!Land,!LandNoKill,!LandRoad [redundant (for now)...] "MinMoveFrags", "1", "Local", TRUE "UnitState", "OnNativeTile", "Local", TRUE - "UnitState", "Transported", "Local", FALSE - "UnitClassFlag","TerrainSpeed", "Local", TRUE + ;... "DiplRel", "War", "Local", TRUE - "UnitClassFlag", "Missile", "Local", FALSE + "UnitClassFlag","Missile", "Local", FALSE + "UnitFlag", "CantAttack", "Local", FALSE + "UnitFlag", "NonMil", "Local", FALSE ;... "Building", "Pax Dei", "World", TRUE "UnitState", "OnDomesticTile", "Local", TRUE } +target_reqs = + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE + } +;-----------------------------------------------------------all SEA types ;Non-Land units can't attack Bunkers -[actionenabler_non_landclass_attacker_native_restrained_pd_m_domestic] +[actionenabler_non_land_attacker_native_restrained_pd_m_domestic] action = "Attack" actor_reqs = { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE - "UnitClassFlag","CargoRestrained","Local", TRUE + "UnitClassFlag","TerrainSpeed", "Local", FALSE + "UnitClassFlag","CargoRestrained","Local", TRUE ; Sea types are CR (can't attack while tugged by Trawler) "MinMoveFrags", "1", "Local", TRUE "UnitState", "OnNativeTile", "Local", TRUE "UnitState", "Transported", "Local", FALSE - "UnitClassFlag", "TerrainSpeed", "Local", FALSE - "DiplRel", "War", "Local", TRUE - "UnitClassFlag", "Missile", "Local", FALSE + ;... + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + "UnitFlag", "CantAttack", "Local", FALSE + "UnitFlag", "NonMil", "Local", FALSE ;... "Building", "Pax Dei", "World", TRUE "UnitState", "OnDomesticTile", "Local", TRUE } target_reqs = - { "type", "name", "range", "present" - "Extra", "Bunker", "Local", FALSE - } -;Marines + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE + } +;-----------------------------------------------------------------------NON-NATIVE ATTACK + +;-----------------------------------------------------------Marines can attack while transported +;"Marines" flag can always attack non-natively even while transported. [actionenabler_attack_marines_pd_m_domestic] action = "Attack" actor_reqs = { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE "MinMoveFrags", "1", "Local", TRUE - "UnitFlag", "Marines", "Local", TRUE + "UnitType", "Marines", "Local", TRUE + ;... "DiplRel", "War", "Local", TRUE - "UnitClassFlag", "Missile", "Local", FALSE + "UnitClassFlag", "Missile", "Local", FALSE + "UnitFlag", "NonMil", "Local", FALSE ;... - "Building", "Pax Dei", "World", TRUE - "UnitState", "OnDomesticTile", "Local", TRUE + "Building", "Pax Dei", "World", TRUE + "UnitState", "OnDomesticTile", "Local", TRUE } -[actionenabler_landclass_attack_from_non_native_pd_m_domestic] +;-----------------------------------------------------------Land___ +;This is all Land__ classes where the Unit also has a NonNativeAttack flag +[actionenabler_land_attack_from_non_native_pd_m_domestic] action = "Attack" actor_reqs = { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE + "UnitClassFlag", "TerrainSpeed", "Local", TRUE ; All Land classes "MinMoveFrags", "1", "Local", TRUE - "UnitClassFlag", "AttFromNonNative", "Local", TRUE - "UnitClassFlag", "TerrainSpeed", "Local", TRUE + "UnitFlag", "NonNativeAttack", "Local", TRUE ; AAA, Mobile SAM, (and redundantly), Marines. + "UnitState", "Transported", "Local", FALSE ; Can't attack on Truck or Transport. + ;... "DiplRel", "War", "Local", TRUE - "UnitClassFlag", "Missile", "Local", FALSE + "UnitClassFlag", "Missile", "Local", FALSE + "UnitFlag", "CantAttack", "Local", FALSE + "UnitFlag", "NonMil", "Local", FALSE ;... - "Building", "Pax Dei", "World", TRUE - "UnitState", "OnDomesticTile", "Local", TRUE + "Building", "Pax Dei", "World", TRUE + "UnitState", "OnDomesticTile", "Local", TRUE } -[actionenabler_non_landclass_attack_from_non_native_pd_m_domestic] +;-----------------------------------------------------------all AIR__, SEA types +[actionenabler_non_land_attack_from_non_native_pd_m_domestic] action = "Attack" actor_reqs = { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - "UnitClassFlag", "AttFromNonNative", "Local", TRUE "UnitClassFlag", "TerrainSpeed", "Local", FALSE + "UnitClassFlag", "AttFromNonNative", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + ;... "DiplRel", "War", "Local", TRUE - "UnitClassFlag", "Missile", "Local", FALSE + "UnitClassFlag", "Missile", "Local", FALSE + "UnitFlag", "CantAttack", "Local", FALSE + "UnitFlag", "NonMil", "Local", FALSE ;... - "Building", "Pax Dei", "World", TRUE - "UnitState", "OnDomesticTile", "Local", TRUE + "Building", "Pax Dei", "World", TRUE + "UnitState", "OnDomesticTile", "Local", TRUE } target_reqs = - { "type", "name", "range", "present" - "Extra", "Bunker", "Local", FALSE + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE } +;-----------------------------------------------------------------------NONMIL EXCEPTIONS ; ***** NON-MIL ATTACKER rules (commerce units) ;Commerce units have to be NonMil to enter peaceful waters ;but they can also attack those with whom they are at war: @@ -2088,35 +2338,40 @@ action = "Attack" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "NonMilAttack", "Local", TRUE - "UnitClassFlag","CargoRestrained","Local", FALSE + "UnitState", "Transported", "Local", FALSE ; Tribesmen aren't Marines, Ships can't attack while towed on Trawler "MinMoveFrags", "1", "Local", TRUE "UnitState", "OnNativeTile", "Local", TRUE + ;... "DiplRel", "War", "Local", TRUE - "UnitClassFlag", "Missile", "Local", FALSE + "UnitClassFlag","Missile", "Local", FALSE + "UnitFlag", "CantAttack", "Local", FALSE ;... "Building", "Pax Dei", "World", TRUE "UnitState", "OnDomesticTile", "Local", TRUE } target_reqs = - { "type", "name", "range", "present" - "Extra", "Bunker", "Local", FALSE + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE } [actionenabler_attack_from_non_native_nonmil_attacker_pd_m_domestic] action = "Attack" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "NonMilAttack", "Local", TRUE + "UnitState", "Transported", "Local", FALSE ; Ships can't attack while towed on Trawler "MinMoveFrags", "1", "Local", TRUE "UnitClassFlag", "AttFromNonNative", "Local", TRUE + ;... "DiplRel", "War", "Local", TRUE - "UnitClassFlag", "Missile", "Local", FALSE + "UnitClassFlag", "Missile", "Local", FALSE + "UnitFlag", "CantAttack", "Local", FALSE ;... - "Building", "Pax Dei", "World", TRUE - "UnitState", "OnDomesticTile", "Local", TRUE + "Building", "Pax Dei", "World", TRUE + "UnitState", "OnDomesticTile", "Local", TRUE } target_reqs = - { "type", "name", "range", "present" - "Extra", "Bunker", "Local", FALSE + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE } ;--------------------------------------------------------------------------- [actionenabler_conquer_city_native_unrestrained] @@ -2153,7 +2408,7 @@ target_reqs = { "type", "name", "range", "present" "MaxUnitsOnTile", "0", "Local", TRUE } -[actionenabler_conquer_city_marines] +[actionenabler_conquer_city_marines] ; Marines are only unit who can conquer from a transport. action = "Conquer City" actor_reqs = { "type", "name", "range", "present" @@ -2161,17 +2416,14 @@ actor_reqs = "UnitFlag", "NonMil", "Local", FALSE "DiplRel", "War", "Local", TRUE "MinMoveFrags", "1", "Local", TRUE - "UnitFlag", "Marines", "Local", TRUE - "UnitType", "Anti-Aircraft Artillery", "Local", FALSE - ;AAA got Marines flag only to enable reasonable attacks, - ;not for conquering cities from a Transport. + "UnitType", "Marines", "Local", TRUE "Nation", "Animal Kingdom", "Player",FALSE } target_reqs = - { "type", "name", "range", "present" - "MaxUnitsOnTile", "0", "Local", TRUE - } -[actionenabler_conquer_city_from_non_native] + { "type", "name", "range", "present" + "MaxUnitsOnTile", "0", "Local", TRUE + } +[actionenabler_conquer_city_from_non_native] ; This currently only opens up the case for Helicopters only (?) action = "Conquer City" actor_reqs = { "type", "name", "range", "present" @@ -2180,9 +2432,8 @@ actor_reqs = "DiplRel", "War", "Local", TRUE "MinMoveFrags", "1", "Local", TRUE "UnitClassFlag", "AttFromNonNative", "Local", TRUE - "UnitType", "Anti-Aircraft Artillery", "Local", FALSE - ;AAA got AttFromNonNative only to enable reasonable attacks, - ;not for conquering cities from a Transport. + "UnitState", "Transported", "Local", FALSE ; only Marines can conquer while transported, and that's covered above. + "UnitType", "Anti-Aircraft Artillery","Local", FALSE ; redundantly exclude AAA even though this could only happen while transported "Nation", "Animal Kingdom", "Player",FALSE } target_reqs = @@ -2199,6 +2450,19 @@ actor_reqs = ; REMOVE LINE BELOW TO ALLOW GIVING UNITS TO ALLIES THROUGH HOME CITY COMMAND "DiplRel", "Foreign", "Local", FALSE } +[actionenabler_change_ally_home_city_zealot_caliphate] +action = "Home City" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NoHome", "Local", FALSE + "UnitState", "HasHomeCity", "Local", TRUE + "UnitType", "Zealots", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" + "Gov", "Theocracy", "Player", TRUE + } + ; Allow no-home caravans to be "homed" so they can be used for a Trade Route: [actionenabler_change_home_commerce] action = "Home City" @@ -2232,7 +2496,22 @@ actor_reqs = action = "Upgrade Unit" actor_reqs = { "type", "name", "range", "present" - "DiplRel", "Foreign", "Local", FALSE + "DiplRel", "Foreign", "Local", FALSE + "CityTile", "Center", "Local", TRUE + } + +;Workers can upgrade to Workers II for free, anywhere on the map +;but not if player knows Explosives because that would be free +;Engineers. In such a case they can try the convert order to go +;to Workers II but the truth is, Workers II are obsolete if you +;have explosives, so, too bad. Should have done it earlier. +[actionenabler_upgrade_to_Workers_II] +action = "Upgrade Unit" +actor_reqs = + { "type", "name", "range", "present" + "Tech", "Democracy", "Player", TRUE + "Tech", "Explosives", "Player", FALSE + "UnitType", "Workers", "Local", TRUE } [actionenabler_airlift_unit] @@ -2260,17 +2539,26 @@ actor_reqs = "Terrain", "Grassland", "Local", FALSE } -[actionenabler_irrigate_tf] +[actionenabler_cultivate] action = "Cultivate" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE "UnitFlag", "CanHide", "Local", FALSE "UnitFlag", "CanClaim", "Local", FALSE -; "UnitType", "Legion", "Local", FALSE + "UnitType", "Tribesmen", "Local", FALSE "UnitType", "Proletarians", "Local", FALSE + "UnitType", "Trawler", "Local", FALSE + } +[actionenabler_cultivate_tribesmen] +action = "Cultivate" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Settlers", "Local", TRUE + "UnitType", "Tribesmen", "Local", TRUE + "MinYear", "-2000", "World", FALSE ; they get old } -[actionenabler_irrigate_tf_prole] +[actionenabler_cultivate_prole] action = "Cultivate" actor_reqs = { "type", "name", "range", "present" @@ -2279,19 +2567,29 @@ actor_reqs = "Gov", "Communism", "Player", TRUE } -[actionenabler_mine_tf_outside_city] +[actionenabler_plant_outside_city] action = "Plant" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE - "UnitFlag", "CanHide", "Local", FALSE - "UnitFlag", "CanClaim", "Local", FALSE -; "UnitType", "Legion", "Local", FALSE + "UnitFlag", "CanHide", "Local", FALSE + "UnitFlag", "CanClaim", "Local", FALSE + "UnitType", "Tribesmen", "Local", FALSE "UnitType", "Proletarians","Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE + "UnitType", "Trawler", "Local", FALSE + "UnitFlag", "Well-Digger", "Local", FALSE "CityTile", "Center", "Local", FALSE } -[actionenabler_mine_tf_outside_city_prole] +[actionenabler_plant_outside_city_tribesmen] +action = "Plant" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Settlers", "Local", TRUE + "UnitType", "Tribesmen", "Local", TRUE + "CityTile", "Center", "Local", FALSE + "MinYear", "-2000", "World", FALSE ; they get old + } +[actionenabler_plant_outside_city_prole] action = "Plant" actor_reqs = { "type", "name", "range", "present" @@ -2300,19 +2598,19 @@ actor_reqs = "Gov", "Communism", "Player", TRUE "CityTile", "Center", "Local", FALSE } -[actionenabler_mine_tf_inside_city] ;you can't plant a forest in an existing city +[actionenabler_plant_inside_city] ;you can't plant a forest in an existing city action = "Plant" actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE -; "UnitType", "Legion", "Local", FALSE - "UnitFlag", "CanHide", "Local", FALSE - "UnitFlag", "CanClaim", "Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - "CityTile", "Center", "Local", TRUE - "Terrain", "Grassland", "Local", FALSE - "Terrain", "Plains", "Local", FALSE + { "type", "name", "range", "present" + "UnitFlag", "Settlers", "Local", TRUE + "UnitFlag", "CanHide", "Local", FALSE + "UnitFlag", "CanClaim", "Local", FALSE + "UnitFlag", "Well-Digger", "Local", FALSE + "UnitType", "Proletarians","Local", FALSE + "UnitType", "Trawler", "Local", FALSE + "CityTile", "Center", "Local", TRUE + "Terrain", "Grassland", "Local", FALSE + "Terrain", "Plains", "Local", FALSE } [actionenabler_pillage] @@ -2351,6 +2649,13 @@ actor_reqs = "UnitType", "Jet Bomber", "Local", TRUE "MinMoveFrags", "1", "Local", TRUE } +[actionenabler_pillage4] +action = "Pillage" +actor_reqs = + { "type", "name", "range", "present" + "UnitType", "Stealth Bomber", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + } [actionenabler_clean_pollution] action = "Clean Pollution" @@ -2410,7 +2715,7 @@ actor_reqs = "UnitFlag", "Settlers", "Local", TRUE "UnitFlag", "CanHide", "Local", FALSE "UnitFlag", "CanClaim", "Local", FALSE - "Tech", "Explosives", "Player", TRUE + "Tech", "Steel", "Player", TRUE "UnitType", "Proletarians", "Local", FALSE "UnitType", "Tribesmen", "Local", FALSE } @@ -2494,9 +2799,7 @@ actor_reqs = "UnitType", "Marines", "Local", FALSE "UnitFlag", "Well-Digger", "Local", FALSE } -;Somewhat counterintuitive but this results in Marines able to build -;Forts and airbases, though no airbase inside an existing fort, -;because otherwise they'd also be able to build Fortresses. +;Marines are able to build Forts and Airbases [actionenabler_marines_can_fort_only] action = "Build Base" actor_reqs = @@ -2505,10 +2808,7 @@ actor_reqs = "UnitState", "Transported", "Local", FALSE "UnitFlag", "CanFortress", "Local", TRUE } -target_reqs = - { "type", "name", "range", "present" - "Extra", "Fort", "Local", FALSE - } + [actionenabler_base_prole] action = "Build Base" actor_reqs = @@ -2529,6 +2829,26 @@ actor_reqs = "UnitState", "OnLivableTile", "Local", TRUE "DiplRel", "Foreign", "Local", FALSE } +[actionenabler_build_deep_dive_depth] +action = "Build Base" +actor_reqs = + { "type", "name", "range", "present" +; Hard contradiction between Tile Claim and Hideout is necessary so that +; the actionenabler for one never allows the other to be made. TODO: +; req is just a CanHide unit, when actionenabler req can check base type: +; "UnitType", "Missile Submarine","Local", TRUE +; "Extra", "Buoy", "Local", FALSE +; "Extra", "Fishtrap", "Local", FALSE +; "Terrain", "Deep Ocean", "Local", TRUE +; "Extra", "Fish", "Adjacent", FALSE ;prevent making Fishtrap + } +target_reqs = + { "type", "name", "range", "present" + ; "Extra", "Buoy", "Local", FALSE + ; "Extra", "Fishtrap", "Local", FALSE + ; "Terrain", "Deep Ocean", "Local", TRUE + } + [actionenabler_build_hideout_unclaimed] action = "Build Base" actor_reqs = @@ -2628,7 +2948,7 @@ target_reqs = "TerrainFlag", "Oil", "Local", FALSE } -[actionenabler_desert_oil] +[actionenabler_desert_mining] action = "Build Mine" actor_reqs = { "type", "name", "range", "present" @@ -2644,7 +2964,7 @@ target_reqs = { "type", "name", "range" "Terrain", "Desert", "Local" } -[actionenabler_desert_oil_prole] +[actionenabler_desert_mining_prole] action = "Build Mine" actor_reqs = { "type", "name", "range", "present" @@ -2688,6 +3008,35 @@ target_reqs = "Terrain", "Glacier", "Local" } +[actionenabler_build_fishtrap_trawler] +action = "Build Base" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Settlers", "Local", TRUE + "UnitType", "Trawler", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" + "TerrainClass", "Oceanic", "Local", TRUE + "Tech", "Refrigeration", "Player", TRUE + } +[actionenabler_build_fishtrap_worker_types] +action = "Build Base" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Settlers", "Local", TRUE + "UnitState","Transported", "Local", TRUE + "UnitType", "Tribesmen", "Local", FALSE + "UnitFlag", "CanHide", "Local", FALSE + "UnitFlag", "CanClaim", "Local", FALSE + "UnitFlag", "Well-Digger", "Local", FALSE + } +target_reqs = + { "type", "name", "range", "present" + "TerrainClass", "Oceanic", "Local", TRUE + "Tech", "Refrigeration", "Player", TRUE + } + [actionenabler_irrigate_welldigger] action = "Build Irrigation" actor_reqs = @@ -2711,7 +3060,6 @@ actor_reqs = "UnitFlag", "Settlers", "Local", TRUE "UnitFlag", "CanHide", "Local", FALSE "UnitFlag", "CanClaim", "Local", FALSE - "Tech", "Monarchy", "Player",FALSE "Building", "Chand Baori", "Player",TRUE } target_reqs = @@ -2746,6 +3094,18 @@ target_reqs = { "type", "name", "range", "present" "TerrainClass", "Oceanic", "CAdjacent", TRUE } +[actionenabler_irrigate_src_ocean_tribesmen_chand_baori] +action = "Build Irrigation" +actor_reqs = + { "type", "name", "range", "present" + "Building", "Chand Baori", "Player", TRUE + "UnitFlag", "Settlers", "Local", TRUE + "UnitType", "Tribesmen", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" + "TerrainClass", "Oceanic", "CAdjacent", TRUE + } [actionenabler_irrigate_src_ocean_prole] action = "Build Irrigation" actor_reqs = @@ -2813,61 +3173,8 @@ target_reqs = { "type", "name", "range", "present" "ExtraFlag", "IrrigationSource", "CAdjacent", TRUE } -;NO LONGER NEEDED NOW THAT WE USE IrrigationSource flag: -;[actionenabler_irrigate_src_oasis] -;action = "Build Irrigation" -;actor_reqs = -; { "type", "name", "range", "present" -; "UnitFlag", "Settlers", "Local", TRUE -; "UnitFlag", "CanHide", "Local", FALSE -; "UnitFlag", "CanClaim", "Local", FALSE -; "UnitType", "Proletarians", "Local", FALSE -; "UnitFlag", "Well-Digger", "Local", FALSE -; } -;target_reqs = -; { "type", "name", "range", "present" -; "Extra", "Oasis", "CAdjacent", TRUE -; } -;[actionenabler_irrigate_src_oasis_prole] -;action = "Build Irrigation" -;actor_reqs = -; { "type", "name", "range", "present" -; "UnitFlag", "Settlers", "Local", TRUE -; "UnitType", "Proletarians", "Local", TRUE -; "Gov", "Communism", "Player",TRUE -; } -;target_reqs = -; { "type", "name", "range", "present" -; "Extra", "Oasis", "CAdjacent", TRUE -; } -; -;[actionenabler_irrigate_src_irrigation] -;action = "Build Irrigation" -;actor_reqs = -; { "type", "name", "range", "present" -; "UnitFlag", "Settlers", "Local", TRUE -; "UnitFlag", "Well-Digger", "Local", FALSE -; "UnitType", "Proletarians", "Local", FALSE -; "UnitFlag", "CanHide", "Local", FALSE -; "UnitFlag", "CanClaim", "Local", FALSE -; } -;target_reqs = -; { "type", "name", "range", "present" -; "Extra", "Irrigation", "CAdjacent", TRUE -; } -;[actionenabler_irrigate_src_irrigation_prole] -;action = "Build Irrigation" -;actor_reqs = -; { "type", "name", "range", "present" -; "UnitFlag", "Settlers", "Local", TRUE -; "UnitType", "Proletarians", "Local", TRUE -; "Gov", "Communism", "Player",TRUE -; } -;target_reqs = -; { "type", "name", "range", "present" -; "Extra", "Irrigation", "CAdjacent", TRUE -; } +;**************************************************************************** Board Deboard Unload Disembark Embark [actionenabler_deboard] action = "Transport Deboard" actor_reqs = @@ -2880,20 +3187,72 @@ target_reqs = "UnitState", "Transporting", "Local" } -;TO DO: this gives ruleset control over logical requirements for -;when units can board as cargo onto transporters. This should be -;extended and exploited to finally give ruleset supreme control -;over smooth minimalist non-exploitable behaviours. -[actionenabler_board] +[actionenabler_board_air_and_missile] ;no move frag req for boarding for planes and missiles action = "Transport Board" actor_reqs = - { "type", "name", "range", "present" - "DiplRel", "Armistice", "Local", FALSE - "DiplRel", "War", "Local", FALSE - "DiplRel", "Cease-fire", "Local", FALSE - "DiplRel", "Peace", "Local", FALSE - "DiplRel", "Never met", "Local", FALSE + { "type", "name", "range", "present" + "UnitClassFlag", "TerrainSpeed", "Local", FALSE ;not Land + "UnitClassFlag", "WaterVessel", "Local", FALSE ;not Sea + "DiplRel", "Armistice", "Local", FALSE + "DiplRel", "War", "Local", FALSE + "DiplRel", "Cease-fire", "Local", FALSE + "DiplRel", "Peace", "Local", FALSE + "DiplRel", "Never met", "Local", FALSE } +[actionenabler_board_universal_land_units] +action = "Transport Board" +actor_reqs = + { "type", "name", "range", "present" + "UnitClassFlag", "TerrainSpeed", "Local", TRUE ;all Land + "DiplRel", "Armistice", "Local", FALSE + "DiplRel", "War", "Local", FALSE + "DiplRel", "Cease-fire", "Local", FALSE + "DiplRel", "Peace", "Local", FALSE + "DiplRel", "Never met", "Local", FALSE + "UnitType", "Magnum Turret", "Local", FALSE ;Makes utype_can_do_action() render false so we don't show illegal orders buttons + "MinMoveFrags", "1", "Local", TRUE ;limits double-move and "attack-and-haul". + } +[actionenabler_board_sea_trawler] +action = "Transport Board" +actor_reqs = + { "type", "name", "range", "present" + "UnitClassFlag", "WaterVessel", "Local", TRUE ;Sea + "DiplRel", "Armistice", "Local", FALSE + "DiplRel", "War", "Local", FALSE + "DiplRel", "Cease-fire", "Local", FALSE + "DiplRel", "Peace", "Local", FALSE + "DiplRel", "Never met", "Local", FALSE + "UnitState", "MovedThisTurn", "Local", FALSE ;Sea units may not have moved to get on trawler + } +[actionenabler_board_marines] +action = "Transport Board" +actor_reqs = + { "type", "name", "range", "present" + "UnitType","Marines", "Local", TRUE + "DiplRel", "Armistice", "Local", FALSE + "DiplRel", "War", "Local", FALSE + "DiplRel", "Cease-fire", "Local", FALSE + "DiplRel", "Peace", "Local", FALSE + "DiplRel", "Never met", "Local", FALSE + } + +;This enabler can replace the one above if/when needed if "russian doll" exploits are discovered which should be stopped. +;Note: this is currently not illegal. In most cases it makes sense (e.g., Bomber with a Bomb on a Carrier, Trawler towing a +;ship with Goods, Mobile SAM with loaded missiles can board a Transport, etc.) +;[actionenabler_board_no_russian_doll_tricks] +;action = "Transport Board" +;actor_reqs = +; { "type", "name", "range", "present" +; "DiplRel", "Armistice", "Local", FALSE +; "DiplRel", "War", "Local", FALSE +; "DiplRel", "Cease-fire", "Local", FALSE +; "DiplRel", "Peace", "Local", FALSE +; "DiplRel", "Never met", "Local", FALSE +; "MinMoveFrags", "1", "Local", TRUE +; "UnitType","Magnum Turret", "Local", FALSE ;only needed for utype_can_do_action to render false so we aren't show illegal order options +; "UnitType","Trawler", "Local", FALSE ; put unit_types here who can't be cargo if they also have cargo +; "UnitState","Transporting","Local", FALSE ; note it should be legal for some cases like towing a ship with cargo +; } ;TO DO: this gives ruleset control over logical requirements for ;when units can unload. Finally ruleset could have supreme control @@ -2921,20 +3280,33 @@ actor_reqs = "MinMoveFrags", "1", "Local" } -;TO DO: this now enables ruleset to control embarkation stipulations, rather -;than hard-coded client. This actionenabler should be extended with all the -;mp2c logic and taken advantage of for expanded/simplified/upgraded mechanics. [actionenabler_embark] action = "Transport Embark" actor_reqs = { "type", "name", "range", "present" "MinMoveFrags", "1", "Local", TRUE + "UnitClass", "Missile", "Local", FALSE "DiplRel", "Armistice", "Local", FALSE "DiplRel", "War", "Local", FALSE "DiplRel", "Cease-fire", "Local", FALSE "DiplRel", "Peace", "Local", FALSE "DiplRel", "Never met", "Local", FALSE } +;Missiles can board/embark (1) in cities, (2) as a cargo swap, (3) i.e., NOT flying through air to land in a catch-net. +[actionenabler_embark_missiles] +action = "Transport Embark" +actor_reqs = + { "type", "name", "range", "present" + "MinMoveFrags", "1", "Local", TRUE + "UnitClass", "Missile", "Local", TRUE + "UnitState", "Transported","Local", TRUE + "DiplRel", "Armistice", "Local", FALSE + "DiplRel", "War", "Local", FALSE + "DiplRel", "Cease-fire", "Local", FALSE + "DiplRel", "Peace", "Local", FALSE + "DiplRel", "Never met", "Local", FALSE + } +;******************************************************************************************************************* [borders] ; Base border radius from city. @@ -2987,12 +3359,12 @@ base_tech_cost = 20 ; players which already know the tech and you have an ; embassy with. ; "All Players" - Technology cost is reduced depending on the number of -; all players (human, AI and barbarians) which already -; know the tech. +; all living players (human, AI and barbarians) which +; already know the tech. ; "Normal Players" - Technology cost is reduced depending on the number of -; normal players (human and AI) which already know the -; tech. -tech_leakage = "All Players" +; normal living players (human and AI) which already know +; the tech. (FCW: and if human, are not idle 5 or more turns) +tech_leakage = "Normal Players" ; Method of paying tech upkeep ; "None" - no upkeep @@ -3359,10 +3731,6 @@ names = ; RESTRICTINFRA ENABLED ONLY RESTRICTS ENEMY RAILS TO FUNCTION AS ROADS [settings] -; TO DISABLE SPACERACE INCLUDE THESE LINES BELOW: -; "endspaceship", DISABLED, FALSE -; "victories", "ALLIED", FALSE - set = { "name", "value", "lock" "mapsize", "PLAYER", FALSE @@ -3381,8 +3749,9 @@ set = "autoattack", "enabled", FALSE "autoattack_style", 1, FALSE "barbarians", "DISABLED", FALSE - "blueprints", 80, FALSE + "blueprints", 65, FALSE "borders", "SEE_INSIDE", FALSE + "casusbelli_allies", 1, FALSE ; casus belli on one, is casus belli on all (allies). "casusbelliturns", 12, FALSE ; how many turns casus belli lasts after an incident, if not reset. will go +1 higher for further incidents. will be reset by any new non-aggression pact. "ceasefirelength", 15, FALSE "city_output_style", 1, FALSE ; whether tiles and specialists have WYSIWYG output, or calculate output for gold/science AFTER city growth/shrink events. @@ -3392,10 +3761,10 @@ set = "diplgoldcost", 5, FALSE "diplbulbcost", 0, FALSE ; tech trades are overridden by blueprint %; if blueprints are off, there is no tax on theft/conquest. "dispersion", 0, FALSE - "endspaceship", "ENABLED", FALSE + "endspaceship", "DISABLED", FALSE ; prevent game to instantly be over. "foggedborders", TRUE, FALSE - "fixedlength", "ENABLED", TRUE ; Turn done doesn't advance turn if there is a timeout. - "freecost", 1, FALSE ; 0 would get overridden by the 'blueprints' setting: 1 gives 99% of the bulbs of the tech awarded by Philosophy. + "fixedlength", "ENABLED", FALSE ; Turn done doesn't advance turn if there is a timeout. + "freecost", 0, FALSE ; 0 would get overridden by the 'blueprints' setting: 1 gives 99% of the bulbs of the tech awarded by Philosophy. "fulldisorder", "ENABLED", FALSE ; disorder fully halts one turn of production or buying in a city: closes lots of complex time-consuming micromanaged exploits one would feel obligated to do to be competitive "generator", "RANDOM", FALSE "gold", 70, FALSE @@ -3408,7 +3777,7 @@ set = "latejoin_gold", 14, FALSE ; gold per turn of absence when late joining "latejoin_gold_max", 900, FALSE ; maximum amount of (inherited gold + latejoin gold) when taking a nation. "landmass", 63, FALSE - "looting", "BASE_TRADE", FALSE + "looting", "PROPERTY", FALSE "minplayers", 0, FALSE "move_bonus_in_frags", "ENABLED", TRUE ;locked "multiresearch", "ENABLED", FALSE @@ -3417,6 +3786,7 @@ set = "nukes_minor", "ENABLED", FALSE ; set to DISABLED to completely disallow nuclear detonations "nukes_major", "ENABLED", FALSE ; set to DISABLED to disallow nuclear fusion weapons "polarstrip", "DISABLED", FALSE ; blocks making horizontal polar strips on most generators + "razechance", 14, FALSE ; each building has 1/7 chance to be lost/razed during a conquest (server default is 1/5) "revolen", 1, FALSE "restrictinfra", "ENABLED", FALSE ; required for mp2 mechanics. "separatepoles", FALSE, FALSE @@ -3427,7 +3797,7 @@ set = "startpos", "DEFAULT", FALSE "startunits", "DDDwwwAucca", "FALSE" ;3 Tribesmen, 3 Workers, 1 Caravan, 1 Founders, 2 Settlers, 1 Well-Digger "steepness", 20, FALSE - "techleak", 25, FALSE + "techleak", 50, FALSE "techlossforgiveness", 200, FALSE "techlossrestore", 100, FALSE "techpenalty", 0, FALSE diff --git a/freeciv/freeciv/data/mp2-dragoon/governments.ruleset b/freeciv/freeciv/data/mp2-dragoon/governments.ruleset index 988129564..e7080c74e 100644 --- a/freeciv/freeciv/data/mp2-dragoon/governments.ruleset +++ b/freeciv/freeciv/data/mp2-dragoon/governments.ruleset @@ -208,20 +208,24 @@ ruler_female_title = _("High Priestess %s") helptext = _("\ Theocracy is formed on religious beliefs which are the law of the land. \ "), _("\ -The people are devoted and often willing to die for their faith. Cities very\ +The people are devoted and often willing to die for their faith. Each city\ + has +1 happy citizen. Cities very\ near a capital have very low corruption. Cost for enemies to incite cities or\ - bribe units is 2x, but Zealots cannot be bribed. Enemies cannot establish\ - embassies without first making Ceasefire or Peace. \ + bribe units is 2x, but Zealots cannot be bribed. Cost to incite foreign cities\ + is reduced by a third. Enemies cannot establish embassies without first making\ + Ceasefire or Peace. \ "), _("\ -Improvements that appease unhappy citizens produce 1 gold in tithes for each\ +Improvements that appease unhappy citizens add +1 base gold in tithes for each\ citizen appeased. Tithes also boost gold income by +20%, but science output\ suffers -20%. Palace gives +50% to gold income in its city. In cities, two\ military units may impose martial law, affecting one citizen each. Pilgrims\ can be made to migrate and grow cities. \n\ "), _("\ +Celebrating cities rapture 2 out of 5 turns (with a Cathedral. 1 out of 2).\ No citizens are made unhappy by each aggressive unit. \n\ -2% Base corruption in cities\n\ -2% Extra corruption per each tile in distance from capital\n\ +0% Base corruption in cities\n\ +1% Extra corruption per each tile in distance from capital \n\n\ +Having an Ecclesiastical Palace allows instant and orderly transition to this government.\ ") ;------------------------------------------------------------------------ @@ -240,12 +244,15 @@ ruler_female_title = _("?female:Comrade %s") helptext = _("\ In Communism, all work, output, and goods are owned by the state.\ "), _("\ -Each city gets 4 shields of free unit upkeep. Buildings with 1 upkeep\ - are free. The city with a Palace gets +25% production. \ +Content cities get a +1 trade bonus on irrigated tiles that\ + already produce trade. Each city gets 4 shields and\ + 3 gold of free unit upkeep. Buildings with 1 upkeep are free.\ + The city with a Palace gets +40% production. \ "), _("\ Riflemen cost 5 less; Armor and Dive Bombers, 10 less.\ Diplomats and Spies get +1 vet level. The effect of\ - Cathedrals and Michelangelo is reduced -1. \ + Cathedrals and Michelangelo is reduced -1. Each city\ + gets the effects of a Supermarket for free.\ "), _("\ Communists can transfer Proletarians between cities to\ re-distribute population, or use them as workers on\ @@ -254,6 +261,7 @@ Communists can transfer Proletarians between cities to\ territory and possessing the necessary tech. \n\ "), _("\ Gulag:You can starve cities without disorder, with 2 martial law units. \n\ +Your nation is completely unaffected by empire size and number of cities. \n\ No citizens are made unhappy by aggressive units. \n\ 20% Base corruption in cities \n\ No Extra corruption per each tile in distance from capital \n\ @@ -274,7 +282,7 @@ ruler_female_title = _("Dictator %s") helptext = _("\ Nationalism glorifies national supremacy over other peoples.\ - Zealous citizens and corporatations align under a dictator\ + Citizens and corporatations align under a dictator\ who rules over a unified populace, military, and isolationist economy. \n\ "), _("\ Content cities get a +1 trade bonus on Land tiles only.\ @@ -285,7 +293,7 @@ Content cities get a +1 trade bonus on Land tiles only.\ Each city gets 1 shield of free unit upkeep. The city with a Palace gets +15% production.\ Original cities have a 3x incite cost, otherwise cost one third. \n\ "), _("\ -Police Stations suppress +1 unhappy Foreign National and cost 10 shields less.\ +Police Stations cost 10 shields less.\ Five military units may impose martial law, affecting one citizen each.\ Migrants can be made to help grow cities. Tile workers gain a ⅑ move\ bonus and for every three worker turns of work put in, get a fourth\ diff --git a/freeciv/freeciv/data/mp2-dragoon/rapture worksheet.md b/freeciv/freeciv/data/mp2-dragoon/rapture worksheet.md new file mode 100644 index 000000000..bcc50fe08 --- /dev/null +++ b/freeciv/freeciv/data/mp2-dragoon/rapture worksheet.md @@ -0,0 +1,80 @@ + +WORKPAD ************************************************************************** + +Original rate, regardless of foreigners +------------- +C.Monarchy 80% +Republic 90% +Democracy 100% +Nationalism 100% +Theocracy 40%/50%(cathedral) +Communism 40% + +Original w/ Foreign +----------------- +C.Monarchy 80 80 80 80 80 80 80 80 +Republic 90 90 90 90 90 90 90 90 +Democracy 25 25 25 25 25 50 100 100 +Nationalism 50 50 50 50 50 50 50 100 +Theocracy 40 40 40 40 40 40 40 40 * (57.2% with cathedral) +Communism 40 40 40 40 40 40 40 40 + +Not original +----------------- +C.Monarchy 25 25 25 25 25 25 25 60 +Republic 33 33 33 33 33 33 33 80 +Democracy 25 25 25 25 25 50 100 100 +Nationalism 33 33 33 33 33 33 33 67 +Theocracy 40 40 40 40 40 40 40 40 * (57.2% with cathedral) +Communism 40 40 40 40 40 40 40 40 + + +FORMERLY ************************************************************************** + +Domestic rate +------------- +C.Monarchy 100% +Republic 100% +Democracy 100% +Nationalism 100% +Theocracy 40%/50%(cathedral) +Communism 40% + +Not original +------------ +C.Monarchy 25% see foreign +Republic see foreign +Democracy see foreign +Nationalism 33% see foreign +Theocracy 40% +Communism 40% + +Foreign population % +--------------------- +C.Monarchy 25 25 25 25 25 25 25 60 +Republic 100 100 100 100 100 100 100 100 +Democracy 25 25 25 25 25 50 100 100 +Nationalism 33 33 33 33 33 33 33 67 +Theocracy 40 40 40 40 40 40 40 40 * (50 with cathedral) +Communism 40 40 40 40 40 40 40 40 + +------------------------------------------------------------ +Cn.Monarchy - Non-original cities rapture at 25% + Non-original cities with no foreigners rapture at 60% + +Republic - Always raptures + + +Democracy - Cities with 30%+ foreigners rapture at 25% + Cities with 20%+ foreigners rapture at 50% + Cities under 20% foreign rapture at 100% + +Communism - Cities rapture 2 out of 5 turns + +Theocracy - Raptures 2 out of 5 turns; + building a Cathedral changes rate to 1 out of 2 turns. + +Nationalism - Foreign cities rapture 1 out of 3 turns + until no longer foreign, then at 2 out of 3 turns. + + diff --git a/freeciv/freeciv/data/mp2-dragoon/script.lua b/freeciv/freeciv/data/mp2-dragoon/script.lua index ce64d43da..ef0f81dce 100644 --- a/freeciv/freeciv/data/mp2-dragoon/script.lua +++ b/freeciv/freeciv/data/mp2-dragoon/script.lua @@ -21,10 +21,39 @@ game_turn = 0 first_horse_warning = 0 first_womens_suffrage = 0 ---Give players custom messages on certain years. Currently at 1600 AD (T85), Philosophy expires. Let them know. +--Handle events that happen on certain turns in history function history_turn_notifications(turn, year) game_turn = turn + -- Bulbs for Nomads in the first 5 turns (given at TC going to next turn) + if turn >= 2 and turn <= 6 then + for p in players_iterate() do + local has_city = 0 + + -- Each Settler type gets 1 bulb in first 5 turns + for u in p:units_iterate() do + local uname = u.utype:rule_name() + if uname == "Settlers" or uname == "Founders" then + p:give_bulbs(1) + end + end + + -- Alternative Example: giving bulbs if no city founded yet + --[[ + for c in p:cities_iterate() do + if c:has_building(find.building_type("Palace")) then + has_city = 1 + break + end + end + if has_city == 0 then + p:give_bulbs(3) + end + ]]-- + + end + end + if turn > 78 and turn < 85 then notify.all("Philosophy will no longer award a bonus tech after turn 85.") end @@ -34,7 +63,7 @@ function history_turn_notifications(turn, year) notify.all("Philosophers around the world mourn the execution of Giordano Bruno. Philosophy no longer gives a bonus advance.") philosophy_possible = 0 notify.event(nil, nil, E.BEGINNER_HELP, -_("[`events/giordano`]
🔥 Philosophers hide their books after Giordano Bruno is burned.
Philosophy no longer gives a bonus advance.")) +_("[`events/giordano`]
[`fire`] Philosophers hide their books after Giordano Bruno is burned.
Philosophy no longer gives a bonus advance.")) end return false @@ -85,21 +114,36 @@ function tech_researched_handler(tech, player, how) if game_turn < 15 then for c in player:cities_iterate() do if c:has_building(find.building_type("Palace")) and first_horse_warning > 0 then - notify.event(NIL, c.tile, E.TECH_GAIN, - _("🐎 Travellers say the %s now ride horses, near %s. (%i,%i)"), + notify.event(NIL, c.tile, E.BEGINNER_INFO, + _("[`scout`] Travellers say the %s now ride horses, near %s. (%i,%i)"), player.nation:plural_translation(), c.name, c.tile.x, c.tile.y ) - notify.all( _("🐎 A tribe has learned to ride horses near %s (%i,%i)"), c.name, c.tile.x, c.tile.y) + notify.all( _(" A tribe has learned to ride horses near %s (%i,%i)"), + c.name, c.tile.x, c.tile.y) end if c:has_building(find.building_type("Palace")) and first_horse_warning == 0 then first_horse_warning = 1 - notify.event(NIL, c.tile, E.TECH_GAIN, - _("[`events/wildbeasts`]
🐎 Travellers tell of the %s, who ride horses near %s! (%i,%i)"), + notify.event(NIL, c.tile, E.BEGINNER_INFO, + _("[`events/wildbeasts`]
[`scout`] Travellers tell of the %s, who ride horses near %s! (%i,%i)"), player.nation:plural_translation(), c.name, c.tile.x, c.tile.y ) - notify.all( _("🐎 A tribe has learned to ride wild beasts near %s (%i,%i)"), c.name, c.tile.x, c.tile.y) + notify.all( _(" A tribe has learned to ride wild beasts near %s (%i,%i)"), + c.name, c.tile.x, c.tile.y) end end end end +-------------------------------- + -- Inform of free Workers II upgrade upon discovering Democracy + if id == find.tech_type("Democracy").id then + notify.event(player, NIL, E.TECH_GAIN, + _("[`events/democracy`]
Discovery of Democracy sparks educational socioeconomic trends.
All Workers everywhere can upgrade to Workers II for free.
")) + end +-------------------------------- + -- Inform of Theocracy blueprints upon discovering Theology + if id == find.tech_type("Theology").id then + gained = player:give_tech(find.tech_type("Theocracy"), 35, false, "researched") + notify.event(player, NIL, E.TECH_GAIN, + _("[`events/theology`]
Theology shows the way to divine laws and new forms of rule.
Priests give you blueprints for Theocracy.
")) + end ------------------------- if id == find.tech_type("Philosophy").id and how == "researched" then @@ -129,37 +173,49 @@ function tech_researched_handler(tech, player, how) local forbidden_tech = find.tech_type("Banking") if researcher:knows_tech(forbidden_tech) then + notify.event(player, NIL, E.TECH_GAIN, + _("The knowledge of Banking prevents a free bonus tech from the discovery of Philosophy.")) return end forbidden_tech = find.tech_type("Medicine") if researcher:knows_tech(forbidden_tech) then + notify.event(player, NIL, E.TECH_GAIN, + _("The knowledge of Medicine prevents a free bonus tech from the discovery of Philosophy.")) return end forbidden_tech = find.tech_type("University") if researcher:knows_tech(forbidden_tech) then + notify.event(player, NIL, E.TECH_GAIN, + _("The knowledge of University prevents a free bonus tech from the discovery of Philosophy.")) return end forbidden_tech = find.tech_type("Invention") if researcher:knows_tech(forbidden_tech) then + notify.event(player, NIL, E.TECH_GAIN, + _("The knowledge of Invention prevents a free bonus tech from the discovery of Philosophy.")) return end forbidden_tech = find.tech_type("Physics") if researcher:knows_tech(forbidden_tech) then + notify.event(player, NIL, E.TECH_GAIN, + _("The knowledge of Physics prevents a free bonus tech from the discovery of Philosophy.")) return end forbidden_tech = find.tech_type("Monotheism") if researcher:knows_tech(forbidden_tech) then + notify.event(player, NIL, E.TECH_GAIN, + _("The knowledge of Monotheism prevents a free bonus tech from the discovery of Philosophy.")) return end - -- Give the player a free advance. + -- Give the player free blueprints -- This will give a free advance for each player that shares research. - gained = player:give_tech(nil, -1, false, "researched") + gained = player:give_tech(nil, 35, false, "researched") -- Notify the player. Include the tech names in a way that makes it -- look natural no matter if each tech is announced or not. @@ -217,9 +273,19 @@ end signal.connect('turn_begin', 'turn_callback') +-- Currently this is only used for calculating bounty from hunt kills: function unit_lost_callback(unit, loser, reason) - num_owners = 0 - owner = "" + local num_owners = 0 + local owner = nil + local killed_utype_name = unit.utype:rule_name() + local fur_name = "furs" + local gold = 2 + local food = 0 + local culture = 0 + + -- Heuristic to find who killed the animal. Look for owners of units on + -- adjacent tiles. If there is only one nationality for all the adjacent + -- unit(s), then we know 100% for sure who killed the animal. if reason == "killed" then nation = loser.nation:name_translation() if nation == "Animal Kingdom" then @@ -236,14 +302,85 @@ function unit_lost_callback(unit, loser, reason) end end + -- We know for certain an animal was killed and who killed it: if num_owners == 1 then - gold = 3 - culture = 1 - edit.change_gold(owner, gold) - edit.add_player_history(owner, 1) - if owner:is_human() then - notify.player(owner, - "Wild animal killed, furs and meats are worth %d gold", gold) + -- remove [] from name of animal + killed_utype_name = killed_utype_name:sub(2, #killed_utype_name - 1) + + -- Hunt reward values: + if killed_utype_name == "Wolf" then + gold = 1 + elseif killed_utype_name == "Leopard" then + gold = 3 + elseif killed_utype_name == "Tiger" then + gold = 3 + elseif killed_utype_name == "Lion" then + food = 1 + culture = 1 + elseif killed_utype_name == "Bear" then + food = 1 + gold = 3 + fur_name = "hides" + elseif killed_utype_name == "Crocodile" then + food = 2 + gold = 3 + fur_name = "skins" + elseif killed_utype_name == "Hippo" then + food = 5 + fur_name = "tusks" + elseif killed_utype_name == "Rhino" then + gold = 3 + food = 3 + fur_name = "ivory" + elseif killed_utype_name == "Polar Bear" then + gold = 4 + elseif killed_utype_name == "Giant Squid" then + food = 5 + culture = 1 + fur_name = "ink" + else + notify.player(owner,"%s false", killed_utype_name) + end + + -- If food was obtained then find nearest city that collects it: + if food > 0 then + nearest_city = nil + nc_dist_sq = 0 + for c in owner:cities_iterate() do + if nearest_city == nil then + nearest_city = c + nc_dist_sq = unit.tile:sq_distance(c.tile) + end + c_dist_sq = unit.tile:sq_distance(c.tile) + if c_dist_sq < nc_dist_sq then + nearest_city = c + nc_dist_sq = c_dist_sq + end + end + end + + -- culture award + edit.add_player_history(owner, culture) + + if gold > 0 or food > 0 then + edit.change_gold(owner, gold) + + if nearest_city then + nearest_city:give_food(food) + else + food = 0 + end + + if owner:is_human() then + if food > 0 then + notify.event(owner, unit.tile, E.UNIT_WIN_ATT, + _("%s gets %d meat from the %s hunt, and %d gold from %s!"), + nearest_city.name, food, killed_utype_name, gold, fur_name) + else + notify.event(owner, unit.tile, E.UNIT_WIN_ATT, + _("The %s hunt gives %d gold from %s!"), killed_utype_name, gold, fur_name) + end + end end end end @@ -296,5 +433,63 @@ end signal.connect("building_built", "building_built_callback") +function action_started_unit_city_callback(action, actor, city) + + -- Destroy City script (action.id==39) + if action.id == 39 then + local dplayer = actor.owner + local city_owner = city.owner + local do_partisan_message = 0 + local partisan_utype = 17 + local migrant_utype = 6 + + notify.event(NIL, city.tile, E.CITY_NUKED, + _("[`events/citydestroy`]
[`redexclamation`] The %s massacred %s—slaying all who didn't escape!"), + dplayer.nation:plural_translation(), city.name ) + + -- City annihilation spawns Partisans and refugee Migrants + local partisans = random(0, 0 + (city.size + 1) / 2) + 1 + local migrants = random(1, 0 + (city.size + 1) / 2) + 1 + if partisans > 5 then + partisans = 5 + end + if migrants > 5 then + migrants = 5 + end + if migrants + partisans > 8 then + migrants = migrants - 1 + partisans = partisans - 1 + end + + if city:inspire_partisans(city_owner) > 0 then + do_partisan_message = 1 + city.tile:place_partisans(city_owner, partisans + (partisan_utype*256), city:map_sq_radius()) + end + + if do_partisan_message == 1 then + notify.event(city_owner, city.tile, E.CITY_LOST, + _("[`partisan`][`migrants`] The sack of %s releases %d Partisans and %d refugee Migrants!"), city.name, partisans, migrants) + notify.event(dplayer, city.tile, E.UNIT_WIN_ATT, + _("[`partisan`][`migrants`] The sack of %s releases %d Partisans and %d refugee Migrants!"), city.name, partisans, migrants) + else + notify.event(city_owner, city.tile, E.CITY_LOST, + _("[`migrants`] The sack of %s releases %d refugee Migrants!"), city.name, migrants) + notify.event(dplayer, city.tile, E.UNIT_WIN_ATT, + _("[`migrants`] The sack of %s releases %d refugee Migrants!"), city.name, migrants) + end + + -- map_sq_radius: 5 + 10 = 15 (everything < 4 tiles away) + city.tile:place_partisans(city_owner, migrants + (migrant_utype*256), city:map_sq_radius()+10) + + -- Looting + local gold = random(0, city.size * 20) + city.size + notify.event(dplayer, city.tile, E.UNIT_WIN_ATT, _("[`gold`] Plundering %s yields %d gold!"), city.name, gold) + dplayer:change_gold(gold) + end + -- continue processing + return false +end + +signal.connect("action_started_unit_city", "action_started_unit_city_callback") diff --git a/freeciv/freeciv/data/mp2-dragoon/techs.ruleset b/freeciv/freeciv/data/mp2-dragoon/techs.ruleset index d6dc793a7..5aa082f52 100644 --- a/freeciv/freeciv/data/mp2-dragoon/techs.ruleset +++ b/freeciv/freeciv/data/mp2-dragoon/techs.ruleset @@ -18,9 +18,10 @@ format_version=20 ; as part of some sentences, so try to make it descriptive ; and sensible. ; helptxt = displayed in the help for advances with this flag (optional) -;flags = -; { "name", "helptxt" -; } +flags = + { "name", "helptxt" + "Specialization", "A sub-technology providing specialzed sophisticated access" + } ; /* <-- avoid gettext warnings ; @@ -88,7 +89,7 @@ format_version=20 ; graphic_alt = alternate icon ; helptext = optional help text string (set units ruleset for examples) ; bonus_message = text seen when a player is the first to discover -; an bonus tech. Must contain '%s' to mark place of the tech +; a bonus tech. Must contain '%s' to mark place of the tech ; gained. ; cost = if tech_cost_style is set to "Classic+" or "Experimental+", ; this field is read for information on how much a tech @@ -129,7 +130,7 @@ req2 = "None" flags = "" graphic = "a.alphabet" graphic_alt = "-" -cost = 24 +cost = 22 helptext = _("Obsoletes Boat.") [advance_amphibious_warfare] @@ -148,7 +149,7 @@ req2 = "Mathematics" flags = "" graphic = "a.astronomy" graphic_alt = "-" -cost = 146 +cost = 150 [advance_atomic_theory] name = _("Atomic Theory") @@ -165,13 +166,13 @@ req1 = "Combustion" req2 = "Steel" graphic = "a.automobile" graphic_alt = "-" -helptext = _("Obsoletes Leonardos Workshop, Colossus. +25% population pollution.") +helptext = _("Obsoletes Caravan, Wagon, Colossus.") cost = 4230 [advance_avionics] name = _("Avionics") -req1 = "Computers" -req2 = "Rocketry" +req1 = "Rocketry" +req2 = "None" flags = "" graphic = "a.avionics" graphic_alt = "-" @@ -186,7 +187,7 @@ flags = "" graphic = "a.banking" graphic_alt = "-" helptext = _("Infantry upkeep: 1 gold. Blocks Philosophy bonus. Globally expires capital trade route bonus.") -cost = 364 +cost = 475 [advance_bridge_building] name = _("Bridge Building") @@ -196,6 +197,7 @@ flags = "Bridge" graphic = "a.bridge_building" graphic_alt = "-" helptext = _("Allows roads on rivers.") +cost = 225 [advance_bronze_working] name = _("Bronze Working") @@ -204,7 +206,7 @@ req2 = "None" flags = "" graphic = "a.bronze_working" graphic_alt = "-" -cost = 24 +cost = 20 [advance_ceremonial_burial] name = _("Ceremonial Burial") @@ -213,7 +215,7 @@ req2 = "None" flags = "" graphic = "a.ceremonial_burial" graphic_alt = "-" -cost = 24 +cost = 22 [advance_chemistry] name = _("Chemistry") @@ -222,7 +224,7 @@ req2 = "Medicine" flags = "" graphic = "a.chemistry" graphic_alt = "-" -cost = 800 +cost = 900 [advance_chivalry] name = _("Chivalry") @@ -232,7 +234,7 @@ flags = "" graphic = "a.chivalry" graphic_alt = "-" helptext = _("Obsoletes Horsemen, Chariots.") -cost = 226 +cost = 225 [advance_code_of_laws] name = _("Code of Laws") @@ -241,10 +243,11 @@ req2 = "None" flags = "" graphic = "a.code_of_laws" graphic_alt = "-" +cost = 50 [advance_combined_arms] name = _("Combined Arms") -req1 = "Mobile Warfare" +req1 = "Computers" req2 = "Advanced Flight" flags = "" graphic = "a.combined_arms" @@ -258,7 +261,7 @@ req2 = "Explosives" flags = "" graphic = "a.combustion" graphic_alt = "-" -helptext = _("Obsoletes Balloon. +1 move for Trains.") +helptext = _("Obsoletes Balloon. +1 move for Trains. +25% population pollution.") cost = 3810 [advance_communism] @@ -269,16 +272,17 @@ flags = "" graphic = "a.communism" graphic_alt = "-" helptext = _("Allows government Communism.") +cost = 1650 [advance_computers] name = _("Computers") -req1 = "Mass Production" -req2 = "Miniaturization" +req1 = "Mechanization" +req2 = "Radio" flags = "" graphic = "a.computers" graphic_alt = "-" helptext = _("Obsoletes Temple of Artemis.") -cost = 5650 +cost = 15650 [advance_conscription] name = _("Conscription") @@ -298,6 +302,7 @@ flags = "" graphic = "a.construction" graphic_alt = "-" helptext = _("Allows Fortresses, Oil Wells.") +cost = 110 [advance_currency] name = _("Currency") @@ -306,6 +311,7 @@ req2 = "None" flags = "" graphic = "a.currency" graphic_alt = "-" +cost = 50 [advance_democracy] name = _("Democracy") @@ -315,7 +321,7 @@ flags = "" graphic = "a.democracy" graphic_alt = "-" helptext = _("Obsoletes Code of Hammurabi. Allows government Democracy.") -cost = 875 +cost = 950 [advance_economics] name = _("Economics") @@ -353,6 +359,7 @@ flags = "" graphic = "a.engineering" graphic_alt = "-" helptext = _("Allows Canals and Naval Bases.") +cost = 225 [advance_environmentalism] name = _("Environmentalism") @@ -371,7 +378,7 @@ req2 = "Democracy" flags = "" graphic = "a.espionage" graphic_alt = "-" -helptext = _("Obsoletes Diplomat.") +helptext = _("Lets Diplomat/Patriarch do hostile embassy vs Courthouse & Homeland Security.") cost = 2900 [advance_explosives] @@ -386,12 +393,12 @@ cost = 1560 [advance_feudalism] name = _("Feudalism") -req1 = "Warrior Code" +req1 = "Iron Working" req2 = "Monarchy" flags = "" graphic = "a.feudalism" graphic_alt = "-" -cost = 146 +cost = 150 helptext = _("Allows Castles (with Construction).") @@ -405,16 +412,6 @@ graphic_alt = "-" helptext = _("Traderoutes give less first time revenue.") cost = 4680 -[advance_theocracy] -name = _("Theocracy") -req1 = "Theology" -req2 = "None" -flags = "" -graphic = "a.theocracy" -graphic_alt = "-" -helptext = _("Obsoletes Pax Dei. Allows government Theocracy.") -cost = 725 - [advance_fusion_power] name = _("Fusion Power") req1 = "Superconductors" @@ -425,15 +422,6 @@ graphic_alt = "-" helptext = _("Obsoletes Medici Bank.") cost = 8040 -[advance_microbiology] -name = _("Microbiology") -req1 = "Medicine" -req2 = "The Corporation" -flags = "" -graphic = "a.microbiology" -graphic_alt = "-" -cost = 3150 - [advance_guerilla_warfare] name = _("Guerilla Warfare") req1 = "Communism" @@ -447,11 +435,11 @@ cost = 3985 [advance_gunpowder] name = _("Gunpowder") req1 = "Invention" -req2 = "Iron Working" +req2 = "Feudalism" flags = "" graphic = "a.gunpowder" graphic_alt = "-" -cost = 800 +cost = 950 helptext = _("Obsoletes Castle, Agōgē of Sparta, Barracks, earlier foot soldiers.") [advance_horseback_riding] @@ -481,6 +469,7 @@ flags = "" graphic = "a.invention" graphic_alt = "-" helptext = _("Extra vision in Fortress, Naval Base, Castle. Blocks Philosophy bonus.") +cost = 490 [advance_iron_working] name = _("Iron Working") @@ -489,25 +478,17 @@ req2 = "Warrior Code" flags = "" graphic = "a.iron_working" graphic_alt = "-" - -[advance_labor_union] -name = _("Labor Union") -req1 = "Mass Production" -req2 = "Guerilla Warfare" -flags = "" -graphic = "a.labor_union" -graphic_alt = "-" -cost = 5430 -helptext = _("Musketeers can convert to Riflemen.") +cost = 65 [advance_laser] name = _("Laser") req1 = "Nuclear Power" -req2 = "None" +req2 = "Computers" flags = "" graphic = "a.laser" graphic_alt = "-" cost = 5790 +helptext = _("Gives nuke resistance to AEGIS and Mobile SAM.") [advance_leadership] name = _("Leadership") @@ -526,6 +507,7 @@ req2 = "Code of Laws" flags = "" graphic = "a.literacy" graphic_alt = "-" +cost = 110 [advance_machine_tools] name = _("Machine Tools") @@ -557,7 +539,7 @@ flags = "" graphic = "a.map_making" graphic_alt = "-" helptext = _("Scouts can move +2 tiles per turn") -cost = 51 +cost = 50 [advance_masonry] name = _("Masonry") @@ -567,7 +549,7 @@ flags = "" graphic = "a.masonry" graphic_alt = "-" helptext = _("Allows Forts.") -cost = 24 +cost = 20 [advance_mass_production] name = _("Mass Production") @@ -575,7 +557,7 @@ req1 = "Automobile" req2 = "The Corporation" graphic = "a.mass_production" graphic_alt = "-" -helptext = _("Obsoletes Goods. +25% population pollution.") +helptext = _("+25% population pollution. Increases output from Power Plants.") cost = 4680 [advance_mathematics] @@ -585,6 +567,17 @@ req2 = "Masonry" flags = "" graphic = "a.mathematics" graphic_alt = "-" +cost = 80 + +[advance_mechanization] +name = _("Mechanization") +req1 = "Mass Production" +req2 = "Machine Tools" +flags = "" +graphic = "a.mechanization" +graphic_alt = "-" +cost = 5430 +helptext = _("Musketeers can convert to Riflemen.") [advance_medicine] name = _("Medicine") @@ -593,7 +586,7 @@ req2 = "Trade" flags = "" graphic = "a.medicine" graphic_alt = "-" -cost = 468 +cost = 475 [advance_metallurgy] name = _("Metallurgy") @@ -605,6 +598,15 @@ graphic_alt = "-" helptext = _("Obsoletes Catapult, all Siege Rams. City Walls cost +10.") cost = 1340 +[advance_microbiology] +name = _("Microbiology") +req1 = "Medicine" +req2 = "The Corporation" +flags = "" +graphic = "a.microbiology" +graphic_alt = "-" +cost = 3150 + [advance_miniaturization] name = _("Miniaturization") req1 = "Machine Tools" @@ -633,6 +635,7 @@ flags = "" graphic = "a.monarchy" graphic_alt = "-" helptext = _("Obsoletes Chand Baori, Ziggurat. Allows government Monarchy.") +cost = 110 [advance_monotheism] name = _("Monotheism") @@ -642,7 +645,7 @@ flags = "" graphic = "a.monotheism" helptext = _("Obsoletes Elephants.") graphic_alt = "-" -cost = 384 +cost = 300 [advance_mysticism] name = _("Mysticism") @@ -652,6 +655,17 @@ flags = "" graphic = "a.mysticism" graphic_alt = "-" helptext = _("Doubles the effect of Temples.") +cost = 50 + +[advance_nationalism] +name = _("Nationalism") +req1 = "The Corporation" +req2 = "Communism" +flags = "" +graphic = "a.nationalism" +graphic_alt = "-" +helptext = _("Allows government Nationalism.") +cost = 2775 [advance_navigation] name = _("Navigation") @@ -661,7 +675,7 @@ flags = "" graphic = "a.navigation" graphic_alt = "-" helptext = _("Obsoletes Galley, Longboat, War Galley, Ram Ship.") -cost = 486 +cost = 500 [advance_nuclear_fission] name = _("Nuclear Fission") @@ -679,7 +693,7 @@ req2 = "Electronics" flags = "" graphic = "a.nuclear_power" graphic_alt = "-" -helptext = _("+2 moves for Sea units.") +helptext = _("+2 moves for modern Sea units.") cost = 5650 [advance_philosophy] @@ -690,7 +704,7 @@ flags = "" graphic = "a.philosophy" graphic_alt = "-" helptext = _("Obsoletes Sphinx. Bonus tech before 1600AD if no next tier techs are possessed.") -cost = 276 +cost = 325 [advance_physics] name = _("Physics") @@ -700,6 +714,7 @@ flags = "" graphic = "a.physics" graphic_alt = "-" helptext = _("Increases unit vision. Prevents Philosophy bonus.") +cost = 580 [advance_plastics] name = _("Plastics") @@ -717,6 +732,7 @@ req2 = "Ceremonial Burial" flags = "" graphic = "a.polytheism" graphic_alt = "-" +cost = 80 [advance_pottery] name = _("Pottery") @@ -726,11 +742,11 @@ flags = "" graphic = "a.pottery" graphic_alt = "-" helptext = _("Allows Quays.") -cost = 24 +cost = 22 [advance_radar] name = _("Radar") -req1 = "Electronics" +req1 = "Mechanization" req2 = "Advanced Flight" flags = "" graphic = "a.radar" @@ -741,7 +757,7 @@ cost = 6630 [advance_radio] name = _("Radio") req1 = "Flight" -req2 = "None" +req2 = "Miniaturization" flags = "" graphic = "a.radio" graphic_alt = "-" @@ -786,7 +802,7 @@ req2 = "Electricity" flags = "" graphic = "a.refrigeration" graphic_alt = "-" -helptext = _("Allows Farmland.") +helptext = _("Allows Farmland and Fishtraps.") cost = 2775 [advance_robotics] @@ -796,17 +812,17 @@ req2 = "Computers" flags = "" graphic = "a.robotics" graphic_alt = "-" -helptext = _("Obsoletes Artillery, King Richards Crusade.") +helptext = _("Obsoletes Artillery, King Richard’s Crusade. Reduces Leonardo’s Workshop to 1.") cost = 7250 [advance_rocketry] name = _("Rocketry") req1 = "Radar" -req2 = "Miniaturization" +req2 = "Computers" flags = "" graphic = "a.rocketry" graphic_alt = "-" -helptext = _("Obsoletes Destroyer, Cruiser.") +helptext = _("Obsoletes Destroyer, Cruiser. Reduces Leonardo’s Workshop to 1.") cost = 7040 [advance_sanitation] @@ -826,11 +842,12 @@ flags = "" graphic = "a.seafaring" helptext = _("Obsoletes Trireme.") graphic_alt = "-" +cost = 110 [advance_space_flight] name = _("Space Flight") -req1 = "Computers" -req2 = "Rocketry" +req1 = "Rocketry" +req2 = "Nuclear Power" flags = "" graphic = "a.space_flight" graphic_alt = "-" @@ -895,7 +912,7 @@ req2 = "Industrialization" flags = "" graphic = "a.the_corporation" graphic_alt = "-" -helptext = _("Obsoletes Caravan, Wagon. +25% Coinage for Stock Exchange") +helptext = _("Obsoletes Goods. +25% Coinage for Stock Exchange") cost = 2900 [advance_the_republic] @@ -906,6 +923,7 @@ flags = "" graphic = "a.the_republic" graphic_alt = "-" helptext = _("Allows government Republic.") +cost = 150 [advance_the_wheel] name = _("The Wheel") @@ -914,6 +932,17 @@ req2 = "None" flags = "" graphic = "a.the_wheel" graphic_alt = "-" +cost = 50 + +[advance_theocracy] +name = _("Theocracy") +req1 = "Theology" +req2 = "None" +flags = "" +graphic = "a.theocracy" +graphic_alt = "-" +helptext = _("Obsoletes Pax Dei. Allows government Theocracy.") +cost = 500 [advance_theology] name = _("Theology") @@ -922,8 +951,8 @@ req2 = "Monotheism" flags = "" graphic = "a.theology" graphic_alt = "-" -helptext = _("Obsoletes Oracle. +1 Effect on Cathedral, Michelangelos Chapel.") -cost = 600 +helptext = _("Obsoletes Oracle. +1 Effect for Cathedral/Michelangelo. Gives Theocracy blueprints.") +cost = 400 [advance_theory_of_gravity] name = _("Theory of Gravity") @@ -932,7 +961,7 @@ req2 = "University" flags = "" graphic = "a.theory_of_gravity" graphic_alt = "-" -cost = 585 +cost = 600 [advance_trade] name = _("Trade") @@ -941,6 +970,7 @@ req2 = "Code of Laws" flags = "" graphic = "a.trade" graphic_alt = "-" +cost = 150 [advance_university] name = _("University") @@ -949,7 +979,7 @@ req2 = "Philosophy" flags = "" graphic = "a.university" graphic_alt = "-" -cost = 415 +cost = 450 [advance_warrior_code] name = _("Warrior Code") @@ -958,8 +988,8 @@ req2 = "None" flags = "" graphic = "a.warrior_code" graphic_alt = "-" -cost = 24 -helptext = _("Foot soldiers may make Hideouts, if enabled.") +cost = 22 +helptext = _("Foot soldiers may make Hideouts.") [advance_writing] name = _("Writing") @@ -968,16 +998,7 @@ req2 = "None" flags = "" graphic = "a.writing" graphic_alt = "-" - -[advance_nationalism] -name = _("Nationalism") -req1 = "The Corporation" -req2 = "Communism" -flags = "" -graphic = "a.nationalism" -graphic_alt = "-" -helptext = _("Allows government Nationalism.") -cost = 2775 +cost = 50 ;[advance_agricultural] ;name = _("Agricultural") @@ -987,18 +1008,25 @@ cost = 2775 ;graphic = "a.horseback_riding" ;graphic_alt = "-" +;==========================================CHILD TECHS=================================================== +;This is the exemplar for how to do a specialty add-on tech, it's basically just a dead-end tech +;usually for cheaper than its parent req, that allows "specializing into" the parent tech more, +;and so, the "Specialization" flag is used by FCW help it display it as a minor add-on attached +;to the parent, whereas other clients would just show it separately. +[advance_flight2] +name = _("Flight.2") +req1 = "Flight" +req2 = "None" +flags = "Specialization" +graphic = "a.flight" ;this pic won't be shown in the tech tree but will show in other places +graphic_alt = "-" +cost = 750 -; A placeholder tech used to ensure that when -; a game is reloaded, a player can`t rebuild -; the "Darwin's Voyage" small wonder and get -; two free advances again. -; THIS RULESET DOES NOT USE OLD DARWIN'S VOYAGE BEHAVIOUR OR THEORY OF EVOLUTION. -[advance_theory_of_evolution] -name = _("Theory of Evolution") -req1 = "None" +[advance_radio2] +name = _("Radio.2") +req1 = "Radio" req2 = "None" -root_req = "Theory of Evolution" -flags = "" -graphic = "b.darwins_voyage" +flags = "Specialization" +graphic = "a.Combustion" ;this pic won't be shown in the tech tree but will show in other places graphic_alt = "-" -helptext = _("This technology is not researchable and has no effect.") +cost = 820 diff --git a/freeciv/freeciv/data/mp2-dragoon/terrain.ruleset b/freeciv/freeciv/data/mp2-dragoon/terrain.ruleset index cf6b0e2fe..0966cf746 100644 --- a/freeciv/freeciv/data/mp2-dragoon/terrain.ruleset +++ b/freeciv/freeciv/data/mp2-dragoon/terrain.ruleset @@ -26,6 +26,7 @@ flags = _("Oil"), _("Has Oil Well instead of Mine.") _("NoPollution"), _("No Pollution nor Fallout appear here.") _("Low Land"), _("Terrain suitable for canal digging.") + _("Flat Land"), _("Solid flat land with no woods or marsh.") } ; Names for custom extra flags. There can be up to 8 of these. @@ -390,7 +391,7 @@ warmer_drier_result = "Desert" cooler_wetter_result = "Tundra" cooler_drier_result = "Grassland" native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Zeppelin", "Missile", "Helicopter", "AirProtect", "Air_High_Altitude", "Bomb", "Space" -flags = "Starter", "CanHaveRiver", "Low Land" +flags = "Starter", "CanHaveRiver", "Low Land", "Flat Land" property_green = 38 property_temperate = 38 property_frozen = 90 @@ -435,7 +436,7 @@ warmer_drier_result = "Swamp" cooler_wetter_result = "Tundra" cooler_drier_result = "Tundra" native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Zeppelin", "Missile", "Helicopter", "AirProtect", "Air_High_Altitude", "Bomb", "Space" -flags = "Starter", "CanHaveRiver", "Low Land" +flags = "Starter", "CanHaveRiver", "Low Land", "Flat Land" property_green = 69 property_temperate = 69 property_cold = 20 @@ -577,7 +578,7 @@ warmer_drier_result = "no" cooler_wetter_result = "Plains" cooler_drier_result = "Plains" native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Zeppelin", "Missile", "Helicopter", "AirProtect", "Air_High_Altitude", "Bomb", "Space" -flags = "CanHaveRiver", "Oil", "Low Land" +flags = "CanHaveRiver", "Oil", "Low Land", "Flat Land" property_dry = 69 property_tropical = 35 property_temperate = 3 @@ -765,7 +766,7 @@ warmer_drier_result = "Plains" cooler_wetter_result = "Glacier" cooler_drier_result = "Glacier" native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Zeppelin", "Missile", "Helicopter", "AirProtect", "Air_High_Altitude", "Bomb", "Space" -flags = "Starter", "NoBarbs", "CanHaveRiver", "Low Land" +flags = "Starter", "NoBarbs", "CanHaveRiver", "Low Land", "Flat Land" property_cold = 17 property_frozen = 7 color.r = 206 @@ -808,7 +809,7 @@ warmer_drier_result = "Tundra" cooler_wetter_result = "no" cooler_drier_result = "no" native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Zeppelin", "Missile", "Helicopter", "AirProtect", "Air_High_Altitude", "Bomb", "Space" -flags = "NoBarbs", "NoCities", "CanHaveRiver", "Oil", "Frozen" +flags = "NoBarbs", "NoCities", "CanHaveRiver", "Oil", "Frozen", "Flat Land" property_frozen = 30 property_cold = 2 color.r = 238 @@ -1186,6 +1187,8 @@ ui_name_base_other = _("?gui_type:Make Tile Claim/Hideout") ; by the 1 + sum of bonuses from the extras on the ; "Natural" layer. ; - "NoStackDeath" = Units inside do not die all at once when attacked +; - "Reports" = Extra reports enemy movements within 3 tiles, similar to +; a unit on sentry. ; helptext = optional help text string; should escape all raw ; newlines so that xgettext parsing works ; @@ -1203,6 +1206,11 @@ act_gfx_alt = "unit.irrigate" act_gfx_alt2 = "-" rmact_gfx = "None" rmact_gfx_alt = "-" +reqs = + { "type", "name", "range", "present", "quiet" + "TerrainClass", "Land", "Local", TRUE, FALSE + "UnitType", "Trawler", "Local", FALSE, TRUE + } build_time = 0 removal_time = 0 conflicts = "Mine", "Oil Well" @@ -1223,6 +1231,43 @@ irrigating elsewhere, but will not give the tile any further bonus \ except in the case of a desert river (see above.)\ ") +[extra_fishtrap] +name = _("Fishtrap") +category = "Infra" +causes = "Base" +rmcauses = "Pillage" +graphic = "ts.fishtrap" +graphic_alt = "-" +act_gfx_alt = "unit.fishing" +act_gfx_alt2 = "unit.irrigation" +rmact_gfx = "None" +rmact_gfx_alt = "-" +reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMil", "Local", TRUE + "TerrainClass","Oceanic", "Local", TRUE + "Extra", "Buoy", "Local", FALSE + "Extra", "Fish", "Local", FALSE + "Extra", "Whales", "Local", FALSE +;------------------- + "Extra", "Fishtrap", "CAdjacent", FALSE + "Extra", "Fish", "Adjacent", TRUE +;------------------- + "UnitFlag", "Settlers", "Local", TRUE + "Tech", "Refrigeration", "Player", TRUE + } +build_time = 1 +removal_time = 0 +conflicts = "Fish", "Whales", "Buoy" +helptext = _("\ +Fishtraps become available with Refrigeration technology. Any Worker-type\ + transported at sea can make one. A Fishtrap provides +2 food to its tile.\ + Any Fish adjacent to the tile will also be raised to +6 food output and\ + gain +1 trade. Fishtraps must be made adjacent to Fish, but cannot be made\ + cardinally adjacent to each other. Nor can they be built directly on a tile + with Fish, Whales, or a Buoy.\ +") + [extra_mine] name = _("Mine") category = "Infra" @@ -1236,8 +1281,9 @@ act_gfx_alt2 = "-" rmact_gfx = "None" rmact_gfx_alt = "-" reqs = - { "type", "name", "range", "present", "quiet" - "TerrainFlag", "Oil", "Local", FALSE, TRUE + { "type", "name", "range", "present", "quiet" + "TerrainFlag", "Oil", "Local", FALSE, TRUE + "UnitType", "Trawler", "Local", FALSE, TRUE } build_time = 0 removal_time = 0 @@ -1264,8 +1310,9 @@ act_gfx_alt2 = "unit.plant" rmact_gfx = "None" rmact_gfx_alt = "-" reqs = - { "type", "name", "range", "quiet" - "TerrainFlag", "Oil", "Local", TRUE + { "type", "name", "range", "present", "quiet" + "TerrainFlag", "Oil", "Local", TRUE, FALSE + "UnitType", "Trawler", "Local", FALSE, TRUE } build_time = 0 removal_time = 0 @@ -1291,8 +1338,8 @@ act_gfx_alt2 = "-" rmact_gfx = "unit.pollution" rmact_gfx_alt = "-" reqs = - { "type", "name", "range", "present", "quiet" - "TerrainFlag", "NoPollution", "Local", FALSE, TRUE + { "type", "name", "range", "present", "quiet" + "TerrainFlag", "NoPollution", "Local", FALSE, TRUE } removal_time = 0 flags = "GlobalWarming" @@ -1379,9 +1426,11 @@ act_gfx_alt2 = "unit.irrigate" rmact_gfx = "None" rmact_gfx_alt = "-" reqs = - { "type", "name", "range" - "Tech", "Refrigeration", "Player" - "Extra", "Irrigation", "Local" + { "type", "name", "range", "present", "quiet" + "Tech", "Refrigeration", "Player", TRUE, FALSE + "Extra", "Irrigation", "Local", TRUE, FALSE + "TerrainClass", "Land", "Local", TRUE, FALSE + "UnitType", "Trawler", "Local", FALSE, TRUE } build_time = 0 removal_time = 0 @@ -1476,15 +1525,15 @@ build_time = 3 removal_time = 0 unit_seen = "Hidden" native_to = "Land", "LandAirSea", "LandNoKill", "Helicopter" -flags = "NativeTile" +flags = "NativeTile", "NoStackDeath" helptext = _("\ Since the dawn of time, camouflaged and concealed terrain has been\ enhanced to make Hideouts. Usually the intent is to evade an\ aggressor or to set an ambush. Hideouts can only be put in Forests,\ Swamps, Mountains, and Jungle. Warrior Code must be known. Tile must\ - be Friendly or Unclaimed. Only a Foot soldier alone on a tile can make a Hideout.\ - Only Land units and Helicopters can hide in them. Other types will be seen.\ - Invisibility is the only bonus of a Hideout. Hideouts can’t stack with\ + be Friendly or Unclaimed. Only a Foot soldier alone on a tile can make a Hideout. Only\ + Land units and Helicopters can hide in them. Other types will be seen. Invisibility\ + and prevention of stack-death are the two bonuses of a Hideout. Hideouts can’t stack with\ other bases. Hideouts are invisible to anyone not occupying the tile with\ a Land unit. For each turn it is unoccupied, a Hideout has a 15% chance\ of being lost to the elements of nature. The only way to know if there is\ @@ -1494,11 +1543,64 @@ TIP: Hideouts are good for guarding a border or setting a trap for\ intruders. Be careful! An abandoned Hideout can be used against you!\ ") +[extra_deep_dive_hideout] +rule_name = "Depth" +name = _("​") ; has a zero-width space in it to make it invisible but different EXTRA_ assignment in js client +category = "Infra" +causes = "Base" +rmcauses = "Disappear" +graphic = "None" +graphic_alt = "None" +activity_gfx = "unit.deepdive" +act_gfx_alt = "unit.hideout" +act_gfx_alt2 = "-" +rmact_gfx = "None" +rmact_gfx_alt = "-" +reqs = + { "type", "name", "range", "present", "quiet" + "UnitType", "Missile Submarine", "Local", TRUE, FALSE + "Terrain", "Deep Ocean", "Local", TRUE, FALSE + "Extra", "Buoy", "Local", FALSE, FALSE + "Extra", "Fishtrap", "Local", FALSE, FALSE + } +disappearance_reqs = + { "type", "name", "range", "present" + "MaxUnitsOnTile", "0", "Local", TRUE + ;TODO, when disappear reqs can check for a unit on the tile: + ;"UnitClass", "Submarine", "Tile", FALSE + } +disappearance_chance = 10000 ; 10000/10000 = 100% will disappear if unoccupied +build_time = 0 +removal_time = 0 +unit_seen = "Hidden" +native_to = "Submarine" +flags = "NativeTile" +helptext = _("\ +Modern submarines capable of greater depth can go near the bottom\ + of the ocean floor, where they are all but undetectable as long as\ + they turn their engines off and do not move. In Freeciv this is\ + represented by “Building Depth”, creating a virtual extra on\ + the tile which makes all units on the tile hidden, even to\ + adjacent units. Missile Submarines at depth may still be attacked,\ + but can only be discovered by a unit going directly to their tile.\ + Only one Missile Submarine on the tile is required to “Build Depth”,\ + and any other submarines coming to the tile are assumed to join it\ + at depth.\ + Depth can only be achieved in Deep Ocean by Missile Submarines.\ + The tile cannot have a Buoy or Fishtrap. The depth associated to\ + Submarines on a tile will remain as long they remain on the tile\ + at each turn change. That is: a Submarine may leave on scouting\ + and return to the tile, where it will automatically achieve\ + invisible depth upon arrival. The only way to know if there are\ + Submarines hiding at depth is to move a unit onto the tile. \n\ +") + + [extra_tileclaim] name = _("Tile Claim") category = "Infra" causes = "Base" -rmcauses = "Pillage" +rmcauses = "Pillage", "Disappear" graphic = "base.tileclaim" graphic_alt = "-" activity_gfx = "unit.tileclaim" @@ -1506,6 +1608,12 @@ act_gfx_alt = "-" act_gfx_alt2 = "-" rmact_gfx = "None" rmact_gfx_alt = "-" +disappearance_chance = 5000 +disappearance_reqs = + { "type", "name", "range", "present" + "MaxUnitsOnTile", "0", "Local", TRUE + "ExtraFlag", "NoStackDeath", "Local", FALSE ; will not disappear if there's a base or ruins there. + } reqs = { "type", "name", "range","present", "quiet" ; Hard contradiction between Tile Claim and Hideout is necessary so that @@ -1551,12 +1659,13 @@ act_gfx_alt2 = "-" rmact_gfx = "None" rmact_gfx_alt = "-" reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Masonry", "Player", TRUE, FALSE - "TerrainClass", "Land", "Local", TRUE, FALSE - "UnitFlag", "CanFortress", "Local", TRUE, FALSE - "CityTile", "Center", "Local", FALSE, TRUE - "Extra", "Hideout", "Local", FALSE, FALSE + { "type", "name", "range", "present", "quiet" + "Tech", "Masonry", "Player", TRUE, FALSE + "TerrainClass", "Land", "Local", TRUE, FALSE + "UnitFlag", "CanFortress", "Local", TRUE, FALSE + "UnitType", "Trawler", "Local", FALSE, TRUE + "CityTile", "Center", "Local", FALSE, TRUE + "Extra", "Hideout", "Local", FALSE, FALSE } build_time = 3 removal_time = 0 @@ -1598,6 +1707,8 @@ reqs = "Tech", "Construction", "Player", TRUE, FALSE "TerrainClass", "Land", "Local", TRUE, FALSE "UnitFlag", "CanFortress", "Local", TRUE, FALSE + "UnitType", "Marines", "Local", FALSE, TRUE ; Marines can do Forts only + "UnitType", "Trawler", "Local", FALSE, TRUE ; Fishtraps only "CityTile", "Center", "Local", FALSE, TRUE } build_time = 5 @@ -1631,15 +1742,17 @@ act_gfx_alt2 = "-" rmact_gfx = "None" rmact_gfx_alt = "-" reqs = - { "type", "name", "range", "present", "quiet" - "Extra", "Fort", "Local", TRUE, FALSE - "Extra", "Fortress", "Local", FALSE, TRUE - "Extra", "Hideout", "Local", FALSE, FALSE - "Tech", "Engineering", "Player", TRUE, FALSE - "TerrainFlag", "Low Land", "Local", TRUE, FALSE - "TerrainClass", "Oceanic", "CAdjacent", TRUE, FALSE - "UnitFlag", "CanFortress", "Local", TRUE, FALSE - "CityTile", "Center", "Local", FALSE, TRUE + { "type", "name", "range", "present", "quiet" + "Extra", "Fort", "Local", TRUE, FALSE + "Extra", "Fortress", "Local", FALSE, TRUE + "Extra", "Hideout", "Local", FALSE, FALSE + "Tech", "Engineering", "Player", TRUE, FALSE + "TerrainFlag", "Low Land", "Local", TRUE, FALSE + "TerrainClass", "Oceanic", "CAdjacent", TRUE, FALSE + "UnitFlag", "CanFortress", "Local", TRUE, FALSE + "UnitType", "Marines", "Local", FALSE, TRUE ; Marines can do Forts only + "UnitType", "Trawler", "Local", FALSE, TRUE ; Fishtraps only + "CityTile", "Center", "Local", FALSE, TRUE } build_time = 8 removal_time = 0 @@ -1680,7 +1793,7 @@ reqs = "CityTile", "Center", "Local", FALSE, TRUE ; "Extra", "River", "Local", FALSE, FALSE } -build_time = 21 +build_time = 11 removal_time = 0 unit_seen = "Hidden" native_to = "Land", "LandAirSea", "LandNoKill", "LandRoad", "Cargo", "Helicopter", "Balloon", "Zeppelin" @@ -1717,6 +1830,8 @@ reqs = "TerrainClass", "Land", "Local", TRUE, FALSE "UnitFlag", "CanFortress", "Local", TRUE, FALSE "CityTile", "Center", "Local", FALSE, TRUE + "UnitType", "Marines", "Local", FALSE, TRUE ; Marines can do Forts only + "UnitType", "Trawler", "Local", FALSE, TRUE ; Fishtraps only ; "Extra", "River", "Local", FALSE, FALSE } build_time = 36 @@ -1749,11 +1864,12 @@ reqs = "Extra", "Hideout", "Local", FALSE, FALSE "TerrainClass", "Land", "Local", TRUE, FALSE "UnitFlag", "Airbase", "Local", TRUE, FALSE + "UnitType", "Trawler", "Local", FALSE, TRUE ; Fishtraps only "CityTile", "Center", "Local", FALSE, TRUE } build_time = 3 removal_time = 0 -native_to = "Air", "Balloon", "Zeppelin", "Helicopter", "Missile", "Bomb", "AirProtect", "Air_High_Altitude" +native_to = "Air", "Balloon", "Zeppelin", "Helicopter", "Missile", "Bomb", "AirProtect", "Air_High_Altitude", "Cargo", "Bomb2" conflicts = "Castle", "Bunker" flags = "Refuel", "NoStackDeath" helptext = _("\ @@ -1782,13 +1898,14 @@ reqs = "Extra", "Airbase", "Local", TRUE, FALSE "TerrainClass", "Land", "Local", TRUE, FALSE "UnitFlag", "Airbase", "Local", TRUE, FALSE - "UnitType", "Marines", "Local", FALSE, TRUE + "UnitType", "Marines", "Local", FALSE, TRUE ; Fort and Airbase only + "UnitType", "Trawler", "Local", FALSE, TRUE ; Fishtraps only "CityTile", "Center", "Local", FALSE, TRUE } build_time = 5 removal_time = 0 native_to = "Air", "Balloon", "Zeppelin", "Helicopter", "Missile", "Bomb", "AirProtect", "Air_High_Altitude" -flags = "Refuel", "NoStackDeath" +flags = "Refuel" helptext = _("\ With the available tech, Radar can be added to an Airbase, which significantly increases its vision.\ ") @@ -1810,14 +1927,16 @@ reqs = "Tech", "Radio", "Player", TRUE, FALSE "TerrainClass", "Oceanic", "Local", TRUE, FALSE "UnitFlag", "Airbase", "Local", TRUE, FALSE + "UnitFlag", "NonMil", "Local", TRUE, FALSE ;Missile Submarine can't do buoys "CityTile", "Center", "Local", FALSE, TRUE } build_time = 3 removal_time = 0 -flags = "ShowFlag" +flags = "ShowFlag", "Reports" ; buoy is like a sentry unit for reporting movement helptext = _("\ -Buoys may be built in the ocean (by units on a sea-going vessel) to \ -allow their owner to see the surrounding tiles.\ +Buoys may be built in the ocean and allow their owner to see surrounding tiles.\ + They report nearby visible activity like a sentry, and are even able to see\ + enemy submarines, if cardinally adjacent.\ ") [extra_ruins] @@ -1839,9 +1958,11 @@ reqs = } buildable = FALSE removal_time = 0 -flags = "TerrChangeRemoves" +native_to = "Land", "LandNoKill", "LandAirSea" +flags = "TerrChangeRemoves", "NoStackDeath" helptext = _("\ -Ruins mark the former site of a city that was destroyed or abandoned.\ +Ruins mark the former site of a city that was destroyed or abandoned. Land units in Ruins\ + do not experience Stack-Kill. Also, Hideouts made in Ruins will never disappear.\ ") [extra_quay] @@ -2003,12 +2124,10 @@ act_gfx_alt2 = "-" rmact_gfx = "None" rmact_gfx_alt = "-" reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Superconductors", "Player", TRUE, FALSE -; "Extra", "Railroad", "Local", TRUE, FALSE - "UnitFlag", "CanRoad", "Local", TRUE, FALSE -; "UnitClass", "Sea", "Local", FALSE, TRUE -; "TerrainClass", "Land", "Local", TRUE, FALSE + { "type", "name", "range" + "Tech", "Superconductors", "Player" + "ExtraFlag","Railable", "Local" + "UnitFlag", "CanRoad", "Local" } build_time = 3 removal_time = 0 @@ -2076,11 +2195,11 @@ rmact_gfx = "None" rmact_gfx_alt = "-" generated = FALSE reqs = - { "type", "name", "range", "present" - "TerrainClass", "Oceanic", "Local", TRUE - "TerrainClass", "Land", "CAdjacent", TRUE - "Tech", "Steel", "Player", TRUE - "UnitFlag", "CanRoad", "Local", TRUE + { "type", "name", "range", "present" + "TerrainClass", "Oceanic", "Local", TRUE + "TerrainClass", "Land", "CAdjacent", TRUE + "Tech", "Steel", "Player", TRUE + "UnitFlag", "CanRoad", "Local", TRUE } build_time = 12 removal_time = 0 @@ -2109,9 +2228,10 @@ reqs = "TerrainClass", "Land", "Local", TRUE "Terrain", "Mountains", "Local", FALSE "Terrain", "Swamp", "Local", FALSE -; commented out for testing *********** "Building", "Great Wall" "Player", TRUE + "Building", "Great Wall", "Player", TRUE "TerrainClass", "Land", "CAdjacent", TRUE "UnitFlag", "CanRoad", "Local", TRUE + "UnitType", "Trawler", "Local", FALSE "CityTile", "Center", "Local", FALSE "Extra", "Naval Base", "Local", FALSE "Extra", "Fortress", "Local", FALSE @@ -2125,21 +2245,22 @@ reqs = "DiplRel", "Peace", "Local", FALSE "DiplRel", "Armistice", "Local", FALSE "DiplRel", "Cease-fire", "Local", FALSE -; "Tech", "Machine Tools", "World", FALSE + "Tech", "Machine Tools", "World", FALSE } build_time = 2 -removal_time = 12 +removal_time = 8 conflicts = "Fortress", "Naval Base", "Castle", "Bunker", "Airbase", "River", "Canal", "Waterway" defense_bonus = 0 native_to = "Land", "LandNoKill", "LandAirSea", "LandRoad" flags = "NativeTile" helptext = _("\ -Walls can be built on land not held by a foreign nation. Walls can’t be built\ - on Mountains, Swamp, Rivers. Except for Forts, Walls also can’t be built on a\ - tile with a Base. \n\ -Allied units who fortify on your Walls get a double-fortify-bonus of 2.25x. \n\ -Non-allied land units lose all moves when entering or exiting a tile occupied by\ - your Walls. Also, their attack and defense strength suffers a -33% penalty. \n\ +If you own the Great Wall, Walls can be built on land not held by a foreign + nation. Walls can’t be built on Mountains, Swamp, Rivers, or Bases. \n\n\ + Domestic units on the Walls get a free defense bonus of 1.5×. When fortified,\ + 2.25×. \n\ +Foreign units caught on Walls with no move points are considered vulnerable from\ + climbing and scaling, and suffer a -50% defense penalty. Non-allied land units\ + lose all moves when entering or exiting a tile occupied by Walls.\ ") [extra_canal] @@ -2229,6 +2350,8 @@ appearance_chance = 1000 ; +10% if no adjacent resource appearance_reqs = { "type", "name", "range", "present" "Terrain", "Mountains","Local", TRUE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE "MinYear", "-4000", "World", TRUE "MinYear", "-3900", "World", FALSE "Extra", "Gold", "Adjacent", FALSE @@ -2255,6 +2378,8 @@ appearance_chance = 1100 ; +11% if no adjacent resource appearance_reqs = { "type", "name", "range", "present" "Terrain", "Tundra", "Local", TRUE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE "MinYear", "-4000", "World", TRUE "MinYear", "-3900", "World", FALSE "Extra", "Elk", "Adjacent", FALSE @@ -2291,6 +2416,8 @@ appearance_reqs = "Terrain", "Swamp", "Local", FALSE "Terrain", "Plains", "Local", FALSE "TerrainClass","Oceanic","Local", FALSE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE "MinYear", "-4000", "World", TRUE "MinYear", "-3900", "World", FALSE "Extra", "Elk", "Adjacent", FALSE @@ -2356,6 +2483,8 @@ appearance_chance = 200 ; +2% if no adjacent resource appearance_reqs = { "type", "name", "range", "present" "Terrain", "Jungle", "Local", TRUE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE "MinYear", "-4000", "World", TRUE "MinYear", "-3900", "World", FALSE "Extra", "Rubber", "Adjacent", FALSE @@ -2383,6 +2512,8 @@ appearance_chance = 300 ; +3% if no adjacent resource appearance_reqs = { "type", "name", "range", "present" "Terrain", "Jungle", "Local", TRUE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE "MinYear", "-4000", "World", TRUE "MinYear", "-3900", "World", FALSE "Extra", "Rubber", "Adjacent", FALSE @@ -2436,6 +2567,8 @@ appearance_chance = 400 ; +4% if no adjacent resource appearance_reqs = { "type", "name", "range", "present" "Terrain", "Desert", "Local", TRUE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE "MinYear", "-4000", "World", TRUE "MinYear", "-3900", "World", FALSE "Extra", "Oasis", "Adjacent", FALSE @@ -2462,6 +2595,8 @@ appearance_chance = 2280 ; +22.8% if no adjacent resource appearance_reqs = { "type", "name", "range", "present" "Terrain", "Swamp", "Local", TRUE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE "MinYear", "-4000", "World", TRUE "MinYear", "-3900", "World", FALSE "Extra", "Spice", "Adjacent", FALSE @@ -2514,6 +2649,8 @@ appearance_reqs = { "type", "name", "range", "present" "Terrain", "Glacier", "Local", TRUE "TerrainClass","Oceanic","Adjacent",TRUE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE "MinYear", "-4000", "World", TRUE "MinYear", "-3900", "World", FALSE "Extra", "Ivory", "CAdjacent",FALSE @@ -2550,6 +2687,8 @@ appearance_chance = 2420 ;+24.2% extra chance if non-adjacent extra appearance_reqs = { "type", "name", "range", "present" "Terrain", "Swamp", "Local", TRUE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE "MinYear", "-4000", "World", TRUE "MinYear", "-3900", "World", FALSE "Extra", "Spice", "Adjacent", FALSE @@ -2602,6 +2741,8 @@ rmact_gfx_alt = "-" ; { "type", "name", "range", "present" ; "Terrain", "Glacier", "Local", TRUE ; "TerrainClass","Oceanic","Adjacent",FALSE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE ; "MinYear", "-4000", "World", TRUE ; "MinYear", "-3900", "World", FALSE ; "Extra", "Oil", "CAdjacent",FALSE @@ -2625,6 +2766,8 @@ appearance_chance = 700 ; +7% iff no adjacent rivers or resources i.e., far le appearance_reqs = { "type", "name", "range", "present" "Terrain", "Forest", "Local", TRUE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE "MinYear", "-4000", "World", TRUE "MinYear", "-3900", "World", FALSE "Extra", "Berries", "Adjacent", FALSE @@ -2772,11 +2915,21 @@ gui_type = "Other" border_sq = -1 vision_main_sq = 2 +[base_deep_dive_hideout] +extra = "Depth" +gui_type = "Other" +border_sq = -1 + [base_tileclaim] extra = "Tile Claim" gui_type = "Other" border_sq = 0 +[base_fishtrap] +extra = "Fishtrap" +gui_type = "Other" +border_sq = -1 + [base_fort] extra = "Fort" gui_type = "Fortress" @@ -2817,6 +2970,7 @@ vision_main_sq = 30 extra = "Buoy" gui_type = "Fortress" vision_main_sq = 5 +vision_subs_sq = 1 [base_navalbase] extra = "Naval Base" @@ -2894,6 +3048,13 @@ flags = "NoAggressive" ; if this flag is not used: ; move_cost will be that of the destination road: ; i.e., asymmetric move_cost for A-to-B and B-to-A +; - "ReverseRestrictInfra"= The move cost of this road is only triggered when +; RestrictInfra is active for a unit. That is, the move cost +; for this road is only incurred by unfriendly invader units. +; This flag allows you to create "terrain obstacle" extras that +; slow enemy movement (including IGTER units) when the extra +; is encountered by an unfriendly unit on non-allied foreign +; territory. ; */ <-- avoid gettext warnings @@ -2906,8 +3067,7 @@ trade_incr = 1 food_bonus = 0 shield_bonus = 0 trade_bonus = 0 -integrates = "Quay", "Sea Bridge", "Quay​", ; "Quay"+0-width space = quay on city - "Walls" ; causes ReverseRestrictInfra IntegrateCostUp effect: i.e., lose all moves exiting/leaving +integrates = "Quay", "Sea Bridge", "Maglev", "Quay​" ; "Quay"+0-width space = quay on city compat_special = "Road" flags = "UnrestrictedInfra" @@ -2944,7 +3104,7 @@ trade_incr = 0 food_bonus = 0 shield_bonus = 50 trade_bonus = 0 -integrates = "Sea Bridge", "Walls" ; causes ReverseRestrictInfra IntegrateCostUp effect: i.e., lose all moves exiting/leaving +integrates = "Sea Bridge", "Maglev" compat_special = "Railroad" [road_maglev] @@ -2956,6 +3116,7 @@ trade_incr = 0 food_bonus = 0 shield_bonus = 0 trade_bonus = 0 +integrates = "Sea Bridge", "Road", "Railroad" [road_river] extra = "River" @@ -2963,7 +3124,7 @@ move_cost = 3 move_mode = "Cardinal" trade_incr_const = 1 compat_special = "River" -integrates = "Canal", "Waterway", "Walls" ; causes ReverseRestrictInfra IntegrateCostUp effect: i.e., lose all moves exiting/leaving +integrates = "Canal", "Waterway" flags = "River", "UnrestrictedInfra" [road_sea_bridge] @@ -2974,7 +3135,7 @@ trade_incr = 0 food_bonus = 0 shield_bonus = 0 trade_bonus = 0 -integrates = "Road", "Railroad" +integrates = "Road", "Railroad", "Maglev" flags = "UnrestrictedInfra" [road_walls] @@ -2984,19 +3145,19 @@ trade_incr = 0 food_bonus = 0 shield_bonus = 0 trade_bonus = 0 -integrates = "Road", "Railroad", "River", "Canal", "Waterway" -flags = "IntegrateCostUp"; "ReverseRestrictInfra" (allied units ignore presence, non-allied pay move_cost) +;integrates = "Road", "Railroad", "River", "Canal", "Waterway" +flags = "IntegrateCostUp", "ReverseRestrictInfra" ;(allied units ignore move cost, non-allied pay move_cost) [road_canal] extra = "Canal" move_cost = 9 move_mode = "Cardinal" -integrates = "River", "Waterway", "Walls" ; causes ReverseRestrictInfra IntegrateCostUp effect: i.e., lose all moves exiting/leaving +integrates = "River", "Waterway" compat_special = "None" [road_waterway] extra = "Waterway" move_cost = 9 move_mode = "Cardinal" -integrates = "River", "Canal", "Walls" ; causes ReverseRestrictInfra IntegrateCostUp effect: i.e., lose all moves exiting/leaving +integrates = "River", "Canal" compat_special = "None" diff --git a/freeciv/freeciv/data/mp2-dragoon/units.ruleset b/freeciv/freeciv/data/mp2-dragoon/units.ruleset index dc3009e19..b5739e883 100644 --- a/freeciv/freeciv/data/mp2-dragoon/units.ruleset +++ b/freeciv/freeciv/data/mp2-dragoon/units.ruleset @@ -1,4 +1,4 @@ -;:::::::::::::::::::::::::::::::::::::::::’ × +;’::::::::::::::::::::::::::::::::::::::::’ × ; Modifying this file: ; You should not modify this file except to make bugfixes or ; for other "maintenance". If you want to make custom changes, @@ -14,7 +14,7 @@ ; unit with the relevant role that the player can build will be chosen. ; If no such unit can be found (eg Scouts that require Horseback Riding), ; then the first unit with this role will be chosen. -;:::::::::::::::::::::::::::::::::::::::::’ × +;’::::::::::::::::::::::::::::::::::::::::’ × [datafile] description="Unit definitions for the MP2 ruleset." @@ -46,7 +46,7 @@ flags = _("Helicopter"), _("Loses 1hp for every turn in the air.\n\ ➤ Gets +1 move point if starting its turn in a City or Airbase.") _("Submarine"), _("Attack value reduced against some ships.") - _("Unbribable"), _("Can't be bribed.") + _("Unbribable"), _("Can’t be bribed.") _("TradeRoute"), _("Can establish a foreign trade route (must travel to target city).") _("HelpWonder"), _("Can help build a Wonder in any non-hostile city.") _("Capturer"), _("Can capture some enemy units.") @@ -59,24 +59,23 @@ flags = _("Infra"), _("Can build infrastructure.") _("Proletarian"), _("Controllable only by Communist governments.") _("Paratroopers"), _("Can be paradropped from a friendly city or suitable base.") - _("Marines"), _("Can launch attack from non-native tiles.") + _("NonNativeAttack"), _("Overrides unit class to allow attacks on non-native tiles.") _("Expellable"), _("Can be peacefully expelled from foreign tiles.") _("AirProtector"), _("Is Unreachable AND can protect its tile from units unable to attack this unit.") _("CantReachAir"), _("Unable to attack air units.") _("FortBuster"), _("Defending Forts get no bonus. +33% attack bonus vs. the 2× defense of a Fortress.") _("FortressBuster"), _("Defending Fortresses get no bonus.") _("AntiAir"), _("Anti-Air bonus of this unit is less effective against Stealth, which has a 25% bonus against this unit.") -;;; _("NeverProtects"), _("Does not protect other units on its tile.") ; UNCOMMENT THIS IF NOT USING SCL'S PATCH FOR THIS FLAG -;;; _("NeverBlocked"), _("Bypasses unreachable units when attacking a tile.") ; UNCOMMENT THIS IF NOT USING LEXXIE'S PATCH FOR THIS FLAG - _("MultiSlot"), _("Cities with proper requirements can produce more than one of these per turn.") ;uncomment if you don't have slot_control patch +;;; _("NeverBlocked"), _("Bypasses unreachable units when attacking a tile.") ; UNCOMMENT THIS IF NOT USING LEXXIE’s PATCH FOR THIS FLAG +;;; _("MultiSlot"), _("Cities with proper requirements can produce more than one of these per turn.") ;uncomment if you don’t have slot_control patch _("CanHide"), _("In appropriate terrain, this unit can make a Hideout, which will conceal all land units on the tile.") _("WillNever") -;;; The following flag MUST be #34 position to work with hack in movement.c which allows transported AAA to defend on non-native: -;;; this comment can be removed when we have some smarter way for unit_can_defend_here(..) to get ruleset control. - _("TransportDefender"), _("Can defend while transported on non-native tiles.") +;;; _("TransportDefender"), _("Can defend while transported on non-native tiles.") ;uncomment if you don’t have TransportDefender patch _("NonMilAttack"), _("Has military capacity but for peaceful purposes, can enter territories with whom you are at Peace") _("Cant_Pillage"), _("Unable to pillage tiles.") _("CanClaim"), _("Is able to claim sovereignty of foreign tiles bordering domestic territory.") + _("CantAttack"), _("Cannot do conventional combat attacks.") + _("Workers") } ; Names for custom unit class flags. There can be up to 12 of these. @@ -92,7 +91,8 @@ class_flags = _("CanPillage") _("Airliftable"), _("Can be airlifted if it has remaining moves.") _("BorderPolice"), _("Military units from this class can peacefully expel certain foreign units.") - _("CargoRestrained"), _("Can't attack as Cargo. Must first unload.") + _("CargoRestrained"), _("Can’t attack as Cargo. Must first deboard or disembark.") + _("WaterVessel") } [veteran_system] @@ -170,10 +170,9 @@ veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 ; "AttackNonNative" = Unit Class can attack units on non-native tiles. Unit type ; flag "Only_Native_Attack" can override this ; "AttFromNonNative" = Unit Class can launch attack from non-native tile (against -; native one) -; This applies for both attacking from transport or +; native one). This applies for both attacking from transport or ; cities. If only some unit types of the class should -; get this property, use type flag "Marines" +; get this property, use type flag "NonNativeAttack" ; "KillCitizen" = Upon successful attack against a city, unit kills one ; citizen. The effect "Unit_No_Lose_Pop" and the server ; setting 'killcitizen' can disable this. @@ -187,14 +186,17 @@ veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 ; REQUIRE CHANGES TO FCW function unit_could_possibly_load() in unit.js ; ********************************************************************************** ; ********************************************************************************** +; missile flag not class, indicates suicide explosion and possibly other things. [unitclass_missile] name = _("?unitclass:Missile") min_speed = 1 hp_loss_pct = 0 hut_behavior = "Frighten" flags = "Missile", "Unreachable", "DoesntOccupyTile", "Airliftable" +helptext = _("\ + • Can be airlifted from a suitable city.\ +") -; missile flag not class, indicates suicide explosion and possibly other things. [unitclass_bomb] name = _("?unitclass:Bomb") min_speed = 1 @@ -205,6 +207,17 @@ helptext = _("\ • Can be airlifted from a suitable city.\ ") +[unitclass_conventional_bomb] +name = _("?unitclass:Bomb2") +min_speed = 1 +hp_loss_pct = 0 +hut_behavior = "Frighten" +flags = "BuildAnywhere", "Missile", "Unreachable", "DoesntOccupyTile", "Airliftable", + "AttackNonNative" +helptext = _("\ + • Can be airlifted from a suitable city.\ +") + [unitclass_landrail] name = _("?unitclass:LandRail") min_speed = 4 @@ -218,7 +231,8 @@ helptext = _("\ name = _("?unitclass:LandRoad") min_speed = 3 hp_loss_pct = 0 -flags = "BuildAnywhere", "ZOC", "TerrainDefense", "DamageSlows", "TerrainSpeed", "CanFortify" +flags = "BuildAnywhere", "ZOC", "TerrainDefense", "DamageSlows", "TerrainSpeed", "CanFortify", + "CargoRestrained" helptext = _("\ • Only able to move on road tiles.\ ") @@ -241,6 +255,13 @@ helptext = _("\ • Can be airlifted from a suitable city.\ ") +[unitclass_land_immobile] +name = _("?unitclass:LandImmobile") +min_speed = 3 +hp_loss_pct = 0 +flags = "TerrainSpeed", "BuildAnywhere", "ZOC", "CanFortify", "TerrainDefense", + "AttFromNonNative", "AttackNonNative" + [unitclass_landnokill] name = _("?unitclass:LandNoKill") min_speed = 1 @@ -269,11 +290,12 @@ helptext = _("\ [unitclass_sea] name = _("?unitclass:Sea") -min_speed = 3 +min_speed = 4 hp_loss_pct = 0 -flags = "DamageSlows", "AttackNonNative", "AttFromNonNative", "CanPillage" +flags = "DamageSlows", "AttackNonNative", "AttFromNonNative", "CanPillage", "WaterVessel", + "CargoRestrained" ;can't attack while being towed by Trawler helptext = _("\ - • Crew Repair:each turn, regardless of movement, recovers 8% of its hit points (rounded down).\ + • Crew Repair:each turn, regardless of movement, recovers 10% of its hit points (rounded down).\ ") ; Separating the Submarine class finally allows it to be unreachable by Air. The old Submarine was @@ -281,26 +303,29 @@ helptext = _("\ ; Because it is now Unreachable, any unit able to attack it needs this class in its targets. [unitclass_submarine] name = _("?unitclass:Submarine") -min_speed = 4 +min_speed = 5 hp_loss_pct = 0 -flags = "DamageSlows", "AttackNonNative", "AttFromNonNative", "CanPillage", "Unreachable" +flags = "DamageSlows", "AttackNonNative", "AttFromNonNative", "CanPillage", "Unreachable", "WaterVessel", + "CargoRestrained" ;can't attack while being towed by Trawler helptext = _("\ • Visibility bonus:not visible to other players unless they have a unit or city adjacent to it.\n\ - • Crew Repair:each turn, regardless of movement, recovers 2 hit points.\ + • Crew Repair:each turn, regardless of movement, recovers 3 hit points.\ ") [unitclass_trireme] name = _("?unitclass:Trireme") -min_speed = 2 +min_speed = 3 hp_loss_pct = 0 -flags = "DamageSlows", "AttFromNonNative" +flags = "DamageSlows", "AttFromNonNative", "WaterVessel", + "CargoRestrained" ;can't attack while being towed by Trawler [unitclass_rivership] ; /* Extra class providing ability to travel rivers */ name = _("?unitclass:RiverShip") -min_speed = 2 +min_speed = 3 hp_loss_pct = 0 -flags = "DamageSlows", "AttackNonNative", "AttFromNonNative" +flags = "DamageSlows", "AttackNonNative", "AttFromNonNative", "WaterVessel", + "CargoRestrained" ;can't attack while being towed by Trawler [unitclass_heli] name = _("?unitclass:Helicopter") @@ -423,9 +448,9 @@ flags = "Unreachable", "DoesntOccupyTile" ; refuel point ; uk_* = upkeep costs, these are used as base values in the game ; cargo = Unit classes this unit can transport -; city_slots = How many of homecity's unit maintenance slots unit takes +; city_slots = How many of homecity’s unit maintenance slots unit takes ; city_size = UNUSED in MP rulesets in its original form, so now it is used -; for bit-field for additional flags that won't break save game +; for bit-field for additional flags that won’t break save game ; compatibility. ; BIT 0 = RESERVED for +1 bombard range. ; BIT 1 = bombard_stay_fortified, attacks do not lose fortified status. @@ -449,9 +474,9 @@ flags = "Unreachable", "DoesntOccupyTile" ; bonuses.flag = flag of the unit that bonus applies against ; bonuses.type = type of the bonus. See below ; bonuses.value = value of the bonus. Sum of these is used if multiple apply. -; bonuses.quiet = don't auto generate help text for this bonus. Use this if -; the bonus is documented in the unit type's help text. -; This is useful when the combination of a unit's bonuses +; bonuses.quiet = don’t auto generate help text for this bonus. Use this if +; the bonus is documented in the unit type’s help text. +; This is useful when the combination of a unit’s bonuses ; becomes complex enough to make the auto generated help ; ugly or inaccurate. ; flags = special flag strings; list of built-in flags described below @@ -501,20 +526,20 @@ flags = "Unreachable", "DoesntOccupyTile" ; ; "IgZOC" = ignore Zones of Control (ZOC) even if unit class has ; "ZOC" flag -; "HasNoZOC" = unit has no Zone of Control (ZOC), thus any unit can move -; around it freely -; "NonMil" = a non-military unit:no martial law; can enter +; "HasNoZOC" = unit has no Zone of Control (ZOC), thus any unit can move +; around it freely +; "NonMil" = a non-military unit:no martial law; can enter ; peaceful borders; DoesntOccupyTile ; "IgTer" = use constant move cost defined in igter_cost (terrain.ruleset) ; rather than terrain/road etc cost, unless terrain cost is ; less -; "OneAttack" = can only make a single attack, regardless of movement points -; "FieldUnit" = cause unhappiness even when not being aggressive -; "BeachLander" = won't lose all its movement when moving from non-native +; "OneAttack" = can only make a single attack, regardless of movement points +; "FieldUnit" = cause unhappiness even when not being aggressive +; "BeachLander" = won’t lose all its movement when moving from non-native ; terrain to native terrain even if slow_invasions is on. -; "Settlers" = "can irrigate and build roads" but really seems to be a required flag for -; any tile improvement at all. -; "Diplomat" = can defend against diplomat actions (see diplchance +; "Settlers" = "can irrigate and build roads" but really seems to be a required flag for +; any tile improvement at all. +; "Diplomat" = can defend against diplomat actions (see diplchance ; server option) ; "Spy" = strong in diplomatic battles. _Must_ be "Diplomat" also ; "CoastStrict" = (sea only) cannot leave coast @@ -522,41 +547,37 @@ flags = "Unreachable", "DoesntOccupyTile" ; to regularly end turn on coast ; "Only_Native_Attack" = cannot attack targets on non-native tiles even if ; unit class can -; "Cant_Fortify" = cannot fortify even if unit class has "CanFortify" flag -; "Fanatic" = can only be built by governments that allow them -; (see civ2/governments.ruleset, Fvndamentalist government) -; "Unique" = a player can only have one of these units in the game at -; the same time; barbarians cannot use this at present -; "GameLoss" = losing one of these units means you lose the game, but it -; is produced without homecity and upkeep -; "EvacuateFirst" = the game will try to rescue units with this flag before +; "Cant_Fortify"= cannot fortify even if unit class has "CanFortify" flag +; "Fanatic" = can only be built by governments that allow them +; (see civ2/governments.ruleset, Fvndamentalist government) +; "Unique" = a player can only have one of these units in the game at +; the same time; barbarians cannot use this at present +; "GameLoss" = losing one of these units means you lose the game, but it +; is produced without homecity and upkeep +; "EvacuateFirst"=the game will try to rescue units with this flag before ; it tries to rescue units without it when their transport ; is destroyed. Think of the Birkenhead drill ("women and ; children first"). Replace "women and children" with ; "units with the EvacuateFirst unit type flag". -; "SuperSpy" = this unit always wins diplomatic contests, that is, unless -; it encounters another SuperSpy, in which case defender wins; -; can also be used on non-diplomat units, in which case it can -; protect cities from diplomats; also 100% spy survival chance -; "NoHome" = this unit has no homecity and will be free of all upkeep, and -; therefore will not revolt along with its city of origin should -; it be incited +; "SuperSpy" = this unit always wins diplomatic contests, that is, unless +; it encounters another SuperSpy, in which case defender wins; +; can also be used on non-diplomat units, in which case it can +; protect cities from diplomats; also 100% spy survival chance +; "NoHome" = this unit has no homecity and will be free of all upkeep, and +; therefore will not revolt along with its city of origin should +; it be incited ; "NoVeteran" = this unit cannot gain veteran levels through experience ; (as if both raise_chance and work_raise_chance were zero); ; it can still gain veterancy through Veteran_Build, etc ; "CityBuster" = this unit has double firepower against cities ; "NoBuild" = this unit cannot be built -; "BadWallAttacker" = the firepower of this unit is set to 1 if -; attacking a city -; defended by a city wall (or other city building defense) -; "BadCityDefender" = if attacked while in a city, firepower is set to 1 -; and firepower of attacker is doubled (the Pearl Harbour -; rule) +; "BadWallAttacker"=the firepower of this unit is set to 1 if attacking a city +; defended by a city wall (or other city building defense) +; "BadCityDefender"=if attacked while in a city, firepower is set to 1 +; and firepower of attacker is doubled (the Pearl Harbour rule) ; "BarbarianOnly" = only barbarians can build this unit ; "Shield2Gold" = Switch from shield upkeep to gold upkeep possible. -; Also, currently substitutes for "MultiSlot" flag due to inability -; to add another UTYF flag to the server. -; "NewCityGamesOnly" = unit can't be built on scenarios where founding new cities +; "NewCityGamesOnly" = unit can’t be built on scenarios where founding new cities ; is not allowed. Give this flag to units that would make no sense ; to have in a game with such a scenario ; "CanEscape" = this unit has, given that certain conditions are @@ -564,26 +585,33 @@ flags = "Unreachable", "DoesntOccupyTile" ; killed when killstack is enabled and the defender of its ; tile is defeated. The conditions are that it has more move ; points than required to move to an adjacent tile plus the -; attackers move points and that the attacker doesn't have +; attackers move points and that the attacker doesn’t have ; the "CanKillEscaping" unit type flag. ; "CanKillEscaping" = an attack from this unit ignores the "CanEscape" unit ; type flag. -; "Provoking" = Under autoattack_style=1 which this ruleset uses, only -; Fighter types will autoattack and will ONLY attack units -; marked with the Provoking flag. If overridden to autoattack_style=0, -; a unit considering to auto attack this unit will choose to -; do so even if has better odds when defending against it -; then when attacking it. Applies when the autoattack server +; "Provoking" = Under autoattack_style=1 which this ruleset uses, Fighter +; types will ONLY autoattack units marked with the Provoking flag. +; If overridden to autoattack_style=0, a unit considering to autoattack +; this unit will choose to do so even if has better odds when defending +; against it than when attacking it. Applies when the autoattack server ; setting is enabled. -; "NeverProtects" = doesn't protect reachable units on its tile from enemy +; "NeverProtects" = doesn’t protect reachable units on its tile from enemy ; attackers, even if the unreachableprotects server setting ; is enabled and the unit class is unreachable -; "NeverBlocked" = isn't blocked by unreachable units on targeted tile, +; "NeverBlocked" = isn’t blocked by unreachable units on targeted tile, ; even if the unreachableprotects server setting ; is enabled and the unit class is unreachable ; "MultiSlot" = if server setting slot_control is ON, only unit types with this ; flag can use extra city_build_slots -; TO DO:make this a server UTYF flag that's used instead of Shield2Gold +; "TransportDefender" = Unit can always defend while transported, even on non-native +; terrain. +; "SentryAlways" = This unit always reports sentry-type information; give this flag to +; reconnaissance/scouting type units who can’t sentry because they are +; fuel-type units (which can only sentry on refueling tiles.) +; "Reserved1" +; "Reserved2" +; "Reserved3" = reserved for future use. +; ------------------------------------------ ; Following actions require extra fields: ; "Attack" and "Suicide Attack" ; attack = base attack strength @@ -807,51 +835,103 @@ Tribesmen lose many versatility bonuses as you become more civilized. For\ ;A unique patch unit to provide fair starts regardless of lack of nearby water. ;to make as a start unit, use the letter "a":for example, cccwwwxxa -[unit_welldigger] -name = _("Well-Digger") +[unit_peasants] +name = _("Peasants") class = "Land" -tech_req = "None" -obsolete_by = "Workers" -graphic = "u.well_digger" +tech_req = "Monarchy" +gov_req = "Monarchy" +impr_req = "Magna Carta" +obsolete_by = "None" +graphic = "u.peasants" +graphic_alt = "u.migrants" +sound_move = "m_worker" +sound_move_alt = "m_generic" +sound_fight = "f_worker" +sound_fight_alt = "f_generic" +build_cost = 10 +pop_cost = 1 +attack = 0 +defense = 1 +hitpoints = 8 +firepower = 1 +move_rate = 2 +vision_radius_sq = 4 +transport_cap = 0 +fuel = 0 +city_size = 1 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only +disembarks = "LandRoad", "LandRail", "Helicopter" +flags = "MultiSlot", "Cant_Fortify", "NonMil", "HasNoZOC", "AddToCity", + "Capturable", "Expellable", "Cant_Pillage" +; No veteran levels (level name is never displayed) +veteran_names = _("green") +veteran_base_raise_chance = 0 +veteran_work_raise_chance = 0 +veteran_power_fact = 100 +veteran_move_bonus = 0 +helptext = _("\ +Population Cost: 1. Adds Population: 1.\n\n\ +Peasants are the common people of Monarchies. You can encourage them\ + by royal edict to migrate to other cities and help colonize new\ + areas. But to have such access, you must be a Constitutional Monarchy\ + with the Magna Carta wonder: Peasants can only be made in\ + the city with Magna Carta, so choose that city carefully. \n\ +If managed correctly, Peasants can increase your national population\ + growth. They give a tremendous advantage for growing new colonies\ + and settlements faster. \n\ +Peasants can only be made in one city, but you can make more than one per\ + turn under the right conditions. When a city completes a unit, it will try\ + to make more of them if it doesn’t have a worklist. So be careful!\ +") + +[unit_pilgrims] +name = _("Pilgrims") +class = "Land" +tech_req = "Theocracy" +gov_req = "Theocracy" +obsolete_by = "None" +graphic = "u.pilgrims" graphic_alt = "-" sound_move = "m_worker" sound_move_alt = "m_generic" sound_fight = "f_worker" sound_fight_alt = "f_generic" -build_cost = 5 +build_cost = 10 pop_cost = 0 attack = 0 defense = 1 hitpoints = 8 firepower = 1 -move_rate = 3 +move_rate = 2 vision_radius_sq = 4 transport_cap = 0 fuel = 0 +city_size = 1 uk_happy = 0 -uk_shield = 5 +uk_shield = 0 uk_food = 2 -uk_gold = 2 -flags = "Settlers", "Infra", "NonMil", "HasNoZOC", "Cant_Fortify", "Unique", "Well-Digger", "Expellable" -embarks = "LandRoad" -disembarks = "LandRoad" +uk_gold = 0 +embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only +disembarks = "LandRoad", "LandRail", "Helicopter" +flags = "Fanatic", "Cant_Fortify", "NonMil", "HasNoZOC", "AddToCity", "Capturable", "Expellable", "Cant_Pillage" ; No veteran levels (level name is never displayed) veteran_names = _("green") veteran_base_raise_chance = 0 veteran_work_raise_chance = 0 veteran_power_fact = 100 veteran_move_bonus = 0 -roles = "AttackFastStartUnit" ;this role taken over for well-digger helptext = _("\ -This unit can fix unlucky starts, but has very high upkeep.\ - If you have no water, make a Well-Digger in a city that can\ - support it, create a water source, then disband the unit. \n\ - This unit can dig wells to create irrigation sources. It will cost its home city\ - -2 Food -2 Prod. This unit WILL NOT WORK:• Outside your borders,\ - • After Alphabet or Pottery, • After any player discovers Writing,\ - • After it reaches an age of 10 turns.\ - >> Don't fool around:high upkeep will permanently hinder you. Only make this unit if you\ - lack water when the game starts!\ +Population Cost: 0. Adds Population: 1.\n\n\ +Pilgrims are wayfaring migrants from Theocratic nations. Like Zealots,\ + they have no upkeep if under a Theocratic government. Heeding the call\ + of ecclesiastic authority, Pilgrims can be guided from one city to another in\ + order to transfer population from city to city. Pilgrims have no population\ + cost, so can be thought of as geographically controled rapture for the price\ + of 10 shields.\ ") [unit_proletarians] @@ -906,20 +986,20 @@ Large numbers of Proletarians can be used to rapidly complete important State pr which you may organize into Five-turn Plans.\ ") -[unit_pilgrims] -name = _("Pilgrims") +[unit_migrants] +name = _("Migrants") class = "Land" -tech_req = "Theocracy" -gov_req = "Theocracy" +tech_req = "Nationalism" +gov_req = "Nationalism" obsolete_by = "None" -graphic = "u.pilgrims" +graphic = "u.migrants" graphic_alt = "-" sound_move = "m_worker" sound_move_alt = "m_generic" sound_fight = "f_worker" sound_fight_alt = "f_generic" build_cost = 10 -pop_cost = 0 +pop_cost = 1 attack = 0 defense = 1 hitpoints = 8 @@ -935,7 +1015,7 @@ uk_food = 2 uk_gold = 0 embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only disembarks = "LandRoad", "LandRail", "Helicopter" -flags = "Fanatic", "Cant_Fortify", "NonMil", "HasNoZOC", "AddToCity", "Capturable", "Expellable", "Cant_Pillage" +flags = "Cant_Fortify", "NonMil", "HasNoZOC", "AddToCity", "Capturable", "Expellable", "Cant_Pillage" ; No veteran levels (level name is never displayed) veteran_names = _("green") veteran_base_raise_chance = 0 @@ -943,70 +1023,77 @@ veteran_work_raise_chance = 0 veteran_power_fact = 100 veteran_move_bonus = 0 helptext = _("\ -Population Cost: 0. Adds Population: 1.\n\n\ -Pilgrims are wayfaring migrants from Theocratic nations. Like Zealots,\ - they have no upkeep if under a Theocratic government. Heeding the call\ - of ecclesiastic authority, Pilgrims can be guided from one city to another in\ - order to transfer population from city to city. Pilgrims have no population\ - cost, so can be thought of as rapture for the price of 10 shields.\ +Population Cost: 1. Adds Population: 1.\n\n\ +Migrants are citizens under Nationalist governments who are encouraged to\ + settle in new cities, usually in conquered or colonized areas.\ + They can be guided to transfer population from city to city. This may\ + be used to increase national population growth.\ ") -[unit_migrants] -name = _("Migrants") +[unit_workers] +name = _("?unit:Workers") class = "Land" -tech_req = "Nationalism" -gov_req = "Nationalism" -obsolete_by = "None" -graphic = "u.migrants" +tech_req = "Pottery" +obsolete_by = "Workers II" +graphic = "u.worker" graphic_alt = "-" sound_move = "m_worker" sound_move_alt = "m_generic" sound_fight = "f_worker" -sound_fight_alt = "f_generic" -build_cost = 10 -pop_cost = 1 +sound_fight_alt = "Pillage" +build_cost = 30 ; adjusting this means recalibrating [effect_free_workers_ii] is needed also +pop_cost = 0 attack = 0 defense = 1 hitpoints = 8 firepower = 1 move_rate = 2 vision_radius_sq = 4 +convert_to = "Riflemen" +convert_time = 2 transport_cap = 0 fuel = 0 -city_size = 1 uk_happy = 0 -uk_shield = 0 -uk_food = 2 +uk_shield = 1 +uk_food = 0 uk_gold = 0 embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only disembarks = "LandRoad", "LandRail", "Helicopter" -flags = "Cant_Fortify", "NonMil", "HasNoZOC", "AddToCity", "Capturable", "Expellable", "Cant_Pillage" +flags = "Settlers", "Infra", "CanRoad", "CanFortress", "NonMil", "HasNoZOC", "Airbase", "Cant_Fortify", "Capturable", + "Expellable", "Workers" ; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_base_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 +veteran_names = + _("?vet_rank:apprentice"), + _("?vet_rank:journeymen"), + _("?vet_rank:foremen"), + _("?vet_rank:master workmen") +veteran_base_raise_chance = 0, 0, 0, 0 +veteran_work_raise_chance = 0, 0, 0, 0 +veteran_power_fact = 100, 100, 100, 100 +veteran_move_bonus = 0, 1, 1, 1 +roles = "Settlers", "WorkerStartUnit" helptext = _("\ -Population Cost: 1. Adds Population: 1.\n\n\ -Migrants are citizens under Nationalist governments who are encouraged to\ - settle in new cities, usually in conquered or colonized areas.\ - They can be guided to transfer population from city to city. This may\ - be used to increase national population growth.\ +Workers can improve terrain tiles. See the manual on Terrain for details. \ +"), _("\ +Masonry lets Workers build Forts. Construction lets them build Fortresses and\ + Oil Wells. Engineering lets them build Canals and Naval Bases. Feudalism with\ + Construction lets them build Castles. Steel lets them build Bunkers and Sea\ + Bridges. Radio lets them build Airbases and Buoys, which Settlers cannot. Workers\ + must be on a ship to build Buoys. \ ") -[unit_worker] -name = _("?unit:Workers") +[unit_workers2] +name = _("Workers II") class = "Land" -tech_req = "Pottery" +tech_req = "Democracy" obsolete_by = "Engineers" -graphic = "u.worker" +graphic = "u.worker2" graphic_alt = "-" sound_move = "m_worker" sound_move_alt = "m_generic" sound_fight = "f_worker" sound_fight_alt = "Pillage" -build_cost = 30 +build_cost = 30 ; adjusting this means recalibrating [effect_free_workers_ii] is needed also pop_cost = 0 attack = 0 defense = 1 @@ -1024,28 +1111,39 @@ uk_food = 0 uk_gold = 0 embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only disembarks = "LandRoad", "LandRail", "Helicopter" -flags = "Settlers", "Infra", "CanRoad", "CanFortress", "NonMil", "HasNoZOC", "Airbase", "Cant_Fortify", "Capturable", "Expellable" +flags = "Settlers", "Infra", "CanRoad", "CanFortress", "NonMil", "HasNoZOC", "Airbase", "Cant_Fortify", "Capturable", + "Expellable", "Workers" ; No veteran levels (level name is never displayed) veteran_names = - _("?vet_rank:green"), - _("?vet_rank:army worker"), - _("?vet_rank:army engineer"), - _("?vet_rank:chief engineer") + _("?vet_rank:apprentice"), + _("?vet_rank:journeymen"), + _("?vet_rank:foremen"), + _("?vet_rank:master workmen") veteran_base_raise_chance = 0, 0, 0, 0 -veteran_work_raise_chance = 0, 0, 0, 0 -veteran_power_fact = 100, 100, 100, 100 +veteran_work_raise_chance = 7, 5, 3, 0 +veteran_power_fact = 100, 120, 125, 133 veteran_move_bonus = 0, 1, 1, 1 roles = "Settlers", "WorkerStartUnit" helptext = _("\ -Workers can improve terrain tiles. See the manual on Terrain for details. \ +As civilization progresses, socioeconomic trends improve education, efficiency and\ + methods: for each turn of work completed, Workers II gain a small chance of promotion. \n\ +• v1 do 6 turns of work in 5 turns (Journeyman); \n\ +• v2 do 5 turns of work in 4 turns (Foreman); \n\ +• v3 do 4 turns of work in 3 turns (Master Workman). \n\ +These bonuses stack with other work rate bonuses. \n +In other respects, this unit is identical to Workers I. \n\ "), _("\ Masonry lets Workers build Forts. Construction lets them build Fortresses and\ Oil Wells. Engineering lets them build Canals and Naval Bases. Feudalism with\ Construction lets them build Castles. Steel lets them build Bunkers and Sea\ Bridges. Radio lets them build Airbases and Buoys, which Settlers cannot. Workers\ - must be on a ship to build Buoys. \ + must be on a ship to build Buoys. \n\ "), _("\ -Communism tech allows Communist governments to conscript Workers into Riflemen via the\ +Until the discovery of Explosives, Workers will immediately upgrade for free\ + to Workers II. No moves are spent, no city is needed, and the current job\ + is not interrupted. \n\ +"), _("\ +Communism tech allows Communist governments to conscript Workers II into Riflemen via the\ Convert order. And vice versa.\ ") @@ -1154,7 +1252,7 @@ convert_time = 4 transport_cap = 0 fuel = 0 city_size = 278 ;000000,000,001,000101,1,0 atk_bonus=0, max_kiils=0, targets=1, move_cost=5 frags, stay_frtfy=1, reserverd=0 -paratroopers_mr_sub = 1 ;00,0000,000,0,1 iPill_rand_tgts=0, iPill_odds=-0 pentads, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=1 +paratroopers_mr_sub = 1 ;000,00000,00,0000,000,0,1 max_ATKs=0, bbd_retal_rate=0, iPill_rand_tgts=0, iPill_odds=-0 pentads, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=1 ;NOTE:iPillage changes in rules require client_rules_flag and get_what_can_unit_pillage_from() changes. uk_happy = 1 uk_shield = 1 @@ -1205,8 +1303,8 @@ convert_to = "Musketeers" convert_time = 2 transport_cap = 0 fuel = 0 -city_size = 1850 ; 000000,000,111,001110,1,0 = atk_bonus=0, max_kills=0, targets=7, move_cost=14 frags, stay_fortfy=1, reserved = 0 -paratroopers_mr_sub = 4096 ; 00010,00,0000,000,0,0 - bbd_retal_rate=2, iPill_rand_tgts=0, iPill_odds=0, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 +city_size = 826 ; 000000,000,011,001110,1,0 = atk_bonus=0, max_kills=0, targets=3, move_cost=14 frags, stay_fortfy=1, reserved = 0 +paratroopers_mr_sub = 4096 ; 000,00010,00,0000,000,0,0 - max_ATKs=0, bbd_retal_rate=2, iPill_rand_tgts=0, iPill_odds=0, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 ;NOTE:iPillage changes in rules require client_rules_flag and get_what_can_unit_pillage_from() changes. uk_happy = 1 uk_shield = 1 @@ -1220,7 +1318,7 @@ roles = "DefendOk", "DefendOkStartUnit" helptext = _("\ Archers fight with bows and arrows. They have good offense and decent defense.\ Rather than fight to the death, Archers can also do a ranged Volley Attack which\ - avoids hand-to-hand retaliation:two volleys of arrows are fired on up to 7 enemy units on the tile,\ + avoids hand-to-hand retaliation:two volleys of arrows are fired on up to 3 enemy units on the tile,\ causing 1-2hp of damage to any units who are hit. This includes Oceanic tiles if not\ transported. This is useful for softening enemies prior to battle, or for deterring an\ approach to a strategic location. (Volley Attack is not possible on Cities or Fortresses.)\ @@ -1232,7 +1330,6 @@ Archers fight with bows and arrows. They have good offense and decent defense.\ ") bombard_rate = 2 - [unit_legion] name = _("Legion") class = "Land" @@ -1244,7 +1341,7 @@ sound_move = "m_legion" sound_move_alt = "m_generic" sound_fight = "f_legion" sound_fight_alt = "f_generic" -build_cost = 31 +build_cost = 30 pop_cost = 0 attack = 4 defense = 2 @@ -1256,7 +1353,7 @@ convert_to = "Musketeers" convert_time = 2 transport_cap = 0 fuel = 0 -city_size = 70180 ; 000100,010,010,001001,00 = atk +4*25=+100% (2×), max_kills=2, targets=2, move_cost=9 frags, stay_fortfy=0, reserved = 0 +city_size = 70182 ; 000100,010,010,001001,10 = atk +4*25=+100% (2×), max_kills=2, targets=2, move_cost=9 frags, stay_fortfy=1, reserved = 0 uk_happy = 1 uk_shield = 1 uk_food = 0 @@ -1360,7 +1457,7 @@ roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild", helptext = _("\ Musketeers are infantry equipped with early firearms. They replace Pikemen as the preferred\ city defender, and replace Archers and Legions for offensive foot soldiers.\ - The discovery of Labor Union allows upgrading Musketeers to Riflemen for free\ + The discovery of Mechanization allows converting Musketeers to Riflemen for free\ in any domestic city. \ "), _("\ \nThe discovery of Banking changes upkeep from shields to gold.\ @@ -1403,7 +1500,8 @@ bonuses = ;********* requires hard-coding fix to packhand.js:handle_non_integer_combat_scores() if changed:****************************** "WillNever", "DefenseMultiplierPct", -50 ;The way to change general defense score on everyone without using integer defense score. } -flags = "FootSoldier", "Capturer", "CantReachAir", "Settlers", "CanHide", "MultiSlot", "WillNever", "Shield2Gold" +flags = "MultiSlot", "Shield2Gold", "FootSoldier", "Capturer", + "CantReachAir", "Settlers", "CanHide", "WillNever" roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild" veteran_names = _("?vet_rank:green"), @@ -1426,63 +1524,12 @@ Falconets are huge and heavy. They have woeful accuracy but lethal\ firepower:they either kill or totally miss. On paper, attack odds\ are closest to a Musketeer (A3). Yet there is a high chance of losing\ when you expect to win, or winning when you expect to lose. The outcome\ - is in God's hands! Falconeers defend a bit worse than they attack. \n\ + is in God’s hands! Falconeers defend a bit worse than they attack. \n\ Righteous faith is needed to fight with slow heavy inaccurate weaponry:\ only Theocracies can train Falconeers. Other governments will incur\ high upkeep or see them retire.\ ") -[unit_zealots] -name = _("Zealots") -class = "Land" -tech_req = "Conscription" -gov_req = "Theocracy" -obsolete_by = "None" -graphic = "u.zealots" -graphic_alt = "u.fanatics" -sound_move = "m_fanatics" -sound_move_alt = "m_generic" -sound_fight = "f_zealots" -sound_fight_alt = "f_riflemen" -build_cost = 20 -pop_cost = 0 -attack = 4 -defense = 4 -hitpoints = 20 -firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 -fuel = 0 -city_size = 1080; 000000,0,100,001110,0,0 = atk_bonus=0, max_kills=0, targets=4, move_cost=14 frags, sty_frtfy=0, reserved = 0 -uk_happy = 2 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only -disembarks = "LandRoad", "LandRail", "Helicopter" -targets = "Balloon", "Helicopter", "LandRail" -flags = "Fanatic", "FootSoldier", "Capturer", "CantReachAir", "Unbribable", "Bombarder", - "Settlers", "CanHide", "MultiSlot", "WillNever", "Shield2Gold" -roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild" -helptext = _("\ -Zealots are warriors devoted to a higher cause. Their faith\ - is strong and they cannot be bribed. \ -"), _("\ -Theocratic nations can maintain Zealots without paying\ - their steep upkeep. (Zealots are unhappy if not under Theocracy,\ - requiring high upkeep to stay content.) Zealots\ - produced in a city with Ecclesiastical Palace are inspired by\ - fervorous faith to +1 higher veteran level. \ -"), _("\ -Zealots zealously defend their homeland, and can do surprise skirmish\ - assaults to snipe and injure foreign occupants:Up to 4 invaders\ - on the tile will endure three combat rounds without defense. Skirmish\ - assaults can also be done to foreign occupied cities if they have\ - a remaining Foreign National population.\ -") -bombard_rate = 3 - [unit_partisan] name = _("Partisan") class = "Land" @@ -1511,13 +1558,25 @@ uk_gold = 0 embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only disembarks = "LandRoad", "LandRail", "Helicopter" targets = "Balloon", "Helicopter", "LandRail" -flags = "MultiSlot", "IgTer", "IgZOC", "NoHome", "FootSoldier", "Capturer", "CantReachAir", - "Shield2Gold", "Settlers", "CanHide", "WillNever" -;yes Partisan has 0 upkeep so Shield2Gold is meaningless, but currently used to substitute MultiSlot inaccessible in c-server -roles = "DefendGood", "DefendGoodStartUnit", "Partisan", "BarbarianTech" +flags = "MultiSlot", "IgTer", "IgZOC", "NoHome", "FootSoldier", "Capturer", + "CantReachAir", "Settlers", "CanHide", "WillNever", "SentryAlways" +roles = "DefendGood", "Partisan", "BarbarianTech" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:wind walker") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 250, 300, 350, 400 +veteran_move_bonus = 0, 2, 4, 6, 8, 10, 12 helptext = _("\ Partisans are guerilla fighters who can use the terrain to their advantage. Like the Scout\ - that they upgrade, they can slip through ZOC and live off the land with no upkeep. \ + that they upgrade, they can slip through ZOC and live off the land with no upkeep, and gain\ + +²⁄₉ move per veteran level. Partisans provide sentry intel even if not sentried. \n\ "), _("\ Proportional to city size, up to 8 Partisans appear when an enemy conquers your city. They\ randomly fortify on any tile inside the circle defined by its workable radius. Partisans\ @@ -1547,31 +1606,84 @@ hitpoints = 20 firepower = 1 move_rate = 2 vision_radius_sq = 4 -convert_to = "Workers" +convert_to = "Workers II" convert_time = 2 transport_cap = 0 fuel = 0 city_size = 2; ...xxxxx..., 1, 0 use bombard_stay_fortified on a non-bombard unit to specify can remain fortified when attacking. -paratroopers_mr_sub = 0 ;00,0000,000,0,0 iPill_rand_tgts=0, iPill_odds=-0 pentads, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 +paratroopers_mr_sub = 0 ;000,00000,00,0000,000,0,0 max_ATKs=0, bbd_retal_rate=0, iPill_rand_tgts=0, iPill_odds=-0 pentads, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 ;NOTE:iPillage changes in rules require client_rules_flag and get_what_can_unit_pillage_from() changes. uk_happy = 1 -uk_shield = 1 +uk_shield = 0 uk_food = 0 -uk_gold = 0 +uk_gold = 1 embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only disembarks = "LandRoad", "LandRail", "Helicopter" targets = "Balloon", "Helicopter", "LandRail" -flags = "MultiSlot", "FootSoldier", "Capturer", "CantReachAir", "Shield2Gold", "Settlers", "CanHide", "WillNever" +flags = "MultiSlot", "FootSoldier", "Capturer", + "CantReachAir", "Settlers", "CanHide", "WillNever" roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild" helptext = _("\ Riflemen are World War-era infantry. They are good at defending cities and\ strategic Fortresses. They also have good attack capability. \ "), _("\ Under Communism this unit costs 5 less. Also, Communism tech allows Communist\ - governments to de-commission Riflemen into Workers via the Convert order. And vice versa. \ + governments to de-commission Riflemen into Workers II via the Convert order. And vice versa. \ +") + +[unit_zealots] +name = _("Zealots") +class = "Land" +tech_req = "Conscription" +gov_req = "Theocracy" +obsolete_by = "None" +graphic = "u.zealots" +graphic_alt = "u.fanatics" +sound_move = "m_fanatics" +sound_move_alt = "m_generic" +sound_fight = "f_zealots" +sound_fight_alt = "f_riflemen" +build_cost = 20 +pop_cost = 0 +attack = 4 +defense = 4 +hitpoints = 20 +firepower = 1 +move_rate = 2 +vision_radius_sq = 4 +transport_cap = 0 +fuel = 0 +city_size = 1080; 000000,0,100,001110,0,0 = atk_bonus=0, max_kills=0, targets=4, move_cost=14 frags, sty_frtfy=0, reserved = 0 +uk_happy = 2 +uk_shield = 0 +uk_food = 0 +uk_gold = 1 +embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only +disembarks = "LandRoad", "LandRail", "Helicopter" +targets = "Balloon", "Helicopter", "LandRail" +flags = "Fanatic", "FootSoldier", "Capturer", "CantReachAir", "Unbribable", "Bombarder", + "Settlers", "CanHide", "MultiSlot", "WillNever" +roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild" +helptext = _("\ +Zealots are warriors devoted to a higher cause. Their faith\ + is strong and they cannot be bribed. \ "), _("\ -\nThe discovery of Banking changes upkeep from shields to gold.\ +Theocratic nations can maintain Zealots without paying\ + their steep upkeep. (Zealots are unhappy if not under Theocracy,\ + requiring high upkeep to stay content.) Zealots\ + produced in a city with Ecclesiastical Palace are inspired by\ + fervorous faith to +1 higher veteran level. \n\ +"), _("\ +Zealots fervently defend their homeland, and can do surprise skirmish\ + assaults to snipe and injure foreign occupants:Up to 4 invaders\ + on the tile will endure three combat rounds without defense. Skirmish\ + assaults can also be done to foreign occupied cities if they have\ + a remaining Foreign National population. \n\ +"), _("\ +Zealots can Estabish Home City in any allied city that is Theocracy,\ + allowing control to pass between nations who share the same faith.\ ") +bombard_rate = 3 [unit_alpine_troops] name = _("Alpine Troops") @@ -1595,21 +1707,19 @@ vision_radius_sq = 4 transport_cap = 0 fuel = 0 uk_happy = 1 -uk_shield = 1 +uk_shield = 0 uk_food = 0 -uk_gold = 0 +uk_gold = 1 embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only disembarks = "LandRoad", "LandRail", "Helicopter" targets = "Balloon", "Helicopter", "LandRail" -flags = "MultiSlot", "IgTer", "FootSoldier", "Capturer", "CantReachAir", "Shield2Gold", - "Settlers", "CanHide", "WillNever" +flags = "MultiSlot", "IgTer", "FootSoldier", "Capturer", + "CantReachAir", "Settlers", "CanHide", "WillNever" roles = "DefendGood", "DefendGoodStartUnit" helptext = _("\ Alpine Troops are highly mobile units and\ excellent defenders. Similar to a Scout, they\ treat every land tile like a road were on it. \ -"), _("\ -\nThe discovery of Banking changes upkeep from shields to gold.\ ") [unit_marines] @@ -1634,18 +1744,18 @@ vision_radius_sq = 8 ; hard-coded the +4 extra for effect_physics_vision since transport_cap = 0 fuel = 0 city_size = 2618 ; 000000,001,010,001110,1,0 = atk_bonus=0, max_kills=1, targets=2, move_cost=14 frags, stay_frtfy=1, reserved = 0 -paratroopers_mr_sub = 1 ;00,0000,000,0,1 iPill_rand_tgts=0, iPill_odds=-0 pentads, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=1 +paratroopers_mr_sub = 1 ;000,00000,00,0000,000,0,1 max_ATKs=0, bbd_retal_rate=0, iPill_rand_tgts=0, iPill_odds=-0 pentads, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=1 ;NOTE:iPillage changes in rules require client_rules_flag and get_what_can_unit_pillage_from() changes. uk_happy = 1 -uk_shield = 1 +uk_shield = 0 uk_food = 0 -uk_gold = 0 +uk_gold = 1 embarks = "Helicopter", "Land", "Sea", "LandRoad", "LandRail" disembarks = "Helicopter", "Land", "Sea", "LandRoad", "LandRail" targets = "Sea", "Balloon", "Helicopter", "LandRail", "Zeppelin" -flags = "MultiSlot", "Marines", "FootSoldier", "BeachLander", "Capturer", - "NeverBlocked", "Shield2Gold", "Settlers", "CanHide", "WillNever", - "Airbase", "CanFortress", "Bombarder"; can Fort only, actually. +flags = "MultiSlot", "NonNativeAttack", "FootSoldier", "BeachLander", + "Capturer", "NeverBlocked", "Settlers", "CanHide", "WillNever", + "Airbase", "Bombarder", "CanFortress"; can Fort only, actually. veteran_names = _("?vet_rank:green"), _("?vet_rank:veteran"), @@ -1660,22 +1770,22 @@ veteran_power_fact = 100, 150, 175, 250, 300, 350, 400 veteran_move_bonus = 0, 2, 4, 6, 8, 10, 12 roles = "DefendOk", "DefendOkStartUnit", "BarbarianSeaTech" helptext = _("\ -Marines are experts at all-terrain warfare. They are the strongest\ - foot unit in the game, and are armed with diverse weaponry. \n\ - Unlike other units, Marines can attack Sea units (at a 50% penalty).\ - Air units do not stop them from attacking reachable targets.\ - They can attack while fortified and maintain fortified status.\ - They can attack from a Transport or Helicopter, and can offload\ - without losing a turn of movement. Marines can also makes Forts\ - and Airbases. Marines get an extra 2/9 movement points for each\ - veteran level they possess. Starting at v2, they gain the ability\ - to do Bazooka ranged attacks for 3 combat rounds, hitting up to 2\ - units on the tile and killing a maximum of 1. Bazooka attacks can\ - be done to Oceanic tiles if the Marines are not transported. \n\ - Marines built in a city with an Airport, Port Facility, and Barracks III\ - receive an extra veteran level. \ -"), _("\ -\nThe discovery of Banking changes upkeep from shields to gold.\ +Marines are experts at all-terrain warfare. Armed with diverse\ + weaponry, they are the strongest foot unit, with special abilities.\ + They can:\n\ + ▪ Attack Sea units (at a 50% penalty). \n\ + ▪ Attack and remain fortified. \n\ + ▪ Attack from a Transport or Helicopter. \n\ + ▪ Attack reachable units protected by Fighters. \n\ + ▪ Do v2 Bazooka attacks:3 rounds, 2 units, 1 kill \n\ + ▪ Bazooka attack ocean tiles, if not transported. \n\ + ▪ Disembark from non-native tiles with 1 move. \n\ + ▪ De/board,un/load without using moves. \n\ + ▪ Make Forts and Airbases. \n\ +"), _(" +Marines gain greater strength bonuses with veterancy, and +2/9\ + move for each veteran level. Marines built in a city with an\ + Airport, Port Facility, and Barracks III get an extra veteran level.\ ") bombard_rate = 3 @@ -1700,15 +1810,16 @@ move_rate = 2 vision_radius_sq = 4 transport_cap = 0 fuel = 0 -paratroopers_mr_sub = 1 ;00,0000,000,0,1 iPill_rand_tgts=0, iPill_odds=-0 pentads, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=1 +paratroopers_mr_sub = 1 ;000,00000,00,0000,000,0,1 max_ATKs=0, bbd_retal_rate=0, iPill_rand_tgts=0, iPill_odds=-0 pentads, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=1 uk_happy = 1 -uk_shield = 1 +uk_shield = 0 uk_food = 0 -uk_gold = 0 +uk_gold = 1 embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only disembarks = "LandRoad", "LandRail", "Helicopter" targets = "Balloon", "Helicopter", "LandRail", "Zeppelin" -flags = "FootSoldier", "Capturer", "CantReachAir", "Shield2Gold", "MultiSlot", "Settlers", "CanHide", "WillNever" +flags = "MultiSlot", "FootSoldier", "Capturer", + "CantReachAir", "Settlers", "CanHide", "WillNever" roles = "DefendOk", "DefendOkStartUnit" veteran_names = _("?vet_rank:green"), @@ -1751,14 +1862,14 @@ vision_radius_sq = 4 transport_cap = 0 fuel = 0 uk_happy = 1 -uk_shield = 1 +uk_shield = 0 uk_food = 0 -uk_gold = 0 +uk_gold = 1 embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only disembarks = "LandRoad", "LandRail", "Helicopter" targets = "Balloon", "Helicopter", "LandRail", "Zeppelin" -flags = "Paratroopers", "FootSoldier", "Capturer", "CantReachAir", "Provoking", - "Shield2Gold", "MultiSlot", "Settlers", "CanHide", "WillNever" +flags = "MultiSlot", "Paratroopers", "FootSoldier", "Capturer", + "CantReachAir", "Provoking", "Settlers", "CanHide", "WillNever" roles = "DefendOk", "DefendOkStartUnit" helptext = _("\ Paratroopers are experts at airborne attacks.\ @@ -1768,8 +1879,6 @@ Paratroopers are experts at airborne attacks.\ as Paratroopers landing on a tile occupied by enemy units will be lost.\ Also note:Paradropping is assumed to be done from aircraft. Therefore,\ Fighters on Vigil may auto-attack the tile you land on, if adjacent. \ -"), _("\ -\nThe discovery of Banking changes upkeep from shields to gold.\ ") paratroopers_range = 14 paratroopers_mr_req = 1 @@ -1779,7 +1888,7 @@ paratroopers_mr_sub = 0 name = _("Mechanized Infantry") rule_name = "Mech. Inf." class = "Land" -tech_req = "Labor Union" +tech_req = "Mechanization" obsolete_by = "None" graphic = "u.mech_inf" graphic_alt = "-" @@ -1798,19 +1907,71 @@ vision_radius_sq = 4 transport_cap = 0 fuel = 0 uk_happy = 1 -uk_shield = 1 +uk_shield = 0 uk_food = 0 -uk_gold = 0 +uk_gold = 1 embarks = "Helicopter" ; transport helicopter only ;disembarks = "Helicopter" targets = "Balloon", "Helicopter", "LandRail", "Zeppelin" -flags = "CantReachAir", "Shield2Gold", "MultiSlot", "WillNever" +flags = "MultiSlot", "Shield2Gold", "CantReachAir", "WillNever" roles = "DefendGood", "DefendGoodStartUnit" helptext = _("\ Mechanized Infantry have the strongest general defense strength of any land unit.\ They have decent attack strength in open field engagements, and excellent mobility. \ -"), _("\ -\nUpkeep for Mechanized infantry is paid in gold instead of shields.\ +") + +[unit_scout] +name = _("Scout") +class = "Land" +tech_req = "Horseback Riding" +obsolete_by = "Partisan" +graphic = "u.scout" +graphic_alt = "-" +sound_move = "m_explorer" +sound_move_alt = "m_generic" +sound_fight = "f_horsemen" +sound_fight_alt = "f_generic" +build_cost = 18 +pop_cost = 0 +attack = 0 +defense = 1 +hitpoints = 8 +firepower = 1 +move_rate = 1 +vision_radius_sq = 5 +transport_cap = 0 +fuel = 0 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +embarks = "LandRoad", "Helicopter" ; transport helicopter only +disembarks = "LandRoad", "Helicopter" +flags = "IgTer", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Expellable", "Cant_Pillage", "NoHome", "Horse", "SentryAlways" +roles = "Explorer", "ExplorerStartUnit" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:wind walker") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 250, 300, 350, 400 +veteran_move_bonus = 3, 5, 7, 9, 11, 13, 15 +helptext = _("\ +Scouts are explorers of unknown territory. They live off the land with no upkeep.\ + They can slip through ZOC. They ignore terrain penalties, treating every tile as\ + if it had a road. They can move 4 tiles per turn (6 after discovering Map Making.)\ + For each veteran level, they gain an additional +²⁄₉ move point. Scouts can Investigate City\ + to gather intel, and their terrain scouting can give tactical advantage. Scouts can make\ + contact with far-off lands to arrange Cease-fire or Peace. In later times, Scouts upgrade\ + to Partisans. \n\ +"), _(" +Scouts provide sentry intel even if not sentried. Scouts gain the same veteran levels\ + from buildings and wonders as other land units.\ ") [unit_horsemen] @@ -1909,21 +2070,21 @@ Elephants are towering animals trained for war. Their mobility and formidable\ defend poorly against most units.\ ") -[unit_crusaders] -name = _("Crusaders") -class = "Land" -tech_req = "Monotheism" +[unit_knights] +name = _("Knights") +class = "LandNoKill" +tech_req = "Chivalry" obsolete_by = "Dragoons" -graphic = "u.crusaders" +graphic = "u.knights" graphic_alt = "-" -sound_move = "m_crusaders" +sound_move = "m_knights" sound_move_alt = "m_generic" -sound_fight = "f_crusaders" +sound_fight = "f_knights" sound_fight_alt = "f_generic" build_cost = 38 pop_cost = 0 -attack = 5 -defense = 1 +attack = 4 +defense = 2 hitpoints = 10 firepower = 1 move_rate = 4 @@ -1934,28 +2095,33 @@ uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 +bonuses = + { "flag", "type", "value" + "Horse", "DefenseMultiplierPct", 50 + } flags = "Horse", "Capturer", "CantReachAir", "WillNever" -roles = "AttackFastStartUnit" +roles = "AttackFastStartUnit", "BarbarianTech", + "BarbarianBuildTech", "BarbarianSeaTech", "Hunter" helptext = _("\ -Crusaders are mounted warriors driven by a higher cause.\ - They have superior attack to Knights, but are poor at defending.\ - They are ideally suited for leading the charge in offensive campaigns.\ +Knights are heavily armored mounted warriors. They defend at D3 against mounted units.\ + Their noble status allows them to attack cities without population reduction, and\ + conquer a size 1 city without destroying it.\ ") -[unit_knights] -name = _("Knights") -class = "LandNoKill" -tech_req = "Chivalry" +[unit_crusaders] +name = _("Crusaders") +class = "Land" +tech_req = "Monotheism" obsolete_by = "Dragoons" -graphic = "u.knights" +graphic = "u.crusaders" graphic_alt = "-" -sound_move = "m_knights" +sound_move = "m_crusaders" sound_move_alt = "m_generic" -sound_fight = "f_knights" +sound_fight = "f_crusaders" sound_fight_alt = "f_generic" build_cost = 38 pop_cost = 0 -attack = 4 +attack = 5 defense = 1 hitpoints = 10 firepower = 1 @@ -1969,16 +2135,21 @@ uk_food = 0 uk_gold = 0 bonuses = { "flag", "type", "value" - "Horse", "DefenseMultiplier", 2 - "FootSoldier", "DefenseMultiplier", 1 + ; Crease Base Defense of 3.5. Use flags to include all unit_types with no overlap: + "CantReachAir", "DefenseMultiplierPct", 50 ; all military Land, Sea, Bombers, EXCEPT AAA, Mobile SAM, AEGIS + "AntiAir", "DefenseMultiplierPct", 50 ; AAA, Mobile SAM, AEGIS + "NonMil", "DefenseMultiplierPct", 50 ; all NonMil units + "AirAttacker", "DefenseMultiplierPct", 50 ; Aircraft (including Bombers) + "FieldUnit", "DefenseMultiplierPct", -50 ; Cancel overlapped doubled bonus on Bombers. } flags = "Horse", "Capturer", "CantReachAir", "WillNever" -roles = "AttackFastStartUnit", "BarbarianTech", - "BarbarianBuildTech", "BarbarianSeaTech", "Hunter" +roles = "AttackFastStartUnit" helptext = _("\ -Knights are heavily armored mounted warriors. They defend at D:3 against mounted units.\ - They defend at D:2 against foot units. They defend at D:1 against everything else.\ - Their noble status allows them to attack cities without population reduction.\ +Crusaders are mounted warriors driven by a higher cause.\ + They have superior attack to Knights, but are only half\ + as good at defending against mounted units.\ + They are ideally suited for leading the charge in offensive\ + campaigns.\ ") [unit_dragoons] @@ -2066,7 +2237,7 @@ sound_fight = "f_armor" sound_fight_alt = "Blitz Sack" build_cost = 80 pop_cost = 0 -attack = 10 +attack = 11 defense = 5 hitpoints = 30 firepower = 1 @@ -2074,7 +2245,7 @@ move_rate = 6 vision_radius_sq = 4 transport_cap = 0 fuel = 0 -paratroopers_mr_sub = 170 ;00,0101,010,1,0 iPill_rand_tgts=0, iPill_odds=-5 pentads=75%, iPill_moves=2, iPillage=1, ATK_Stay_Fortified=0 +paratroopers_mr_sub = 170 ;000,00000,00,0101,010,1,0 max_ATKs=0, bbd_retal_rate=0, iPill_rand_tgts=0, iPill_odds=-5 pentads=75%, iPill_moves=2, iPillage=1, ATK_Stay_Fortified=0 ;NOTE:iPillage changes in rules require client_rules_flag and get_what_can_unit_pillage_from() changes. uk_happy = 1 uk_shield = 1 @@ -2083,13 +2254,15 @@ uk_gold = 0 embarks = "Helicopter" ; transport helicopter only ;disembarks = "Helicopter" targets = "Balloon", "Helicopter", "LandRail", "Zeppelin" -flags = "CantReachAir", "FortBuster", "WillNever" +flags = "CantReachAir", "FortBuster", "WillNever", "CanEscape" roles = "AttackFastStartUnit", "Hunter" helptext = _("\ Armor is the mechanized equivalent of a Cavalry unit. They have high attack strength,\ superb mobility, and the highest defense of any offensive unit. They are massive all-terrain\ vehicles, well-suited for penetrating defensive fortifications:Units inside Forts get no defense\ - bonus against Armor. Units inside Fortresses get a reduced bonus of 1.67× instead of 2×.\ + bonus against Armor. Units inside Fortresses get a reduced bonus of 1.67× instead of 2×. \n\ +Communists pay 10 less for this unit.\ + Stack-Escape:40% odds to evade stack-death if attacker doesn’t have more moves than it does.\ ") [unit_armor_ii] @@ -2113,7 +2286,7 @@ move_rate = 6 vision_radius_sq = 4 transport_cap = 0 fuel = 0 -paratroopers_mr_sub = 170 ;00,0101,010,1,0 iPill_rand_tgts=0, iPill_odds=-5 pentads=80%, iPill_moves=2, iPillage=1, ATK_Stay_Fortified=0 +paratroopers_mr_sub = 170 ;000,00000,00,0101,010,1,0 max_ATKs=0, bbd_retal_rate=0, iPill_rand_tgts=0, iPill_odds=-5 pentads=80%, iPill_moves=2, iPillage=1, ATK_Stay_Fortified=0 ;NOTE:iPillage changes in rules require client_rules_flag and get_what_can_unit_pillage_from() changes. uk_happy = 1 uk_shield = 1 @@ -2124,16 +2297,17 @@ embarks = "Helicopter" ; transport helicopter only targets = "Balloon", "Helicopter", "LandRail", "Zeppelin" bonuses = { "flag", "type", "value" - "Missile", "DefenseMultiplier", 1 + "Missile", "DefenseMultiplierPct", 50 } -flags = "CantReachAir", "FortressBuster", "NeverBlocked", "WillNever" +flags = "CantReachAir", "FortressBuster", "NeverBlocked", "WillNever", "CanEscape" roles = "AttackFastStartUnit", "Hunter" helptext = _("\ Armor II is the ultra-modern upgrade to Armor. It features high tech composite armor and\ electronic countermeasures (ECM). Forts and Fortresses gain no bonus against\ its ability to blast and break through fortifications. ECM and composite armor\ - give a 2× defense bonus against Missiles. Unlike most land units,\ - Armor II can attack reachable units regardless of whether unreachable units protect the tile.\ + give a 50% defense bonus against Missiles. Unlike most land units,\ + Armor II can attack reachable units regardless of whether unreachable units protect the tile. \n\ +Stack-Escape:40% odds to evade stack-death if attacker doesn’t have more moves than it does.\ ") [unit_catapult] @@ -2157,25 +2331,28 @@ move_rate = 2 vision_radius_sq = 4 transport_cap = 0 fuel = 0 -city_size = 2304 ; 000000,001,001,000000,00 = atk_bonus=0, max_kills=1, targets=1, move_cost=0 frags, stay_fortfy=0, reserved = 0 -paratroopers_mr_sub = 8192 ; 00100,00,0000,000,0,0 - bbd_retal_rate=4, iPill_rand_tgts=0, iPill_odds=0, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 +city_size = 2306 ; 000000,001,001,000000,10 = atk_bonus=0, max_kills=1, targets=1, move_cost=0 frags, stay_fortfy=1, reserved = 0 +paratroopers_mr_sub = 8192 ; 000,00100,00,0000,000,0,0 - max_ATKs=0, bbd_retal_rate=4, iPill_rand_tgts=0, iPill_odds=0, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 -flags = "CantReachAir", "WillNever" +flags = "CantReachAir", "Bombarder", "Reserved1" ;autoattacks (!NonMil) targets instead of "Provoking" targets roles = "" helptext = _("\ -Catapults are large rock-throwing war machines.\ - The ballistic delivery of massive\ - stones diminishes the defense bonus vs. land attacks by Fortifications and\ - City Walls by -25%, yielding a 1.25× and 2.75× bonus, respectively. \n\ +Catapults are rock-throwing war machines. Massive stones diminish\ + the defense bonus of City Walls by -25%, down to 1.75×. \n\ +"), _(" +If they haven’t moved, Catapults can do 4 rounds of Bombardment\ + on a single unit, which may possibly be killed. When special\ + attacked from range or rammed in a Fortress, they can retaliate\ + with the same type of Bombardment. \n\ +Catapults are weak defenders, and need an escort to be effective.\ "), _(" -Catapults are weak defenders, and will need an escort to be effective.\ - Even so, it is better to rush attack them than do special unit attacks\ - from range: when attacked from range or rammed in a Fortress, Catapults\ - can retaliate for 4 rounds of combat.\ +VIGIL:the Vigil order lets Catapults auto-Bombard adjacent military units if they\ + have better attack odds. Can be done in cities or bases if it has used no moves. \n\ ") +bombard_rate = 4 [unit_siege_ram] name = _("Siege Ram") @@ -2198,7 +2375,7 @@ move_rate = 2 vision_radius_sq = 4 transport_cap = 1 fuel = 0 -city_size = 507960 ; 011111,000,000,001110,00 = atk_bonus=8.75x, max_kills=0, targets=all, move_cost=14 frags, stay_fortfy=0, reserved = 0 +city_size = 507960 ; 011111,000,000,001110,00 = atk_bonus=8.75×, max_kills=0, targets=all, move_cost=14 frags, stay_fortfy=0, reserved = 0 uk_happy = 1 uk_shield = 1 uk_food = 0 @@ -2218,13 +2395,70 @@ Siege Rams may also ram Fortresses, doing up to 4hp of damage\ Siege Rams can only travel by road. They can carry 1 Land\ unit as cargo:their slow pace means this serves more for\ disguise or defense. \n\ -Siege Rams need an escort for protection. They need a minimum of\ +Siege Rams need a minimum of\ 1 move point to attack a Fortress or City Walls.\ Cities protected by the Great Wall are immune to Siege Rams. \n\ The discovery of Metallurgy by any nation incapacitates Siege Rams.\ ") bombard_rate = 4 +[unit_ballista] +name = _("Ballista") +class = "Land" +tech_req = "Engineering" +obsolete_by = "Cannon" +graphic = "u.ballista_o" +graphic_alt = "-" +sound_move = "m_catapult" +sound_move_alt = "m_generic" +sound_fight = "f_ballista" +sound_fight_alt = "f_generic" +build_cost = 45 +pop_cost = 0 +attack = 1 +defense = 1 +hitpoints = 10 +firepower = 5 +move_rate = 2 +vision_radius_sq = 4 +transport_cap = 0 +fuel = 0 +city_size = 4680 ; 000000,010,010,010010,00 = atk_bonus=0, max_kills=2, targets=2, move_cost=18 frags, stay_fortfy=0, reserved = 0 +paratroopers_mr_sub = 10241 ; 000,00101,00,0000,000,0,1 - max_ATKs=0, bbd_retal_rate=5, iPill_rand_tgts=0, iPill_odds=0, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=1 +uk_happy = 1 +uk_shield = 1 +uk_food = 0 +uk_gold = 0 +flags = "CantReachAir", "Bombarder", "CantAttack", "Reserved1" ;autoattacks (!NonMil) targets instead of "Provoking" targets +bonuses = + { "flag", "type", "value" + "Horse", "DefenseMultiplierPct", -80 + "FootSoldier", "DefenseMultiplierPct", -80 + } +roles = "" +helptext = _("\ +Ballistae don’t conventionally attack. Ranged Attack fires\ + massive bolts through enemy formations for 5 rounds,\ + targeting up to 2 units who can’t conventionally retaliate.\ + This may also target Ocean tiles. They must have all their\ + move points to do attack, and can't target Fortresses\ + or Cities. Though they only have A1 accuracy, 5FP causes 5× damage. \n\ +"), _(" +When conventionally defending against foot and mounted units,\ + Ballistae defend at 20% defense strength (0.2). This roughly cancels\ + the 5× damage, making them like a D1 defender. However, a lucky hit\ + or strong defensive terrain can reveal the 5FP as very effective.\ + Against other attackers, the 5× damage is a deadly deterrent. \n\ +"), _(" +Ballistae excel at degrading forts and well-fortified tiles. Defensively,\ + they are capable of Special Unit Defense, reciprocating against ranged\ + attacks with their own retaliatory attack. \n\ +"), _(" +VIGIL:the Vigil order lets Ballistae automatically Range-Attack adjacent military units\ + if they have better attack odds. Can be done in cities or bases if it has used no moves. \n\ +") +bombard_rate = 5 + [unit_cannon] name = _("Cannon") class = "Land" @@ -2246,8 +2480,8 @@ move_rate = 2 vision_radius_sq = 4 transport_cap = 0 fuel = 0 -city_size = 2560 ; 000000,001,010,000000,00 = atk_bonus=0, max_kills=1, targets=2, move_cost=0 frags, stay_fortfy=0, reserved = 0 -paratroopers_mr_sub = 10240 ; 00101,00,0000,000,0,0 - bbd_retal_rate=5, iPill_rand_tgts=0, iPill_odds=0, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 +city_size = 2562 ; 000000,001,010,000000,10 = atk_bonus=0, max_kills=1, targets=2, move_cost=0 frags, stay_fortfy=1, reserved = 0 +paratroopers_mr_sub = 10240 ; 000,00101,00,0000,000,0,0 - max_ATKs=0, bbd_retal_rate=5, iPill_rand_tgts=0, iPill_odds=0, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 uk_happy = 1 uk_shield = 1 uk_food = 0 @@ -2255,20 +2489,22 @@ uk_gold = 0 embarks = "Helicopter" ; transport helicopter only disembarks = "Helicopter" targets = "LandRail" -flags = "CantReachAir", "WillNever" +flags = "CantReachAir", "Bombarder", "Reserved1" ;autoattacks (!NonMil) targets instead of "Provoking" targets roles = "BarbarianTech", "BarbarianBuildTech" helptext = _("\ -Cannons are huge guns that use gunpowder to fire massive metallic projectiles\ - much faster and more accurately than earlier ballistic weapons. The\ - aerial delivery of high speed massive metal gives an edge against\ - Fortifications and City Walls. The defense bonuses vs. land attacks from those\ - are reduced by -50%. This leaves Fortifications only with their terrain bonus,\ - and reduces City walls to 2.5x. \n\ +Cannons are guns that fire massive metallic projectiles faster and\ + more accurately than earlier ballistic weapons. This reduces the\ + defense bonuses of City Walls in half, down to 1.5×. \n\ +"), _(" +If they haven’t moved, Cannons can do 5 rounds of Bombardment\ + on two units, with one possible fatality. When special attacked\ + from range or rammed in a Fortress, they can retaliate with the\ + same type of Bombardment.\ "), _(" -While Cannons are strong attackers, they are also weak defenders. Yet\ - they are not without defensive purpose. They can retaliate 5 rounds\ - of bombardment against special unit attacks from other units.\ +VIGIL:the Vigil order lets Cannons auto-Bombard adjacent military units if they\ + have better attack odds. Can be done in cities or bases if it has used no moves. \n\ ") +bombard_rate = 5 [unit_artillery] name = _("Artillery") @@ -2291,8 +2527,8 @@ move_rate = 2 vision_radius_sq = 4 transport_cap = 0 fuel = 0 -city_size = 2816 ; 000000,001,011,000000,00 = atk_bonus=0, max_kills=1, targets=3, move_cost=0 frags, stay_fortfy=0, reserved = 0 -paratroopers_mr_sub = 12288 ; 00110,00,0000,000,0,0 - bbd_retal_rate=6, iPill_rand_tgts=0, iPill_odds=0, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 +city_size = 2818 ; 000000,001,011,000000,10 = atk_bonus=0, max_kills=1, targets=3, move_cost=0 frags, stay_fortfy=1, reserved = 0 +paratroopers_mr_sub = 12288 ; 000,00110,00,0000,000,0,0 - max_ATKs=0, bbd_retal_rate=6, iPill_rand_tgts=0, iPill_odds=0, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 uk_happy = 1 uk_shield = 1 uk_food = 0 @@ -2300,25 +2536,26 @@ uk_gold = 0 embarks = "Helicopter" ; transport helicopter only disembarks = "Helicopter" targets = "Balloon", "LandRail", "Zeppelin" -flags = "CantReachAir", "WillNever" +flags = "CantReachAir", "Bombarder", "Reserved1" ;autoattacks (!NonMil) targets instead of "Provoking" targets roles = "" helptext = _("\ -Artillery are a major upgrade to Cannons, with doubled firepower. Accuracy\ - and projectile speed go to a whole new level. Thus, they have an\ - even greater bonus than their predecessors against Fortifications\ - and City Walls. Such bonuses are reduced -75%. This leaves Fortifications\ - only with their terrain bonus, and reduces the bonus from Walls down to 2.25x. \n\ +Artillery upgrade Cannons with doubled firepower. Against Artillery,\ + the bonus of City Walls is reduced -50% down to 1.5×. \n\ "), _(" -Like their predecessors, Artillery are poor at defense, and need an\ - escort to be effective. However, they can retaliate 6 rounds of bombardment\ - against special unit attacks from other units.\ +If they haven’t moved, Artillery can do 6 rounds of Bombardment\ + on three units, with one possible fatality. When special attacked\ + from range, they retaliate with the same type of Bombardment.\ +"), _(" +VIGIL:the Vigil order lets Artillery auto-Bombard adjacent military units if they\ + have better attack odds. Can be done in cities or bases if it has used no moves. \n\ ") +bombard_rate = 6 [unit_anti_aircraft] name = _("Anti-Aircraft Artillery") class = "LandAirSea" tech_req = "Flight" -obsolete_by = "None" +obsolete_by = "None" ; allows making AAA to defend helis or reduced costs graphic = "u.anti_aircraft" graphic_alt = "-" sound_move = "m_anti_aircraft" @@ -2334,9 +2571,10 @@ firepower = 2 move_rate = 2 vision_radius_sq = 8; hard-coding in physics bonus here since its a req, lets us cut making a new effect convert_to = "Mobile SAM" -convert_time = 7 +convert_time = 5 transport_cap = 0 fuel = 0 +paratroopers_mr_sub = 1 ;000,00000,00,0000,000,0,1 max_ATKs=0, bbd_retal_rate=0, iPill_rand_tgts=0, iPill_odds=-0 pentads, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=1 uk_happy = 1 uk_shield = 0 uk_food = 0 @@ -2349,18 +2587,16 @@ bonuses = "AirAttacker", "DefenseDivider", 1 "AirAttacker", "DefenseMultiplier", 1 } -flags = "NeverBlocked", "AntiAir", "Marines", "WillNever", "TransportDefender" +flags = "NeverBlocked", "AntiAir", "WillNever", "TransportDefender", "NonNativeAttack" roles = "" helptext = _("\ -Anti-Aircraft Artillery (AAA) can attack almost anything from anywhere. AAA get a\ - 2× bonus against Air units. AAA qualify as weaponry for Marines and have the same\ - abilities:they can be transported on any unit that carries Marines, can attack from\ - or to non-native tiles, and do not lose a turn when unloading. Transported AAA can\ - defend their tile on both Land and Sea. (AAA can’t attack Submarines, Missiles,\ - or Jet Bombers.)\ +Anti-Aircraft Artillery (AAA) get a 2× bonus against Air units. They can attack any tile.\ + They can be transported by any unit that can carry Marines.\ + Transported AAA can always defend their tile, even at sea. AAA can’t attack while transported,\ + and cannot attack Submarines, Missiles, and High Altitude aircraft.\ "), _(" -After Space Flight and 10 turns of service, AAA can be retrofitted to\ - Mobile SAM. The Convert order must be done in your capital, and takes 4 turns.\ +After Space Flight and 9 turns of service, AAA can be retrofitted to\ + Mobile SAM. The Convert order must be done in a domestic capital, and takes 3 turns.\ ") [unit_mobile_sam] @@ -2382,7 +2618,7 @@ hitpoints = 30 firepower = 2 move_rate = 6 vision_radius_sq = 4 -transport_cap = 1 +transport_cap = 2 fuel = 0 uk_happy = 1 uk_shield = 1 @@ -2396,17 +2632,21 @@ bonuses = { "flag", "type", "value" "AirAttacker", "DefenseDivider", 1 "AirAttacker", "DefenseMultiplier", 1 + "Missile", "DefenseMultiplier", 1 } -flags = "NeverBlocked", "AntiAir", "WillNever" +flags = "NeverBlocked", "AntiAir", "WillNever", "TransportDefender", "NonNativeAttack" roles = "" helptext = _("\ The Mobile SAM is the strongest Anti-Air unit on the ground. It can\ - attack nearby aircraft. It has a 2× bonus against all Air units. The\ - Mobile SAM can also carry one Missile of any type. Unlike the AAA, it\ - can’t attack non-native tiles or attack while transported.\ + attack nearby aircraft. It has a 2× bonus against all Air and Missile\ + units. The Mobile SAM can also carry two Missiles of any type. Like\ + the AAA, it can attack non-native tiles but not while transported.\ + Transported Mobile SAMs can always defend their tile, even at sea.\ + The discovery of Laser gives all units on its tile a 33% chance to\ + survive nuclear attack. \n\ "), _(" -AAA can upgrade to Mobile SAM for free on its 10th turn of service.\ - The Convert order must be done in the capital city and takes 4 turns.\ +AAA can upgrade to Mobile SAM for free on its 9th turn of service.\ + The Convert order must be done in a domestic city and takes 3 turns.\ ") [unit_howitzer] @@ -2430,25 +2670,30 @@ move_rate = 4 vision_radius_sq = 4 transport_cap = 0 fuel = 0 -city_size = 3072 ; 000000,001,100,000000,00 = atk_bonus=0, max_kills=1, targets=4, move_cost=0 frags, stay_fortfy=0, reserved = 0 -paratroopers_mr_sub = 14336 ; 00111,00,0000,000,0,0 - bbd_retal_rate=7, iPill_rand_tgts=0, iPill_odds=0, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 -uk_happy = 1 +city_size = 3074 ; 000000,001,100,000000,10 = atk_bonus=0, max_kills=1, targets=4, move_cost=0 frags, stay_fortfy=1, reserved = 0 +paratroopers_mr_sub = 14336 ; 000,00111,00,0000,000,0,0 - max_ATKs=0, bbd_retal_rate=7, iPill_rand_tgts=0, iPill_odds=0, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 +uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 embarks = "Helicopter" ; transport helicopter only disembarks = "Helicopter" targets = "Balloon", "LandRail", "Zeppelin" -flags = "CantReachAir", "WillNever" +flags = "CantReachAir", "Bombarder", "Reserved1" ;autoattacks (!NonMil) targets instead of "Provoking" targets roles = "" helptext = _("\ -Howitzers are upgraded Artillery with a terrifying increase to mobility and attack strength.\ - Fortifications get no bonus except their terrain bonus, and City Walls\ - are completely ineffective against Howitzers. \n\ +Howitzers are upgraded Artillery with a terrifying increase to mobility and attack\ + strength. City Walls are completely ineffective against Howitzers. \n\ "), _(" -While Howitzers are vulnerable when not escorted, they can retaliate 7 rounds of bombardment\ - against special unit attacks from other units. This is a strong deterrent.\ +If they haven’t moved, Howitzers can do 7 rounds of Bombardment\ + on four units, with one possible fatality. When special attacked\ + from range, they can retaliate with the same type of Bombardment.\ + This is a strong deterrent.\ +"), _(" +VIGIL:the Vigil order lets Howitzers auto-Bombard adjacent military units if they\ + have better attack odds. Can be done in cities or bases if it has used no moves. \n\ ") +bombard_rate = 7 [unit_balloon] name = _("Balloon") @@ -2475,7 +2720,7 @@ uk_happy = 0 uk_shield = 0 uk_food = 0 uk_gold = 0 -flags = "Unbribable", "HasNoZOC", "NeverProtects", "NonMil", "NoVeteran" +flags = "Unbribable", "HasNoZOC", "NeverProtects", "NonMil", "NoVeteran", "SentryAlways" ; No veteran levels (level name is never displayed) veteran_names = _("green") veteran_base_raise_chance = 0 @@ -2487,11 +2732,12 @@ helptext = _("\ Balloons gather intel on potential battle areas. They have great vision and\ are unreachable by units prior to Riflemen and Ironclads. They can stay in\ the air for one Turn Change before landing in a City, Base, Quay, or transport\ - unit with cargo capacity of 4+. Balloons do not block units under\ - them from being attacked, and can’t fly over mountains.\ + unit with cargo capacity of 4+. Balloons give sentry reports of nearby unit\ + movements even when not on sentry. Balloons do not block units under them\ + from being attacked, and can’t fly over mountains.\ "), _(" NOTE:GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ + can override this by moving to adjacent tiles.\ ") [unit_zeppelin] @@ -2511,17 +2757,17 @@ attack = 2 defense = 1 hitpoints = 20 firepower = 2 -move_rate = 6 +move_rate = 7 vision_radius_sq = 24 transport_cap = 0 -fuel = 5 +fuel = 7 city_size = 2632 ;000000,001,010,010010,0,0 = atk_bonus=0, max_kills=1, targets=2, move_cost=18 frags, stay_frtfy=0, reserved = 0 -paratroopers_mr_sub = 0 ;00000,00,0000,000,0,0 = bbd_retal_rate=0, iPill_rand_tgts=0, iPill_odds=-0 pentads, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 +paratroopers_mr_sub = 0 ;000,00000,00,0000,000,0,0 = max_ATKs=0, bbd_retal_rate=0, iPill_rand_tgts=0, iPill_odds=-0 pentads, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 uk_happy = 0 uk_shield = 0 uk_food = 0 uk_gold = 0 -flags = "Unbribable", "AirAttacker", "HasNoZOC", "NeverProtects", "Bombarder", "Provoking" +flags = "Unbribable", "AirAttacker", "HasNoZOC", "NeverProtects", "Bombarder", "Provoking", "SentryAlways" veteran_names = _("?vet_rank:green"), _("?vet_rank:veteran"), @@ -2539,15 +2785,16 @@ helptext = _("\ As new technology inspires the upgrade of Balloons, the Zeppelin appears.\ In theory, it can be used for tactical advantage in combat. However,\ vulnerability and cost make it better for intel. It can do limited attack\ - with bombs, or 20 combat rounds with medium caliber ordnance. It can stay out\ - for two Turn Changes before landing in a City, Quay, Fortress, Naval Base,\ + with bombs, or 20 combat rounds with medium caliber ordnance. It has 7 turns\ + of fuel so can stay out for many turns before landing in a City, Quay, Fortress, Naval Base,\ Airbase, or transport with 6+ capacity. \n\ Zeppelins have great vision and are unreachable by units prior to Marines and\ - Destroyers. Zeppelins do not block units under them from being attacked. Unlike\ + Destroyers. Zeppelins do not block units under them from being attacked. Zeppelins\ + give sentry reports of nearby unit movements even when not on sentry. Unlike\ Balloons, they can fly over Mountains.\ "), _(" NOTE:GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ + can override this by moving to adjacent tiles.\ ") bombard_rate = 4 @@ -2576,7 +2823,7 @@ uk_happy = 0 uk_shield = 1 uk_food = 0 uk_gold = 0 -flags = "HasNoZOC", "NoVeteran", "Unbribable", "Expellable", "NeverProtects", "CanEscape", "Provoking", "NoVeteran" +flags = "HasNoZOC", "NoVeteran", "Unbribable", "Expellable", "NeverProtects", "CanEscape", "Provoking", "NonMil" ; No veteran levels (level name is never displayed) veteran_names = _("green") veteran_base_raise_chance = 0 @@ -2586,13 +2833,13 @@ veteran_move_bonus = 0 roles = "" cargo = "Land", "Cargo" helptext = _("\ -Airplanes can carry a single diplomatic unit or single Freight unit. They can land in any domestic\ +Airplanes can carry a diplomatic unit or a Freight unit. They can land in any domestic\ or allied city. For diplomatic missions to non-allied nations, an empty Airbase must be available for landing.\ Airplanes have two turns of fuel. Each new aviation tech upgrades range by +2 moves per turn. \n\ "), _(" -Airplanes can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker.\ +Stack-Escape:60% odds to evade stack-death if attacker doesn’t have more moves than it does.\ NOTE:GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ + can override this by moving to adjacent tiles.\ ") [unit_fighter] @@ -2605,7 +2852,7 @@ graphic_alt = "-" sound_move = "m_fighter" sound_move_alt = "m_generic" sound_fight = "f_fighter" -sound_fight_alt = "f_generic" +sound_fight_alt = "Ground Strike" build_cost = 60 pop_cost = 0 attack = 4 @@ -2616,6 +2863,7 @@ move_rate = 20 vision_radius_sq = 12 transport_cap = 0 fuel = 1 +paratroopers_mr_sub = 131072 ;010,00000,00,0000,000,0,0 - max_ATKs=2, bbd_retal_rate=0, iPill_rand_tgts=0, iPill_odds=-10 pentads=50%, iPill_moves=6, iPillage=1, attack_stay_fortified=0 uk_happy = 0 uk_shield = 1 uk_food = 0 @@ -2623,7 +2871,12 @@ uk_gold = 0 targets = "Air", "AirProtect", "Missile", "Balloon", "Helicopter", "LandRail", "Zeppelin" bonuses = { "flag", "type", "value" - "AirAttacker", "DefenseMultiplierPct", 17 ; defends at 3.5 (3*1.17=3.51) vs air attackers + ; Crease Base Defense of 3.5. Use flags to include all unit_types with no overlap: + "CantReachAir", "DefenseMultiplierPct", 17 ; all military Land, Sea, Bombers, EXCEPT AAA, Mobile SAM, AEGIS + "AntiAir", "DefenseMultiplierPct", 17 ; AAA, Mobile SAM, AEGIS + "NonMil", "DefenseMultiplierPct", 17 ; all NonMil units + "AirAttacker", "DefenseMultiplierPct", 17 ; Aircraft (including Bombers) + "FieldUnit", "DefenseMultiplierPct", -17 ; Cancel overlapped doubled bonus on Bombers. } flags = "AirAttacker", "Unbribable", "HasNoZOC", "CanEscape", "AirProtector", "Provoking" @@ -2641,29 +2894,31 @@ veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "" helptext = _("\ -Fighters are the first offensive Air units. Their superior mobility and firepower alter\ - the very nature of warfare. They can move anywhere and attack any unit (except Submarines\ - and Jet Bombers.)\n\ +Fighters are the first offensive Air units. Their superior mobility and firepower alter the\ + very nature of warfare. They can move anywhere and attack any unit except Submarines, Jet\ + Bombers, Spy Planes, and Satellites. Fighters need fuel to avoid crashing and thus must end\ + every turn in a city, Airbase, or Carrier. Air units can’t conquer undefended enemy cities.\ + Fighters can attack twice per turn. \n\ "), _(" INTERCEPTOR:the Vigil order lets Fighters auto-attack adjacent Air units if they\ have better attack odds. A Fighter can Vigil if it uses 2 move points or less. \n\ "), _(" -Fighters can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker.\ +Stack-Escape:60% odds to evade stack-death if attacker doesn’t have more moves than it does.\ NOTE:GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ + can override this by moving to adjacent tiles.\ ") [unit_escort_fighter] name = _("Escort Fighter") class = "AirProtect" tech_req = "Radio" -obsolete_by = "Jet Fighter" +obsolete_by = "Multi-Fighter" graphic = "u.escort_fighter" graphic_alt = "-" sound_move = "m_escort_fighter" sound_move_alt = "m_generic" sound_fight = "f_fighter" -sound_fight_alt = "f_generic" +sound_fight_alt = "Ground Strike" build_cost = 80 pop_cost = 0 attack = 3 @@ -2674,6 +2929,7 @@ move_rate = 18 vision_radius_sq = 12 transport_cap = 0 fuel = 2 +paratroopers_mr_sub = 131072 ;010,00000,00,0000,000,0,0 - max_ATKs=2, bbd_retal_rate=0, iPill_rand_tgts=0, iPill_odds=-10 pentads=50%, iPill_moves=6, iPillage=1, attack_stay_fortified=0 uk_happy = 0 uk_shield = 1 uk_food = 0 @@ -2688,7 +2944,7 @@ bonuses = "AirAttacker", "DefenseDividerPct", 17 ; Aircraft (including Bombers) "FieldUnit", "DefenseDividerPct", -17 ; Cancel overlapped doubled bonus on Bombers. } -flags = "AirAttacker", "Unbribable", "HasNoZOC", "CanEscape", "AirProtector", "Provoking" +flags = "AirAttacker", "Unbribable", "HasNoZOC", "CanEscape", "AirProtector", "Provoking", "SentryAlways" veteran_names = _("?vet_rank:green"), _("?vet_rank:veteran"), @@ -2707,19 +2963,20 @@ Escort Fighters are large fighters with high fuel capacity. Higher mass and\ stronger construction allow them to absorb more damage. They do not attack\ as well as standard Fighters, but can return home on the next turn. They are\ good for long-range missions, defensive air support, and escorting bombers.\ + Escort Fighters can attack twice per turn. \n\ "), _(" INTERCEPTOR:the Vigil order lets Escort Fighters auto-attack adjacent Air units if they\ have better attack odds. This unit can Vigil if it uses 3 move points or less. \n\ "), _(" -This aircraft can Stack-Escape:a 60% chance to escape a killed stack if it has more remaining moves than the attacker.\ +Stack-Escape:60% odds to evade stack-death if attacker doesn’t have more moves than it does.\ NOTE:GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ + can override this by moving to adjacent tiles.\ ") [unit_dive_bomber] name = _("Dive Bomber") class = "Air" -tech_req = "Radio" +tech_req = "Flight.2" obsolete_by = "Ground Strike Fighter" graphic = "u.dive_bomber" graphic_alt = "-" @@ -2737,7 +2994,7 @@ move_rate = 18 vision_radius_sq = 12 transport_cap = 0 fuel = 1 -paratroopers_mr_sub = 346 ;00,1010,110,1,0 - iPill_rand_tgts=0, iPill_odds=-10 pentads=50%, iPill_moves=6, iPillage=1, attack_stay_fortified=0 +paratroopers_mr_sub = 65882 ;001,00000,00,1010,110,1,0 - max_ATKs=1, bbd_retal_rate=0, iPill_rand_tgts=0, iPill_odds=-10 pentads=50%, iPill_moves=6, iPillage=1, attack_stay_fortified=0 ;NOTE:iPillage changes in rules require client_rules_flag and get_what_can_unit_pillage_from() changes. uk_happy = 0 uk_shield = 1 @@ -2774,7 +3031,8 @@ helptext = _("\ Dive Bombers are fitted with armor and armaments for ground attack and sea combat.\ They do better attacking surface targets and defending vs Anti-Air, but have reduced\ range and Air-to-Air ability. They do not block attacks on their same tile, but exert\ - ZoC on adjacent land tiles and can iPillage. The Dive Bomber is not an interceptor.\ + ZoC on adjacent land tiles and can iPillage. The Dive Bomber is not an interceptor,\ + and can only attack once per turn.\ Role specialization yields the following gains and losses over a Fighter: \n\n\ GAINS: \n\ • A:4½ vs Surface units (Land or Sea) \n\ @@ -2784,10 +3042,11 @@ Dive Bombers are fitted with armor and armaments for ground attack and sea comba LOSSES: \n\ • A3/D3 in Air-to-Air \n\ • Can’t block its tile \n\ + • One attack per turn \n\ • Can’t intercept \n\ "), _(" -Communists pay 10 less for this unit. Can Stack-Escape:a 60% chance to escape a\ - killed stack if it has more remaining moves than the attacker.\ +Communists pay 10 less for this unit.\ + Stack-Escape:60% odds to evade stack-death if attacker doesn’t have more moves than it does.\ GOTO prevents unit loss from lack of fuel.\ Override this by ordering adjacent moves.\ ") @@ -2795,14 +3054,14 @@ Communists pay 10 less for this unit. Can Stack-Escape:a 60% chance to escape [unit_medium_bomber] name = _("Medium Bomber") class = "Air" -tech_req = "Advanced Flight" +tech_req = "Radio" obsolete_by = "Jet Bomber" graphic = "u.medium_bomber" graphic_alt = "-" sound_move = "m_medium_bomber" sound_move_alt = "m_generic" sound_fight = "f_medium_bomber" -sound_fight_alt = "f_generic" +sound_fight_alt = "Bomb" build_cost = 85 pop_cost = 0 attack = 7 @@ -2811,13 +3070,15 @@ hitpoints = 20 firepower = 2 move_rate = 15 vision_radius_sq = 12 -transport_cap = 0 +transport_cap = 1 fuel = 2 +paratroopers_mr_sub = 65536 ;001,00000,00,0000,000,0,0 - max_ATKs=1, bbd_retal_rate=0, iPill_rand_tgts=1, iPill_odds=-8 pentads=60%, iPill_moves=3, iPillage=1, ATK_Stay_Fortified=0 uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 targets = "Balloon", "LandRail", "Zeppelin" +cargo = "Bomb2" bonuses = { "flag", "type", "value" } @@ -2837,29 +3098,30 @@ veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "" helptext = _("\ -The Medium Bomber is well suited for moderately strong targets or multiple weak targets.\ - It may not attack other Air units. It is a Soft Field Unit and can’t carry Bomb\ - units, causing less discontent than other types of Bombers. \n\ +The Medium Bomber is well suited for hitting a moderately strong target.\ + It may not attack other Air units, and can only attack once per turn. It can only\ + carry conventional Bombs, not nuclear bomb units. This makes it a Soft Field Unit,\ + causing less discontent than other types of Bombers. \n\ ➤ Unhappy effect for Soft Field units: \n\ Republic:0 Democracy:1 (non-aggressive) \n\ Republic:1 Democracy:2 (aggressive) \n\ "), _(" -This aircraft can Stack-Escape:a 60% chance to escape a killed stack if it has more remaining moves than the attacker.\ +Stack-Escape:60% odds to evade stack-death if attacker doesn’t have more moves than it does.\ NOTE:GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ + can override this by moving to adjacent tiles.\ ") [unit_heavy_bomber] name = _("Heavy Bomber") class = "Air" -tech_req = "Radar" +tech_req = "Advanced Flight" obsolete_by = "Jet Bomber" graphic = "u.heavy_bomber_o" graphic_alt = "-" sound_move = "m_bomber" sound_move_alt = "m_generic" sound_fight = "f_heavy_bomber" -sound_fight_alt = "f_bomber" +sound_fight_alt = "Bomb" build_cost = 120 pop_cost = 0 attack = 12 @@ -2870,12 +3132,13 @@ move_rate = 16 vision_radius_sq = 12 transport_cap = 1 fuel = 2 +paratroopers_mr_sub = 65536 ;001,00000,00,0000,000,0,0 - max_ATKs=1, bbd_retal_rate=0, iPill_rand_tgts=1, iPill_odds=-8 pentads=60%, iPill_moves=3, iPillage=1, ATK_Stay_Fortified=0 uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 targets = "Balloon", "LandRail", "Zeppelin" -cargo = "Bomb" +cargo = "Bomb2", "Bomb" bonuses = { "flag", "type", "value" } @@ -2896,21 +3159,21 @@ veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "" helptext = _("\ Heavy Bombers are large and sturdy Bombers with larger payload and numerous gunner defense stations.\ - They are excellent for hitting strong well-defended ground targets.\ + They are excellent for hitting strong well-defended ground targets, and can attack once per turn.\ They can’t attack Air units. They can carry one Bomb. Like most Bombers, the Heavy Bomber is a Field Unit.\ Field Units cause the same unhappiness no matter if aggressively or peacefully deployed. \n\ ➤ Unhappy effect for Field units: \n\ Republic:1 Democracy:2 \n\ "), _(" -This aircraft can Stack-Escape:a 60% chance to escape a killed stack if it has more remaining moves than the attacker.\ +Stack-Escape:60% odds to evade stack-death if attacker doesn’t have more moves than it does.\ NOTE:GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ + can override this by moving to adjacent tiles.\ ") [unit_strategic_bomber] name = _("Strategic Bomber") class = "Air" -tech_req = "Rocketry" +tech_req = "Radar" obsolete_by = "Jet Bomber" graphic = "u.ultra_heavy_bomber_o" graphic_alt = "-" @@ -2924,18 +3187,18 @@ attack = 13 defense = 4 hitpoints = 20 firepower = 2 -move_rate = 16 +move_rate = 17 vision_radius_sq = 12 transport_cap = 2 fuel = 3 -paratroopers_mr_sub = 782 ;01,1000,011,1,0 - iPill_rand_tgts=1, iPill_odds=-8 pentads=60%, iPill_moves=3, iPillage=1, ATK_Stay_Fortified=0 +paratroopers_mr_sub = 131854 ;010,00000,01,1000,011,1,0 - max_ATKs=2, bbd_retal_rate=0, iPill_rand_tgts=1, iPill_odds=-8 pentads=60%, iPill_moves=3, iPillage=1, ATK_Stay_Fortified=0 ;NOTE:iPillage changes in rules require client_rules_flag and get_what_can_unit_pillage_from() changes. uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 targets = "Balloon", "LandRail", "Zeppelin" -cargo = "Bomb" +cargo = "Bomb2", "Bomb" bonuses = { "flag", "type", "value" } @@ -2955,13 +3218,13 @@ veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "" helptext = _("\ -The Strategic Bomber offers a small improvement in attack. Higher altitude offers a good upgrade in\ +The Strategic Bomber can do two attacks per turn. Higher altitude offers a good upgrade in\ defense. It has considerably longer range, with one more turn of fuel. Upgraded payload enables\ instant-Pillage bombing. May carry two Bombs. \n\ "), _(" -This aircraft can Stack-Escape:a 60% chance to escape a killed stack if it has more remaining moves than the attacker.\ +Stack-Escape:60% odds to evade stack-death if attacker doesn’t have more moves than it does.\ NOTE:GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ + can override this by moving to adjacent tiles.\ ") [unit_awacs] @@ -2989,7 +3252,7 @@ uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 -flags = "HasNoZOC", "NoVeteran", "Unbribable", "Expellable", "NeverProtects", "CanEscape", "Provoking" +flags = "HasNoZOC", "NoVeteran", "Unbribable", "Expellable", "NeverProtects", "CanEscape", "Provoking", "SentryAlways" ; No veteran levels (level name is never displayed) veteran_names = _("green") veteran_base_raise_chance = 0 @@ -3001,9 +3264,9 @@ helptext = _("\ The AWACS has great fuel capacity for long range flights, and advanced radar that can determine\ the location of enemy units over a wide area. The AWACS has 2 turns of fuel. \n\ "), _(" -AWACS can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker.\ +Stack-Escape:60% odds to evade stack-death if attacker doesn’t have more moves than it does.\ NOTE:GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ + can override this by moving to adjacent tiles.\ ") [unit_spy_plane] @@ -3032,7 +3295,7 @@ uk_shield = 1 uk_food = 0 uk_gold = 0 vision_layer = "Stealth" -flags = "HasNoZOC", "NoVeteran", "Unbribable", "NeverProtects", "CanEscape", "Provoking", "WillNever" +flags = "HasNoZOC", "NoVeteran", "Unbribable", "NeverProtects", "CanEscape", "Provoking", "WillNever", "SentryAlways" ; No veteran levels (level name is never displayed) veteran_names = _("green") veteran_base_raise_chance = 0 @@ -3044,11 +3307,11 @@ helptext = _("\ The Spy Plane is an ultrasonic high altitude aircraft with long range. It gathers\ intel over a wide area. Stealth technology makes it invisible, except to enemies on\ adjacent tiles. Spy Planes have 2 turns of fuel. They are unreachable to primitive\ - propeller-based aircraft.\ + propeller-based aircraft. \ "), _(" -Spy Planes can Stack-Escape:a 67% chance to escape a killed stack if they have more remaining moves than the attacker.\ +Stack-Escape:67% odds to evade stack-death if attacker doesn’t have more moves than it does.\ NOTE:GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ + can override this by moving to adjacent tiles.\ ") [unit_satellite] name = _("Satellite") @@ -3077,7 +3340,7 @@ uk_shield = 1 uk_food = 0 uk_gold = 0 vision_layer = "Stealth" -flags = "Unique", "HasNoZOC", "NonMil", "NoVeteran", "Unbribable", "NeverProtects", "CanEscape", "WillNever" +flags = "Unique", "HasNoZOC", "NonMil", "NoVeteran", "Unbribable", "NeverProtects", "CanEscape", "WillNever", "SentryAlways" ; No veteran levels (level name is never displayed) veteran_names = _("green") veteran_base_raise_chance = 0 @@ -3090,9 +3353,9 @@ Satellites orbit the Earth above the atmosphere. They are unreachable to anythin but missiles. Their orbital velocity allows them to circumnavigate the planet\ in a couple turns. Telescopic cameras allow them to Investigate City, even if the\ city has a Police Station. Satellites can’t be seen by others unless adjacent.\ - Satellites require Laser tech and can only be built in the city with the Apollo Program.\ + Satellites require Laser tech and can only be built in the city with the Apollo Program. \ "), _(" -Satellites can Stack-Escape:a 100% chance to escape a killed stack if they have more remaining move points than the attacker.\ +Stack-Escape:100% odds to evade stack-death if attacker doesn’t have more moves than it does.\ "), _(" NOTE: Due to game mechanics, a Satellite blocks terrestrial movement\ over a tile. This is solved by killing it with any Missile. To avoid\ @@ -3156,12 +3419,13 @@ Transport Helicopters can carry three land units, which they can pick up from an lose all moves (except Marine types). Other types need a City, Airbase, or Naval Base to unload. \n\ "), _("\ Helicopters lose 1 hp for each turn not ended in a City, Base, or Carrier. +1 move\ - is awarded if starting a turn in a City or Airbase. \n\ + is awarded if starting a turn in a City or Airbase. The first turn spent\ + in a city, all Helicopter types regain 10hp. \n\ "), _("\ All Helicopters can be attacked by land from Riflemen onward; by sea from Ironclad\ onward; get +50% defence vs. foot units; and are unreachable to artillery types.\ Unlike attack Helicopters, Transport Helicopters are intercepted by Fighters on vigil.\ - Transport Helicopters can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker.\ + Stack-Escape:60% odds to evade stack-death if attacker doesn’t have more moves than it does.\ ") [unit_helicopter] @@ -3187,7 +3451,7 @@ vision_radius_sq = 12 transport_cap = 1 fuel = 0 city_size = 2816 ; 000000,001,011,000000,00 = atk_bonus=0, max_kills=1, targets=3, move_cost=0 frags, stay_fortfy=0, reserved = 0 -paratroopers_mr_sub = 6144 ; 00011,00,0000,000,0,0 - bbd_retal_rate=3, iPill_rand_tgts=0, iPill_odds=0, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 +paratroopers_mr_sub = 6144 ; 000,00011,00,0000,000,0,0 - max_ATKs=0, bbd_retal_rate=3, iPill_rand_tgts=0, iPill_odds=0, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 uk_happy = 1 uk_shield = 1 uk_food = 0 @@ -3224,14 +3488,15 @@ Helicopters are the Air Cavalry of modern armies. They can attack multiple targe They can transport Marines and AAA and are thus well-suited for commando ops. \n\ "), _("\ For each turn not ended in a City, Base, or Carrier, 1hp is lost. +1 move\ - is awarded if starting a turn in a City or Airbase. \n\ + is awarded if starting a turn in a City or Airbase. The first turn spent\ + in a city, all Helicopter types regain 10hp. \n\ "), _("\ Helicopters fly low to avoid Interception. This invites attacks by ground units from\ Riflemen onward. They are unreachable to Artillery types and get +50% defense\ vs. foot units. Helicopters can be attacked by Sea from Ironclad onward. Helicopters can retaliate 3 rounds against Special Unit Attacks. \n\ "), _("\ -Helicopters can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker.\ +Stack-Escape:60% odds to evade stack-death if attacker doesn’t have more moves than it does.\ Helicopters can transport one Marines or AAA unit.\ ") @@ -3248,14 +3513,15 @@ sound_fight = "f_jet_fighter" sound_fight_alt = "f_stealth_fighter" build_cost = 70 pop_cost = 0 -attack = 6 -defense = 5 +attack = 7 +defense = 6 hitpoints = 20 firepower = 2 move_rate = 24 vision_radius_sq = 12 transport_cap = 0 fuel = 1 +paratroopers_mr_sub = 196608 ;011,00000,00,0000,000,0,0 - max_ATKs=3, bbd_retal_rate=0, iPill_rand_tgts=0, iPill_odds=0, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 uk_happy = 0 uk_shield = 1 uk_food = 0 @@ -3279,49 +3545,47 @@ veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "" helptext = _("\ -Jet Fighters upgrade the Fighter with improved attack, defense, and range.\ +Jet Fighters upgrade the Fighter with improved attack, defense, and range. A Jet Fighter\ + can do a maximum of three attacks per turn. \n\ "), _(" INTERCEPTOR:the Vigil order lets Jet Fighters auto-attack adjacent Air units if they\ have better attack odds. This unit can Vigil if it uses 3 move points or less. \n\ "), _(" -Helicopters can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker.\ - NOTE:GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.\ +Stack-Escape:60% odds to evade stack-death if attacker doesn’t have more moves than it does.\ + NOTE:GOTO disallows unit loss from lack of fuel. You can override this by moving to adjacent tiles.\ ") -[unit_ground_strike_fighter] -name = _("Ground Strike Fighter") -class = "Air" +[unit_multi_fighter] +name = _("Multi-Fighter") +class = "AirProtect" tech_req = "Avionics" obsolete_by = "None" -graphic = "u.strike_fighter" +graphic = "u.multifighter" graphic_alt = "-" -sound_move = "m_strike_fighter" -sound_move_alt = "m_jet_fighter" -sound_fight = "f_fighter" -sound_fight_alt = "Ground Strike" -build_cost = 80 +sound_move = "m_jet_fighter" +sound_move_alt = "m_stealth_fighter" +sound_fight = "f_jet_fighter" +sound_fight_alt = "f_stealth_fighter" +build_cost = 90 pop_cost = 0 -attack = 7 -defense = 4 +attack = 6 +defense = 7 hitpoints = 20 firepower = 2 -move_rate = 21 +move_rate = 22 vision_radius_sq = 12 transport_cap = 0 fuel = 2 -paratroopers_mr_sub = 178 ;00,0101,100,1,0 - iPill_rand_tgts=0, iPill_odds=-5 pentads=75%, iPill_moves=4, iPillage=1, ATK_Stay_Fortified=0 -;NOTE:iPillage changes in rules require client_rules_flag and get_what_can_unit_pillage_from() changes. +paratroopers_mr_sub = 131072 ;010,00000,00,0000,000,0,0 - max_ATKs=2, bbd_retal_rate=0, iPill_rand_tgts=0, iPill_odds=0, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 uk_happy = 0 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Air", "Air_High_Altitude", "Balloon", "Helicopter", "LandRail", "Zeppelin" +targets = "Air", "AirProtect", "Air_High_Altitude", "Missile", "Balloon", "Helicopter", "LandRail", "Zeppelin" bonuses = { "flag", "type", "value" - "AntiAir", "DefenseMultiplierPct", 33 ; D5.33 vs Anti-Air } -flags = "AirAttacker", "Unbribable", "CanEscape", "NeverBlocked", - "NeverProtects", "Provoking", "WillNever" +flags = "AirAttacker", "Unbribable", "HasNoZOC", "CanEscape", "AirProtector", "Provoking", "SentryAlways" veteran_names = _("?vet_rank:green"), _("?vet_rank:veteran"), @@ -3330,7 +3594,69 @@ veteran_names = _("?vet_rank:crack"), _("?vet_rank:ace"), _("?vet_rank:top gun") -veteran_base_raise_chance = 40, 25, 16, 10, 10, 10, 0 +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 +roles = "" +helptext = _("\ +Multi-Fighters are fitted for mission versatility.\ + They are sturdy, defend better, and have two turns of fuel. They are\ + good for escorting bombers, pursuing enemy bombers on long range\ + missions, defensive ground support, naval missions, reconnaissance,\ + and interception. A Multi-Fighter can vigil at any range, and can\ + do a maximum of 2 attacks per turn. \n\ +"), _(" +INTERCEPTOR:the Vigil order lets Multi-Fighters auto-attack adjacent Air units if they\ + have better attack odds. This unit can Vigil if it has 1 turn of fuel or more. \n\ +"), _(" +Stack-Escape:60% odds to evade stack-death if attacker doesn’t have more moves than it does.\ + NOTE:GOTO disallows unit loss from lack of fuel. You can override this by moving to adjacent tiles.\ +") + +[unit_ground_strike_fighter] +name = _("Ground Strike Fighter") +class = "Air" +tech_req = "Avionics" +obsolete_by = "None" +graphic = "u.strike_fighter" +graphic_alt = "-" +sound_move = "m_strike_fighter" +sound_move_alt = "m_jet_fighter" +sound_fight = "f_fighter" +sound_fight_alt = "Ground Strike" +build_cost = 80 +pop_cost = 0 +attack = 8 +defense = 5 +hitpoints = 20 +firepower = 2 +move_rate = 21 +vision_radius_sq = 12 +transport_cap = 0 +fuel = 2 +paratroopers_mr_sub = 178 ;000,00000,00,0101,100,1,0 - max_ATKs=0, bbd_retal_rate=0, iPill_rand_tgts=0, iPill_odds=-5 pentads=75%, iPill_moves=4, iPillage=1, ATK_Stay_Fortified=0 +;NOTE:iPillage changes in rules require client_rules_flag and get_what_can_unit_pillage_from() changes. +uk_happy = 0 +uk_shield = 1 +uk_food = 0 +uk_gold = 0 +targets = "Air", "Air_High_Altitude", "Balloon", "Helicopter", "LandRail", "Zeppelin" +bonuses = + { "flag", "type", "value" + "AntiAir", "DefenseMultiplierPct", 33 ; D5.33 vs Anti-Air + } +flags = "AirAttacker", "Unbribable", "CanEscape", "NeverBlocked", + "NeverProtects", "Provoking", "WillNever" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:ace"), + _("?vet_rank:top gun") +veteran_base_raise_chance = 40, 25, 16, 10, 10, 10, 0 veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 @@ -3340,11 +3666,11 @@ Ground Strike Fighters upgrade the Dive Bomber. They can’t block attacks on ot units on their tile, nor engage against Fighters. However, like the Dive Bomber,\ they can interdict ZoC over land tiles. High fuel capacity allows two turns in the\ air. No unit can stop this unit from attacking surface units on a tile. This unit\ - can also do pinpointed surgical strikes to pillage tiles. This aircraft is a\ + has no limit to attacks per turn and can also do pinpointed surgical strikes to pillage tiles. This aircraft is a\ specialized niche unit. It is not an interceptor. \n\ -This aircraft can Stack-Escape:a 60% chance to escape a killed stack if it has more remaining moves than the attacker.\ +Stack-Escape:60% odds to evade stack-death if attacker doesn’t have more moves than it does.\ NOTE:GOTO prevents unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ + can override this by moving to adjacent tiles.\ ") [unit_jet_bomber] @@ -3368,14 +3694,14 @@ move_rate = 19 vision_radius_sq = 12 transport_cap = 3 fuel = 3 -paratroopers_mr_sub = 1198 ;10,0101,011,1,0 - iPill_rand_tgts=2, iPill_odds=-5 pentads=75%, iPill_moves=3, iPillage=1, ATK_Stay_Fortified=0 +paratroopers_mr_sub = 132270 ;010,00000,10,0101,011,1,0 - max_ATKs=2, bbd_retal_rate=0, iPill_rand_tgts=2, iPill_odds=-5 pentads=75%, iPill_moves=3, iPillage=1, ATK_Stay_Fortified=0 ;NOTE:iPillage changes in rules require client_rules_flag and get_what_can_unit_pillage_from() changes. uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 targets = "LandRail" -cargo = "Bomb" +cargo = "Bomb2", "Bomb" flags = "FieldUnit", "Unbribable", "AirAttacker", "HasNoZOC", "CanEscape", "CantReachAir", "NeverProtects", "Provoking", "WillNever" veteran_names = @@ -3394,12 +3720,13 @@ roles = "" helptext = _("\ Jet Bombers are stratospheric long-range bombers with 3 turns of fuel:they can be airborne for two\ turn-changes. Their range makes them useful even after Stealth Bombers are available. Stratospheric\ - altitude is unreachable to propeller-based Fighters and AAA. Jet Bombers can Carpet Bomb, an\ - instant-Pillage of tiles from the air. May carry three Bombs. \n\ + altitude is unreachable to propeller-based Fighters and AAA. A Jet Bomber may do a maximum of three\ + attacks per turn. Jet Bombers can Carpet Bomb, an\ + instant-Pillage of tiles from the air. May carry three Bombs. \ "), _(" -Jet Bombers can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker.\ +Stack-Escape:60% odds to evade stack-death if attacker doesn’t have more moves than it does.\ NOTE:GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ + can override this by moving to adjacent tiles.\ ") [unit_stealth_fighter] @@ -3413,10 +3740,10 @@ sound_move = "m_stealth_fighter" sound_move_alt = "m_generic" sound_fight = "f_stealth_fighter" sound_fight_alt = "f_generic" -build_cost = 80 +build_cost = 85 pop_cost = 0 -attack = 8 -defense = 4 +attack = 9 +defense = 6 hitpoints = 20 firepower = 2 move_rate = 28 @@ -3451,15 +3778,16 @@ roles = "" helptext = _("\ The most advanced Fighter, with improved attack and longer range. Stealth Fighters can’t be seen unless adjacent\ to an enemy. Stealth evasion gives a 25% bonus against all Anti-Air units, and reduces\ - SAM Batteries down to a smaller 25% bonus.\ + SAM Batteries down to a smaller 25% bonus. A Stealth Fighter has no limit to the number\ + of attacks per turn it can do. \n "), _(" INTERCEPTOR:the Vigil order lets Stealth Fighters auto-attack adjacent Air units if they\ have better attack odds. This unit can Vigil if it uses 4 move points or less. \n\ "), _(" -Stealth Fighters can Stack-Escape:a 67% chance to escape a killed stack if they have more remaining moves than the attacker.\ +Stack-Escape:67% odds to evade stack-death if attacker doesn’t have more moves than it does.\ "), _(" NOTE:GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ + can override this by moving to adjacent tiles.\ ") [unit_stealth_bomber] @@ -3472,7 +3800,7 @@ graphic_alt = "-" sound_move = "m_stealth_bomber" sound_move_alt = "m_generic" sound_fight = "f_stealth_bomber" -sound_fight_alt = "f_generic" +sound_fight_alt = "Bomb Strike" build_cost = 160 pop_cost = 0 attack = 19 @@ -3483,6 +3811,7 @@ move_rate = 24 vision_radius_sq = 12 transport_cap = 2 fuel = 2 +paratroopers_mr_sub = 196754 ;011,00000,00,0100,100,1,0 - max_ATKs=3, bbd_retal_rate=0, iPill_rand_tgts=0, iPill_odds=-4 pentads=80%, iPill_moves=4, iPillage=1, ATK_Stay_Fortified=0 uk_happy = 1 uk_shield = 1 uk_food = 0 @@ -3494,7 +3823,7 @@ bonuses = "AntiAir", "DefenseMultiplierPct", 25 } vision_layer = "Stealth" -cargo = "Bomb" +cargo = "Bomb2", "Bomb" flags = "FieldUnit", "AirAttacker", "HasNoZOC", "Unbribable", "CanEscape", "CantReachAir", "NeverProtects", "Provoking", "WillNever" veteran_names = @@ -3513,11 +3842,13 @@ roles = "" helptext = _("\ The deadliest Bomber, with improved attack and speed. Stealth Bombers can’t be seen\ unless adjacent to an enemy. Stealth evasion gives a 25% bonus against all Anti-Air\ - units, and reduces SAM Batteries down to only a 25% bonus. May carry two Bombs. \n\ + units, and reduces SAM Batteries down to only a 25% bonus. A Stealth Bomber may do\ + a maximum of three attacks per turn. Stealth Bombers can Bomb Strike, an\ + instant-Pillage of tiles from the air. May carry two Bombs. \n\ "), _(" -Stealth Bombers can Stack-Escape:a 67% chance to escape a killed stack if they have more remaining moves than the attacker.\ +Stack-Escape:67% odds to evade stack-death if attacker doesn’t have more moves than it does.\ NOTE:GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ + can override this by moving to adjacent tiles.\ ") [unit_boat] @@ -3535,9 +3866,9 @@ build_cost = 10 pop_cost = 0 attack = 0 defense = 1 -hitpoints = 10 +hitpoints = 8 firepower = 1 -move_rate = 4 +move_rate = 5 vision_radius_sq = 4 transport_cap = 1 fuel = 0 @@ -3690,7 +4021,7 @@ attack = 2 defense = 2 hitpoints = 10 firepower = 1 -move_rate = 6 +move_rate = 7 vision_radius_sq = 4 transport_cap = 2 fuel = 0 @@ -3742,7 +4073,7 @@ attack = 3 defense = 3 hitpoints = 10 firepower = 1 -move_rate = 6 +move_rate = 7 vision_radius_sq = 4 transport_cap = 3 fuel = 0 @@ -3793,12 +4124,13 @@ hitpoints = 10 firepower = 1 move_rate = 6 vision_radius_sq = 2 -transport_cap = 0 +transport_cap = 1 fuel = 0 uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 +cargo = "Land", "LandNoKill", "LandAirSea", "LandRoad", "Cargo" flags = "BadCityDefender", "CantReachAir", "Only_Native_Attack", "WillNever" veteran_names = _("?vet_rank:green"), @@ -3837,7 +4169,7 @@ attack = 4 defense = 4 hitpoints = 10 firepower = 1 -move_rate = 7 +move_rate = 8 vision_radius_sq = 4 transport_cap = 3 fuel = 0 @@ -3889,7 +4221,7 @@ attack = 2 defense = 3 hitpoints = 20 firepower = 1 -move_rate = 8 +move_rate = 9 vision_radius_sq = 4 transport_cap = 4 fuel = 0 @@ -3897,7 +4229,7 @@ uk_happy = 0 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Submarine", "LandRail" +targets = "LandRail" cargo = "Land", "LandNoKill", "LandAirSea", "Balloon", "LandRoad", "Cargo" flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever", "NonMil", "NonMilAttack" ; maritime trade can continue after Caravel expires. @@ -3916,16 +4248,16 @@ veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "Ferryboat", "FerryStartUnit", "BarbarianBoat" helptext = _("\ The Galleon is a heavily armed transport ship that can carry up to 4 units. Galleons can attack and travel on rivers,\ - and also do shore attacks. Galleon crews repair their ship an extra +1hp per turn, regardless of whether it has moved.\ + and also do shore attacks. Galleon crews repair their ship an extra +2hp per turn, regardless of whether it has moved.\ "), _(" Like most early sea units, when it initiates combat there will be 15 rounds\ of combat and 15 total hitpoints lost between both units. This may or may not\ result in the loss of one of the units. Although the Galleon is not a Commerce\ unit, it retains one vestige of the commercial abilities for the ships it upgrades.\ It can enter Peace waters to deliver commercial cargo, and does not cause\ - unhappiness.\ + unhappiness. \ "), _(" -Galleons can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker.\ +Stack-Escape:60% odds to evade stack-death if attacker doesn’t have more moves than it does.\ ") [unit_frigate] @@ -3945,7 +4277,7 @@ attack = 4 defense = 3 hitpoints = 20 firepower = 1 -move_rate = 8 +move_rate = 10 vision_radius_sq = 4 transport_cap = 2 fuel = 0 @@ -3953,11 +4285,11 @@ uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Submarine", "LandRail" +targets = "LandRail" cargo = "Land", "LandNoKill", "LandAirSea", "LandRoad" bonuses = { "flag", "type", "value" - "Marines", "DefenseMultiplier", 1 + "NonNativeAttack", "DefenseMultiplier", 1 } veteran_names = _("?vet_rank:green"), @@ -3976,10 +4308,63 @@ roles = "Hunter" helptext = _("\ The Frigate is versatile — it is a superior offensive unit and also a decent transport ship. Frigates\ can attack and travel on rivers, or make shore attacks from sea. Frigate crews repair their ship an\ - extra +1hp per turn, regardless of whether it has moved.\ + extra +2hp per turn, regardless of whether it has moved.\ "), _(" From Frigates onward, all sea attacks end with a single victor.\ - Frigates can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining move points than the attacker.\ + Stack-Escape:60% odds to evade stack-death if attacker doesn’t have more moves than it does.\ +") + +[unit_trawler] +name = _("Trawler") +class = "RiverShip" +tech_req = "Electricity" +obsolete_by = "None" +graphic = "u.trawler_o" +graphic_alt = "-" +sound_move = "m_transport" +sound_move_alt = "m_transport" +sound_fight = "f_trireme" +sound_fight_alt = "f_generic" +build_cost = 30 +pop_cost = 0 +attack = 0 +defense = 1 +hitpoints = 15 +firepower = 1 +move_rate = 2 +vision_radius_sq = 4 +transport_cap = 1 +fuel = 0 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 1 +cargo = "Land", "LandNoKill", "LandAirSea", "LandRoad", "Cargo", + "RiverShip", "Sea", "Submarine", "Trireme" +flags = "Settlers", "Infra", "CanRoad", "CanFortress", "Cant_Pillage", "NonMil", + "HasNoZOC", "NoVeteran", "Capturable", "Expellable", "BadCityDefender", + "Airbase" ;for buoys +; No veteran levels (level name is never displayed) +veteran_names = _("green") +veteran_base_raise_chance = 0 +veteran_work_raise_chance = 0 +veteran_power_fact = 100 +veteran_move_bonus = 63 +roles = "" +helptext = _("\ +Trawlers are high-powered work-boats used for fishing and ocean work.\ + They work at the same rate as Workers, and can put down Fishtraps,\ + Buoys, Sea Bridges, Road types, or clean Pollution and Fallout.\ + Trawlers can carry one Land unit. \n\n\ +Trawlers can tow ships who haven’t moved, via a Load, Board,\ + or Embark order. Towing helps damaged ships return to port for repair.\ + Crew repair rates for towed ships are improved by letting the ships rest\ + while towed. \n\n\ +When towing, encumbrance slows the Trawler to 6 move points. Remaining moves\ + reduce proportional to this slower speed. If a Trawler\ + stops towing a ship via Unload or Deboard, it regains pro-rated moves\ + proportional to its natural speed. \n\n\ +Towed ships lose all moves after release.\ ") [unit_cargo_ship] @@ -3999,7 +4384,7 @@ attack = 0 defense = 1 hitpoints = 30 firepower = 1 -move_rate = 7 +move_rate = 8 vision_radius_sq = 4 transport_cap = 4 fuel = 0 @@ -4050,7 +4435,7 @@ uk_gold = 0 cargo = "Land", "LandNoKill", "LandAirSea", "Balloon", "LandRoad", "Cargo", "Zeppelin" bonuses = { "flag", "type", "value" - "Marines", "DefenseMultiplier", 1 + "NonNativeAttack", "DefenseMultiplier", 1 } flags = "BadCityDefender", "CanEscape" veteran_names = @@ -4092,7 +4477,7 @@ attack = 4 defense = 4 hitpoints = 30 firepower = 1 -move_rate = 8 +move_rate = 9 vision_radius_sq = 8 transport_cap = 0 fuel = 0 @@ -4103,7 +4488,7 @@ uk_gold = 0 targets = "Balloon", "Submarine", "Helicopter", "LandRail" bonuses = { "flag", "type", "value" - "Marines", "DefenseMultiplier", 1 + "NonNativeAttack", "DefenseMultiplier", 1 } flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever" veteran_names = @@ -4123,9 +4508,9 @@ helptext = _("\ The Ironclad is an armored ship that is much more sturdy than the Frigate but\ loses transport capability and the ability to navigate rivers. From the Ironclad\ onward, warships are excellent at attacking shore targets, and can also pillage\ - buoys.\ + buoys. \ "), _(" -Ironclads and all modern ships can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining move points than the attacker.\ +Stack-Escape:60% odds to evade stack-death if attacker doesn’t have more moves than it does.\ ") [unit_destroyer] @@ -4145,7 +4530,7 @@ attack = 5 defense = 5 hitpoints = 30 firepower = 1 -move_rate = 12 +move_rate = 13 vision_radius_sq = 15 transport_cap = 0 fuel = 0 @@ -4158,7 +4543,7 @@ targets = "Balloon", "Submarine", "Helicopter", "LandRail", "Zeppelin" bonuses = { "flag", "type", "value" "Submarine", "DefenseMultiplier", 3 - "Marines", "DefenseMultiplier", 1 + "NonNativeAttack", "DefenseMultiplier", 1 } flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever" veteran_names = @@ -4179,9 +4564,9 @@ Destroyers are the first of the modern ships to start your modern\ navy. Their main roles are fast scouting, seek-and-destroy,\ anti-submarine warfare, shore bombardment of lighter targets,\ and supporting the needs of larger fleets. 4× ASW defence gives a\ - 35% chance defending vs Submarines.\ + 35% chance defending vs Submarines. \ "), _(" -Destroyers can Stack-Escape:a 67% chance to escape a killed stack if they have more remaining move points than the attacker.\ +Stack-Escape:67% odds to evade stack-death if attacker doesn’t have more moves than it does.\ ") [unit_cruiser] @@ -4201,7 +4586,7 @@ attack = 6 defense = 6 hitpoints = 30 firepower = 2 -move_rate = 11 +move_rate = 12 vision_radius_sq = 13 transport_cap = 0 fuel = 0 @@ -4213,7 +4598,7 @@ targets = "Balloon", "Submarine", "Helicopter", "LandRail", "Zeppelin" bonuses = { "flag", "type", "value" "Submarine", "DefenseMultiplier", 1 - "Marines", "DefenseMultiplier", 1 + "NonNativeAttack", "DefenseMultiplier", 1 } flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever" veteran_names = @@ -4253,9 +4638,9 @@ attack = 5 defense = 5 hitpoints = 30 firepower = 2 -move_rate = 12 +move_rate = 13 vision_radius_sq = 16 -transport_cap = 1 +transport_cap = 2 fuel = 0 uk_happy = 1 uk_shield = 1 @@ -4266,7 +4651,7 @@ cargo = "Missile"; , "Virtual" bonuses = { "flag", "type", "value" "Submarine", "DefenseMultiplier", 1 - "Marines", "DefenseMultiplier", 1 + "NonNativeAttack", "DefenseMultiplier", 1 "AirAttacker", "DefenseMultiplier", 1 "Missile", "DefenseMultiplier", 1 } @@ -4287,9 +4672,9 @@ roles = "Hunter" helptext = _("\ The Missile Destroyer has double the firepower of a Destroyer, and shares the same roles\ as its ancestor. It gains 2× defense against Air and Missile units. It has a 2× ASW bonus\ - and can can carry one Missile.\ + and can carry two Missiles. \ "), _(" -Missile Destroyers can Stack-Escape:a 67% chance to escape a killed stack if they have more remaining move points than the attacker.\ +Stack-Escape:67% odds to evade stack-death if attacker doesn’t have more moves than it does.\ ") [unit_aegis_cruiser] @@ -4309,9 +4694,9 @@ attack = 8 defense = 8 hitpoints = 30 firepower = 2 -move_rate = 11 +move_rate = 12 vision_radius_sq = 19 -transport_cap = 2 +transport_cap = 5 fuel = 0 uk_happy = 1 uk_shield = 1 @@ -4324,7 +4709,7 @@ bonuses = "AirAttacker", "DefenseMultiplier", 2 "Missile", "DefenseMultiplier", 2 "Submarine", "DefenseMultiplier", 1 - "Marines", "DefenseMultiplier", 1 + "NonNativeAttack", "DefenseMultiplier", 1 } flags = "BadCityDefender", "CanEscape", "AntiAir", "WillNever" veteran_names = @@ -4343,10 +4728,13 @@ roles = "Hunter" helptext = _("\ The AEGIS Cruiser has an Anti-Air missile system. Radar and sonar\ give superior vision and 2× defense bonus against Submarines.\ - The AEGIS can carry two Missiles, and is the only ship that can attack\ - Air and Missile units. \ + The AEGIS can carry five Missiles, and is the only ship that can attack\ + Air and Missile units. The discovery of Laser gives all units on its tile\ + a 50% chance to survive nuclear attack. \n\ "), _("\ -Excellent vision and 3× Anti-Air bonus are ideal for scouting and escorting.\ +Excellent vision and 3× Anti-Air bonus are ideal for scouting and escorting. \ +"), _(" +Stack-Escape:60% odds to evade stack-death if attacker doesn’t have more moves than it does.\ ") [unit_battleship] @@ -4366,12 +4754,12 @@ attack = 12 defense = 12 hitpoints = 40 firepower = 2 -move_rate = 10 -vision_radius_sq = 12 +move_rate = 11 +vision_radius_sq = 13 transport_cap = 0 fuel = 0 city_size = 3252 ; 000000,001,100,101101,00 = atk_bonus=0, max_kills=1, targets=4, move_cost=45 frags, stay_fortfy=0, reserved = 0 -paratroopers_mr_sub = 6144 ; 00011,00,0000,000,0,0 - bbd_retal_rate=3, iPill_rand_tgts=0, iPill_odds=0, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 +paratroopers_mr_sub = 6144 ; 000,00011,00,0000,000,0,0 - max_ATKs=0, bbd_retal_rate=3, iPill_rand_tgts=0, iPill_odds=0, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 uk_happy = 1 uk_shield = 1 uk_food = 0 @@ -4380,7 +4768,7 @@ targets = "Balloon", "Submarine", "Helicopter", "LandRail", "Zeppelin" bonuses = { "flag", "type", "value" "Submarine", "DefenseMultiplier", 1 - "Marines", "DefenseMultiplier", 1 + "NonNativeAttack", "DefenseMultiplier", 1 } flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever", "Bombarder" veteran_names = @@ -4399,7 +4787,9 @@ roles = "" helptext = _("\ The Battleship is the supreme naval unit, with excellent offensive and defensive strength. It has a 2× defense bonus vs Submarines.\ Battleships may expend 5 move points to do a 3 round bombardment which hits up to 4 units within a stack, of which only a maximum\ - of one can be killed. Defending Battleships get a free bombardment against Special Unit Attacks.\ + of one can be killed. Defending Battleships get a free bombardment against Special Unit Attacks. \ +"), _(" +Stack-Escape:60% odds to evade stack-death if attacker doesn’t have more moves than it does.\ ") bombard_rate = 3 @@ -4407,7 +4797,7 @@ bombard_rate = 3 name = _("Submarine") class = "Submarine" tech_req = "Automobile" -obsolete_by = "None" +obsolete_by = "Missile Submarine" graphic = "u.submarine" graphic_alt = "-" sound_move = "m_submarine" @@ -4420,16 +4810,16 @@ attack = 12 defense = 2 hitpoints = 28 firepower = 2 -move_rate = 10 +move_rate = 11 vision_radius_sq = 12 -transport_cap = 8 +transport_cap = 0 ;8 fuel = 0 uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 targets = "Balloon", "Submarine" -cargo = "Missile" +;cargo = "Missile" vision_layer = "Subsurface" bonuses = { "flag", "type", "value" @@ -4451,15 +4841,76 @@ veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "Hunter" helptext = _("\ -Submarines are strong attackers but weak defenders. They can carry 8 Missiles.\ +Submarines are strong attackers but weak defenders.\ They are unreachable by Air units, but do not block air attacks on surface ships.\ Submarines can’t attack units on shore. Submarines can’t be seen by other players\ unless they have a unit or city adjacent to it. \ "), _("\ Submarines have superior attrition rates when attacking in numbers. They excel\ - at hit-and-run against weaker ships.\ + at hit-and-run against weaker ships. They have a minimum speed of 5 when damaged. \ +"), _(" +Stack-Escape:75% odds to evade stack-death if attacker doesn’t have more moves than it does.\ +") + +[unit_missile_submarine] +name = _("Missile Submarine") +class = "Submarine" +tech_req = "Nuclear Power" +obsolete_by = "None" +graphic = "u.missile_submarine" +graphic_alt = "-" +sound_move = "m_submarine" +sound_move_alt = "m_generic" +sound_fight = "f_submarine" +sound_fight_alt = "f_generic" +build_cost = 55 +pop_cost = 0 +attack = 12 +defense = 4 +hitpoints = 30 +firepower = 2 +move_rate = 11 +vision_radius_sq = 12 +transport_cap = 4 +fuel = 0 +uk_happy = 1 +uk_shield = 1 +uk_food = 0 +uk_gold = 0 +targets = "Balloon", "Submarine" +cargo = "Missile" +vision_layer = "Subsurface" +bonuses = + { "flag", "type", "value" + "Submarine", "DefenseMultiplier", 1 + } +flags = "NeverProtects", "BadCityDefender", "Only_Native_Attack", + "Settlers", "Infra", "CanFortress", "Airbase", ;for building "Depth" + "Submarine", "CanEscape", "CantReachAir", "WillNever" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 +roles = "Hunter" +helptext = _("\ +A Missile Submarine is an upgraded Submarine. It gains 2hp, greater defense, and capacity\ + for 4 Missiles. It can’t be seen except by an adjacent unit or city. The DIVE DEEP order\ + makes Missile Submarines completely invisible to adjacent units on the following turn:\ + enemies only discover it if moving directly to its tile, at which point they may\ + attack. It can only be done in Deep Ocean while the Missile Submarine stays quietly in place. \n\ +Missile Submarines are unreachable by Air units, but don’t block air attacks on surface ships. \n\ +"), _("\ +Minimum speed is 5, when damaged.\n\ "), _(" -Submarines can Stack-Escape:a 75% chance to escape a killed stack if they have more remaining move points than the attacker.\ +Stack-Escape:75% odds to evade stack-death if attacker doesn’t have more moves than it does.\ ") [unit_carrier] @@ -4479,7 +4930,7 @@ attack = 1 defense = 9 hitpoints = 40 firepower = 2 -move_rate = 10 +move_rate = 11 vision_radius_sq = 12 transport_cap = 10 fuel = 0 @@ -4491,7 +4942,7 @@ targets = "Balloon", "Submarine", "Helicopter", "Zeppelin" cargo = "Air", "AirProtect", "Air_High_Altitude", "Missile", "Helicopter", "Balloon", "LandAirSea", "Zeppelin" bonuses = { "flag", "type", "value" - "Marines", "DefenseMultiplier", 1 + "NonNativeAttack", "DefenseMultiplier", 1 } flags = "BadCityDefender", "Only_Native_Attack", "CanEscape", "CantReachAir", "WillNever" @@ -4541,8 +4992,8 @@ uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 -embarks = "Submarine" -disembarks = "Submarine" +embarks = "Submarine", "Sea", "Land" ;since disallowing embark disallows "Transport Board" also, we must use actionenabler to disallow disembark +disembarks = "Submarine", "Sea", "Land" targets = "LandRail", "Space" flags = "NeverProtects", "FieldUnit", "OneAttack", "HasNoZOC", "Unbribable", "CantReachAir", "Missile", "NeverBlocked", "WillNever" @@ -4554,36 +5005,37 @@ A Cruise Missile can strike distant targets. It\ can be relocated by ending their turn on a city,\ airbase, Submarine, Missile Destroyer, AEGIS Cruiser,\ Carrier, or Mobile SAM. A Cruise Missile can’t\ - block attacks on other units on its tile.\ + block attacks on other units on its tile. \n\ ") -[unit_atom_bomb] -name = _("Atom Bomb") -class = "Bomb" -tech_req = "Nuclear Fission" +[unit_nuclear_missile] +name = _("Nuclear Missile") +class = "Missile" +tech_req = "Space Flight" obsolete_by = "None" -graphic = "u.atom_bomb" +graphic = "u.nuclear" graphic_alt = "-" -sound_move = "m_atom_bomb" +sound_move = "m_nuclear" sound_move_alt = "m_generic" -sound_fight = "f_atom_bomb" -sound_fight_alt = "f_nuclear" -build_cost = 150 +sound_fight = "f_nuclear" +sound_fight_alt = "f_generic" +build_cost = 160 pop_cost = 0 attack = 100 defense = 0 hitpoints = 10 firepower = 1 -move_rate = 2 -vision_radius_sq = 0 +move_rate = 24 +vision_radius_sq = 2 transport_cap = 0 fuel = 1 uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 +embarks = "Submarine", "Sea", "Land" ;since disallowing embark disallows "Transport Board" also, we must use actionenabler to disallow disembark +disembarks = "Submarine", "Sea", "Land" targets = "Balloon", "Helicopter", "Air", "AirProtect", "Air_High_Altitude", "Missile", "Submarine", "LandRail", "LandRoad", "Space", "Zeppelin" -disembarks = "Air", "Air_High_Altitude" flags = "NeverProtects", "FieldUnit", "OneAttack", "Nuclear", "HasNoZOC", "Unbribable", "NeverBlocked", "WillNever", "NoVeteran" ; No veteran levels (level name is never displayed) @@ -4594,43 +5046,43 @@ veteran_power_fact = 100 veteran_move_bonus = 0 roles = "" helptext = _("\ -If you have Nuclear Fission and the Manhattan Project has been built by any player, you can make Atom Bombs.\ - A Bomber can drop it within two tiles of its location. Unload the bomb and fly the Bomber out of range, then\ - attack the target (or detonate by pressing D twice.) The blast destroys ALL cardinally adjacent tiles. City population\ - is reduced by half. Land tiles may get nuclear fallout. \ +If you have Space Flight and the Manhattan Project has been built by any player, you can make Nuclear Missiles.\ + Nuclear blasts destroy ALL units in a 3×3 area. City population is reduced by half. Land tiles may get nuclear fallout.\ + Fallout reduces tile output and increases risk of nuclear winter. \ "), _("\ -Fallout reduces tile output and increases risk of nuclear winter.\ +If Fallout is cleaned on the turn it appears, the chance of nuclear winter is reduced.\ ") -bombard_rate = -1 ; default radius - 1 = just nuke single tile. +bombard_rate = 0 ; default sq_radius of 2:every adjacent tile. -[unit_hbomb] -name = _("Hydrogen Bomb") -class = "Bomb" +[unit_tactical_nuke] +name = _("Tactical Nuke") +class = "Missile" tech_req = "Fusion Power" impr_req = "Enrichment Facility" obsolete_by = "None" -graphic = "u.hbomb" +graphic = "u.tnuke" graphic_alt = "-" -sound_move = "m_atom_bomb" +sound_move = "m_nuclear" sound_move_alt = "m_generic" -sound_fight = "f_atom_bomb" -sound_fight_alt = "f_nuclear" -build_cost = 190 +sound_fight = "f_nuclear" +sound_fight_alt = "f_generic" +build_cost = 130 pop_cost = 0 attack = 100 defense = 0 hitpoints = 10 firepower = 1 -move_rate = 2 -vision_radius_sq = 0 +move_rate = 18 +vision_radius_sq = 2 transport_cap = 0 fuel = 1 -uk_happy = 2 +uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 +embarks = "Submarine", "Sea", "Land" ;since disallowing embark disallows "Transport Board" also, we must use actionenabler to disallow disembark +disembarks = "Submarine", "Sea", "Land" targets = "Balloon", "Helicopter", "Air", "AirProtect", "Air_High_Altitude", "Missile", "Submarine", "LandRail", "LandRoad", "Space", "Zeppelin" -disembarks = "Air", "Air_High_Altitude" flags = "NeverProtects", "FieldUnit", "OneAttack", "Nuclear", "HasNoZOC", "Unbribable", "NeverBlocked", "WillNever", "NoVeteran" ; No veteran levels (level name is never displayed) @@ -4641,48 +5093,92 @@ veteran_power_fact = 100 veteran_move_bonus = 0 roles = "" helptext = _("\ -Hydrogen Bombs make Atom Bombs seem tame. Any unprotected city at Ground Zero will be absolutely annihilated.\ - In other cities in the blast radius, population is reduced by about 75%. Blast area is 21 tiles:\ - the same area as an entire city (5×5 minus the corners.) All units within the blast are destroyed. \n\ -A Bomber can drop a Hydrogen Bomb within two tiles of its location. Unload the bomb, fly the Bomber out of\ - range, then detonate by pressing D twice. \n\ -If you have Fusion Power and the Manhattan Project was built, a Hydrogen Bomb\ +Tactical Nukes are very small warheads attached to missiles. A Tactical Nuke destroys all units on\ + a single tile. City population is reduced by half. The target tile may get Fallout. In theory,\ + Tactical Nukes are small enough to get the advantages of nuclear armaments without the severity of\ + consequences. In reality, they might be a gateway that escalates toward mutual assured destruction. \n\ +If you have Fusion Power and the Manhattan Project was built, a Tactical Nuke\ can be made in a city with an Enrichment Facility. \ -"), _("\ -Fallout from a Hydrogen Bomb is grave, with more than double the contaminated area.\ ") -bombard_rate = 5 ; sq_radius = 2 + 5 = 7 (entire workable city area) +bombard_rate = -2 ; 2 - 2 = 0:only nukes target tile. -[unit_doomsday_bomb] -name = _("Doomsday Bomb") -class = "Bomb" -tech_req = "Fusion Power" -impr_req = "Enrichment Facility" +[unit_bombs] +name = _("Bombs") +class = "Bomb2" +tech_req = "Radio.2" obsolete_by = "None" -graphic = "u.ddomb" +graphic = "u.bombs" +graphic_alt = "-" +sound_move = "m_atom_bomb" +sound_move_alt = "m_generic" +sound_fight = "bomb" +sound_fight_alt = "f_nuclear" +build_cost = 25 +pop_cost = 0 +attack = 10 +defense = 0 +hitpoints = 10 +firepower = 1 +move_rate = 1 +vision_radius_sq = 0 +transport_cap = 0 +fuel = 1 +uk_happy = 1 +uk_shield = 0 +uk_food = 0 +uk_gold = 1 +targets = "LandRail", "LandRoad" +flags = "NeverProtects", "OneAttack", "HasNoZOC", "Unbribable", + "WillNever", "NoVeteran", "Multislot", "CantReachAir", "Missile" +; No veteran levels (level name is never displayed) +veteran_names = _("green") +veteran_base_raise_chance = 0 +veteran_work_raise_chance = 0 +veteran_power_fact = 100 +veteran_move_bonus = 0 +roles = "" +helptext = _("\ +Bombs are several tons of explosive payload. While bombers are considered\ + to carry standard weaponry included, the Bombs unit represents heavier\ + payloads of larger, higher grade weaponry. Only bombers with high capacity can\ + carry this unit. \n\ +Bombs can only be moved by bombers or the airlift order. They can’t attack\ + from inside a domestic city. Bombs are cheap, but they damage more often than\ + kill, and even victory has a cost. Hidden expenses lie in logistics, delivery\ + risk, and non-reusability. \n\ +"), _("\ +Multislot: Under certain conditions, cities can make one (or more) multislot units per turn, plus one of any other type.\ +") + +[unit_atom_bomb] +name = _("Atom Bomb") +class = "Bomb" +tech_req = "Nuclear Fission" +obsolete_by = "None" +graphic = "u.atom_bomb" graphic_alt = "-" sound_move = "m_atom_bomb" sound_move_alt = "m_generic" sound_fight = "f_atom_bomb" sound_fight_alt = "f_nuclear" -build_cost = 1000 +build_cost = 150 pop_cost = 0 attack = 100 defense = 0 -hitpoints = 30 +hitpoints = 10 firepower = 1 move_rate = 2 vision_radius_sq = 0 transport_cap = 0 fuel = 1 -uk_happy = 4 +uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 targets = "Balloon", "Helicopter", "Air", "AirProtect", "Air_High_Altitude", "Missile", "Submarine", "LandRail", "LandRoad", "Space", "Zeppelin" disembarks = "Air", "Air_High_Altitude" flags = "NeverProtects", "FieldUnit", "OneAttack", "Nuclear", "HasNoZOC", "Unbribable", - "NeverBlocked", "WillNever", "Unique", "NoVeteran" + "NeverBlocked", "WillNever", "NoVeteran" ; No veteran levels (level name is never displayed) veteran_names = _("green") veteran_base_raise_chance = 0 @@ -4691,47 +5187,43 @@ veteran_power_fact = 100 veteran_move_bonus = 0 roles = "" helptext = _("\ -The Doomsday Bomb is the mother of all bombs. Blast area is about 100 tiles.\ - Only one can be made at a time. A city at Ground Zero will be\ - annihilated. Other cities in the blast area lose about 75% of their population.\ - All units within the blast are completely destroyed. \n\ -A Bomber can drop the Bomb within two tiles of its location. Unload the Bomb and\ - pray that you can fly the Bomber out of range. Detonate by pressing D twice. \n\ -If you have Fusion Power and the Manhattan Project was built, a Doomsday Bomb\ - can be made in a city with an Enrichment Facility. \ +If you have Nuclear Fission and the Manhattan Project has been built by any player, you can make Atom Bombs.\ + A Bomber can drop it within two tiles of its location. Unload the bomb and fly the Bomber out of range, then\ + attack the target (or detonate by pressing D twice.) The blast destroys ALL cardinally adjacent tiles. City population\ + is reduced by half. Land tiles may get nuclear fallout. \ "), _("\ -The Fallout from a Doomsday Bomb is a sure ticket to Nuclear Winter.\ +Fallout reduces tile output and increases risk of nuclear winter.\ ") -bombard_rate = 27 ; radius = sqrt(25) = 5.19 +bombard_rate = -1 ; default radius - 1 = just nuke single tile. -[unit_nuclear_missile] -name = _("Nuclear Missile") -class = "Missile" -tech_req = "Space Flight" +[unit_hbomb] +name = _("Hydrogen Bomb") +class = "Bomb" +tech_req = "Fusion Power" +impr_req = "Enrichment Facility" obsolete_by = "None" -graphic = "u.nuclear" +graphic = "u.hbomb" graphic_alt = "-" -sound_move = "m_nuclear" +sound_move = "m_atom_bomb" sound_move_alt = "m_generic" -sound_fight = "f_nuclear" -sound_fight_alt = "f_generic" -build_cost = 160 +sound_fight = "f_atom_bomb" +sound_fight_alt = "f_nuclear" +build_cost = 190 pop_cost = 0 attack = 100 defense = 0 hitpoints = 10 firepower = 1 -move_rate = 24 -vision_radius_sq = 2 +move_rate = 2 +vision_radius_sq = 0 transport_cap = 0 fuel = 1 -uk_happy = 1 +uk_happy = 2 uk_shield = 1 uk_food = 0 uk_gold = 0 -embarks = "Submarine" -disembarks = "Submarine" targets = "Balloon", "Helicopter", "Air", "AirProtect", "Air_High_Altitude", "Missile", "Submarine", "LandRail", "LandRoad", "Space", "Zeppelin" +disembarks = "Air", "Air_High_Altitude" flags = "NeverProtects", "FieldUnit", "OneAttack", "Nuclear", "HasNoZOC", "Unbribable", "NeverBlocked", "WillNever", "NoVeteran" ; No veteran levels (level name is never displayed) @@ -4742,45 +5234,48 @@ veteran_power_fact = 100 veteran_move_bonus = 0 roles = "" helptext = _("\ -If you have Space Flight and the Manhattan Project has been built by any player, you can make Nuclear Missiles.\ - Nuclear blasts destroy ALL units in a 3×3 area. City population is reduced by half. Land tiles may get nuclear fallout.\ - Fallout reduces tile output and increases risk of nuclear winter. \ +Hydrogen Bombs make Atom Bombs seem tame. Any unprotected city at Ground Zero will be absolutely annihilated.\ + In other cities in the blast radius, population is reduced by about 75%. Blast area is 21 tiles:\ + the same area as an entire city (5×5 minus the corners.) All units within the blast are destroyed. \n\ +A Bomber can drop a Hydrogen Bomb within two tiles of its location. Unload the bomb, fly the Bomber out of\ + range, then detonate by pressing D twice. \n\ +If you have Fusion Power and the Manhattan Project was built, a Hydrogen Bomb\ + can be made in a city with an Enrichment Facility. \ "), _("\ -If Fallout is cleaned on the turn it appears, the chance of nuclear winter is reduced.\ +Fallout from a Hydrogen Bomb is grave, with more than double the contaminated area.\ ") -bombard_rate = 0 ; default sq_radius of 2:every adjacent tile. +bombard_rate = 5 ; sq_radius = 2 + 5 = 7 (entire workable city area) -[unit_tactical_nuke] -name = _("Tactical Nuke") -class = "Missile" +[unit_doomsday_bomb] +name = _("Doomsday Bomb") +class = "Bomb" tech_req = "Fusion Power" impr_req = "Enrichment Facility" obsolete_by = "None" -graphic = "u.tnuke" +graphic = "u.ddomb" graphic_alt = "-" -sound_move = "m_nuclear" +sound_move = "m_atom_bomb" sound_move_alt = "m_generic" -sound_fight = "f_nuclear" -sound_fight_alt = "f_generic" -build_cost = 130 +sound_fight = "f_atom_bomb" +sound_fight_alt = "f_nuclear" +build_cost = 1000 pop_cost = 0 attack = 100 defense = 0 -hitpoints = 10 +hitpoints = 30 firepower = 1 -move_rate = 18 -vision_radius_sq = 2 +move_rate = 2 +vision_radius_sq = 0 transport_cap = 0 fuel = 1 -uk_happy = 1 +uk_happy = 4 uk_shield = 1 uk_food = 0 uk_gold = 0 -embarks = "Submarine" -disembarks = "Submarine" targets = "Balloon", "Helicopter", "Air", "AirProtect", "Air_High_Altitude", "Missile", "Submarine", "LandRail", "LandRoad", "Space", "Zeppelin" +disembarks = "Air", "Air_High_Altitude" flags = "NeverProtects", "FieldUnit", "OneAttack", "Nuclear", "HasNoZOC", "Unbribable", - "NeverBlocked", "WillNever", "NoVeteran" + "NeverBlocked", "WillNever", "Unique", "NoVeteran" ; No veteran levels (level name is never displayed) veteran_names = _("green") veteran_base_raise_chance = 0 @@ -4789,27 +5284,86 @@ veteran_power_fact = 100 veteran_move_bonus = 0 roles = "" helptext = _("\ -Tactical Nukes are very small warheads attached to missiles. A Tactical Nuke destroys all units on\ - a single tile. City population is reduced by half. The target tile may get Fallout. In theory,\ - Tactical Nukes are small enough to get the advantages of nuclear armaments without the severity of\ - consequences. In reality, they might be a gateway that escalates toward mutual assured destruction. \n\ -If you have Fusion Power and the Manhattan Project was built, a Tactical Nuke\ +The Doomsday Bomb is the mother of all bombs. Blast area is about 100 tiles.\ + Only one can be made at a time. A city at Ground Zero will be\ + annihilated. Other cities in the blast area lose about 75% of their population.\ + All units within the blast are completely destroyed. \n\ +A Bomber can drop the Bomb within two tiles of its location. Unload the Bomb and\ + pray that you can fly the Bomber out of range. Detonate by pressing D twice. \n\ +If you have Fusion Power and the Manhattan Project was built, a Doomsday Bomb\ can be made in a city with an Enrichment Facility. \ +"), _("\ +The Fallout from a Doomsday Bomb is a sure ticket to Nuclear Winter.\ +") +bombard_rate = 27 ; radius = sqrt(25) = 5.19 + +[unit_emissary] +name = _("Emissary") +class = "Land" +tech_req = "Writing" +obsolete_by = "Diplomat" +graphic = "u.emissary" +graphic_alt = "-" +sound_move = "m_diplomat" +sound_move_alt = "m_generic" +sound_fight = "f_diplomat" +sound_fight_alt = "f_generic" +build_cost = 24 +pop_cost = 0 +attack = 0 +defense = 0 +hitpoints = 8 +firepower = 1 +move_rate = 3 +vision_radius_sq = 4 +transport_cap = 0 +fuel = 0 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +embarks = "LandRail", "Helicopter" ; transport helicopter only +disembarks = "LandRail", "Helicopter" +flags = "Diplomat", "IgZOC", "NonMil", "HasNoZOC", "Expellable", "Cant_Pillage", "CanClaim", "Settlers" +veteran_names = + _("?diplomatic_rank:courier"), + _("?diplomatic_rank:messenger"), + _("?diplomatic_rank:envoy"), + _("?diplomatic_rank:legate"), + _("?diplomatic_rank:consul"), + _("?diplomatic_rank:minister"), + _("?diplomatic_rank:manus regis") + +veteran_base_raise_chance = 60, 50, 40, 30, 20, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 110, 115, 120, 125, 130, 135 +veteran_move_bonus = 0, 0, 0, 0, 3, 3, 3 +roles = "DiplomatStartUnit" +helptext = _("\ +An Emissary performs official or covert actions. Covert actions make incidents\ + which let Senates break treaties. Emissaries in cities may defend such acts with\ + diplomatic combat. Emissaries can • Bribe a lone unit • Establish embassy • Investigate City\ + • Steal tech • Steal maps • Incite city revolt. \n\ +Except for Bribing and Investigate City, diplomatic actions will spend the Emissary,\ + making him unavailable for further use. Emissaries may claim a tile for your nation\ + if adjacent to a tile claim made inside your own national border. Foreign tile claims require\ + the Emissary to be accompanied by another unit. \ +"), _("\ +Emissaries have no upgrade cost. Full rules for Emissaries are in the Manual.\ ") -bombard_rate = -2 ; 2 - 2 = 0:only nukes target tile. [unit_diplomat] name = _("Diplomat") class = "Land" -tech_req = "Writing" -obsolete_by = "Spy" +tech_req = "Economics" +obsolete_by = "None" graphic = "u.diplomat" graphic_alt = "-" sound_move = "m_diplomat" sound_move_alt = "m_generic" sound_fight = "f_diplomat" sound_fight_alt = "f_generic" -build_cost = 26 +build_cost = 30 pop_cost = 0 attack = 0 defense = 0 @@ -4831,8 +5385,8 @@ veteran_names = _("?diplomatic_rank:secretary"), _("?diplomatic_rank:envoy"), _("?diplomatic_rank:ambassador"), - _("?diplomatic_rank:emissary"), - _("?diplomatic_rank:statesman"), + _("?diplomatic_rank:statesmen"), + _("?diplomatic_rank:premier"), _("?diplomatic_rank:plenipotentiary") veteran_base_raise_chance = 60, 50, 40, 30, 20, 15, 0 @@ -4842,15 +5396,17 @@ veteran_move_bonus = 0, 0, 0, 0, 3, 3, 3 roles = "DiplomatStartUnit" helptext = _("\ A Diplomat performs official or covert actions. Covert actions make incidents\ - which let Senates break treaties. Diplomats in cities may defend such acts with\ - diplomatic combat. Diplomats can • Bribe a lone unit • Establish embassy • Investigate City\ - • Sabotage random production or buildings • Steal tech • Steal maps • Incite city revolt. \n\ -Except for Bribing and Investigate City, diplomatic actions will spend the Diplomat,\ - making it unavailable for further use. Diplomats may claim a tile for your nation\ - if adjacent to a tile claim made inside your own national border. Foreign tile claims require\ - the Diplomat be accompanied by another unit.\ + which let Senates break treaties. Diplomats can do what Emissaries can, and also:\ + • Move faster • Establish Embassy without spending unit\ + • Sabotage random production or buildings. \n\ +Except for Bribing, Establishing Embassy, and Investigate City, diplomatic actions will\ + spend the Diplomat, making him unavailable for further use. Diplomats may claim a tile for\ + your nation if adjacent to a tile claim made inside your own national border. Foreign tile\ + claims require the Diplomat to be accompanied by another unit. \n\ +Espionage tech allows Diplomats to establish hostile embassies vs. Courthouse and Homeland\ + Security (but not vs. Police Station or Theocracy.)\ "), _("\ -Full rules for Diplomats are in the Manual.\ +Diplomats can be upgraded from Emissaries for free. Full rules for Diplomats are in the Manual.\ ") [unit_spy] @@ -4894,9 +5450,8 @@ veteran_base_raise_chance = 60, 50, 40, 30, 20, 15, 0 veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 veteran_power_fact = 100, 110, 115, 120, 125, 130, 135 veteran_move_bonus = 0, 0, 0, 0, 3, 3, 3 -roles = "DiplomatStartUnit" helptext = _("\ -Spies can do what a Diplomat can, and also:• Survive ops\ +Except for establishing an embassy, Spies can do what a Diplomat can, and also:• Survive ops\ • Sabotage lone units • Poison city water • Steal specific tech\ • Steal tech from cities more than once • Sabotage specific targets in cities. \ "), _("\ @@ -4904,66 +5459,61 @@ Spies who survive ops escape to the nearest friendly city. Spies have\ a 25% advantage over Diplomats in combat:a base 75% chance to win.\ Spies may claim a tile for your nation if adjacent to a tile claim made\ inside your own national border. Tile claims require the Spy to be accompanied\ - by a military unit.\ + by another unit.\ Full rules are in the Manual.\ ") -[unit_caravan] -name = _("Caravan") +[unit_patriarch] +name = _("Patriarch") class = "Land" -tech_req = "Trade" -obsolete_by = "Truck" -graphic = "u.caravan" -graphic_alt = "-" -sound_move = "m_caravan" +tech_req = "Theocracy" +impr_req = "Ecclesiastical Palace" +gov_req = "Theocracy" +obsolete_by = "None" +graphic = "u.patriarch_o" +graphic_alt = "u.emissary" +sound_move = "m_diplomat" sound_move_alt = "m_generic" -sound_fight = "f_caravan" +sound_fight = "f_diplomat" sound_fight_alt = "f_generic" -build_cost = 30 +build_cost = 55 pop_cost = 0 attack = 0 -defense = 1 -hitpoints = 10 +defense = 0 +hitpoints = 8 firepower = 1 -move_rate = 2 +move_rate = 4 vision_radius_sq = 4 +transport_cap = 0 fuel = 0 uk_happy = 0 uk_shield = 0 uk_food = 0 uk_gold = 0 -transport_cap = 2 -cargo = "Cargo" -embarks = "LandRoad", "Helicopter" ; transport helicopter only -disembarks = "LandRoad", "Helicopter" -flags = "HelpWonder", "TradeRoute", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Expellable", "Cant_Pillage" -roles = "AttackStrongStartUnit" ;note:MP2 does not start games with ASSUs so has co-opted this for caravan start unit. -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite runner"), - _("?vet_rank:caravaneer"), - _("?vet_rank:master runner"), - _("?vet_rank:zaeim alqafila") -veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 250, 300, 350, 400 -veteran_move_bonus = 7, 7, 7, 7, 8, 9, 10 +embarks = "LandRail", "Helicopter" ; transport helicopter only +disembarks = "LandRail", "Helicopter" +flags = "Unique", "Diplomat", "Unbribable", "IgZOC", "NonMil", "HasNoZOC", "Expellable", "Cant_Pillage", "CanClaim", "Settlers", "NoVeteran" +; No veteran levels (level name is never displayed) +veteran_names = _("chosen one") +veteran_base_raise_chance = 0 +veteran_work_raise_chance = 0 +veteran_power_fact = 125 +veteran_move_bonus = 0 helptext = _("\ -The Caravan is versatile and rugged. It is the only all-terrain land Commerce unit.\ - It is also the only one that presents no potential military\ - threat to trade partners. It can defend itself, fortify, and has 2 7/9 moves. \n\ -Commerce units can help build Wonders in any city with whom\ - you are not at war. In foreign cities 15+ tiles distant, they can create Trade Routes,\ - increasing net trade in both cities relative to their combined trade. Routes are inactive\ - during war and (re)activate during peace. \n\ -Commerce units can enter the Marketplace of non-hostile foreign cities to sell their - wares:revenue derives from total trade in both cities. This is only profitable between - cities with very high trade. \n\ -Commerce units can build any Wonders for which you have the tech requirement. To use them\ - for a Trade Route, they need to have given a Home City. \n\ -All Commerce units can carry Goods as cargo.\ +The Patriarch is unique—you can make only one, and only with Theocracy in a\ + city with an Ecclesiastical Palace. He can do what Diplomats can do, with extra\ + powers of persuasion. Under Theocracy, the Patriarch converts units to join your\ + side at 1/3 the cost of a normal Bribe; and incites cities to become yours at\ + one third the normal cost. \n\ +Investigating, Converting, Establishing Embassy, and Inciting can be done multiple times if\ + successful. Other actions spend the Patriarch, allowing no further use. A Patriarch may\ + claim a tile for your nation if adjacent to a tile claim made inside your own national border.\ + Foreign tile claims require the Patriarch to be accompanied by another unit. \n\ +Espionage tech allows the Patriarch to establish hostile embassies vs. Courthouse and Homeland\ + Security (but not vs. Police Station or Theocracy.) \n\ +"), _("\ +In diplomatic contests, the wiles, power, and influence of the Patriarch make him equal\ + to a Spy in strength.\ ") [unit_wagon] @@ -4992,7 +5542,7 @@ uk_shield = 0 uk_food = 0 uk_gold = 0 cargo = "Land", "Cargo", "LandAirSea" -flags = "HelpWonder", "TradeRoute", "Cant_Fortify", "NonMil", "HasNoZOC", "Capturable", "Expellable", "Shield2Gold", "NoVeteran" +flags = "HelpWonder", "TradeRoute", "Cant_Fortify", "NonMil", "HasNoZOC", "Capturable", "Expellable", "NoVeteran" roles = "" ; No veteran levels (level name is never displayed) veteran_names = _("green") @@ -5011,6 +5561,61 @@ Wagons allow units with less than 3 move points to travel your roads faster.\ Read the help on Caravans to see what Commerce units can do.\ ") +[unit_caravan] +name = _("Caravan") +class = "Land" +tech_req = "Trade" +obsolete_by = "Truck" +graphic = "u.caravan" +graphic_alt = "-" +sound_move = "m_caravan" +sound_move_alt = "m_generic" +sound_fight = "f_caravan" +sound_fight_alt = "f_generic" +build_cost = 30 +pop_cost = 0 +attack = 0 +defense = 1 +hitpoints = 10 +firepower = 1 +move_rate = 2 +vision_radius_sq = 4 +fuel = 0 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +transport_cap = 3 +cargo = "Cargo" +embarks = "LandRoad", "Helicopter" ; transport helicopter only +disembarks = "LandRoad", "Helicopter" +flags = "HelpWonder", "TradeRoute", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Expellable", "Cant_Pillage" +roles = "AttackStrongStartUnit" ;note:MP2 does not start games with ASSUs so has co-opted this for caravan start unit. +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite runner"), + _("?vet_rank:caravaneer"), + _("?vet_rank:master runner"), + _("?vet_rank:zaeim alqafila") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 250, 300, 350, 400 +veteran_move_bonus = 7, 7, 7, 7, 8, 9, 10 +helptext = _("\ +The Caravan is versatile and rugged. It is the only all-terrain land Commerce unit.\ + It is also the only one that presents no potential military\ + threat to trade partners. It can defend itself, fortify, and carry 3 Goods or Freight. \n\ +Commerce units can help build Wonders in any city with whom\ + you are not at war. In foreign cities 15+ tiles distant, they can create Trade Routes,\ + increasing net trade in both cities relative to their combined trade. Routes are inactive\ + during war and (re)activate during peace. \n\ +Commerce units can build any Wonders for which you have the tech requirement. To use them\ + for a Trade Route, they need to have given a Home City. \n\ +All Commerce units can carry Goods as cargo.\ +") + [unit_train] name = _("Train") class = "LandRail" @@ -5051,7 +5656,7 @@ Trains are Commerce units with a bonus:they allow units with less than 3 move Trains are more restricted than for Wagons and Trucks. Except for Foot soldiers,\ all units need to be in a city to get on or off a Train. \n\ Foot Soldiers use Trains the same as Wagons and Trucks, and can: \n\ - 1. Board anywhere; \n 2. Deboard in a Base or Quay.; \n\ + 1. Board anywhere; \n 2. Deboard in a Base or Quay; \n\ 3. Disembark outside a City (loses all moves.) \n\n\ On non-allied foreign rails, Trains incur full terrain movement cost.\ Pre-gunpowder units can’t attack Trains. \n\n\ @@ -5061,7 +5666,7 @@ Electricity and Combustion each give Trains an additional +1 move.\ [unit_truck] name = _("Truck") class = "LandRoad" -tech_req = "The Corporation" +tech_req = "Automobile" obsolete_by = "None" graphic = "u.truck" graphic_alt = "-" @@ -5084,13 +5689,13 @@ uk_shield = 0 uk_food = 0 uk_gold = 0 cargo = "Land", "LandAirSea", "Bomb", "Cargo" -flags = "HelpWonder", "TradeRoute", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Expellable", "NoVeteran", "Cant_Pillage" +flags = "HelpWonder", "TradeRoute", "NonMil", "HasNoZOC", "Capturable", "Expellable", "NoVeteran", "Cant_Pillage" roles = "" helptext = _("\ The Truck replaces the Caravan as the basic Commerce unit on Land. It moves at\ - more than twice the speed; but is restricted to the same roads and flatland\ - tiles as Wagons, and can't use rails. Each Truck used to build a Wonder\ - will add 50 shields. See the entry on Caravan to read what Commerce units may do. \n\ + more than twice the speed; but is restricted to roads and quays, and can’t use rails.\ + Each Truck used to build a Wonder will add 50 shields. See the entry on Caravan to read\ + what Commerce units may do. \n\ "), _("\ Trucks allow units with less than 3 move points to travel your roads faster: Like\ the Wagon, any cargo can board a Truck anywhere, but a city, quay, or base is\ @@ -5123,26 +5728,22 @@ uk_happy = 0 uk_shield = 0 uk_food = 0 uk_gold = 0 -flags = "TradeRoute", "NonMil", "HasNoZOC", "Capturable", "Cant_Fortify", "NoVeteran", "Cant_Pillage" +flags = "HelpWonder", "TradeRoute", "NonMil", "HasNoZOC", "Capturable", "Cant_Fortify", "NoVeteran", "Cant_Pillage" roles = "" helptext = _("\ -Goods are commodities.\ - The cargo containers of the ancient world were amphorae, which carried\ - trade goods. \n\ -Goods can be used to establish Trade Routes or Enter Marketplace. They can\ - be carried by Commerce units, allowing you to establish multiple\ - trade routes in one voyage. Also, Goods can Recycle Production with only\ - a 15% penalty, rendering 17 shields into a city production target. \n\ +Goods are used to establish Trade Routes, Help Build Wonders, and contribute to\ + city production. Recycle Production has a penalty of only 3 shields,\ + yielding 17 shields into a city’s production target. \n\ "), _("\ -By themselves, Goods can only move onto tiles with a City, Quay, Fortress,\ - or Naval Base. Commerce units, Tribesmen, and Galleons must carry them as cargo.\ - If adjacent to a foreign city, use the Do command (D) for Commerce functions.\ +Goods can only move to tiles with a City, Quay, Fortress, Airbase, or Naval Base. Otherwise\ + they must be transported. If adjacent to a foreign city, use the Do\ + command (D) for Commerce functions.\ ") [unit_freight] name = _("Freight") class = "Cargo" -tech_req = "Mass Production" +tech_req = "The Corporation" obsolete_by = "None" graphic = "u.container" graphic_alt = "u.freight" @@ -5165,74 +5766,23 @@ uk_shield = 0 uk_food = 0 uk_gold = 0 disembarks = "Air", "LandRoad", "LandRail", "Sea", "RiverShip" -flags = "HelpWonder", "TradeRoute", "NonMil", "HasNoZOC", "Capturable", "Cant_Fortify", "NoVeteran", "Cant_Pillage" +flags = "HelpWonder", "TradeRoute", "IgZOC", "NonMil", "HasNoZOC", "Capturable", + "Cant_Fortify", "NoVeteran", "Cant_Pillage", "MultiSlot" roles = "" helptext = _("\ -The methodical logistics of modern shipping render the Freight unit:a cargo\ - container separate from the transport vehicle. Freight brings benefits of\ - organized efficiency. Like all Commerce units, it can Help Build\ - Wonders, and Establish Trade Route or Enter Marketplace (with a lower unit cost.)\ - Unlike other Commerce units, it can Disband to Recycle Production with\ - no net loss in shields. This gives Freight a variety of creative industrial uses. \n\ +Freight brings benefits of organized efficiency. Like all Commerce units, it can\ + Help Build Wonders, and Establish Trade Route. Unlike other Commerce units, it\ + can Disband to Recycle Production with no net loss in shields. This gives\ + Freight a variety of industrial uses. Similar to Infantry, Freight can use extra\ + build slots a city may have.\ + \n\ "), _("\ By itself, Freight is only able to move to tiles with loading infrastructure:\ - Cities, Quays, Fortresses, and Naval Bases. To be transported, it must be carried\ - by Train, Truck, Airplane, or ship. If adjacent to a foreign city, use the D key to\ + Cities, Quays, Fortresses, Airbases, and Naval Bases. To be transported, it must be carried\ + as cargo. If adjacent to a foreign city, use the D key to\ do Commerce functions.\ ") -[unit_scout] -name = _("Scout") -class = "Land" -tech_req = "Horseback Riding" -obsolete_by = "Partisan" -graphic = "u.scout" -graphic_alt = "-" -sound_move = "m_explorer" -sound_move_alt = "m_generic" -sound_fight = "f_horsemen" -sound_fight_alt = "f_generic" -build_cost = 18 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 8 -firepower = 1 -move_rate = 1 -vision_radius_sq = 5 -transport_cap = 0 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -embarks = "LandRoad", "Helicopter" ; transport helicopter only -disembarks = "LandRoad", "Helicopter" -flags = "IgTer", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Expellable", "Cant_Pillage", "NoHome" -roles = "Explorer", "ExplorerStartUnit" -veteran_names = - _("?vet_rank:green"), - _("?vet_rank:veteran"), - _("?vet_rank:hardened"), - _("?vet_rank:elite"), - _("?vet_rank:crack"), - _("?vet_rank:master"), - _("?vet_rank:wind walker") -veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 -veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 -veteran_power_fact = 100, 150, 175, 250, 300, 350, 400 -veteran_move_bonus = 3, 4, 5, 6, 7, 8, 9 -helptext = _("\ -Scouts are brave explorers of unknown territory. They can slip through enemy\ - ZOC. Like Tribesmen, they ignore terrain penalties, treating every tile as if it had\ - a road. This means they can move 4 tiles per turn (6 with the discovery of Map Making.)\ - As a non-military traveler, they can visit far off cities to Investigate City and gather\ - intel. Sometimes, generals will use their scouting information for strategic advantage.\ - Scouts can make contact with far-off lands to arrange cease-fire or peace. Best of all,\ - Scouts live off the land and have no upkeep. In later times, Scouts upgrade to\ - Partisans.\ -") - [unit_leader] name = _("?unit:Leader") class = "Land" @@ -5366,57 +5916,98 @@ When a Barbarian Leader is killed on a tile without any defending units,\ the 100 gold ransom is paid, but only to land units and helicopters.\ ") -[unit_peasants] -name = _("Peasants") +[unit_welldigger] +name = _("Well-Digger") class = "Land" -tech_req = "Monarchy" -gov_req = "Monarchy" -impr_req = "Magna Carta" -obsolete_by = "None" -graphic = "u.peasants" -graphic_alt = "u.migrants" +tech_req = "None" +obsolete_by = "Workers" +graphic = "u.well_digger" +graphic_alt = "-" sound_move = "m_worker" sound_move_alt = "m_generic" sound_fight = "f_worker" sound_fight_alt = "f_generic" -build_cost = 10 -pop_cost = 1 +build_cost = 5 +pop_cost = 0 attack = 0 defense = 1 hitpoints = 8 firepower = 1 -move_rate = 2 +move_rate = 3 vision_radius_sq = 4 transport_cap = 0 fuel = 0 -city_size = 1 uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only -disembarks = "LandRoad", "LandRail", "Helicopter" -flags = "Cant_Fortify", "NonMil", "HasNoZOC", "AddToCity", "Capturable", "Expellable", "Cant_Pillage", "Shield2Gold" +uk_shield = 5 +uk_food = 2 +uk_gold = 2 +flags = "Settlers", "Infra", "NonMil", "HasNoZOC", "Cant_Fortify", "Unique", "Well-Digger", "Expellable" +embarks = "LandRoad" +disembarks = "LandRoad" ; No veteran levels (level name is never displayed) veteran_names = _("green") veteran_base_raise_chance = 0 veteran_work_raise_chance = 0 veteran_power_fact = 100 veteran_move_bonus = 0 +roles = "AttackFastStartUnit" ;this role taken over for well-digger helptext = _("\ -Population Cost: 1. Adds Population: 1.\n\n\ -Peasants are the common people of Monarchies. You can encourage them\ - by royal edict to migrate to other cities and help colonize new\ - areas. But to have such access, you must be a Constitutional Monarchy\ - with the Magna Carta wonder: Peasants can only be made in\ - the city with Magna Carta, so choose that city carefully. \n\ -If managed correctly, Peasants can increase your national population\ - growth. They give a tremendous advantage for growing new colonies\ - and settlements faster. \n\ -Peasants can only be made in one city, but you can make more than one per\ - turn under the right conditions. When a city completes a unit, it will try\ - to make more of them if it doesn’t have a worklist. So be careful!\ +This unit can fix unlucky starts, but has very high upkeep.\ + If you have no water, make a Well-Digger in a city that can\ + support it, create a water source, then disband the unit. \n\ + This unit can dig wells to create irrigation sources. It will cost its home city\ + -2 Food -2 Prod. This unit WILL NOT WORK:• Outside your borders,\ + • After Alphabet or Pottery, • After any player discovers Writing,\ + • After it reaches an age of 10 turns.\ + >> Don’t fool around:high upkeep will permanently hinder you. Only make this unit if you\ + lack water when the game starts!\ +") + +[unit_magnum_turret] +name = _("Magnum Turret") +class = "LandImmobile" +tech_req = "Mass Production" +obsolete_by = "None" +graphic = "u.turret_guns_o" +graphic_alt = "-" +sound_move = "m_generic" +sound_move_alt = "m_generic" +sound_fight = "f_battleship" +sound_fight_alt = "f_generic" +build_cost = 160 +pop_cost = 0 +attack = 10 +defense = 7 +hitpoints = 40 +firepower = 3 +move_rate = 3 +vision_radius_sq = 4 +transport_cap = 0 +fuel = 0 +city_size = 5414 ; 000000,010,101,001001,10 = atk_bonus=0, max_kills=2, targets=5, move_cost=9 frags, stay_fortfy=1, reserved = 0 +paratroopers_mr_sub = 14336 ; 000,00111,00,0000,000,0,0 - max_ATKs=0, bbd_retal_rate=7, iPill_rand_tgts=0, iPill_odds=0, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 +uk_happy = 0 ; it's always stuck in a city +uk_shield = 1 +uk_food = 0 +uk_gold = 0 +targets = "Balloon", "LandRail", "Zeppelin" +flags = "Unique", "CantReachAir", "Bombarder", "Reserved1" ;autoattacks (!NonMil) targets instead of "Provoking" targets +roles = "" +helptext = _("\ +On rare occasions in history, nations constructed monumental turret guns.\ + Cost-benefit is debatable among military theorists due to scale, cost, and immobility.\ + The Magnum Turret stays where it’s built. You may build only one. \n\n\ +Housed in armored defenses, the Magnum Turret deters attackers and nearby enemy\ + encampments. It may attack or Bombard ocean tiles.\n\ +"), _(" +If it has moves left, the Magnum Turret can do 7 rounds of Bombardment\ + up to 2 tiles distant upon five units, with two possible fatalities. When special attacked from range, it can\ + retaliate with the same type of Bombardment. \n\ +"), _(" +VIGIL:the Vigil order instructs the Magnum Turret to auto-Bombard adjacent military units if they\ + have better attack odds.\ ") +bombard_rate = 7 ;*** This unit can be turned on by uncommenting this, the Virtual class above, and adding "Virtual" as native to oceanic tiles ;*** in terrain.ruleset. @@ -5448,7 +6039,7 @@ Peasants can only be made in one city, but you can make more than one per\ ;vision_layer = "Subsurface" ;embarks = "Sea" ;disembarks = "Sea" -;flags = "IgZOC", "IgTer", "NonMil", "HasNoZOC", "Unbribable", "WillNever", "NoHome", "NoVeteran", "Shield2Gold" +;flags = "IgZOC", "IgTer", "NonMil", "HasNoZOC", "Unbribable", "WillNever", "NoHome", "NoVeteran", "MultiSlot" ;helptext = _("\ ;A Sonar Ping represents active focusing of ship sonar on a\ ; specific area. Destroyer class and AEGIS Cruisers may take\ @@ -5476,7 +6067,7 @@ build_cost = 10 pop_cost = 0 attack = 2 defense = 1 -hitpoints = 10 +hitpoints = 5 firepower = 1 move_rate = 2 vision_radius_sq = 2 @@ -5508,7 +6099,7 @@ build_cost = 10 pop_cost = 0 attack = 2 defense = 1 -hitpoints = 10 +hitpoints = 4 firepower = 1 move_rate = 2 vision_radius_sq = 2 @@ -5540,7 +6131,7 @@ build_cost = 10 pop_cost = 0 attack = 2 defense = 1 -hitpoints = 10 +hitpoints = 5 firepower = 1 move_rate = 2 vision_radius_sq = 2 @@ -5636,7 +6227,7 @@ build_cost = 10 pop_cost = 0 attack = 2 defense = 1 -hitpoints = 7 +hitpoints = 6 firepower = 1 move_rate = 1 vision_radius_sq = 2 @@ -5668,7 +6259,7 @@ build_cost = 10 pop_cost = 0 attack = 1 defense = 1 -hitpoints = 10 +hitpoints = 9 firepower = 1 move_rate = 1 vision_radius_sq = 2 diff --git a/freeciv/freeciv/data/mp2/README.mp2 b/freeciv/freeciv/data/mp2/README.mp2 index 130dd9492..1d1a0a9c4 100644 --- a/freeciv/freeciv/data/mp2/README.mp2 +++ b/freeciv/freeciv/data/mp2/README.mp2 @@ -17,12 +17,19 @@ LINKS: Hotkeys and Mouse Control +Multiplayer-Evolution II rulesets are a project to modernize the original Multiplayer 1.0 ruleset by taking advantage of cutting-edge advancements in +Freeciv Server development. For those unfamiliar with the original Multiplayer project, it aimed to take a Civ 2 type of gameplay into a format that +balanced and accomodate to massive multiplayer play. -The Multiplayer-Evolution ruleset is a fully modernized ruleset to take advantage of cutting-edge advancements in Freeciv Server development. -Compared to original Multiplayer, the most notable changes will be new early-game sea units, new late-game air units, and the wholescale improvement -of balance and tactical possibility in late-game Air and Sea units. A large number of contributors over an almost two year period helped add and -balance many other changes whose aim was to increase playability, strategic depth and creativity, realism, and overall richness. -Enjoy! +The "/ruleset mp2" is the first release and first iteration of the MP2 project. This version is preserved for historical reasons. +MP2 Avant-garde ("/ruleset mp2-ag") is the successful release that completed all the goals of this first historic release. + +Compared to original Multiplayer 1.0, the most notable changes in early MP2 are to early-game sea units, new late-game air units, and wholescale +improvement of balance and tactical possibility in late-game Air and Sea units. Numerous smaller fixes to the original Multiplayer 1.0 ruleset +are also logged below. + +A large number of contributors over an almost two year period helped add and balance many other changes whose aim was to increase playability, +strategic depth and creativity, realism, and overall richness. Enjoy! ----------------------------- Changes from Multiplayer 1.0: @@ -188,5 +195,4 @@ NEW FEATURES / GAME MECHANICS 21. Incite cost changed. Goes from impossibly high to extremely high (but theoretically possible: e.g., 120000 might go to 4500) - END. \ No newline at end of file diff --git a/freeciv/freeciv/data/mp2/game.ruleset b/freeciv/freeciv/data/mp2/game.ruleset index 2390949e5..f3bf204cd 100644 --- a/freeciv/freeciv/data/mp2/game.ruleset +++ b/freeciv/freeciv/data/mp2/game.ruleset @@ -1230,7 +1230,8 @@ actor_reqs = action = "Upgrade Unit" actor_reqs = { "type", "name", "range", "present" - "DiplRel", "Foreign", "Local", FALSE + "DiplRel", "Foreign", "Local", FALSE + "CityTile", "Center", "Local", TRUE } [actionenabler_airlift_unit] diff --git a/freeciv/freeciv/data/mp2/units.ruleset b/freeciv/freeciv/data/mp2/units.ruleset index e6fdca460..74e1405b2 100644 --- a/freeciv/freeciv/data/mp2/units.ruleset +++ b/freeciv/freeciv/data/mp2/units.ruleset @@ -1,3 +1,4 @@ +;:::::::::::::::::::::::::::::::::::::::::’ × ; Modifying this file: ; You should not modify this file except to make bugfixes or ; for other "maintenance". If you want to make custom changes, @@ -11,8 +12,9 @@ ; the first available (not obsolete) such unit, or by picking the last ; such unit directly. When determining starting units, the first ; unit with the relevant role that the player can build will be chosen. -; If no such unit can be found (eg Explorers that require Seafaring), +; If no such unit can be found (eg Explorers that require Map Making), ; then the first unit with this role will be chosen. +;:::::::::::::::::::::::::::::::::::::::::’ × [datafile] description="Unit definitions for the Multiplayer-Evo ruleset." @@ -63,14 +65,11 @@ flags = _("FortBuster"), _("Defending Forts get no bonus. +33% attack bonus vs. the 2× defense of a Fortress.") _("FortressBuster"), _("Defending Fortresses get no bonus.") _("AntiAir"), _("Anti-Air bonus of this unit is less effective against Stealth, which has a 25% bonus against this unit.") -;;; _("NeverProtects"), _("Does not protect other units on its tile.") ; UNCOMMENT THIS IF NOT USING SCL'S PATCH FOR THIS FLAG ;;; _("NeverBlocked"), _("Bypasses unreachable units when attacking a tile.") ; UNCOMMENT THIS IF NOT USING LEXXIE'S PATCH FOR THIS FLAG - _("MultiSlot"), _("Cities with proper requirements can produce more than one of these per turn.") ;uncomment if you don't have slot_control patch +;;; _("MultiSlot"), _("Cities with proper requirements can produce more than one of these per turn.") ;uncomment if you don't have slot_control patch _("CanHide"), _("In appropriate terrain, this unit can make a Hideout, which will conceal all land units on the tile.") _("WillNever") -;;; The following flag MUST be #34 position to work with hack in movement.c which allows transported AAA to defend on non-native: -;;; this comment can be removed when we have some smarter way for unit_can_defend_here(..) to get ruleset control. - _("TransportDefender"), _("Can defend while transported on non-native tiles.") +;;; _("TransportDefender"), _("Can defend while transported on non-native tiles.") ;uncomment if you don't have TransportDefender patch _("NonMilAttack"), _("Has military capacity but for peaceful purposes, can enter territories with whom you are at Peace") _("Cant_Pillage"), _("Unable to pillage tiles.") } @@ -150,7 +149,6 @@ veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 ; "TerrainDefense" = Unit Class gains defense bonus from terrain ; "DamageSlows" = Damaged units are slowed down ; "CanOccupyCity" = Military units of this class can occupy enemy cities -; "Missile" = Unit Class is destroyed when it attacks ; "BuildAnywhere" = Unit Class can be built even in the middle of non-native terrain ; "Unreachable" = Unit Class can be attacked only by units explicitly listing this ; class in its 'targets', unless on a city or native base. @@ -162,7 +160,6 @@ veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 ; override this ; "CanFortify" = Unit can fortify at land tiles. Unit type flag ; "Cant_Fortify" can override this -; "CanPillage" = Unit Class can pillage tile infrastructure ; "DoesntOccupyTile" = Even if this class of enemy unit is on tile, cities can ; still work that tile ; "AttackNonNative" = Unit Class can attack units on non-native tiles. Unit type @@ -175,19 +172,17 @@ veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 ; "KillCitizen" = Upon successful attack against a city, unit kills one ; citizen. The effect "Unit_No_Lose_Pop" and the server ; setting 'killcitizen' can disable this. - -; "Airliftable" = This Unit Class may be airlifted +; ; */ <-- avoid gettext warnings ; ********************************************************************************** ; ********************************************************************************** -; WARNING: ANY CHANGES TO WHAT TYPES OR CLASSES CAN LOAD ONTO WHICH TRANSPORTS MAY +; WARNING:ANY CHANGES TO WHAT TYPES OR CLASSES CAN LOAD ONTO WHICH TRANSPORTS MAY ; REQUIRE CHANGES TO FCW function unit_could_possibly_load() in unit.js ; ********************************************************************************** ; ********************************************************************************** [unitclass_missile] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Missile") min_speed = 1 hp_loss_pct = 0 @@ -200,10 +195,12 @@ name = _("?unitclass:Bomb") min_speed = 1 hp_loss_pct = 0 hut_behavior = "Frighten" -flags = "Unreachable", "DoesntOccupyTile", "Airliftable" +flags = "Unreachable", "DoesntOccupyTile", "Airliftable" +helptext = _("\ + • Can be airlifted from a suitable city.\ +") [unitclass_land] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Land") min_speed = 1 hp_loss_pct = 0 @@ -242,31 +239,28 @@ helptext = _("\ ") [unitclass_sea] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Sea") min_speed = 3 hp_loss_pct = 0 flags = "DamageSlows", "AttackNonNative", "AttFromNonNative", "CanPillage" helptext = _("\ - • Crew Repair: each turn, regardless of movement, recovers 8% of its hit points (rounded down).\ + • Crew Repair:each turn, regardless of movement, recovers 8% of its hit points (rounded down).\ ") ; Separating the Submarine class finally allows it to be unreachable by Air. The old Submarine was ; far too offensively overpowered while simultaneously almost useless from ultra-vulnerability to Air units. ; Because it is now Unreachable, any unit able to attack it needs this class in its targets. [unitclass_submarine] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Submarine") min_speed = 3 hp_loss_pct = 0 flags = "DamageSlows", "AttackNonNative", "AttFromNonNative", "CanPillage", "Unreachable" helptext = _("\ - • Visibility bonus: not visible to other players unless they have a unit or city adjacent to it.\n\ - • Crew Repair: each turn, regardless of movement, recovers 2 hit points.\ + • Visibility bonus:not visible to other players unless they have a unit or city adjacent to it.\n\ + • Crew Repair:each turn, regardless of movement, recovers 2 hit points.\ ") [unitclass_trireme] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Trireme") min_speed = 2 hp_loss_pct = 0 @@ -280,7 +274,6 @@ hp_loss_pct = 0 flags = "DamageSlows", "AttackNonNative", "AttFromNonNative" [unitclass_heli] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Helicopter") min_speed = 1 hp_loss_pct = 10 @@ -288,7 +281,6 @@ flags = "Unreachable", "CanOccupyCity", "CollectRansom", "Airliftable" ; This class is for air units that are unreachable but do not protect a stack. [unitclass_air] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Air") min_speed = 1 hp_loss_pct = 0 @@ -297,7 +289,6 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; This class is for air units that can pillage terrain (i.e. Jet Bomber) [unitclass_airpillage] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:AirPillage") min_speed = 1 hp_loss_pct = 0 @@ -305,19 +296,16 @@ hut_behavior = "Frighten" flags = "Unreachable", "DoesntOccupyTile", "Airliftable", "CanPillage" ; This class is for air units that can also protect a stack. -; (Fighters) -- technically a separate AirProtect class is not needed, but +; (Fighters) — technically a separate AirProtect class is not needed, but ; Fighters also have Border Police abilities, and a separate class ; facilitates future adjustments and balancing in an isolated class. [unitclass_air_protect] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:AirProtect") min_speed = 1 hp_loss_pct = 0 hut_behavior = "Frighten" flags = "Unreachable", "DoesntOccupyTile", "Airliftable", "BorderPolice" - [unitclass_balloon] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Balloon") min_speed = 1 hp_loss_pct = 0 @@ -327,13 +315,13 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; /* <-- avoid gettext warnings ; -; Below: The individual unit types, one per section. +; Below:The individual unit types, one per section. ; ; The number can be variable, up to 200. ; However for the "official" rulesets, units should not be removed ; because that would break backward compatability with savegames. ; -; The order here matters: later units are considered "better" for +; The order here matters:later units are considered "better" for ; a given flag or role. ; ; The actual tag used (the * in [unit_*]) does not matter, except @@ -366,7 +354,7 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; hitpoints = how much damage unit can withstand ; firepower = number of hitpoints removed per round of combat; at least 1 ; move_rate = base move rate (whole movement points) -; vision_radius_sq = base vision of unit: unit can see tile up to the square +; vision_radius_sq = base vision of unit:unit can see tile up to the square ; root of this value away ; convert_to = can be converted to another type of unit by name ; convert_time = number of movement points it takes to convert to @@ -437,9 +425,9 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; "DefenseDivider" = Divide defense value with (1 + 'value'). ; Bonus is defined in attackers entry. ; "DefenseDividerPct" = Divide defense value by 1 + (value / 100). -; Value of 100 means division by 2, (2x for attacker) -; value of 50 means division by 1.5, (1.5x for attacker) -; i.e.: Effectively increases *attack* by value percent. +; Value of 100 means division by 2, (2× for attacker) +; value of 50 means division by 1.5, (1.5× for attacker) +; i.e.:Effectively increases *attack* by value percent. ; "FirePower1" = Defender firepower is reduced to value 1 when ; ever this has non-zero value. ; Bonus is defined in attackers entry. @@ -448,19 +436,20 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; ; "IgZOC" = ignore Zones of Control (ZOC) even if unit class has ; "ZOC" flag -; "HasNoZOC" = unit has no Zone of Control (ZOC), thus any unit can move -; around it freely -; "NonMil" = a non-military unit: no attacks; no martial law; can enter +; "HasNoZOC" = unit has no Zone of Control (ZOC), thus any unit can move +; around it freely +; "NonMil" = a non-military unit:no martial law; can enter ; peaceful borders; DoesntOccupyTile ; "IgTer" = use constant move cost defined in igter_cost (terrain.ruleset) ; rather than terrain/road etc cost, unless terrain cost is ; less -; "OneAttack" = can only make a single attack, regardless of movement points -; "FieldUnit" = cause unhappiness even when not being aggressive +; "OneAttack" = can only make a single attack, regardless of movement points +; "FieldUnit" = cause unhappiness even when not being aggressive ; "BeachLander" = won't lose all its movement when moving from non-native ; terrain to native terrain even if slow_invasions is on. -; "Settlers" = can irrigate and build roads -; "Diplomat" = can defend against diplomat actions (see diplchance +; "Settlers" = "can irrigate and build roads" but really seems to be a required flag for +; any tile improvement at all. +; "Diplomat" = can defend against diplomat actions (see diplchance ; server option) ; "Spy" = strong in diplomatic battles. _Must_ be "Diplomat" also ; "CoastStrict" = (sea only) cannot leave coast @@ -468,38 +457,36 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; to regularly end turn on coast ; "Only_Native_Attack" = cannot attack targets on non-native tiles even if ; unit class can -; "Cant_Fortify" = cannot fortify even if unit class has "CanFortify" flag -; "Fanatic" = can only be built by governments that allow them -; (see civ2/governments.ruleset, Fundamentalism government) -; "Unique" = a player can only have one of these units in the game at -; the same time; barbarians cannot use this at present -; "GameLoss" = losing one of these units means you lose the game, but it -; is produced without homecity and upkeep -; "EvacuateFirst" = the game will try to rescue units with this flag before +; "Cant_Fortify"= cannot fortify even if unit class has "CanFortify" flag +; "Fanatic" = can only be built by governments that allow them +; (see civ2/governments.ruleset, Fvndamentalist government) +; "Unique" = a player can only have one of these units in the game at +; the same time; barbarians cannot use this at present +; "GameLoss" = losing one of these units means you lose the game, but it +; is produced without homecity and upkeep +; "EvacuateFirst"=the game will try to rescue units with this flag before ; it tries to rescue units without it when their transport ; is destroyed. Think of the Birkenhead drill ("women and ; children first"). Replace "women and children" with ; "units with the EvacuateFirst unit type flag". -; "SuperSpy" = this unit always wins diplomatic contests, that is, unless -; it encounters another SuperSpy, in which case defender wins; -; can also be used on non-diplomat units, in which case it can -; protect cities from diplomats; also 100% spy survival chance -; "NoHome" = this unit has no homecity and will be free of all upkeep, and -; therefore will not revolt along with its city of origin should -; it be incited +; "SuperSpy" = this unit always wins diplomatic contests, that is, unless +; it encounters another SuperSpy, in which case defender wins; +; can also be used on non-diplomat units, in which case it can +; protect cities from diplomats; also 100% spy survival chance +; "NoHome" = this unit has no homecity and will be free of all upkeep, and +; therefore will not revolt along with its city of origin should +; it be incited ; "NoVeteran" = this unit cannot gain veteran levels through experience ; (as if both raise_chance and work_raise_chance were zero); ; it can still gain veterancy through Veteran_Build, etc ; "CityBuster" = this unit has double firepower against cities ; "NoBuild" = this unit cannot be built -; "BadWallAttacker" = the firepower of this unit is set to 1 if -; attacking a city -; defended by a city wall (or other city building defense) -; "BadCityDefender" = if attacked while in a city, firepower is set to 1 -; and firepower of attacker is doubled (the Pearl Harbour -; rule) +; "BadWallAttacker"=the firepower of this unit is set to 1 if attacking a city +; defended by a city wall (or other city building defense) +; "BadCityDefender"=if attacked while in a city, firepower is set to 1 +; and firepower of attacker is doubled (the Pearl Harbour rule) ; "BarbarianOnly" = only barbarians can build this unit -; "Shield2Gold" = Switch from shield upkeep to gold upkeep possible +; "Shield2Gold" = Switch from shield upkeep to gold upkeep possible. ; "NewCityGamesOnly" = unit can't be built on scenarios where founding new cities ; is not allowed. Give this flag to units that would make no sense ; to have in a game with such a scenario @@ -527,14 +514,22 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; is enabled and the unit class is unreachable ; "MultiSlot" = if server setting slot_control is ON, only unit types with this ; flag can use extra city_build_slots -; +; "TransportDefender" = Unit can always defend while transported, even on non-native +; terrain. +; "SentryAlways" = This unit always reports sentry-type information; give this flag to +; reconnaissance/scouting type units who can't sentry because they are +; fuel-type units (which can only sentry on refueling tiles.) +; "Reserved1" +; "Reserved2" +; "Reserved3" = reserved for future use. +; ------------------------------------------- ; Following actions require extra fields: -; "Attack" +; "Attack" and "Suicide Attack" ; attack = base attack strength ; "Bombard" ; attack = base attack strength ; bombard_rate = the number of shots fired at enemy units when attacking -; FOR NUKES: the amount to add to the default radius of 1 tile +; FOR NUKES:the amount to add to the default radius of 1 tile ; "Join City" ; pop_cost = the number of population added to the target city ; "Paradrop Unit" @@ -557,9 +552,9 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; "HutTech" = can be found in a hut, but its techs required ; "Partisan" = can be created as a partisan (only one unit can have this ; flag), see end of this file for its tech requirements option -; "DefendOk" = AI hint: ok for defending with -; "DefendGood" = AI hint: good for defending with -; "Ferryboat" = AI hint: useful for ferrying +; "DefendOk" = AI hint:ok for defending with +; "DefendGood" = AI hint:good for defending with +; "Ferryboat" = AI hint:useful for ferrying ; "Barbarian" = can be created as land barbarian ; "BarbarianTech" = can be created as land barbarian, if someone has ; researched its tech requirements @@ -572,7 +567,7 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; "BarbarianSeaTech" = can be created as a barbarian that disembarks from a barbarian boat ; if someone has researched its tech requirements ; "Settlers" = can irrigate and build roads -; "Hunter" = AI hint: good for hunting other units +; "Hunter" = AI hint:good for hunting other units ; "CitiesStartUnit" = Gets granted as 'c' startunit ; "WorkerStartUnit" = Gets granted as 'w' startunit ; "ExplorerStartUnit" = Gets granted as 'x' startunit @@ -583,8 +578,11 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; "DefendGoodStartUnit" = Gets granted as 'D' startunit ; "AttackFastStartUnit" = Gets granted as 'a' startunit ; "AttackStrongStartUnit" = Gets granted as 'A' startunit -; -; */ <-- avoid gettext warnings + +; "UserType1Startunit" = Gets granted as 'u' startunit +; "UserType2Startunit" = Gets granted as 'U' startunit +; "UserType3Startunit" = Gets granted as 'z' startunit +; "TradeStartUnit" = Gets granted as 't' startunit [unit_settlers] name = _("Settlers") diff --git a/freeciv/freeciv/data/mp2c-desert.serv b/freeciv/freeciv/data/mp2c-desert.serv new file mode 100644 index 000000000..815c6587e --- /dev/null +++ b/freeciv/freeciv/data/mp2c-desert.serv @@ -0,0 +1,6 @@ +# Server commands to make multiplayer-evo Freeciv rules +# + +rulesetdir mp2c-desert + +# changed game settings are defined in game.ruleset \ No newline at end of file diff --git a/freeciv/freeciv/data/mp2-caravel/(un)Load (de)Board (dis)Embark rules.txt b/freeciv/freeciv/data/mp2c-desert/(un)Load (de)Board (dis)Embark rules.txt similarity index 100% rename from freeciv/freeciv/data/mp2-caravel/(un)Load (de)Board (dis)Embark rules.txt rename to freeciv/freeciv/data/mp2c-desert/(un)Load (de)Board (dis)Embark rules.txt diff --git a/freeciv/freeciv/data/mp2c-desert/Makefile.am b/freeciv/freeciv/data/mp2c-desert/Makefile.am new file mode 100644 index 000000000..85c67ead0 --- /dev/null +++ b/freeciv/freeciv/data/mp2c-desert/Makefile.am @@ -0,0 +1,22 @@ +## Process this file with automake to produce Makefile.in + +## Override automake so that "make install" puts these in proper place: +pkgdatadir = $(datadir)/$(PACKAGE)/mp2c-desert + +pkgdata_DATA = \ + buildings.ruleset \ + cities.ruleset \ + effects.ruleset \ + game.ruleset \ + governments.ruleset \ + nations.ruleset \ + default.lua \ + script.lua \ + parser.lua \ + styles.ruleset \ + techs.ruleset \ + terrain.ruleset \ + units.ruleset \ + README.txt + +EXTRA_DIST = $(pkgdata_DATA) diff --git a/freeciv/freeciv/data/mp2c-desert/README.txt b/freeciv/freeciv/data/mp2c-desert/README.txt new file mode 100644 index 000000000..71180e99f --- /dev/null +++ b/freeciv/freeciv/data/mp2c-desert/README.txt @@ -0,0 +1,44 @@ +Full Game Manual, MP2-Caravel +Useful supplements to the in-game manual (from the Full Game Manual): +Combat +Economy +Diplomacy +Zone of Control (ZOC) +City Output Sequence +Multiplayer Strategy Guide +Charts: +Bases +Terrain +Governments +Special Unit Attacks +Special Unit Defense +Terrain+Base Defense Bonus Quick-Reference +Diplomatic Odds Charts +Vigil Engagement Chart +Hotkeys and Mouse Control + +The MP2 Caravel ruleset is the third official release of the Multiplayer-Evolution II ruleset, and is a major revision. Multiplayer II Evolution rulesets are modernized rulesets to take advantage of cutting-edge advancements in Freeciv Server development. Earlier versions are closer to a version of Civ 2 that has been perfected for massive multiplayer game balance. Later versions evolve to import features, improvements, and novel ideas from all other versions of Freeciv, later versions of the commercial series, as well as original ideas from experienced players. + +Major changes to MP2-Caravel include: +• Technology blueprints +• Re-design and re-balance of governments +• New governments +• Reworking of the Bronze Age: greater strategic diversity and engagement +• Integration of Trade routes as a significant aspect of the game +• Special Unit Attacks + Special Unit Defense: broadens tactical depth and realism +• Expanded transportational units, especially on Land +• Expansion and re-balance of Migrant-type units +• New units +• New wonders +• Civil Wonders force civilizations to uniquely define themselves +• Major overhaul of Power Plants to meaningfully integrate into the game +• Coinage made meaningful by mechanics that enhance its exchange rate +• Casus belli and diplomatic states: greatly expanded to be more meaningful +• Castles, Bunkers, and Tile Claims +• Numerous other fixes and improvements +For more details, see links below: + +MP2 Caravel changelog +MP2 Caravel Design Log + + diff --git a/freeciv/freeciv/data/.historic/ag2/buildings.ruleset b/freeciv/freeciv/data/mp2c-desert/buildings.ruleset similarity index 60% rename from freeciv/freeciv/data/.historic/ag2/buildings.ruleset rename to freeciv/freeciv/data/mp2c-desert/buildings.ruleset index 8acaa1be7..0c0762d04 100644 --- a/freeciv/freeciv/data/.historic/ag2/buildings.ruleset +++ b/freeciv/freeciv/data/mp2c-desert/buildings.ruleset @@ -1,4 +1,4 @@ -; Modifying this file: +; Modifying this file: ; You should not modify this file except to make bugfixes or ; for other "maintenance". If you want to make custom changes, ; you should create a new datadir subdirectory and copy this file @@ -10,20 +10,20 @@ ; than minor changes. [datafile] -description="Avant-garde buildings data for Freeciv" +description="Buildings data for Freeciv" options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" format_version=20 ; /* <-- avoid gettext warnings ; -; Below: The individual buildings, one per section. +; Below:The individual buildings, one per section. ; (Buildings = City Improvements and Wonders) ; ; The actual tag used (the * in [building_*]) does not matter, except ; it must be unique within this file, and it may be used in debug ; output when reading this file. ; -; Notes: +; Notes ; ; name = translatable name as seen by user ; rule_name = (optional) internal name for savegames, rulesets etc; if @@ -31,7 +31,7 @@ format_version=20 ; the name used in savegames must not change, if you want ; to rename an item after a ruleset has been released, you ; should set "rule_name" to the original value of "name". -; genus = genus; one of: +; genus = genus; one of: ; "GreatWonder", "SmallWonder", "Improvement", "Special". ; reqs = requirements to build the building (see effects.ruleset ; and README.effects for help on requirements) @@ -106,7 +106,7 @@ sabotage = 100 sound = "b_colosseum" sound_alt = "b_generic" helptext = _("\ -Entertains the citizens of a city, making 3 unhappy citizens content. \ +Entertains the citizens of a city, making three unhappy citizens content. \ (Four after the discovery of Electricity.) However, it does not\ affect citizens made unhappy by military activity.\ ") @@ -153,10 +153,11 @@ upkeep = 2 sabotage = 100 sound = "b_bank" sound_alt = "b_generic" -; /* xgettext:no-c-format */ helptext = _("\ -Together, a Bank and Marketplace double the tax and luxury production in a city.\ - That is, the Bank adds another +50% to the +50% of the Marketplace.\ +Together, a Bank and Marketplace double the tax and luxury output in a city.\ + That is, the Bank adds another +50% to the +50% of the Marketplace. \n\ +Banks also increase the conversion rate of Coinage by +25%. A Bank and\ + Marketplace each add +25%, yielding a rate of 2.0 gold per 1 shield invested.\ ") [building_barracks] @@ -164,7 +165,7 @@ name = _("Barracks") genus = "Improvement" reqs = { "type", "name", "range" - + "Tech", "Warrior Code", "Player" } graphic = "b.barracks_i" graphic_alt = "-" @@ -179,13 +180,12 @@ upkeep = 1 sabotage = 100 sound = "b_barracks_i" sound_alt = "b_generic" -; /* xgettext:no-c-format */ helptext = _("\ With a Barracks I, each new land unit built in a city will\ automatically have Veteran V1 status, which means that its attack and\ - defense strengths are increased by 50%. Also, damaged land units\ + defense strengths are increased by 50%. Also, damaged land units\ which stay in town for one full turn without moving are completely\ - healed. Obsolete by: Gunpowder.\ + healed. Obsolete by:Gunpowder.\ ") [building_barracks_ii] @@ -202,18 +202,17 @@ obsolete_by = "Tech", "Mobile Warfare", "Player" "Building", "Barracks III", "City" } -build_cost = 30 +build_cost = 35 upkeep = 1 sabotage = 100 sound = "b_barracks_ii" sound_alt = "b_generic" -; /* xgettext:no-c-format */ helptext = _("\ With a Barracks II, each new land unit built in a city will\ automatically have Veteran V1 status, which means that its attack and\ defense strengths are increased by 50%. Also, damaged land units\ which stay in town for one full turn without moving are completely\ - restored. Obsolete by: Mobile Warfare.\ + restored. Obsolete by:Mobile Warfare.\ ") [building_barracks_iii] @@ -228,12 +227,11 @@ graphic_alt = "b.barracks_i" obsolete_by = { "type", "name", "range" } -build_cost = 30 +build_cost = 40 upkeep = 1 sabotage = 100 sound = "b_barracks_iii" sound_alt = "b_generic" -; /* xgettext:no-c-format */ helptext = _("\ With a Barracks III, each new land unit built in a city will\ automatically have Veteran V1 status, which means that its attack and\ @@ -266,7 +264,7 @@ sound_alt = "b_generic" helptext = _("\ A Cathedral makes 3 unhappy citizens content, but does not affect citizens\ made unhappy by military activity. Theology increases the effect by +1.\ - Communist government decreases the effect by -1. (Michelangelos Chapel enhances\ + Communist government decreases the effect by -1. (Michelangelo’s Chapel enhances\ the effect of Cathedrals by +1 happy citizen and +1 forced content citizen.)\ ") @@ -276,30 +274,34 @@ genus = "Improvement" flags = "VisibleByOthers" reqs = { "type", "name", "range" - "Tech", "Masonry", "Player" + "Tech", "Construction", "Player" } graphic = "b.city_walls" graphic_alt = "-" obsolete_by = { "type", "name", "range" } -build_cost = 60 +build_cost = 65 upkeep = 0 sabotage = 50 sound = "b_city_walls" sound_alt = "b_generic" helptext = _("\ -City Walls increase the 1.5x bonus for Land units in a city to 3x, effectively\ - doubling the strength of Land units against attacks from other Land units (and\ - Helicopters.) City Walls are ineffective against Air units, Sea units, Missiles,\ - and Howitzers; in which case the normal 1.5x bonus is given. City Walls prevent\ - population loss when a defending unit is destroyed by a Land unit. City Walls have\ - a 50% bonus against sabotage actions.\ +City Walls give a 3× bonus to every unit in a City against Land unit attacks.\ + City Walls are useless against Air, Sea, and Missile units; and the bonus is\ + reduced when attacked by Catapults, Cannons, Artillery, and Howitzers.\n\ + "), _("\ +City Walls prevent population loss when a defending unit is killed. If an enemy\ + attempts to sabotage City Walls, the odds of success are halved. In a city with\ + Fortifications, only the terrain bonus adds to the City Wall bonus. \n\ + "), _("\ + Discovery of Metallurgy increases cost to 75 shields.\ ") [building_coastal_defense] name = _("Coastal Defense") genus = "Improvement" +flags = "VisibleByOthers" reqs = { "type", "name", "range" "Tech", "Gunpowder", "Player" @@ -310,8 +312,8 @@ graphic_alt = "-" obsolete_by = { "type", "name", "range" } -build_cost = 60 -upkeep = 1 +build_cost = 65 +upkeep = 2 sabotage = 100 sound = "b_coastal_defense" sound_alt = "b_generic" @@ -337,20 +339,23 @@ upkeep = 1 sabotage = 100 sound = "b_courthouse" sound_alt = "b_generic" -; /* xgettext:no-c-format */ helptext = _("\ -Courthouses reduce corruption by about half (60% rounded down),\ - eliminate tile output penalties for Anarchy and Despotism, and\ - give +1 unit free of upkeep.\ +Courthouses reduce corruption by half, eliminate\ + tile output penalties for Anarchy and Despotism, and\ + give +1 shield of free unit upkeep.\ "), _("\ Diplomatic combat gets a bonus of ¼ of base odds. (At general base odds\ - of ½, odds of losing become: ½ - ⅛ = ⅜). All other hostile diplomatic\ + of ½, odds of losing become:½ - ⅛ = ⅜). All other hostile diplomatic\ actions are 20% less effective (80% - 20% = 60%).\ "), _("\ - In Democracy, Courthouses make 1 unhappy citizen content, unless the\ + Courthouses make 1 unhappy citizen content, unless the\ citizen is unhappy about military activity).\ "), _("\ - Cost to incite revolt in the city is 2x if empty and 4x if occupied.\ + Cost to incite revolt in the city is 2× if empty and 4× if occupied.\ +"), _("\ + A unique bonus that only a local Courthouse provides to its city: \ + Diplomats can’t establish embassies unless you permit it through\ + Cease-fire or Peace. (Spies require a Police Station to block them.)\ ") [building_factory] @@ -370,12 +375,11 @@ upkeep = 4 sabotage = 100 sound = "b_factory" sound_alt = "b_generic" -; /* xgettext:no-c-format */ helptext = _("\ Increases the shield production in a city by +50%. This increase may\ contribute to pollution.\ "), _("\ - This building lets you conscript one extra infantry/foot unit per turn.\ + This building lets you build one extra infantry unit per turn.\ ") [building_enrichment_facility] @@ -384,7 +388,6 @@ genus = "Improvement" reqs = { "type", "name", "range" "Tech", "Fusion Power", "Player" - "Building", "Fusion Reactor","City" "ServerSetting","nukes_major", "World" } graphic = "b.enrichment_facility" @@ -399,31 +402,43 @@ sound = "b_enrichment_facility" sound_alt = "b_generic" helptext = _("\ Allows refining the fissile isotopes needed to create nuclear fusion weapons.\ - To make these weapons, a city requires an Enrichment Facility, which first\ - requires a Fusion Reactor.\ ") -[building_fusion_reactor] -name = _("Fusion Reactor") +[building_fortifications] +name = _("Fortifications") genus = "Improvement" +flags = "VisibleByOthers" reqs = { "type", "name", "range" - "Tech", "Fusion Power", "Player" + "Tech", "Masonry", "Player" } -graphic = "b.fusion_reactor" -graphic_alt = "-" +graphic = "b.fortifications" +graphic_alt = "b.city_walls" obsolete_by = { "type", "name", "range" } -build_cost = 200 -upkeep = 4 -sabotage = 100 -sound = "b_fusion_reactor" +build_cost = 35 +upkeep = 0 +sabotage = 50 +sound = "b_fortifications" sound_alt = "b_generic" -; /* xgettext:no-c-format */ helptext = _("\ -Increases the shield production in a city by +75% of base production levels.\ - Gives +1 build slot and +5 free shield upkeep on units.\ +Fortifications give 1.5× defense to every unit in a City vs. attacks by Land.\ + This bonus is reduced if attacked by Catapult or the units to which it upgrades.\ + Fortifications prevent population loss when a defending unit is killed. \n\ +"), _("\ +Fortifications raise the terrain bonus of Lowlands tiles by +17%.\ + (Flatland is 1.17×, Forest and Swamp are 1.5×, and Jungle is 1.67×.)\ + A terrain bonus helps defending Land units against attacks from units\ + of all types. \n\ +"), _("\ +Fortifications are unassailable by Siege Rams.\ + If an enemy attempts sabotage, odds of success are halved. \n\ +"), _("\ +➤ Except for any possible terrain bonus, this improvement offers no bonus when\ + City Walls are in place. \n\ +➤ AFTER making City Walls, you can sell Fortifications with a full return of gold\ + cost.\ ") [building_granary] @@ -493,43 +508,10 @@ sound = "b_homeland_security" sound_alt = "b_generic" helptext = _("\ You can build Homeland Security offices if you own the Supreme Court. Homeland Security\ - gives the same bonus as a Courthouse vs. all hostile diplomatic acts. As a ministry of the\ + gives the same bonus as a Courthouse vs. hostile diplomatic acts. As a ministry of the\ Supreme Court, it has no upkeep and cannot be sabotaged.\ ") -[building_hydro_plant] -name = _("Hydro Plant") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Electronics", "Player" - "Building", "Factory", "City" - "Extra", "River", "Adjacent" - } -graphic = "b.hydro_plant" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 180 -upkeep = 4 -sabotage = 100 -sound = "b_hydro_plant" -sound_alt = "b_generic" -helptext = _("\ -For each Factory or Mfg. Plant in a city, a Hydro Plant adds +25% to\ - base production, and reduces pollution from production by -25%.\ -"), _("\ -*If a city has either a Factory or Mfg. Plant, this makes a combined +75%\ - production bonus with a 25% decrease in pollution from production.\ -"), _("\ -*In a city with both a Factory and Mfg. Plant, this makes a combined +150%\ - production bonus with a 50% decrease in pollution from production.\ -"), _("\ -*Only one Power Plant, Hydro Plant, Nuclear Plant, or\ - Solar Plant can have an active effect in a city.\ -") - [building_library] name = _("Library") genus = "Improvement" @@ -547,7 +529,6 @@ upkeep = 1 sabotage = 100 sound = "b_library" sound_alt = "b_generic" -; /* xgettext:no-c-format */ helptext = _("\ Increases the science output in a city by +100%.\ ") @@ -569,16 +550,17 @@ upkeep = 0 sabotage = 100 sound = "b_marketplace" sound_alt = "b_generic" -; /* xgettext:no-c-format */ helptext = _("\ Increases the luxury and tax output in a city by +50%.\ +Also increases the conversion rate of Coinage by +25%,\ + yielding a rate of 1.75 gold per 1 shield invested.\ ") [building_mass_transit] name = _("Mass Transit") genus = "Improvement" reqs = - { "type", "name", "range" + { "type", "name", "range" "Tech", "Mass Production", "Player" } graphic = "b.mass_transit" @@ -605,9 +587,9 @@ name = _("Manufacturing Plant") rule_name = "Mfg. Plant" genus = "Improvement" reqs = - { "type", "name", "range" - "Tech", "Robotics", "Player" - "Building", "Factory", "City" + { "type", "name", "range" + "Tech", "Robotics", "Player" + "Building", "Factory", "City" } graphic = "b.mfg_plant" graphic_alt = "-" @@ -620,73 +602,229 @@ sabotage = 100 sound = "b_mfg_plant" sound_alt = "b_generic" helptext = _("\ -A Manufacturing Plant increases base production by +50%.\ +A Manufacturing Plant increases base production by +50%. \n\ "), _("\ -A Mfg. Plant & Factory together double the production in a city.\ - That is, the Mfg. Plant adds another +50% to the +50% of the Factory.\ + A Mfg. Plant & Factory together double the production in a city.\ + That is, the Mfg. Plant adds another +50% to the +50% of the Factory. \n\ "), _("\ -A Mfg. Plant with a Factory AND a Power, Hydro, Nuclear, or Solar Plant\ - will combine for a total +150% increase over base production.\ + A Mfg. Plant with a Factory AND a Power or Hydro Plant\ + will combine for a total +140% increase over base production.\ + (With Nuclear Plant: +160%) \n\ "), _("\ -The pollution reduction of a Hydro, Nuclear, or Solar Plant is applied one more\ - time to cities with Mfg. Plants, effectively doubling the bonus percentage.\ + The pollution reduction of a Hydro, Nuclear, or Solar Plant is applied one more\ + time to cities with Mfg. Plants, doubling the pollution reduction bonus.\n\ +"), _("\ + This building lets you build one extra infantry unit per turn.\ +") + +[building_offshore_platform] +name = _("Offshore Platform") +genus = "Improvement" +reqs = + { "type", "name", "range" + "Tech", "Miniaturization", "Player" + "TerrainClass", "Oceanic", "Adjacent" + } +graphic = "b.offshore_platform" +graphic_alt = "-" +obsolete_by = + { "type", "name", "range" + } +build_cost = 120 +upkeep = 3 +sabotage = 100 +sound = "b_offshore_platform" +sound_alt = "b_generic" +helptext = _("\ +Adds 1 extra production to all Oceanic tiles worked by a city. The\ + city needs to be coastal to build this improvement.\ +") + +[building_coal_plant] +name = _("Coal Plant") +genus = "Improvement" +reqs = + { "type", "name", "range", "present" + "Tech", "Refining", "Player", TRUE + "Building", "Factory", "City", TRUE + ;Shortens Production List choices when unwanted: + "Building", "Hoover Dam", "City", FALSE + "Building","Fusion Reactor","Player",FALSE + "Building", "Hydro Plant", "City", FALSE + "Building", "Nuclear Plant","City", FALSE + + } +graphic = "b.power_plant" +graphic_alt = "-" +obsolete_by = + { "type", "name", "range" + } +build_cost = 120 +upkeep = 4 +sabotage = 100 +sound = "b_power_plant" +sound_alt = "b_generic" +helptext = _("\ +A Coal Plant boosts the +50% bonus of the Factory and Mfg. Plant to\ + +70%. The extra production may lead to more pollution. \n\ +"), _("\ +➤ In a city with both a Factory and Mfg. Plant, this makes a combined +140%\ + production bonus. \n\ "), _("\ - This building lets you conscript one extra infantry/foot unit per turn.\ +➤ Only one Coal Plant, Hydro Plant, Nuclear Plant, or Fusion Reactor\ + can have an active effect in a city.\ +") + +[building_hydro_plant] +name = _("Hydro Plant") +genus = "Improvement" +reqs = + { "type", "name", "range", "present" + "Tech", "Electronics", "Player", TRUE + "Building", "Factory", "City", TRUE + "Extra", "River", "Adjacent",TRUE + "Building", "Hoover Dam", "City", FALSE + "Building","Fusion Reactor","Player",FALSE + "Building", "Nuclear Plant","City", FALSE + } +graphic = "b.hydro_plant" +graphic_alt = "-" +obsolete_by = + { "type", "name", "range" + } +build_cost = 175 +upkeep = 3 +sabotage = 100 +sound = "b_hydro_plant" +sound_alt = "b_generic" +helptext = _("\ +A Hydro Plant boosts the +50% bonus of the Factory and Mfg. Plant to\ + +70%. For each of those, it reduces pollution from production by -25%. \n\ +"), _("\ +➤ In a city with both a Factory and Mfg. Plant, this makes a combined +140%\ + production bonus with a 50% decrease in pollution from production. \n\ +"), _("\ +➤ For both Factory and Mfg. Plant, -25% in production-based\ + pollution cancels slightly more than the pollution generated by\ + the 20% increase in production. \n\ +"), _("\ +➤ Only one Coal Plant, Hydro Plant, Nuclear Plant, or\ + Fusion Reactor can have an active effect in a city. \n\ +"), _("\ +➤ The sale price of a Coal Plant becomes 85% original value\ + instead of 50% original value, after a city has built a Hydro Plant. \n\n\ +Hydro Plants can only be built in cities adjacent to rivers.\ ") [building_nuclear_plant] name = _("Nuclear Plant") genus = "Improvement" reqs = - { "type", "name", "range" - "Tech", "Nuclear Power", "Player" - "Building", "Factory", "City" + { "type", "name", "range", "present" + "Tech", "Nuclear Power","Player", TRUE + "Building", "Factory", "City", TRUE + "Building", "Hoover Dam", "City", FALSE + "Building","Fusion Reactor","Player",FALSE } graphic = "b.nuclear_plant" graphic_alt = "-" obsolete_by = { "type", "name", "range" } -build_cost = 120 -upkeep = 2 +build_cost = 185 +upkeep = 4 sabotage = 100 sound = "b_nuclear_plant" sound_alt = "b_generic" helptext = _("\ -For each Factory or Mfg. Plant in a city, a Nuclear Plant adds +25% to\ - base production, and reduces pollution from production by -25%.\ +A Nuclear Plant boosts the +50% bonus of the Factory and Mfg. Plant to\ + +80%. For each of those, it reduces pollution from production by -25%. \n\ "), _("\ -*If a city has either a Factory or Mfg. Plant, this makes a combined +75%\ - production bonus with a 25% decrease in pollution from production.\ +➤ In a city with both a Factory and Mfg. Plant, this makes a combined +160%\ + production bonus with a 50% decrease in pollution from production. \n\ "), _("\ -*In a city with both a Factory and Mfg. Plant, this makes a combined +150%\ - production bonus with a 50% decrease in pollution from production.\ +➤ For both Factory and Mfg. Plant, -25% in production-based\ + pollution cancels most of the pollution generated by\ + the 30% increase in production. \n\ "), _("\ -*Only one Power Plant, Hydro Plant, Nuclear Plant, or\ - Solar Plant can have an active effect in a city.\ +➤ Only one Coal Plant, Hydro Plant, Nuclear Plant, or\ + Fusion Reactor can have an active effect in a city. \n\ +"), _("\ +➤ The sale price of a Coal Plant becomes 85% original value\ + instead of 50% original value, after a city has built a Nuclear Plant.\ ") -[building_offshore_platform] -name = _("Offshore Platform") +[building_solar_plant] +name = _("Solar Plant") genus = "Improvement" reqs = { "type", "name", "range" - "Tech", "Miniaturization", "Player" - "TerrainClass", "Oceanic", "Adjacent" + "Tech", "Environmentalism", "Player" + "Building", "Factory", "City" } -graphic = "b.offshore_platform" +graphic = "b.solar_plant" graphic_alt = "-" obsolete_by = { "type", "name", "range" } -build_cost = 120 -upkeep = 3 +build_cost = 150 +upkeep = -3 sabotage = 100 -sound = "b_offshore_platform" +sound = "b_solar_plant" sound_alt = "b_generic" helptext = _("\ -Adds 1 extra production to all Oceanic tiles worked by a city. The\ - city needs to be coastal to build this improvement.\ +A Solar Plant boosts the production in a city by +20%. Although this is\ + modest compared to other Power Plants, a Solar Plant has four major\ + benefits:\n\ +"), _("\ +➤ The Solar Plant can co-exist with a Coal Plant, Hydro Plant,\ + Nuclear Plant, or Fusion Reactor, adding its +20% bonus to the\ + existing bonus.\ +"), _("\ +➤ Free Solar energy reduces the infrastructural upkeep of other buildings\ + in the city by -3, and gives free upkeep to two units supported by\ + the city. \n\ +"), _("\ +➤ The pollution reduction from other kinds of Power Plants is replaced\ + by the superior bonus of the Solar Plant, reducing Pollution from\ + production by 75%. This makes Solar Plants an ideal improvement for\ + cities which still use Coal Plants. \n\ +➤ A Solar Plant is the only kind of Power Plant whose bonus against\ + Pollution can combine with a Recycling Center. Together, they reduce\ + pollution from production by 90% !\ +") + +[building_wind_plant] +name = _("Wind Plant") +genus = "Improvement" +reqs = + { "type", "name", "range" + "Tech", "Environmentalism", "Player" + } +graphic = "b.wind_farm" +graphic_alt = "-" +obsolete_by = + { "type", "name", "range" + } +build_cost = 60 +upkeep = -3 +sabotage = 100 +sound = "b_wind_plant" +sound_alt = "b_generic" +helptext = _("\ +A Wind Plant boosts the production in a city by 5%. This is\ + modest; but in yield per cost it’s competitive with other\ + Power Plants, when considering its unique benefits: \n\ +"), _("\ +➤ The Wind Plant can co-exist with any other type of Power Plant, and\ + needs no Factory to be built.\ +"), _("\ +➤ Free Wind energy reduces the infrastructural upkeep of other buildings\ + in the city by -3, while also giving 2 free shield upkeep for units supported by\ + the city. \n\ +"), _("\ +➤ A Wind Plant reduces pollution from production by -10%. It combines\ + with all other pollution bonuses.\ ") [building_police_station] @@ -707,13 +845,15 @@ sabotage = 100 sound = "b_police_station" sound_alt = "b_generic" helptext = _("\ -Police Stations neutralize the unhappiness caused by two military units, and\ - prevent enemies from estalishing embassies without first agreeing to cease-fire\ - or peace.\ +Police Stations neutralize the unhappiness caused by two military units or two\ + unhappy Foreign Nationals. Under Nationalism the effect is +1, affecting three\ + citizens. Police Stations prevent Establishing Embassy without first agreeing to\ + Cease-Fire or Peace. They also half the odds to Investigate City under all governments\ + except Democracy.\ "), _("\ Diplomatic combat gets a bonus of ¼ of base odds. (At general base odds\ - of ½, odds of losing become: ½ - ⅛ = ⅜). All other hostile diplomatic\ - actions are 20% less effective (80% - 20% = 60%).\ + of ½, odds of losing become:½ - ⅛ = ⅜). All other hostile diplomatic\ + actions are 20% less effective (e.g., 80% - 20% = 60%).\ "), _("\ Diplomats and Spies made in a city with Police Station gain +1 veteran level.\ ") @@ -742,39 +882,6 @@ Allows a city to build veteran sea units. Damaged sea units\ restored.\ ") -[building_power_plant] -name = _("Power Plant") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Refining", "Player" - "Building", "Factory", "City" - } -graphic = "b.power_plant" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 130 -upkeep = 4 -sabotage = 100 -sound = "b_power_plant" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -For each Factory or Mfg. Plant in a city, a Power Plant adds +25% to\ - base production. The extra production may lead to more pollution.\ -"), _("\ -*If a city has either a Factory or Mfg. Plant, this makes a combined +75%\ - production bonus.\ -"), _("\ -*In a city with both a Factory and Mfg. Plant, this makes a combined +150%\ - production bonus.\ -"), _("\ -*Only one Power Plant, Hydro Plant, Nuclear Plant, or\ - Solar Plant can have an active effect in a city.\ -") - [building_radar_tower] name = _("Radar Tower") genus = "Improvement" @@ -814,12 +921,15 @@ upkeep = 1 sabotage = 100 sound = "b_recycling_center" sound_alt = "b_generic" -; /* xgettext:no-c-format */ helptext = _("\ -A Recycling Center reduces the pollution\ - generated by production in a city by -66%. Supply of raw\ - recycled materials adds +2 producton to the city\ - center tile.\ +A Recycling Center replaces pollution bonuses from Hydro and Nuclear\ + Plants with its own superior bonus. It reduces pollution\ + generated by production in a city by -66%. Supply of raw recycled\ + materials adds +2 producton to the city center tile. \n\ +"), _("\ +When combined with a Solar Plant, pollution from production is\ + nearly eliminated by -90%, leaving pollution from population\ + as the only significant polluting factor.\ ") [building_research_lab] @@ -840,10 +950,9 @@ upkeep = 3 sabotage = 100 sound = "b_research_lab" sound_alt = "b_generic" -; /* xgettext:no-c-format */ helptext = _("\ Adds +100% to base science output for each Library and University\ - in a city.\ + in a city. \ *In a city with a Library or University, the combined increase to science\ output is +200%. \ *In a city with a Library and a University, the combined increase\ @@ -862,14 +971,14 @@ graphic_alt = "-" obsolete_by = { "type", "name", "range" } -build_cost = 70 +build_cost = 80 upkeep = 2 sabotage = 100 sound = "b_sam_battery" sound_alt = "b_generic" helptext = _("\ Doubles the defense of all units inside the city when attacked by\ - aircraft (not including Helicopters or Missiles). Stealth aircraft\ + aircraft and Helicopters (but not Missiles). Stealth aircraft\ reduce the bonus to 25%.\ ") @@ -924,38 +1033,6 @@ Allows a city to grow larger than size 12. An Aqueduct is first\ ; There is also an effect to reduce the chance of plague, but you have to ; enable illness in game.ruleset for that to be relevant. -[building_solar_plant] -name = _("Solar Plant") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Environmentalism", "Player" - "Building", "Factory", "City" - } -graphic = "b.solar_plant" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 140 -upkeep = 4 -sabotage = 100 -sound = "b_solar_plant" -sound_alt = "b_generic" -helptext = _("\ -For each Factory or Mfg. Plant in a city, a Solar Plant adds +25% to\ - base production, and reduces pollution from production by -50%.\ -"), _("\ -*If a city has either a Factory or Mfg. Plant, this makes a combined +75%\ - production bonus with a 50% decrease in pollution from production.\ -"), _("\ -*In a city with both a Factory and Mfg. Plant, this makes a combined +150%\ - production bonus with 100% elimination of all pollution from production.\ -"), _("\ -*Only one Power Plant, Hydro Plant, Nuclear Plant, or\ - Solar Plant can have an active effect in a city.\ -") - [building_space_component] name = _("Space Component") genus = "Special" @@ -979,7 +1056,7 @@ Space Components can be differentiated into Propulsion and Fuel Components.\ Each pair of them reduces spaceship travel time. You can build up to 8 pairs.\ "), _("\ Before you can build any spaceship parts, your nation must have built the\ - Apollo Program.\ + Apollo Program; and a city needs a Factory.\ ") [building_space_module] @@ -1002,20 +1079,20 @@ sound = "b_space_module" sound_alt = "b_generic" helptext = _("\ Space Modules are the most expensive parts of spaceships. There\ - are three different types of Space Module:\ + are three different types of Space Module:\ "), _("\ -- Habitation Module: provides living space for 10,000 people.\ +- Habitation Module:provides living space for 10,000 people.\ "), _("\ -- Life Support Module: provides food and water for the population of\ +- Life Support Module:provides food and water for the population of\ one Habitation Module.\ "), _("\ -- Solar Panels: provides the energy needed for any two of the other\ +- Solar Panels:provides the energy needed for any two of the other\ Modules.\ "), _("\ You can build up to 4 Space Modules of each kind.\ "), _("\ Before you can build any spaceship parts, your nation must have built the\ - Apollo Program.\ + Apollo Program; and a city needs a Factory.\ ") [building_space_structural] @@ -1042,7 +1119,7 @@ Space Structurals form the base of your spaceship. All other\ function. You can build up to 32 Space Structurals.\ "), _("\ Before you can build any spaceship parts, your nation must have built the\ - Apollo Program.\ + Apollo Program; and a city needs a Factory.\ ") [building_stock_exchange] @@ -1063,16 +1140,19 @@ upkeep = 3 sabotage = 100 sound = "b_stock_exchange" sound_alt = "b_generic" -; /* xgettext:no-c-format */ helptext = _("\ In cities with a Bank, a Stock Exchange boosts tax and luxury\ - production by an additional +50%.\ + production by an additional +50%. \ "), _("\ -*A Bank and Stock Exchange together boost\ +* A Bank and Stock Exchange together boost\ tax and luxury production by +100%.\ "), _("\ -*A Marketplace, Bank, and Stock Exchange together boost\ - tax and luxury production by +150%.\ +* A Marketplace, Bank, and Stock Exchange together boost\ + tax and luxury production by +150%. \ +"), _("\ +After discovery of The Corporation, non-Communist governments see the conversion rate of\ + Coinage increase by +25%. A Bank, Marketplace, and Stock Exchange each add +25%, yielding\ + a total rate of 2.25 gold per 1 shield invested.\ ") [building_super_highways] @@ -1145,6 +1225,35 @@ Makes one unhappy citizen content. Mysticism doubles\ activity.\ ") +[building_totem_pole] +name = _("Totem Pole") +genus = "Improvement" +reqs = + { "type", "name", "range", "present" + "Tech", "Ceremonial Burial", "Player", FALSE + } +graphic = "b.totem_pole" +graphic_alt = "-" +obsolete_by = + { "type", "name", "range" + "Tech", "Ceremonial Burial", "Player" + "Building", "Temple", "City" + } +build_cost = 30 +upkeep = 0 +sabotage = 100 +sound = "b_totem_pole" +sound_alt = "b_generic" +helptext = _("\ +Gives two luxury to a city. In small tribal settlements, this can\ + be more effective than a Temple for aiding celebration. \n\ +The process of building a Totem Pole is sometimes more useful than\ + finishing it. It keeps your tribe productive by storing shields that\ + can transfer into a building made available by a future scientific\ + discovery. \n\ +Obsolete by:Temple, Ceremonial Burial.\ +") + [building_university] name = _("University") genus = "Improvement" @@ -1164,7 +1273,7 @@ sabotage = 100 sound = "b_university" sound_alt = "b_generic" helptext = _("\ -Adds +150% to science output in a city with a Library.\ +Adds +150% to science output in a city with a Library. \ "), _("\ *A University and Library combine for a +250% increase\ in science output.\ @@ -1176,7 +1285,6 @@ genus = "SmallWonder" flags = "SaveSmallWonder" reqs = { "type", "name", "range" - "Tech", "Masonry", "Player" } graphic = "b.palace" graphic_alt = "-" @@ -1189,28 +1297,31 @@ sabotage = 0 sound = "b_palace" sound_alt = "b_generic" helptext = _("\ -Sets the capital of your nation. Generally, corruption in cities increases with\ - distance from the capital. A Palace reduces corruption in the capital by half.\ +Sets the main capital of your nation. Loss of your main capital:\ + (1) creates a new Palace and capital in a random city,\ + (2) destroys any Spaceship you are building, (3) may cause civil war.\ "), _("\ - The cost of inciting a revolt decreases with distance from the\ - capital. The capital cannot be incited to revolt. The chance\ - of enemy agents defeating your agents or sabotaging buildings is\ - reduced by half.\ + Capital cities gain +1 happy citizen.\ "), _("\ - Losing your capital may result in your empire falling into civil\ - war. It will also destroy any Spaceship you have.\ + Capitals can’t be incited to revolt. The closer a city is to a capital,\ + the higher the cost to bribe or incite revolt. In a capital, the chance of\ + enemy agents defeating your agents or sabotaging buildings is halved.\ "), _("\ - You can rebuild your Palace in another city. This may help secure\ - a safer location or reduce corruption.\ + Corruption in cities increases with distance from a capital. Capitals\ + enjoy a further reduction of corruption by half.\ +"), _("\ + You can rebuild your Palace in another city. This may secure\ + a safer location or reduce corruption for nearby cities.\ "), _("\ The Palace gives a production bonus of +75% under Despotism,\ - +50% under Monarchy, and +25% under Communism. Fundamentalism gets\ - a +50% gold bonus.\ + +50% under Monarchy, +25% under Communism, +15% under\ + Nationalism; and Theocracy gets a +50% gold bonus.\ "), _("\ - A Palace is created when you make your first city. Sedentary city\ - culture nullifies the move bonus of tribes who have no cities.\ + A Palace automatically appears in your first city. This nullifies\ + the move bonus for nations who have no cities, due to sedentary\ + culture.\ "), _("\ - With Conscription, a Palace allows conscripting one extra qualifying unit per turn.\ + With Conscription, a Palace allows producing one extra qualifying unit per turn.\ ") [building_ecclesiastical_palace] @@ -1232,108 +1343,126 @@ sabotage = 0 sound = "b_palace" sound_alt = "b_generic" helptext = _("\ -Makes a city the religious capital that acts as a second center of government.\ +Sets your religious capital and second center of government. Loss of this\ + city will create a new Ecclesiastical Palace in a random city.\ +"), _("\ + Capital cities gain +1 happy citizen.\ "), _("\ - Cities experience lower corruption rates if they are closer to\ - a capital. In your religious capital, capital bonuses are rendered\ - in gold tithes rather than shield output. Under Fundamentalism,\ - the religious capital gets a +50% gold bonus from tithes.\ + Capitals can’t be incited to revolt. The closer a city is to a capital,\ + the higher the cost to bribe or incite revolt. In a capital, the chance of\ + enemy agents defeating your agents or sabotaging buildings is halved.\ "), _("\ - The cost of bribing and inciting increase when closer to a\ - capital. Capitals can not be incited to revolt, and the\ - chance of enemy agents defeating your agents or sabotaging\ - buildings is reduced by half.\ + Corruption in cities increases with distance from the closest capital. Capitals\ + enjoy a further reduction of corruption by half.\ "), _("\ - Under Fundamentalism, Fanatics produced in the city with this building\ + Religious capitals have a gold income bonus of +75% under Despotism,\ + +50% under Monarchy, +50% under Theocracy, +25% under Communism, and\ + +15% under Nationalism.\ +"), _("\ + Under Theocracy, Zealots produced in the city with this building\ are inspired by fervorous faith to +1 higher veteran level.\ "), _("\ - With Conscription, this building allows making one extra qualifying unit per turn.\ + With Conscription, allows producing one extra qualifying unit per turn.\ ") -[building_agoge] -name = _("Agōgē of Sparta") +[building_asmiths_trading_co] +name = _("A.Smith's Trading Co.") genus = "SmallWonder" reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Bronze Working", "Player", TRUE, FALSE - "Building", "Agōgē of Sparta", "Player", FALSE, TRUE + { "type", "name", "range", "present", "quiet" + "Tech", "Economics", "Player", TRUE, FALSE + "Building", "A.Smith's Trading Co.", "Player", FALSE, TRUE } -graphic = "b.agoge" -graphic_alt = "b.sun_tzus_war_academy" +graphic = "b.asmiths_trading_co" +graphic_alt = "-" obsolete_by = { "type", "name", "range" - "Tech", "Gunpowder", "Player" } -build_cost = 90 +build_cost = 320 upkeep = 0 sabotage = 0 -sound = "w_agoge" +sound = "w_asmiths_trading_co" sound_alt = "w_generic" helptext = _("\ -The Agōgē creates a culture of extreme fitness, and is famous for\ - vigilant patrols, secret shortcut trails, and battle readiness.\ - All your foot soldiers get +⅓ move. Phalanx and Pikemen receive a\ - +50% attack bonus. Foot units in the city with the Agōgē begin\ - their turn with +1 move. Obsolete by: Gunpowder.\ -") - -[building_angkor_wat] -name = _("Angkor Wat") +Adam Smith’s Trading Company increases your nation’s knowledge of\ + economics. In all your cities, Buildings with upkeep of 1 gold become\ + free. This Wonder enables three new specialists:\n\ +"), _(" + * Each Laborer produces 1 production point for their city per turn; \n\ +"), _(" + * Each Merchant produces 1 gold and 2 trade points per turn.\ + Trade is then distributed by your national tax rates. \n\ +"), _(" + * Each Farmer provides 1 food for their city per turn. \n\ +"), _(" + This wonder is never obsolete.\ +") + +[building_agoge] +name = _("Agōgē of Sparta") genus = "SmallWonder" reqs = { "type", "name", "range", "present", "quiet" - "Tech", "Code of Laws", "Player", TRUE, FALSE - "Building", "Angkor Wat", "Player", FALSE, TRUE + "Tech", "Bronze Working", "Player", TRUE, FALSE + "Building", "Agōgē of Sparta", "Player", FALSE, TRUE } -graphic = "b.angkor_wat" -graphic_alt = "b.ecclesiastical_palace" +graphic = "b.agoge" +graphic_alt = "b.sun_tzus_war_academy" obsolete_by = { "type", "name", "range" - "Tech", "Sanitation", "Player" + "Tech", "Gunpowder", "Player" } -build_cost = 200 +build_cost = 90 upkeep = 0 sabotage = 0 -sound = "w_angkor" +sound = "w_agoge" sound_alt = "w_generic" helptext = _("\ -Angkor Wat provides splendor and culture to your nation.\ - No citizen will ever be discontent in any of your cities.\ - Those who were dissatisfied by military activity may\ - still refuse to become happy, however.\n\ -Obsolete by: Sanitation.\ +The Agōgē creates a culture of extreme fitness, and is famous for\ + vigilant patrols, secret shortcut trails, and battle readiness.\ + All your foot soldiers get +⅓ move. Phalanx and Pikemen receive a\ + +50% attack bonus. Foot units in the city with the Agōgē begin\ + their turn with +1 move. Obsolete by:Gunpowder.\ ") -[building_appian_way] -name = _("Appian Way") +[building_angkor_wat] +name = _("Angkor Wat") genus = "SmallWonder" reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "The Wheel", "Player", TRUE, FALSE - "Building", "Appian Way", "Player", FALSE, TRUE + { "type", "name", "range","present","quiet", "survives" + "Tech", "Code of Laws", "Player", TRUE, FALSE, FALSE + "Building", "Angkor Wat", "Player", FALSE, TRUE, FALSE + "Gov", "Democracy", "Player", FALSE, TRUE, FALSE + "Gov", "Theocracy", "Player", FALSE, TRUE, FALSE + "Gov", "Communism", "Player", FALSE, TRUE, FALSE + "Gov", "Nationalism", "Player", FALSE, TRUE, FALSE +;requires 23Sept2021 changes to requirements.c, so obsolete wonders don't re-enable others + "Building", "Hanging Gardens", "Player", FALSE, FALSE, TRUE + "Building","Mausoleum of Mausolos","Player", FALSE, FALSE, TRUE + "Building", "Code of Hammurabi", "Player", FALSE, FALSE, TRUE } -graphic = "b.appian_way" -graphic_alt = "b.colossus" +graphic = "b.angkor_wat" +graphic_alt = "-" obsolete_by = - { "type", "name", "range" - "Tech", "Railroad", "Player" + { "type", "name", "range", "survives" } -build_cost = 80 +build_cost = 200 upkeep = 0 sabotage = 0 -sound = "w_appian" +sound = "w_angkor" sound_alt = "w_generic" helptext = _("\ -The Appian Way is the first flat paved highway able to drain\ - rainwater. It enhances trade route revenue and allows making\ - Wagon units. The Appian Way gives the following bonuses:\n\ - ➤ all Routes get +33% ongoing revenue\n\ - ➤ Establishing Route gets a 5× bonus\n\ - ➤ the City with Appian Way gets:\n\ -   • +1 Trade on the city center tile\n\ -   • an extra +33% in Route revenue\ -   • the ability to make Wagons.\n\n\ -Obsolete by: Railroad.\ +Angkor Wat gives you the glorious ancient city of\ + splendor and culture. In Despotism and Monarchy,\ + cities of size 3+ get the tile celebration bonus even if not celebrating.\ + All cities gain +1 happy citizen. Work done on Jungle and Swamp tiles\ + is 2× faster. In addition, the cost of Elephants is reduced by 5\ + shields. \n\ +"), _(" +This Wonder is never obsolete, but it only has an effect in\ + Despotism, Monarchies, and Republic. \ +"), _(" +Angkor Wat is a Civil Wonder. You can build only one Civil Wonder.\ ") [building_apollo_program] @@ -1357,51 +1486,95 @@ sound_alt = "w_generic" helptext = _("\ Allows you to start building spaceship parts in cities\ with factories (assuming you have researched the necessary\ - technologies).\ + technologies). With Laser tech, the city with the Apollo\ + Program can build a Satellite.\ ") -[building_asmiths_trading_co] -name = _("A.Smith's Trading Co.") +[building_appian_way] +name = _("Appian Way") genus = "SmallWonder" reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Economics", "Player", TRUE, FALSE - "Building", "A.Smith's Trading Co.", "Player", FALSE, TRUE + { "type", "name", "range", "present", "quiet" + "Tech", "The Wheel", "Player", TRUE, FALSE + "Building", "Appian Way", "Player", FALSE, TRUE } -graphic = "b.asmiths_trading_co" +graphic = "b.appian_way" graphic_alt = "-" obsolete_by = { "type", "name", "range" + "Tech", "Railroad", "Player" } -build_cost = 300 +build_cost = 100 upkeep = 0 sabotage = 0 -sound = "w_asmiths_trading_co" +sound = "w_appian" sound_alt = "w_generic" helptext = _("\ -In all your cities, Buildings with upkeep of 1 gold become free.\ - This Wonder also allows three new specialists:\ -"), _(" - * Each Laborer produces 1 production point for their city per turn;\ -"), _(" - * Each Merchant produces 1 gold and 2 trade points per turn.\ - Trade is then distributed by your national tax rates.\ -"), _(" - * Each Farmer provides 1 food for their city per turn;\ -"), _(" - This wonder is never obsolete.\ +The Appian Way is the first stone-paved highway that can drain\ + rainwater. The Appian Way gives the following National bonuses:\n\ + ➤ Trade Routes with 4 or more revenue get a slight increase in revenue. \n\ + ➤ Tile-workers build Roads at twice the speed. \n\ +If not in Foreign territory:\n\ + ➤ Wagons, Chariots, and Foot soldiers gain +⅓ move when starting\ + their turn on a Road. \n\ + ➤ Tile Workers gain +⅓ move. \n\n\ +The city with the Appian Way gets additional bonuses:\n\ + ➤ Each trade-producing tile produces +1 extra trade, if there is a road on it. \n\ + ➤ Wagons cost 5 shields less. \n\n\ +Obsolete by:Railroad.\ +") + +[building_chand_baori] +name = _("Chand Baori") +genus = "SmallWonder" +reqs = + { "type", "name", "range", "present", "quiet" + "Tech", "Monarchy", "Player", FALSE, TRUE + "Tech", "The Republic","Player", FALSE, TRUE + "Gov", "Despotism", "Player", TRUE, FALSE + "Building", "Chand Baori", "Player", FALSE, TRUE + } +graphic = "b.chand_baori" +graphic_alt = "-" +obsolete_by = + { "type", "name", "range" + } +build_cost = 80 +upkeep = 0 +sabotage = 0 +sound = "w_chand_baori" +sound_alt = "w_generic" +helptext = _("\ +Chand Baori can only be built during your first Despotism regime. All city\ + centers become irrigation sources, and you can irrigate diagonal to any irrigation\ + source. Your Tribesmen can still irrigate after turn 20. \ +Chand Baori’s home city gets a free well on the city center (i.e., river). \n\n\ +"), _("\ +During Despotism, Chand Baori gets two more bonuses:\n(1) In its city\ + there is no tile penalty on food output. \n\ +"), _("\ +(2) Workers irrigate, cultivate, and plant faster on Grasslands, Plains, and Swamp: \n\ +• Irrigate is 2 turns instead of 3. On Swamp, Cultivate and Plant\ + are 4 turns instead of 7. Plant time on Grassland and Plains is 4 and 5 turns. \n\ +• Tribesmen: Irrigate:3; Cultivate/Plant on Swamp:8; Plant on Grassland/Plains: 6,9. \n\n\ +Chand Baori is never obsolete.\ ") [building_code_of_hammurabi] name = _("Code of Hammurabi") genus = "SmallWonder" reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Alphabet", "Player", TRUE, FALSE - "Building", "Code of Hammurabi", "Player", FALSE, TRUE + { "type", "name", "range", "present", "quiet", "survives" + "Tech", "Alphabet", "Player", TRUE, FALSE, FALSE + "Tech", "Democracy", "Player", FALSE, FALSE, FALSE + "Building", "Code of Hammurabi", "Player", FALSE, TRUE, FALSE +;requires 23Sept2021 changes to requirements.c, so obsolete wonders don't re-enable others + "Building", "Hanging Gardens", "Player", FALSE, FALSE, TRUE + "Building", "Angkor Wat", "Player", FALSE, FALSE, TRUE + "Building", "Mausoleum of Mausolos","Player",FALSE, FALSE, TRUE } graphic = "b.hammurabi" -graphic_alt = "b.courthouse" +graphic_alt = "-" obsolete_by = { "type", "name", "range" "Tech", "Democracy", "Player" @@ -1415,14 +1588,16 @@ helptext = _("\ The Code of Hammurabi is a first step toward legal organized\ civilization. It is a primitive version of later societal\ advancements. In some ways, this Wonder closes the gap\ - between Despotism and Monarchy by exactly half.\n\ -Improvements to Despotism:\n\ - • base corruption is 26% (was 37%)\n\ - • distance corruption is 3% (was 4%)\n\ - • penalties eliminated on Lowland tiles\n\ -Other bonus:\n\ - • cities with no Temple get +1 content citizen\n\n\ -Obsolete by: Democracy.\ + between Despotism and Monarchy by exactly half. \n\ +Improvements to Despotism:\n\ + • base corruption is 26% (was 37%) \n\ + • distance corruption is 3% (was 4%) \n\ + • penalties eliminated on Lowland tiles. \n\ +Other bonuses:\n\ + • awards blueprints for Code of Laws (or Writing if the former is known.) \n\ + • cities with no Temple get +1 content citizen. \n\n\ +The Code of Hammurabi is a Civil Wonder. You can build only one Civil Wonder. \n\ +Obsolete by:Democracy.\ ") [building_colossus] @@ -1432,6 +1607,7 @@ reqs = { "type", "name", "range", "present", "quiet" "Tech", "Bronze Working", "Player", TRUE, FALSE "Building", "Colossus", "Player", FALSE, TRUE + "TerrainClass", "Oceanic", "Adjacent",TRUE, FALSE } graphic = "b.colossus" graphic_alt = "-" @@ -1445,12 +1621,20 @@ sabotage = 0 sound = "w_colossus" sound_alt = "w_generic" helptext = _("\ -In the city where this wonder is built, +1 trade is added to every tile\ - that generates trade on its own.\ - Obsolete by: Automobile.\ +In the coastal city where this wonder is built, +1 trade is added to every\ + tile that makes trade. The city center tile gets an additional +1 trade.\ + Until you discover Steam Engine, the\ + Colossus city receives a discount on all maritime Commerce units:\n\ + Boat: 7 shields. \n\ + Trireme: 15 shields. \n\ + Goods: 20 shields. \n\ + Galley: 25 shields. \n\ + Caravel: 35 shields. \n\ + A trade route established from this city gets +40% one-time revenue,\ + and roughly +25% in ongoing revenue. \n\ + Obsolete by:Automobile.\ ") - [building_copernicus_observatory] name = _("Copernicus' Observatory") genus = "SmallWonder" @@ -1469,61 +1653,69 @@ upkeep = 0 sabotage = 0 sound = "w_copernicus_observatory" sound_alt = "w_generic" -; /* xgettext:no-c-format */ helptext = _("\ Boosts science production by 100% in the city where it is built.\ That is, the base science level before any improvements were made,\ is added to the total science. This wonder is never obsolete.\ ") -[building_cure_for_cancer] -name = _("Cure For Cancer") -genus = "GreatWonder" +[building_eiffel_tower] +name = _("Eiffel Tower") +genus = "SmallWonder" reqs = - { "type", "name", "range" - "Tech", "Genetic Engineering", "Player" + { "type", "name", "range", "present", "quiet" + "Tech", "Steam Engine", "Player", TRUE, FALSE + "Building", "Eiffel Tower", "Player", FALSE, TRUE } -graphic = "b.cure_for_cancer" +graphic = "b.eiffel_tower" graphic_alt = "-" obsolete_by = { "type", "name", "range" } -build_cost = 400 +build_cost = 125 upkeep = 0 sabotage = 0 -sound = "w_cure_for_cancer" +sound = "w_eiffel_tower" sound_alt = "w_generic" helptext = _("\ -This stunning technological achievement makes two content citizens\ - happy in all cities of all players who know Genetic\ - Engineering. In the event where there are not enough\ - content citizens to benefit from this effect, the wonder\ - applies to unhappy citizens (including those unhappy about military\ - activity), making each content then happy. This wonder is never obsolete.\ +The Eiffel Tower gives one free shield upkeep for units\ + to every city in your nation. This wonder is never obsolete.\ ") -[building_eiffel_tower] -name = _("Eiffel Tower") +[building_fusion_reactor] +name = _("Fusion Reactor") genus = "SmallWonder" reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Steam Engine", "Player", TRUE, FALSE - "Building", "Eiffel Tower", "Player", FALSE, TRUE + { "type", "name", "range", "present", "quiet" + "Tech", "Fusion Power", "Player", TRUE, FALSE + "Building", "Fusion Reactor","Player", FALSE, TRUE } -graphic = "b.eiffel_tower" +graphic = "b.fusion_reactor_wonder" graphic_alt = "-" obsolete_by = { "type", "name", "range" } -build_cost = 100 +build_cost = 700 upkeep = 0 sabotage = 0 -sound = "w_eiffel_tower" +sound = "w_fusion_reactor_wonder" sound_alt = "w_generic" -; /* xgettext:no-c-format */ helptext = _("\ -All your cities support one unit free of\ - shield upkeep. This wonder is never obsolete.\ +Replaces Power Plants with Fusion Reactor power in all your\ + cities. This boosts the +50% bonus of a Factory or Mfg. Plant to +90%. \n\ +➤ In a city with both a Factory and Mfg. Plant present, there is a\ + combined +180% production bonus. \n\ +"), _("\ +Pollution reduction from Recycling Center and Power Plants\ + is upgraded to a higher bonus of a flat -80%. \n\ +"), _("\ +➤ Only one Coal Plant, Hydro Plant, Nuclear Plant, or Fusion\ + Plant can have an active effect in a city. A nation that owns\ + the Fusion Reactor can sell off all Power Plants and gain a\ + large savings in ongoing upkeep costs. \n\ +"), _("\ +➤ The Fusion Reactor's surplus power gives 1 free unit upkeep\ + to every city in your nation, and 1 extra unit build slot.\ ") [building_genghis_khans_equestrian_school] @@ -1548,7 +1740,7 @@ sound = "w_sun_tzus_war_academy" sound_alt = "w_generic" helptext = _("\ Gives all mounted units +1 movement point, except for Cavalry. Must be\ - built in a city with Barracks I (not II). Obsolete by: Mobile Warfare.\ + built in a city with Barracks I (not II). Obsolete by:Mobile Warfare.\ ") [building_gibraltar_fortress] @@ -1557,32 +1749,41 @@ genus = "SmallWonder" reqs = { "type", "name", "range", "present", "quiet" "Tech", "Metallurgy", "Player", TRUE, FALSE + "Building", "Coastal Defense", "City", TRUE, FALSE "Building", "Gibraltar Fortress", "Player", FALSE, TRUE - "TerrainClass", "Oceanic", "Adjacent", TRUE, FALSE +; "TerrainClass", "Oceanic", "Adjacent", TRUE, FALSE ; redundant to #2 req. } graphic = "b.gibraltar_fortress" graphic_alt = "b.great_wall" obsolete_by = { "type", "name", "range" } -build_cost = 350 +build_cost = 330 upkeep = 0 sabotage = 0 sound = "w_gibraltar_fortress" sound_alt = "w_generic" helptext = _("\ -Gives a Coastal Defense in all your coastal cities. This has no effect\ - when Coastal Defense is already present. This Wonder must be built\ - in a coastal city. It does not become obsolete.\ +When facing attacks by sea, Gibraltar Fortress brings defensive capabilities\ + to cities with Coastal Defense, especially to the city in which it’s built:\n\ +"), _("\ +1. Reduces cost of Coastal Defense by 15, to 50 shields. \n\ +2. The city with Gibraltar Fortress gains a +100% defense bonus, for a total\ + of 3× defense against sea attacks. \n\ +3. All other cities with Coastal Defence gain +25% defense, for a total of 2.25×\ + defense against sea attacks. \n\n\ +"), _("\ +Gibraltar Fortress must be built in a city with Coastal Defense, and is never obsolete.\ ") [building_great_wall] name = _("Great Wall") genus = "SmallWonder" reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Masonry", "Player", TRUE, FALSE - "Building", "Great Wall", "Player", FALSE, TRUE + { "type", "name", "range", "present","quiet" + "Tech", "Construction", "Player", TRUE, FALSE + "Building", "Great Wall", "Player", FALSE, TRUE + "Tech", "Machine Tools", "World", FALSE, FALSE } graphic = "b.great_wall" graphic_alt = "-" @@ -1596,44 +1797,50 @@ sabotage = 0 sound = "w_great_wall" sound_alt = "w_generic" helptext = _("\ -The Great Wall protects your cities with City Walls. It takes three\ +The Great Wall protects your cities with City Walls. Unlike normal\ + City Walls, The Great Wall is impervious to Siege Rams. It takes three\ turns after founding a city for the Great Wall to extend protection\ to the new city. Also, the city must have been founded by you, or\ - assimilated to where less than a fifth of its citizens are foreign.\n\ + assimilated to where less than a fifth of its citizens are foreign. \n\ +"), _("\ The Great Wall gives no extra effect when City Walls are already present.\ However, regular City Walls still protect a city in which the Great\ - Wall has not yet activated.\nWarning! This Wonder is obsolete when\ - ANY nation in the world discovers Machine Tools. You may not know\ - which nations have Machine Tools. This makes it possible for you to\ - build an obsolete wonder!\ + Wall has not yet activated. \n Warning! This Wonder is obsolete when\ + ANY nation in the world discovers Machine Tools.\ ") [building_hanging_gardens] name = _("Hanging Gardens") genus = "SmallWonder" reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Pottery", "Player", TRUE, FALSE - "Building", "Hanging Gardens", "Player", FALSE, TRUE + { "type", "name", "range", "present","quiet", "survives" + "Tech", "Pottery", "Player", TRUE, FALSE, FALSE + "Building", "Hanging Gardens", "Player", FALSE, TRUE, FALSE +;requires 23Sept2021 changes to requirements.c, so obsolete wonders don't re-enable others + "Building", "Angkor Wat", "Player", FALSE, FALSE, TRUE + "Building", "Code of Hammurabi", "Player", FALSE, FALSE, TRUE + "Building","Mausoleum of Mausolos","Player", FALSE, FALSE, TRUE } graphic = "b.hanging_gardens" graphic_alt = "-" obsolete_by = { "type", "name", "range" - "Tech", "Railroad", "Player" + "Tech", "Steam Engine", "Player" } -build_cost = 200 +build_cost = 210 upkeep = 0 sabotage = 0 sound = "w_hanging_gardens" sound_alt = "w_generic" helptext = _("\ Makes two content citizens happy in every city in your nation.\ - In the event where there are no content citizens to get the\ - effect of Hanging Gardens, the wonder applies to unhappy citizens\ - (including those unhappy about military activity), making each content\ - then happy. Gives +2 luxury in the city where it is built.\ - Obsolete by: Railroad.\ + If there are no content citizens, the wonder makes one unhappy\ + citizen happy, even if unhappy about military activity. Gives\ + +2 luxury in the city where it’s built. \n\ +"), _(" +The Hanging Gardens are a Civil Wonder. You can build only one Civil Wonder. \n\ +"), _(" + Obsolete by:Steam Engine.\ ") [building_hoover_dam] @@ -1651,15 +1858,51 @@ obsolete_by = { "type", "name", "range" } build_cost = 600 -upkeep = 0 +upkeep = -15 sabotage = 0 sound = "w_hoover_dam" sound_alt = "w_generic" helptext = _("\ -Works exactly as a Hydro Plant in all your cities.\ - (This reduces pollution and increases the effects\ - of Factories and Mfg. Plants.) Must be built adjacent\ - to a river. This wonder is never obsolete.\ +In the city where it’s built, Hoover Dam counts exactly as a Hydro Plant,\ + Factory, and Manufacturing Plant. If any of those buildings already\ + exist in the city, they will have no effect and can be sold. \n\ +"), _(" +In all cities with a Hydro Plant, Hoover Dam increases their +20% production\ + bonus for each Factory and Mfg. Plant to +27%. (In other words, it increases\ + the production bonus on your Hydro Plants by +35%.) \n\ +"), _(" +➤ In the city with Hoover Dam, the above bonuses make for a combined +154%\ + production bonus, and a 50% decrease in pollution from production. \n\ +"), _("\ +Hoover Dam reduces the cost of other Hydro Plants by 5 shields. The\ + excess power from Hoover Dam is so great that in its home city, it\ + supports up to 15 free upkeep for other buildings!\ +"), _(" +Must be built adjacent to a river. This wonder is never obsolete.\ +") + +[building_internet] +name = _("The Internet") +genus = "SmallWonder" + reqs = + { "type", "name", "range", "present", "quiet" + "Tech", "Computers", "Player", TRUE, FALSE + "Building", "The Internet", "Player", FALSE, TRUE + } +graphic = "b.internet" +graphic_alt = "b.seti_program" +obsolete_by = + { "type", "name", "range" + } +build_cost = 600 +upkeep = 0 +sabotage = 0 +sound = "w_internet" +sound_alt = "w_generic" +helptext = _("\ +Adds to science production in all your cities with\ + a Research Lab, 100% of base output.\ + This Wonder does not become obsolete.\ ") [building_isaac_newtons_college] @@ -1675,12 +1918,11 @@ graphic_alt = "-" obsolete_by = { "type", "name", "range" } -build_cost = 400 +build_cost = 420 upkeep = 0 sabotage = 0 sound = "w_isaac_newtons_college" sound_alt = "w_generic" -; /* xgettext:no-c-format */ helptext = _("\ Adds 100% of base science production to every city in your\ nation that has a University. That is, the boost that a\ @@ -1689,56 +1931,56 @@ Adds 100% of base science production to every city in your\ This wonder is never obsolete.\ ") -[building_jtids] -name = _("JTIDS") +[building_js_bachs_cathedral] +name = _("J.S. Bach's Cathedral") genus = "SmallWonder" reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Computers", "Player", TRUE, FALSE - "Building", "JTIDS", "Player", FALSE, TRUE + { "type", "name", "range", "present", "quiet" + "Tech", "Theology", "Player", TRUE, FALSE + "Building", "J.S. Bach's Cathedral", "Player", FALSE, TRUE } -graphic = "b.seti_program" +graphic = "b.js_bachs_cathedral" graphic_alt = "-" obsolete_by = { "type", "name", "range" } -build_cost = 230 +build_cost = 300 upkeep = 0 sabotage = 0 -sound = "w_seti_program" +sound = "w_js_bachs_cathedral" sound_alt = "w_generic" -; /* xgettext:no-c-format */ helptext = _("\ -JTIDS (Joint Tactical Information Distribution System) is a radio\ - battlefield information network that provides real-time intel to forces\ - on the ground. Effectively, this Wonder modernizes the weaponry and info systems\ - for all the infantry in your army.\n\n\ -All foot soldiers and Mechanized Infantry are built with +1 vet level.\ - Odds of veteran promotion are increased.\ +Makes two unhappy citizens content in every city in your nation\ + (including citizens unhappy about military activity).\ + This wonder is never obsolete.\ ") -[building_js_bachs_cathedral] -name = _("J.S. Bach's Cathedral") +[building_jtids] +name = _("JTIDS") genus = "SmallWonder" reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Theology", "Player", TRUE, FALSE - "Building", "J.S. Bach's Cathedral", "Player", FALSE, TRUE + { "type", "name", "range", "present", "quiet" + "Tech", "Computers", "Player", TRUE, FALSE + "Building", "JTIDS", "Player", FALSE, TRUE } -graphic = "b.js_bachs_cathedral" +graphic = "b.seti_program" graphic_alt = "-" obsolete_by = { "type", "name", "range" } -build_cost = 300 +build_cost = 230 upkeep = 0 sabotage = 0 -sound = "w_js_bachs_cathedral" +sound = "w_seti_program" sound_alt = "w_generic" helptext = _("\ -Makes two unhappy citizens content in every city in your nation\ - (including citizens unhappy about military activity).\ - This wonder is never obsolete.\ +JTIDS (Joint Tactical Information Distribution System) is a radio\ + battlefield information network that provides real-time intel to forces\ + on the ground. Effectively, this Wonder modernizes the weaponry and info systems\ + for all the infantry in your army. \n\n\ +"), _("\ +All foot soldiers and Mechanized Infantry are built with +1 vet level.\ + Odds of veteran promotion are increased.\ ") [building_king_richards_crusade] @@ -1761,10 +2003,10 @@ sabotage = 0 sound = "w_king_richards_crusade" sound_alt = "w_generic" helptext = _("\ -In the city where it is built, adds one extra shield resource on every\ - tile. Lets you build one extra Caravan or infantry unit per turn without\ +In the city where it’s built, adds one extra shield resource on every\ + tile and lets you build one extra infantry unit per turn —— without\ Conscription tech.\ - Obsolete by: Robotics.\ + Obsolete by:Robotics.\ ") [building_leonardos_workshop] @@ -1787,7 +2029,7 @@ sabotage = 0 sound = "w_leonardos_workshop" sound_alt = "w_generic" helptext = _("\ -Upgrades two obsolete units per game turn. Obsolete by:\ +Upgrades two obsolete units per game turn. Obsolete by:\ Automobile.\ ") @@ -1813,7 +2055,8 @@ sound = "w_lighthouse" sound_alt = "w_generic" helptext = _("\ Gives all your sea units 2 additional movement points,\ - while increasing their vision. Obsolete by: Miniaturization.\ + while increasing their vision. Must be built adjacent\ + to Ocean. Obsolete by:Miniaturization.\ ") [building_magellans_expedition] @@ -1838,7 +2081,45 @@ sound_alt = "w_generic" helptext = _("\ All your new sea units built in cities in your nation start with an\ additional veteran level (this is cumulative with any Port Facility.)\ - This wonder is never obsolete.\ + Must be built in a coastal city. This wonder is never obsolete.\ +") + +[building_magna_carta] +name = _("Magna Carta") +genus = "SmallWonder" +reqs = + { "type", "name", "range", "present", "quiet" + "Tech", "Monarchy", "Player", TRUE, FALSE + "Building", "Magna Carta", "Player", FALSE, TRUE + } +graphic = "b.magna_carta" +graphic_alt = "-" +obsolete_by = + { "type", "name", "range" + } +build_cost = 300 +upkeep = 0 +sabotage = 0 +sound = "w_magna_carta" +sound_alt = "w_generic" +helptext = _("\ +If you are a Monarchy, the Magna Carta establishes Constitutional Monarchy.\ + This makes Monarchy more like a representative government: \n\ +"), _(" +Constitutional Monarchy summary:\n\ + ➣ Empire base size goes from 11 to 23 (identical to +1 content citizen.) \n\ + ➣ All Land tiles get celebration bonus for free. (+1 trade) \n\ + ➣ Allows rapture in cities founded by you. \n\ + ➣ Magna Carta city can build Peasants. \n\ + ➣ Magna Carta city can build an extra infantry or Peasant per turn, without Conscription. \n\ +"), _(" +Setbacks from standard Monarchy:\n\ + ➣ One unit may be used for Martial Law (not 3). \n\ + ➣ One unit is free of upkeep (not 3). \n\ + ➣ 2 military units may be abroad. Each extra causes a discontent citizen. \n\ + ➣ Gives you a Senate, which can be ignored if both King Richard’s Crusade \ +and J.S. Bach’s Cathedral are owned. \n\ +See Government⟶Monarchy for more info.\ ") [building_manhattan_project] @@ -1858,7 +2139,7 @@ upkeep = 0 sabotage = 0 sound = "w_manhattan_project" sound_alt = "w_generic" -;helptext is set in client/helpdata.c:helptext_wonder() +;helptext is set in client/helpdata.c.helptext_wonder() helptext = _("\ Allows all nations who know Nuclear Fission to make nuclear weapons.\ This Wonder does not become obsolete.\ @@ -1867,6 +2148,7 @@ Allows all nations who know Nuclear Fission to make nuclear weapons.\ [building_marco_polos_embassy] name = _("Marco Polo's Embassy") genus = "SmallWonder" +flags = "SaveSmallWonder" reqs = { "type", "name", "range", "present", "quiet" "Tech", "Trade", "Player", TRUE, FALSE @@ -1882,11 +2164,80 @@ upkeep = 0 sabotage = 0 sound = "w_marco_polos_embassy" sound_alt = "w_generic" -; /* xgettext:no-c-format */ helptext = _("\ This Wonder increases Trade, the very lifeblood of your tax income, science output,\ and luxury for happiness. With this Wonder, Trade in each city increases by 40%.\ - This Wonder does not become obsolete.\ + This Wonder does not become obsolete, and cannot be lost.\ +") + +[building_mausoleum_of_mausolos] +name = _("Mausoleum of Mausolos") +genus = "SmallWonder" +reqs = + { "type", "name", "range","present","quiet", "survives" + "Tech", "Ceremonial Burial", "Player", TRUE, FALSE, FALSE + "Building", "Mausoleum of Mausolos", "Player", FALSE, TRUE, FALSE +;requires 23Sept2021 changes to requirements.c, so obsolete wonders don't re-enable others + "Building", "Angkor Wat", "Player", FALSE, FALSE, TRUE + "Building", "Hanging Gardens", "Player", FALSE, FALSE, TRUE + "Building", "Code of Hammurabi", "Player", FALSE, FALSE, TRUE + } +graphic = "b.mausoleum" +graphic_alt = "-" +obsolete_by = + { "type", "name", "range", "survives" + "Tech", "Radio", "Player", FALSE + } +build_cost = 200 +upkeep = 0 +sabotage = 0 +sound = "w_oracle" +sound_alt = "w_generic" +helptext = _("\ +The Mausoleum of Mausolos brings a spirit of prudence to your nation, giving\ + subtle security and reduced corruption. This makes your people happier. \n\ +"), _(" +➤ A Courthouse or City Walls gives each city +1 content citizen, unless\ + unhappy about military activity. \n\ +➤ Having both the above results in +1 content and +1 happy citizen. \n\ +➤ Acts like half a Courthouse in cities which lack Courthouse or\ + Supreme Court effects: \n\ + • 30% corruption reduction \n\ + • Tile corruption penalty begins at 4 in Anarchy and Despotism (not 3) \n\ + • 10% bonus vs diplomatic actions and combat \n\ +➤ Adds (at least) +35% to the cost of bribing your units. \n\ +➤ Prevents your cities from being incited to revolt. \n\ +➤ Halves the odds of investigating your cities (85% / 2 = 43%) \n\ +"), _(" +The Mausoleum of Mausolos is a Civil Wonder. You can make only one Civil Wonder. \n\ +Obsolete by:Radio.\ +") + +[building_medici_bank] +name = _("Medici Bank") +genus = "SmallWonder" +reqs = + { "type", "name", "range", "present", "quiet" + "Tech", "Banking", "Player", TRUE, FALSE + "Building","Medici Bank", "Player", FALSE, TRUE + "Gov", "Communism", "Player", FALSE, TRUE + } +graphic = "b.medici_bank" +graphic_alt = "-" +obsolete_by = + { "type", "name", "range", "survives" + "Tech", "Fusion Power", "Player", FALSE + } +build_cost = 300 +upkeep = 0 +sabotage = 0 +sound = "w_medici_bank" +sound_alt = "w_generic" +helptext = _("\ +The Medici Bank gives every city with a Bank +7% in gold revenue,\ + and the rate on shield-to-coinage exchange also increases by +7%.\ + This wonder has no effect under Communism. \n\ +Obsolete by:Fusion Power.\ ") [building_michelangelos_chapel] @@ -1912,39 +2263,34 @@ This Wonder counts as a Cathedral in all cities which lack one.\ That is, it makes 3 unhappy citizens content in each city,\ but does not affect citizens unhappy about military activity.\ (Theology increases the effect by +1. Communist government\ - reduces the effect by -1.)\ + reduces the effect by -1.) \ "), _(" In cities which already have a Cathedral, this Wonder enhances the\ effects of the Cathedral, adding +1 happy citizen and +1 forced content.\ This Wonder is never obsolete.\ ") -;this is wonder #61 -[building_mausoleum_of_mausolos] -name = _("Mausoleum of Mausolos") +[building_olympics] +name = _("The Olympics") genus = "SmallWonder" reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Ceremonial Burial", "Player", TRUE, FALSE - "Building", "Mausoleum of Mausolos", "Player", FALSE, TRUE + { "type", "name", "range", "present", "quiet" + "Tech", "Currency", "Player", TRUE, FALSE + "Building", "The Olympics", "Player", FALSE, TRUE } -graphic = "b.mausoleum" -graphic_alt = "b.oracle" +graphic = "b.olympics" +graphic_alt = "-" obsolete_by = - { "type", "name", "range", "survives" - "Tech", "Radio", "Player", FALSE + { "type", "name", "range" } -build_cost = 200 +build_cost = 100 upkeep = 0 sabotage = 0 -sound = "w_oracle" +sound = "w_olympics" sound_alt = "w_generic" helptext = _("\ -With this wonder, City Walls and Courthouses each make one unhappy citizen\ - content in their city, unless that citizen is unhappy about military activity.\ - Also, no cities in the empire with this Wonder can be incited to revolt.\ - The discovery of Radio makes the Mausoleum obsolete.\ -") +THIS WONDER DOES NOTHING AND IS RESERVED FOR FUTURE RELEASE.\ + ") [building_oracle] name = _("Oracle") @@ -1968,15 +2314,75 @@ sound_alt = "w_generic" helptext = _("\ Makes two of your unhappy citizens content in every city\ with a Temple in your nation. Does not affect citizens made\ - unhappy by military activity. Obsolete by: Theology.\ + unhappy by military activity. Obsolete by:Theology.\ +") + +[building_pasteur_institute] +name = _("Pasteur Institute") +genus = "GreatWonder" +reqs = + { "type", "name", "range" + "Tech", "Microbiology", "Player" + } +graphic = "b.pasteur_institute" +graphic_alt = "-" +obsolete_by = + { "type", "name", "range" + } +build_cost = 400 +upkeep = 0 +sabotage = 0 +sound = "w_pasteur_institute" +sound_alt = "w_generic" +helptext = _("\ +This wonder is a breakthrough for the health of the world. It makes\ + two content citizens happy in all cities of all players who\ + know Microbiology. If there are no content citizens, the wonder\ + makes one unhappy citizen happy, even if unhappy about military\ + activity. This wonder is never obsolete.\ +") + +[building_pax_dei] +name = _("Pax Dei") +genus = "GreatWonder" +flags = "PaxDeiCounter" +reqs = + { "type", "name", "range", "present", "quiet" + "Tech", "Philosophy", "Player", TRUE, FALSE + "Building", "Pax Dei", "Player", FALSE, TRUE + "Building", "Pax Dei", "World", FALSE, TRUE + "Tech", "Theocracy", "World", FALSE, FALSE + } +graphic = "b.pax_dei" +graphic_alt = "-" +obsolete_by = + { "type", "name", "range", "survives" + "Tech", "Theocracy", "World", FALSE + } +build_cost = 115 +upkeep = 0 +sabotage = 0 +sound = "w_pax_dei" +sound_alt = "w_generic" +helptext = _("\ +Pax Dei is a socio-philosophical movement against war and violence. \n\ +"), _("\ +All nations with Philosophy gain +2 unhappy about each aggressive military\ + unit, and a Senate. \n\ +Nations with Monotheism are unable to attack unless defending their own\ + domestic territory! \n\ +"), _("\ +Obsolete by: Theocracy, or 13 turns after built. \n\ +(The server settings 'pax_dei_counter' and 'pax_dei_set' may\ + alter this wonder’s effects in specific games.)\ ") [building_pyramids] name = _("Pyramids") genus = "SmallWonder" reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Masonry", "Player", TRUE, FALSE + { "type", "name", "range", "present", "quiet" + "Tech", "Mathematics", "Player", TRUE, FALSE "Building", "Pyramids", "Player", FALSE, TRUE } graphic = "b.pyramids" @@ -1984,18 +2390,44 @@ graphic_alt = "-" obsolete_by = { "type", "name", "range" } -build_cost = 160 +build_cost = 200 upkeep = 0 sabotage = 0 sound = "w_pyramids" sound_alt = "w_generic" -; /* xgettext:no-c-format */ helptext = _("\ -Every city will gain +25% to its food storage when population changes.\ - In addition, the city with the Pyramids can rapture when celebrating.\ +Every city will gain +25% to its food storage when the city grows,\ + starves, or is founded. In addition, the city with the Pyramids\ + can rapture when celebrating.\ This Wonder does not become obsolete.\ ") +[building_roman_colosseum] +name = _("Roman Colosseum") +genus = "SmallWonder" +reqs = + { "type", "name", "range", "present", "quiet" + "Tech", "Engineering", "Player", TRUE, FALSE + "Building", "Roman Colosseum", "Player", FALSE, TRUE + } +graphic = "b.roman_colosseum" +graphic_alt = "-" +obsolete_by = + { "type", "name", "range" + } +build_cost = 400 +upkeep = 0 +sabotage = 0 +sound = "w_roman_colosseum" +sound_alt = "w_generic" +helptext = _("\ +The Roman Colosseum centralizes and gives prestige to the entertainment\ + events of your empire. Every city with an Amphitheater gains +1 happy\ + citizen and +1 luxury. In all your cities, Entertainers add 3 luxury\ + instead of 2. This means your Entertainers equal the net trade value of\ + Taxmen, Scientists, and Merchants. This Wonder is never obsolete.\ +") + [building_shakespeares_theatre] name = _("Shakespeare's Theater") rule_name = "Shakespeare's Theatre" ; en_GB used originally @@ -2021,6 +2453,34 @@ Makes all angry and unhappy citizens content in the city where it\ This Wonder does not become obsolete.\ ") +[building_sphinx] +name = _("The Sphinx") +genus = "SmallWonder" +reqs = + { "type", "name", "range", "present", "quiet" + "Gov", "Despotism", "Player", TRUE, FALSE + "Tech", "Philosophy", "Player", FALSE, TRUE + "Building", "The Sphinx", "Player", FALSE, TRUE + } +graphic = "b.sphinx" +graphic_alt = "-" +obsolete_by = + { "type", "name", "range" + "Tech", "Philosophy", "Player" + } +build_cost = 70 +upkeep = 0 +sabotage = 0 +sound = "w_sphinx" +sound_alt = "w_generic" +helptext = _("\ +The Sphinx is said to watch over all citizens to ensure they are good.\ + The result is loss of tile corruption penalties on all worked tiles in\ + the city where it’s built. As a shared work of community art and culture, it\ + adds +1 luxury. In addition, it reduces corruption in the city by half. \n\ +Obsolete by:Philosophy.\ +") + ;this should be wonder #65 if we counted correctly and need it for the "statue hack" to determine if player can get gov. [building_statue_of_liberty] name = _("Statue of Liberty") @@ -2044,9 +2504,10 @@ helptext = _("\ Allows you to instantly change government, including governments not\ yet researched by your civilization, and without the transition period\ of Anarchy. It also allows unprovoked declaration of war regardless of\ - any Senate or United Nations. Democracies cannot fall into Anarchy from\ - two turns of city disorder.\n\ - This Wonder does not become obsolete.\ + any Senate or United Nations. Democracies can’t fall into Anarchy from\ + two turns of city disorder. \n\ +"), _("\ +This Wonder does not become obsolete.\ ") [building_statue_of_zeus] @@ -2069,10 +2530,15 @@ sound = "w_oracle" sound_alt = "w_generic" helptext = _("\ The powerful Zeus gives order and organization to both city and nation.\ - In every city in your nation, this Wonder neutralizes the unhappiness\ - caused by one military unit. In the city the statue is located, it makes\ - one citizen happy and provides free upkeep to 4 units. Except for one permanent\ - happy citizen, the discovery of Tactics makes the Statue of Zeus obsolete.\ + In every city in your nation, this Wonder neutralizes one unhappy\ + citizen caused by military units. In Monarchies and non-representative\ + government, the Statue of Zeus makes one citizen content. \n\ +"), _(" +Before the discovery of The Republic, increases odds of promotion by one third. \n\ +"), _(" +In the city the statue is located, it makes one citizen happy and provides\ + free upkeep to 4 units. Except for one permanent happy citizen, the\ + discovery of Tactics makes the Statue of Zeus obsolete.\ ") [building_supreme_court] @@ -2093,7 +2559,6 @@ upkeep = 0 sabotage = 0 sound = "w_great_library" sound_alt = "w_generic" -; /* xgettext:no-c-format */ helptext = _("\ With respect to corruption, incite protection, upkeep, and other bonuses, the\ Supreme Court gives the same effect as an extra Courthouse in all your cities. By\ @@ -2116,7 +2581,7 @@ obsolete_by = { "type", "name", "range" "Tech", "Mobile Warfare", "Player" } -build_cost = 300 +build_cost = 310 upkeep = 0 sabotage = 0 sound = "w_sun_tzus_war_academy" @@ -2124,8 +2589,8 @@ sound_alt = "w_generic" helptext = _("\ All your new military land units produced in cities in your nation\ start with an additional veteran level (this is cumulative with any\ - Barracks in a city: with both, units are created as Hardened).\ - Obsolete by: Mobile Warfare.\ + Barracks in a city:with both, units are created as Hardened).\ + Obsolete by:Mobile Warfare.\ ") [building_temple_of_artemis] @@ -2151,10 +2616,10 @@ sound = "w_oracle" sound_alt = "w_generic" helptext = _("\ The bounteous Artemis bestows a multitudinous benefaction to all cities\ - with Temples: +1 production, +1 luxury, +1 science, and +1 gold.\ + with Temples:+1 production, +1 luxury, +1 science, and +1 gold.\ Requires a Temple in the city where it will be built. (This wonder also\ - recovers the lost bonus shield in cities built on resources of +1 shield:\ - i.e. Grassland shield resource, Tundra fur.) Obsolete by: Computers.\ + recovers the lost bonus shield in cities built on resources of +1 shield:\ + i.e. Grassland shield resource, Tundra fur.) Obsolete by:Computers.\ ") [building_teslas_laboratory] @@ -2180,58 +2645,6 @@ Upgrades one obsolete unit per turn. Reduces price of unit upgrades by\ 20%. This Wonder does not become obsolete.\ ") -[building_internet] -name = _("The Internet") -genus = "SmallWonder" - reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Computers", "Player", TRUE, FALSE - "Building", "The Internet", "Player", FALSE, TRUE - } -graphic = "b.internet" -graphic_alt = "b.seti_program" -obsolete_by = - { "type", "name", "range" - } -build_cost = 600 -upkeep = 0 -sabotage = 0 -sound = "w_internet" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Adds to science production in all your cities with\ - a Research Lab, 100% of base output.\ - This Wonder does not become obsolete.\ -") - -[building_sphinx] -name = _("The Sphinx") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Gov", "Despotism", "Player", TRUE, FALSE - } -graphic = "b.sphinx" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - "Tech", "Philosophy", "Player" - } -build_cost = 70 -upkeep = 0 -sabotage = 0 -sound = "w_sphinx" -sound_alt = "w_generic" -helptext = _("\ -The Sphinx is said to watch over all citizens to ensure they are good.\ - The result is loss of tile corruption penalties on all worked tiles in\ - the city it is built. As a shared work of community art and culture, it\ - adds +1 luxury. In addition, it reduces corruption in the city by\ - half. This Wonder does not become obsolete. \n\ -Obsolete by: Philosophy.\ -") - [building_united_nations] name = _("United Nations") genus = "GreatWonder" @@ -2244,15 +2657,17 @@ graphic_alt = "-" obsolete_by = { "type", "name", "range" } -build_cost = 600 +build_cost = 500 upkeep = 0 sabotage = 0 sound = "w_united_nations" sound_alt = "w_generic" helptext = _("\ -Creates a World Senate that may prevent declarations of war in some circumstances. If\ - any city in the world is in revolt for more than two turns, its whole government falls.\ - This Wonder does not become obsolete.\ +Creates a World Senate with the following effects:\n\ + 1. Breaking of a treaty by any nation, will give casus belli to all other nations.\ + 2. May block declarations of war, as if each national government had a Senate.\ + 3. If any city in the world is in revolt for more than two turns, its government\ + goes into Anarchy for a turn. This Wonder does not become obsolete.\ ") [building_voyage_of_darwin] @@ -2279,13 +2694,20 @@ In the city where this wonder is built, +1 trade is added to every tile\ This Wonder is never obsolete.\ ") -[building_womens_suffrage] +[building_womens_suffrage_small_wonder] name = _("Women's Suffrage") genus = "SmallWonder" reqs = { "type", "name", "range", "present", "quiet" "Tech", "Industrialization", "Player", TRUE, FALSE "Building", "Women's Suffrage", "Player", FALSE, TRUE + "Building", "Women's Suffrage​", "Player", FALSE, TRUE ;has a zero width space in it, for the great wonder + "Building", "Women's Suffrage​", "World", TRUE, TRUE ;has a zero width space in it, for the great wonder + "Gov", "Despotism", "Player", FALSE, TRUE + "Gov", "Monarchy", "Player", FALSE, TRUE + "Gov", "Theocracy", "Player", FALSE, TRUE + "Gov", "Communism", "Player", FALSE, TRUE + "Gov", "Nationalism", "Player", FALSE, TRUE } graphic = "b.womens_suffrage" graphic_alt = "-" @@ -2298,22 +2720,29 @@ sabotage = 0 sound = "w_womens_suffrage" sound_alt = "w_generic" helptext = _("\ -In the capacity of reducing Military Unhappiness, this Wonder neutralizes the\ - unhappiness caused by two military units. This Wonder has no other\ - effect. It does not confer bonuses against hostile diplomats like a Police\ - Station. It gives no bonus to cities which already have a Police Station.\ - This Wonder does not become obsolete.\ +Women's Suffrage brings equality and happiness to half the population, resulting\ + in +1 happy in every city with Republic and Democracy. On the other hand, once\ + this Wonder is achieved by any player in the world, any Republic or Democracy\ + that does NOT have it, will suffer +1 unhappy citizen, as vocal dissidents will\ + arise and demand the adoption of this progressive advancement.\ ") -[building_roman_colosseum] -name = _("The Colosseum") -genus = "SmallWonder" +;This has a zero width space in it to be the first one made. +[building_womens_suffrage_great_wonder] +name = _("Women's Suffrage​") ;great wonder marker +genus = "GreatWonder" reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Construction", "Player", TRUE, FALSE - "Building", "The Colosseum", "Player", FALSE, TRUE + { "type", "name", "range", "present", "quiet" + "Tech", "Industrialization", "Player", TRUE, FALSE + "Building", "Women's Suffrage", "Player", FALSE, TRUE ;can't own small wonder. + "Building", "Women's Suffrage​", "Player", FALSE, TRUE ;can't own great wonder. has a zero width space in it, for the great wonder + "Gov", "Despotism", "Player", FALSE, TRUE + "Gov", "Monarchy", "Player", FALSE, TRUE + "Gov", "Theocracy", "Player", FALSE, TRUE + "Gov", "Communism", "Player", FALSE, TRUE + "Gov", "Nationalism", "Player", FALSE, TRUE } -graphic = "b.roman_colosseum" +graphic = "b.womens_suffrage" graphic_alt = "-" obsolete_by = { "type", "name", "range" @@ -2321,99 +2750,48 @@ obsolete_by = build_cost = 300 upkeep = 0 sabotage = 0 -sound = "w_colosseum" -sound_alt = "w_generic" -helptext = _("\ -The Colosseum was really something special.\ - ") - -[building_hypogeum] -name = _("Hypogeum") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Building", "Hypogeum", "Player", FALSE, TRUE - } -graphic = "b.hypogeum" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 50 -upkeep = 0 -sabotage = 0 -sound = "w_hypogeum" -sound_alt = "w_generic" -helptext = _("\ -The Hypogeum was really something special.\ - ") - -[building_olympics] -name = _("The Olympics") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Currency", "Player", TRUE, FALSE - "Building", "The Olympics", "Player", FALSE, TRUE - } -graphic = "b.olympics" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 50 -upkeep = 0 -sabotage = 0 -sound = "w_olympics" -sound_alt = "w_generic" -helptext = _("\ -The Olympics were really something special.\ - ") - -[building_chand_baori] -name = _("Chand Baori") -genus = "SmallWonder" -reqs = - { "type", "name", "range", "present", "quiet" - "Building", "Chand Baori", "Player", FALSE, TRUE - } -graphic = "b.chand_baori" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 50 -upkeep = 0 -sabotage = 0 -sound = "w_chand_baori" +sound = "w_womens_suffrage" sound_alt = "w_generic" helptext = _("\ -Chand Baori was really something special. It allows 3 food from grass on a city center, and\ - even more special, allows you to irrigate adjacent to all cities.\ +Women's Suffrage brings equality and happiness to half the population, resulting\ + in +1 happy in every city with Republic and Democracy. On the other hand, once\ + this Wonder is achieved by any player in the world, any Republic or Democracy\ + that does NOT have it, will suffer +1 unhappy citizen, as vocal dissidents will\ + arise and demand the adoption of this progressive advancement!\ ") [building_ziggurat] name = _("Ziggurat") genus = "SmallWonder" +flags = "VisibleByOthers" reqs = - { "type", "name", "range", "present", "quiet" - "Building", "Ziggurat", "Player", FALSE, TRUE + { "type", "name", "range", "present", "quiet" + "Tech", "Masonry", "Player", TRUE, FALSE + "Building", "Ziggurat", "Player", FALSE, TRUE + "Gov", "Despotism","Player", TRUE, FALSE } graphic = "b.ziggurat" graphic_alt = "-" obsolete_by = - { "type", "name", "range" + { "type", "name", "range", "present" + "Tech", "Monarchy", "Player", TRUE } -build_cost = 55 +build_cost = 80 upkeep = 0 sabotage = 0 sound = "w_ziggurat" sound_alt = "w_generic" helptext = _("\ -Counts as a Temple, gives +1 happy, and as primitive City Walls giving +50% extra defence.\ +The Ziggurat moves the production bonus from your Palace to the Ziggurat city,\ + and gains the same corruption reduction and happy bonus effects. \n \ +The Ziggurat gathers all ruling functions of early civilization into one\ + wondrous building. It counts as a Granary, Temple, and Barracks. In cities\ + without Walls or Fortifications, it gives a defense bonus similar to\ + Fortifications, but gives a guaranteed 1.75× defense, regardless of attacker\ + or terrain type. \n\ +Obsolete by:Monarchy or switching from Despotism.\ ") - [building_capitalization] name = _("Coinage") genus = "Special" @@ -2431,6 +2809,12 @@ build_cost = 999 upkeep = 0 sabotage = 0 helptext = _("\ -This is not a normal improvement. Setting production to Coinage converts\ - normal output into tax output (money, coins!)\ +Coinage converts production output to gold. The base rate is 2 shield\ + to 3 gold. The base rate is favorable only in niche contexts. Under\ + non-Communist government, city improvements increase the rate of return:\n\ + ➤ 1.50 gold per shield: Base rate. \n\ + ➤ 1.75 gold per shield: Marketplace (adds +25%). \n\ + ➤ 2.00 gold per shield: Bank (adds +25%). \n\ + ➤ 2.25 gold per shield: Stock Exchange + The Corporation (adds +25%). \n\ +Fractional income is resolved by randomized Banker’s Rounding.\ ") diff --git a/freeciv/freeciv/data/mp2c-desert/changelog.txt b/freeciv/freeciv/data/mp2c-desert/changelog.txt new file mode 100644 index 000000000..da859bc66 --- /dev/null +++ b/freeciv/freeciv/data/mp2c-desert/changelog.txt @@ -0,0 +1,564 @@ +Brief Explanations of goals and challenges. + Simplicity vs. Complexity. + Unneeded complexity should be reduced. Where needed for balance it is acceptable, but look for + other additions or modifications to ultimately reduce it. + Simplicity is ideal exactly up to the point where it doesn't create imbalance, spam, or golden + path. Sometimes this can be obtained quite easily, other times it is difficult and first + solutions to solve balance issues might be more complex then later ways are found to reduce it. + Balance, Playability, Realism, ideally all three, conflicts are resolved in that respective order. + Several other Manifesto points: + "Game of a lifetime", "Depth of strategy, diversity of strategy: i.e., reduce spamming contexts, + reduce/eliminate Golden Path formulas." + + What motivates Ruleset additions + Obviously a lot of new things appear, which seems to be throwing "the kitchen sink into the rules + just for the fun of it." This is not what is happening. Everything is driven by #1 goal of balance, + and additions happen when the easiest way to achieve that is to add something. Some new additions + rarely happen because of Playability and Realism, but most are because of Balance. We can't just + throw in "Saw Mill" because it seems "cool", as this may affect the balance of every other thing. + Rather, when a balance issue is identified, sometimes the easiest way to solve it is through + creating a "holistic" counterbalance. If that counterbalance also supplies more playability, fun, + and realism, THEN we add it. + Issues + 2x movement, side effect balancing. + Non-infinite rails, side effect balancing. + Rewonder 1.0, side effect balancing. Largest side effects: + 1. overpowering the rapture-based govs. + 2. "counts as a ... in every city" had rendered many improvements in the game useless, e.g. power plant, + hydro plant, nuclear plant, police station, cathedral, courthouse, etc. One by one, these are being + morphed into more interesting layered effects instead of just "x in every city", which worked for + Great Wonders fine, but created a kind of exponential imbalance where the more powerful you were, + the more powerful you were (because the wonders represent cheaper and cheaper improvements), thus + resulting in a more exaggerated power imbalance between players. + Almost all changes since MP2 started have been in response to these. Most smaller areas have already been + resolved or finalized (air unit balance and mechanics, unreachable exploits, infinite rails, etc.) + +Focus goals for MP2-Caravel +1. Increase splendor of the Bronze Age. Define your national race, characteristics, and unique path. +1a. Increase progress in the ruleset goal that the variety of wonders is such that there are too many to build: if you try, say hello + to Horseys coming for you! Contunued enhancing of the "Too many wonders" characteristic continues to reduce the sameness or + similarity in national characteristics and same strategies, especially among the "Wonderboy" players. Each nation has to + carefully pick its diverse traits and advantages. Final result: more strategic breadth and variety, further progress toward + the goal of "game of a lifetime", continued elimination of "golden path" traits of the game. +2. Attempt the Final Re-balance of what 2x movement rates have done to foot units. + Make Foot units a true tactical component again. +3. Re-balance of Govs toward the vibe and vision of what we know it should be like. +4. Enhance Trade routes and other mechanics to increase the Diplomatic / Economic bloc / Sovereign concerns of + each individual nation: Nerf mechanics forcing gang-alliance loyalties. + +WONDERS: +======== +1. Colossus: +1 trade on city center, -5 cost on most commerce units built in that city. 2 notch or ~22% increase to trade in its city. Bug-fix: Now must be built adjacent to Ocean. +2. Hanging Gardens now costs 210 and is obsolete by Steam Engine: + increase diversity of other early wonder strategies + encourage Frigates before Ironclads + more difficult for representative govs to rapture simultaneous to mid-game invasions +3. Magna Carta, new wonder, creates a new government Constitutional Monarchy which is half between Monarchy and Republic. + for the price of Oracle, Eiffel Tower, and Statue of Zeus, you basically get those same effects and a Republic-ish government: + 1 extra content, 1 free unit upkeep, 1 more content about military than Republic, extra trade on land tiles, ability to rapture. + One can also consider no lost turn of anarchy as a hidden discount in the 300 shield price. + What you don't get: 1 free trade on water (unless celebrating), lower chance of civil war, 80% max tax, the ability to choose + those 300 shields went to some other more desired first investment than Oracle, Zeus, Eiffel Tower, as much trust from your + peaceful neighbours. + What you get Republic that Republic doesn't, if it had spent 300 on Oracle, Eiffel Tower, and Zeus: one free martial law, + keep your capital production bonus, the ability to still make 1) Oracle, Eiffel Tower, and Zeus; 2) Your "free" Oracle and Zeus won't + expire/become obsolete, less trust from your neighbours. +4. New Wonder Appian Way: Foot units, Chariots and Wagons get move bonus from Appian Way. City with Appian gets discounts on Wagons. + increases revenue from trade routes approx. 10%, gives +1 trade to every road tile in its home city, + workers +1/3 move and build roads at double speed +5. Women's Suffrage small wonder combined with JSB small wonder made Democracy almost immune to the intended disadvantages it's supposed to have + to counterbalance its superior economy. Women's Suffrage now counts as +1 happy in every city. This will keep a city content from one military + but not necessarily help rapture it since rapture needs no unhappy; instead of formerly, 4 unhappy citizens about military all being forced + content. This makes slightly tunes Democracies to perform better at Peace and not as well for war. However, this also represents another slight + nerf to democracy because once ONE player has it, it causes discontent in all representative governments which DON'T have it, thereby causing + an obligatory 300 shield expense for democracies OR a nerf of +1 unhappy person in all democracies without it. +6. United Nations Wonder has new features which make it more globally interesting and strategic. + 1. When someone violates a treaty with another player, United Nations will give the whole world casus belli against that player. + 2. Now that casus belli is tuned to work better, this opens up a lot more diplomatic intrigue and strategies from this wonder. + 3. Cost 500, was 600. +7. Statue of Zeus gains new ability, increases odds of veteran promotion by one third prior to discovery of Republic. +8. Gibraltar Fortress was another "wonder in every city" that made the original improvement worthless, while itself adding no extra dynamic to the + game. It now becomes an extra commitment in cost to make existing coastal defenses stronger; also gives the one city it's built in a 3x defense + against sea attacks, as an additional point of interest to balance out the new bombard abilities of battleships. Cost: 330 (was 350) +9. Hoover as small wonder made FOUR different improvements useless. This was an acceptable hack since Power Plants were one of the very + few areas that was imbalanced in original Civ2. Now, all 4 power plants are well-balanced, uniquely useful, and create different Economic + paths and decisions regarding preferences over production/pollution/investment costs/tech priorities. Hoover is now a mega-production wonder + in its individual city while giving small bonuses to all hydro plants in other cities. See also: Power Plants. +10. Fusion Reactor. The wonder model of "counts as x all cities" was moved from Hoover to The Fusion Reactor, which makes more sense. This model is + now frowned on for small wonders but, in this case it makes sense in the very end game when no one wants to be messing with power + plant upgrades in 75 cities. Not just for that reason: the major bonus of Fusion Power is selling off all the other power plants and going to + lower upkeep, lower pollution, and instantly having fusion power in all newly acquired cities. +11. Pyramids gain from the server upgrade on EFT_GROWTH and confer 25% food to newly founded cities, now cost 200, and require Mathematics. +12. Wonder price adjustments + ** HG 210 + ** A.Smith 320 - it's powerful! + ** Eiffel 125 - it was underpriced + ** Isaac 420 - slightly discourage everyone doing isaac + ** Sun Tzu 310 - slightly discourage everyone having hardened units +13. The Sphinx, cost 70, tech req: none, reduces tile corruption (anarchy/despotism), halves city corruption, gives +1 luxury to city. +14. Marco Polo, as an embassy and outer relations/connections type of wonder, can't be lost in the conquest of a single city. + This is especially fair since: this is the only wonder in the game that is "required", one might say. This provides fairness to + all players who otherwise would prefer a "no wonder" strategy. +15. Roman Colosseum added. Entertainers give 3 lux instead of 2, now equal in net trade to scientists or taxmen. Each city with an + Amphitheater gains +1 happy and +1 luxury. +16. Chand Baori +17. Medici Bank +18. Roman Colosseum +19. Ziggurat. +20. Pax Dei, a diplomatic/political intrigue or trump card to capture middle ages dynamics. Works as a (very) short-term kind of united nations, + but can be used in devious ways as well. +CIVIL WONDERS are wonders that help define the charactertistics of your race, nation, and culture, and may alter its strategic + path and possibilities. +1. HG is now a Civil Wonder. +2. Angkor Wat. +1 happy, all tiles in cities 3+ get celebration bonus when city is not celebrating, tile work on jungle/swamp 50% faster, + irrigation of lowlands faster, cost of Elephants -5 shields. +3. Mausoleum of Mausolos. +4. Code of Hammurabi, halves the gap between Despotism and Monarchy, and gives one content citizen. CIVIL WONDER. + +BUILDINGS: +========== +1. Barracks requirement is Warrior Code. Besides making sense and rewarding early discovery of that tech as a diverse strategy to pursue, it + balances out the longturn's format of giving starting gold and extra disbandable units. + a. Barracks II 35, Barracks III 40. +2. Coinage yields 3 gold per 2 shields, (i.e., 1.5 gold per shield), so it no longer a "useless" feature taking up game space. + a. Marketplace, Bank, and Stock Exchange each add 0.25 to the conversion rate (1.75,2.00,2.25, respectively). + 1. requires all earlier buildings present, 2. not Communist gov, 3. the final bonus for Stock Exchange also requires The Corporation +3. Police Station prevents investigate city for all govs except Democracy. + a. Since Foreign Nationals are categorised as "discontent about military", Police Station now works on those for all governments (was Repub/Demo only) +4. Courthouse prevents Diplomats (not Spies) from doing hostile Embassy without first cease-fire or peace. +5. City Walls were sometimes too cheap, sometimes too expensive, sometimes too OP, etc., this was very similar to the issue with Fortresses + that was fixed earlier with the Fort/Fortress distinction. The new City Walls solution breaks into two types somewhat modeled on the + Fort / Fortress solution now. + City Fortifications are available with Masonry and provide 1.75x; + City Walls come with Construction and remain 3x. (Same for Great Wall wonder.) + Just as with Fort/Fortress, City Fortifications are cheaper/easier to build but not as strong. Also same is that they don't + stack. And also same is Masonry for first, Construction for second. + City Walls which cost 80 in Civ2, cost 65 now in early game, and 75 after discovery of Steel. + Fortifications for cities that get Walls later are not lost investment. Selling Fortifications in a city with City Walls will recoup + the full gold price of the Fortifications. Be sure to have the City Walls made first. + If City Walls are sabotaged, you can keep the Fortifications for a weaker backup. + With some kinds of terrain, Fortifications modify, integrate, and are built into the terrain itself: Swamp, Forest, Jungle. + This raises the terrain defense bonus of Swamp, Forest, and Jungle to 1.5x, 1.5x, and 1.67x respectively (+17%) +6. SAM Battery cost 80 (was 70) [100 in Civ2] +7. Coastal Defense cost 65, upkeep 2. (Civ2: 80, 1). Micro-balances economic inflation effects and complaints C.D. is too cheap/strong/easy/common + for preventing naval attacks. See also: Gibraltar Fortress. +8. Power Plants refactoring. Formerly, each plant had identical characteristics in upkeep and output, with the only difference being that + you paid WAY more than it's worth to get less pollution. Now, each Power Plant has a different profile for output, pollution, upgrade + incentives, and so on. They fit together well in a meta-system, not just with themselves, but with other improvements. + a. Solar Plant and the new Wind Plant are no longer (only one type can co-exist in the same city.) + +GOVERNMENT RE-BALANCE: +* ALL NON-REPRESENTATIVE GOVERNMENTS: +1. Courthouse gives +1 content to all govs, not just Democracy +2. Statue of Zeus makes 1 citizen content about military for govs who need that, and if not, simply 1 citizen content. +* DESPOTISM + Gains new "Gulag" ability: can starve cities without disorder if 2 martial law units are there. +* MONARCHY: + gets the option to build Magna Carta to become a half/hybrid between monarchy and republic characteristics, which opens + up intriguing different strategies or counter-strategies to others. Magna Carta activates the new gov +* CONSTITUTIONAL MONARCHY +* FUNDAMENTALISM: +0. Renamed to Theocracy and re-balanced to be more competitive. +1. Theocratic govs are harder to bribe, cost is 2x. +2. Pilgrams have no pop_cost! Now, it's like buying rapture for 10 shields. Pilgrims use ONE city-build-slot instead of all. +3. Government now gets the "generate partisans" effect. +4. Fanatics renamed to Zealots, otherwise same unit, except: + a. They can skirmish assault cities which have foreign populations (e.g., your recently conquered city) + b. Available with Conscription, not Fundamentalism which is no longer a tech. +5. -50% bulbs in exchange for free upkeep on temples/make_content buildings, was a harsh penalty. Changed to: + a. Bonus/penalty is symmetric now: -20% for sci, +20% for gold. +6. New unit Falconeer represents the Janissaries and Hand cannoneers employed by mediaevel theocratic orders. +* COMMUNISM: +1. Proletarians have 1 pop_cost but add 2 pop. Same +1 net pop as Pilgrims, but can better use granary dynamics and magnify state populace control of "boom-town" growth. One city build slot used, not all. +2. Communists: 10 shield discount on Armor I. +3. Gains new "Gulag" ability: can starve cities without disorder if martial_law count is 3 or more. (each unit counts for 2, each police station for 2.) +* DEMOCRACY: +1. Democracy has base corruption level of 8%, (half of Republic/Monarchy) +2. Democracy: corruption increases by 0.4% per tile from capital (1/5 that of most other govs (=2%)) +3. Democracies can now be BRIBED, but cost is 3x. +4. Democacies can now be INCITED TO REVOLT, but cost is 3x. +5. Democracy can't rapture with 10% or more foreign citizens. +6. Also see, Hanging Gardens, Police Station, Women's Suffrage. +* NATIONALISM +1. New government, see manual for details. An modern authoritarian warlike government that, on a one-for-one per capita population comparison, is quite economically + capable of competing with democracies. +* FOREIGN NATIONALS: +1. 40% are unhappy, increase from 34%. +2. Fixed, was sometimes rounding up too high, the number of your own nationals in a newly conquered city. + +UNITS/COMBAT/MECHANICS: +* FOOT UNITS +1. "Hand-me-down upgrade bonus": + Early foot convert to Musketeers for free in domestic cities upon discovering Conscription. + Musketeers " " Riflemen " " " " " " " Labor Union. +2. Pre-feudal foot units (Warrior, Archer, Phalanx, Legion) cost 20% less. +3. Feudal foot units (Pikemen) cost 10% less. +4. Marines can now: build Fort/Airbase, but not Airbase in a Fort. + Gain +2 move frags per vet level + V2+ can do ranged Bazooka Attack for 3 rounds on up to 2 targets. + Note this does not represent superior range of Marines to other units/weaponry, but rather + special commando training for fast initiative surprise degradation tactics, concealment advantage, etc. + Marines cost 55 (was 60). +5. Paratroopers A7 D5. Cost 55 (was 60) +6. Partisans cost 45 (was 50). +7. Shift from shield to gold upkeep for Infantry changed from Labor Union to Banking. Allows realistic foot soldier compositions to affect more of the game. +* SPECIAL UNIT ABILITIES - This is a new MP2 design goal to increase tactical depth, unit diversity, playstyle variety, realism accuracy, and even further reduce "golden pathing" of military strategies. +1. SPECIAL UNIT ATTACKS. Tactical depth blossoms: Now possible are: Hit-and-run tactics; multiple ranged attacks per turn; engagements with less than all units on the tile. + Phalanx, Rumble Attack: 3 combat rounds, stays fortified, can hit 1 unit, can kill no units, uses 5/9 moves, requires 1 move left, requires fortified or not moved prior. + Legion, Pilum Assault: 1 combat round, 2x attack, can hit 2 units, can kill 2 units, uses 1 move. + Archers, Volley attack: 2 combat rounds (was 1), stays fortified, can hit up to 7 units (was unlimited), can kill no units, uses 1 5/9 moves (was turn loss), can attack water. + Fanatics, Skirmish assault: 3 combat rounds, can hit up to 4 units, can kill no units, uses 1 5/9 moves. Now, can also assault conquered foreign-occupied cities. + Marines, Bazooka attack: 3 combat rounds, can hit up to 4 units, can kill 1 unit, uses 1 5/9 moves, can hit oceanic (but not while transported) + Battleship, Bombard attack: 3 combat rounds, 4 units, can kill 1, uses 5 moves. + Catapult, Cannon, Artillery, Howitzer can defend against bombard/ranged/special unit attacks at 4,5,6,7 combat rounds, respectively. +2. iPILLAGE. Instant Pillage is tactically significant. Formerly, roads under rails couldn't be pillaged in one turn. Scorched Earth and Blitz tactics barely existed in the game. + NOTE: iPillage Odds increase +5% per vet level. + Dive Bomber - 50% odds, 1 selectable target, 7 move cost. + Ground Strike Fighter - 75% odds, 1 selectable target, 3 moves cost. + Armor I/II - 75% odds, 1 selectable target, 2 move cost. + Strategic Bomber - 60% odds, 1 random target, 3 move cost. + Jet Bomber - 75% odds, 2 random targets, 3 move cost. +3. SPECIAL STANDARD ATTACKS + Phalanx and Marines can stay fortified during attack. +* PRICE CHANGES + Pre-feudal units -20% foot, -10% mounted. Catapult 34. + Feudal: -10% foot, -5% mounted. Armor II: 85 (was 80) +* UNITS: +1. Siege Ram: Must use roads. SPECIAL UNIT ATTACKS: + Attack City Walls. 50% chance to destroy city walls (requires 1 full move point), odds halved against capitals. + Ram Fortress: attack on fortified walls is emulated by up to 4hp damage on each occupant, emulating a 0 to 80% reduction of Fortress defense bonus; which may be partly/fully repaired/recovered each successive turn. + Two Rams will likely render Fortress defense into liability. Troops who remain in a Fortress facing two Siege Rams will be damaged and demoralized from breaches + and crushing stone debris. But, proactive defenders can pillage the Fortress and use its stone to improvise fortified structures (a Fort, which is left after a Fortress is pillaged) + That is, render the tile into an unrammable Fort which still gets a 1.33x bonus protection from stack kill. + The net effect of this realistically emulates that Fortresses are dominant military presences until attackers take the time and wherewithal to get around + to protracted siege, whereafter they are still defendable but at a lesser bonus. +2. Satellite: invisible, can investigate all cities (even with Police Station), has superior vision and movement. Requires Apollo Program. +3. Zeppelin: upgrades balloon, greater vision/movement/fuel, some limited attack capabilities, can do limited bombing. +4. Helicopter fixed, correctly susceptible to SAM Battery not City Walls (fixes a nerf of 3x for a land unit not from original game) + this fix was retroactive to AG and Brava also, as it was a really bad treason against the branch's DNA. +5. Battleship gets ranged attack: 3 rounds, can hit up to 4 units, can kill up to 1 unit, uses 5 moves. +6. Truck replaces Freight. Changes: Road only, moves: 6, can carry 3 land units. load/unload rules same as Train. +7. Discovery of Recycling reduces unit upgrades 20%, stacks with other discounts. +8. A server flaw sometimes + a. allowed military units to clean fallout and pollution. This fix affects ALL rulesets. + b. For non-military units, only spies and worker types can pillage now. Excluded are: Caravans, Explorers, Diplomats, Pilgrims, Tribesmen, Trucks, Freight. +9. Base Stack Escape odds are 60%, not 50%. 50% is too coin-flip on live or die for anyone to really use or count on this bonus. + Higher, however, can give too much power to stacks. +9a. Destroyer types are fast and have 67% stack escape odds. Submarines are submerged and have 75% stack escape odds. +10. Fighter is D3.5, Escort Fighter is A3.5. + +BALLISTIC sub-class +1. Catapults and their upgrade line (Cannon, Artillery, Howitzer) are now the Ballstic sub-class of the Land unit class. This line of units gets an increasing +25% upgrade over + the obsolete unit, in how much of the Fortification/City Wall bonus it reduces. Catapult takes -25% from Fortifications and Wall bonuses. This represents their + special unit ability, makes them all a more logical family progression (instead of all -0% then Howitzer is suddenly -100% bonus). It also helps these + slow units fit much better into their historic realistic tactical uses, inside the game. +2. Catapult > Cannon > Artillery > Howitzer is now an evolutionary sub-class of land units for Ballistic/Siege/City Busting as their + special unit ability or distinction. Each one gets a special bonus against City Defense improvements that progressively grows until + arriving at Howitzer. This does a lot for game balance and logic. +2. Ballistic sub-class special unit ability is that it can retaliate against ranged special unit attacks from other unit types. They may be + weak defenders up close, but be careful shooting arrows or bazookas at them from far away, or you might regret it. + +SPIES/DIPLOMATS: +1. Diplomatic units now defend a unit on a tile from hostile diplomatic acts (bribe/sabotage), the same as they defend a city from hostile diplomat attacks. + a. In the case where bribe/sabotage isn't possible (i.e., other non-diplomat units > 1), no defense is necessary since it's "No action possible." + b. Where it is only the case of 1 diplomat vs. 1 enemy diplomat, they enter into diplomatic combat, the same as in a city. + c. Spies promotion odds increased to compensate for the weaker strength of their veterancy levels, to make it track more similar + to other units for number of successful surviving actions. + d. Spies can investigate city from a transport, but not other actions. + e. Diplomats can investigate city without being spent. +2. Investigate City is now no longer hard-coded in server to 100% success. What this means for MP2: + 80% chance to COVERTLY SLIP past enemy diplomats/spies WITHOUT diplomatic combat. (100% if unprotected) + If slipped past OR defeated enemy diplomats in combat, 85% chance to succeed at investigating city. + FINAL ODDS: + 85% chance to investigate unprotected city + ~75% chance to succeed vs. protected city (varies slightly up or down with the vet levels of the spy units in combat.) + causes casus belli on failure! +3. Conquered cities with Foreigners have a +10% chance of success in sabotage actions. +4. Cities with 50% or more foreign citizens are considered occupied warzones, rather than cozy places where spies can + steal weapons techs from scientists at the university. No tech theft from a city that is half or more foreign. + This fixes some ridiculous cases where u couldn't conquer a city because ur afraid to give Mass Production to your enemy, + even though u could try as hard as hell to make sure no soldiers are carrying out tech briefcases on how to do Mass Prod. + +OTHER: +1.Casus Belli Expansions: + a. In a foreign territory casus belli is given by: Transforming Terrain, Building Base, or making road-types (road,rail,quay,canal,etc.) + b. Bribe enemy unit. + c. Found City on foreign territory (i.e., in a Fort.) + d. Capture Units (fixed an unknown server bug that allows this to work now.) + e. Investigate City if discovered when dong it. + f. Moving military units inside foreign territory with whom you have Cease-fire, Peace, Armistice: + NOTE, if you accept cease-fire while inside someone's territory, moving the units will give casus belli. Be out first. + g. Formerly, casus belli lasted 2 turns: the turn of the incident and one after. mp2c now uses the new server setting + casusbelliturns and defaults to 12. +2. Improved tuning of terrain dispersion; less domination in some areas by a single terrain type. +3. Balance Alignment of Resource Distribution (BARD. 1. On the first TC, BARD allocates a SMALL amount of: + Berries, Spice, Peat, Oasis, Rubber, Gems, Elk, Furs, Ivory, and Iron, in order to enhance statistical + balance in each climactic region. Typically this is less than a 4% chance per tile, with exact value tuned to regional + geographic balance. (Swamp and Arctic get somewhat more.) 2. BARD overcomes the map generator's forced 35% + chance a tile gets a resource, regardless of terrain, resource type, or scarcity of nearby resources on other tiles. + 3. BARD discourages settling on the first turn, giving one turn of "oxygen" for all players to look around before settling + their cities. This was preferred to proposals to disallow settling on first turn, or to exaggerate inconsistent special + exception bonuses for starting moves, exceptions to terrain movement penalties for x turns, etc., etc. +3a. Furs can now exist on Arctic terrain. This provides more balance to the worst terrain type in the game. +4. "Blood for Oil": After Refining, Oil Wells built on Oil get +1 shield after other bonuses. + (Previously, it was arguably better to irrigate rather than mine.) Oil tiles with more value are now more worth fighting for. +5. Monotheism 384 (was 415), Theology 600 (was 725), Theocracy 725 +6. Added Castle. Built on top of Fortress. a. Units inside can't be seen. b. Moat prevents Siege Rams. c. Claims more surrounding tiles. d. Sees farther. + e. No extra defense bonus. + reqs: Construction, Feudalism. Obsolete by: Gunpowder. +7. Added Bunker. Built on top of Fortress. a. Units inside can't be seen. b. Prevents Air and Missile attacks. + c. Prevents tile pillage (so Jet Bomber etc. can't remove it) d. Claims less surrounding tiles, doesn't see as far, no extra defense bonus. + reqs: steel +8. Trade re-balance. You've only got one trade route per city so we're going to make it mean something. Trade and Project Honeycomb are now + ready to come into the game with some real meaning! + Traderoutes add a hard +1 trade to the city centre. + One-time gold bonus for establishing a trade route is now the standard freeciv bonus. It's a lot more, but it's only once per city. + 4x one-time gold bonus for establishing trade routes between capitals, if it's before Banking is discovered. + Base route revenues is now 50% higher than standard. With only one route instead of 4, this means you're still getting + only 37.5% from trade routes as the former (OP) trade dynamics. But 37.% of OP is something substantial. + Marco Polo continues to take care of the other 3 routes you would have had under standard rules, keeping the game simpler. + For all these bonuses is a price to pay. Minimum distance for trade routes is now 20 tiles... reaching out farther is a small balance + to pay for your higher bonus. Encourages more world-interconnectivity and intrigue, and even banditry and piracy. + +MISC. +--------------- +Commerce units simplified. All commerce can build wonders and do trade routes at all times under all conditions. + Trade tech isn't needed for Trade routes. Trade tech simply increases Trade revenue higher rates. +Ships cost 2x to bribe -- injured ships far from home had too low bribe costs for what you're getting, additionally, input showed a + split on whether ships should even be bribable at all. +Damaged Submarine min_speed=4 (was 3); makes hit-and-run and escape somewhat more viable. +Nuclear winter was patches of random arctic everywhere, now it a temperature downgrade of each affected tile to one level colder. +Starting Caravans have all restrictions and complications removed. Can Help Wonder or Establish Trade Route (remember to set Home City first!) +Camels move faster than people, Caravans get 2 7/9 moves. They can also carry 2 Goods units. +Capturable commerce units can't become uncapturable just by carrying Goods or being on same tile with other capturable commerce units. + This prevents mere cargo from making commerce units immune to capture. Cargo becomes lost in a capture event: e.g., Caravan carrying + goods gets captured. Goods are lost, Caravan transfers ownership. +Tribesmen become primitive generalists who can do a mediocre job at many things, rather than specialized to one thing like other units. + This makes them perfect start units for a primitive tribe to slowly get itself going: + They can work tiles like Workers, but only contribute a half-worker turn instead of a full worker-turn. + They can now fight (A1D1 HP6), but at 60% the strength of a warrior, are not so amazing. + Semi-military, semi-civilian: + They cannot capture, expel, or conquer cities. + Like before, they are capturable and expellable. +Workers now have 6hp, so they are not equal to a Warrior in combat, yet still can feel safer running for the hills or other defense terrain. +Because Workers and Tribesmen are 6hp, the Warrior now becomes somewhat more meaningful as having primitive military ability. +Coastal Defense is visible without middle-clicking for city info: it puts 4 cannon towers in the corners, and cannon placements along the walls. +Masonry is not needed for Palace (simplification) +Tribesmen, Diplomats, and Explorers can investigate cities without being spent. Let the games of ancient espionage and paranoia begin ! +Train goes from 1 gold upkeep to 0. Cost was too high for achieving parity for foot unit mobility on rails. +Worker turns to irrigate swamp or plant forest go from 8 to 6½. In almost all cases, that means 7. +CANALS + Formerly: + Coastal Canals could be made Adjacent to Ocean. + Inland Canals could be made Adjacent to River. + results: canal length artificially limited, some glitch cases where diagonal canal doesn't really connect to Ocean. + Now: + Coastal Canals can be made CAdjacent to Ocean. + Inland Canals can be made CAdjacent to River OR Coastal Canal. + results: max canal length across an isthmus goes from 2 to 3, and all canals properly and visibly exit into Oceans. + thanks to @Dino for figuring out some logic to do these things. +MINOR +------------------------ +Conscription bonus simplified - applies to infantry only. +Galleon, like Caravel,Galley,etc., can enter Peace Waters but may not attack unless war declared: this ensures a naval vessel + always exists which can bring commerce units to coastal cities; and realistically reflects the historic use of real Galleons. +Spy Plane correctly made to be unreachable to propeller-based aircraft. +Can't make road-types while transported in foreign lands (road/quay/rail/maglev/canal) + move to mp2-brava ++1/9 move bonus for v4+ aircraft was changed to +1, as it too frequently led to death of precious v4 units from tired attack on last move. + move to MP2-brava +Ram Ship can see 1 tile around it and travel on rivers - prevents unintended attacks when travelling diagonally. + move to MP2-brava (except not the travel on river part) +Fallout disappear chance changed from 20% to 15% +Small clarification: to use a train requires < 3 moves, not <= 2 moves. (Doesn't change who can use it, just clarifies rare cases.) +Canals can serve as an irrigation source. +Magnetism tech costs 875, was 950. Halves the extra cost over Gunpowder. Further encourages Frigates before Ironclads. +Environmentalism "hack" to reduce production pollution by 50% was removed. It was a hacked misfit for flaws in other pollution reduction. + Now that other solutions exist for that, this advance reduces pollution from population by 50% instead. + Regarding production pollution, please see notes on how Power Plants, Recycling Center, Solar Plant, Wind Plant, and Fusion Reactor, layer together. + +SERVER UPGRADES: +1. Special Unit Actions / Attacks: + a. can optionally specify a move cost up to 7 moves points. + b. can optionally specify a limit to number of units on tile which can be hit + c. can optionally specify a maximum number of units who can be potentially killed + d. can optionally specify a unit stays fortified when doing the action. +2. Population units can specify pop-cost and add-pop differently. +3. Non-diplomatic units can be made to enter "direct combat with buildings": e.g., Siege Ram vs. City Walls. +5. Bulb cost displays now reflect non-default sciencebox settings +6. Fixed design flaw in server that made pop-cost units take up all a city's build slots. +7. Made units-display in lower-right update correctly more often (not showing dead/spent/disbanded units.) Please report any exceptional cases. +8. Fixed possibilities for some rare backdoors. +9. DIPLOMATIC ACTION REPORTING TRANSPARENCY: all diplomatic actions show the odds and results for all stages to both contestants. +10. Unit vision range now reported in raw tile units rather than square of radius. +11. Fortresses and Naval Bases show a flag of who owns them to prevent confusion, fixed first version incorrectly showed a buoy. +12. Fixed variety of small quirks/inconsistencies in loading/unloading of transports. +13. Added ability for rulesets to include the "Sea Bridge" improvement over water. Must be CAdjacent on lake or ocean (not deep ocean) +16. Hovering over a Special Unit Attack button in the Attack pop-up window, now gives info-text for all its special traits and requirements (from mp2-c onward) +17. Fixed rounding errors in displayed upgrade costs on client side. +18. Fixed upstream server bug that didn't allow capture units to trigger casus belli. +19. Added ability for effects to be triggered by unit activity states (instead of only completed actions.) +20. There was a hidden flaw in 3.0 server, any unit who can do ANYTHING to a tile gets magic bonus to also clean pollution and fallout. + This was affecting foot soldiers (who can make hideouts) so we went with the flow. But now this flaw is fixed, and we're back to the + classical orthodoxy: only non-military tile workers can clean fallout and pollution (worker, engineer, settler, proletarian) +21. A bug in main freeciv server caused climate change to lag, often not completing for several minutes, with a high probability of crashing. This exists in all + versions of freeciv but FCW had to hard-code global warming out because the problem was exponentially worse on larger maps. + This now has following fixes and upgrades: + 1. New settings for STRENGTH of nuclear winter and global warming exist (how much of earth is affected if triggered.) + 2. New percent setting allows adjusting the threshold that triggers climate events, and the tolerance/absorption of the earth to diminish + the accumulation of impact over time. + 3. TC Climate Change processing takes onyl seconds instead of several minutes. + 4. It doesn't crash. + 5. Note: the defaults for these settings were always ON in all games, they were just not triggered because a patch prevented their + execution to prevent crashing. So, be careful of global warming. + 6. New feature: IPCC report gives transparency on risk of climate change if the risk starts to escalate. + 7. Climate Report is now in Gov tab. +22. Landmass can be set from 10 to 99 (was 15 to 85) +UI / Ease of use / Macro-management mechanics. +23. Mass select Airlift: you can select multiple units and give them simultaneous airlift command, which will execute in sequential order if each is legal. + This upgrades one-at-a-time airlifting. +24 Intelligent Load/Unload/Activate Cargo are now upgraded to work holistically with each other. + UNLOAD TRANSPORT 'T': + a. 'T' tells a selected Transport(s) to unload their specific cargo. + b. 'T' tells selected Cargo to unload from their Transports. + LOAD 'L': + a. 'L' Load selected units on Transport(s). + b. 'L' Load ONE selected Transport with all units on the tile which it can legally take as cargo. ("Cargo Scoop") + c. 'L' Transfer selected Cargo units to other Transports IFF such action would be legal if the cargo can legally unload then reload. + d. 'L' command given at Sea, to tell selected Cargo to move to a new Transport, is legal if current Transport has moved no more than 4 + moves and has at least 3 moves left. + + has used half or more of its + moves AND has more than 3 moves left. This may seem complex but it is a "Sweet spot" compromise to allow legitimate "Transport transfer" + while hindering the "Transport shuffle" exploit. + SELECT CARGO on TRANSPORT 'U': + a. 'U' command will only select Cargo units on the SELECTED Transport(s). + b. If no Transport is selected, 'U' commamnd does its old behaviour to select ALL cargo units on the tile. + What no longer happens: + 1. 'T' will never do as previously, it unloaded ALL cargo on same tile, making multiple load/unload operations tedious. + 2. 'U' command will never select all cargo on same tile, only on selected Transports. + 3. 'L' command won't disallow swapping Cargo between Transports in cities because you didn't take the extra step of unloading first. + 4. 'L' command doesn't force you to click-select every unit you want to load. Now you can select the Transport who scoops up all legal units instead. +24a. Can "Transport swap" Land-type cargo units in + 1) where it's legal to unload anyway, to save an extra step (cities, naval bases, quays) + 2) in sea units who have enough moves (see 24.'L.d.) +25. iPillage - this uses the server's new surgical strike pillage feature, where tiles can be destroyed in real-time on par with everything else + (buildingis, units, etc.) iPillage brings Scorched Earth and Blitzkrieg into the game; gives Air Strikes more of a real purpose, increases + the tactical importance of Vigil, as well as the placement of Forts, more Foot soldiers, and AAA, to protect regional infrastructure. + Features can be set for each unit: + success odds, move cost, pin-point single target, or multiple random targets in one strike. + note: the documented iPillage odds go up +5% for each veteran level. +26. Added "gold per shield" info to the City screen (custom user column) and on pop-up window to buy item. +27. Added option to enter Full Screen (full immersion) like every non-browser game, when the game launches. ESC is now dedicated to exiting + Full Immersion (ALT-S or Options>>Full Screen) to re-enter. You are no longer required to hit ESC to exit tabs and pop-up windows, and lose + full screen display. Instead, the command to exit any tab or pop-up window is "W" for (W)ithdraw (W)indow. This now allows the game to default + into an orthodox full screen experience like Freeciv Native Client and EVERY OTHER GAME, instead of being a "second class browser game." + Recommended: become familiar with your OS's hotkeys, which better enable you to navigate while having a fullscreen process: +28. Fortify given to non-fortifiable units will sentry them instead, and if they can't sentry, they will be given "No Orders" (J) and stay put. + This turns the F key into the magic spam key for making unit(s) stay put and select their best option on the tile. It allows giving F + to a large stack and every unit who can fortify will, while sentrying the rest, so you can move on, and maybe spam F again, rapidly. + Reason: quicker/easier micro-management during late game. +28a. Sentry given to non-sentryable units will NO-ORDERS them instead. +29. Triremes on sentry on all legal refueling spots (formerly could not sentry on coastline.) +30. Size 1 cities aren't impervious to infinite nukes while every other city is cut in half each time. Now s1 cities die if nuked. +31. Investigate City now has: + 1. "diplchance" odds (80%) of avoiding diplomatic battle even if enemy spy is present (was 100%) - "Covert Slip Attempt" + 2. Then [possibly] diplomatic battle, + 3. Then "diplchance"+(ruleset odds) chance to succeed. MP2 gives a +5% over base diplchance of 80, or 85% chance to succeed at this phase. +What this means for MP2 rules: + 80% chance to slip past enemy diplomats/spies without diplomatic combat. (100% if unprotected) + If slipped past OR defeated enemy diplomats in combat, 85% chance to succeed at investigating city. + Thus, 85% chance to investigate unprotected city, and about 75% chance to succeed vs. protected city (plus or minus with vet levels of spies.) +32. Spies could only sabotage city production at random but not targeted. This was fixed: targeted sabotage now lists "Production" as one of the + choices along with the improvements. +33. Info-codes. Special info symbols mark the messages you get in the chat window, to make it easier/faster to scan and read important events, + or to scroll back to find again. +34. 3 NEW DEMOGRAPHICS statistics: Units Built, Units Killed, Units Lost. We can also select which rows in demographics report to show, and also + which of 3 columns to turn on (your quantitative score, your rank, who is #1 and their quantitative score [if you have embassy]) +35. Discovery of new government gives instant click-link icon to change government, in the chat window. +36. Recycling Unit is smarter to differentiate single or plural simultaneous; and differentiate a disbanding from a recycling into production. Also new + Orders button for Recycle/Disband has same intelligence to it. +37 CTRL-click: clicks a tile as if a city is not there: good for selecting units without extra UI fussing (going inside a city to pick the unit etc.) +38. Special retaliation ability: units defending from ranged attacks now have the potential to retaliate if they also can range attack... + "ranged defense". This opens up new tactics currently given only to units that benefit from big balance improvement from it + (Archer, Battleship, Helicopter.) Note that ranged defense requires there to be move points left. + one Bship bombards 2, now they have 37 hp and 1 Bship beats both. This prevents such possibilities and indeed, + the 2 battleships properly retaliate leaving the single Bship in worse, not better condition. This dynamic is + carefully used to allow deeper level of tactics for some units and to slightly buff units whose special + role abilities were represented weaker than the realistic and tactical use they should have. +39. fixed rounding errors in calculation of move points on damaged units. +40. adding a pop unit to a city arranges tiles by its CMA (server default or governor) instead of making entertainer. +40a. fixed small bug where ranged attacks did not reduce movement points of damaged units. +41. TC reports on UWT activity delays now only report activities that finish this turn; Not anymore, e.g., transform or mine that finishes on a future turn. +42. possibly fixed spurious message re:UWT +43. Note, unit emoji are not for gimmick fun, but: + a) help you scan a long list of info to parse it or find the right info, + b) the ACTOR unit has the emoji before the name, the TARGET unit has the emoji after the name (after getting the habit, this helps a lot with #1) +44. Middle-click in tech screen for setting future goal, doesn't slip into scroll-pane mode. Alt-right click now works as middle click in tech screen +45. defending units lost in cities, now inform the player what city they were in when they were lost, so they can know better where the attack was + without having to click the text link. +47. chatbox scrolling to end of page after getting a message, was sometimes slow and lazy, just like that person that does most of the job but + quits before it's done. now after a certain time of getting a new message and scrolling it, it is force snapped to the bottom. +48. every event in chat that took place somewhere on the map, is a link to center the map there, AND will select the unit there if there is one, + OR else make a signal marker to identify the exact tile. +49. Poisoning a size 1 city eliminates it. (all rulesets) +50. Kill-stack events sometimes left you ignorant, seeing "Killed the Riflemen and 5 other units!". Now, up to 6 other unit kills are reported in a kill-stack, + individually, before it will start to just say (and x other units!) +51. CITY GOVERNOR, with advanced features not found in native client or upstream server. +52. fixed, sound effect for sold building only happens when server confirms it's really a legal sale. +53. server has new effect rulesets can use, for increasing/decreasing the work rate of units. +54. units fortifying inside a hideout now have aqua fortifying icon to show they're in a hideout, similar to sentry and (already) fortified. +55. new server settings hangry and fulldisorder. + hangry - fixes a logic flaw in TC processing, where people were happier starving with lux, than being fed to avoid starvation and death. + fulldisorder - closes a couple exploits/loopholes where heavy micromanagement of disorder gains a competitive edge. + disorder is very simple now: all production and purchasing power for 1 turn is stopped if disorder is not prevented before TC; + like celebration, when disorder status occurs, the effects of it are felt on the turn when it's reached (i.e., the TC after it happens) + 2. conquered cities count as a kind of disorder as far as being able to produce anything after conquest, and/or also toward + the rule of 2 turns of disorder causing anarchy to democracy. +56. fixed a bug that was not giving score for small wonders +57. full 2-way casus belli status displayed in nations tab. +58. Diplomacy Pacts Upgrades: + a. You may forget or excuse a casus belli, possibly from some verbal agreement over an action or maneuver which generates a casus belli, + simply by doing another Cease-Fire, or Peace. This clears the casus belli or "forgives past casus belli". + b. When a Cease-Fire has 3 or less turns left, you may create a new one, instead of being forced to wait for it to expire into war. + c. Doing a Cease-Fire or Peace agreement when you already have one but there is casus belli, will not reset the length of the agreement, + but only pardon the casus belli. + d. Doing a Cease-Fire or after casus belli is reset, sets a new one with a new length of time, as set by GM in game.server.ceasefirelength. + e. (b,c,d) give players the ability to choose separate combinations of excusing casus belli and re-affirming + cease-fire for a new time period. + f. De-jankification of all kinds of rare edge cases is tedious to explain but there are 2 charts for full disclosure at + diplhand.c line 545 and line 603. In general it's made to be softer more fluid and do what's logical in edge cases, rather than fall + and get stuck in one of the "stupid logic holes of freeciv diplomacy". + Short answer: if you ask for the same type of pact as you had before, it will excuse casus belli if you have it, otherwise, if the pact + expires very soon, it assumes you want to offer to renew it before expiration. +59. Server settings armisticelength and ceasefirelength are now under the control of the GM. +60. Two-way state of casus belli is shown in nations list in nations tab now. Mouse hover shows turns left. +61. chat marks speaker with their flag. sent messages are right aligned, allied chat and global chat are center, incoming are left aligned. +62. added game.server.casusbelli turns for better control over casus belli. Formerly it was 2 turns (turn of incident and one after.) + Now it is configurable by GM, and multiple violations/aggrievances can push it beyond the default time length (12 for mp2c, 2 for all others.) +63. New Prefs option: Focus Lock, keeps the current selected unit centered on map (ALT-SHIFT-F). It's more of a preference on a PC, but might + make a big improvement for mobile. On mobile it defaults to on. +64. Prefs options for "Show pollution on map" and "Movement Point Display" can now be permanently set instead of temporarily. +65. There was no way for EFT_GROWTH_FOOD to be applied at city founding and this is now fixed. Rulesets wanting old behaviour of no extra food + in this situation, need to put a MinSize, "1", City condition into them. +66. Stack Escape changed to be unit is of equal or greater moves than attacker. (was greater) +67. New server effect "Stack_Escape_Pct" allows regulating odds of stack escape in certain situations, instead of hard-coded universal 50%, always. +68. New server feature to allow negative upkeep buildings. Allows improvements which gather infrastructural support to other buildings, + e.g., wind mills, khan's tribute collection office, etc. +69. Improvement super panel in city list now filters out obsolete buildings and buildings who tech req is 2 or more tiers away. This makes the + list much more compact and easy to use. +70. minor_nukes and major_nukes are not shown in tech tree unless the server setting allows them for that game. if you see it, you can build it! + + + + + +These help with much more than Freeciv and other Full-screen apps. They help you with everything you do on your computer: + Switch active Program Flip to Last Program Switch Browser tab See all Programs on Workspace Swap Workspaces +Linux* Alt-Tab Alt-ESC CTRL-Shift-Tab 🐧, ALT-F1 CTRL-ALT-arrow +Windows Alt-Tab Alt-ESC CTRL-Shift-Tab Three fingers up, ⊞-tab ⊞-CTRL-arrow, four finger side swipe +Mac ⌘-Tab ⌘-Shift-Tab CTRL-Tab Three fingers up, F3 4 finger side-swipe + + + + Every other type of transported-scenario, swapping is not allowed. \ No newline at end of file diff --git a/freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/cities.ruleset b/freeciv/freeciv/data/mp2c-desert/cities.ruleset similarity index 99% rename from freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/cities.ruleset rename to freeciv/freeciv/data/mp2c-desert/cities.ruleset index 9ca8f04d4..bc26a1198 100644 --- a/freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/cities.ruleset +++ b/freeciv/freeciv/data/mp2c-desert/cities.ruleset @@ -157,7 +157,7 @@ nationality = TRUE ; account for the nationality of the citizens convert_speed = 1000 ; per mille, base probability of 1 citizen nationalizing. x/1000 partisans_pct = 0 ; percentage of own nationality to inspire partisans ; if 0, original city owner information is used instead -conquest_convert_pct = 34 ; percentage which converts to the new nation +conquest_convert_pct = 33 ; percentage which converts to the new nation ; after a city was conquered. Applied separately for each ; nationality present in the city, and number of ; converted people rounded up diff --git a/freeciv/freeciv/data/mp2-brava2/default.lua b/freeciv/freeciv/data/mp2c-desert/default.lua similarity index 74% rename from freeciv/freeciv/data/mp2-brava2/default.lua rename to freeciv/freeciv/data/mp2c-desert/default.lua index 04079b1d4..ad45837c6 100644 --- a/freeciv/freeciv/data/mp2-brava2/default.lua +++ b/freeciv/freeciv/data/mp2c-desert/default.lua @@ -4,14 +4,35 @@ -- ruleset is easier as you do not need to keep your own copy of -- default.lua updated when ever it changes in Freeciv distribution. +-- only show partisan banner events the first few times it happens +partisan_spawns = 0 + -- Get gold from entering a hut. function _deflua_hut_get_gold(unit, gold) local owner = unit.owner - notify.event(owner, unit.tile, E.HUT_GOLD, PL_("You found %d gold.", - "You found %d gold.", gold), - gold) - owner:change_gold(gold) + if gold == 1 then + notify.event(owner, unit.tile, E.HUT_GOLD, PL_("[`gold`] You found beads worth %d gold.", + "[`gold`] You found beads worth %d gold.", gold), + gold) + owner:change_gold(gold) + elseif gold == 2 then + notify.event(owner, unit.tile, E.HUT_GOLD, PL_("[`gold`] You found medicinal herbs worth %d gold.", + "[`gold`] You found medicinal herbs worth %d gold.", gold), + gold) + owner:change_gold(gold) + elseif gold == 5 then + notify.event(owner, unit.tile, E.HUT_GOLD, PL_("[`gold`] You found stone tools worth %d gold.", + "[`gold`] You found stone tools worth %d gold.", gold), + gold) + owner:change_gold(gold) + elseif gold == 10 then + notify.event(owner, unit.tile, E.HUT_GOLD, PL_("[`gold`] You found furs worth %d gold.", + "[`gold`] You found furs worth %d gold.", gold), + gold) + owner:change_gold(gold) + end + end -- Default if intended hut behavior wasn`t possible. @@ -26,16 +47,16 @@ function _deflua_hut_get_tech(unit) if tech then notify.event(owner, unit.tile, E.HUT_TECH, - _("You found %s in ancient scrolls of wisdom."), + _("[`bulb`] You found %s in ancient scrolls of wisdom."), tech:name_translation()) notify.research(owner, false, E.TECH_GAIN, -- /* TRANS: One player got tech for the whole team. */ - _("The %s found %s in ancient scrolls of wisdom for you."), + _("[`bulb`] The %s found %s in ancient scrolls of wisdom for you."), owner.nation:plural_translation(), tech:name_translation()) notify.research_embassies(owner, E.TECH_EMBASSY, -- /* TRANS: first %s is leader or team name */ - _("The %s have acquired %s from ancient scrolls of wisdom."), + _("[`bulb`] The %s have acquired %s from ancient scrolls of wisdom."), owner:research_name_translation(), tech:name_translation()) return true @@ -107,16 +128,15 @@ function _deflua_hut_get_barbarians(unit) local alive = tile:unleash_barbarians() if alive then notify.event(owner, tile, E.HUT_BARB, - _("⚠️ You have unleashed a horde of barbarians!")); + _("[`warning`] You have unleashed a horde of barbarians!")); else notify.event(owner, tile, E.HUT_BARB_KILLED, - _("⚠️ Your %s has been killed by barbarians!"), + _("[`warning`] Your %s has been killed by barbarians!"), utype:name_translation()); end return alive end - -- Randomly choose a hut event function _deflua_hut_enter_callback(unit) local chance = random(0, 6) @@ -168,7 +188,7 @@ signal.connect("hut_frighten", "_deflua_hut_frighten_callback") with the Partisan role. In the default ruleset, the requirements for inspiring partisans are: - a) Guerilla warfare must be known by atleast 1 player + a) Guerilla warfare must be known by at least 1 player b) The player must know about Communism and Gunpowder c) The player must run either a democracy or a communist society. ]]-- @@ -183,10 +203,13 @@ function _deflua_make_partisans_callback(city, loser, winner, reason) partisans = 8 end city.tile:place_partisans(loser, partisans, city:map_sq_radius()) - notify.event(loser, city.tile, E.CITY_LOST, - _("The loss of %s has inspired partisans!"), city.name) - notify.event(winner, city.tile, E.UNIT_WIN_ATT, - _("The loss of %s has inspired partisans!"), city.name) + partisan_spawns = partisan_spawns + 1 + if partisan_spawns < 5 then + notify.event(loser, city.tile, E.CITY_LOST, + _("[`events/partisans`]
[`partisan`] The loss of %s inspires %d Partisans!"), city.name, partisans) + notify.event(winner, city.tile, E.UNIT_WIN_ATT, + _("[`events/partisans`]
[`partisan`] The loss of %s inspires %d Partisans!"), city.name, partisans) + end end signal.connect("city_transferred", "_deflua_make_partisans_callback") diff --git a/freeciv/freeciv/data/mp2c-desert/effects.ruleset b/freeciv/freeciv/data/mp2c-desert/effects.ruleset new file mode 100644 index 000000000..7da59b039 --- /dev/null +++ b/freeciv/freeciv/data/mp2c-desert/effects.ruleset @@ -0,0 +1,7745 @@ +; Modifying this file: +; You should not modify this file except to make bugfixes or +; for other "maintenance". If you want to make custom changes, +; you should create a new datadir subdirectory and copy this file +; into that directory, and then modify that copy. Then use the +; command "rulesetdir " in the server to have freeciv +; use your new customized file. + +; Note that the freeciv AI may not cope well with anything more +; than minor changes. + +[datafile] +description="Effects data for Freeciv" +options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" +format_version=20 + +; /* <-- avoid gettext warnings +; +; Effects +; +; type = What the effect does. Values of multiple active effects +; of the same type get summed for the total. +; See README.effects for list of possible types +; value = Value added for the effect type when this effect is active, +; i.e., all requirements are fulfilled +; multiplier = Name of the policy that gives a multiplier for effect's value +; reqs = Requirements for the effect to be active. +; See README.effects for help on requirements +; +; */ <-- avoid gettext warnings + +; Med. Bomber is a "Soft Field Unit." If non-aggressively deployed, 0 unhappy in Republic, +; 1 unhappy in Democracy: +[effect_medium_bomber_field_unit_minus_one] +type = "Peaceful_Field_Unit_Bonus" +value = 1 +reqs = + { "type", "name", "range", "present" + "UnitType", "Medium Bomber", "Local", TRUE + } + +; EXAMPLE OF HOW TO USE NEW Unit_Unhappy_Cost EFFECT, almost same +; as the above effect (don't use both!) +;[effect_medium_bomber_field_unit_minus_one] +;type = "Unit_Unhappy_Cost" +;value = -1 +;reqs = +; { "type", "name", "range", "present" +; "UnitType", "Medium Bomber", "Local", TRUE +; "UnitState","OnDomesticTile","Local", TRUE +; } +; Combat_rounds Tribesmen +[effect_combat_rounds_tribesmen] +type = "Combat_Rounds" +value = 10 +reqs = + { "type", "name", "range", "present" + "UnitType", "Tribesmen", "Local", TRUE + } +; Combat_rounds for ancient ships +[effect_combat_rounds_riverships] +type = "Combat_Rounds" +value = 15 +reqs = + { "type", "name", "range", "present" + "UnitClass", "RiverShip", "Local", TRUE + "UnitType", "Frigate", "Local", FALSE + "UnitType", "Ram Ship", "Local", FALSE + } +[effect_combat_rounds_trireme] +type = "Combat_Rounds" +value = 15 +reqs = + { "type", "name", "range", "present" + "UnitType", "Trireme", "Local", TRUE + } +[effect_combat_rounds_zeppelin] +type = "Combat_Rounds" +value = 20 +reqs = + { "type", "name", "range", "present" + "UnitType", "Zeppelin", "Local", TRUE + } + +; Cheating AI effects are in separate file +*include "default/ai_effects.ruleset" + +[effect_unhappysize] +type = "City_Unhappy_Size" +value = 4 + +; Percent foreign citizens who are unhappy if at war with +; their original nation. See also effect below this one. +[effect_angry_conquered_1] +type = "Enemy_Citizen_Unhappy_Pct" +value = 45 + +; The above is rounded down, so use y=mx+b to get a better algorithm: +; Unhappy = (0.45 * of Foreign citizens) + 1 +; Note this actually makes the Make_Content effects of buildigs one less +; and should eventually be replaced by "Enemy_Citizen_Unhappy_Add", val=1 +[effect_angry_conquered_2] +type = "Make_Content" +value = -1 +reqs = + { "type", "name", "range", "present" + "MinForeignPct", "1", "City", TRUE + } + +; Barbarian effects +[effect_barb1] +type = "No_Diplomacy" +value = 1 +reqs = + { "type", "name", "range" + "NationGroup", "Barbarian", "Player" + } + +; Barbarian disappearance +[effect_barb_disappear] +type = "Retire_Pct" +value = 10 +reqs = + { "type", "name", "range", "present" + "NationGroup", "Barbarian", "Player", TRUE + "Age", "5", "Local", TRUE + "CityTile", "Center", "Local", FALSE + } + +; Lone Leader might escape on coast (33% chance) +; Complement of the two effects should be 0.9 * 0.66 = 0.594 +; (100 - 59) - 10 = 31 +[effect_leader_escape] +type = "Retire_Pct" +value = 31 +reqs = + { "type", "name", "range" + "UnitType", "Barbarian Leader", "Local" + "Age", "5", "Local" + "TerrainClass", "Oceanic", "Adjacent" + "MaxUnitsOnTile", "1", "Local" + } + +; Specialist output bonuses +[effect_elvis] +type = "Specialist_Output" +value = 2 +reqs = + { "type", "name", "range", "present" + "Specialist", "elvis", "Local", TRUE + "OutputType", "Luxury", "Local", TRUE + "Building", "Roman Colosseum", "Player", FALSE + } +[effect_elvis_roman_colosseum] +type = "Specialist_Output" +value = 3 +reqs = + { "type", "name", "range" + "Specialist", "elvis", "Local" + "OutputType", "luxury", "Local" + "Building", "Roman Colosseum", "Player" + } + +[effect_scientist] +type = "Specialist_Output" +value = 3 +reqs = + { "type", "name", "range" + "Specialist", "scientist", "Local" + "OutputType", "Science", "Local" + } + +[effect_taxman] +type = "Specialist_Output" +value = 3 +reqs = + { "type", "name", "range" + "Specialist", "taxman", "Local" + "OutputType", "Gold", "Local" + } + +[effect_merchant] +type = "Specialist_Output" +value = 2 +reqs = + { "type", "name", "range" + "Specialist", "merchant", "Local" + "OutputType", "Trade", "Local" + "Building", "A.Smith's Trading Co.", "Player" + } +[effect_merchant2] +type = "Specialist_Output" +value = 1 +reqs = + { "type", "name", "range" + "Specialist", "merchant", "Local" + "OutputType", "Gold", "Local" + "Building", "A.Smith's Trading Co.", "Player" + } +[effect_laborer] +type = "Specialist_Output" +value = 1 +reqs = + { "type", "name", "range" + "Specialist", "worker", "Local" + "OutputType", "Shield", "Local" + "Building", "A.Smith's Trading Co.", "Player" + } +[effect_farmer] +type = "Specialist_Output" +value = 1 +reqs = + { "type", "name", "range" + "Specialist", "farmer", "Local" + "OutputType", "Food", "Local" + "Building", "A.Smith's Trading Co.", "Player" + } + +; ***************** Resources generated by both cause="Resource" AND cause="Appear" +; ***************** need their output values set in EFFECTS. +[effect_berries] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Extra", "Berries", "Local" + "OutputType", "Food", "Local" + "Terrain", "Forest", "Local" + } +[effect_berries2] +type = "Output_Add_Tile" +value = 2 +reqs = + { "type", "name", "range" + "Extra", "Berries", "Local" + "OutputType", "Trade", "Local" + "Terrain", "Forest", "Local" + } +[effect_spice] +type = "Output_Add_Tile" +value = 2 +reqs = + { "type", "name", "range" + "Extra", "Spice", "Local" + "OutputType", "Food", "Local" + "Terrain", "Swamp", "Local" + } +[effect_spice2] +type = "Output_Add_Tile" +value = 4 +reqs = + { "type", "name", "range" + "Extra", "Spice", "Local" + "OutputType", "Trade", "Local" + "Terrain", "Swamp", "Local" + } +[effect_spice3] +type = "Output_Add_Tile" +value = 2 +reqs = + { "type", "name", "range" + "Extra", "Spice", "Local" + "OutputType", "Food", "Local" + "Terrain", "Desert", "Local" + } +[effect_spice4] +type = "Output_Add_Tile" +value = 4 +reqs = + { "type", "name", "range" + "Extra", "Spice", "Local" + "OutputType", "Trade", "Local" + "Terrain", "Desert", "Local" + } +[effect_ivory] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Extra", "Ivory", "Local" + "OutputType", "Food", "Local" + "Terrain", "Glacier", "Local" + } +[effect_ivory2] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Extra", "Ivory", "Local" + "OutputType", "Shield", "Local" + "Terrain", "Glacier", "Local" + } +[effect_ivory3] +type = "Output_Add_Tile" +value = 4 +reqs = + { "type", "name", "range" + "Extra", "Ivory", "Local" + "OutputType", "Trade", "Local" + "Terrain", "Glacier", "Local" + } +[effect_peat] +type = "Output_Add_Tile" +value = 4 +reqs = + { "type", "name", "range" + "Extra", "Peat", "Local" + "OutputType", "Shield", "Local" + "Terrain", "Swamp", "Local" + } +[effect_peat_rails] +type = "Output_Add_Tile" +value = 2 +reqs = + { "type", "name", "range" + "Extra", "Peat", "Local" + "OutputType", "Shield", "Local" + "Terrain", "Swamp", "Local" + "Extra", "Railroad","Local" + } +[effect_oasis] +type = "Output_Add_Tile" +value = 3 +reqs = + { "type", "name", "range" + "Extra", "Oasis", "Local" + "OutputType", "Food", "Local" + "Terrain", "Desert", "Local" + } +[effect_rubber1] +type = "Output_Add_Tile" +value = 2 +reqs = + { "type", "name", "range" + "Extra", "Rubber", "Local" + "OutputType", "Trade", "Local" + "Terrain", "Jungle", "Local" + } +[effect_rubber2] +type = "Output_Add_Tile" +value = 2 +reqs = + { "type", "name", "range" + "Extra", "Rubber", "Local" + "OutputType", "Shield", "Local" + "Terrain", "Jungle", "Local" + } +[effect_rubber_rails] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Extra", "Rubber", "Local" + "OutputType", "Shield", "Local" + "Terrain", "Jungle", "Local" + "Extra", "Railroad", "Local" + } +[effect_gems] +type = "Output_Add_Tile" +value = 5 +reqs = + { "type", "name", "range" + "Extra", "Gems", "Local" + "OutputType", "Trade", "Local" + "Terrain", "Jungle", "Local" + } +[effect_furs] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Extra", "Furs", "Local" + "OutputType", "Food", "Local" + "Terrain", "Tundra", "Local" + } +[effect_furs2] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Extra", "Furs", "Local" + "OutputType", "Shield", "Local" + "Terrain", "Tundra", "Local" + } +[effect_furs3] +type = "Output_Add_Tile" +value = 3 +reqs = + { "type", "name", "range" + "Extra", "Furs", "Local" + "OutputType", "Trade", "Local" + "Terrain", "Tundra", "Local" + } +[effect_furs4] +type = "Output_Add_Tile" +value = 2 +reqs = + { "type", "name", "range" + "Extra", "Furs", "Local" + "OutputType", "Food", "Local" + "Terrain", "Glacier", "Local" + } +[effect_furs5] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Extra", "Furs", "Local" + "OutputType", "Shield", "Local" + "Terrain", "Glacier", "Local" + } +[effect_furs6] +type = "Output_Add_Tile" +value = 3 +reqs = + { "type", "name", "range" + "Extra", "Furs", "Local" + "OutputType", "Trade", "Local" + "Terrain", "Glacier", "Local" + } +[effect_elk] +type = "Output_Add_Tile" +value = 2 +reqs = + { "type", "name", "range" + "Extra", "Elk", "Local" + "OutputType", "Food", "Local" + "Terrain", "Tundra", "Local" + } +[effect_elk2] +type = "Output_Add_Tile" +value = 2 +reqs = + { "type", "name", "range" + "Extra", "Elk", "Local" + "OutputType", "Shield", "Local" + "Terrain", "Tundra", "Local" + } +[effect_elk_rails] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Extra", "Elk", "Local" + "OutputType", "Shield", "Local" + "Terrain", "Tundra", "Local" + "Extra", "Railroad", "Local" + } +[effect_iron] +type = "Output_Add_Tile" +value = 3 +reqs = + { "type", "name", "range" + "Extra", "Iron", "Local" + "OutputType", "Shield", "Local" + "Terrain", "Mountains", "Local" + } +[effect_iron_rails_no_mine] +type = "Output_Add_Tile" +value = 2 +reqs = + { "type", "name", "range" + "Extra", "Iron", "Local" + "OutputType", "Shield", "Local" + "Terrain", "Mountains", "Local" + "Extra", "Railroad", "Local" + } +[effect_iron_rails_mine] +type = "Output_Add_Tile" +value = -1 ;was overproducing by 1 +reqs = + { "type", "name", "range" + "Extra", "Iron", "Local" + "OutputType", "Shield", "Local" + "Terrain", "Mountains", "Local" + "Extra", "Railroad", "Local" + "Extra", "Mine", "Local" + } +; *** WANDERING RESOURCES ** +[effect_deer] +type = "Output_Add_Tile" +value = 3 +reqs = + { "type", "name", "range" + "Extra", "Deer", "Local" + "OutputType", "Food", "Local" + } +[effect_wild_boar] +type = "Output_Add_Tile" +value = 3 +reqs = + { "type", "name", "range" + "Extra", "Wild Boar", "Local" + "OutputType", "Food", "Local" + } +; *** "BLOOD FOR OIL" ** +[effect_blood_for_oil] +type = "Output_Add_Tile" ; Refining gives +1 shield to Oil Wells IFF on Oil. +value = 1 +reqs = + { "type", "name", "range", "present" + "Tech", "Refining", "Player", TRUE + "Extra", "Oil Well", "Local", TRUE + "Extra", "Oil", "Local", TRUE + "OutputType", "Shield", "Local", TRUE + } +; ***************************************************** + +; Vision benefit from mountains (for every land unit) +[effect_mountains_vision] +type = "Unit_Vision_Radius_Sq" +value = 5 +reqs = + { "type", "name", "range" + "Terrain", "Mountains", "Local" + "UnitClass", "Land", "Local" + } +[effect_mountains_vision_1] +type = "Unit_Vision_Radius_Sq" +value = 5 +reqs = + { "type", "name", "range" + "Terrain", "Mountains", "Local" + "UnitClass", "LandAirSea", "Local" + } +[effect_mountains_vision_2] +type = "Unit_Vision_Radius_Sq" +value = 5 +reqs = + { "type", "name", "range" + "Terrain", "Mountains", "Local" + "UnitClass", "LandNoKill", "Local" + } + +; basic free tech upkeep +[effect_upkeep_tech_free] +type = "Tech_Upkeep_Free" +value = 3 +; ******************************** TRADE ROUTES ********************************* +[effect_trade_routes] +type = "Max_Trade_Routes" +value = 1 + +;pow(2, value/1000) = Base % +; ------------ ESTABLISH TRADE ROUTE, ONE TIME BONUS ----------------- +;pow(2, value/1000) USE STANDARD BONUS. +;[effect_base_trade_revenue_reduce] +;type = "Trade_Revenue_Bonus" +;value = 0 + +;-40% +[effect_railroad_trade_revenue_reduce] +type = "Trade_Revenue_Bonus" +value = -585 +reqs = + { "type", "name", "range" + "Tech", "Railroad", "Player" + } +;-40% +[effect_flight_trade_revenue_reduce] +type = "Trade_Revenue_Bonus" +value = -585 +reqs = + { "type", "name", "range" + "Tech", "Flight", "Player" + } +;Adjust as a one time bonus with slightly higher ROI than coinage. +;-33% +[effect_enter_marketplace_bonus_increase] +type = "Trade_Revenue_Bonus" +value = -585 +reqs = + { "type", "name", "range" + "Action", "Enter Marketplace", "Local" + } +[effect_early_trade_capitals_bonus] +type = "Trade_Revenue_Bonus" +value = 2000 +reqs = + { "type", "name", "range", "present" + "Building", "Palace", "City", TRUE + "Building", "Palace", "Traderoute", TRUE + "Tech", "Banking", "World", FALSE + } +;------------------------------------------------------------------------ + +; Minimum trade from a traderoute is 1; change down-round to up-round by +; adding 1 to city center. +[effect_traderoute_minimum2] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + ; This was the ONLY req we could find for detecting a TradeRoute, + ; everything else was false + or - + "CityStatus", "OwnedByOriginal", "TradeRoute" + "CityTile", "Center", "Local" + "OutputType", "Trade", "Local" + } +; ******************************************************************************* + + +; ***************************** SEA UNIT REPAIR ******************************* +; Sea units have crews which pro-actively repair damage regardless of movement. +; This is almost comparable to land unit healing. Sea units being "Use once +; and dispose", and/or unable to re-enter action for literally centuries, had +; created issues in realism, playability, and balance. 8% repair/turn effect: +; 10hp units: +0 hp/turn 20hp units: +1 hp/turn +; 30hp units: +2 hp/turn 40hp units: +3 hp/turn +;[effect_sea_hp_regen] +;type = "Unit_Recover_Pct" +;value = 8 +;reqs = +; { "type", "name", "range" +; "UnitClass", "Sea", "Local" +; } +;[effect_sub_hp_regen] +;type = "Unit_Recover_Pct" +;value = 8 +;reqs = +; { "type", "name", "range" +; "UnitClass", "Submarine", "Local" +; } +;[effect_rivership_hp_regen] +;type = "Unit_Recover_Pct" +;value = 8 +;reqs = +; { "type", "name", "range" +; "UnitClass", "RiverShip", "Local" +; } +; The effects above replace the effects below after Unit_Recover_Pct is up +; The effects below substitute if Unit_Recover_Pct is missing from server +[effect_sea_hp_regen] +type = "Unit_Recover" ;30 hp units get + 2 +value = 2 +reqs = + { "type", "name", "range" + "UnitClass", "Sea", "Local" + } +[effect_sub_hp_regen] ;30 hp units get + 2 +type = "Unit_Recover" +value = 2 +reqs = + { "type", "name", "range" + "UnitClass", "Submarine", "Local" + } +[effect_rivership_hp_regen] ;20 hp units get + 1 +type = "Unit_Recover" +value = 1 +reqs = + { "type", "name", "range", "present" + "UnitClass", "RiverShip", "Local", TRUE + "UnitType", "Boat", "Local", FALSE ;have to exclude all 10hp ships + "UnitType", "Galley", "Local", FALSE + "UnitType", "War Galley", "Local", FALSE + "UnitType", "Longboat", "Local", FALSE + "UnitType", "Caravel", "Local", FALSE + "UnitType", "Ram Ship", "Local", FALSE + } +[effect_battleship_hp_regen] ;40 hp units get + 3 +type = "Unit_Recover" +value = 1 ; 2+1=3 +reqs = + { "type", "name", "range" + "UnitType", "Battleship", "Local" + } +[effect_carrier_hp_regen] ;40 hp units get + 3 +type = "Unit_Recover" +value = 1 ; 2+1=3 +reqs = + { "type", "name", "range" + "UnitType", "Carrier", "Local" + } +; **************************** STACK ESCAPE ODDS *************************** +[effect_base_stack_escape_odds] ; all stack escape units have 60% base odds. +type = "Stack_Escape_Pct" +value = 10 ; 50% → = 60% + +[effect_satellite_stack_escape_odds] +type = "Stack_Escape_Pct" +value = 40 ; 60% → 100% +reqs = + { "type", "name", "range" + "UnitType", "Satellite", "Local" + } +[effect_submarine_stack_escape_odds] +type = "Stack_Escape_Pct" +value = 15 ; 60% → 75% +reqs = + { "type", "name", "range" + "UnitType", "Submarine", "Local" + } +[effect_destroyer_stack_escape_odds] +type = "Stack_Escape_Pct" +value = 7 ; 60% → 67% +reqs = + { "type", "name", "range" + "UnitType", "Destroyer", "Local" + } +[effect_missile_destroyer_stack_escape_odds] +type = "Stack_Escape_Pct" +value = 7 ; 60% → 67% +reqs = + { "type", "name", "range" + "UnitType", "Missile Destroyer", "Local" + } +[effect_stealth_fighter_stack_escape_odds] +type = "Stack_Escape_Pct" +value = 7 ; 60% → 67% +reqs = + { "type", "name", "range" + "UnitType", "Stealth Fighter", "Local" + } +[effect_stealth_bomber_stack_escape_odds] +type = "Stack_Escape_Pct" +value = 7 ; 60% → 67% +reqs = + { "type", "name", "range" + "UnitType", "Stealth Bomber", "Local" + } +[effect_spy_plane_stack_escape_odds] +type = "Stack_Escape_Pct" +value = 7 ; 60% → 67% +reqs = + { "type", "name", "range" + "UnitType", "Spy Plane", "Local" + } + +; ******** ruleset bonus ********** FORTIFY and RIVER ********************* +[effect_fortified] +type = "Fortify_Defense_Bonus" +value = 50 +reqs = + { "type", "name", "range" + "Activity", "Fortified", "Local" + } + +[effect_city_fortified] +type = "Fortify_Defense_Bonus" +value = 50 +reqs = + { "type", "name", "range", "present" + "CityTile", "Center", "Local", TRUE + "Activity", "Fortified", "Local", FALSE + "UnitClassFlag", "CanFortify", "Local", TRUE + "UnitFlag", "Cant_Fortify", "Local", FALSE + } + +[effect_terrain_bonus_river] +type = "Terrain_Defend_Add_Bonus" +value = 50 + reqs = + { "type", "name", "range" + "Extra", "River", "Local" + "UnitClassFlag", "TerrainDefense", "Local" + } + +; ****************************** RECYCLE SHIELDS ************************** +[effect_unit_shield_value_recycle] +type = "Unit_Shield_Value_Pct" +value = -50 +reqs = + { "type", "name", "range", "present" + "Action", "Recycle Unit", "Local", TRUE + "UnitClass", "Cargo", "Local", FALSE + "UnitType", "Tribesmen", "Local", FALSE + ; Everything except Cargo class has classic 50% recycle penalty: + } +[effect_unit_shield_value_recycle_cargo_unit] +;The Goods unit_Type has 25% recycle penalty. Freight +;is caught by no effects so remains 100% +type = "Unit_Shield_Value_Pct" +value = -24 +reqs = + { "type", "name", "range", "present" + "Action", "Recycle Unit", "Local", TRUE + "UnitType", "Goods", "Local", TRUE + } +;Tribesmen recycle bonus into anything but units: +[effect_tribesmen_recycle] +type = "Unit_Shield_Value_Pct" +value = 100 ; 20 shields recycle for Tribesmen. +reqs = + { "type", "name", "range", "present" + "Action", "Recycle Unit", "Local", TRUE + "UnitType", "Tribesmen", "Local", TRUE + "MinYear", "-2000", "World", FALSE + } + +;TO DO: this could be used in interesting ways: e.g., foot units, bombers, etc. +[effect_unit_shield_value_in_upgrade_price_calc] +type = "Unit_Shield_Value_Pct" +value = -50 +reqs = + { "type", "name", "range", "present" + "Action", "Upgrade Unit", "Local", TRUE + } + +; *********************************** BASES ******************************* + +; **** FORT ***** +[effect_fort_defense] +type = "Defend_Bonus" +value = 33 +reqs = + { "type", "name", "range", "present" + "Extra", "Fort", "Local", TRUE + "Extra", "Fortress", "Local", FALSE ; Fortress calculated separately even if a fort is under it. + "Extra", "Naval Base", "Local", FALSE ; Naval base calculated separately even if a fort is under it. + "UnitClass", "Helicopter", "Local", FALSE ; ... these attackers do not activate Fort defense bonus + "UnitClass", "Air", "Local", FALSE ; ... " " " " " " " " + "UnitClass", "Air_High_Altitude","Local", FALSE ; ... " " " " " " " " + "UnitClass", "AirProtect", "Local", FALSE ; ... " " " " " " " " + "UnitType", "Armor", "Local", FALSE ; ... " " " " " " " " + "UnitType", "Armor II", "Local", FALSE ; ... " " " " " " " " + } +; Fort HP regen +[effect_fort_hp_regen] +type = "HP_Regen" +value = 10 +reqs = + { "type", "name", "range" + "Extra", "Fort", "Tile" + "UnitClass", "Land", "Local" + } +[effect_fort_hp_regen_1] +type = "HP_Regen" +value = 10 +reqs = + { "type", "name", "range" + "Extra", "Fort", "Tile" + "UnitClass", "LandAirSea", "Local" + } +[effect_fort_hp_regen_2] +type = "HP_Regen" +value = 10 +reqs = + { "type", "name", "range" + "Extra", "Fort", "Tile" + "UnitClass", "LandNoKill", "Local" + } + +; **** FORTRESS/NAVAL BASE *************************************************** + +; Adjust the 1.67xdefense_bonus in terrain.ruleset for some attackers: +; **************************************************************************** +[effect_nonfortbuster_vs_fortress] +type = "Defend_Bonus" +value = 20 ;increase 1.67x to 2x except when defending against FortBuster types. +;note: 1.20*1.67=2.0 (this bonus is multiplied after terrain defense_bonus was multiplied) +reqs = + { "type", "name", "range", "present" + "Extra", "Fortress", "Local", TRUE + "UnitFlag", "FortBuster", "Local", FALSE + "UnitFlag", "FortressBuster", "Local", FALSE + "UnitFlag", "AirAttacker", "Local", FALSE + } +[effect_nonfortbuster_vs_navalbase] ;same as above but for naval base +type = "Defend_Bonus" +value = 20 ;increase 1.67x to 2x except when defending against FortBuster types. +;note: 1.20*1.67=2.0 (this bonus is multiplied after terrain defense_bonus was multiplied) +reqs = + { "type", "name", "range", "present" + "Extra", "Naval Base", "Local", TRUE + "UnitFlag", "FortBuster", "Local", FALSE + "UnitFlag", "FortressBuster", "Local", FALSE + "UnitFlag", "AirAttacker", "Local", FALSE + } +[effect_fortressbuster_fortress] +type = "Attack_Bonus" +value = 67 ;Cancel defender's 1.67x with attacker getting 1.67x +reqs = + { "type", "name", "range", "present" + "Extra", "Fortress", "Local", TRUE + "UnitFlag", "FortressBuster", "Local", TRUE + } +[effect_fortressbuster_navalbase] +type = "Attack_Bonus" +value = 67 ;Cancel defender's 1.67x with attacker getting 1.67x +reqs = + { "type", "name", "range", "present" + "Extra", "Naval Base", "Local", TRUE + "UnitFlag", "FortressBuster", "Local", TRUE + } +; ****** ^^ defense_bonus_correctives ^^ ************************************* + +; Vision benefit from fortress watchtowers +[effect_fortress_vision] +type = "Unit_Vision_Radius_Sq" +value = 8 +reqs = + { "type", "name", "range" + "Extra", "Fortress", "tile" + "Tech", "Invention", "Player" + "UnitClass", "Land", "Local" + } +[effect_fortress_vision_1] ;Marines, AAA +type = "Unit_Vision_Radius_Sq" +value = 8 +reqs = + { "type", "name", "range" + "Extra", "Fortress", "tile" + "Tech", "Invention", "Player" + "UnitClass", "LandAirSea", "Local" + } +[effect_fortress_vision_2] ;Knights +type = "Unit_Vision_Radius_Sq" +value = 8 +reqs = + { "type", "name", "range" + "Extra", "Fortress", "tile" + "Tech", "Invention", "Player" + "UnitClass", "LandNoKill", "Local" + } +[effect_castle_vision] +type = "Unit_Vision_Radius_Sq" +value = 8 +reqs = + { "type", "name", "range" + "Extra", "Castle", "tile" + "Tech", "Invention", "Player" + "UnitClass", "Land", "Local" + } +[effect_castle_vision_1] ;Marines, AAA +type = "Unit_Vision_Radius_Sq" +value = 8 +reqs = + { "type", "name", "range" + "Extra", "Castle", "tile" + "Tech", "Invention", "Player" + "UnitClass", "LandAirSea", "Local" + } +[effect_castle_vision_2] ;Knights +type = "Unit_Vision_Radius_Sq" +value = 8 +reqs = + { "type", "name", "range" + "Extra", "Castle", "tile" + "Tech", "Invention", "Player" + "UnitClass", "LandNoKill", "Local" + } +[effect_navalbase_vision] +type = "Unit_Vision_Radius_Sq" +value = 8 +reqs = + { "type", "name", "range" + "Extra", "Naval Base", "tile" + "Tech", "Invention", "Player" + "UnitClass", "Land", "Local" + } +[effect_navalbase_vision_1] ;Marines, AAA +type = "Unit_Vision_Radius_Sq" +value = 8 +reqs = + { "type", "name", "range" + "Extra", "Naval Base", "tile" + "Tech", "Invention", "Player" + "UnitClass", "LandAirSea", "Local" + } +[effect_navalbase_vision_2] ;Knights +type = "Unit_Vision_Radius_Sq" +value = 8 +reqs = + { "type", "name", "range" + "Extra", "Naval Base", "tile" + "Tech", "Invention", "Player" + "UnitClass", "LandNoKill", "Local" + } + +; Fortress types, HP regen -------------------------------------------- +[effect_fortress_hp_regen] +; Cumulative with fort: 10+15=25 +type = "HP_Regen" +value = 15 +reqs = + { "type", "name", "range" + "ExtraFlag", "FortressHeal", "Tile" + "UnitClass", "Land", "Local" + } +[effect_fortress_hp_regen_1] +type = "HP_Regen" +value = 15 +reqs = + { "type", "name", "range" + "ExtraFlag", "FortressHeal", "Tile" + "UnitClass", "LandAirSea", "Local" + } +[effect_fortress_hp_regen_2] +type = "HP_Regen" +value = 15 +reqs = + { "type", "name", "range" + "ExtraFlag", "FortressHeal", "Tile" + "UnitClass", "LandNoKill", "Local" + } +[effect_fortress_hp_regen_3] +type = "HP_Regen" +value = 25 ;25 because not cumulative with Fort (Fort only nullfies hp loss each turn) +reqs = + { "type", "name", "range" + "ExtraFlag", "FortressHeal", "Tile" + "UnitClass", "Helicopter", "Local" + } + +; Airbase HP regen --------------------------------------------------- +[effect_airbase_hp_regen] +type = "HP_Regen" +value = 25 +reqs = + { "type", "name", "range" + "Extra", "Airbase", "Tile" + "UnitClass", "Helicopter", "Local" + } +[effect_airbase_hp_regen1] +type = "HP_Regen" +value = 15 +reqs = + { "type", "name", "range" + "Extra", "Airbase", "Tile" + "UnitClass", "AirProtect", "Local" + } +[effect_airbase_hp_regen2] +type = "HP_Regen" +value = 15 +reqs = + { "type", "name", "range" + "Extra", "Airbase", "Tile" + "UnitClass", "Air", "Local" + } +[effect_airbase_hp_regen3] +type = "HP_Regen" +value = 15 +reqs = + { "type", "name", "range" + "Extra", "Airbase", "Tile" + "UnitClass", "Air_High_Altitude", "Local" + } + +; ****************** NAVAL BASE ****************************** +[effect_navbase_vision] +type = "Unit_Vision_Radius_Sq" +value = 8 +reqs = + { "type", "name", "range" + "Extra", "Naval Base", "tile" + "Tech", "Invention", "Player" + "UnitClass", "Trireme", "Local" + } +[effect_navbase_vision1] +type = "Unit_Vision_Radius_Sq" +value = 8 +reqs = + { "type", "name", "range" + "Extra", "Naval Base", "tile" + "Tech", "Invention", "Player" + "UnitClass", "RiverShip", "Local" + } +[effect_navbase_vision2] +type = "Unit_Vision_Radius_Sq" +value = 8 +reqs = + { "type", "name", "range" + "Extra", "Naval Base", "tile" + "Tech", "Invention", "Player" + "UnitClass", "Sea", "Local" + } +; Naval Base HP regen +[effect_navbase_hp_regen] +type = "HP_Regen" +value = 20 +reqs = + { "type", "name", "range" + "Extra", "Naval Base", "Tile" + "UnitClass", "Sea", "Local" + } +[effect_navbase_hp_regen_1] +type = "HP_Regen" +value = 20 +reqs = + { "type", "name", "range" + "Extra", "Naval Base", "Tile" + "UnitClass", "RiverShip", "Local" + } +[effect_navbase_hp_regen_2] +type = "HP_Regen" +value = 20 +reqs = + { "type", "name", "range" + "Extra", "Naval Base", "Tile" + "UnitClass", "Trireme", "Local" + } +[effect_navbase_hp_regen_3] +type = "HP_Regen" +value = 20 +reqs = + { "type", "name", "range" + "Extra", "Naval Base", "Tile" + "UnitClass", "Submarine", "Local" + } +; *********************************************************** + +; Base vision range - radius of vision is sqrt(5) = 2.24 +[effect_city_vision] +type = "City_Vision_Radius_Sq" +value = 5 + +;PERCENTAGE CHANCE OF STEALING A TECH WHEN CONQUERING A CITY. +[effect_conquest_tech] +type = "Conquest_Tech_Pct" +value = 100 + +;Tribesmen------------------------------------------ +[effect_tribesmen_first_three_turns] +type = "Move_Bonus" +value = 3 +reqs = + { + "type", "name", "range", "present" + "UnitType", "Tribesmen", "Local", TRUE + "MinYear", "-3700", "World", FALSE + } +[effect_tribesmen_slow] +type = "Move_Bonus" +value = -3 +reqs = + { + "type", "name", "range" + "UnitType", "Tribesmen", "Local" + "MinYear", "-2000", "World" + } +[effect_tribesmen_glaucoma] +type = "Unit_Vision_Radius_Sq" +value = -1 +reqs = + { + "type", "name", "range" + "UnitType", "Tribesmen", "Local" + "MinYear", "-2000", "World" + } +;------------------------------------------------------ + +;Freshly fueled full hp helicopters get +1 move per turn +[effect_fresh_helicopter] +type = "Move_Bonus" +value = 9 +reqs = + { "type", "name", "range" + "UnitClass", "Helicopter", "Local" + "Extra", "Airbase", "Local" + } +;Freshly fueled full hp helicopters get +1 move per turn +[effect_fresh_helicopter2] +type = "Move_Bonus" +value = 9 +reqs = + { "type", "name", "range" + "UnitClass", "Helicopter", "Local" + "CityTile", "Center", "Local" + } + +; Nuclear power gives +1 moves to sea units (+2 under 2x) +[effect_nuclear_powered_boats] +type = "Move_Bonus" +value = 18 +reqs = + { "type", "name", "range" + "Tech", "Nuclear Power", "Player" + "UnitClass", "Sea", "Local" + } +; Nuclear power gives +1 moves to sea units (+2 under 2x) +[effect_nuclear_powered_subs] +type = "Move_Bonus" +value = 18 +reqs = + { "type", "name", "range" + "Tech", "Nuclear Power", "Player" + "UnitClass", "Submarine", "Local" + } + +;************************************* GOVERNMENT CORRUPTION +[effect_corruption_anarchy_1] +type = "Output_Waste" +value = 25 +reqs = + { "type", "name", "range" + "Gov", "Anarchy", "Player" + "OutputType", "Trade", "Local" + } +[effect_corruption_anarchy_2] +type = "Output_Waste_By_Distance" +value = 200 +reqs = + { "type", "name", "range" + "Gov", "Anarchy", "Player" + "OutputType", "Trade", "Local" + } +[effect_corruption_despotism_1] +type = "Output_Waste" +value = 37 +reqs = + { "type", "name", "range" + "Gov", "Despotism", "Player" + "OutputType", "Trade", "Local" + } +[effect_corruption_despotism_2] +type = "Output_Waste_By_Distance" +value = 400 +reqs = + { "type", "name", "range" + "Gov", "Despotism", "Player" + "OutputType", "Trade", "Local" + } +[effect_corruption_monarchy_1] +type = "Output_Waste" +value = 15 +reqs = + { "type", "name", "range" + "Gov", "Monarchy", "Player" + "OutputType", "Trade", "Local" + } +[effect_corruption_monarchy_2] +type = "Output_Waste_By_Distance" +value = 200 +reqs = + { "type", "name", "range" + "Gov", "Monarchy", "Player" + "OutputType", "Trade", "Local" + } +[effect_corruption_republic_1] +type = "Output_Waste" +value = 15 +reqs = + { "type", "name", "range" + "Gov", "Republic", "Player" + "OutputType", "Trade", "Local" + } +[effect_corruption_republic_2] +type = "Output_Waste_By_Distance" +value = 200 +reqs = + { "type", "name", "range" + "Gov", "Republic", "Player" + "OutputType", "Trade", "Local" + } +[effect_corruption_democracy_1] +type = "Output_Waste" +value = 8 +reqs = + { "type", "name", "range" + "Gov", "Democracy", "Player" + "OutputType", "Trade", "Local" + } +[effect_corruption_democracy_2] +type = "Output_Waste_By_Distance" +value = 40 +reqs = + { "type", "name", "range" + "Gov", "Democracy", "Player" + "OutputType", "Trade", "Local" + } +[effect_corruption_communism_1] +type = "Output_Waste" +value = 20 +reqs = + { "type", "name", "range" + "Gov", "Communism", "Player" + "OutputType", "Trade", "Local" + } +;[effect_corruption_communism_2] +;No output waste by distance + +[effect_corruption_theocracy_2] +type = "Output_Waste" +value = 2 +reqs = + { "type", "name", "range" + "Gov", "Theocracy", "Player" + "OutputType", "Trade", "Local" + } +[effect_corruption_theocracy1] +type = "Output_Waste_By_Distance" +value = 200 +reqs = + { "type", "name", "range" + "Gov", "Theocracy", "Player" + "OutputType", "Trade", "Local" + } +[effect_corruption_nationalism0] +type = "Output_Waste" +value = 8 +reqs = + { "type", "name", "range" + "Gov", "Nationalism", "Player" + "OutputType", "Trade", "Local" + } +[effect_corruption_nationalism1] +type = "Output_Waste_By_Distance" +value = 200 +reqs = + { "type", "name", "range" + "Gov", "Nationalism", "Player" + "OutputType", "Trade", "Local" + } +;*********************************************** UNIT UPKEEP +[effect_base_unit_upkeep] +type = "Upkeep_Factor" +value = 1 + +[effect_upkeep_free_units_anarchy] +type = "Unit_Upkeep_Free_Per_City" +value = 3 +reqs = + { "type", "name", "range" + "Gov", "Anarchy", "Player" + "OutputType", "Shield", "Local" + } +[effect_anarchy_upkeep_tech_free] +type = "Tech_Upkeep_Free" +value = 9999 +reqs = + { "type", "name", "range" + "Gov", "Anarchy", "Player" + } +[effect_anarchy_upkeep] +type = "Upkeep_Free" +value = 99 +reqs = + { "type", "name", "range" + "Gov", "Anarchy", "Player" + } +[effect_upkeep_free_units_despotism] +type = "Unit_Upkeep_Free_Per_City" +value = 3 +reqs = + { "type", "name", "range" + "Gov", "Despotism", "Player" + "OutputType", "Shield", "Local" + } +[effect_upkeep_free_units_monarchy] +type = "Unit_Upkeep_Free_Per_City" +value = 3 +reqs = + { "type", "name", "range", "present" + "Gov", "Monarchy", "Player", TRUE + "OutputType", "Shield", "Local", TRUE + "Building", "Magna Carta", "Player", FALSE + } +[effect_upkeep_free_units_magna_carta] +type = "Unit_Upkeep_Free_Per_City" +value = 1 +reqs = + { "type", "name", "range", "present" + "Gov", "Monarchy", "Player", TRUE + "OutputType", "Shield", "Local", TRUE + "Building", "Magna Carta", "Player", TRUE + } +[effect_magna_carta_unit_unhappiness] +type = "Unhappy_Factor" +value = 1 +reqs = + { "type", "name", "range", "present" + "Gov", "Monarchy", "Player", TRUE + "Building", "Magna Carta", "Player", TRUE + } +[effect_magna_carta_free_deployment] +type = "Make_Content_Mil" +value = 2 +reqs = + { "type", "name", "range", "present" + "Gov", "Monarchy", "Player", TRUE + "Building", "Magna Carta", "Player", TRUE + } +[effect_republic_free_deployment] +type = "Make_Content_Mil" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Republic", "Player" + } +[effect_republic_settler_food_upkeep] +type = "Upkeep_Factor" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Republic", "Player" + "OutputType", "Food", "Local" + } +[effect_republic_unit_unhappiness] +type = "Unhappy_Factor" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Republic", "Player" + } +[effect_democracy_settler_food_upkeep] +type = "Upkeep_Factor" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Democracy", "Player" + "OutputType", "Food", "Local" + } +[effect_democracy_unit_unhappiness] +type = "Unhappy_Factor" +value = 2 +reqs = + { "type", "name", "range" + "Gov", "Democracy", "Player" + } +[effect_upkeep_free_units_communism] +type = "Unit_Upkeep_Free_Per_City" +value = 4 +reqs = + { "type", "name", "range" + "Gov", "Communism", "Player" + "OutputType", "Shield", "Local" + } +[effect_building_upkeep_communism] +type = "Upkeep_Free" ; +value = 1 +reqs = + { "type", "name", "range", "quiet" + "Gov", "Communism", "Player", TRUE + } +[effect_theocracy_settler_food_upkeep] +type = "Upkeep_Factor" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Theocracy", "Player" + "OutputType", "Food", "Local" + } +[effect_upkeep_free_units_theocracy] +type = "Unit_Upkeep_Free_Per_City" +value = 10 +reqs = + { "type", "name", "range" + "Gov", "Theocracy", "Player" + "OutputType", "Shield", "Local" + } +[effect_nationalism_unit_upkeep] +type = "Upkeep_Factor" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Nationalism", "Player" + "OutputType", "Food", "Local" + } +[effect_upkeep_free_units_nationalism] +type = "Unit_Upkeep_Free_Per_City" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Nationalism", "Player" + "OutputType", "Shield", "Local" + } +;************************************************ CIVIL WAR +[effect_civil_war_anarchy] +type = "Civil_War_Chance" +value = 90 +reqs = + { "type", "name", "range" + "Gov", "Anarchy", "Player" + } +[effect_civil_war_despotism] +type = "Civil_War_Chance" +value = 80 +reqs = + { "type", "name", "range" + "Gov", "Despotism", "Player" + } +[effect_civil_war_monarchy] +type = "Civil_War_Chance" +value = 70 +reqs = + { "type", "name", "range", "present" + "Gov", "Monarchy", "Player", TRUE + "Building", "Magna Carta", "Player", FALSE + } +[effect_civil_war_constitutional_monarchy] +type = "Civil_War_Chance" +value = 50 +reqs = + { "type", "name", "range", "present" + "Gov", "Monarchy", "Player", TRUE + "Building", "Magna Carta", "Player", TRUE + } +[effect_civil_war_republic] +type = "Civil_War_Chance" +value = 40 +reqs = + { "type", "name", "range" + "Gov", "Republic", "Player" + } +[effect_civil_war_democracy] +type = "Civil_War_Chance" +value = 30 +reqs = + { "type", "name", "range" + "Gov", "Democracy", "Player" + } +[effect_civil_war_communism] +type = "Civil_War_Chance" +value = 50 +reqs = + { "type", "name", "range" + "Gov", "Communism", "Player" + } +[effect_civil_war_nationalism] +type = "Civil_War_Chance" +value = 40 +reqs = + { "type", "name", "range" + "Gov", "Nationalism", "Player" + } +;[effect_civil_war_theocracy] +;type = "Civil_War_Chance" +;value = 0 +;reqs = +; { "type", "name", "range" +; "Gov", "Theocracy", "Player" +; } +;******************************************* EMPIRE SIZE / cities +[effect_empire_size_base_anarchy] +type = "Empire_Size_Base" +value = 9 +reqs = + { "type", "name", "range" + "Gov", "Anarchy", "Player" + } +[effect_empire_size_step_anarchy] +type = "Empire_Size_Step" +value = 6 +reqs = + { "type", "name", "range" + "Gov", "Anarchy", "Player" + } +[effect_empire_size_base_despotism] +type = "Empire_Size_Base" +value = 10 +reqs = + { "type", "name", "range" + "Gov", "Despotism", "Player" + } +[effect_empire_size_step_despotism] +type = "Empire_Size_Step" +value = 10 +reqs = + { "type", "name", "range" + "Gov", "Despotism", "Player" + } +[effect_empire_size_base_monarchy] +type = "Empire_Size_Base" +value = 11 +reqs = + { "type", "name", "range" + "Gov", "Monarchy", "Player" + } +[effect_empire_size_base_constitutional_monarchy] +type = "Empire_Size_Base" +value = 12 +reqs = + { "type", "name", "range" + "Gov", "Monarchy", "Player" + "Building", "Magna Carta", "Player" + } +[effect_empire_size_step_monarchy] +type = "Empire_Size_Step" +value = 12 +reqs = + { "type", "name", "range" + "Gov", "Monarchy", "Player" + } +;Replaced by [effect_empire_size_base_constitutional_monarchy] in order to make the Happy Tab more "accurately" +;portray the cause as the 'government' constitutional monarchy rather than caused by the 'building' +;[effect_23_12_empire_base_step_magna_carta] +;type = "Make_Content" +;value = 1 ; One extra content creates a 23/12 base/step +;reqs = +; { "type", "name", "range", "present" +; "Gov", "Monarchy", "Player", TRUE +; "Building", "Magna Carta", "Player", TRUE +; } +[effect_empire_size_base_republic] +type = "Empire_Size_Base" +value = 13 +reqs = + { "type", "name", "range" + "Gov", "Republic", "Player" + } +[effect_empire_size_step_republic] +type = "Empire_Size_Step" +value = 14 +reqs = + { "type", "name", "range" + "Gov", "Republic", "Player" + } +[effect_empire_size_base_democracy] +type = "Empire_Size_Base" +value = 14 +reqs = + { "type", "name", "range" + "Gov", "Democracy", "Player" + } +[effect_empire_size_step_democracy] +type = "Empire_Size_Step" +value = 16 +reqs = + { "type", "name", "range" + "Gov", "Democracy", "Player" + } +[effect_empire_size_base_theocracy] +type = "Empire_Size_Base" +value = 14 +reqs = + { "type", "name", "range" + "Gov", "Theocracy", "Player" + } +[effect_empire_size_step_theocracy] +type = "Empire_Size_Step" +value = 15 +reqs = + { "type", "name", "range" + "Gov", "Theocracy", "Player" + } +[effect_empire_size_base_communism] +type = "Empire_Size_Base" +value = 12 +reqs = + { "type", "name", "range" + "Gov", "Communism", "Player" + } + +; Empire_Size_Step disabled for Communism + +[effect_empire_size_base_nationalism] +type = "Empire_Size_Base" +value = 20 +reqs = + { "type", "name", "range" + "Gov", "Nationalism", "Player" + } +[effect_empire_size_step_nationalism] +type = "Empire_Size_Step" +value = 12 +reqs = + { "type", "name", "range" + "Gov", "Nationalism", "Player" + } +;******************************************** MAX TAX RATES +[effect_max_rates_anarchy] +type = "Max_Rates" +value = 100 +reqs = + { "type", "name", "range" + "Gov", "Anarchy", "Player" + } +[effect_max_rates_despotism] +type = "Max_Rates" +value = 60 +reqs = + { "type", "name", "range" + "Gov", "Despotism", "Player" + } +[effect_max_rates_monarchy] +type = "Max_Rates" +value = 70 +reqs = + { "type", "name", "range" + "Gov", "Monarchy", "Player" + } +[effect_max_rates_republic] +type = "Max_Rates" +value = 80 +reqs = + { "type", "name", "range" + "Gov", "Republic", "Player" + } +[effect_max_rates_democracy] +type = "Max_Rates" +value = 100 +reqs = + { "type", "name", "range" + "Gov", "Democracy", "Player" + } +[effect_max_rates_theocracy] +type = "Max_Rates" +value = 80 +reqs = + { "type", "name", "range" + "Gov", "Theocracy", "Player" + } +[effect_max_rates_communism] +type = "Max_Rates" +value = 80 +reqs = + { "type", "name", "range" + "Gov", "Communism", "Player" + } +[effect_max_rates_nationalism] +type = "Max_Rates" +value = 90 +reqs = + { "type", "name", "range" + "Gov", "Nationalism", "Player" + } +;********************************************** MARTIAL LAW, governments +[effect_martial_law_each_anarchy] +type = "Martial_Law_Each" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Anarchy", "Player" + } +[effect_martial_law_max_anarchy] +type = "Martial_Law_Max" +value = 100 +reqs = + { "type", "name", "range" + "Gov", "Anarchy", "Player" + } +[effect_martial_law_each_despotism] +type = "Martial_Law_Each" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Despotism", "Player" + } +[effect_martial_law_max_despotism] +type = "Martial_Law_Max" +value = 100 +reqs = + { "type", "name", "range" + "Gov", "Despotism", "Player" + } +[effect_martial_law_each_monarchy] +type = "Martial_Law_Each" +value = 1 +reqs = + { "type", "name", "range", "present" + "Gov", "Monarchy", "Player", TRUE + } +[effect_martial_law_max_monarchy] +type = "Martial_Law_Max" +value = 3 +reqs = + { "type", "name", "range", "present" + "Gov", "Monarchy", "Player", TRUE + "Building", "Magna Carta", "Player", FALSE + } +[effect_martial_law_max_magna_carta] +type = "Martial_Law_Max" +value = 1 +reqs = + { "type", "name", "range", "present" + "Gov", "Monarchy", "Player", TRUE + "Building", "Magna Carta", "Player", TRUE + } +[effect_martial_law_each_theocracy] +type = "Martial_Law_Each" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Theocracy", "Player" + } +[effect_martial_law_max_theocracy] +type = "Martial_Law_Max" +value = 2 +reqs = + { "type", "name", "range" + "Gov", "Theocracy", "Player" + } +[effect_martial_law_each_communism] +type = "Martial_Law_Each" +value = 2 +reqs = + { "type", "name", "range" + "Gov", "Communism", "Player" + } +[effect_martial_law_max_communism] +type = "Martial_Law_Max" +value = 3 +reqs = + { "type", "name", "range" + "Gov", "Communism", "Player" + } +[effect_martial_law_each_nationalism] +type = "Martial_Law_Each" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Nationalism", "Player" + } +[effect_martial_law_max_nationalism] +type = "Martial_Law_Max" +value = 5 +reqs = + { "type", "name", "range" + "Gov", "Nationalism", "Player" + } +;********************************************* RAPTURE +[effect_rapture_grow_magna_carta] +type = "Rapture_Grow" +value = 3 +reqs = + { "type", "name", "range", "present" + "CityStatus", "OwnedByOriginal", "City", TRUE + "Building", "Magna Carta", "Player", TRUE + "Gov", "Monarchy", "Player", TRUE + } +[effect_rapture_grow_republic] +type = "Rapture_Grow" +value = 3 +reqs = + { "type", "name", "range" + "Gov", "Republic", "Player" + } +[effect_rapture_grow_democracy] +type = "Rapture_Grow" +value = 3 +reqs = + { "type", "name", "range", "present" + "Gov", "Democracy", "Player", TRUE + "MinForeignPct", "9", "City", FALSE + } +[effect_rapture_grow_nationalism] +type = "Rapture_Grow" +value = 3 +reqs = + { "type", "name", "range" + "Gov", "Nationalism", "Player" + "CityStatus", "OwnedByOriginal", "City" + } + +;********************************************** GOVERNMENT VET BONUSES +[effect_communist_spy_vets] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Communism", "Player" + "UnitFlag", "Diplomat", "Local" + } +[effect_nationalism_vet_riflemen] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Nationalism", "Player" + "UnitType", "Riflemen", "Local" + } +;veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 +[effect_nationalism_fighters_vet_promotion] +type = "Veteran_Combat" +value = 50 ;60 37.5 24 15 15 15 +reqs = + { "type", "name", "range" + "Gov", "Nationalism", "Player" + "UnitType", "Fighter", "Local" + } +[effect_nationalism_divebomber_vet_promotion] +type = "Veteran_Combat" +value = 50 ;60 37.5 24 15 15 15 +reqs = + { "type", "name", "range" + "Gov", "Nationalism", "Player" + "UnitType", "Fighter", "Local" + } +;************************************************ GOVERNMENT TILE OUTPUT penalty/bonus +[effect_gov_tile_penalty_anarchy] +type = "Output_Penalty_Tile" +value = 2 +reqs = + { "type", "name", "range" + "Gov", "Anarchy", "Player" + } +[effect_gov_tile_penalty_despotism] +type = "Output_Penalty_Tile" +value = 2 +reqs = + { "type", "name", "range" + "Gov", "Despotism", "Player" + } + +[effect_gov_tile_bonus_monarchy] +type = "Output_Inc_Tile_Celebrate" +value = 1 +reqs = + { "type", "name", "range", "present" + "Gov", "Monarchy", "Player", TRUE + "Building", "Magna Carta", "Player", FALSE ;handled separately by the wonder + "Building", "Angkor Wat", "Player", FALSE ;handled separately by the wonder + "OutputType", "Trade", "Local", TRUE + } + +; Constitutional Monarchy gets trade bonus only on Land tiles unless celebrating. +[effect_gov_tile_bonus_magna_carta_1] +type = "Output_Inc_Tile" +value = 1 +reqs = + { "type", "name", "range", "present" + "Gov", "Monarchy", "Player", TRUE + "Building", "Magna Carta", "Player", TRUE + "Building", "Angkor Wat", "Player", FALSE ;auto-provided by this wonder + "OutputType", "Trade", "Local", TRUE + "TerrainClass","Oceanic", "Local", FALSE + } +;Handle the case where Angkor Wat doesn't increase because of city size. +;Size 1-2 cities with Angkor Wat still get this as a Gov Bonus. +[effect_gov_tile_bonus_magna_carta_1_angkor_wat_exception] +type = "Output_Inc_Tile" +value = 1 +reqs = + { "type", "name", "range", "present" + "Gov", "Monarchy", "Player", TRUE + "Building", "Magna Carta", "Player", TRUE + "Building", "Angkor Wat", "Player", TRUE + "MinSize", "3", "City", FALSE + "OutputType", "Trade", "Local", TRUE + "TerrainClass","Oceanic", "Local", FALSE + } +[effect_gov_tile_bonus_magna_carta_2] +type = "Output_Inc_Tile_Celebrate" +value = 1 +reqs = + { "type", "name", "range", "present" + "Gov", "Monarchy", "Player", TRUE + "Building", "Magna Carta", "Player", TRUE + "Building", "Angkor Wat", "Player", FALSE ;auto-provided by this wonder + "OutputType", "Trade", "Local", TRUE + "TerrainClass", "Oceanic", "Local", TRUE + } +[effect_gov_tile_bonus_republic] +type = "Output_Inc_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Republic", "Player" + "OutputType", "Trade", "Local" + } +[effect_gov_tile_bonus_democracy] +type = "Output_Inc_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Democracy", "Player" + "OutputType", "Trade", "Local" + } +[effect_gov_tile_bonus_theocracy] +type = "Output_Inc_Tile_Celebrate" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Theocracy", "Player" + "OutputType", "Trade", "Local" + } +[effect_gov_tile_bonus_communism] +type = "Output_Inc_Tile_Celebrate" +value = 1 +reqs = + { "type", "name", "range" + "OutputType", "Trade", "Local" + "Gov", "Communism", "Player" + } +; Nationalism gets trade bonus only on Land tiles unless celebrating. +[effect_gov_tile_bonus_7] +type = "Output_Inc_Tile" +value = 1 +reqs = + { "type", "name", "range", "present" + "Gov", "Nationalism", "Player", TRUE + "OutputType", "Trade", "Local", TRUE + "TerrainClass", "Oceanic", "Local", FALSE + } +[effect_gov_tile_bonus_7a] +type = "Output_Inc_Tile_Celebrate" +value = 1 +reqs = + { "type", "name", "range", "present" + "Gov", "Nationalism", "Player",TRUE + "OutputType", "Trade", "Local", TRUE + "TerrainClass", "Oceanic", "Local", TRUE + } +;***************************************************** Representative Gov penalties +[effect_anarchy_disorder_democracy] +type = "Revolution_Unhappiness" +value = 2 ; 2 turns = anarchy +reqs = + { "type", "name", "range" + "Gov", "Democracy", "Player" + } +[effect_senate_republic] +type = "Has_Senate" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Republic", "Player" + } +[effect_senate_democracy] +type = "Has_Senate" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Democracy", "Player" + } +[effect_parliament_magna_carta] +type = "Has_Senate" +value = 1 +reqs = + { "type", "name", "range", "present" + "Gov", "Monarchy", "Player", TRUE + "Building", "Magna Carta", "Player", TRUE + } +[effect_popular_parliament_magna_carta] +type = "Has_Senate" +value = -1 +reqs = + { "type", "name", "range", "present" + "Gov", "Monarchy", "Player", TRUE + "Building", "Magna Carta", "Player", TRUE + "Building", "King Richard's Crusade", "Player", TRUE + "Building", "J.S. Bach's Cathedral", "Player", TRUE + } +;*************************************************** Partisans for Governemnts +[effect_partisans_democracy] +type = "Inspire_Partisans" +value = 1 +reqs = + { "type", "name", "range", "present" + "Gov", "Democracy", "Player", TRUE + "Tech", "Communism", "Player", TRUE + "Tech", "Gunpowder", "Player", TRUE + "Tech", "Guerilla Warfare", "World", TRUE + "NationGroup", "Barbarian", "Player", FALSE + } +[effect_partisans_communism] +type = "Inspire_Partisans" +value = 1 +reqs = + { "type", "name", "range", "present" + "Gov", "Communism", "Player", TRUE + "Tech", "Communism", "Player", TRUE + "Tech", "Gunpowder", "Player", TRUE + "Tech", "Guerilla Warfare", "World", TRUE + "NationGroup", "Barbarian", "Player", FALSE + } +[effect_partisans_theocracy] +type = "Inspire_Partisans" +value = 1 +reqs = + { "type", "name", "range", "present" + "Gov", "Theocracy", "Player", TRUE + "Tech", "Guerilla Warfare", "World", TRUE + "NationGroup", "Barbarian", "Player", FALSE + } +;******************************************************** Other Economic Adjustments for Governments +[effect_bad_sci_theocracy] +type = "Output_Bonus_2" +value = -20 +reqs = + { "type", "name", "range" + "Gov", "Theocracy", "Player" + "OutputType", "Science", "local" + } +[effect_tithes_theocracy_1] +type = "Happiness_To_Gold" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Theocracy", "Player" + } +[effect_tithes_theocracy_2] +type = "Output_Bonus_2" +value = 20 +reqs = + { "type", "name", "range" + "Gov", "Theocracy", "Player" + "OutputType", "Gold", "local" + } +[effect_bad_lux_nationalism] +type = "Output_Bonus_2" +value = -15 +reqs = + { "type", "name", "range" + "Gov", "Nationalism", "Player" + "OutputType", "Luxury", "local" + } +[effect_sci_adjustment_nationalism] +type = "Output_Bonus_2" +value = 15 +reqs = + { "type", "name", "range" + "Gov", "Nationalism", "Player" + "OutputType", "Science", "local" + "CityStatus", "OwnedByOriginal", "City" + } +;************************************************************************************************** + +[effect_airport_2] +type = "Airlift" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Airport", "City" + } + +[effect_airport_v0] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Airport", "City", TRUE + "UnitClass", "Air", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_airport_v1] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Airport", "City", TRUE + "UnitClass", "AirProtect", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_airport_v2] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Airport", "City", TRUE + "UnitClass", "Air_High_Altitude", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_airport_v3] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Airport", "City", TRUE + "UnitClass", "Helicopter", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_airport_v4] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Airport", "City", TRUE + "UnitClass", "Missile", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } + +[effect_airport_h1] +type = "HP_Regen" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Airport", "City" + "UnitClass", "Air", "Local" + } +[effect_airport_h2] +type = "HP_Regen" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Airport", "City" + "UnitClass", "AirProtect", "Local" + } +[effect_airport_h3] +type = "HP_Regen" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Airport", "City" + "UnitClass", "Air_High_Altitude", "Local" + } +[effect_airport_h4] +type = "HP_Regen" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Airport", "City" + "UnitClass", "Helicopter", "Local" + } + +; Base max city size of 8 +[effect_aqueduct_size] +type = "Size_Adj" +value = 8 + +[effect_aqueduct] +type = "Size_Adj" +value = 4 +reqs = + { "type", "name", "range" + "Building", "Aqueduct", "City" + } + +[effect_aqueduct_health] +type = "Health_Pct" +value = 50 +reqs = + { "type", "name", "range" + "Building", "Aqueduct", "City" + } + +[effect_bank_gold] +type = "Output_Bonus" +value = 50 +reqs = + { "type", "name", "range" + "Building", "Marketplace", "City" + "Building", "Bank", "City" + "OutputType", "Gold", "Local" + } +[effect_bank_luxury] +type = "Output_Bonus" +value = 50 +reqs = + { "type", "name", "range" + "Building", "Marketplace", "City" + "Building", "Bank", "City" + "OutputType", "Luxury", "Local" + } +;Changes require changes to city_force_income_update() in city.js +[effect_bank_coinage] +type = "Coinage_Bonus_Pm" +value = 250 ; 250 ‰ = +25 % +reqs = + { "type", "name", "range", "present" + "Building", "Marketplace", "City", TRUE + "Building", "Bank", "City", TRUE + "Gov", "Communism", "Player",FALSE + } + +[effect_barracks] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks", "City", TRUE + "UnitClass", "Land", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_barracks_1] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks", "City", TRUE + "UnitClass", "LandNoKill", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_barracks_2] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks", "City", TRUE + "UnitClass", "LandRoad", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_barracks_a] +type = "HP_Regen" +value = 100 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks", "City", TRUE + "UnitClass", "Land", "Local", TRUE + } +[effect_barracks_b] +type = "HP_Regen" +value = 100 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks", "City", TRUE + "UnitClass", "LandAirSea", "Local", TRUE ; might be resting in allied city with Barracks I + } +[effect_barracks_c] +type = "HP_Regen" +value = 100 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks", "City", TRUE + "UnitClass", "LandNoKill", "Local", TRUE + } + +[effect_barracks_ii] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks II", "City", TRUE + "UnitClass", "Land", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_barracks_ii_1] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks II", "City", TRUE + "UnitClass", "LandAirSea", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_barracks_ii_2] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks II", "City", TRUE + "UnitClass", "LandNoKill", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_barracks_ii_a] +type = "HP_Regen" +value = 100 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks II", "City", TRUE + "UnitClass", "Land", "Local", TRUE + } +[effect_barracks_ii_b] +type = "HP_Regen" +value = 100 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks II", "City", TRUE + "UnitClass", "LandAirSea", "Local", TRUE + } +[effect_barracks_ii_c] +type = "HP_Regen" +value = 100 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks II", "City", TRUE + "UnitClass", "LandNoKill", "Local", TRUE + } + +[effect_barracks_iii] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks III", "City", TRUE + "UnitClass", "Land", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_barracks_iii_1] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks III", "City", TRUE + "UnitClass", "LandAirSea", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_barracks_iii_2] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks III", "City", TRUE + "UnitClass", "LandNoKill", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_barracks_iii_a] +type = "HP_Regen" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Barracks III", "City" + "UnitClass", "Land", "Local" + } +[effect_barracks_iii_b] +type = "HP_Regen" +value = 100 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks III", "City", TRUE + "UnitClass", "LandAirSea", "Local", TRUE + } +[effect_barracks_iii_c] +type = "HP_Regen" +value = 100 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks III", "City", TRUE + "UnitClass", "LandNoKill", "Local", TRUE + } + +;prolongs time-window relevance of amphibious invasions later in game +[effect_triple_training_marines] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks III", "City", TRUE + "Building", "Port Facility", "City", TRUE + "Building", "Airport", "City", TRUE + "UnitType", "Marines", "Local", TRUE + } + +;--- STANDARD CATHEDRAL sans Michelangelo ------------------------ +[effect_cathedral] +type = "Make_Content" +value = 3 +reqs = + { "type", "name", "range", "present" + "Building", "Cathedral", "City", TRUE + "Building", "Michelangelo's Chapel", "Player", FALSE + } +[effect_cathedral_1] +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range", "present" + "Tech", "Theology", "Player", TRUE + "Building", "Cathedral", "City", TRUE + "Building", "Michelangelo's Chapel", "Player", FALSE + } +[effect_cathedral_2] +type = "Make_Content" +value = -1 +reqs = + { "type", "name", "range", "present" + "Gov", "Communism", "Player", TRUE + "Building", "Cathedral", "City", TRUE + "Building", "Michelangelo's Chapel", "Player", FALSE + } +;--- ENHANCED CATHEDRAL with Michelangelo: *** +[effect_cathedral_ma] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Cathedral", "City", TRUE + "Building", "Michelangelo's Chapel", "Player", TRUE + } +[effect_cathedral_ma2] +type = "Force_Content" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Cathedral", "City", TRUE + "Building", "Michelangelo's Chapel", "Player", TRUE + } +;============================================================== +[effect_city_walls_vs_Land] +type = "Defend_Bonus" +value = 200 ; 3x vs most Land +reqs = + { "type", "name", "range", "present" + "Building", "City Walls", "City", TRUE + "UnitClass", "Land", "Local", TRUE + "UnitType", "Catapult", "Local", FALSE + "UnitType", "Cannon", "Local", FALSE + "UnitType", "Artillery", "Local", FALSE + "UnitType", "Howitzer", "Local", FALSE + } +[effect_city_walls_vs_Catapult_25pct_bonus] +type = "Defend_Bonus" +value = 175 ; 2.75x vs Catapult +reqs = + { "type", "name", "range", "present" + "Building", "City Walls", "City", TRUE + "UnitType", "Catapult", "Local", TRUE + } +[effect_city_walls_vs_Cannon_50pct_bonus] +type = "Defend_Bonus" +value = 150 ; 2.5x vs Cannon +reqs = + { "type", "name", "range", "present" + "Building", "City Walls", "City", TRUE + "UnitType", "Cannon", "Local", TRUE + } +[effect_city_walls_vs_Artillery_75pct_bonus] +type = "Defend_Bonus" +value = 125 ; 2.25x vs Artillery +reqs = + { "type", "name", "range", "present" + "Building", "City Walls", "City", TRUE + "UnitType", "Artillery", "Local", TRUE + } +[effect_city_walls_vs_Land_2] +type = "Defend_Bonus" +value = 200 +reqs = + { "type", "name", "range", "present" + "Building", "City Walls", "City", TRUE + "UnitClass", "LandAirSea", "Local", TRUE + } +[effect_city_walls_vs_Land_3] +type = "Defend_Bonus" +value = 200 +reqs = + { "type", "name", "range", "present" + "Building", "City Walls", "City", TRUE + "UnitClass", "LandNoKill", "Local", TRUE + } +[effect_city_walls_1] +type = "Unit_No_Lose_Pop" +value = 1 +reqs = + { "type", "name", "range" + "Building", "City Walls", "City" + } +[effect_city_walls_visible] +type = "Visible_Walls" +value = 1 +reqs = + { "type", "name", "range" + "Building", "City Walls", "City" + } +;Metallurgy increases cost of city walls +[effect_city_wall_metallurgy_price_increase] +type = "Building_Build_Cost_Pct" +value = 16 +reqs = + { + "type", "name", "range", "present" + "Tech", "Metallurgy", "Player", TRUE + "Building", "City Walls", "Local", TRUE + } + +; FORTIFICATIONS ***************************************** +[effect_fortifications_visible] +type = "Visible_Walls" +value = 4 +reqs = + { "type", "name", "range" + "Building", "Fortifications", "City" + } +[effect_fortifications_in_lowlands_bonus] +type = "Terrain_Defend_Add_Bonus" +value = 17 +reqs = + { "type", "name", "range", "present" + "Building", "Fortifications", "City", TRUE + "Terrain", "Mountains", "Local", FALSE + "Terrain", "Hills", "Local", FALSE + } +[effect_fortifications_vs_Land] +type = "Defend_Bonus" +value = 50 ; 1.50x vs most Land; (1.5 * 1.17= 1.755; WAS: 75,1.75 on lowlands) +reqs = + { "type", "name", "range", "present" + "Building", "Fortifications", "City", TRUE + "Building", "City Walls", "City", FALSE + "Building", "Great Wall", "Player", FALSE + "UnitClass", "Land", "Local", TRUE + "UnitType", "Catapult", "Local", FALSE + "UnitType", "Cannon", "Local", FALSE + "UnitType", "Artillery", "Local", FALSE + "UnitType", "Howitzer", "Local", FALSE + } +[effect_fortifications_vs_Catapult] +type = "Defend_Bonus" +value = 25 ; 1.25x vs Catapult's 25% bonus hills,lowlands: 1.25,1.4625; WAS: 1.50,1.50 hills @50% +reqs = + { "type", "name", "range", "present" + "Building", "Fortifications", "City", TRUE + "Building", "City Walls", "City", FALSE + "Building", "Great Wall", "Player", FALSE + "UnitType", "Catapult", "Local", TRUE + } + +;NOTE: -50% from Cannon nullifies +50% bonus: +;[effect_fortifications_vs_Cannon] +;type = "Defend_Bonus" +;value = 0 ; 1.00x vs Cannon's 50% bonus hills,lowlands: 1.00,1.17; WAS: 1.25,1.25 @ 25% +;reqs = +; { "type", "name", "range", "present" +; "Building", "Fortifications", "City", TRUE +; "Building", "City Walls", "City", FALSE +; "Building", "Great Wall", "Player", FALSE +; "UnitType", "Cannon", "Local", TRUE +; } + +;-75% from Artillery nullifies +50% bonus: 1.00,1.17; WAS: 1.00,1.00 @0% +;no need for an effect, therefore. + +; HOWITZER nullifies bonus: 1.00,1.17; WAS: 1.00,1.00 @0% + +[effect_fortifications_vs_Land_2] +type = "Defend_Bonus" +value = 50 +reqs = + { "type", "name", "range", "present" + "Building", "Fortifications", "City", TRUE + "Building", "City Walls", "City", FALSE + "Building", "Great Wall", "Player", FALSE + "UnitClass", "LandAirSea", "Local", TRUE + } +[effect_fortifications_vs_Land_3] +type = "Defend_Bonus" +value = 50 +reqs = + { "type", "name", "range", "present" + "Building", "Fortifications", "City", TRUE + "Building", "City Walls", "City", FALSE + "Building", "Great Wall", "Player", FALSE + "UnitClass", "LandNoKill", "Local", TRUE + } +[effect_fortifications_1] +type = "Unit_No_Lose_Pop" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Fortifications", "City" + } +[effect_fortifications_sale_value] +type = "Improvement_Sale_Pct" +value = 100 ; full 'recycle value' after City Walls go up. +reqs = + { "type", "name", "range" + "Building", "Fortifications", "Local" + "Building", "City Walls", "City" + } + +; GREAT Wall +;-------------------------------------------------------- +[effect_great_wall_0_vs_Land_original] +type = "Defend_Bonus" +value = 200 ; 3x vs most Land +reqs = + { "type", "name", "range", "present" + "Building", "Great Wall", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Age", "3", "City", TRUE + "CityStatus", "OwnedByOriginal", "City", TRUE + "UnitClass", "Land", "Local", TRUE + "CityTile", "Center", "Local", TRUE + "UnitType", "Catapult", "Local", FALSE + "UnitType", "Cannon", "Local", FALSE + "UnitType", "Artillery", "Local", FALSE + "UnitType", "Howitzer", "Local", FALSE + "Tech", "Machine Tools", "World", FALSE + } +[effect_great_wall_0_vs_Catapult25pct_bonus_original] +type = "Defend_Bonus" +value = 175 ; 2.75x vs Catapult +reqs = + { "type", "name", "range", "present" + "Building", "Great Wall", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Age", "3", "City", TRUE + "CityStatus", "OwnedByOriginal", "City", TRUE + "CityTile", "Center", "Local", TRUE + "UnitType", "Catapult", "Local", TRUE + "Tech", "Machine Tools", "World", FALSE + } +[effect_great_wall_0_vs_Cannon50pct_bonus_original] +type = "Defend_Bonus" +value = 150 ; 2.5x vs Cannon +reqs = + { "type", "name", "range", "present" + "Building", "Great Wall", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Age", "3", "City", TRUE + "CityStatus", "OwnedByOriginal", "City", TRUE + "CityTile", "Center", "Local", TRUE + "UnitType", "Cannon", "Local", TRUE + "Tech", "Machine Tools", "World", FALSE + } + +; 2.25x vs Artillery not needed since Machine Tools expires it. + +[effect_great_wall_0_assimilated] +type = "Defend_Bonus" +value = 200 ; 3x vs most Land +reqs = + { "type", "name", "range", "present" + "Building", "Great Wall", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Age", "3", "City", TRUE + "CityStatus", "OwnedByOriginal", "City", FALSE + "MinForeignPct", "19", "City", FALSE + "UnitClass", "Land", "Local", TRUE + "CityTile", "Center", "Local", TRUE + "UnitType", "Catapult", "Local", FALSE + "UnitType", "Cannon", "Local", FALSE + "UnitType", "Artillery", "Local", FALSE + "UnitType", "Howitzer", "Local", FALSE + "Tech", "Machine Tools", "World", FALSE + } +[effect_great_wall_0_vs_Catapult25pct_bonus_assimilated] +type = "Defend_Bonus" +value = 175 ; 2.75x vs Catapult +reqs = + { "type", "name", "range", "present" + "Building", "Great Wall", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Age", "3", "City", TRUE + "CityStatus", "OwnedByOriginal", "City", FALSE + "MinForeignPct", "19", "City", FALSE + "CityTile", "Center", "Local", TRUE + "UnitType", "Catapult", "Local", TRUE + "Tech", "Machine Tools", "World", FALSE + } +[effect_great_wall_0_vs_Cannon50pct_bonus_assimilated] +type = "Defend_Bonus" +value = 150 ; 2.5x vs. Cannon +reqs = + { "type", "name", "range", "present" + "Building", "Great Wall", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Age", "3", "City", TRUE + "CityStatus", "OwnedByOriginal", "City", FALSE + "MinForeignPct", "19", "City", FALSE + "CityTile", "Center", "Local", TRUE + "UnitType", "Cannon", "Local", TRUE + "Tech", "Machine Tools", "World", FALSE + } + +; 2.25x vs Artillery not needed since Machine Tools expires it. + +[effect_great_wall_1_original] +type = "Defend_Bonus" +value = 200 +reqs = + { "type", "name", "range", "present" + "Building", "Great Wall", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Age", "3", "City", TRUE + "CityStatus", "OwnedByOriginal", "City", TRUE + "UnitClass", "LandNoKill", "Local", TRUE + "CityTile", "Center", "Local", TRUE + "Tech", "Machine Tools", "World", FALSE + } +[effect_great_wall_1_assimilated] +type = "Defend_Bonus" +value = 200 +reqs = + { "type", "name", "range", "present" + "Building", "Great Wall", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Age", "3", "City", TRUE + "CityStatus", "OwnedByOriginal", "City", FALSE + "MinForeignPct", "19", "City", FALSE + "UnitClass", "LandNoKill", "Local", TRUE + "CityTile", "Center", "Local", TRUE + "Tech", "Machine Tools", "World", FALSE + } +[effect_great_wall_3_original] +type = "Defend_Bonus" +value = 200 +reqs = + { "type", "name", "range", "present" + "Building", "Great Wall", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Age", "3", "City", TRUE + "CityStatus", "OwnedByOriginal", "City", TRUE + "UnitClass", "LandAirSea", "Local", TRUE + "CityTile", "Center", "Local", TRUE + "Tech", "Machine Tools", "World", FALSE + } +[effect_great_wall_3_assimilated] +type = "Defend_Bonus" +value = 200 +reqs = + { "type", "name", "range", "present" + "Building", "Great Wall", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Age", "3", "City", TRUE + "CityStatus", "OwnedByOriginal", "City", FALSE + "MinForeignPct", "19", "City", FALSE + "UnitClass", "LandAirSea", "Local", TRUE + "CityTile", "Center", "Local", TRUE + "Tech", "Machine Tools", "World", FALSE + } +[effect_great_wall_poploss_original] +type = "Unit_No_Lose_Pop" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Great Wall", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Age", "3", "City", TRUE + "CityStatus", "OwnedByOriginal", "City", TRUE + "Tech", "Machine Tools", "World", FALSE + } +[effect_great_wall_poploss_assimilated] +type = "Unit_No_Lose_Pop" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Great Wall", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Age", "3", "City", TRUE + "CityStatus", "OwnedByOriginal", "City", FALSE + "MinForeignPct", "19", "City", FALSE + "Tech", "Machine Tools", "World", FALSE + } +[effect_great_wall_visible_original] +type = "Visible_Walls" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Great Wall", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Age", "3", "City", TRUE + "CityStatus", "OwnedByOriginal", "City", TRUE + "Tech", "Machine Tools", "World", FALSE + } +[effect_great_wall_visible_assimilated] +type = "Visible_Walls" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Great Wall", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Age", "3", "City", TRUE + "CityStatus", "OwnedByOriginal", "City", FALSE + "MinForeignPct", "19", "City", FALSE + "Tech", "Machine Tools", "World", FALSE + } +;============================================================== + +[effect_coastal_defense] +type = "Defend_Bonus" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Coastal Defense", "City" + "UnitClass", "Sea", "Local" + } +[effect_coastal_defense_1] +type = "Defend_Bonus" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Coastal Defense", "City" + "UnitClass", "RiverShip", "Local" + } +[effect_coastal_defense_2] +type = "Defend_Bonus" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Coastal Defense", "City" + "UnitClass", "Submarine", "Local" + } +[effect_coastal_defense_trireme] +type = "Defend_Bonus" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Coastal Defense", "City" + "UnitClass", "Trireme", "Local" + } +[effect_coastal_defense_visible] +type = "Visible_Walls" +value = 2 ; 2 is for coastal +reqs = + { "type", "name", "range" + "Building", "Coastal Defense", "City" + } +;============================================================== +[effect_gibraltar_fortress_city] +type = "Defend_Bonus" +value = 100 +reqs = + { "type", "name", "range", "present" + "Building", "Gibraltar Fortress", "City", TRUE + "Building", "Coastal Defense", "City", TRUE + "UnitClass", "Sea", "Local" + } +[effect_gibraltar_fortress_city_1] +type = "Defend_Bonus" +value = 100 +reqs = + { "type", "name", "range", "present" + "Building", "Gibraltar Fortress", "City", TRUE + "Building", "Coastal Defense", "City", TRUE + "UnitClass", "RiverShip", "Local" + } +[effect_gibraltar_fortress_city_2] +type = "Defend_Bonus" +value = 100 +reqs = + { "type", "name", "range", "present" + "Building", "Gibraltar Fortress", "City", TRUE + "Building", "Coastal Defense", "City", TRUE + "UnitClass", "Submarine", "Local" + } +[effect_gibraltar_fortress_city_trireme] +type = "Defend_Bonus" +value = 100 +reqs = + { "type", "name", "range", "present" + "Building", "Gibraltar Fortress", "City", TRUE + "Building", "Coastal Defense", "City", TRUE + "UnitClass", "Trireme", "Local" + } +[effect_gibraltar_fortress] +type = "Defend_Bonus" +value = 25 +reqs = + { "type", "name", "range", "present" + "Building", "Gibraltar Fortress", "Player", TRUE + "Building", "Gibraltar Fortress", "City", FALSE + "Building", "Coastal Defense", "City", TRUE + "UnitClass", "Sea", "Local" + } +[effect_gibraltar_fortress_1] +type = "Defend_Bonus" +value = 25 +reqs = + { "type", "name", "range", "present" + "Building", "Gibraltar Fortress", "Player", TRUE + "Building", "Gibraltar Fortress", "City", FALSE + "Building", "Coastal Defense", "City", TRUE + "UnitClass", "RiverShip", "Local" + } +[effect_gibraltar_fortress_2] +type = "Defend_Bonus" +value = 25 +reqs = + { "type", "name", "range", "present" + "Building", "Gibraltar Fortress", "Player", TRUE + "Building", "Gibraltar Fortress", "City", FALSE + "Building", "Coastal Defense", "City", TRUE + "UnitClass", "Submarine", "Local" + } +[effect_gibraltar_fortress_trireme] +type = "Defend_Bonus" +value = 25 +reqs = + { "type", "name", "range", "present" + "Building", "Gibraltar Fortress", "Player", TRUE + "Building", "Gibraltar Fortress", "City", FALSE + "Building", "Coastal Defense", "City", TRUE + "UnitClass", "Trireme", "Local" + } +[effect_gibraltar_fortress_coastal_defense_discount] +type = "Building_Build_Cost_Pct" +value = -23 ; 15 shields. 65-15 = 50. +reqs = + { "type", "name", "range", "present" + "Building", "Gibraltar Fortress", "Player", TRUE + "Building", "Coastal Defense", "Local", TRUE + } +;Waiting on an Effect which can compare or inject range value. +;[effect_building_upkeep_gibratalar_fortress] +;type = "Upkeep_Reduce" +;value = 1 +;reqs = +; { "type", "name", "range" +; "Building", "Gibraltar Fortress", "Player" +; "Building", "Coastal Defense", "Local" +; } +;------------------------------------------------------------ + +[effect_amphitheatre] +type = "Make_Content" +value = 3 +reqs = + { "type", "name", "range" + "Building", "Amphitheatre", "City" + } + +[effect_amphitheatre_1] +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range" + "Tech", "Electricity", "Player" + "Building", "Amphitheatre", "City" + } + +; BECAUSE OF ROUNDING, AVERAGE EFFECT OF 50 ENDS UP BEING 41%, WHEREAS 60 YIELDS ABOUT 53% WHICH IS CLOSER TO ADVERTISED +[effect_courthouse_corruption1] +type = "Output_Waste_Pct" +value = 60 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "OutputType", "Trade", "Local", TRUE + } +; Removes output penalties (Despotism/Anarchy) for cities with courthouses +[effect_courthouse_tile_corruption] +type = "Output_Penalty_Tile" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Courthouse", "City" + } +[effect_courthouse] +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range" +; "Gov", "Democracy", "Player" ; all govs get it, Democracy doesn't need an exclusive buff here. + "Building", "Courthouse", "City" + } +[effect_courthouse_incite_cost_occupied] +type = "Incite_Cost_Pct" +value = 300 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "MaxUnitsOnTile", "0", "Local", FALSE + } +[effect_courthouse_incite_cost_empty] +type = "Incite_Cost_Pct" +value = 100 +reqs = + { "type", "name", "range", "present" + "MaxUnitsOnTile", "0", "Local", TRUE + "Building", "Courthouse", "City", TRUE + } +; Law and order provides +1 upkeep +[effect_courthouse_upkeep] +type = "Unit_Upkeep_Free_Per_City" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Courthouse", "City" + "OutputType", "Shield", "Local" + } +[effect_courthouse_spy_resistance] +type = "Spy_Resistant" +value = 25 ;25% reduction of 50% base chance is 12.5% bonus. 50%-12.5%=37.5% success rate + ; No protection= 1/2, HL = 3/8, CH+HL = 1/4, CH+HL+PS = 1/8 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + } +[effect_courthouse_hostile_diplomat0] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Action", "Steal Tech", "Local", TRUE + } +[effect_courthouse_hostile_diplomat_1] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Action", "Steal Tech Escape Expected", "Local", TRUE + } +[effect_courthouse_hostile_diplomat_2] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Action", "Targeted Steal Tech", "Local", TRUE + } +[effect_courthouse_hostile_diplomat_3] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE + } +[effect_courthouse_hostile_diplomat_4] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Action", "Sabotage City", "Local", TRUE + } +[effect_courthouse_hostile_diplomat_5] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Action", "Sabotage City Escape", "Local", TRUE + } +[effect_courthouse_hostile_diplomat_6] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Action", "Targeted Sabotage City", "Local", TRUE + } +[effect_courthouse_hostile_diplomat_7] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Action", "Targeted Sabotage City Escape", "Local", TRUE + } +[effect_courthouse_hostile_diplomat_8] +type = "Action_Odds_Pct" +value = -25 ;40 minus 25%*80 = 20% +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Action", "Steal Maps Escape", "Local", TRUE + } +[effect_courthouse_hostile_diplomat_9] +type = "Action_Odds_Pct" +value = -25 ;40 minus 25%*80 = 20% +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Action", "Steal Maps", "Local", TRUE + } +[effect_courthouse_hostile_diplomat_10] +type = "Action_Odds_Pct" +value = -25 ;40 minus 25%*80 = 20% +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Action", "Poison City Escape", "Local", TRUE + } +[effect_courthouse_hostile_diplomat_11] +type = "Action_Odds_Pct" +value = -25 ;40 minus 25%*80 = 20% +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Action", "Incite City", "Local", TRUE + } +[effect_courthouse_hostile_diplomat_12] +type = "Action_Odds_Pct" +value = -25 ;40 minus 25%*80 = 20% +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Action", "Incite City Escape", "Local", TRUE + } + +[effect_diplomat_defense_fortress] +type = "Spy_Resistant" +value = 25 +reqs = + { "type", "name", "range" + "Extra", "Fortress", "Local" + } + +[effect_incite_cost_empty] +type = "Incite_Cost_Pct" +value = -50 +reqs = + { "type", "name", "range", "present" + "MaxUnitsOnTile", "0", "Local", TRUE + "Building", "Courthouse", "City", FALSE + "Building", "Supreme Court", "Player", FALSE + } + +[effect_factory] +type = "Output_Bonus" +value = 50 +reqs = + { "type", "name", "range", "present" + "Building", "Factory", "City", TRUE + "Building", "Hoover Dam", "City", FALSE ;counts as factory + "OutputType", "Shield", "Local", TRUE + } + +[effect_granary] +type = "Growth_Food" +value = 50 +reqs = + { "type", "name", "range" + "Building", "Granary", "City" + } + +[effect_harbour] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "TerrainClass", "Oceanic", "Local" + "Building", "Harbour", "City" + "OutputType", "Food", "Local" + } + +[effect_library] +type = "Output_Bonus" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Library", "City" + "OutputType", "Science", "Local" + } + +[effect_marketplace_gold] +type = "Output_Bonus" +value = 50 +reqs = + { "type", "name", "range" + "Building", "Marketplace", "City" + "OutputType", "Gold", "Local" + } +[effect_marketplace_luxury] +type = "Output_Bonus" +value = 50 +reqs = + { "type", "name", "range" + "Building", "Marketplace", "City" + "OutputType", "Luxury", "Local" + } +;Changes require changes to city_force_income_update() in city.js +[effect_marketplace_coinage] +type = "Coinage_Bonus_Pm" +value = 250; 250‰=25% +reqs = + { "type", "name", "range", "present" + "Building", "Marketplace", "City", TRUE + "Gov", "Communism", "Player", FALSE + } + +; No population pollution until certain techs researched +[effect_pollu_pop_base] +type = "Pollu_Pop_Pct_2" +value = -100 + +[effect_pollu_pop_automobile] +type = "Pollu_Pop_Pct_2" +value = 25 +reqs = + { "type", "name", "range" + "Tech", "Automobile", "Player" + } +[effect_pollu_pop_industrialization] +type = "Pollu_Pop_Pct_2" +value = 25 +reqs = + { "type", "name", "range" + "Tech", "Industrialization", "Player" + } +[effect_pollu_pop_mass_production] +type = "Pollu_Pop_Pct_2" +value = 25 +reqs = + { "type", "name", "range" + "Tech", "Mass Production", "Player" + } +[effect_pollu_pop_plastics] +type = "Pollu_Pop_Pct_2" +value = 25 +reqs = + { "type", "name", "range" + "Tech", "Plastics", "Player" + } +[effect_enviromentalism] +type = "Pollu_Pop_Pct_2" +value = -50 +reqs = + { "type", "name", "range" + "Tech", "Environmentalism", "Player" + } +[effect_mass_transit] +type = "Pollu_Pop_Pct" +value = -100 +reqs = + { "type", "name", "range" + "Building", "Mass Transit", "City" + } +; Increased citizen mobility and ticket revenues increase city base trade by +2 +[effect_mass_transit_1] +type = "Output_Add_Tile" +value = 2 +reqs = + { "type", "name", "range" + "Building", "Mass Transit", "City" + "CityTile", "Center", "Local" + "OutputType", "Trade", "Local" + } + +[effect_mfg_plant] +type = "Output_Bonus" +value = 50 +reqs = + { "type", "name", "range", "present" + "Building", "Mfg. Plant", "City", TRUE + "Building", "Hoover Dam", "City", FALSE + "OutputType", "Shield", "Local", TRUE + } + +[effect_offshore_platform] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "TerrainClass", "Oceanic", "Local" + "Building", "Offshore Platform", "City" + "OutputType", "Shield", "Local" + } + +;Having a Palace means having a city, the beginning of +;sedentary culture and loss of game-start move bonus. +[effect_sedentary_people_are_slow] +type = "Move_Bonus" +value = 3 +reqs = + { + "type", "name", "range", "present" + "Building", "Palace", "Player", FALSE + "UnitClass", "Land", "Local", TRUE + } +[effect_palace_capital] +type = "Capital_City" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Palace", "City" + } +[effect_palace_gov_center] +type = "Gov_Center" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Palace", "City" + } +[effect_palace_corruption_reduction] +type = "Output_Waste_Pct" +value = 60 +reqs = + { "type", "name", "range" + "Building", "Palace", "City" + "OutputType", "Trade", "Local" + } +[effect_palace_sabotage] +type = "Building_Saboteur_Resistant" +value = 50 +reqs = + { "type", "name", "range" + "Building", "Palace", "City" + } +[effect_palace_spy_resistant] +type = "Spy_Resistant" +value = 50 +reqs = + { "type", "name", "range" + "Building", "Palace", "City" + } +[effect_palace_happy] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Palace", "City" + } +[effect_palace_despotism] +type = "Output_Bonus" +value = 75 +reqs = + { "type", "name", "range", "present" + "Gov", "Despotism", "Player", TRUE + "Building", "Palace", "City", TRUE + "Building", "Ziggurat", "Player", FALSE + "OutputType", "Shield", "Local", TRUE + } +[effect_palace_monarchy] +type = "Output_Bonus" +value = 50 +reqs = + { "type", "name", "range" + "Gov", "Monarchy", "Player" + "Building", "Palace", "City" + "OutputType", "Shield", "Local" + } +[effect_palace_theocracy] +type = "Output_Bonus" +value = 50 +reqs = + { "type", "name", "range", "present", "quiet" + "Gov", "Theocracy", "Player", TRUE, TRUE + "Building", "Palace", "City", TRUE, FALSE + "OutputType", "Gold", "Local", TRUE, FALSE + } +[effect_palace_communism] +type = "Output_Bonus" +value = 25 +reqs = + { "type", "name", "range" + "Gov", "Communism", "Player" + "Building", "Palace", "City" + "OutputType", "Shield", "Local" + } +[effect_palace_nationalism] +type = "Output_Bonus" +value = 15 +reqs = + { "type", "name", "range", "present" + "Gov", "Nationalism", "Player" + "Building", "Palace", "City" + "OutputType", "Shield", "Local" + } + +[effect_ecclesiastical_palace] +type = "Output_Waste_Pct" +value = 60 +reqs = + { "type", "name", "range", "present" + "Building", "Ecclesiastical Palace", "City", TRUE + "OutputType", "Trade", "Local", TRUE + } +[effect_ecclesiastical_palace_2] +type = "Spy_Resistant" +value = 50 +reqs = + { "type", "name", "range", "present" + "Building", "Ecclesiastical Palace", "City", TRUE + } +[effect_ecclestiastical_palace_3] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Ecclesiastical Palace", "City" + } +[effect_ecclesiastical_palace_4] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Ecclesiastical Palace", "City", TRUE + "UnitType", "Zealots", "Local", TRUE + } +[effect_ecclesiastical_palace_gov_center] +type = "Gov_Center" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Ecclesiastical Palace", "City", TRUE + "Building", "Palace", "City", FALSE + } +[effect_ecclesiastical_palace_despotism] +type = "Output_Bonus" +value = 75 +reqs = + { "type", "name", "range", "present", "quiet" + "Gov", "Despotism", "Player", TRUE, TRUE + "Building", "Ecclesiastical Palace", "City", TRUE, FALSE + "OutputType", "Gold", "Local", TRUE, FALSE + } +[effect_ecclesiastical_palace_monarchy] +type = "Output_Bonus" +value = 50 +reqs = + { "type", "name", "range", "present", "quiet" + "Gov", "Monarchy", "Player", TRUE, TRUE + "Building", "Ecclesiastical Palace", "City", TRUE, FALSE + "OutputType", "Gold", "Local", TRUE, FALSE + } +[effect_ecclesiastical_palace_theocracy] +type = "Output_Bonus" +value = 50 +reqs = + { "type", "name", "range", "present", "quiet" + "Gov", "Theocracy", "Player", TRUE, TRUE + "Building", "Ecclesiastical Palace", "City", TRUE, FALSE + "OutputType", "Gold", "Local", TRUE, FALSE + } +[effect_ecclesiastical_palace_communism] +type = "Output_Bonus" +value = 25 +reqs = + { "type", "name", "range", "present", "quiet" + "Gov", "Communism", "Player", TRUE, TRUE + "Building", "Ecclesiastical Palace", "City", TRUE, FALSE + "OutputType", "Gold", "Local", TRUE, FALSE + } +[effect_ecclesiastical_palace_nationalism] +type = "Output_Bonus" +value = 15 +reqs = + { "type", "name", "range", "present", "quiet" + "Gov", "Nationalism", "Player", TRUE, TRUE + "Building", "Ecclesiastical Palace", "City", TRUE, FALSE + "OutputType", "Gold", "Local", TRUE, FALSE + } + +[effect_ecclesiastical_palace_culture] +type = "History" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Ecclesiastical Palace", "City", TRUE + } +[effect_ecclesiastical_palace_2_sabotage] +type = "Building_Saboteur_Resistant" +value = 50 +reqs = + { "type", "name", "range" + "Building", "Ecclesiastical Palace", "City" + } + +[effect_police_station_base_level_all_govs] +type = "Make_Content_Mil" +value = 2 ; handles foreign nationals for every gov. +reqs = + { "type", "name", "range", "present" + "Building", "Police Station", "City", TRUE + } +[effect_police_station_1] +type = "Make_Content_Mil" +value = 2 ; 2+2 = 4 +reqs = + { "type", "name", "range", "present" + "Gov", "Democracy", "Player", TRUE + "Building", "Police Station", "City", TRUE + } +[effect_police_station_nationalism] +type = "Make_Content_Mil" +value = 1 ; 2+1 = 3 effect for police station +reqs = + { "type", "name", "range", "present" + "Building", "Police Station", "City", TRUE + "Gov", "Nationalism", "Player", TRUE + } +[effect_police_station_vet_diplo] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Police Station", "City", TRUE + "UnitFlag", "NoVeteran", "Local", FALSE + "UnitFlag", "Diplomat", "Local", TRUE + } +[effect_police_station_spy_resistant] +type = "Spy_Resistant" +value = 25 ; 25% of 50% = -12.5% 4/8-1/8 = 3/8 +reqs = + { "type", "name", "range", "present" + "Building", "Police Station", "City", TRUE + } +[effect_police_station_hostile_diplomat_0] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Police Station", "City", TRUE + "Action", "Steal Tech", "Local", TRUE + } +[effect_police_station_hostile_diplomat_1] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Police Station", "City", TRUE + "Action", "Steal Tech Escape Expected", "Local", TRUE + } +[effect_police_station_hostile_diplomat_2] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Police Station", "City", TRUE + "Action", "Targeted Steal Tech", "Local", TRUE + } +[effect_police_station_hostile_diplomat_3] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Police Station", "City", TRUE + "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE + } +[effect_police_station_hostile_diplomat_4] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Police Station", "City", TRUE + "Action", "Sabotage City", "Local", TRUE + } +[effect_police_station_hostile_diplomat_5] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Police Station", "City", TRUE + "Action", "Sabotage City Escape", "Local", TRUE + } +[effect_police_station_hostile_diplomat_6] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Police Station", "City", TRUE + "Action", "Targeted Sabotage City", "Local", TRUE + } +[effect_police_station_hostile_diplomat_7] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Police Station", "City", TRUE + "Action", "Targeted Sabotage City Escape", "Local", TRUE + } +[effect_police_station_hostile_diplomat_8] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Police Station", "City", TRUE + "Action", "Steal Maps Escape", "Local", TRUE + } +[effect_police_station_hostile_diplomat_9] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Police Station", "City", TRUE + "Action", "Steal Maps", "Local", TRUE + } +[effect_police_station_hostile_diplomat_10] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Police Station", "City", TRUE + "Action", "Poison City Escape", "Local", TRUE + } +[effect_police_station_hostile_diplomat_11] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Police Station", "City", TRUE + "Action", "Incite City", "Local", TRUE + } +[effect_police_station_hostile_diplomat_12] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Police Station", "City", TRUE + "Action", "Incite City Escape", "Local", TRUE + } +[effect_police_station_investigate_resistance] +type = "Action_Odds_Pct" +value = -54 ; +7% - 54% = -47% ... -0.47 * 80 = 37.6% ... 80%-37.6% = 42.4% ... (85%/2 = 42.5%) ✓ +reqs = + { "type", "name", "range", "present" + "Building", "Police Station", "City", TRUE + "Action", "Investigate City", "Local", TRUE + "UnitType", "Satellite", "Local", FALSE + } +;Cancel out the above bonus for democracies: +[effect_police_station_investigate_democracy] +type = "Action_Resist_Pct" +value = -54 ; +7% - 54% = -47% ... -0.47 * 80 = 37.6% ... 80%-37.6% = 42.4% ... (85%/2 = 42.5%) ✓ +reqs = + { "type", "name", "range" + "Building", "Police Station", "City" + "Gov", "Democracy", "Player" ;Action_Resist_Pct uses target player. + "Action", "Investigate City", "Local" + "UnitType", "Satellite", "Local", FALSE + } + +[effect_port_facility] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Port Facility", "City", TRUE + "UnitClass", "Sea", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_port_facility_a] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Port Facility", "City", TRUE + "UnitClass", "RiverShip", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_port_facility_b] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Port Facility", "City", TRUE + "UnitClass", "Submarine", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_port_facility_1] +type = "HP_Regen" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Port Facility", "City" + "UnitClass", "Sea", "Local" + } +[effect_port_facility_1a] +type = "HP_Regen" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Port Facility", "City" + "UnitClass", "RiverShip", "Local" + } +[effect_port_facility_1b] +type = "HP_Regen" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Port Facility", "City" + "UnitClass", "Submarine", "Local" + } +[effect_port_facility_trireme] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Port Facility", "City", TRUE + "UnitClass", "Trireme", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_port_facility_trireme_1] +type = "HP_Regen" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Port Facility", "City" + "UnitClass", "Trireme", "Local" + } +;************************************************************************** POWER PLANTS +[effect_coal_plant] +type = "Output_Bonus" +value = 20 +reqs = + { "type", "name", "range", "present" + "Building", "Factory", "City", TRUE + "Building", "Coal Plant", "City", TRUE + "OutputType", "Shield", "Local", TRUE + "Building", "Nuclear Plant", "City", FALSE + "Building", "Hydro Plant", "City", FALSE + "Building", "Hoover Dam", "City", FALSE + "Building", "Fusion Reactor", "Player", FALSE + } +[effect_coal_plant_1] +type = "Output_Bonus" +value = 20 +reqs = + { "type", "name", "range", "present" + "Building", "Mfg. Plant", "City", TRUE + "Building", "Coal Plant", "City", TRUE + "OutputType", "Shield", "Local", TRUE + "Building", "Nuclear Plant", "City", FALSE + "Building", "Hydro Plant", "City", FALSE + "Building", "Hoover Dam", "City", FALSE + "Building", "Fusion Reactor", "Player", FALSE + } +[effect_coal_plant_upgrade_1] +type = "Improvement_Sale_Pct" +value = 70 ; full 'recycle value' after City Walls go up. +reqs = + { "type", "name", "range" + "Building", "Coal Plant", "Local" + "Building", "Hoover Dam", "City" + } +[effect_coal_plant_upgrade_2] +type = "Improvement_Sale_Pct" +value = 70 ; full 'recycle value' after City Walls go up. +reqs = + { "type", "name", "range" + "Building", "Coal Plant", "Local" + "Building", "Hydro Plant", "City" + } +[effect_coal_plant_upgrade_3] +type = "Improvement_Sale_Pct" +value = 70 ; full 'recycle value' after City Walls go up. +reqs = + { "type", "name", "range","present" + "Building", "Coal Plant", "Local", TRUE + "Building", "Nuclear Plant", "City", TRUE + "Building", "Hydro Plant", "City", FALSE + ;^ closes super rare loophole + } +;--------------------------------------------------------- +[effect_hydro_plant] +type = "Output_Bonus" +value = 20 +reqs = + { "type", "name", "range", "present" + "Building", "Factory", "City", TRUE + "Building", "Hydro Plant", "City", TRUE + "OutputType","Shield", "Local", TRUE + "Building", "Nuclear Plant", "City", FALSE + "Building", "Hoover Dam", "City", FALSE + "Building", "Fusion Reactor", "Player", FALSE + } +[effect_hydro_plant_1] +type = "Output_Bonus" +value = 20 +reqs = + { "type", "name", "range", "present" + "Building", "Mfg. Plant", "City", TRUE + "Building", "Hydro Plant", "City", TRUE + "OutputType","Shield", "Local", TRUE + "Building", "Nuclear Plant", "City", FALSE + "Building", "Hoover Dam", "City", FALSE + "Building", "Fusion Reactor","Player", FALSE + } +[effect_hydro_plant_2] +type = "Pollu_Prod_Pct" +value = -25 +reqs = + { "type", "name", "range", "present" + "Building", "Factory", "City", TRUE + "Building", "Hydro Plant", "City", TRUE + "Building", "Recycling Center", "City", FALSE + "Building", "Fusion Reactor", "Player",FALSE + "Building", "Solar Plant", "City", FALSE + "Building", "Hoover Dam", "City", FALSE + "Building", "Nuclear Plant", "City", FALSE + } +[effect_hydro_plant_3] +type = "Pollu_Prod_Pct" +value = -25 +reqs = + { "type", "name", "range", "present" + "Building", "Mfg. Plant", "City", TRUE + "Building", "Hydro Plant", "City", TRUE + "Building", "Recycling Center", "City", FALSE + "Building", "Fusion Reactor", "Player",FALSE + "Building", "Solar Plant", "City", FALSE + "Building", "Hoover Dam", "City", FALSE + "Building", "Nuclear Plant", "City", FALSE + } +;--------------------------------------------------------- +[effect_hoover_dam_city_1] +type = "Output_Bonus" +value = 154 +reqs = + { "type", "name", "range" + "Building", "Hoover Dam", "City" + "OutputType", "Shield", "Local" + } +[effect_hoover_dam_city_2] +type = "Pollu_Prod_Pct" ;-25 for factory, -25 for mfg_plant +value = -50 +reqs = + { "type", "name", "range", "present" + "Building", "Hoover Dam", "City", TRUE + "Building", "Recycling Center","City", FALSE + "Building", "Solar Plant", "City", FALSE + "Building", "Fusion Reactor", "Player", FALSE + } +[effect_hoover_dam_city_3] +type = "Pollu_Prod_Pct" ;-25 for factory, -25 for mfg_plant +value = -80 +reqs = + { "type", "name", "range", "present" + "Building", "Hoover Dam", "City", TRUE + "Building", "Fusion Reactor", "Player", TRUE + } +; _ _ _ Bonuses for Hydro Plants in other cities: _ _ _ +[effect_hoover_hydro_plant_bonus_1] +type = "Output_Bonus" +value = 7 +reqs = + { "type", "name", "range", "present" + "Building", "Hoover Dam", "Player", TRUE + "Building", "Hoover Dam", "City", FALSE + "Building", "Factory", "City", TRUE + "Building", "Hydro Plant", "City", TRUE + "OutputType","Shield", "Local", TRUE + "Building", "Nuclear Plant", "City", FALSE + "Building", "Fusion Reactor", "Player", FALSE + } +[effect_hoover_hydro_plant_bonus_2] +type = "Output_Bonus" +value = 7 +reqs = + { "type", "name", "range", "present" + "Building", "Hoover Dam", "Player", TRUE + "Building", "Hoover Dam", "City", FALSE + "Building", "Mfg. Plant", "City", TRUE + "Building", "Hydro Plant", "City", TRUE + "OutputType","Shield", "Local", TRUE + "Building", "Nuclear Plant", "City", FALSE + "Building", "Fusion Reactor","Player", FALSE + } +;Hydro Plants cost less +[effect_hoover_dam_cheaper_hydro_plants] +type = "Building_Build_Cost_Pm" +value = -28; -0.028 * 175 = -4.9 shields (c rounds negative numbers to lower (more magnitude) value) +reqs = + { "type", "name", "range", "present" + "Building", "Hoover Dam" , "Player", TRUE + "Building", "Hydro Plant", "Local", TRUE + } +[effect_hoover_city_build_slots] +type = "City_Build_Slots" +value = 2 ; counts as Factory + Mfg.Plant in its city +reqs = + { "type", "name", "range", "present" + "Tech", "Conscription", "Player", TRUE + "Building", "Hoover Dam", "City", TRUE + } +;Waiting on an Effect which can compare or inject range value. +;[effect_hoover_hydro_upkeep] +;type = "Upkeep_Reduce" +;value = 1 +;reqs = +; { "type", "name", "range", "present" +; "Building", "Hoover Dam", "Player", TRUE +; "Building", "Hydro Plant", "Local", TRUE +; } +;--------------------------------------------------------- +[effect_nuclear_plant] +type = "Output_Bonus" +value = 30 +reqs = + { "type", "name", "range", "present" + "Building", "Factory", "City", TRUE + "Building", "Nuclear Plant", "City", TRUE + "OutputType", "Shield", "Local", TRUE + "Building", "Hoover Dam", "City", FALSE + "Building", "Fusion Reactor","Player", FALSE + } +[effect_nuclear_plant_1] +type = "Output_Bonus" +value = 30 +reqs = + { "type", "name", "range", "present" + "Building", "Mfg. Plant", "City", TRUE + "Building", "Nuclear Plant", "City", TRUE + "OutputType","Shield", "Local", TRUE + "Building", "Fusion Reactor", "Player", FALSE + "Building", "Hoover Dam", "City", FALSE + } +[effect_nuclear_plant_2] +type = "Pollu_Prod_Pct" +value = -25 +reqs = + { "type", "name", "range", "present" + "Building", "Factory", "City", TRUE + "Building", "Nuclear Plant", "City", TRUE + "Building", "Recycling Center", "City", FALSE + "Building", "Fusion Reactor", "Player", FALSE + "Building", "Hoover Dam", "City", FALSE + "Building", "Solar Plant", "City", FALSE + } +[effect_nuclear_plant_3] +type = "Pollu_Prod_Pct" +value = -25 +reqs = + { "type", "name", "range", "present" + "Building", "Mfg. Plant", "City", TRUE + "Building", "Nuclear Plant", "City", TRUE + "Building", "Recycling Center", "City", FALSE + "Building", "Fusion Reactor", "Player", FALSE + "Building", "Hoover Dam", "City", FALSE + "Building", "Solar Plant", "City", FALSE + } +;--------------------------------------------------------- +[effect_fusion_reactor] +type = "Output_Bonus" +value = 40 +reqs = + { "type", "name", "range", "present" + "Building", "Fusion Reactor", "Player", TRUE + "Building", "Factory", "City", TRUE + "OutputType", "Shield", "Local", TRUE + } +[effect_fusion_reactor_1] +type = "Output_Bonus" +value = 40 +reqs = + { "type", "name", "range", "present" + "Building", "Fusion Reactor", "Player", TRUE + "Building", "Mfg. Plant", "City", TRUE + "OutputType", "Shield", "Local", TRUE + } +[effect_fusion_reactor_1a_hoover] +type = "Output_Bonus" +value = 80 +reqs = + { "type", "name", "range", "present" + "Building", "Fusion Reactor", "Player", TRUE + "Building", "Hoover Dam", "City", TRUE + "Building", "Mfg. Plant", "City", FALSE + "Building", "Factory", "City", FALSE + "OutputType", "Shield", "Local", TRUE + } +[effect_fusion_reactor_2] +type = "Pollu_Prod_Pct" +value = -80 +reqs = + { "type", "name", "range", "present" + "Building", "Factory", "City", TRUE + "Building", "Fusion Reactor", "Player", TRUE + } +[effect_fusion_reactor_3] +type = "Unit_Upkeep_Free_Per_City" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Fusion Reactor", "Player" + "OutputType", "Shield", "Local" + } +[effect_fusion_reactor_4] +type = "City_Build_Slots" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Fusion Reactor", "Player" + } +;--------------------------------------------------------- +[effect_solar_plant] +type = "Output_Bonus" +value = 20 +reqs = + { "type", "name", "range" + "Building", "Factory", "City" + "Building", "Solar Plant", "City" + "OutputType", "Shield", "Local" + } +[effect_solar_plant_pollution_1] +type = "Pollu_Prod_Pct" +value = -75 +reqs = + { "type", "name", "range", "present" + "Building", "Solar Plant", "City", TRUE + ;80% from Fusion Reactor is greater than 75% from Solar. + "Building","Fusion Reactor","Player", FALSE + } +[effect_solar_plant_unit_upkeep] +type = "Unit_Upkeep_Free_Per_City" +value = 2 + reqs = + { "type", "name", "range" + "Building", "Solar Plant", "City" + "OutputType", "Shield", "Local" + } +[effect_solar_plant_culture] +type = "History" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Solar Plant", "City" + } +;--------------------------------------------------------- +[effect_wind_plant] +type = "Output_Bonus" +value = 5 +reqs = + { "type", "name", "range" + "Building", "Wind Plant", "City" + "OutputType", "Shield", "Local" + } +[effect_wind_plant_pollution] +type = "Pollu_Prod_Pct" +value = -10 +reqs = + { "type", "name", "range" + "Building", "Wind Plant", "City" + } +[effect_wind_plant_unit_upkeep] +type = "Unit_Upkeep_Free_Per_City" +value = 2 + reqs = + { "type", "name", "range" + "Building", "Solar Plant", "City" + "OutputType", "Shield", "Local" + } +;********************************************************************** RECYCLING CENTER +; All pollution bonus effects are layered in Power Plants with nice +; clean logic: each lower ones turn its effect off for better ones +; to take effect, all the way to the top. Finally we arrive at +; Recycling Center which has to do the heavy lifting on special +; combination rules of the ruleset: +; .... +; A Solar Plant combines with Recycling Center to eliminate 90% +; pollution. A Fusion Reactor saves 80% instead of 66%, in which case +; we prefer the Fuction Reactor's bonus. A Fusion reactor supersedes +; the Solar Plant's 75% bonus but doesn't get the combination bonus, so +; has to "unsupersede" in the case of Recycling and Solar both present: +; .... +; Case 1: neither SP or FR is present. Highest in food chain, full 66%: +[effect_recycling_center_1] +type = "Pollu_Prod_Pct" +value = -66 +reqs = + { "type", "name", "range", "present" + "Building", "Recycling Center", "City", TRUE + "Building", "Fusion Reactor", "Player", FALSE + "Building", "Solar Plant", "City", FALSE + } +; Case 2: SP is present, FR is absent. Second highest in food chain, +; and obligation to deliver on the 90% reduction effect: +[effect_recycling_center_2] +type = "Pollu_Prod_Pct" +value = -15 ; Solar is higher and ACTIVE at -75%. -15 = -90%. +reqs = + { "type", "name", "range", "present" + "Building", "Recycling Center", "City", TRUE + "Building", "Fusion Reactor", "Player", FALSE + "Building", "Solar Plant", "City", TRUE + } +; Case 3: SP and Fusion Reactor both present and higher on food chain. +; Solar Plant "wakes up" from being superseded by Fusion Reactor to +; deliver its promised 90% combinatorial bonus with Recycling Center: +[effect_recycling_center_3] +type = "Pollu_Prod_Pct" +value = -10 ; Fusion reactor superseded to -80%. -10 = -90% +reqs = + { "type", "name", "range", "present" + "Building", "Recycling Center", "City", TRUE + "Building", "Fusion Reactor", "Player", TRUE + "Building", "Solar Plant", "City", TRUE + } +; Case 4: SP absent and Fusion Reactor present +; Fusion reactor is superceding Recycling Center: +; DO NOTHING +; .... +; Raw materials generated from Recycling add +2 base shields to city production. +[effect_recycling_center_4] +type = "Output_Add_Tile" +value = 2 +reqs = + { "type", "name", "range" + "Building", "Recycling Center", "City" + "CityTile", "Center", "Local" + "OutputType", "Shield", "Local" + } +[effect_recycling_center_5] +type = "Upgrade_Price_Pct" +value = -20 +reqs = + { "type", "name", "range" + "Tech", "Recycling", "Player" + } + +[effect_research_lab] +type = "Output_Bonus" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Library", "City" + "Building", "Research Lab", "City" + "OutputType", "Science", "Local" + } +[effect_research_lab_1] +type = "Output_Bonus" +value = 100 +reqs = + { "type", "name", "range" + "Building", "University", "City" + "Building", "Research Lab", "City" + "OutputType", "Science", "Local" + } + +[effect_sam_battery] +type = "Defend_Bonus" +value = 100 +reqs = + { "type", "name", "range", "present" + "Building", "SAM Battery", "City", TRUE + "UnitClass", "Air", "Local", TRUE + "UnitType", "Stealth Bomber", "Local", FALSE + } +[effect_sam_battery_1] +type = "Defend_Bonus" +value = 100 +reqs = + { "type", "name", "range", "present" + "Building", "SAM Battery", "City", TRUE + "UnitClass", "AirProtect", "Local", TRUE + "UnitType", "Stealth Fighter", "Local", FALSE + } +[effect_sam_battery_2] +type = "Defend_Bonus" +value = 100 +reqs = + { "type", "name", "range" + "Building", "SAM Battery", "City" + "UnitClass", "Air_High_Altitude", "Local" + } +[effect_sam_battery_3] +type = "Defend_Bonus" +value = 100 +reqs = + { "type", "name", "range" + "Building", "SAM Battery", "City" + "UnitClass", "Helicopter", "Local" + } +[effect_sam_battery_stealth_bomber] +type = "Defend_Bonus" +value = 25 +reqs = + { "type", "name", "range", "present" + "Building", "SAM Battery", "City", TRUE + "UnitType", "Stealth Bomber", "Local", TRUE + } +[effect_sam_battery_stealth_fighter] +type = "Defend_Bonus" +value = 25 +reqs = + { "type", "name", "range", "present" + "Building", "SAM Battery", "City", TRUE + "UnitType", "Stealth Fighter", "Local", TRUE + } + +[effect_sdi_defense] +type = "Nuke_Proof" +value = 100 +reqs = + { "type", "name", "range", "present" + "Building", "SDI Defense", "City", TRUE + "DiplRel", "Foreign", "Local", TRUE + "DiplRel", "Team", "Local", FALSE + } +[effect_sdi_defense_1] +type = "Defend_Bonus" +value = 100 +reqs = + { "type", "name", "range" + "Building", "SDI Defense", "City" + "UnitClass", "Missile", "Local" + } + +[effect_sewer_system] +type = "Size_Unlimit" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Aqueduct", "City" + "Building", "Sewer System", "City" + } +[effect_sewer_system_health] +type = "Health_Pct" +value = 30 +reqs = + { "type", "name", "range" + "Building", "Aqueduct", "City" + "Building", "Sewer System", "City" + } + +[effect_space_component] +type = "SS_Component" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Space Component", "City" + } + +[effect_space_module] +type = "SS_Module" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Space Module", "City" + } + +[effect_space_structural] +type = "SS_Structural" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Space Structural", "City" + } + +;Timeline is already way behind and too slow, REMOVE: +;[effect_plastics_slowdown] +;type = "Slow_Down_Timeline" +;value = 1 +;reqs = +; { "type", "name", "range", "survives" +; "Tech", "Plastics", "World", TRUE +; } + +;[effect_superconductor_slowdown] +;type = "Slow_Down_Timeline" +;value = 1 +;reqs = +; { "type", "name", "range", "survives" +; "Tech", "Superconductors", "World", TRUE +; } +;1 year per turn ensures spaceship travel time calibrated. +;this can be removed after game.info.spacerace bug of not changing +;timeline gets fixed in server. +[effect_spaceflight_slowdown] +type = "Turn_Years" +value = 1 +reqs = + { "type", "name", "range", "survives" + "Tech", "Space Flight", "World", TRUE + } + +[effect_stock_exchange_gold] +type = "Output_Bonus" +value = 50 +reqs = + { "type", "name", "range" + "Building", "Bank", "City" + "Building", "Stock Exchange", "City" + "OutputType", "Gold", "Local" + } +[effect_stock_exchange_luxury] +type = "Output_Bonus" +value = 50 +reqs = + { "type", "name", "range" + "Building", "Bank", "City" + "Building", "Stock Exchange", "City" + "OutputType", "Luxury", "Local" + } +;Changes require changes to city_force_income_update() in city.js +[effect_stock_exchange_coinage] +type = "Coinage_Bonus_Pm" +value = 250 ; 250‰ = 25% +reqs = + { "type", "name", "range","present" + "Building", "Marketplace", "City", TRUE + "Building", "Bank", "City", TRUE + "Building", "Stock Exchange", "City", TRUE + "Gov", "Communism", "Player",FALSE + "Tech", "The Corporation","Player",TRUE + } + +[effect_super_highways] +type = "Output_Per_Tile" +value = 50 +reqs = + { "type", "name", "range" + "Extra", "Road", "Local" + "Building", "Super Highways", "City" + "OutputType", "Trade", "Local" + } + +; Super Highways increase logistical efficiency to +; get more use out of an airport in size 12+ city. +[effect_super_highways_airlift_facilitation] +type = "Airlift" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Super Highways", "City" + "Building", "Airport", "City" + "Building", "Sewer System", "City" + } + +[effect_mine] +type = "Mining_Pct" +value = 100 +reqs = + { "type", "name", "range" + "Extra", "Mine", "Local" + } + +[effect_oil_well] +type = "Mining_Pct" +value = 100 +reqs = + { "type", "name", "range" + "Extra", "Oil Well", "Local" + } + +[effect_irrigation] +type = "Irrigation_Pct" +value = 100 +reqs = + { "type", "name", "range" + "Extra", "Irrigation", "Local" + } +; Desert with river (and no Oasis) gets 1 extra food from irrigation (total 2) +; ("Nile floods" effect) +[effect_irrigation_2] +type = "Irrigation_Pct" +value = 100 +reqs = + { "type", "name", "range", "present" + "Terrain", "Desert", "Local", TRUE + "Extra", "River", "Local", TRUE + "Extra", "Oasis", "Local", FALSE + "Extra", "Irrigation", "Local", TRUE + } +; ...same for city centers +[effect_irrigation_3] +type = "Irrigation_Pct" +value = 100 +reqs = + { "type", "name", "range", "present" + "Terrain", "Desert", "Local", TRUE + "Extra", "River", "Local", TRUE + "Extra", "Oasis", "Local", FALSE + "CityTile", "Center", "Local", TRUE +; "Extra", "Irrigation", "Local", FALSE + "TerrainAlter", "CanIrrigate", "Local", TRUE + "Extra", "Mine", "Local", FALSE + "Extra", "Oil Well", "Local", FALSE + } + +[effect_irrigation_center] +type = "Irrigation_Pct" +value = 100 +reqs = + { "type", "name", "range", "present" + "CityTile", "Center", "Local", TRUE + "Extra", "Irrigation", "Local", FALSE + "TerrainAlter", "CanIrrigate", "Local", TRUE + "Extra", "Mine", "Local", FALSE + "Extra", "Oil Well", "Local", FALSE + } + +[effect_supermarket] +type = "Output_Per_Tile" +value = 100 +reqs = + { "type", "name", "range" + "Extra", "Farmland", "Local" + "Building", "Supermarket", "City" + "OutputType", "Food", "Local" + } + +[effect_supermarket_center] +type = "Output_Per_Tile" +value = 50 +reqs = + { "type", "name", "range", "present" + "CityTile", "Center", "Local", TRUE + "Extra", "Farmland", "Local", FALSE + "TerrainAlter", "CanIrrigate", "Local", TRUE + "Building", "Supermarket", "City", TRUE + "OutputType", "Food", "Local", TRUE + "Extra", "Mine", "Local", FALSE + "Extra", "Oil Well", "Local", FALSE + } + +[effect_temple] +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Temple", "City" + } + +[effect_temple_1] +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range" + "Tech", "Mysticism", "Player" + "Building", "Temple", "City" + } + +[effect_totem_pole] +type = "Output_Add_Tile" +value = 2 +reqs = + { "type", "name", "range" + "Building", "Totem Pole", "City" + "CityTile", "Center", "Local" + "OutputType", "Luxury", "Local" + } + +[effect_university] +type = "Output_Bonus" +value = 150 +reqs = + { "type", "name", "range" + "Building", "Library", "City" + "Building", "University", "City" + "OutputType", "Science", "Local" + } +;********************************************************************************* VISION BONUSES (non-wonder) +[effect_telegraph_border_vision] +type = "Border_Vision" +value = 1 +reqs = + { "type", "name", "range" + "Tech", "Electricity", "Player" + } +; Air+Sea+LandAirSea CLASS units REQUIRE PHYSICS so their BONUS +; is in their stats to AVOID more [effect_] entries. +[effect_physics_vision] +type = "Unit_Vision_Radius_Sq" +value = 4 +reqs = + { "type", "name", "range" + "Tech", "Physics", "Player" + "UnitClass", "Land", "Local" + } +[effect_physics_vision_1] +type = "Unit_Vision_Radius_Sq" +value = 4 +reqs = + { "type", "name", "range" + "Tech", "Physics", "Player" + "UnitClass", "LandNoKill", "Local" + } +[effect_physics_vision_2] +type = "Unit_Vision_Radius_Sq" +value = 4 +reqs = + { "type", "name", "range" + "Tech", "Physics", "Player" + "UnitClass", "Trireme", "Local" + } +[effect_physics_vision_3] +type = "Unit_Vision_Radius_Sq" +value = 4 +reqs = + { "type", "name", "range" + "Tech", "Physics", "Player" + "UnitClass", "RiverShip", "Local" + } +[effect_satellite_vision] ;Vision benefit from satellite communication to land units +type = "Unit_Vision_Radius_Sq" +value = 7 +reqs = + { "type", "name", "range" + "Tech", "Space Flight", "Player" + "UnitClass", "Land", "Local" + } +[effect_satellite_vision_1] ;Vision benefit from satellite communication to land units (Marines) +type = "Unit_Vision_Radius_Sq" +value = 7 +reqs = + { "type", "name", "range" + "Tech", "Space Flight", "Player" + "UnitClass", "LandAirSea", "Local" + } +[effect_satellite_vision_2] ;Vision benefit from satellite communication to sea units +type = "Unit_Vision_Radius_Sq" +value = 7 +reqs = + { "type", "name", "range" + "Tech", "Space Flight", "Player" + "UnitClass", "Sea", "Local" + } +[effect_satellite_vision_2a] ;Vision benefit from satellite communication to sea units +type = "Unit_Vision_Radius_Sq" +value = 7 +reqs = + { "type", "name", "range" + "Tech", "Space Flight", "Player" + "UnitClass", "Submarine", "Local" + } +[effect_satellite_vision_3] ;Vision benefit from satellite communication to sea units +type = "Unit_Vision_Radius_Sq" +value = 7 +reqs = + { "type", "name", "range" + "Tech", "Space Flight", "Player" + "UnitClass", "Air", "Local" + } +[effect_satellite_vision_3a] ;Vision benefit from satellite communication to sea units +type = "Unit_Vision_Radius_Sq" +value = 7 +reqs = + { "type", "name", "range" + "Tech", "Space Flight", "Player" + "UnitClass", "AirProtect", "Local" + } +[effect_satellite_vision_4] ;Vision benefit from satellite communication to cities +type = "City_Vision_Radius_Sq" +value = 36 +reqs = + { "type", "name", "range" + "Tech", "Space Flight", "Player" + } +[effect_radar_vision] +type = "City_Vision_Radius_Sq" +value = 50 ;7 cardinal, 5 diagonal +reqs = + { "type", "name", "range" + "Tech", "Radar", "Player" + "Building", "Radar Tower", "City" + } +;[effect_radar_vision2] +;type = "Unit_Vision_Radius_Sq" +;value = 16 +;reqs = +; { "type", "name", "range", "present" +; "Extra", "Airbase", "tile", TRUE +; "Tech", "Radar", "Player", TRUE +; "MaxUnitsOnTile", "0", "Local", FALSE ;occupied base +; } +;------------------------------------------------------------- + +;********************************************************************************* MOVE BONUSES +[effect_airplane_range_1] +type = "Move_Bonus" +value = 18 +reqs = + { "type", "name", "range" + "Tech", "Radio", "Player" + "UnitType", "Airplane", "Local" + } +[effect_airplane_range_2] +type = "Move_Bonus" +value = 18 +reqs = + { "type", "name", "range" + "Tech", "Advanced Flight", "Player" + "UnitType", "Airplane", "Local" + } +[effect_airplane_range_3] +type = "Move_Bonus" +value = 18 +reqs = + { "type", "name", "range" + "Tech", "Radar", "Player" + "UnitType", "Airplane", "Local" + } +[effect_airplane_range_4] +type = "Move_Bonus" +value = 18 +reqs = + { "type", "name", "range" + "Tech", "Rocketry", "Player" + "UnitType", "Airplane", "Local" + } +[effect_airplane_range_5] +type = "Move_Bonus" +value = 18 +reqs = + { "type", "name", "range" + "Tech", "Space Flight", "Player" + "UnitType", "Airplane", "Local" + } +[effect_airplane_range_6] +type = "Move_Bonus" +value = 18 +reqs = + { "type", "name", "range" + "Tech", "Avionics", "Player" + "UnitType", "Airplane", "Local" + } + +[effect_rail_electricity] +type = "Move_Bonus" +value = 9 +reqs = + { "type", "name", "range" + "Tech", "Electricity", "Player" + "UnitClass", "LandRail", "Local" + } +[effect_rail_combustion] +type = "Move_Bonus" +value = 9 +reqs = + { "type", "name", "range" + "Tech", "Combustion", "Player" + "UnitClass", "LandRail", "Local" + } +;************************************************************************ Adam Smith +[effect_asmiths_trading_co] +type = "Upkeep_Free" +value = 1 +reqs = + { "type", "name", "range" + "Building", "A.Smith's Trading Co.", "Player" + } +;************************************************************************ Agoge of Sparta +[effect_agoge_move_bonus_1] +type = "Move_Bonus" +value = 3 +reqs = + { "type", "name", "range", "present" + "Building", "Agōgē of Sparta", "Player", TRUE + "UnitFlag", "FootSoldier", "Local", TRUE + } +[effect_agoge_move_bonus_2] +type = "Move_Bonus" +value = 6 ; 3/9 + 6/9 = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Agōgē of Sparta", "City", TRUE + "UnitFlag", "FootSoldier", "Local", TRUE + } +[effect_agoge_phalanx] +type = "Attack_Bonus" +value = 50 +reqs = + { "type", "name", "range", "present" + "Building", "Agōgē of Sparta", "Player", TRUE + "UnitType", "Phalanx", "Local", TRUE + } +[effect_agoge_pikemen] +type = "Attack_Bonus" +value = 50 +reqs = + { "type", "name", "range", "present" + "Building", "Agōgē of Sparta", "Player", TRUE + "UnitType", "Pikemen", "Local", TRUE + } +;************************************************************************ Angkor Wat +[effect_angkor_wat_free_tile_bonus_monarchy] ;free celebration tile output +type = "Output_Inc_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Angkor Wat", "Player" + "Gov", "Monarchy", "Player" + "OutputType", "Trade", "Local" + "MinSize", "3", "City" + } +[effect_angkor_wat_free_tile_bonus_despotism] ;free celebration tile output +type = "Output_Penalty_Tile" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Angkor Wat", "Player" + "Gov", "Despotism", "Player" + "MinSize", "3", "City" + } +[effect_angkor_wat_happy] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Angkor Wat", "Player", TRUE + "Gov", "Democracy", "Player", FALSE + "Gov", "Theocracy", "Player", FALSE + "Gov", "Communism", "Player", FALSE + "Gov", "Nationalism","Player", FALSE + } +[effect_angkor_wat_jungleswamp_all_work_bonus] +type = "Unit_Work_Pct" +value = 100 ; 100% faster is half the time (or more, since rounded up) +reqs = + { "type", "name", "range","present" + "Building", "Angkor Wat", "Player",TRUE + "Gov", "Democracy", "Player", FALSE + "Gov", "Theocracy", "Player", FALSE + "Gov", "Communism", "Player", FALSE + "Gov", "Nationalism", "Player", FALSE +; "Activity", "Irrigate", "Local", TRUE ; all work is 50% bonus + "UnitFlag", "Infra", "Local", TRUE + "Terrain", "Grassland", "Local", FALSE ; exclude everything but Swamp/Jungle. + "Terrain", "Plains", "Local", FALSE + "Terrain", "Desert", "Local", FALSE + "Terrain", "Tundra", "Local", FALSE + "Terrain", "Glacier", "Local", FALSE + "Terrain", "Forest", "Local", FALSE + "Terrain", "Hills", "Local", FALSE + "Terrain", "Mountains", "Local", FALSE + "Terrain", "Ocean", "Local", FALSE + "Terrain", "Deep Ocean", "Local", FALSE + } +[effect_angkor_wat_elephant_discount] +type = "Unit_Build_Cost_Pct" +value = -13 ; 36 - 5 = - 13% +reqs = + { + "type", "name", "range", "present" + "Building", "Angkor Wat", "Player", TRUE + "UnitType", "Elephants", "Local", TRUE + "Gov", "Democracy", "Player", FALSE + "Gov", "Theocracy", "Player", FALSE + "Gov", "Communism", "Player", FALSE + "Gov", "Nationalism", "Player", FALSE + } +[effect_angkor_wat_culture] +type = "History" +value = 2 +reqs = + { "type", "name", "range", "present" + "Building", "Angkor Wat", "City", TRUE + } +;************************************************************************ Apollo Program +[effect_apollo_program] +type = "Enable_Space" +value = 1 +reqs = + { "type", "name", "range", "survives" + "Building", "Apollo Program", "Player", TRUE + } +;************************************************************************ Appian Way +[effect_appian_ongoing_trade_bonus] +type = "Traderoute_Pct" +value = 25 ; trunc-rounding gives a (mean+median)/2 of +9.97% for routes pulling 1-9 revenue per turn; + ; approaches +25% as this goes higher but that is hard-limited by game-context +reqs = + { "type", "name", "range", "present" + "Building", "Appian Way", "Player", TRUE + } +[effect_appian_road_trade_bonus] +type = "Output_Inc_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Extra", "Road", "Local" + "Building", "Appian Way", "City" + "OutputType", "Trade", "Local" + } +[effect_appian_wagon_discount] +type = "Unit_Build_Cost_Pct" +value = -20 ; 25 - 5 = - 20% +reqs = + { + "type", "name", "range", "present" + "Building", "Appian Way", "City", TRUE + "UnitType", "Wagon", "Local", TRUE + "Tech", "Railroad", "Player", FALSE + } +[effect_appian_move_bonus_foot_soldier1] ; bonus for unclaimed territory +type = "Move_Bonus" +value = 3 +reqs = + { "type", "name", "range","present" + "Building", "Appian Way", "Player",TRUE + "UnitFlag", "FootSoldier", "Local", TRUE + "Extra", "Road", "Local", TRUE + "CityTile", "Claimed", "Local", FALSE + } +[effect_appian_move_bonus_foot_soldier2] ; bonus for national territory +type = "Move_Bonus" +value = 3 +reqs = + { "type", "name", "range","present" + "Building", "Appian Way", "Player",TRUE + "UnitFlag", "FootSoldier", "Local", TRUE + "Extra", "Road", "Local", TRUE + "UnitState", "OnDomesticTile","Local",TRUE + } +[effect_appian_move_bonus_chariot1] +type = "Move_Bonus" +value = 6 +reqs = + { "type", "name", "range", "present" + "Building", "Appian Way", "Player", TRUE + "UnitType", "Chariot", "Local", TRUE + "Extra", "Road", "Local", TRUE + "CityTile", "Claimed", "Local", FALSE + } +[effect_appian_move_bonus_chariot2] +type = "Move_Bonus" +value = 6 +reqs = + { "type", "name", "range", "present" + "Building", "Appian Way", "Player", TRUE + "UnitType", "Chariot", "Local", TRUE + "Extra", "Road", "Local", TRUE + "UnitState", "OnDomesticTile","Local",TRUE + } +[effect_appian_move_bonus_wagon1] +type = "Move_Bonus" +value = 3 +reqs = + { "type", "name", "range","present" + "Building", "Appian Way", "Player",TRUE + "UnitType", "Wagon", "Local", TRUE + "Extra", "Road", "Local", TRUE + "CityTile", "Claimed", "Local", FALSE + } +[effect_appian_move_bonus_wagon2] +type = "Move_Bonus" +value = 3 +reqs = + { "type", "name", "range","present" + "Building", "Appian Way", "Player",TRUE + "UnitType", "Wagon", "Local", TRUE + "Extra", "Road", "Local", TRUE + "UnitState", "OnDomesticTile","Local",TRUE + } +[effect_appian_move_workers1] +type = "Move_Bonus" +value = 3 +reqs = + { "type", "name", "range","present" + "Building", "Appian Way", "Player",TRUE + "UnitFlag", "Infra", "Local", TRUE + "UnitType", "Legion", "Local", FALSE ;Legions already got a bonus above. + "CityTile", "Claimed", "Local", FALSE + } +[effect_appian_move_workers2] +type = "Move_Bonus" +value = 3 +reqs = + { "type", "name", "range","present" + "Building", "Appian Way", "Player",TRUE + "UnitType", "Workers", "Local", TRUE + "Extra", "Fallout", "Local", FALSE ; UnitState tile check will segfault without a tile target in the reqs list. + "UnitState", "OnDomesticTile","Local",TRUE + } +[effect_appian_work_workers1] +type = "Unit_Work_Pct" +value = 100 +reqs = + { "type", "name", "range","present" + "Building", "Appian Way", "Player",TRUE + "UnitFlag", "Infra", "Local", TRUE + "Activity", "Road", "Local", TRUE + } +;************************************************************************ Chand Baori +[effect_chand_baori] +type = "Output_Penalty_Tile" +value = 3 ; 3+3 = 6; i.e., gone for fruit but in place for irrigated deer. +reqs = + { "type", "name", "range", "present" + "Building", "Chand Baori", "City", TRUE + "Gov", "Despotism", "Player", TRUE + "OutputType", "Food", "Local", TRUE + } +[effect_chand_baori_irrigation_rate] +type = "Unit_Work_Pct" +value = 63 ; 33% bonus +; believe it or not, because of trunc-rounding, 63 is the number that gives closest to true 33.3% bonus! +; 1. It yields the SAME as value=34 when irrigating grass/plains for a true +33.3% work rate. +; 2. But yields "8 -> 5" (+37.5%) rather than "8 -> 6" (which lost 32% of the 33% bonus to trunc-rounding!) +reqs = + { "type", "name", "range","present" + "Building", "Chand Baori", "Player",TRUE + "Gov", "Despotism", "Player",TRUE + "UnitFlag", "Infra", "Local", TRUE + "Activity", "Irrigate", "Local", TRUE ; irrigate is currently synonymous with cultivate for backward compatibility + "Terrain", "Hills", "Local", FALSE + "Terrain", "Desert", "Local", FALSE + "Terrain", "Forest", "Local", FALSE + "Terrain", "Jungle", "Local", FALSE + "Terrain", "Tundra", "Local", FALSE + "Terrain", "Glacier", "Local", FALSE + "Terrain", "Mountains", "Local", FALSE + } +[effect_chand_baori_cultivation_rate] +type = "Unit_Work_Pct" +value = 63 ; 33% bonus +; believe it or not, because of trunc-rounding, 63 is the number that gives closest to true 33.3% bonus! +; 1. It yields the SAME as value=34 when irrigating grass/plains for a true +33.3% work rate. +; 2. But yields "8 -> 5" (+37.5%) rather than "8 -> 6" (which lost 32% of the 33% bonus to trunc-rounding!) +reqs = + { "type", "name", "range","present" + "Building", "Chand Baori", "Player",TRUE + "Gov", "Despotism", "Player",TRUE + "UnitFlag", "Infra", "Local", TRUE + "Activity", "Cultivate", "Local", TRUE ; but for forward compatibility we need cultivate also + "Terrain", "Hills", "Local", FALSE + "Terrain", "Desert", "Local", FALSE + "Terrain", "Forest", "Local", FALSE + "Terrain", "Jungle", "Local", FALSE + "Terrain", "Tundra", "Local", FALSE + "Terrain", "Glacier", "Local", FALSE + "Terrain", "Mountains", "Local", FALSE + } +[effect_chand_baori_mine_rate] +type = "Unit_Work_Pct" +value = 63 ; 33% bonus +; believe it or not, because of trunc-rounding, 63 is the number that gives closest to true 33.3% bonus! +; 1. It yields the SAME as value=34 when irrigating grass/plains for a true +33.3% work rate. +; 2. But yields "8 -> 5" (+37.5%) rather than "8 -> 6" (which lost 32% of the 33% bonus to trunc-rounding!) +reqs = + { "type", "name", "range","present" + "Building", "Chand Baori", "Player",TRUE + "Gov", "Despotism", "Player",TRUE + "UnitFlag", "Infra", "Local", TRUE + "Activity", "Mine", "Local", TRUE ; mine is currently synonymous with plant for backward compatibility + "Terrain", "Hills", "Local", FALSE + "Terrain", "Desert", "Local", FALSE + "Terrain", "Forest", "Local", FALSE + "Terrain", "Jungle", "Local", FALSE + "Terrain", "Tundra", "Local", FALSE + "Terrain", "Glacier", "Local", FALSE + "Terrain", "Mountains", "Local", FALSE + } +[effect_chand_baori_plant_rate] +type = "Unit_Work_Pct" +value = 63 ; 33% bonus +; believe it or not, because of trunc-rounding, 63 is the number that gives closest to true 33.3% bonus! +; 1. It yields the SAME as value=34 when irrigating grass/plains for a true +33.3% work rate. +; 2. But yields "8 -> 5" (+37.5%) rather than "8 -> 6" (which lost 32% of the 33% bonus to trunc-rounding!) +reqs = + { "type", "name", "range","present" + "Building", "Chand Baori", "Player",TRUE + "Gov", "Despotism", "Player",TRUE + "UnitFlag", "Infra", "Local", TRUE + "Activity", "Plant", "Local", TRUE ; but for forward compatibility we need plant also + "Terrain", "Hills", "Local", FALSE + "Terrain", "Desert", "Local", FALSE + "Terrain", "Forest", "Local", FALSE + "Terrain", "Jungle", "Local", FALSE + "Terrain", "Tundra", "Local", FALSE + "Terrain", "Glacier", "Local", FALSE + "Terrain", "Mountains", "Local", FALSE + } + +;IrrigationSource of city is in game.ruleset +;************************************************************************ Code of Hammurabi +[effect_hammurabi_corruption_1] +type = "Output_Waste" +value = -11 ; 37-11 = 26 +reqs = + { "type", "name", "range" + "Gov", "Despotism", "Player" + "Building", "Code of Hammurabi", "Player" + "OutputType", "Trade", "Local" + } +[effect_hammurabi_corruption_2] +type = "Output_Waste_By_Distance" +value = -100 ; 400-100 = 300 +reqs = + { "type", "name", "range" + "Gov", "Despotism", "Player" + "Building", "Code of Hammurabi", "Player" + "OutputType", "Trade", "Local" + } +[effect_hammurabi_tile_bonus] ; Code of Hammurabi removes tile penalty on lowlands tiles +type = "Output_Penalty_Tile" +value = 100 +reqs = + { "type", "name", "range", "present" + "Gov", "Despotism", "Player", TRUE + "Building", "Code of Hammurabi","Player", TRUE + "TerrainFlag", "Low Land", "Local", TRUE + } +[effect_hammurabi_content_no_temple] +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Code of Hammurabi", "Player", TRUE + "Building", "Temple", "City", FALSE + } +[effect_hammurabi_culture] +type = "History" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Code of Hammurabi", "City" + } +;************************************************************************ Colossus +[effect_colossus_tile_trade] +type = "Output_Inc_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Colossus", "City" + "OutputType", "Trade", "Local" + } +[effect_colossus_city_center_tile] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Colossus", "City" + "CityTile", "Center", "Local" + "OutputType", "Trade", "Local" + } +[effect_colossus_trade_revenue_bonus] +type = "Trade_Revenue_Bonus" +value = 528 ; +40% increase one time revenue +reqs = + { "type", "name", "range", "present" + "Building", "Colossus", "City", TRUE + } +[effect_colossus_traderoute_pct] +type = "Traderoute_Pct" +value = 34 ; because trunc-rounding, this gives closest to +25% to ongoing revenue +reqs = + { "type", "name", "range", "present" + "Building", "Colossus", "City", TRUE + } + +[effect_colossus_commerce_unit_discount] +type = "Unit_Build_Cost_Pct" +value = -11 +reqs = + { + "type", "name", "range", "present" + "Building", "Colossus", "City", TRUE + "UnitFlag", "HelpWonder", "Local", TRUE + "UnitClass", "Land", "Local", FALSE + "UnitClass", "LandRoad", "Local", FALSE + "Tech", "Steam Engine", "Player", FALSE + } +[effect_colossus_galley_discount] +type = "Unit_Build_Cost_Pct" +value = -4 ;30-5 = -17% +reqs = + { + "type", "name", "range", "present" + "Building", "Colossus", "City", TRUE + "UnitType", "Galley", "Local", TRUE + "Tech", "Steam Engine", "Player", FALSE + } +[effect_colossus_trireme_discount] +type = "Unit_Build_Cost_Pct" +value = -13 ;20-5 = -25% +reqs = + { + "type", "name", "range", "present" + "Building", "Colossus", "City", TRUE + "UnitType", "Trireme", "Local", TRUE + "Tech", "Steam Engine", "Player", FALSE + } +[effect_colossus_boat_discount] +type = "Unit_Build_Cost_Pct" +value = -18 ;10-3 = -30% +reqs = + { + "type", "name", "range", "present" + "Building", "Colossus", "City", TRUE + "UnitType", "Boat", "Local", TRUE + "Tech", "Steam Engine", "Player", FALSE + } +[effect_colossus_caravel_discount] +type = "Unit_Build_Cost_Pct" +value = -12 ;40-5 = -12% +reqs = + { + "type", "name", "range", "present" + "Building", "Colossus", "City", TRUE + "UnitType", "Caravel", "Local", TRUE + "Tech", "Steam Engine", "Player", FALSE + } +[effect_colossus_goods_discount] +type = "Unit_Build_Cost_Pct" +value = -20 ;25-5 = -20% +reqs = + { + "type", "name", "range","present" + "Building", "Colossus", "City", TRUE + "UnitType", "Goods", "Local", TRUE + "Tech", "Steam Engine", "Player",FALSE + } +;************************************************************************ Copernicus +[effect_copernicus_observatory] +type = "Output_Bonus" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Copernicus' Observatory", "City" + "OutputType", "Science", "Local" + } +;************************************************************************ Eiffel Tower +[effect_eiffel_tower] +type = "Unit_Upkeep_Free_Per_City" +value = 1 + reqs = + { "type", "name", "range" + "Building", "Eiffel Tower", "Player" + "OutputType", "Shield", "Local" + } +;************************************************************************ Fusion Reactor +; see POWER PLANTS section +;************************************************************************ Hanging Gardens +[effect_hanging_gardens] +type = "Make_Happy" +value = 2 +reqs = + { "type", "name", "range" + "Building", "Hanging Gardens", "Player" + } +[effect_hanging_gardens_1] +type = "Output_Add_Tile" +value = 2 +reqs = + { "type", "name", "range" + "Building", "Hanging Gardens", "City" + "CityTile", "Center", "Local" + "OutputType", "Luxury", "Local" + } +[effect_hanging_gardens_culture] +type = "History" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Hanging Gardens", "City" + } +;************************************************************************ Hoover Dam +; see POWER PLANTS section +;************************************************************************ Isaac Newton +[effect_isaac_newtons_college] +type = "Output_Bonus" +value = 100 +reqs = + { "type", "name", "range" + "Building", "University", "City" + "Building", "Isaac Newton's College", "Player" + "OutputType", "Science", "Local" + } +;************************************************************************ JTIDS +[effect_jtids] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "JTIDS", "Player", TRUE + "UnitFlag", "FootSoldier", "Local", TRUE + } +[effect_jtids_1] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "JTIDS", "Player", TRUE + "UnitType", "Mech. Inf.", "Local", TRUE ; uses rule_name + } +[effect_jtids_2] +type = "Veteran_Combat" +value = 75 ; 87 57::35 26 26 26 +reqs = + { "type", "name", "range", "present" + "Building", "JTIDS", "Player", TRUE + "UnitFlag", "FootSoldier", "Local", TRUE + "UnitType", "Marines", "Local", FALSE + } +[effect_jtids_3] +type = "Veteran_Combat" +value = 60 ; 80 52::32 24 24 24 +reqs = + { "type", "name", "range", "present" + "Building", "JTIDS", "Player", TRUE + "UnitType", "Mech. Inf.", "Local", TRUE ; uses rule_name + } +[effect_jtids_4] +type = "Veteran_Combat" +value = 40 ;84 70::56 42 28 21 +reqs = + { "type", "name", "range", "present" + "Building", "JTIDS", "Player", TRUE + "UnitFlag", "FootSoldier", "Local", TRUE + "UnitType", "Marines", "Local", TRUE + } +;************************************************************************ J.S. Bach +[effect_js_bachs_cathedral] +type = "Force_Content" +value = 2 +reqs = + { "type", "name", "range" + "Building", "J.S. Bach's Cathedral", "Player" + } +;************************************************************************ King Richard +[effect_king_richards_crusade] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Building", "King Richard's Crusade", "City" + "OutputType", "Shield", "Local" + } +[effect_city_build_slots_kr] +type = "City_Build_Slots" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "King Richard's Crusade", "City", TRUE + } +;************************************************************************ Leonardo +[effect_leonardos_workshop] +type = "Upgrade_Unit" +value = 2 +reqs = + { "type", "name", "range" + "Building", "Leonardo's Workshop", "Player" + } +;************************************************************************ Genghis Khan +[effect_genghis_khans_equestrian_school] +type = "Move_Bonus" +value = 9 +reqs = + { "type", "name", "range", "present" + "Building", "Genghis Khan's Equestrian School", "Player", TRUE + "UnitFlag", "Horse", "Local", TRUE + } +[effect_genghis_khans_equestrian_school2] +type = "Move_Bonus" +value = 9 +reqs = + { "type", "name", "range", "present" + "Building", "Genghis Khan's Equestrian School", "Player", TRUE + "UnitType", "Explorer", "Local", TRUE + } +;************************************************************************ Lighthouse +[effect_lighthouse] +type = "Move_Bonus" +value = 18 +reqs = + { "type", "name", "range" + "Building", "Lighthouse", "Player" + "UnitClass", "Sea", "Local" + } +[effect_lighthouse_a] +type = "Move_Bonus" +value = 18 +reqs = + { "type", "name", "range" + "Building", "Lighthouse", "Player" + "UnitClass", "Submarine", "Local" + } +[effect_lighthouse_1] +type = "Move_Bonus" +value = 18 +reqs = + { "type", "name", "range" + "Building", "Lighthouse", "Player" + "UnitClass", "Trireme", "Local" + } +[effect_lighthouse_2] +type = "Move_Bonus" +value = 18 +reqs = + { "type", "name", "range" + "Building", "Lighthouse", "Player" + "UnitClass", "RiverShip", "Local" + } +[effect_lighthouse_3] +type = "Unit_Vision_Radius_Sq" +value = 6 +reqs = + { "type", "name", "range" + "Building", "Lighthouse", "Player" + "UnitClass", "Sea", "Local" + } +[effect_lighthouse_3a] +type = "Unit_Vision_Radius_Sq" +value = 6 +reqs = + { "type", "name", "range" + "Building", "Lighthouse", "Player" + "UnitClass", "Submarine", "Local" + } +[effect_lighthouse_4] +type = "Unit_Vision_Radius_Sq" +value = 6 +reqs = + { "type", "name", "range" + "Building", "Lighthouse", "Player" + "UnitClass", "Trireme", "Local" + } +[effect_lighthouse_5] +type = "Unit_Vision_Radius_Sq" +value = 6 +reqs = + { "type", "name", "range" + "Building", "Lighthouse", "Player" + "UnitClass", "RiverShip", "Local" + } +;************************************************************************ Magellan +[effect_magellans_expedition] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Magellan's Expedition", "Player", TRUE + "UnitClass", "Sea", "Local", TRUE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_magellans_expedition_a] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Magellan's Expedition", "Player", TRUE + "UnitClass", "RiverShip", "Local", TRUE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_magellans_expedition_b] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Magellan's Expedition", "Player", TRUE + "UnitClass", "Submarine", "Local", TRUE + "UnitFlag", "NoVeteran", "Local", FALSE + } +;************************************************************************ Manhattan +[effect_manhattan_project] +type = "Enable_Nuke" +value = 1 +reqs = + { "type", "name", "range", "survives" + "Building", "Manhattan Project", "World", TRUE + } +;************************************************************************ Marco Polo +[effect_marco_polos_embassy] +type = "Output_Bonus" +value = 40 +reqs = + { "type", "name", "range" + "Building", "Marco Polo's Embassy", "Player" + "OutputType", "Trade", "Local" + } +;************************************************************************ Mausoleum +; ╭╯╭╯╭╯╭╯╭╯╭╯ Devs: THIS IS WHY REQS NEED TO BE ABLE TO DO "OR" LOGIC! +; ..................................... +; EFFECT CHART: CH SC CW GW result +; 0 0 0 0 ✓ +; 0 0 0 1 1c ✓ +; 0 0 1 0 1c ✓ +; 0 0 1 1 1c ✓ +; 0 1 0 0 1c ✓ +; 0 1 0 1 1c 1h ✓ +; 0 1 1 0 1c 1h ✓ +; 0 1 1 1 1c 1h ✓ +; 1 0 0 0 1c ✓ +; 1 0 0 1 1c 1h ✓ +; 1 0 1 0 1c 1h ✓ +; 1 0 1 1 1c 1h ✓ +; 1 1 0 0 1c ✓ +; 1 1 0 1 1c 1h ✓ +; 1 1 1 0 1c 1h ✓ +; 1 1 1 1 1c 1h ✓ +; Yes, it's "brute force" but do we want 93% chance of human error? No. +; Real reason: my brain exploded after multiple tries. +[effect_mausoleum_of_mausolos_0001_c] ; 0001 = ---------------------CONTENT +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", FALSE + "Building", "Supreme Court", "Player", FALSE + "Building", "City Walls", "City", FALSE + "Building", "Great Wall", "Player", TRUE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_0010_c] ; 0010 = ---------------------CONTENT +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", FALSE + "Building", "Supreme Court", "Player", FALSE + "Building", "City Walls", "City", TRUE + "Building", "Great Wall", "Player", FALSE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_0011_c] ; 0011 = ---------------------CONTENT +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", FALSE + "Building", "Supreme Court", "Player", FALSE + "Building", "City Walls", "City", TRUE + "Building", "Great Wall", "Player", TRUE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_0100_c] ; 0100 = ---------------------CONTENT +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", FALSE + "Building", "Supreme Court", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Building", "Great Wall", "Player", FALSE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_0101_c] ; 0101 = -------------------HAPPY+CONTENT +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", FALSE + "Building", "Supreme Court", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Building", "Great Wall", "Player", TRUE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_0101_H] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", FALSE + "Building", "Supreme Court", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Building", "Great Wall", "Player", TRUE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_0110_c] ; 0110 = -------------------HAPPY+CONTENT +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", FALSE + "Building", "Supreme Court", "Player", TRUE + "Building", "City Walls", "City", TRUE + "Building", "Great Wall", "Player", FALSE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_0110_H] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", FALSE + "Building", "Supreme Court", "Player", TRUE + "Building", "City Walls", "City", TRUE + "Building", "Great Wall", "Player", FALSE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_0111_c] ; 0111 = -------------------HAPPY+CONTENT +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", FALSE + "Building", "Supreme Court", "Player", TRUE + "Building", "City Walls", "City", TRUE + "Building", "Great Wall", "Player", TRUE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_0111_H] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", FALSE + "Building", "Supreme Court", "Player", TRUE + "Building", "City Walls", "City", TRUE + "Building", "Great Wall", "Player", TRUE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_1000_c] ; 1000 = ---------------------CONTENT +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Building", "Supreme Court", "Player", FALSE + "Building", "City Walls", "City", FALSE + "Building", "Great Wall", "Player", FALSE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_1001_c] ; 1001 = -------------------HAPPY+CONTENT +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Building", "Supreme Court", "Player", FALSE + "Building", "City Walls", "City", FALSE + "Building", "Great Wall", "Player", TRUE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_1001_H] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Building", "Supreme Court", "Player", FALSE + "Building", "City Walls", "City", FALSE + "Building", "Great Wall", "Player", TRUE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_1010_c] ; 1010 = -------------------HAPPY+CONTENT +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Building", "Supreme Court", "Player", FALSE + "Building", "City Walls", "City", TRUE + "Building", "Great Wall", "Player", FALSE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_1010_H] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Building", "Supreme Court", "Player", FALSE + "Building", "City Walls", "City", TRUE + "Building", "Great Wall", "Player", FALSE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_1011_c] ; 1011 = -------------------HAPPY+CONTENT +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Building", "Supreme Court", "Player", FALSE + "Building", "City Walls", "City", TRUE + "Building", "Great Wall", "Player", TRUE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_1011_H] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Building", "Supreme Court", "Player", FALSE + "Building", "City Walls", "City", TRUE + "Building", "Great Wall", "Player", TRUE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_1100_c] ; 1100 = ---------------------CONTENT +type = "Make_Content" +value = 2 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Building", "Supreme Court", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Building", "Great Wall", "Player", FALSE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_1101_c] ; 1101 = -------------------HAPPY+CONTENT +type = "Make_Content" +value = 2 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Building", "Supreme Court", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Building", "Great Wall", "Player", TRUE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_1101_H] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Building", "Supreme Court", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Building", "Great Wall", "Player", TRUE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_1110_c] ; 1110 = -------------------HAPPY+CONTENT +type = "Make_Content" +value = 2 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Building", "Supreme Court", "Player", TRUE + "Building", "City Walls", "City", TRUE + "Building", "Great Wall", "Player", FALSE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_1110_H] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Building", "Supreme Court", "Player", TRUE + "Building", "City Walls", "City", TRUE + "Building", "Great Wall", "Player", FALSE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_1111_c] ; 1111 = -------------------HAPPY+CONTENT +type = "Make_Content" +value = 2 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Building", "Supreme Court", "Player", TRUE + "Building", "City Walls", "City", TRUE + "Building", "Great Wall", "Player", TRUE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_1111_H] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Building", "Supreme Court", "Player", TRUE + "Building", "City Walls", "City", TRUE + "Building", "Great Wall", "Player", TRUE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +;----------------------------------------------- +[effect_mausoleum_of_mausolos_bribe] +type = "Unit_Bribe_Cost_Pct" +value = 35 +reqs = + { "type", "name", "range" + "Building", "Mausoleum of Mausolos", "Player" + } +[effect_mausoleum_of_mausolos_half_courthouse_corruption] +type = "Output_Waste_Pct" +value = 34 + reqs = + { "type", "name", "range", "present" + "Building", "Mausoleum of Mausolos", "Player", TRUE + "Building", "Supreme Court", "Player", FALSE + "Building", "Courthouse", "City", FALSE + "OutputType", "Trade", "Local", TRUE + } +[effect_mausoleum_of_mausolos_half_courthouse_tile_corruption] +type = "Output_Penalty_Tile" +value = 1 + reqs = + { "type", "name", "range", "present" + "Building", "Mausoleum of Mausolos", "Player", TRUE + "Building", "Supreme Court", "Player", FALSE + "Building", "Courthouse", "City", FALSE + "Gov", "Monarchy", "Player", FALSE + "Gov", "Republic", "Player", FALSE + "Gov", "Democracy", "Player", FALSE + "Gov", "Theocracy", "Player", FALSE + "Gov", "Communism", "Player", FALSE + "Gov", "Nationalism", "Player", FALSE + } +[effect_mausoleum_half_courthouse_spy_resistance] +type = "Spy_Resistant" ;13% reduction of 50% base chance is 6.5% bonus. 50%-6.5%=43.5% success rate +value = 13 + reqs = + { "type", "name", "range", "present" + "Building", "Mausoleum of Mausolos", "Player", TRUE + "Building", "Supreme Court", "Player", FALSE + "Building", "Courthouse", "City", FALSE + } +[effect_mausoleum_half_courthouse_hostile_diplomat] +type = "Action_Resist_Pct" +value = 13 + reqs = + { "type", "name", "range", "present" + "Building", "Mausoleum of Mausolos", "Player", TRUE + "Building", "Supreme Court", "Player", FALSE + "Building", "Courthouse", "City", FALSE + "Action", "Investigate City", "Local", FALSE ;investigate is exclusive bonus below + } +[effect_mausoleum_of_mausolos_investigate_resistance] +type = "Action_Resist_Pct" +value = 54 ; +7% - 54% = -47% ... -0.47 * 80 = 37.6% ... 80%-37.6% = 42.4% ... (85%/2 = 42.5%) ✓ +reqs = + { "type", "name", "range", "present" + "Building", "Mausoleum of Mausolos", "Player", TRUE + "Action", "Investigate City", "Local", TRUE + } +[effect_mausoleum_of_mausolos_culture] +type = "History" +value = 2 +reqs = + { "type", "name", "range" + "Building", "Mausoleum of Mausolos", "City" + } + +;[effect_mausoleum_of_mausolos_incite] = blocked in game.ruleset actionenabler + +;************************************************************************ Medici Bank +[effect_medici_coins_bank] +;Changes require changes to city_force_income_update() in city.js +type = "Coinage_Bonus_Pm" +;EFT_COINAGE_BONUS_PM does precise bankers (not trunc rounding) +value = 140 ; Marketplace + Bank = 2 * .07 = 140 per mille +reqs = + { "type", "name", "range", "present" + "Building", "Medici Bank", "Player", TRUE + "Building", "Marketplace", "City", TRUE + "Building", "Bank", "City", TRUE + "Building","Stock Exchange","City", FALSE + "Gov", "Communism", "Player", FALSE + } +;Changes require changes to city_force_income_update() in city.js +[effect_medici_coins_stock_exchange] +type = "Coinage_Bonus_Pm" +;EFT_COINAGE_BONUS_PM does precise bankers rounding (not trunc rounding) +value = 158 ; MP + Bank + SE = 2.25 * .07 = 157.5 per mille +reqs = + { "type", "name", "range", "present" + "Building", "Medici Bank", "Player", TRUE + "Building", "Marketplace", "City", TRUE + "Building", "Bank", "City", TRUE + "Building", "Stock Exchange","City", TRUE + "Gov", "Communism", "Player", FALSE + } +[effect_medici_gold] +type = "Output_Bonus_2" +; Output_Bonus_2 uses trunc rounding. True +7% is achieved knowing the following: +; 8% with trunc rounding: x̄ = +7.06% gold. (median is slightly lower) +; 7% with trunc rounding: x̄ = +5.96% gold. (median is lower) +; (NB: bonus suffers somewhat more under lower gold tax rates) +; If changing from 7% to another value, use "Medici Rounding.ods" to calibrate +value = 8 +reqs = + { "type", "name", "range", "present" + "Building", "Medici Bank", "Player", TRUE + "Building", "Bank", "City", TRUE + "OutputType", "Gold", "Local", TRUE + "Gov", "Communism", "Player", FALSE + } +;************************************************************************ Michelangelo +[effect_michelangelos_chapel] +type = "Make_Content" +value = 3 +reqs = + { "type", "name", "range" + "Building", "Michelangelo's Chapel", "Player" + } +[effect_michelangelos_chapel_1] +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range" + "Tech", "Theology", "Player" + "Building", "Michelangelo's Chapel", "Player" + } +[effect_michelangelos_chapel_2] +type = "Make_Content" +value = -1 +reqs = + { "type", "name", "range" + "Building", "Michelangelo's Chapel", "Player" + "Gov", "Communism", "Player" + } +;************************************************************************ Oracle +[effect_oracle] +type = "Make_Content" +value = 2 +reqs = + { "type", "name", "range" + "Building", "Temple", "City" + "Building", "Oracle", "Player" + } +[effect_oracle_ziggurat] +type = "Make_Content" +value = 2 +reqs = + { "type", "name", "range", "present" + "Building", "Temple", "City", FALSE + "Building", "Oracle", "Player", TRUE + "Building", "Ziggurat", "City", TRUE + "Gov", "Despotism","Player", TRUE + + } +;************************************************************************ Pasteur Institute +[effect_pasteur_institute] +type = "Make_Happy" +value = 2 + reqs = + { "type", "name", "range" + "Building", "Pasteur Institute", "World" + "Tech", "Microbiology", "Player" + } +;************************************************************************ Pax Dei +[effect_pax_dei] +type = "Has_Senate" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Pax Dei", "World", TRUE + "Tech", "Philosophy","Player",TRUE + "Tech", "Theocracy", "World", FALSE + } +[effect_pax_dei_unit_unhappiness] +type = "Unhappy_Factor" +value = 2 +reqs = + { "type", "name", "range", "present" + "Building", "Pax Dei", "World", TRUE + "Tech", "Philosophy","Player",TRUE + "Tech", "Theocracy", "World", FALSE + } + +;************************************************************************ Pyramids +[effect_pyramids] +type = "Growth_Food" +value = 25 +reqs = + { "type", "name", "range" + "Building", "Pyramids", "Player" + } +[effect_pyramids_1] +type = "Rapture_Grow" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Pyramids", "City" + } +;************************************************************************ Roman Colosseum +[effect_roman_colosseum] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Roman Colosseum","Player" + "Building", "Amphitheatre", "City" + } +[effect_roman_colosseum_luxury] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Roman Colosseum","Player" + "Building", "Amphitheatre", "City" + "CityTile", "Center", "Local" + "OutputType", "Luxury", "Local" + } +;entertainer effect handled in the elvis effects section. +;************************************************************************ Sphinx +[effect_sphinx_tile] +type = "Output_Penalty_Tile" +value = 100 +reqs = + { "type", "name", "range" + "Building", "The Sphinx", "City" + } +[effect_sphinx_luxury] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Building", "The Sphinx", "City" + "CityTile", "Center", "Local" + "OutputType", "Luxury", "Local" + } +[effect_sphinx_corruption] +type = "Output_Waste_Pct" +value = 60 +reqs = + { "type", "name", "range" + "Building", "The Sphinx", "City" + "OutputType", "Trade", "Local" + } +;************************************************************************ Shakespeare +[effect_shakespeares_theatre] +type = "No_Unhappy" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Shakespeare's Theatre", "City" + } +;************************************************************************ Statue of Liberty +[effect_statue_of_liberty] +type = "Any_Government" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Statue of Liberty", "Player" + } +[effect_statue_of_liberty_1] +type = "No_Anarchy" +value = 11 ; (val >= 10) means, no anarchy but switch is NOT immediate +reqs = + { "type", "name", "range" + "Building", "Statue of Liberty", "Player" + } +;************************************************************************ Statue of Zeus +[effect_statue_of_zeus_content_nonrep] +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Statue of Zeus", "Player", TRUE + "Gov", "Republic", "Player", FALSE + "Gov", "Democracy", "Player", FALSE + "Tech", "Tactics", "Player", FALSE + } +[effect_statue_of_zeus_mil_content_magna_carta] +type = "Make_Content_Mil" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Statue of Zeus", "Player", TRUE + "Gov", "Monarchy", "Player", TRUE + "Building", "Magna Carta", "Player", TRUE + "Tech", "Tactics", "Player", FALSE + } +[effect_statue_of_zeus_mil_content_republic] +type = "Make_Content_Mil" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Statue of Zeus", "Player", TRUE + "Gov", "Republic", "Player", TRUE + "Tech", "Tactics", "Player", FALSE + } +[effect_statue_of_zeus_mil_content_democracy] +type = "Make_Content_Mil" +value = 2 +reqs = + { "type", "name", "range", "present" + "Building", "Statue of Zeus", "Player", TRUE + "Gov", "Democracy", "Player", TRUE + "Tech", "Tactics", "Player", FALSE + } +[effect_statue_of_zeus_1] +type = "Unit_Upkeep_Free_Per_City" +value = 4 +reqs = + { "type", "name", "range", "present" + "Building", "Statue of Zeus", "City", TRUE + "Tech", "Tactics", "Player", FALSE + "OutputType", "Shield", "Local", TRUE + } +[effect_statue_of_zeus_2] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Statue of Zeus", "City" + } +[effect_statue_of_zeus_3] +type = "Veteran_Combat" +value = 34 ; [50,33,20,15,15,15] → [67,44,26,20,20,20] +reqs = + { "type", "name", "range", "present" + "Building", "Statue of Zeus", "Player", TRUE + "Tech", "The Republic", "Player", FALSE + } +;************************************************************************ Sun Tzu +[effect_sun_tzus_war_academy] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Sun Tzu's War Academy", "Player", TRUE + "UnitClass", "Land", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_sun_tzus_war_academy_1] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Sun Tzu's War Academy", "Player", TRUE + "UnitClass", "LandAirSea", "Local", TRUE + } +[effect_sun_tzus_war_academy_2] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Sun Tzu's War Academy", "Player", TRUE + "UnitClass", "LandNoKill", "Local", TRUE + } +;************************************************************************ Supreme Court +[effect_supreme_court_corruption1] +type = "Output_Waste_Pct" +value = 60 + reqs = + { "type", "name", "range" + "Building", "Supreme Court", "Player" + "OutputType", "Trade", "Local" + } +[effect_supreme_court_all_govs] +type = "Make_Content" ; keeping in equal with courthouse +value = 1 +reqs = + { "type", "name", "range" + "Building", "Supreme Court", "Player" + } +[effect_supreme_court_incite_occupied] +type = "Incite_Cost_Pct" +value = 300 +reqs = + { "type", "name", "range", "present" + "Building", "Supreme Court", "Player", TRUE + "MaxUnitsOnTile", "0", "Local", FALSE + } +[effect_supreme_court_incite_empty] +type = "Incite_Cost_Pct" +value = 100 +reqs = + { "type", "name", "range", "present" + "MaxUnitsOnTile", "0", "Local", TRUE + "Building", "Supreme Court", "Player", TRUE + } +[effect_supreme_court_upkeep] +type = "Unit_Upkeep_Free_Per_City" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Supreme Court", "Player" + "OutputType", "Shield", "Local" + } +; Removes penalties (Despotism/Anarchy) for tiles >3 output +[effect_supreme_court_tile_corruption] +type = "Output_Penalty_Tile" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Supreme Court", "Player" + } +; HOMELAND SECURITY EFFECTS +; ********************************************************** +[effect_homeland_security_spy_resistance] +type = "Spy_Resistant" +value = 25 ;25% reduction of 50% base chance is 12.5% bonus. 50%-12.5%=37.5% success rate + ; No protection= 1/2, HL = 3/8, CH+HL = 1/4, CH+HL+PS = 1/8 +reqs = + { "type", "name", "range", "present" + "Building", "Homeland Security", "City", TRUE + } +[effect_homeland_security_hostile_diplomat0] +type = "Action_Odds_Pct" +value = -25 ; 25% of 80% base rate = 20% + ; No protection = 4/5, HL = 3/5, CH+HL = 2/5, CH+HL+PS = 1/5 +reqs = + { "type", "name", "range", "present" + "Building", "Homeland Security", "City", TRUE + "Action", "Steal Tech", "Local", TRUE + } +[effect_homeland_security_hostile_diplomat_1] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Homeland Security", "City", TRUE + "Action", "Steal Tech Escape Expected", "Local", TRUE + } +[effect_homeland_security_hostile_diplomat_2] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Homeland Security", "City", TRUE + "Action", "Targeted Steal Tech", "Local", TRUE + } +[effect_homeland_security_hostile_diplomat_3] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Homeland Security", "City", TRUE + "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE + } +[effect_homeland_security_hostile_diplomat_4] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Homeland Security", "City", TRUE + "Action", "Sabotage City", "Local", TRUE + } +[effect_homeland_security_hostile_diplomat_5] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Homeland Security", "City", TRUE + "Action", "Sabotage City Escape", "Local", TRUE + } +[effect_homeland_security_hostile_diplomat_6] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Homeland Security", "City", TRUE + "Action", "Targeted Sabotage City", "Local", TRUE + } +[effect_homeland_security_hostile_diplomat_7] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Homeland Security", "City", TRUE + "Action", "Targeted Sabotage City Escape", "Local", TRUE + } +[effect_homeland_security_hostile_diplomat_8] +type = "Action_Odds_Pct" +value = -25 ;40 minus 25%*80 = 20% +reqs = + { "type", "name", "range", "present" + "Building", "Homeland Security", "City", TRUE + "Action", "Steal Maps Escape", "Local", TRUE + } +[effect_homeland_security_hostile_diplomat_9] +type = "Action_Odds_Pct" +value = -25 +reqs = + { "type", "name", "range", "present" + "Building", "Homeland Security", "City", TRUE + "Action", "Steal Maps", "Local", TRUE + } +[effect_homeland_security_hostile_diplomat_10] +type = "Action_Odds_Pct" +value = -25 +reqs = + { "type", "name", "range", "present" + "Building", "Homeland Security", "City", TRUE + "Action", "Poison City Escape", "Local", TRUE + } +[effect_homeland_security_hostile_diplomat_11] +type = "Action_Odds_Pct" +value = -25 +reqs = + { "type", "name", "range", "present" + "Building", "Homeland Security", "City", TRUE + "Action", "Incite City", "Local", TRUE + } +[effect_homeland_security_hostile_diplomat_12] +type = "Action_Odds_Pct" +value = -25 +reqs = + { "type", "name", "range", "present" + "Building", "Homeland Security", "City", TRUE + "Action", "Incite City Escape", "Local", TRUE + } +;************************************************************************ Temple of Artemis +[effect_temple_of_artemis] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Temple", "City" + "Building", "Temple of Artemis", "Player" + "CityTile", "Center", "Local" + "OutputType", "Luxury", "Local" + } +;Note: the city applies +1 to 0-shield city tiles on grass,swamp,hills,tundra +;Thus this bonus negates the condition of getting that +1 and needs a +;compensating +1 further below +[effect_temple_of_artemis_1] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Temple", "City" + "Building", "Temple of Artemis", "Player" + "CityTile", "Center", "Local" + "OutputType", "Shield", "Local" + } +;-------- +;Give the city its extra shield if it was built on a 0-shield (grass/hills/swamp/tundra) +;tile or +1-shield resource (grass-shield,fur) +[effect_temple_of_artemis_1a] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Terrain", "Grassland", "Local" + "Building", "Temple", "City" + "Building", "Temple of Artemis","Player" + "CityTile", "Center", "Local" + "OutputType", "Shield", "Local" + } +[effect_temple_of_artemis_1b] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range", "present" + "Terrain", "Hills", "Local", TRUE + "Extra", "Coal", "Local", FALSE ; only apply to 0 shield tile + "Extra", "Mine", "Local", FALSE ; only apply to 0 shield tile + "Building", "Temple", "City", TRUE + "Building", "Temple of Artemis", "Player", TRUE + "CityTile", "Center", "Local", TRUE + "OutputType", "Shield", "Local", TRUE + } +[effect_temple_of_artemis_1d] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range", "present" + "Terrain", "Swamp", "Local", TRUE + "Building", "Temple", "City", TRUE + "Building", "Temple of Artemis", "Player" + "CityTile", "Center", "Local", TRUE + "OutputType", "Shield", "Local", TRUE + "Extra", "Peat", "Local", FALSE ; only apply to 0 shield tile + } +[effect_temple_of_artemis_1e] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range", "present" + "Terrain", "Tundra", "Local", TRUE + "Extra", "Elk", "Local", FALSE ; only apply to 0 shield tile + "Building", "Temple", "City", TRUE + "Building", "Temple of Artemis", "Player", TRUE + "CityTile", "Center", "Local", TRUE + "OutputType", "Shield", "Local", TRUE + } +;------ +[effect_temple_of_artemis_2] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Temple", "City" + "Building", "Temple of Artemis", "Player" + "CityTile", "Center", "Local" + "OutputType", "Gold", "Local" + } +[effect_temple_of_artemis_3] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Temple", "City" + "Building", "Temple of Artemis", "Player" + "CityTile", "Center", "Local" + "OutputType", "Science", "Local" + } +;************************************************************************ Tesla +[effect_teslas_laboratory] +type = "Upgrade_Unit" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Tesla's Laboratory", "Player" + } +[effect_tesla_laboratory2] +type = "Upgrade_Price_Pct" +value = -20 +reqs = + { "type", "name", "range" + "Building", "Tesla's Laboratory", "Player" + } +;************************************************************************ The Internet +[effect_internet] +type = "Output_Bonus" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Research Lab", "City" + "Building", "The Internet", "Player" + "OutputType", "Science", "Local" + } + +;************************************************************************ United Nations +[effect_united_nations] +type = "Has_Senate" +value = 1 +reqs = + { "type", "name", "range" + "Building", "United Nations", "World" + } +[effect_united_nations_1] +type = "Revolution_Unhappiness" +value = 2 +reqs = + { "type", "name", "range", "present" + "Building", "United Nations", "World", TRUE +; Without !present UN would make revolution less likely instead +; of enabling it with Democracy (value 2 -> 4 instead of 0 -> 2) + "Gov", "Democracy", "Player", FALSE + } + +;************************************************************************ Voyage of Darwin +; There are nasty hard-coded things to the original Wonder, so it had +; to be given a name change (Voyage of Darwin) to avoid messy problems. +[effect_voyage_of_darwin] +type = "Output_Inc_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Voyage of Darwin", "City" + "OutputType", "Trade", "Local" + } +;************************************************************************ Women's Suffrage small wonder version +[effect_womens_suffrage_republic] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range", "present" + "Gov", "Republic", "Player", TRUE + "Building", "Women's Suffrage", "Player", TRUE + "Building", "Women's Suffrage​", "Player", FALSE + ; has zero-width space for the great wonder. can't get double women's suffrage bonus. + } +; causes +1 unhappy for all cities, usually over s2 or s3 (depending on empire size) +[effect_no_womens_suffrage_unhappy_republic] +type = "Empire_Size_Base" +value = -13 +reqs = + { "type", "name", "range", "present" + "Gov", "Republic", "Player", TRUE + ; small. if you have neither you get the unhappy + "Building", "Women's Suffrage", "Player", FALSE + ; great. zero-width space for the great wonder + "Building", "Women's Suffrage​", "Player", FALSE + ; great. zero-width space for the great wonder + "Building", "Women's Suffrage​", "World", TRUE + } +[effect_womens_suffrage_democracy] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range", "present" + "Gov", "Democracy", "Player", TRUE + ; small wonder. if you own neither you get the unhappy: + "Building", "Women's Suffrage", "Player", TRUE + ; has zero-width space for the great wonder. can't get double women's suffrage bonus. + "Building", "Women's Suffrage​", "Player", FALSE + } +; causes +1 unhappy for all cities, usually over s2 or s3 (depending on empire size) +[effect_no_womens_suffrage_unhappy_democracy] +type = "Empire_Size_Base" +value = -14 +reqs = + { "type", "name", "range", "present" + "Gov", "Democracy", "Player", TRUE + ; small wonder. if you own neither you get the unhappy: + "Building", "Women's Suffrage", "Player", FALSE + ; great wonder. zero-width space for the great wonder: + "Building", "Women's Suffrage​", "Player", FALSE + ; great wonder. has zero-width space for the great wonder: + "Building", "Women's Suffrage​", "World", TRUE + } +;************************************************************************ Women's Suffrage great wonder version +[effect_womens_suffrage_gw_republic] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Republic", "Player" + "Building", "Women's Suffrage​", "Player" ; has zero-width space for the great wonder + } +[effect_womens_suffrage_gw_democracy] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Democracy", "Player" + "Building", "Women's Suffrage​", "Player" ; has zero-width space for the great wonder + } +;************************************************************************ Ziggurat +[effect_ziggurat_visible] +type = "Visible_Walls" +value = 4 +reqs = + { "type", "name", "range", "present" + "Building", "Ziggurat", "City", TRUE + "Gov", "Despotism", "Player", TRUE + "Building", "Fortifications", "City", FALSE + } +[effect_ziggurat_barracks_effect] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Ziggurat", "City", TRUE + "Gov", "Despotism", "Player",TRUE + "Building", "Barracks", "City", FALSE + "UnitClass","Land", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_ziggurat_temple] +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range","present" + "Building", "Ziggurat", "City", TRUE + "Gov", "Despotism","Player",TRUE + "Building", "Temple", "City", FALSE + } +[effect_ziggurat_temple_2] +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Ziggurat", "City", TRUE + "Gov", "Despotism", "Player", TRUE + "Tech", "Mysticism", "Player", TRUE + "Building", "Temple", "City", FALSE + } +[effect_ziggurat_granary] +type = "Growth_Food" +value = 50 +reqs = + { "type", "name", "range","present" + "Building", "Ziggurat", "City", TRUE + "Gov", "Despotism","Player",TRUE + "Building", "Granary", "City", FALSE + } +[effect_ziggurat_fortifications] +type = "Defend_Bonus" +value = 75 ; 1.75x vs everything +reqs = + { "type", "name", "range","present" + "Building", "Ziggurat", "City", TRUE + "Gov", "Despotism", "Player",TRUE + "Building", "Fortifications", "City", FALSE + "Building", "City Walls", "City", FALSE + "Building", "Great Wall", "Player",FALSE + } +;Ziggurat semi-relocation of capital effects-------------------------- +[effect_ziggurat_palace_gov_center] +type = "Gov_Center" +value = 1 +reqs = + { "type", "name", "range","present" + "Building", "Ziggurat", "City", TRUE + "Gov", "Despotism","Player",TRUE + "Building", "Palace", "City", FALSE + } +[effect_ziggurat_palace_corruption] +type = "Output_Waste_Pct" +value = 60 +reqs = + { "type", "name", "range","present" + "Building", "Ziggurat","City", TRUE + "Gov", "Despotism","Player",TRUE + "Building", "Palace", "City", FALSE + "OutputType","Trade", "Local", TRUE + } +[effect_ziggurat_palace_happy] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range","present" + "Building", "Ziggurat", "City", TRUE + "Gov", "Despotism","Player",TRUE + "Building", "Palace", "City", FALSE + } +[effect_ziggurat_palace_despotism_prod_bonus] +type = "Output_Bonus" +value = 75 +reqs = + { "type", "name", "range","present" + "Building", "Ziggurat", "City", TRUE + "Gov", "Despotism","Player", TRUE + "OutputType","Shield", "Local", TRUE + } +;------------------------------------------------------------------------------- + +; Calibrate sabotage City Walls odds to 50% +[effect_siege_ram_city_walls] +type = "Action_Odds_Pct" +value = 100 ; diplomats.c::diplomat_sabotage does separate 50% odds of failure + ; which is immune to this Action_Odds_Pct, therefore ensure it passes + ; first roll every time, leaving a simple 50% chance on second check. + ; (25% if city has Palace or Ecclesiastical Palace) +reqs = + { "type", "name", "range", "present" + "UnitType", "Siege Ram", "Local", TRUE + "Action", "Targeted Sabotage City Escape", "Local", TRUE + } + +[effect_calendar_base] +type = "Turn_Years" +value = 100 + +; 100 - 50 = 50 +[effect_calendar_1] +type = "Turn_Years" +value = -50 +reqs = + { "type", "name", "range" + "MinYear", "0", "World" + } + +; 50 - 25 = 25 +[effect_calendar_2] +type = "Turn_Years" +value = -25 +reqs = + { "type", "name", "range" + "MinYear", "1000", "World" + } + +; 25 - 15 = 10 +[effect_calendar_3] +type = "Turn_Years" +value = -15 +reqs = + { "type", "name", "range" + "MinYear", "1800", "World" + } + +; 10 - 5 = 5 +[effect_calendar_4] +type = "Turn_Years" +value = -5 +reqs = + { "type", "name", "range" + "MinYear", "1900", "World" + } + +; 5 - 3 = 2 +[effect_calendar_5] +type = "Turn_Years" +value = -3 +reqs = + { "type", "name", "range" + "MinYear", "1950", "World" + } + +; 2 - 1 = 1 +[effect_calendar_6] +type = "Turn_Years" +value = -1 +reqs = + { "type", "name", "range" + "MinYear", "2012", "World" + } + +[effect_tech_cost_base] +type = "Tech_Cost_Factor" +value = 1 + +; Cities can always work tiles +[effect_tile_workable] +type = "Tile_Workable" +value = 1 +reqs = + { "type", "name", "range", "present" + "Terrain", "Inaccessible", "Local", FALSE + } + +; Each city has at least one slot to build units +[effect_city_build_slots_basic] +type = "City_Build_Slots" +value = 1 + +; Capital has two slots +[effect_city_build_slots_capital] +type = "City_Build_Slots" +value = 1 +reqs = + { "type", "name", "range", "present" + "Tech", "Conscription", "Player", TRUE + "Building", "Palace", "City", TRUE + } +[effect_city_build_slots_capital2] +type = "City_Build_Slots" +value = 1 +reqs = + { "type", "name", "range", "present" + "Tech", "Conscription", "Player", TRUE + "Building", "Ecclesiastical Palace", "City", TRUE + } +[effect_city_build_slots_magna_carta] +type = "City_Build_Slots" +value = 1 +reqs = + { "type", "name", "range", "present" + "Gov", "Monarchy", "Player", TRUE + "Building", "Magna Carta", "City", TRUE + } +[effect_city_build_slots_factory] +type = "City_Build_Slots" +value = 1 +reqs = + { "type", "name", "range", "present" + "Tech", "Conscription", "Player", TRUE + "Building", "Factory", "City", TRUE + "Building", "Hoover Dam", "City", FALSE + } +[effect_city_build_slots_mfg_plant] +type = "City_Build_Slots" +value = 1 +reqs = + { "type", "name", "range", "present" + "Tech", "Conscription", "Player", TRUE + "Building", "Mfg. Plant", "City", TRUE + "Building", "Hoover Dam", "City", FALSE + } + +[effect_city_image_1] +type = "City_Image" +value = 1 +reqs = + { "type", "name", "range" + "MinSize", "4", "City" + } + +[effect_city_image_2] +type = "City_Image" +value = 1 +reqs = + { "type", "name", "range" + "MinSize", "8", "City" + } + +[effect_city_image_3] +type = "City_Image" +value = 1 +reqs = + { "type", "name", "range" + "MinSize", "12", "City" + } + +[effect_city_image_4] +type = "City_Image" +value = 1 +reqs = + { "type", "name", "range" + "MinSize", "16", "City" + } + +[effect_pollution] +type = "Output_Tile_Punish_Pct" +value = 50 +reqs = + { "type", "name", "range", "present" + "Extra", "Pollution", "Local", TRUE + "Extra", "Fallout", "Local", FALSE + } + +[effect_fallout] +type = "Output_Tile_Punish_Pct" +value = 50 +reqs = + { "type", "name", "range", "present" + "Extra", "Fallout", "Local", TRUE + "Extra", "Pollution", "Local", FALSE + } + +[effect_pollution_fallout] +type = "Output_Tile_Punish_Pct" +value = 75 +reqs = + { "type", "name", "range" + "Extra", "Fallout", "Local" + "Extra", "Pollution", "Local" + } + +; **** Action Odds for Hostile Diplomatic Actions ******* +;******************************************************** +;Jan 2021 this effect should be non-zero so that it triggers +;not showing 100% in pop-up odds, since certain improvement +;effects may now disallow this action. +[effect_no_free_investigation] +type = "Action_Odds_Pct" +value = 7 ;80 plus 7%*80 = 85% +reqs = + { "type", "name", "range", "present" + "Action", "Investigate City", "Local", TRUE + } +[effect_satellite_espionage] +type = "Action_Odds_Pct" +value = 1000 ;ensure 100% +reqs = + { "type", "name", "range", "present" + "Action", "Investigate City", "Local", TRUE + "UnitType", "Satellite", "Local", TRUE + } + +[effect_reduced_chance_steal_maps_escape] +type = "Action_Odds_Pct" +value = -32 ;80 minus 31%*80 = 55% +reqs = + { "type", "name", "range", "present" + "Action", "Steal Maps Escape", "Local", TRUE + } +[effect_reduced_chance_steal_maps] +type = "Action_Odds_Pct" +value = -13 ;80 minus 13%*80 = 70% +reqs = + { "type", "name", "range", "present" + "Action", "Steal Maps", "Local", TRUE + } +[effect_reduced_targeted_sabotage_city] +type = "Action_Odds_Pct" +value = -32 ;80 minus 31%*80 = 55% +reqs = + { "type", "name", "range", "present" + "Action", "Targeted Sabotage City Escape", "Local", TRUE + } +[effect_reduced_poison_city_escape] +type = "Action_Odds_Pct" +value = -13 ;80 minus 13%*80 = 70% +reqs = + { "type", "name", "range", "present" + "Action", "Poison City Escape", "Local", TRUE + } +[effect_increased_sabotage_foreigners_in_non_original1] +type = "Action_Odds_Pct" +value = 13 ;// 13%*80% = +10.4% +reqs = + { "type", "name", "range","present" + "CityStatus", "OwnedByOriginal", "City", FALSE + "MinForeignPct", "1", "City", FALSE + "Action", "Sabotage City", "Local",TRUE + } +[effect_increased_sabotage_foreigners_in_non_original2] +type = "Action_Odds_Pct" +value = 13 ;// 13%*80% = +10.4% +reqs = + { "type", "name", "range","present" + "CityStatus", "OwnedByOriginal", "City", FALSE + "MinForeignPct", "1", "City", FALSE + "Action", "Sabotage City Escape", "Local", TRUE + } +[effect_increased_sabotage_foreigners_in_non_original3] +type = "Action_Odds_Pct" +value = 13 ;// 13%*80% = +10.4% +reqs = + { "type", "name", "range","present" + "CityStatus", "OwnedByOriginal", "City", FALSE + "MinForeignPct", "1", "City", FALSE + "Action", "Targeted Sabotage City", "Local", TRUE + } +[effect_increased_sabotage_foreigners_in_non_original4] +type = "Action_Odds_Pct" +value = 13 ;// 13%*80% = +10.4% +reqs = + { "type", "name", "range","present" + "CityStatus", "OwnedByOriginal", "City", FALSE + "MinForeignPct", "1", "City", FALSE + "Action", "Targeted Sabotage City Escape", "Local", TRUE + } +[effect_sabotage_city_production_city_54percent] +type = "Action_Odds_Pct" +value = -32 ;; 32%*80% = 26%. 80%-26%=54%, same as all targeted actions and identical to if alternatively doing action from targeted building pop-up. +reqs = + { "type", "name", "range", "present" + "Action", "Sabotage City Production Escape", "Local", TRUE + } + +;********************************************************* +; Bribe and Incite Costs ********************************* +[effect_unit_bribe_cost_settlers] +type = "Unit_Bribe_Cost_Pct" +value = -50 +reqs = + { "type", "name", "range" + "UnitFlag", "NonMil", "Local" + } +[effect_bribe_democracy] +type = "Unit_Bribe_Cost_Pct" +value = 200 +reqs = + { "type", "name", "range" + "Gov", "Democracy", "Player" + } +[effect_bribe_theocracy] +type = "Unit_Bribe_Cost_Pct" +value = 100 +reqs = + { "type", "name", "range" + "Gov", "Theocracy", "Player" + } +[effect_ship_bribe_correction] ; ships far from home were too cheap and it just wasn't right +type = "Unit_Bribe_Cost_Pct" +value = 100 +reqs = + { "type", "name", "range" + "UnitFlag", "BadCityDefender", "Local" + } +[effect_incite_theocracy] +type = "Incite_Cost_Pct" +value = 100 +reqs = + { "type", "name", "range", "present" + "Gov", "Theocracy", "Player", TRUE + } +[effect_incite_democracy] +type = "Incite_Cost_Pct" +value = 200 +reqs = + { "type", "name", "range", "present" + "Gov", "Democracy", "Player", TRUE + } +[effect_incite_nationalism1] +type = "Incite_Cost_Pct" +value = 200 +reqs = + { "type", "name", "range" + "Gov", "Nationalism", "Player" + "CityStatus", "OwnedByOriginal", "City" + } +[effect_incite_nationalism2] +type = "Incite_Cost_Pct" +value = -67 +reqs = + { "type", "name", "range", "present" + "Gov", "Nationalism", "Player", TRUE + "CityStatus", "OwnedByOriginal", "City", FALSE + } + +;********************************************************* + + +;LOSING MOVES FROM ILLEGAL ACTION NEVER MADE SENSE. JUST FORBID IT AND LET THEM PICK A LEGAL ACTION. +;[effect_illegal_action_move_cost_base] +;type = "Illegal_Action_Move_Cost" +;value = 0 +;reqs = +; { "type", "name", "range", "present" +; "Action", "Found City", "Local", FALSE +; "Action", "Join City", "Local", FALSE +; } + +;CASUS BELLI INCIDENTS +;******************************************************** +[effect_incident_caught_spying_on_city] +type = "Casus_Belli_Caught" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Investigate City", "Local", TRUE + "DiplRel", "War", "Local", FALSE + "DiplRel", "Alliance", "Local", FALSE + } +[effect_incident_success_spy_attack] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Spy Attack", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_caught_spy_attack] +type = "Casus_Belli_Caught" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Spy Attack", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_success_pillage] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Pillage", "Local", TRUE + "DiplRel", "War", "Local", FALSE + "DiplRel", "Alliance", "Local", FALSE + } +[effect_incident_success_sneaky_road] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Build Road", "Local", TRUE + "DiplRel", "War", "Local", FALSE + "DiplRel", "Alliance", "Local", FALSE + } +[effect_incident_success_sneaky_fort] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Build Base", "Local", TRUE + "DiplRel", "War", "Local", FALSE + "DiplRel", "Alliance", "Local", FALSE + } +[effect_incident_success_sneaky_transform] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Transform Terrain", "Local", TRUE + "DiplRel", "War", "Local", FALSE + "DiplRel", "Alliance", "Local", FALSE + } +[effect_incident_caught_steal_maps1] +type = "Casus_Belli_Caught" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Steal Maps Escape", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_success_steal_maps1] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Steal Maps Escape", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_caught_steal_maps2] +type = "Casus_Belli_Caught" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Steal Maps", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_success_steal_maps2] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Steal Maps", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_caught_steal_tech] +type = "Casus_Belli_Caught" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Steal Tech", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_success_steal_tech] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Steal Tech", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_caught_steal_tech_esc] +type = "Casus_Belli_Caught" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Steal Tech Escape Expected", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_success_steal_tech_esc] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Steal Tech Escape Expected", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_caught_tgt_steal_tech] +type = "Casus_Belli_Caught" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_success_tgt_steal_tech] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_success_bribe_unit] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Bribe Unit", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_success_capture_unit] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Capture Units", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_success_sabotage_unit] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Sabotage Unit Escape", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_caught_sabotage_unit] +type = "Casus_Belli_Caught" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Sabotage Unit Escape", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_success_sabotage_unit_1] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Sabotage Unit", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_caught_sabotage_unit_1] +type = "Casus_Belli_Caught" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Sabotage Unit", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_success_incite] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Incite City", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_caught_incite] +type = "Casus_Belli_Caught" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Incite City", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_success_incite_esc] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Incite City Escape", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_caught_incite_esc] +type = "Casus_Belli_Caught" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Incite City Escape", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_success_poison] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Poison City Escape", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_caught_poison] +type = "Casus_Belli_Caught" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Poison City Escape", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_success_sabotage_city] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Sabotage City", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_caught_sabotage_city] +type = "Casus_Belli_Caught" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Sabotage City", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_success_sabotage_city_esc] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Sabotage City Escape", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_caught_sabotage_city_esc] +type = "Casus_Belli_Caught" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Sabotage City Escape", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_success_tgt_sabotage_city] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Targeted Sabotage City Escape", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_caught_tgt_sabotage_city] +type = "Casus_Belli_Caught" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Targeted Sabotage City Escape", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_success_sabotage_city_production] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Sabotage City Production Escape", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_caught_sabotage_city_production] +type = "Casus_Belli_Caught" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Sabotage City Production Escape", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_success_explode_nuke] +type = "Casus_Belli_Success" +value = 1000 +reqs = + { "type", "name", "range", "present" + "Action", "Explode Nuclear", "Local", TRUE + "DiplRel", "Foreign", "Local", TRUE ; no outrage at nuking yourself + } +[effect_incident_success_nuke_city] +type = "Casus_Belli_Success" +value = 1000 +reqs = + { "type", "name", "range", "present" + "Action", "Nuke City", "Local", TRUE + "DiplRel", "Foreign", "Local", TRUE ; no outrage at nuking yourself + } +[effect_incident_success_nuke_unit] +type = "Casus_Belli_Success" +value = 1000 +reqs = + { "type", "name", "range", "present" + "Action", "Nuke Units", "Local", TRUE + "DiplRel", "Foreign", "Local", TRUE ; no outrage at nuking yourself + } + +[effect_incident_success_found_city] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Found City", "Local", TRUE + "DiplRel", "War", "Local", FALSE + "DiplRel", "Alliance", "Local", FALSE + } +[effect_incident_paradrop_invasion] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Paradrop Unit", "Local", TRUE + "DiplRel", "War", "Local", FALSE + "DiplRel", "Alliance", "Local", FALSE + } + +;******************************************************************** + +; Double (+100%) buy cost for Great Wonders +[effect_great_wonder_buy_cost] +type = "Building_Buy_Cost_Pct" +value = 100 +reqs = + { "type", "name", "range" + "BuildingGenus", "GreatWonder", "Local" + } + +; Double buy cost for Small Wonders except Palaces +[effect_small_wonder_buy_cost] +type = "Building_Buy_Cost_Pct" +value = 100 +reqs = + { "type", "name", "range", "present" + "BuildingGenus", "SmallWonder", "Local", TRUE + "Building", "Palace", "Local", FALSE + "Building", "Ecclesiastical Palace", "Local", FALSE + } + +;******************************************************************** MOVE COSTS +;TODO: by having control over embark/board and disembark/deboard, +;we can gracefully upgrade mechanics to minimalist nirvana: +;[effect_action_success_move_cost_embark] +;type = "Action_Success_Actor_Move_Cost" +;value = 0 +;reqs = +; { "type", "name", "range", "present" +; "Action", "Transport Embark", "Local", TRUE +; } +;[effect_action_success_move_cost_disembark] +;type = "Action_Success_Actor_Move_Cost" +;value = 0 +;reqs = +; { "type", "name", "range", "present" +; "Action", "Transport Disembark", "Local", TRUE +; } +;[effect_action_success_move_cost_board] +;type = "Action_Success_Actor_Move_Cost" +;value = 0 +;reqs = +; { "type", "name", "range", "present" +; "Action", "Transport Board", "Local", TRUE +; } +;[effect_action_success_move_cost_deboard] +;type = "Action_Success_Actor_Move_Cost" +;value = 0 +;reqs = +; { "type", "name", "range", "present" +; "Action", "Transport Deboard", "Local", TRUE ;renamed to Transport Deboard later. +; } + +;[effect_action_success_siege_ram_city_walls] +;type = "Action_Success_Actor_Move_Cost" +;value = 9 ; 1 move +;reqs = +; { "type", "name", "range", "present" +; "Action", "Targeted Sabotage City Escape", "Local", TRUE +; "UnitType", "Siege Ram", LOCAL, TRUE +; } + +[effect_action_success_move_cost_embassy] +type = "Action_Success_Actor_Move_Cost" +value = 3 ; 1/3 move +reqs = + { "type", "name", "range", "present" + "Action", "Establish Embassy", "Local", TRUE + } + +[effect_action_success_move_cost_investigate] +type = "Action_Success_Actor_Move_Cost" +value = 3 ; 1/3 move +reqs = + { "type", "name", "range", "present" + "Action", "Investigate City", "Local", TRUE + } + +[effect_action_success_move_cost_capture] +type = "Action_Success_Actor_Move_Cost" +value = 9 ; 1 move +reqs = + { "type", "name", "range", "present" + "Action", "Capture Units", "Local", TRUE + } + +[effect_action_success_move_cost_expel] +type = "Action_Success_Actor_Move_Cost" +value = 6 ; 2/3 move +reqs = + { "type", "name", "range", "present" + "Action", "Expel Unit", "Local", TRUE + } + +;TODO: We no longer need bitfields for move cost of SUA and could code the move cost in here +[effect_action_success_move_cost_bombard] +type = "Action_Success_Actor_Move_Cost" +value = 0 ; currently, keep using bitfield for move cost +reqs = + { "type", "name", "range", "present" + "Action", "Bombard", "Local", TRUE + } + +;Expelled units lose all move points. +[effect_action_success_move_cost_expelled] +type = "Action_Success_Target_Move_Cost" +value = 65535 +reqs = + { "type", "name", "range", "present" + "Action", "Expel Unit", "Local", TRUE + } +;******************************************************************** + +; The Well-Digger can move 3 before you know Pottery or Alphabet. +[effect_welldigger_movement] +type = "Move_Bonus" +value = -27 +reqs = + { + "type", "name", "range", "present" + "UnitFlag", "Well-Digger", "Local", TRUE + "Tech", "Alphabet", "Player", TRUE + } +[effect_welldigger_movement_1] +type = "Move_Bonus" +value = -27 +reqs = + { + "type", "name", "range", "present" + "UnitFlag", "Well-Digger", "Local", TRUE + "Tech", "Pottery", "Player", TRUE + } + +;******** DESPOTISM EFFECTS **************************************** +;DESPOTISM No disorder from starvation +[effect_despotism_gulag] +type = "Gulag" +value = 2 ; 2 martial law units needed to suppress disorder from Famine +reqs = + { + "type", "name", "range" + "Gov", "Despotism", "Player" + } +;******** THEOCRACY EFFECTS **************************************** +[effect_sabotage_bonus_theocracy1] +type = "Action_Odds_Pct" +value = 13 ;// 13%*80% = 10.4% +reqs = + { "type", "name", "range", "present" + "Gov", "Theocracy", "Player", TRUE + "Action", "Sabotage City", "Local", TRUE + } +[effect_sabotage_bonus_theocracy2] +type = "Action_Odds_Pct" +value = 13 ;// 13%*80% = 10.4% +reqs = + { "type", "name", "range", "present" + "Gov", "Theocracy", "Player", TRUE + "Action", "Sabotage City Escape", "Local", TRUE + } +[effect_sabotage_bonus_theocracy3] +type = "Action_Odds_Pct" +value = 13 ;// 13%*80% = 10.4% (int rounds to 10%) +reqs = + { "type", "name", "range", "present" + "Gov", "Theocracy", "Player", TRUE + "Action", "Targeted Sabotage City", "Local", TRUE + } +[effect_sabotage_bonus_theocracy4] +type = "Action_Odds_Pct" +value = 13 ;// 13%*80% = 10.4% (int rounds to 10%) +reqs = + { "type", "name", "range", "present" + "Gov", "Theocracy", "Player", TRUE + "Action", "Targeted Sabotage City Escape", "Local", TRUE + } +[effect_zealots_theocracy] +type = "Fanatics" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Theocracy", "Player" + } +[effect_retiring_falconeers_theocracy] +type = "Retire_Pct" +value = 15 +reqs = + { "type", "name", "range", "present" + "UnitType", "Falconeers", "Local", TRUE + "Age", "5", "Local", TRUE + "Gov", "Theocracy", "Player",FALSE + "CityTile", "Center", "Local", FALSE + } + +;******** NATIONALISM EFFECTS ************************************** +;NATIONALISM WORKER-TYPES MOVE BONUS +[effect_worker_movement_nationalism] +type = "Move_Bonus" +value = 1 +reqs = + { + "type", "name", "range", "present" + "UnitFlag", "Infra", "Local", TRUE + "Gov", "Nationalism", "Player", TRUE + } +[effect_worker_workrate_nationalism] +type = "Unit_Work_Pct" ;Unit_Work_Frag_Bonus +value = 34 +reqs = + { + "type", "name", "range", "present" + "UnitFlag", "Infra", "Local", TRUE + "Gov", "Nationalism", "Player", TRUE + } +;NATIONALISM ARMOR MOVE BONUS +[effect_armor_movement_nationalism] +type = "Move_Bonus" +value = 9 +reqs = + { + "type", "name", "range", "present" + "UnitType", "Armor", "Local", TRUE + "Gov", "Nationalism", "Player", TRUE + } +[effect_armor2_movement_nationalism] +type = "Move_Bonus" +value = 9 +reqs = + { + "type", "name", "range", "present" + "UnitType", "Armor II", "Local", TRUE + "Gov", "Nationalism", "Player", TRUE + } +; Police Stations Cost less +[effect_nationalism_cheaper_police_stations] +type = "Building_Build_Cost_Pct" +value = -20; 50-10 = 40 +reqs = + { "type", "name", "range", "present" + "Gov", "Nationalism", "Player", TRUE + "Building", "Police Station", "Local", TRUE + } +;NATIONALISM 25% DISCOUNT MILITARY UPGRADES +[effect_nationalism_military_upgrades] +type = "Upgrade_Price_Pct" +value = -25 +reqs = + { + "type", "name", "range", "present" + "Gov", "Nationalism", "Player", TRUE + ; "UnitFlag", "NonMil", "Local", FALSE ;can't seem to access this. + } +;******** COMMUNISM EFFECTS **************************************** +;Proletarians useless unless communist. +[effect_proletarian_movement_penalty] +type = "Move_Bonus" +value = -18 +reqs = + { + "type", "name", "range", "present" + "UnitType", "Proletarians", "Local", TRUE + "Gov", "Communism", "Player", FALSE + } +[effect_proletarian_work_rate_penalty] +type = "Unit_Work_Frag_Bonus" +value = -18 +reqs = + { + "type", "name", "range", "present" + "UnitType", "Proletarians", "Local", TRUE + "Gov", "Communism", "Player", FALSE + } + +;COMMUNISM 5 shield discount Riflemen +[effect_communist_riflemen] +type = "Unit_Build_Cost_Pct" +value = -12 +reqs = + { + "type", "name", "range", "present" + "UnitType", "Riflemen", "Local", TRUE + "Gov", "Communism", "Player", TRUE + } +;COMMUNISM 10 shield discount "Sturmovik Effect". +[effect_communist_dive_bombers] +type = "Unit_Build_Cost_Pct" +value = -16 +reqs = + { + "type", "name", "range", "present" + "UnitType", "Dive Bomber", "Local", TRUE + "Gov", "Communism", "Player", TRUE + } +;COMMUNISM 10 shield discount Armor +[effect_communist_armor] +type = "Unit_Build_Cost_Pct" +value = -12 +reqs = + { + "type", "name", "range", "present" + "UnitType", "Armor", "Local", TRUE + "Gov", "Communism", "Player", TRUE + } +;COMMUNISM No disorder from starvation +[effect_communist_gulag] +type = "Gulag" ; 2 martial law units needed to suppress disorder from Famine +value = 3 ; or 1 + Police Station. +reqs = + { + "type", "name", "range" + "Gov", "Communism", "Player" + } + +;********************************************************************* +;Banking changes upkeep of infantry to gold +[effect_banking_upkeep] +type = "Shield2Gold_Factor" +value = 100 +reqs = + { + "type", "name", "range", "present" + "Tech", "Banking", "Player", TRUE + } + +;Changes require changes to city_force_income_update() in city.js +[effect_coinage_base_rate] +type = "Coinage_Bonus_Pm" +value = 500 +reqs = + { "type", "name", "range", "present" + } + +;This is supposed to be outrage for violating a treaty but looks to me more like +;it causes outrage for any invasion of foreign territory. That's not necessarily +;bad, but: (1) This needs testing. (2) A separate effect for treaty violation +;outrage where DiplRel != {War} and all the benevolent actions are left with +;,FALSE clauses and all the malevolent actions are commented out so they'd cause it. +[effect_united_nations_international_outrage_invasion] +type = "Casus_Belli_Success" +value = 1000 +reqs = + { "type", "name", "range", "present" + "DiplRel", "War", "Local", FALSE + "DiplRel", "Alliance", "Local", FALSE + "DiplRel", "Armistice", "Local", FALSE ; Time to get units out of the territory + "DiplRel", "Foreign", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "Building", "United Nations", "World", TRUE +; TO DO: shouldn't the actions below which would vioalte treaty be commented out so that they also +; cause the outrage for a treaty violation? + "Action", "Establish Embassy", "Local", FALSE + "Action", "Establish Embassy Stay", "Local", FALSE + "Action", "Investigate City", "Local", FALSE + "Action", "Investigate City Spend Unit", "Local", FALSE + "Action", "Poison City", "Local", FALSE + "Action", "Poison City Escape", "Local", FALSE + "Action", "Steal Gold", "Local", FALSE + "Action", "Steal Gold Escape", "Local", FALSE + "Action", "Sabotage City", "Local", FALSE + "Action", "Sabotage City Escape", "Local", FALSE + "Action", "Targeted Sabotage City", "Local", FALSE + "Action", "Targeted Sabotage City Escape", "Local", FALSE + "Action", "Sabotage City Production Escape", "Local", FALSE + "Action", "Steal Tech", "Local", FALSE + "Action", "Steal Tech Escape Expected", "Local", FALSE + "Action", "Targeted Steal Tech", "Local", FALSE + "Action","Targeted Steal Tech Escape Expected","Local", FALSE + "Action", "Incite City", "Local", FALSE + "Action", "Incite City Escape", "Local", FALSE + "Action", "Establish Trade Route", "Local", FALSE + "Action", "Enter Marketplace", "Local", FALSE + "Action", "Help Wonder", "Local", FALSE + "Action", "Bribe Unit", "Local", FALSE + "Action", "Sabotage Unit", "Local", FALSE + "Action", "Sabotage Unit Escape", "Local", FALSE + "Action", "Capture Units", "Local", FALSE + "Action", "Found City", "Local", FALSE + "Action", "Join City", "Local", FALSE + "Action", "Steal Maps", "Local", FALSE + "Action", "Steal Maps Escape", "Local", FALSE + "Action", "Bombard", "Local", FALSE + "Action", "Bombard 2", "Local", FALSE + "Action", "Bombard 3", "Local", FALSE + "Action", "Suitcase Nuke", "Local", FALSE + "Action", "Suitcase Nuke Escape", "Local", FALSE + "Action", "Explode Nuclear", "Local", FALSE + "Action", "Nuke City", "Local", FALSE + "Action", "Nuke Units", "Local", FALSE + "Action", "Destroy City", "Local", FALSE + "Action", "Expel Unit", "Local", FALSE + "Action", "Recycle Unit", "Local", FALSE + "Action", "Disband Unit", "Local", FALSE + "Action", "Home City", "Local", FALSE + "Action", "Upgrade Unit", "Local", FALSE + "Action", "Paradrop Unit", "Local", FALSE + "Action", "Airlift Unit", "Local", FALSE + "Action", "Attack", "Local", FALSE + "Action", "Conquer City", "Local", FALSE + "Action", "Heal Unit", "Local", FALSE + "Action", "Transform Terrain", "Local", FALSE + "Action", "Cultivate", "Local", FALSE + "Action", "Plant", "Local", FALSE + "Action", "Pillage", "Local", FALSE + "Action", "Fortify", "Local", FALSE + "Action", "Build Road", "Local", FALSE + "Action", "Convert Unit", "Local", FALSE + "Action", "Build Base", "Local", FALSE + "Action", "Build Mine", "Local", FALSE + "Action", "Build Irrigation", "Local", FALSE + "Action", "Clean Pollution", "Local", FALSE + "Action", "Clean Fallout", "Local", FALSE + "Action", "Spy Attack", "Local", FALSE + } + +;Implement 'ugly hack' of kvilhaugsvik for invading cease-fire +;territory to be casus belli in 3.0 rulesets +;********************************************************************* +[effect_incident_success_move] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "DiplRel", "War", "Local", FALSE + "DiplRel", "Alliance", "Local", FALSE + "DiplRel", "Armistice", "Local", FALSE ; Time to get units out of the territory + "DiplRel", "Foreign", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "Action", "Establish Embassy", "Local", FALSE + "Action", "Establish Embassy Stay", "Local", FALSE + "Action", "Investigate City", "Local", FALSE + "Action", "Investigate City Spend Unit", "Local", FALSE + "Action", "Poison City", "Local", FALSE + "Action", "Poison City Escape", "Local", FALSE + "Action", "Steal Gold", "Local", FALSE + "Action", "Steal Gold Escape", "Local", FALSE + "Action", "Sabotage City", "Local", FALSE + "Action", "Sabotage City Escape", "Local", FALSE + "Action", "Targeted Sabotage City", "Local", FALSE + "Action", "Targeted Sabotage City Escape", "Local", FALSE + "Action", "Sabotage City Production Escape", "Local", FALSE + "Action", "Steal Tech", "Local", FALSE + "Action", "Steal Tech Escape Expected", "Local", FALSE + "Action", "Targeted Steal Tech", "Local", FALSE + "Action","Targeted Steal Tech Escape Expected","Local", FALSE + "Action", "Incite City", "Local", FALSE + "Action", "Incite City Escape", "Local", FALSE + "Action", "Establish Trade Route", "Local", FALSE + "Action", "Enter Marketplace", "Local", FALSE + "Action", "Help Wonder", "Local", FALSE + "Action", "Bribe Unit", "Local", FALSE + "Action", "Sabotage Unit", "Local", FALSE + "Action", "Sabotage Unit Escape", "Local", FALSE + "Action", "Capture Units", "Local", FALSE + "Action", "Found City", "Local", FALSE + "Action", "Join City", "Local", FALSE + "Action", "Steal Maps", "Local", FALSE + "Action", "Steal Maps Escape", "Local", FALSE + "Action", "Bombard", "Local", FALSE + "Action", "Bombard 2", "Local", FALSE + "Action", "Bombard 3", "Local", FALSE + "Action", "Suitcase Nuke", "Local", FALSE + "Action", "Suitcase Nuke Escape", "Local", FALSE + "Action", "Explode Nuclear", "Local", FALSE + "Action", "Nuke City", "Local", FALSE + "Action", "Nuke Units", "Local", FALSE + "Action", "Destroy City", "Local", FALSE + "Action", "Expel Unit", "Local", FALSE + "Action", "Recycle Unit", "Local", FALSE + "Action", "Disband Unit", "Local", FALSE + "Action", "Home City", "Local", FALSE + "Action", "Upgrade Unit", "Local", FALSE + "Action", "Paradrop Unit", "Local", FALSE + "Action", "Airlift Unit", "Local", FALSE + "Action", "Attack", "Local", FALSE + "Action", "Conquer City", "Local", FALSE + "Action", "Heal Unit", "Local", FALSE + "Action", "Transform Terrain", "Local", FALSE + "Action", "Cultivate", "Local", FALSE + "Action", "Plant", "Local", FALSE + "Action", "Pillage", "Local", FALSE + "Action", "Fortify", "Local", FALSE + "Action", "Build Road", "Local", FALSE + "Action", "Convert Unit", "Local", FALSE + "Action", "Build Base", "Local", FALSE + "Action", "Build Mine", "Local", FALSE + "Action", "Build Irrigation", "Local", FALSE + "Action", "Clean Pollution", "Local", FALSE + "Action", "Clean Fallout", "Local", FALSE + "Action", "Spy Attack", "Local", FALSE + } + +;This line intentionally left blank: diff --git a/freeciv/freeciv/data/mp2-brava2/game.ruleset b/freeciv/freeciv/data/mp2c-desert/game.ruleset similarity index 59% rename from freeciv/freeciv/data/mp2-brava2/game.ruleset rename to freeciv/freeciv/data/mp2c-desert/game.ruleset index 5925fc54c..9ab04b8fc 100644 --- a/freeciv/freeciv/data/mp2-brava2/game.ruleset +++ b/freeciv/freeciv/data/mp2c-desert/game.ruleset @@ -10,7 +10,7 @@ ; than minor changes. [datafile] -description="Avant-garde game rules for Freeciv" +description="MP2-Caravel game rules for Freeciv" options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" format_version=20 @@ -19,12 +19,12 @@ format_version=20 [ruledit] ; Which file to read description in from. -description_file = "mp2-brava/README.brava" +description_file = "mp2-caravel/README.txt" [about] ; Ruleset name ; DO NOT CHANGE, FCW unfortunately has to hard-code certain special cases for this. -name = _("MP2 Brava") +name = _("MP2 Caravel") ; There`s no separate versioning in rulesets part of main freeciv distribution ;version = "" @@ -37,12 +37,12 @@ name = _("MP2 Brava") ; Summary of the ruleset ; /* TRANS: In the client, this is displayed alongside the contents of -; README.brava, which are not localized. */ +; README.txt, which are not localized. */ summary = _("") ; Detailed description ; When updating this, update also desciption_file in [ruledit] section to match -description = *mp2-brava/README.brava* +description = *mp2-caravel/README.txt* ; What capabilities ruleset provides for the scenarios. ; mimimum-default-sets - Default units, terrains, buildings, etc @@ -52,6 +52,7 @@ capabilities = "std-terrains" [options] global_init_techs="" global_init_buildings="Palace" +popup_tech_help = FALSE [tileset] ; If preferred tileset is set, clients that support the feature will suggest @@ -265,7 +266,7 @@ if_attacker = { "type", "name", "range", "present" "DiplRel", "War", "Local", TRUE "MinMoveFrags", "9", "Local", TRUE - "UnitFlag", "WillNever", "Local", FALSE ; should replace will_never="WillNever" + "UnitFlag", "WillNever", "Local", FALSE ; in theory, replaces: will_never="WillNever" } [actions] @@ -413,16 +414,16 @@ ui_name_steal_maps = _("Steal %sMap Fragments%s") ui_name_investigate_city = _("%sInvestigate City%s") ; /* TRANS: _Investigate City (spends the unit) (100% chance of success). */ -ui_name_investigate_city_spend_unit = _("%sInvestigate City (spends the unit)%s") +;ui_name_investigate_city_spend_unit = _("%sInvestigate City (spends the unit)%s") ; /* TRANS: Help _build Wonder (100% chance of success). */ -ui_name_help_wonder = _("Help %sbuild Wonder%s") +ui_name_help_wonder = _("Help %sBuild Wonder%s") ; /* TRANS: Rec_ycle Unit (100% chance of success). */ ui_name_recycle_unit = _("Rec%sycle Unit%s") ; /* TRANS: _You're Fired (100% chance of success). */ -ui_name_disband_unit = _("%sYou're Fired%s") +ui_name_disband_unit = _("%sDisband Unit%s") ; /* TRANS: _Capture Units (100% chance of success). */ ui_name_capture_units = _("%sCapture Units%s") @@ -434,7 +435,7 @@ ui_name_found_city = _("%sBuild City%s") ui_name_join_city = _("%sAdd to City%s") ; /* TRANS: Explode _Nuclear In Place (100% chance of success). */ -ui_name_explode_nuclear = _("Explode %sNuclear In Place%s") +ui_name_explode_nuclear = _("Detonate %sNuke%s") ; /* TRANS: _Nuke City (100% chance of success). */ ui_name_nuke_city = _("%sNuke City%s") @@ -449,19 +450,22 @@ ui_name_nuke_units = _("%sNuke Units%s") ui_name_home_city = _("Set %sHome City%s") ; /* TRANS: _Upgrade Unit (100% chance of success). */ -ui_name_upgrade_unit = _("%sUpgrade Unit%s") +ui_name_upgrade_unit = _("%sUpgrade%s") ; /* TRANS: Drop _Paratrooper (100% chance of success). */ -ui_name_paradrop_unit = _("Drop %sParatrooper%s") +ui_name_paradrop_unit = _("%sParadrop%s") ; /* TRANS: _Airlift to City (100% chance of success). */ -ui_name_airlift_unit = _("%sAirlift to City%s") +ui_name_airlift_unit = _("%sAirlift%s") ; /* TRANS: _Attack (100% chance of success). */ ui_name_attack = _("%sAttack%s") +; /* TRANS: Eliminate _Spy (100% chance of success). */ +ui_name_spy_attack = _("Eliminate %sSpy%s") + ; /* TRANS: _Bombard (100% chance of success). */ -ui_name_bombard = _("Range%sd Attack%s") +ui_name_bombard = _("%sSpecial Attack%s") ; /* TRANS: _Explode Missile (100% chance of success). */ ui_name_suicide_attack = _("%sExplode Missile%s") @@ -476,7 +480,7 @@ ui_name_transform_terrain = _("%sTransform Terrain%s") ui_name_cultivate = _("%sCultivate%s") ; /* TRANS: Transform by _Planting (3% chance of success). */ -ui_name_plant = _("%sPlant Forest%s") +ui_name_plant = _("%sPlant%s") ; /* TRANS: Pilla_ge (100% chance of success). */ ui_name_pillage = _("Pilla%sge%s") @@ -504,7 +508,7 @@ ui_name_build_base = _("%sBuild Base%s") ui_name_build_mine = _("Build %sMine%s") ; /* TRANS: Build _Irrigation (100% chance of success). */ -ui_name_irrigate = _("Build %sIrrigation%s") +ui_name_irrigate = _("%sIrrigate%s") ; /* TRANS: _Deboard (100% chance of success). */ ui_name_transport_deboard = _("%sDeboard%s") @@ -521,6 +525,16 @@ ui_name_transport_disembark = _("%sDisembark%s") ; /* TRANS: _Embark (100% chance of success). */ ui_name_transport_embark = _("%sEmbark%s") +; Three Blank ruleset defined user actions. See README.actions +; See the section "Ruleset defined actions" is doc/README.actions +; Example: set up "User Action 1" +;ui_name_user_action_1 = _("%sDisrupt Supply Lines%s") +;user_action_1_target_kind = "individual units" +;user_action_1_min_range = 1 +;user_action_1_max_range = 3 +;user_action_1_actor_consuming_always = FALSE +; + ; Suppress automatic help text generation about what enables and/or ; disables the following actions. ; @@ -595,6 +609,30 @@ actor_reqs = "Tech", "Space Flight", "Player" "Age", "10", "Local" } +[actionenabler_foot_to_musket] ;;old foot units become muskets with Conscription +action = "Convert Unit" +actor_reqs = + { "type", "name", "range", "present" + "UnitClass","Land", "Local", TRUE + "UnitFlag", "FootSoldier", "Local", TRUE + "UnitType", "Riflemen", "Local", FALSE ; Don't allow Riflemen to become Workers with this enabler + "UnitType", "Musketeers", "Local", FALSE ; SAFETY: block future convert features that Musketeers might get + "UnitType", "Alpine Troops", "Local", FALSE ; SAFETY: block future convert features that Alpines might get + "UnitType", "Marines", "Local", FALSE ; SAFETY: block future convert features that Marines might get + "UnitType", "Paratroopers", "Local", FALSE ; SAFETY: block future convert features that Paratroopers might get + "UnitState","OnDomesticTile", "Local", TRUE + "CityTile", "Center", "Local", TRUE + "Tech", "Conscription", "Player",TRUE + } +[actionenabler_musket_to_rifle] ;;Musketeers become Riflemen with Labor Union +action = "Convert Unit" +actor_reqs = + { "type", "name", "range", "present" + "UnitType", "Musketeers", "Local", TRUE + "UnitState","OnDomesticTile", "Local", TRUE + "CityTile", "Center", "Local", TRUE + "Tech", "Labor Union", "Player",TRUE + } [actionenabler_sabotage_city] action = "Sabotage City" @@ -610,31 +648,46 @@ actor_reqs = [actionenabler_sabotage_city_spy] action = "Sabotage City Escape" actor_reqs = - { "type", "name", "range" - "UnitFlag", "Spy", "Local" - "DiplRel", "War", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" + { "type", "name", "range", "present" + "UnitFlag", "Spy", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "UnitState", "OnLivableTile", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "UnitType", "Siege Ram", "Local", FALSE } [actionenabler_sabotage_city_target] action = "Targeted Sabotage City Escape" actor_reqs = - { "type", "name", "range" - "DiplRel", "War", "Local" - "UnitFlag", "Spy", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" + { "type", "name", "range", "present" + "DiplRel", "War", "Local", TRUE + "UnitFlag", "Spy", "Local", TRUE + "UnitState", "OnLivableTile", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "UnitType", "Siege Ram", "Local", FALSE + } +;Batter Walls +[actionenabler_break_walls_siege_ram] +action = "Targeted Sabotage City Escape" +actor_reqs = + { "type", "name", "range", "present" + "Tech", "Metallurgy", "World", FALSE + "DiplRel", "War", "Local", TRUE + "UnitFlag", "Spy", "Local", TRUE + "UnitType", "Siege Ram", "Local", TRUE + "UnitState", "OnLivableTile", "Local", TRUE + "MinMoveFrags", "9", "Local", TRUE } [actionenabler_sabotage_city_production] action = "Sabotage City Production Escape" actor_reqs = - { "type", "name", "range" - "DiplRel", "War", "Local" - "UnitFlag", "Spy", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" + { "type", "name", "range", "present" + "DiplRel", "War", "Local", TRUE + "UnitFlag", "Spy", "Local", TRUE + "UnitState", "OnLivableTile", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "UnitType", "Siege Ram", "Local", FALSE } ; ************************ ESTABLISH EMBASSY *********************** @@ -655,7 +708,7 @@ target_reqs = { "type", "name", "range", "present" "NationGroup", "Barbarian", "Player", FALSE } -;if at war, police station/fundie will block embassy: do a cease-fire first! +;if at war, courthouse/police station/fundie will block embassy: do a cease-fire first! [actionenabler_establish_embassy_war] action = "Establish Embassy Stay" actor_reqs = @@ -669,10 +722,12 @@ actor_reqs = "DiplRel", "War", "Local", TRUE } target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - "Building", "Police Station", "City", FALSE ; to do: when we can check for spy present to stop it - "Gov", "Fundamentalism", "Player", FALSE + { "type", "name", "range", "present" + "NationGroup", "Barbarian", "Player", FALSE + "Building", "Courthouse", "City", FALSE + "Building", "Homeland Security", "City", FALSE + "Building", "Police Station", "City", FALSE ; to do: when we can check for spy present to stop it + "Gov", "Theocracy", "Player", FALSE } ; SPY: normal establish embassy--if not at war @@ -681,6 +736,7 @@ action = "Establish Embassy" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Spy", "Local", TRUE + "UnitType", "Siege Ram", "Local", FALSE "UnitState", "OnLivableTile", "Local", TRUE "UnitState", "Transported", "Local", FALSE "MinMoveFrags", "1", "Local", TRUE @@ -697,6 +753,7 @@ action = "Establish Embassy" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Spy", "Local", TRUE + "UnitType", "Siege Ram", "Local", FALSE "UnitState", "OnLivableTile", "Local", TRUE "UnitState", "Transported", "Local", FALSE "MinMoveFrags", "1", "Local", TRUE @@ -707,37 +764,59 @@ target_reqs = { "type", "name", "range", "present" "NationGroup", "Barbarian", "Player", FALSE "Building", "Police Station","City", FALSE ; to do: when we can check for spy present to stop it - "Gov", "Fundamentalism","Player", FALSE + "Gov", "Theocracy", "Player", FALSE } ; *************************************************** [actionenabler_investigate_city] -action = "Investigate City Spend Unit" +action = "Investigate City" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Diplomat", "Local", TRUE + "UnitType", "Siege Ram", "Local", FALSE + "UnitState", "OnLivableTile", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "DiplRel", "Foreign", "Local", TRUE + "UnitState", "Transported", "Local", FALSE + } +[actionenabler_investigate_city_tribesmen_explorer] +action = "Investigate City" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "IgTer", "Local", TRUE + "UnitFlag", "NonMil", "Local", TRUE "UnitState", "OnLivableTile", "Local", TRUE "MinMoveFrags", "1", "Local", TRUE "DiplRel", "Foreign", "Local", TRUE "UnitState", "Transported", "Local", FALSE - "UnitFlag", "Spy", "Local", FALSE } + +[actionenabler_investigate_city_satellite] +action = "Investigate City" +actor_reqs = + { "type", "name", "range","present" + "UnitType", "Satellite", "Local", TRUE + "DiplRel", "Foreign", "Local", TRUE + } + +;Spy can investigate city even if transported... [actionenabler_investigate_city_spy] action = "Investigate City" actor_reqs = { "type", "name", "range","present" "UnitFlag", "Spy", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE + "UnitType", "Siege Ram", "Local", FALSE "MinMoveFrags", "1", "Local", TRUE - "UnitState", "Transported", "Local", FALSE "DiplRel", "Foreign", "Local", TRUE } +; *********************************************************** [actionenabler_poison_city] action = "Poison City Escape" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Spy", "Local", TRUE + "UnitType", "Siege Ram", "Local", FALSE "UnitState", "Transported", "Local", FALSE "DiplRel", "War", "Local", TRUE "UnitState", "OnLivableTile", "Local", TRUE @@ -745,7 +824,7 @@ actor_reqs = } target_reqs = { "type", "name", "range" - "MinSize", "2", "City" +; "MinSize", "2", "City" ;; use poison to stop colonialism } [actionenabler_steal_maps_escape] @@ -753,6 +832,7 @@ action = "Steal Maps Escape" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Spy", "Local", TRUE + "UnitType", "Siege Ram", "Local", FALSE "UnitState", "OnLivableTile", "Local", TRUE "MinMoveFrags", "1", "Local", TRUE "DiplRel", "Foreign", "Local", TRUE @@ -767,6 +847,7 @@ action = "Steal Maps" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Diplomat", "Local" + "UnitType", "Siege Ram", "Local", FALSE "UnitState", "OnLivableTile", "Local" "MinMoveFrags", "1", "Local" "DiplRel", "Foreign", "Local" @@ -791,6 +872,7 @@ actor_reqs = target_reqs = { "type", "name", "range", "present" "NationGroup", "Barbarian", "Player", FALSE + "MinForeignPct", "49", "City", FALSE ; < 50% foreign before occupied city has tech blueprints floating around } [actionenabler_steal_tech_random_esc] @@ -798,6 +880,7 @@ action = "Steal Tech Escape Expected" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Spy", "Local", TRUE + "UnitType", "Siege Ram", "Local", FALSE "UnitState", "OnLivableTile", "Local", TRUE "MinMoveFrags", "1", "Local", TRUE "DiplRel", "Foreign", "Local", TRUE @@ -806,6 +889,7 @@ actor_reqs = target_reqs = { "type", "name", "range", "present" "NationGroup", "Barbarian", "Player", FALSE + "MinForeignPct", "49", "City", FALSE ; < 50% foreign before occupied city has tech blueprints floating around } [actionenabler_steal_tech_target] @@ -813,6 +897,7 @@ action = "Targeted Steal Tech Escape Expected" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Spy", "Local", TRUE + "UnitType", "Siege Ram", "Local", FALSE "UnitState", "OnLivableTile", "Local", TRUE "MinMoveFrags", "1", "Local", TRUE "DiplRel", "Foreign", "Local", TRUE @@ -821,6 +906,7 @@ actor_reqs = target_reqs = { "type", "name", "range", "present" "NationGroup", "Barbarian", "Player", FALSE + "MinForeignPct", "49", "City", FALSE ; < 50% foreign before occupied city has tech blueprints floating around } [actionenabler_incite_city] @@ -838,7 +924,6 @@ actor_reqs = } target_reqs = { "type", "name", "range", "present" - "Gov", "Democracy", "Player", FALSE "Building", "Palace", "City", FALSE "Building", "Ecclesiastical Palace", "City", FALSE "Building", "Mausoleum of Mausolos", "Player", FALSE @@ -849,6 +934,7 @@ action = "Incite City Escape" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Spy", "Local", TRUE + "UnitType", "Siege Ram", "Local", FALSE "DiplRel", "Alliance", "Local", FALSE "DiplRel", "Team", "Local", FALSE "UnitState", "OnLivableTile", "Local", TRUE @@ -858,7 +944,6 @@ actor_reqs = } target_reqs = { "type", "name", "range", "present" - "Gov", "Democracy", "Player", FALSE "Building", "Palace", "City", FALSE "Building", "Ecclesiastical Palace", "City", FALSE "Building", "Mausoleum of Mausolos", "Player", FALSE @@ -869,6 +954,7 @@ action = "Bribe Unit" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Diplomat", "Local", TRUE + "UnitType", "Siege Ram", "Local", FALSE "DiplRel", "Alliance", "Local", FALSE "DiplRel", "Team", "Local", FALSE "UnitState", "OnLivableTile", "Local", TRUE @@ -879,7 +965,6 @@ target_reqs = { "type", "name", "range", "present" "UnitFlag", "Unbribable", "Local", FALSE "CityTile", "Center", "Local", FALSE - "Gov", "Democracy", "Player", FALSE "MaxUnitsOnTile", "1", "Local", TRUE } @@ -888,6 +973,7 @@ action = "Sabotage Unit Escape" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Spy", "Local", TRUE + "UnitType", "Siege Ram", "Local", FALSE "DiplRel", "War", "Local", TRUE "UnitState", "OnLivableTile", "Local", TRUE "MinMoveFrags", "1", "Local", TRUE @@ -901,45 +987,65 @@ target_reqs = "MaxUnitsOnTile", "1", "Local", TRUE } -[actionenabler_traderoute] -action = "Establish Trade Route" +[actionenabler_eliminate_spy] +action = "Spy Attack" actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Spy", "Local", TRUE + "UnitType", "Siege Ram", "Local", FALSE + "UnitState","OnLivableTile","Local", TRUE + "UnitState","Transported", "Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "DiplRel", "Alliance", "Local", FALSE + "DiplRel", "Team", "Local", FALSE + "DiplRel", "Foreign", "Local", TRUE + } +target_reqs = { "type", "name", "range", "present" - "UnitFlag", "TradeRoute", "Local", TRUE - "Tech", "Trade", "Player", TRUE - "MinMoveFrags", "1", "Local", TRUE - "UnitState", "Transporting", "Local", FALSE ; avoids bug where land cargo "drowns" even on land terrain + "CityTile", "Center", "Local", FALSE } -[actionenabler_marketplace] -action = "Enter Marketplace" +[actionenabler_traderoute] +action = "Establish Trade Route" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "TradeRoute", "Local", TRUE - "Tech", "Trade", "Player", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "War", "Local", FALSE "UnitState", "Transporting", "Local", FALSE ; avoids bug where land cargo "drowns" even on land terrain - } -target_reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" + "MinMoveFrags", "1", "Local", TRUE + "UnitState", "HasHomeCity", "Local", TRUE } -[actionenabler_help_build_wonder] +;S12 cities with colossus giving 486 gold from a wagon; this has to be turned OFF until if/when +;we balance it or make a whole new formula for that stuff, based on simple value of the +;commerce unit times a simple multiplier. +;[actionenabler_marketplace] +;action = "Enter Marketplace" +;actor_reqs = +; { "type", "name", "range", "present" +; "UnitFlag", "TradeRoute", "Local", TRUE +; "UnitState", "Transporting", "Local", FALSE ; avoids bug where land cargo "drowns" even on land terrain +; "MinMoveFrags", "1", "Local", TRUE +; "DiplRel", "War", "Local", FALSE +; } +;target_reqs = +; { "type", "name", "range" +; "Building", "Marketplace", "City" +; } + +[actionenabler_help_build_great_wonder] action = "Help Wonder" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "HelpWonder", "Local", TRUE "UnitState", "Transporting", "Local", FALSE ; avoids bug where land cargo "drowns" even on land terrain "DiplRel", "War", "Local", FALSE - "UnitType", "Caravel", "Local", FALSE } target_reqs = { "type", "name", "range" "BuildingGenus", "GreatWonder", "Local" } +;This could also be used for "Great Units"; e.g., Doomsday Bomb. [actionenabler_help_build_small_wonder] action = "Help Wonder" actor_reqs = @@ -947,7 +1053,6 @@ actor_reqs = "UnitFlag", "HelpWonder", "Local", TRUE "UnitState", "Transporting", "Local", FALSE ; avoids bug where land cargo "drowns" even on land terrain "DiplRel", "War", "Local", FALSE - "UnitType", "Caravel", "Local", FALSE } target_reqs = { "type", "name", "range", "present" @@ -959,12 +1064,56 @@ action = "Recycle Unit" actor_reqs = { "type", "name", "range", "present", "quiet" "UnitFlag", "EvacuateFirst","Local", FALSE, TRUE + "UnitType", "Tribesmen", "Local", FALSE, TRUE "DiplRel", "War", "Local", FALSE, TRUE "DiplRel", "Cease-fire", "Local", FALSE, TRUE "DiplRel", "Armistice", "Local", FALSE, TRUE "DiplRel", "Peace", "Local", FALSE, TRUE } - +;TRIBESMEN RECYCLE: Building, Wonder, or Coinage (special) +[actionenabler_recycle_unit_tribesmen_1] +action = "Recycle Unit" +actor_reqs = + { "type", "name", "range", "present", "quiet" + "UnitType", "Tribesmen", "Local", TRUE, TRUE + "DiplRel", "War", "Local", FALSE, TRUE + "DiplRel", "Cease-fire", "Local", FALSE, TRUE + "DiplRel", "Armistice", "Local", FALSE, TRUE + "DiplRel", "Peace", "Local", FALSE, TRUE + } +target_reqs = + { "type", "name", "range", "present" + "BuildingGenus", "SmallWonder", "Local", TRUE + } +[actionenabler_recycle_unit_tribesmen_2] +action = "Recycle Unit" +actor_reqs = + { "type", "name", "range", "present", "quiet" + "UnitType", "Tribesmen", "Local", TRUE, TRUE + "DiplRel", "War", "Local", FALSE, TRUE + "DiplRel", "Cease-fire", "Local", FALSE, TRUE + "DiplRel", "Armistice", "Local", FALSE, TRUE + "DiplRel", "Peace", "Local", FALSE, TRUE + } +target_reqs = + { "type", "name", "range", "present" + "BuildingGenus", "Improvement", "Local", TRUE + } +[actionenabler_recycle_unit_tribesmen_3] +action = "Recycle Unit" +actor_reqs = + { "type", "name", "range", "present", "quiet" + "UnitType", "Tribesmen", "Local", TRUE, TRUE + "DiplRel", "War", "Local", FALSE, TRUE + "DiplRel", "Cease-fire", "Local", FALSE, TRUE + "DiplRel", "Armistice", "Local", FALSE, TRUE + "DiplRel", "Peace", "Local", FALSE, TRUE + } +target_reqs = + { "type", "name", "range", "present" + "BuildingGenus", "Special", "Local", TRUE + } +;--------------------------- [actionenabler_disband_unit] action = "Disband Unit" actor_reqs = @@ -993,16 +1142,72 @@ target_reqs = "Extra", "Fort", "Local", FALSE "Extra", "Fortress", "Local", FALSE "Extra", "Naval Base", "Local", FALSE + "Extra", "Castle", "Local", FALSE + "Extra", "Bunker", "Local", FALSE + } +;CAPTURING LAND COMMERCE UNIT CARRYING CARGO: +;Transported commercial cargo does not prevent capture! +[actionenabler_capture_commerce] +action = "Capture Units" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Capturer", "Local", TRUE + "UnitState", "Transported", "Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "DiplRel", "Foreign", "Local", TRUE + "DiplRel", "Alliance", "Local", FALSE + } +target_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Capturable", "Local", TRUE + "CityTile", "Center", "Local", FALSE + "Terrain", "Mountains", "Local", FALSE + "MaxUnitsOnTile","1", "Local", FALSE ; only applies to stack + "Extra", "Fort", "Local", FALSE + "Extra", "Fortress", "Local", FALSE + "Extra", "Naval Base", "Local", FALSE + "Extra", "Castle", "Local", FALSE + "Extra", "Bunker", "Local", FALSE + ;exclusions to only leave commerce and cargo: + "UnitFlag", "Settlers", "Local", FALSE ; workers and foot units who make hideouts + "UnitFlag", "NonMil", "Local", TRUE ; all military excluded + "UnitFlag", "HasNoZOC", "Local", TRUE ; " " " + "UnitFlag", "Diplomat", "Local", FALSE ; no diplomat + "UnitType", "Explorer", "Local", FALSE ; no explorer + "TerrainClass", "Oceanic", "Local", FALSE ; not on a ship + "UnitClass", "RiverShip", "Local", FALSE ; no ships + "UnitClass", "Trireme", "Local", FALSE ; no ships + "UnitClass", "Sea", "Local", FALSE ; no ships } ; ***************** BOMBARDS ***************************** ;Archers can do volley attacks +; can hit ocean from land, and land from ocean. [actionenabler_archer_volley] action = "Bombard" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Bombarder", "Local", TRUE "UnitType", "Archers", "Local", TRUE + "UnitState", "Transported", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "DiplRel", "War", "Local", TRUE + } +target_reqs = + { "type", "name", "range","present" + "CityTile", "Center", "Local", FALSE + "Extra", "Fortress", "Local", FALSE + "Extra", "Naval Base", "Local", FALSE + "TerrainClass", "Oceanic", "Local", FALSE + } +;Can hit Oceanic but not while transported. +[actionenabler_archer_volley2] +action = "Bombard" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Bombarder", "Local", TRUE + "UnitType", "Archers", "Local", TRUE + "UnitState", "Transported", "Local", FALSE "MinMoveFrags", "1", "Local", TRUE "DiplRel", "War", "Local", TRUE } @@ -1011,20 +1216,111 @@ target_reqs = "CityTile", "Center", "Local", FALSE "Extra", "Fortress", "Local", FALSE "Extra", "Naval Base", "Local", FALSE + } + +;Fortified Phalanxes can "rumble" +[actionenabler_phalanx_rumble_fortified] +action = "Bombard" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Bombarder", "Local", TRUE + "UnitType", "Phalanx", "Local", TRUE + "UnitState", "Transported", "Local", FALSE + "UnitState", "Fortified", "Local", TRUE ;"Activity","Fortified","Local",TRUE ;3.1 version, which we now have working also. + "MinMoveFrags", "9", "Local", TRUE + "DiplRel", "War", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" + "CityTile", "Center", "Local", FALSE + "Extra", "Fort", "Local", FALSE + "Extra", "Fortress", "Local", FALSE + "Extra", "Naval Base","Local", FALSE + "TerrainClass","Oceanic", "Local", FALSE + } +;Phalanxes who haven't moved can "rumble" +[actionenabler_phalanx_rumble_unmoved] +action = "Bombard" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Bombarder", "Local", TRUE + "UnitType", "Phalanx", "Local", TRUE + "UnitState", "Transported", "Local", FALSE + "UnitState", "MovedThisTurn","Local", FALSE + "MinMoveFrags", "9", "Local", TRUE + "DiplRel", "War", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" + "CityTile", "Center", "Local", FALSE + "Extra", "Fort", "Local", FALSE + "Extra", "Fortress", "Local", FALSE + "Extra", "Naval Base","Local", FALSE + "TerrainClass","Oceanic", "Local", FALSE + } +;Legions can do Pilum assault +[actionenabler_legion_pilum_assault] +action = "Bombard" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Bombarder", "Local", TRUE + "UnitType", "Legion", "Local", TRUE + "UnitState", "Transported", "Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "DiplRel", "War", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" + "CityTile", "Center", "Local", FALSE + "Extra", "Fortress", "Local", FALSE + "Extra", "Fort", "Local", FALSE + "Extra", "Naval Base", "Local", FALSE "TerrainClass", "Oceanic", "Local", FALSE } +;Siege Rams can assault Fortress Perimeter +[actionenabler_siege_ram_fortress_assault] +action = "Bombard" +actor_reqs = + { "type", "name", "range", "present" + "Tech", "Metallurgy", "World", FALSE + "UnitFlag", "Bombarder", "Local", TRUE + "UnitType", "Siege Ram", "Local", TRUE + "UnitState", "Transported", "Local", FALSE + "MinMoveFrags", "10", "Local", TRUE + "DiplRel", "War", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" + "Extra", "Fortress", "Local", TRUE + } +;Siege Rams can assault Fortress Perimeter +[actionenabler_siege_ram_navbase_assault] +action = "Bombard" +actor_reqs = + { "type", "name", "range", "present" + "Tech", "Metallurgy", "World", FALSE + "UnitFlag", "Bombarder", "Local", TRUE + "UnitType", "Siege Ram", "Local", TRUE + "UnitState", "Transported", "Local", FALSE + "MinMoveFrags", "9", "Local", TRUE + "DiplRel", "War", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" + "Extra", "Naval Base", "Local", TRUE + } -;Fanatics can do skirmish assaults -[actionenabler_fanatic_skirmish_assault] +;Zealots can do skirmish assaults +[actionenabler_zealot_skirmish_assault] action = "Bombard" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Bombarder", "Local", TRUE - "UnitType", "Fanatics", "Local", TRUE + "UnitType", "Zealots", "Local", TRUE "UnitState", "OnDomesticTile", "Local", TRUE "MinMoveFrags", "1", "Local", TRUE "DiplRel", "War", "Local", TRUE - "Gov", "Fundamentalism", "Player", TRUE + "Gov", "Theocracy", "Player", TRUE ; "UnitState", "Transported", "Local", FALSE } target_reqs = @@ -1034,6 +1330,98 @@ target_reqs = "Extra", "Naval Base", "Local", FALSE "TerrainClass", "Oceanic", "Local", FALSE } +;Zealots can infiltrate/skirmish foreign occupied cities +[actionenabler_zealot_skirmish_original_city] +action = "Bombard" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Bombarder", "Local", TRUE + "UnitType", "Zealots", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "Gov", "Theocracy", "Player", TRUE + } +target_reqs = + { "type", "name", "range", "present" + "CityTile", "Center", "Local", TRUE + "Extra", "Fortress", "Local", FALSE + "Extra", "Naval Base", "Local", FALSE + "TerrainClass", "Oceanic", "Local", FALSE + "CityStatus","OwnedByOriginal","City", FALSE + "MinForeignPct","1", "City", TRUE + } +;Zeppelins can bomb +[actionenabler_zeppelin_bomb] +action = "Bombard" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Bombarder", "Local", TRUE + "UnitType", "Zeppelin", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "DiplRel", "War", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" +; "CityTile", "Center", "Local", FALSE + "UnitClass", "Air", "Local", FALSE + "UnitClass", "AirProtect", "Local", FALSE + "UnitClass", "Missile", "Local", FALSE + "UnitClass", "Helicopter", "Local", FALSE + "UnitClass", "Space", "Local", FALSE + "UnitClass", "Balloon", "Local", FALSE + "UnitClass", "Bomb", "Local", FALSE + "UnitClass", "Zeppelin", "Local", FALSE + "UnitClass", "Air_High_Altitude", "Local", FALSE + } + +;Marines can do mortar/bazooka/rocket attacks at V3 +[actionenabler_marines_bombard] +action = "Bombard" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Bombarder", "Local", TRUE + "UnitType", "Marines", "Local", TRUE + "UnitState", "Transported", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "MinVeteran", "2", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" + "CityTile", "Center", "Local", FALSE + "Extra", "Fortress", "Local", FALSE + "Extra", "Naval Base", "Local", FALSE + "TerrainClass", "Oceanic", "Local", FALSE + } +;Can hit Oceanic but not while transported +[actionenabler_marines_bombard2] +action = "Bombard" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Bombarder", "Local", TRUE + "UnitType", "Marines", "Local", TRUE + "UnitState", "Transported", "Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "MinVeteran", "2", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" + "CityTile", "Center", "Local", FALSE + "Extra", "Fortress", "Local", FALSE + "Extra", "Naval Base", "Local", FALSE + } + +;Battleships can do bombardment +[actionenabler_battleship_bombard] +action = "Bombard" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Bombarder", "Local", TRUE + "UnitType", "Battleship", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "DiplRel", "War", "Local", TRUE + } ; ******************************************************** [actionenabler_build_city_pioneer] @@ -1088,6 +1476,27 @@ actor_reqs = "MinMoveFrags", "1", "Local", TRUE } +;Reserved for Surgical Strike Actions Later +;TODO? Siege Ram could now use this instead of Spy Flag hacky solution. +;[actionenabler_surgical_strike_building] +;action = "Surgical Strike Building" +;actor_reqs = +; { "type", "name", "range", "present" +;; "UnitType", "Ground Strike Fighter", "Local", TRUE +;; "UnitFlag", "Building_Bomber", "Local", TRUE +; "DiplRel", "War", "Local", TRUE +; } +; Reserved for "production bombing" future feature; will need +; action_odds effects that are reduced by sam batteries and etc. +;[actionenabler_surgical_strike_production] +;action = "Surgical Strike Production" +;actor_reqs = +; { "type", "name", "range", "present" +; "UnitFlag", "Production_Bomber", "Local", TRUE +; "DiplRel", "War", "Local", TRUE +; "UnitState", "Transported", "Local", FALSE +; } + ;Land expel: must be not on a mountain nor an air expeller/expellee [actionenabler_border_police] action = "Expel Unit" @@ -1098,7 +1507,9 @@ actor_reqs = "UnitClass", "AirProtect", "Local", FALSE "UnitFlag", "NonMil", "Local", FALSE ;Non-Military land class can't expel "UnitType", "Warriors", "Local", FALSE ;Warriors are too weak to expel + "UnitType", "Tribesmen", "Local", FALSE ;Tribesmen too. "UnitState", "OnDomesticTile", "Local", TRUE + "UnitState", "OnNativeTile", "Local", TRUE ;Transported units can expel on rivers but not from ocean "DiplRel", "Foreign", "Local", TRUE "DiplRel", "Team", "Local", FALSE "DiplRel", "Alliance", "Local", FALSE @@ -1136,148 +1547,566 @@ target_reqs = "UnitState", "OnDomesticTile", "Local", FALSE "MaxUnitsOnTile", "1", "Local", TRUE } - -[actionenabler_nuke] -action = "Explode Nuclear" + +[actionenabler_nuke] +action = "Explode Nuclear" +actor_reqs = + { "type", "name", "range", "present", "quiet" + "UnitFlag", "Nuclear", "Local", TRUE, FALSE + "ServerSetting","nukes_minor","World", TRUE, FALSE + } + +[actionenabler_nuke_city] +action="Nuke City" +actor_reqs= + { "type", "name", "range" + "UnitFlag", "Nuclear", "Local" + "MinMoveFrags", "1", "Local" + "DiplRel", "War", "Local" + } + +[actionenabler_nuke_units] +action="Nuke Units" +actor_reqs= + { "type", "name", "range" + "UnitFlag", "Nuclear", "Local" + "MinMoveFrags", "1", "Local" + "DiplRel", "War", "Local" + } +target_reqs= + { "type", "name", "range", "present" + "CityTile", "Center", "Local", FALSE + } + +;DESTROY CITY +; The GameLoss unit requirement makes sending units on a suicide mission to +; capture and destroy cities deep inside enemy terrain national suicide. +; The risk of moving a GameLoss unit to the target city increases the cost +; of the action. Rationalization for the requirement: the physical presence +; of the Leader makes it easier to comply with the order to destroy the +; city. (See the "orders by phone" Milgram experiment variation) +; +; The domestic city requirement forces the player to invade a city before +; he can destroy it. If this limit is weakened by allowing the destruction +; of undefended (MaxUnitsOnTile) foreign cities during war it will lead to +; situations where a player can destroy a city but is unable to occupy it. +; Rationalization: the resistance must be crushed before the destruction. +; +; TODO: create an international incident (set the Casus_Belli_Success +; effect value to 1000) if "Destroy City" still is overpowered. +[actionenabler_scorched_earth] +action = "Destroy City" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "GameLoss", "Local", TRUE + "DiplRel", "Foreign", "Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "UnitState", "OnLivableTile", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" + "MaxUnitsonTile","0", "Local", TRUE + } + +;ATTACKS every enabler below has 2 more duplicates in sections below, to +;handle Pax Dei logic. Always keep them identical except for Pax Dei +;reqs, which fall below the ;... marker. +;--------------------------------------------------------------------------- +;Tribesmen can attack: +[actionenabler_attack_native_tribesmen] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitType", "Tribesmen", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "UnitState", "OnNativeTile", "Local", TRUE + "UnitState", "Transported", "Local", FALSE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", FALSE + } +;Native attack ALWAYS allowed for units who aren't CargoRestrained +[actionenabler_landclass_attacker_native_unrestrained] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMil", "Local", FALSE + "UnitClassFlag","CargoRestrained","Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "UnitState", "OnNativeTile", "Local", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", FALSE + } +;Native attack ALWAYS allowed for units who aren't CargoRestrained +[actionenabler_non_landclass_attacker_native_unrestrained] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMil", "Local", FALSE + "UnitClassFlag","CargoRestrained","Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "UnitState", "OnNativeTile", "Local", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", FALSE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", FALSE + } +target_reqs = + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE + } +;Native attack for CargoRestrained units allowed, if not Transported +[actionenabler_landclass_attacker_native_restrained] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMil", "Local", FALSE + "UnitClassFlag","CargoRestrained","Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "UnitState", "OnNativeTile", "Local", TRUE + "UnitState", "Transported", "Local", FALSE + "UnitClassFlag","TerrainSpeed", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", FALSE + } +;Non-Land units can't attack Bunkers +[actionenabler_non_landclass_attacker_native_restrained] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMil", "Local", FALSE + "UnitClassFlag","CargoRestrained","Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "UnitState", "OnNativeTile", "Local", TRUE + "UnitState", "Transported", "Local", FALSE + "UnitClassFlag", "TerrainSpeed", "Local", FALSE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", FALSE + } +target_reqs = + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE + } +;Marines +[actionenabler_attack_marines] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMil", "Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "UnitFlag", "Marines", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", FALSE + } +[actionenabler_landclass_attack_from_non_native] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMil", "Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "UnitClassFlag", "AttFromNonNative", "Local", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", FALSE + } +[actionenabler_non_landclass_attack_from_non_native] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMil", "Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "UnitClassFlag", "AttFromNonNative", "Local", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", FALSE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", FALSE + } +target_reqs = + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE + } +; ***** NON-MIL ATTACKER rules (commerce units) +;Commerce units have to be NonMil to enter peaceful waters +;but they can also attack those with whom they are at war: +[actionenabler_attack_native_nonmil_attacker] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMilAttack", "Local", TRUE + "UnitClassFlag","CargoRestrained","Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "UnitState", "OnNativeTile", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", FALSE + } +target_reqs = + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE + } +[actionenabler_attack_from_non_native_nonmil_attacker] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMilAttack", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "UnitClassFlag", "AttFromNonNative", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", FALSE + } +target_reqs = + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE + } + +[actionenabler_explode_missile] +action = "Suicide Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMil", "Local", FALSE + "UnitClassFlag", "Missile", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "DiplRel", "War", "Local", TRUE + } + +;--------------------------------------------------------------------------- +; Same as above. For PAX DEI without Monotheism, it's legal. +;--------------------------------------------------------------------------- +;Native attack ALWAYS allowed for units who aren't CargoRestrained +[actionenabler_landclass_attacker_native_unrestrained_pd_no_m] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMil", "Local", FALSE + "UnitClassFlag","CargoRestrained","Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "UnitState", "OnNativeTile", "Local", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "Tech", "Monotheism", "Player",FALSE + } +;Native attack ALWAYS allowed for units who aren't CargoRestrained +[actionenabler_non_landclass_attacker_native_unrestrained_pd_no_m] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMil", "Local", FALSE + "UnitClassFlag","CargoRestrained","Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "UnitState", "OnNativeTile", "Local", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", FALSE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "Tech", "Monotheism", "Player",FALSE + } +target_reqs = + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE + } +;Native attack for CargoRestrained units allowed, if not Transported +[actionenabler_landclass_attacker_native_restrained_pd_no_m] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMil", "Local", FALSE + "UnitClassFlag","CargoRestrained","Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "UnitState", "OnNativeTile", "Local", TRUE + "UnitState", "Transported", "Local", FALSE + "UnitClassFlag","TerrainSpeed", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "Tech", "Monotheism", "Player",FALSE + } +;Non-Land units can't attack Bunkers +[actionenabler_non_landclass_attacker_native_restrained_pd_no_m] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMil", "Local", FALSE + "UnitClassFlag","CargoRestrained","Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "UnitState", "OnNativeTile", "Local", TRUE + "UnitState", "Transported", "Local", FALSE + "UnitClassFlag", "TerrainSpeed", "Local", FALSE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "Tech", "Monotheism", "Player",FALSE + } +target_reqs = + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE + } +;Marines +[actionenabler_attack_marines_pd_no_m] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMil", "Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "UnitFlag", "Marines", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "Tech", "Monotheism", "Player",FALSE + } +[actionenabler_landclass_attack_from_non_native_pd_no_m] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMil", "Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "UnitClassFlag", "AttFromNonNative", "Local", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "Tech", "Monotheism", "Player",FALSE + } +[actionenabler_non_landclass_attack_from_non_native_pd_no_m] +action = "Attack" actor_reqs = - { "type", "name", "range", "present", "quiet" - "UnitFlag", "Nuclear", "Local", TRUE, FALSE - "ServerSetting","nukes_minor","World", TRUE, FALSE + { "type", "name", "range", "present" + "UnitFlag", "NonMil", "Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "UnitClassFlag", "AttFromNonNative", "Local", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", FALSE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "Tech", "Monotheism", "Player",FALSE } - -[actionenabler_nuke_city] -action="Nuke City" -actor_reqs= - { "type", "name", "range" - "UnitFlag", "Nuclear", "Local" - "MinMoveFrags", "1", "Local" - "DiplRel", "War", "Local" +target_reqs = + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE } - -[actionenabler_nuke_units] -action="Nuke Units" -actor_reqs= - { "type", "name", "range" - "UnitFlag", "Nuclear", "Local" - "MinMoveFrags", "1", "Local" - "DiplRel", "War", "Local" +; ***** NON-MIL ATTACKER rules (commerce units) +;Commerce units have to be NonMil to enter peaceful waters +;but they can also attack those with whom they are at war: +[actionenabler_attack_native_nonmil_attacker_pd_no_m] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMilAttack", "Local", TRUE + "UnitClassFlag","CargoRestrained","Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "UnitState", "OnNativeTile", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "Tech", "Monotheism", "Player",FALSE } -target_reqs= - { "type", "name", "range", "present" - "CityTile", "Center", "Local", FALSE +target_reqs = + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE } - -;DESTROY CITY -; The GameLoss unit requirement makes sending units on a suicide mission to -; capture and destroy cities deep inside enemy terrain national suicide. -; The risk of moving a GameLoss unit to the target city increases the cost -; of the action. Rationalization for the requirement: the physical presence -; of the Leader makes it easier to comply with the order to destroy the -; city. (See the "orders by phone" Milgram experiment variation) -; -; The domestic city requirement forces the player to invade a city before -; he can destroy it. If this limit is weakened by allowing the destruction -; of undefended (MaxUnitsOnTile) foreign cities during war it will lead to -; situations where a player can destroy a city but is unable to occupy it. -; Rationalization: the resistance must be crushed before the destruction. -; -; TODO: create an international incident (set the Casus_Belli_Success -; effect value to 1000) if "Destroy City" still is overpowered. -[actionenabler_scorched_earth] -action = "Destroy City" +[actionenabler_attack_from_non_native_nonmil_attacker_pd_no_m] +action = "Attack" actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "GameLoss", "Local", TRUE - "DiplRel", "Foreign", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE + { "type", "name", "range", "present" + "UnitFlag", "NonMilAttack", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "UnitClassFlag", "AttFromNonNative", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "Tech", "Monotheism", "Player",FALSE } -target_reqs = - { "type", "name", "range", "present" - "MaxUnitsonTile","0", "Local", TRUE +target_reqs = + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE } - -;UPGRADE - all the below need Missile=FALSE after merge with main branch ;--------------------------------------------------------------------------- +; Last one. For PAX DEI on your own territory, it's legal. +;--------------------------------------------------------------------------- +;Native attack ALWAYS allowed for units who aren't CargoRestrained +[actionenabler_landclass_attacker_native_unrestrained_pd_m_domestic] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMil", "Local", FALSE + "UnitClassFlag","CargoRestrained","Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "UnitState", "OnNativeTile", "Local", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "UnitState", "OnDomesticTile", "Local", TRUE + } ;Native attack ALWAYS allowed for units who aren't CargoRestrained -[actionenabler_attack_native_unrestrained] +[actionenabler_non_landclass_attacker_native_unrestrained_pd_m_domestic] action = "Attack" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "NonMil", "Local", FALSE - "UnitClassFlag","Missile", "Local", FALSE "UnitClassFlag","CargoRestrained","Local", FALSE "MinMoveFrags", "1", "Local", TRUE "UnitState", "OnNativeTile", "Local", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", FALSE "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "UnitState", "OnDomesticTile", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE } ;Native attack for CargoRestrained units allowed, if not Transported -[actionenabler_attack_native_restrained] +[actionenabler_landclass_attacker_native_restrained_pd_m_domestic] action = "Attack" -;Should Archers attack from Rivers? Probably, but then what is the Pandora's box? Muskets, etc? actor_reqs = { "type", "name", "range", "present" "UnitFlag", "NonMil", "Local", FALSE - "UnitClassFlag","Missile", "Local", FALSE "UnitClassFlag","CargoRestrained","Local", TRUE "MinMoveFrags", "1", "Local", TRUE "UnitState", "OnNativeTile", "Local", TRUE "UnitState", "Transported", "Local", FALSE + "UnitClassFlag","TerrainSpeed", "Local", TRUE "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "UnitState", "OnDomesticTile", "Local", TRUE } -;Commerce units have to be NonMil to enter peaceful waters -;but they can also attack those with whom they are at war: -[actionenabler_attack_native_nonmil_attacker] +;Non-Land units can't attack Bunkers +[actionenabler_non_landclass_attacker_native_restrained_pd_m_domestic] action = "Attack" actor_reqs = { "type", "name", "range", "present" - "UnitFlag", "NonMilAttack", "Local", TRUE - "UnitClassFlag","Missile", "Local", FALSE - "UnitClassFlag","CargoRestrained","Local", FALSE + "UnitFlag", "NonMil", "Local", FALSE + "UnitClassFlag","CargoRestrained","Local", TRUE "MinMoveFrags", "1", "Local", TRUE "UnitState", "OnNativeTile", "Local", TRUE + "UnitState", "Transported", "Local", FALSE + "UnitClassFlag", "TerrainSpeed", "Local", FALSE "DiplRel", "War", "Local", TRUE - } + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "UnitState", "OnDomesticTile", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE + } ;Marines -[actionenabler_attack_marines] +[actionenabler_attack_marines_pd_m_domestic] action = "Attack" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "NonMil", "Local", FALSE - "UnitClassFlag","Missile", "Local", FALSE "MinMoveFrags", "1", "Local", TRUE "UnitFlag", "Marines", "Local", TRUE "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "UnitState", "OnDomesticTile", "Local", TRUE } -[actionenabler_attack_from_non_native] +[actionenabler_landclass_attack_from_non_native_pd_m_domestic] action = "Attack" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "NonMil", "Local", FALSE - "UnitClassFlag", "Missile", "Local", FALSE "MinMoveFrags", "1", "Local", TRUE "UnitClassFlag", "AttFromNonNative", "Local", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", TRUE "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "UnitState", "OnDomesticTile", "Local", TRUE } -[actionenabler_attack_from_non_native_nonmil_attacker] +[actionenabler_non_landclass_attack_from_non_native_pd_m_domestic] action = "Attack" actor_reqs = { "type", "name", "range", "present" - "UnitFlag", "NonMilAttack", "Local", TRUE - "UnitClassFlag", "Missile", "Local", FALSE + "UnitFlag", "NonMil", "Local", FALSE "MinMoveFrags", "1", "Local", TRUE "UnitClassFlag", "AttFromNonNative", "Local", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", FALSE "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "UnitState", "OnDomesticTile", "Local", TRUE } - -[actionenabler_explode_missile] -action = "Suicide Attack" +target_reqs = + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE + } +; ***** NON-MIL ATTACKER rules (commerce units) +;Commerce units have to be NonMil to enter peaceful waters +;but they can also attack those with whom they are at war: +[actionenabler_attack_native_nonmil_attacker_pd_m_domestic] +action = "Attack" actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "NonMil", "Local", FALSE - "UnitClassFlag", "Missile", "Local", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "War", "Local", TRUE + { "type", "name", "range", "present" + "UnitFlag", "NonMilAttack", "Local", TRUE + "UnitClassFlag","CargoRestrained","Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "UnitState", "OnNativeTile", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "UnitState", "OnDomesticTile", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE + } +[actionenabler_attack_from_non_native_nonmil_attacker_pd_m_domestic] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMilAttack", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "UnitClassFlag", "AttFromNonNative", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "UnitState", "OnDomesticTile", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE } ;--------------------------------------------------------------------------- [actionenabler_conquer_city_native_unrestrained] @@ -1286,10 +2115,12 @@ actor_reqs = { "type", "name", "range", "present" "UnitClassFlag", "CanOccupyCity", "Local", TRUE "UnitClassFlag", "CargoRestrained","Local", FALSE + "UnitType", "Transport Helicopter", "Local", FALSE "UnitFlag", "NonMil", "Local", FALSE "DiplRel", "War", "Local", TRUE "MinMoveFrags", "1", "Local", TRUE "UnitState", "OnLivableTile", "Local", TRUE + "Nation", "Animal Kingdom", "Player",FALSE } target_reqs = { "type", "name", "range", "present" @@ -1306,6 +2137,7 @@ actor_reqs = "DiplRel", "War", "Local", TRUE "MinMoveFrags", "1", "Local", TRUE "UnitState", "OnLivableTile", "Local", TRUE + "Nation", "Animal Kingdom", "Player",FALSE } target_reqs = { "type", "name", "range", "present" @@ -1323,6 +2155,7 @@ actor_reqs = "UnitType", "Anti-Aircraft Artillery", "Local", FALSE ;AAA got Marines flag only to enable reasonable attacks, ;not for conquering cities from a Transport. + "Nation", "Animal Kingdom", "Player",FALSE } target_reqs = { "type", "name", "range", "present" @@ -1340,6 +2173,7 @@ actor_reqs = "UnitType", "Anti-Aircraft Artillery", "Local", FALSE ;AAA got AttFromNonNative only to enable reasonable attacks, ;not for conquering cities from a Transport. + "Nation", "Animal Kingdom", "Player",FALSE } target_reqs = { "type", "name", "range", "present" @@ -1388,7 +2222,8 @@ actor_reqs = action = "Upgrade Unit" actor_reqs = { "type", "name", "range", "present" - "DiplRel", "Foreign", "Local", FALSE + "DiplRel", "Foreign", "Local", FALSE + "CityTile", "Center", "Local", TRUE } [actionenabler_airlift_unit] @@ -1416,16 +2251,25 @@ actor_reqs = "Terrain", "Grassland", "Local", FALSE } -[actionenabler_irrigate_tf] +[actionenabler_cultivate] action = "Cultivate" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE "UnitFlag", "CanHide", "Local", FALSE -; "UnitType", "Legion", "Local", FALSE + "UnitFlag", "CanClaim", "Local", FALSE + "UnitType", "Tribesmen", "Local", FALSE "UnitType", "Proletarians", "Local", FALSE } -[actionenabler_irrigate_tf_prole] +[actionenabler_cultivate_tribesmen] +action = "Cultivate" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Settlers", "Local", TRUE + "UnitType", "Tribesmen", "Local", TRUE + "MinYear", "-2000", "World", FALSE ; they get old + } +[actionenabler_cultivate_prole] action = "Cultivate" actor_reqs = { "type", "name", "range", "present" @@ -1434,18 +2278,28 @@ actor_reqs = "Gov", "Communism", "Player", TRUE } -[actionenabler_mine_tf_outside_city] +[actionenabler_plant_outside_city] action = "Plant" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE - "UnitFlag", "CanHide", "Local", FALSE -; "UnitType", "Legion", "Local", FALSE + "UnitFlag", "CanHide", "Local", FALSE + "UnitFlag", "CanClaim", "Local", FALSE + "UnitType", "Tribesmen", "Local", FALSE "UnitType", "Proletarians","Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE + "UnitFlag", "Well-Digger", "Local", FALSE + "CityTile", "Center", "Local", FALSE + } +[actionenabler_plant_outside_city_tribesmen] +action = "Plant" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Settlers", "Local", TRUE + "UnitType", "Tribesmen", "Local", TRUE "CityTile", "Center", "Local", FALSE + "MinYear", "-2000", "World", FALSE ; they get old } -[actionenabler_mine_tf_outside_city_prole] +[actionenabler_plant_outside_city_prole] action = "Plant" actor_reqs = { "type", "name", "range", "present" @@ -1454,37 +2308,55 @@ actor_reqs = "Gov", "Communism", "Player", TRUE "CityTile", "Center", "Local", FALSE } -[actionenabler_mine_tf_inside_city] ;you can't plant a forest in an existing city +[actionenabler_plant_inside_city] ;you can't plant a forest in an existing city action = "Plant" actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE -; "UnitType", "Legion", "Local", FALSE - "UnitFlag", "CanHide", "Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - "CityTile", "Center", "Local", TRUE - "Terrain", "Grassland", "Local", FALSE - "Terrain", "Plains", "Local", FALSE + { "type", "name", "range", "present" + "UnitFlag", "Settlers", "Local", TRUE + "UnitFlag", "CanHide", "Local", FALSE + "UnitFlag", "CanClaim", "Local", FALSE + "UnitFlag", "Well-Digger", "Local", FALSE + "UnitType", "Proletarians","Local", FALSE + "CityTile", "Center", "Local", TRUE + "Terrain", "Grassland", "Local", FALSE + "Terrain", "Plains", "Local", FALSE } [actionenabler_pillage] action = "Pillage" actor_reqs = - { "type", "name", "range" - "UnitClassFlag", "CanPillage", "Local" + { "type", "name", "range", "present" + "UnitClassFlag", "CanPillage", "Local", TRUE + "UnitFlag", "Cant_Pillage", "Local", FALSE + "MinMoveFrags", "1", "Local", TRUE } [actionenabler_pillage2] action = "Pillage" actor_reqs = - { "type", "name", "range" - "UnitType", "Ground Strike Fighter", "Local" + { "type", "name", "range", "present" + "UnitType", "Dive Bomber", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + } +[actionenabler_pillage2a] +action = "Pillage" +actor_reqs = + { "type", "name", "range", "present" + "UnitType", "Ground Strike Fighter", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE } [actionenabler_pillage3] action = "Pillage" actor_reqs = - { "type", "name", "range" - "UnitType", "Jet Bomber", "Local" + { "type", "name", "range", "present" + "UnitType", "Strategic Bomber", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + } +[actionenabler_pillage3a] +action = "Pillage" +actor_reqs = + { "type", "name", "range", "present" + "UnitType", "Jet Bomber", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE } [actionenabler_clean_pollution] @@ -1493,7 +2365,6 @@ actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE "UnitFlag", "NonMil", "Local", TRUE - ;NonMil = don't let ability to do Hideouts 'cause' ability to clean pollution } [actionenabler_clean_fallout] action = "Clean Fallout" @@ -1501,7 +2372,6 @@ actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE "UnitFlag", "NonMil", "Local", TRUE - ;NonMil = don't let ability to do Hideouts 'cause' ability to clean fallout } [actionenabler_fortify] @@ -1521,7 +2391,9 @@ actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE "UnitFlag", "CanHide", "Local", FALSE + "UnitFlag", "CanClaim", "Local", FALSE "UnitType", "Proletarians", "Local", FALSE + "UnitType", "Tribesmen", "Local", FALSE "UnitState", "Transported", "Local", FALSE ; Prevent quay exploit } [actionenabler_road1] ; can't road while transported in foreign lands @@ -1530,6 +2402,7 @@ actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE "UnitFlag", "CanHide", "Local", FALSE + "UnitFlag", "CanClaim", "Local", FALSE "UnitType", "Proletarians", "Local", FALSE "UnitState", "Transported", "Local", TRUE } @@ -1543,14 +2416,25 @@ actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE "UnitFlag", "CanHide", "Local", FALSE - "Tech", "Explosives", "Player", TRUE + "UnitFlag", "CanClaim", "Local", FALSE + "Tech", "Steel", "Player", TRUE "UnitType", "Proletarians", "Local", FALSE + "UnitType", "Tribesmen", "Local", FALSE } target_reqs = { "type", "name", "range", "present" "TerrainClass", "Oceanic", "Local", TRUE "TerrainClass", "Land", "CAdjacent",TRUE } +[actionenabler_road_tribesmen] +action = "Build Road" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Settlers", "Local", TRUE + "UnitType", "Tribesmen", "Local", TRUE + "UnitState", "Transported", "Local", FALSE ; Prevent quay exploit + "MinYear", "-2000", "World", FALSE ; they get old + } [actionenabler_road_prole] action = "Build Road" actor_reqs = @@ -1614,8 +2498,24 @@ actor_reqs = { "type", "name", "range", "present" "UnitFlag", "CanFortress", "Local", TRUE "UnitType", "Proletarians", "Local", FALSE + "UnitType", "Marines", "Local", FALSE "UnitFlag", "Well-Digger", "Local", FALSE } +;Somewhat counterintuitive but this results in Marines able to build +;Forts and airbases, though no airbase inside an existing fort, +;because otherwise they'd also be able to build Fortresses. +[actionenabler_marines_can_fort_only] +action = "Build Base" +actor_reqs = + { "type", "name", "range", "present" + "UnitType", "Marines", "Local", TRUE + "UnitState", "Transported", "Local", FALSE + "UnitFlag", "CanFortress", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" + "Extra", "Fort", "Local", FALSE + } [actionenabler_base_prole] action = "Build Base" actor_reqs = @@ -1628,7 +2528,11 @@ actor_reqs = action = "Build Base" actor_reqs = { "type", "name", "range", "present" - "UnitFlag", "CanHide", "Local", TRUE +; Hard contradiction between Tile Claim and Hideout is necessary so that +; the actionenabler for one never allows the other to be made. TODO: +; req is just a CanHide unit, when actionenabler req can check base type: + "UnitFlag", "CanHide", "Local", TRUE + "UnitFlag", "CanClaim", "Local", FALSE "UnitState", "OnLivableTile", "Local", TRUE "DiplRel", "Foreign", "Local", FALSE } @@ -1636,29 +2540,88 @@ actor_reqs = action = "Build Base" actor_reqs = { "type", "name", "range", "present" - "UnitFlag", "CanHide", "Local", TRUE "UnitState", "OnLivableTile", "Local", TRUE +; Hard contradiction between Tile Claim and Hideout is necessary so that +; the actionenabler for one never allows the other to be made. TODO: +; req is just a CanHide unit, when actionenabler req can check base type: + "UnitFlag", "CanHide", "Local", TRUE + "UnitFlag", "CanClaim", "Local", FALSE } target_reqs = { "type", "name", "range", "present" - "CityTile", "Claimed", "Local", FALSE + "CityTile", "Claimed", "Local", FALSE } ;******************************************************* +[actionenabler_build_tileclaim_domestic] +action = "Build Base" +actor_reqs = + { "type", "name", "range", "present" +; Hard contradiction between Tile Claim and Hideout is necessary so that +; the actionenabler for one never allows the other to be made. TODO: +; req is just a military unit, when actionenabler req can check base type: + "UnitState", "OnLivableTile", "Local", TRUE ; disallow sea claims +;-------------------------------- + "UnitFlag", "CanClaim", "Local", TRUE + "UnitFlag", "CanHide", "Local", FALSE + "DiplRel", "Foreign", "Local", FALSE + } +target_reqs = + { "type", "name", "range","present" + "CityTile", "Claimed", "Local", TRUE ; ensures inside domestic territory + } +[actionenabler_build_tileclaim_nondomestic] +action = "Build Base" +actor_reqs = + { "type", "name", "range", "present" +; Hard contradiction between Tile Claim and Hideout is necessary so that +; the actionenabler for one never allows the other to be made. Currently, +; that req is CanClaim which never co-exists with CanHide in the same unit. +; "TerrainClass", "Land", "Adjacent", TRUE ; can't allow extending sea claims ad infinitum +; "DiplRel", "Foreign", "Local", TRUE ; can claim unclaimed territory +; "DiplRel", "Armistice", "Local", FALSE ; allow negotiating tile exchanges +; "DiplRel", "Alliance", "Local", FALSE ; " +; "DiplRel", "Peace", "Local", FALSE ; casus belli allows retaliation if needed. +;-------------------------------- + "UnitState", "OnLivableTile", "Local", TRUE ; disallow sea claims + "UnitFlag", "CanClaim", "Local", TRUE + "UnitFlag", "CanHide", "Local", FALSE + "Extra", "Tile Claim", "Adjacent", TRUE + "MaxUnitsOnTile", "1", "Local", FALSE ; need a diplo + 1 other unit. + } +target_reqs = + { "type", "name", "range","present" + ; "CityTile", "Claimed", "Local", TRUE ; can claim unclaimed lands too + } +;******************************************************* [actionenabler_mining] action = "Build Mine" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE "UnitFlag", "Well-Digger", "Local", FALSE -; "UnitType", "Legion", "Local", FALSE "UnitFlag", "CanHide", "Local", FALSE + "UnitFlag", "CanClaim", "Local", FALSE "UnitType", "Proletarians", "Local", FALSE + "UnitType", "Tribesmen", "Local", FALSE } target_reqs = { "type", "name", "range", "present" "TerrainFlag", "Oil", "Local", FALSE } +[actionenabler_mining_tribesmen] +action = "Build Mine" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Settlers", "Local", TRUE + "UnitType", "Tribesmen", "Local", TRUE + "UnitState", "Transported", "Local", FALSE + "MinYear", "-2000", "World", FALSE ; they get old + } +target_reqs = + { "type", "name", "range", "present" + "TerrainFlag", "Oil", "Local", FALSE + } [actionenabler_mining_prole] action = "Build Mine" actor_reqs = @@ -1671,15 +2634,16 @@ target_reqs = { "type", "name", "range", "present" "TerrainFlag", "Oil", "Local", FALSE } - + [actionenabler_desert_oil] action = "Build Mine" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE -; "UnitType", "Legion", "Local", FALSE - "UnitFlag", "CanHide", "Local", FALSE + "UnitFlag", "CanHide", "Local", FALSE + "UnitFlag", "CanClaim", "Local", FALSE "UnitType", "Proletarians", "Local", FALSE + "UnitType", "Tribesmen", "Local", FALSE "UnitFlag", "Well-Digger", "Local", FALSE "Tech", "Construction", "Player", TRUE } @@ -1706,10 +2670,11 @@ action = "Build Mine" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE -; "UnitType", "Legion", "Local", FALSE "UnitFlag", "CanHide", "Local", FALSE + "UnitFlag", "CanClaim", "Local", FALSE "UnitType", "Proletarians", "Local", FALSE "UnitFlag", "Well-Digger", "Local", FALSE + "UnitType", "Tribesmen", "Local", FALSE "Tech", "Refining", "Player", TRUE } target_reqs = @@ -1745,50 +2710,61 @@ target_reqs = "Tech", "Alphabet","Player", FALSE "Tech", "Writing", "World", FALSE } - + +[actionenabler_irrigate_src_city_chand_baori] +action = "Build Irrigation" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Settlers", "Local", TRUE + "UnitFlag", "CanHide", "Local", FALSE + "UnitFlag", "CanClaim", "Local", FALSE + "Building", "Chand Baori", "Player",TRUE + } +target_reqs = + { "type", "name", "range", "present" + "CityTile", "Center", "Adjacent", TRUE + } + [actionenabler_irrigate_src_ocean] action = "Build Irrigation" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE "UnitFlag", "Well-Digger", "Local", FALSE -; "UnitType", "Legion", "Local", FALSE "UnitFlag", "CanHide", "Local", FALSE + "UnitFlag", "CanClaim", "Local", FALSE "UnitType", "Proletarians", "Local", FALSE + "UnitType", "Tribesmen", "Local", FALSE } target_reqs = { "type", "name", "range", "present" "TerrainClass", "Oceanic", "CAdjacent", TRUE } -[actionenabler_irrigate_src_ocean_prole] +[actionenabler_irrigate_src_ocean_tribesmen] action = "Build Irrigation" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player",TRUE + "UnitType", "Tribesmen", "Local", TRUE + "MinYear", "-2000", "World", FALSE ; they get old } target_reqs = { "type", "name", "range", "present" "TerrainClass", "Oceanic", "CAdjacent", TRUE } - -[actionenabler_irrigate_src_river] ;canal and waterway too +[actionenabler_irrigate_src_ocean_tribesmen_chand_baori] action = "Build Irrigation" actor_reqs = { "type", "name", "range", "present" + "Building", "Chand Baori", "Player", TRUE "UnitFlag", "Settlers", "Local", TRUE -; "UnitType", "Legion", "Local", FALSE - "UnitFlag", "CanHide", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE + "UnitType", "Tribesmen", "Local", TRUE } target_reqs = - { "type", "name", "range", "present" - "ExtraFlag", "IrrigationSource", "CAdjacent", TRUE -; "Extra", "River", "CAdjacent", TRUE + { "type", "name", "range", "present" + "TerrainClass", "Oceanic", "CAdjacent", TRUE } -[actionenabler_irrigate_src_river_prole] ;canal and water way too +[actionenabler_irrigate_src_ocean_prole] action = "Build Irrigation" actor_reqs = { "type", "name", "range", "present" @@ -1797,53 +2773,53 @@ actor_reqs = "Gov", "Communism", "Player",TRUE } target_reqs = - { "type", "name", "range", "present" - "ExtraFlag", "IrrigationSource", "CAdjacent", TRUE -; "Extra", "River", "CAdjacent", TRUE + { "type", "name", "range", "present" + "TerrainClass", "Oceanic", "CAdjacent", TRUE } - -[actionenabler_irrigate_src_oasis] + +[actionenabler_irrigate_from_source] action = "Build Irrigation" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE -; "UnitType", "Legion", "Local", FALSE "UnitFlag", "CanHide", "Local", FALSE + "UnitFlag", "CanClaim", "Local", FALSE "UnitType", "Proletarians", "Local", FALSE + "UnitType", "Tribesmen", "Local", FALSE "UnitFlag", "Well-Digger", "Local", FALSE } target_reqs = { "type", "name", "range", "present" - "Extra", "Oasis", "CAdjacent", TRUE - } -[actionenabler_irrigate_src_oasis_prole] + "ExtraFlag", "IrrigationSource", "CAdjacent", TRUE + } +[actionenabler_irrigate_from_source_chand_baori] action = "Build Irrigation" actor_reqs = { "type", "name", "range", "present" + "Building", "Chand Baori", "Player", TRUE "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player",TRUE + "UnitFlag", "CanHide", "Local", FALSE + "UnitFlag", "CanClaim", "Local", FALSE + "UnitType", "Proletarians", "Local", FALSE + "UnitFlag", "Well-Digger", "Local", FALSE } target_reqs = { "type", "name", "range", "present" - "Extra", "Oasis", "CAdjacent", TRUE - } - -[actionenabler_irrigate_src_irrigation] + "ExtraFlag", "IrrigationSource", "Adjacent", TRUE + } +[actionenabler_irrigate_from_source_tribesmen] action = "Build Irrigation" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE - "UnitFlag", "Well-Digger", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE -; "UnitType", "Legion", "Local", FALSE - "UnitFlag", "CanHide", "Local", FALSE + "UnitType", "Tribesmen", "Local", TRUE + "MinYear", "-2000", "World", FALSE ; they get old } target_reqs = - { "type", "name", "range", "present" - "Extra", "Irrigation", "CAdjacent", TRUE + { "type", "name", "range", "present" + "ExtraFlag", "IrrigationSource", "CAdjacent", TRUE } -[actionenabler_irrigate_src_irrigation_prole] +[actionenabler_irrigate_from_source_prole] action = "Build Irrigation" actor_reqs = { "type", "name", "range", "present" @@ -1852,9 +2828,63 @@ actor_reqs = "Gov", "Communism", "Player",TRUE } target_reqs = - { "type", "name", "range", "present" - "Extra", "Irrigation", "CAdjacent", TRUE + { "type", "name", "range", "present" + "ExtraFlag", "IrrigationSource", "CAdjacent", TRUE } +;NO LONGER NEEDED NOW THAT WE USE IrrigationSource flag: +;[actionenabler_irrigate_src_oasis] +;action = "Build Irrigation" +;actor_reqs = +; { "type", "name", "range", "present" +; "UnitFlag", "Settlers", "Local", TRUE +; "UnitFlag", "CanHide", "Local", FALSE +; "UnitFlag", "CanClaim", "Local", FALSE +; "UnitType", "Proletarians", "Local", FALSE +; "UnitFlag", "Well-Digger", "Local", FALSE +; } +;target_reqs = +; { "type", "name", "range", "present" +; "Extra", "Oasis", "CAdjacent", TRUE +; } +;[actionenabler_irrigate_src_oasis_prole] +;action = "Build Irrigation" +;actor_reqs = +; { "type", "name", "range", "present" +; "UnitFlag", "Settlers", "Local", TRUE +; "UnitType", "Proletarians", "Local", TRUE +; "Gov", "Communism", "Player",TRUE +; } +;target_reqs = +; { "type", "name", "range", "present" +; "Extra", "Oasis", "CAdjacent", TRUE +; } +; +;[actionenabler_irrigate_src_irrigation] +;action = "Build Irrigation" +;actor_reqs = +; { "type", "name", "range", "present" +; "UnitFlag", "Settlers", "Local", TRUE +; "UnitFlag", "Well-Digger", "Local", FALSE +; "UnitType", "Proletarians", "Local", FALSE +; "UnitFlag", "CanHide", "Local", FALSE +; "UnitFlag", "CanClaim", "Local", FALSE +; } +;target_reqs = +; { "type", "name", "range", "present" +; "Extra", "Irrigation", "CAdjacent", TRUE +; } +;[actionenabler_irrigate_src_irrigation_prole] +;action = "Build Irrigation" +;actor_reqs = +; { "type", "name", "range", "present" +; "UnitFlag", "Settlers", "Local", TRUE +; "UnitType", "Proletarians", "Local", TRUE +; "Gov", "Communism", "Player",TRUE +; } +;target_reqs = +; { "type", "name", "range", "present" +; "Extra", "Irrigation", "CAdjacent", TRUE +; } [actionenabler_deboard] action = "Transport Deboard" @@ -1868,6 +2898,10 @@ target_reqs = "UnitState", "Transporting", "Local" } +;TO DO: this gives ruleset control over logical requirements for +;when units can board as cargo onto transporters. This should be +;extended and exploited to finally give ruleset supreme control +;over smooth minimalist non-exploitable behaviours. [actionenabler_board] action = "Transport Board" actor_reqs = @@ -1879,6 +2913,9 @@ actor_reqs = "DiplRel", "Never met", "Local", FALSE } +;TO DO: this gives ruleset control over logical requirements for +;when units can unload. Finally ruleset could have supreme control +;over everything, and it should be taken advantage of. [actionenabler_unload] action = "Transport Unload" actor_reqs = @@ -1891,6 +2928,9 @@ target_reqs = "UnitState", "Transported", "Local" } +;TO DO: this now enables ruleset to control disembarkation stipulations, rather +;than hard-coded client. This actionenabler should be extended with all the +;rules logic for mp2c, and taken advantage of for upgraded/simplified mechanics. [actionenabler_disembark] action = "Transport Disembark" actor_reqs = @@ -1899,6 +2939,9 @@ actor_reqs = "MinMoveFrags", "1", "Local" } +;TO DO: this now enables ruleset to control embarkation stipulations, rather +;than hard-coded client. This actionenabler should be extended with all the +;mp2c logic and taken advantage of for expanded/simplified/upgraded mechanics. [actionenabler_embark] action = "Transport Embark" actor_reqs = @@ -1992,6 +3035,11 @@ victory_min_points = 1000 ; How big lead relative to second best player is needed for victory victory_lead_pct = 200 +; How much existing history grows each turn. This makes older history +; of the same original value more valuable as newer history, as it has +; gained more interest. +history_interest_pml = 0 + ; How much each culture point affects the migration ; from/to the city. Each culture point count as this many permilles ; of a migration point. @@ -2092,20 +3140,20 @@ negative_label = _("BC") [trade] settings = { "type", "pct", "cancelling", "bonus" - "National", 0, "Cancel", "None" - "NationalIC", 0, "Cancel", "None" - "IN", 35, "Inactive", "Gold" - "INIC", 35, "Inactive", "Gold" - "Ally", 35, "Inactive", "Gold" - "AllyIC", 35, "Inactive", "Gold" - "Enemy", 0, "Inactive", "Gold" - "EnemyIC", 0, "Inactive", "Gold" - "Team", 35, "Inactive", "Gold" - "TeamIC", 35, "Inactive", "Gold" + "National", 0, "Cancel", "None" + "NationalIC", 0, "Cancel", "None" + "IN", 35, "Inactive", "Gold" + "INIC", 35, "Inactive", "Gold" + "Ally", 35, "Inactive", "Gold" + "AllyIC", 35, "Inactive", "Gold" + "Enemy", 1, "Inactive", "Gold" ; 1 = allow establishing but still get 0 after rounding. + "EnemyIC", 1, "Inactive", "Gold" + "Team", 35, "Inactive", "Gold" + "TeamIC", 35, "Inactive", "Gold" } ; When are goods for the trade route chosen. -; "Leaving" - Goods to carry are assigned to unit when it`s built, or it changes homecity +; "Leaving" - Goods to carry are assigned to unit when it's built, or it changes homecity ; "Arrival" - Goods are chosen when trade route is established, when unit arrives to destination goods_selection = "Arrival" @@ -2140,7 +3188,8 @@ goods_selection = "Arrival" [goods_good] name = _("Goods") - +;onetime_pct = 100 ; uses standard bonus both here and in effects.ruleset (except gold only) +from_pct = 150 ; /* <-- avoid gettext warnings ; @@ -2151,11 +3200,35 @@ name = _("Goods") ; type = Type of the clause, one of "Advance", "Gold", "Map", "Seamap", ; "City", "Ceasefire", "Peace", "Alliance", "Vision", "Embassy" ; +; giver_reqs = requirements that the giving side of the clause needs to fulfill +; (see effects.ruleset and README.effects for help on requirements) +; receiver_reqs = requirements that the receiving side of the clause needs to fulfill +; ; */ <-- avoid gettext warnings -[clause_advance] +;[clause_advance_player_has_embassy] +;type = "Advance" +;giver_reqs = +; { "type", "name", "range" +; "DiplRel", "Has real embassy", "Local" +; } +;receiver_reqs = +; { "type", "name", "range" +; } +;[clause_advance_player_hosts_embassy] +;type = "Advance" +;giver_reqs = +; { "type", "name", "range" +; "DiplRel", "Hosts real embassy", "Local" +; } +;receiver_reqs = +; { "type", "name", "range" +; } + +[clause_advance_player_hosts_embassy] type = "Advance" +; /* TO DO, when the above works, apply req vector to all the below except Ceasefire and Peace */ [clause_gold] type = "Gold" @@ -2304,10 +3377,6 @@ names = ; RESTRICTINFRA ENABLED ONLY RESTRICTS ENEMY RAILS TO FUNCTION AS ROADS [settings] -; TO DISABLE SPACERACE INCLUDE THESE LINES BELOW: -; "endspaceship", DISABLED, FALSE -; "victories", "ALLIED", FALSE - set = { "name", "value", "lock" "mapsize", "PLAYER", FALSE @@ -2318,35 +3387,46 @@ set = "pingtimeout", 240, FALSE "restrictinfra", "ENABLED", FALSE "alltemperate", FALSE, FALSE - "aifill", 6, FALSE + "aifill", 8, FALSE "airliftingstyle", "FROM_ALLIES|TO_ALLIES", FALSE "airliftdestdivisor", 3, FALSE + "animals", 0, FALSE + "armisticelength", 5, FALSE "autoattack", "enabled", FALSE "autoattack_style", 1, FALSE "barbarians", "DISABLED", FALSE + "blueprints", 70, FALSE "borders", "SEE_INSIDE", FALSE + "casusbelli_allies", 1, FALSE ; casus belli on one, is casus belli on all (allies). + "casusbelliturns", 12, FALSE ; how many turns casus belli lasts after an incident, if not reset. will go +1 higher for further incidents. will be reset by any new non-aggression pact. + "ceasefirelength", 15, FALSE + "city_output_style", 1, FALSE ; whether tiles and specialists have WYSIWYG output, or calculate output for gold/science AFTER city growth/shrink events. "contactturns", 10, FALSE - "conquercost", 0, FALSE + "conquercost", 0, FALSE ; thefts/conquests at 0 means we use (100-blueprints%) tax on theft/conquest. if blueprints off then 0 means no tax (or override it to a val) "diplomacy", "ALL", FALSE "diplgoldcost", 5, FALSE - "diplbulbcost", 5, FALSE + "diplbulbcost", 0, FALSE ; tech trades are overridden by blueprint %; if blueprints are off, there is no tax on theft/conquest. "dispersion", 0, FALSE - "endspaceship", "ENABLED", FALSE + "endspaceship", "DISABLED", FALSE ; prevent game from instantly ending "foggedborders", TRUE, FALSE - "freecost", 0, FALSE + "fixedlength", "ENABLED", FALSE ; Turn done doesn't advance turn if there is a timeout. + "freecost", 1, FALSE ; 0 would get overridden by the 'blueprints' setting: 1 gives 99% of the bulbs of the tech awarded by Philosophy. + "fulldisorder", "ENABLED", FALSE ; disorder fully halts one turn of production or buying in a city: closes lots of complex time-consuming micromanaged exploits one would feel obligated to do to be competitive "generator", "RANDOM", FALSE "gold", 70, FALSE "globalwarming", 50, FALSE "globalwarming_percent", 50, FALSE "hideouts", TRUE, FALSE + "hangry", 1, FALSE ; Famine causes disorder. Closes a flaw where people are happier starving with lux than food and less lux. Helps re-balance rapture vs non-rapture govs (martial law/gulag effect/etc.) "huts", 10, FALSE - "killcitizen_pct", 60, FALSE ; regulates % chance of pop kill by city pop-killer units - "landmass", 63, FALSE - "looting", "BASE_TRADE", FALSE + "killcitizen_pct", 50, FALSE ; regulates % chance of pop kill by city pop-killer units + "landmass", 99, FALSE + "looting", "PROPERTY", FALSE "minplayers", 0, FALSE "move_bonus_in_frags", "ENABLED", TRUE ;locked + "multiresearch", "ENABLED", FALSE "nationset", "all", FALSE - "nuclearwinter_percent", 15, FALSE + "nuclearwinter_percent", 50, FALSE "nukes_minor", "ENABLED", FALSE ; set to DISABLED to completely disallow nuclear detonations "nukes_major", "ENABLED", FALSE ; set to DISABLED to disallow nuclear fusion weapons "polarstrip", "DISABLED", FALSE ; blocks making horizontal polar strips on most generators @@ -2356,9 +3436,10 @@ set = "slot_control", TRUE, FALSE ; multiple units per turn "slot_control_style", 1, FALSE ; 1 = Shield2Gold units only "spaceship_travel_time", 225, FALSE - "specials", 350, FALSE + "specials", 200, FALSE "startpos", "DEFAULT", FALSE - "startunits", "xxcccwwwADD", FALSE + "startunits", "DDDwwwAucca", "FALSE" ;3 Tribesmen, 3 Workers, 1 Caravan, 1 Founders, 2 Settlers, 1 Well-Digger + "steepness", 20, FALSE "techleak", 25, FALSE "techlossforgiveness", 200, FALSE "techlossrestore", 100, FALSE @@ -2366,10 +3447,10 @@ set = "temperature", 50, FALSE "tilesperplayer", 290, FALSE "tinyisles", "DISABLED", FALSE - "wetness", 50, FALSE - "steepness", 30, FALSE + "steepness", 15, FALSE "tinyisles", FALSE, FALSE - "trademindist", 12, FALSE + "trademindist", 15, FALSE + "trademinforeign", 15, FALSE "trade_revenue_style", "SIMPLE", FALSE ;"simple" formula based on average trade in both cities (sans distance etc.) "trading_city", "DISABLED", FALSE "topology", "WRAPX", FALSE @@ -2378,6 +3459,10 @@ set = "unload_override", 0, FALSE ;0=native unloading same as non-native. 1+ = move_fragment cost for unloading. "unreachableprotects", "ENABLED", FALSE "unitwaittime_style", "ACTIVITIES|FORTIFY|DELAYGOTO", FALSE + "wetness", 50, FALSE "victories", "ALLIED|SPACERACE", FALSE "zoc_purity", "ENABLED", FALSE ; igZOC units don't lift ZOC for units subject to ZOC +; TESTING ONLY, REMOVE FOR SURE: *(***************************************) +; "fogofwar", FALSE, FALSE +; "revealmap", "start", FALSE } diff --git a/freeciv/freeciv/data/mp2-brava2/governments.ruleset b/freeciv/freeciv/data/mp2c-desert/governments.ruleset similarity index 60% rename from freeciv/freeciv/data/mp2-brava2/governments.ruleset rename to freeciv/freeciv/data/mp2c-desert/governments.ruleset index e10046924..b94ba8b8c 100644 --- a/freeciv/freeciv/data/mp2-brava2/governments.ruleset +++ b/freeciv/freeciv/data/mp2c-desert/governments.ruleset @@ -11,7 +11,7 @@ ; than minor changes. [datafile] -description="Avant-garde governments data for Freeciv" +description="Governments data for Freeciv" options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" format_version=20 @@ -28,7 +28,7 @@ during_revolution="Anarchy" ; ; For the "official" rulesets, the order of these sections should not ; be changed because that would break backward compatability with -; savegames. (In particular, if Fundamentalism is added to default +; savegames. (In particular, if Theocracy is added to default ; ruleset, should be added at end.) ; ; Notes on fields: @@ -46,8 +46,13 @@ during_revolution="Anarchy" ; otherwise may be "-" ; ai_better = AI will not consider this government for use if the ; government listed here is available -; ruler_titles = ruler titles by nation, "-" is default, and non-matched -; nations are ignored +; ruler_male_title = The default male ruler title for the government type. +; It's a format string where name of the ruler is marked +; by '%s'. +; Individual nations may override this by their +; own title. +; ruler_female_title = The default female ruler title for the government type. +; See above ruler_male_title. ; helptext = optional help text string; should escape all raw newlines ; so that xgettext parsing works ; @@ -72,7 +77,7 @@ Anarchy is simply the absence of any recognizable government.\ penalty if they produce 3 or more of any resource.\ "), _("\ Anarchy offers slightly less corruption than Despotism,\ - but slightly more unhappiness.\ + but slightly more unhappiness. \n\ "), _("\ No citizens are made unhappy by each aggressive unit.\n\ 25% Base corruption in cities\n\ @@ -95,14 +100,15 @@ helptext = _("\ Under Despotism, you are the absolute ruler of your people. Your\ control over your citizens is maintained largely by martial law.\ Under Despotism, tiles suffer a -1 tile output penalty if they\ - produce 3 resource points.\ + produce 3 resource points. \ "), _("\ Despotism suffers the highest level of corruption of all\ - forms of government.\ + forms of government.\n\ \ "), _("\ -No citizens are made unhappy by each aggressive unit.\n\ -37% Base corruption in cities\n\ -4% Extra corruption per each tile in distance from capital\n\ +Gulag:You can starve cities without disorder, with 2 martial law units. \n\ +No citizens are made unhappy by each aggressive unit. \n\ +37% Base corruption in cities \n\ +4% Extra corruption per each tile in distance from capital \n\ ") ;------------------------------------------------------------------------ @@ -121,51 +127,14 @@ ruler_female_title = _("Queen %s") helptext = _("\ Under Monarchy, a king or queen serves as a hereditary figurehead\ - for your government.\ + for your government. \ "), _("\ Monarchy suffers the same small amount of corruption that\ - the Republic does.\ -"), _("\ -No citizens are made unhappy by each aggressive unit.\n\ -15% Base corruption in cities\n\ -2% Extra corruption per each tile in distance from capital\n\ -") - -;------------------------------------------------------------------------ -[government_communism] - -name = _("Communism") -reqs = { "type", "name", "range" - "tech", "Communism", "Player" - } -graphic = "gov.communism" -graphic_alt = "-" - -ruler_male_title = _("Comrade %s") -ruler_female_title = _("?female:Comrade %s") - -helptext = _("\ -In Communism, all work, output, and goods are owned by the state.\ -"), _("\ -Corruption does not vary by distance from the capital;\ - all cities have the same base level of corruption. Each city gets 4\ - units free of upkeep. Buildings with 1 upkeep are free.\ - The capital city with Palace gets a +25% production bonus.\ -"), _("\ -Communist governments get a cost discount of -5 on Riflemen and -10\ - on Dive Bombers. Diplomats and Spies are produced with +1 veteran\ - status. The effect of Cathedrals and Michelangelo is reduced -1.\ -"), _("\ -Communist states can transfer Proletarians between cities to\ - re-distribute population. Large numbers of Proletarians can be\ - used to finish State projects. The Communism tech allows a\ - Communist government to convert Workers to Riflemen and vice\ - versa, if inside national territory and if possessing the necessary\ - technologies.\ + the Republic does. \ "), _("\ -No citizens are made unhappy by each aggressive unit.\n\ -20% Base corruption in cities\n\ -No Extra corruption per each tile in distance from capital\n\ +No citizens are made unhappy by each aggressive unit. \n\ +15% Base corruption in cities \n\ +2% Extra corruption per each tile in distance from capital \n\ ") ;------------------------------------------------------------------------ @@ -187,9 +156,9 @@ Under a Republican government, citizens hold an election to select a\ remain popular to remain in control, citizens are given a greater\ degree of freedom. Citizens under the Republic become unhappy\ easily, but the self-sufficiency of your citizens allows high levels\ - of trade.\ + of trade. \n\ "), _("\ -1 citizen is made unhappy by each aggressive unit*.\n\ +1 citizen is made unhappy by each aggressive unit*. \n\ (* first aggressive unit does not cause unhappy)\n\ 15% Base corruption in cities\n\ 2% Extra corruption per each tile in distance from capital\n\ @@ -210,49 +179,123 @@ ruler_female_title = _("?female:Prime Minister %s") helptext = _("\ Under Democracy, citizens govern directly by voting on issues.\ - Democracy offers the highest possible level of trade, but also\ - offers the most potential for unhappiness. There is no corruption\ - during Democracy, but citizens become very upset during\ - wars.\ -Democracy revolts to Anarchy if any city remains in disorder for two turns.\ - Cities and units belonging to Democracy cannot be incited or bribed.\ + Democracy offers the highest level of trade. Base corruption\ + is half that of Republic or Monarchy, and corruption from distance to\ + a capital is very low. Citizens become very upset during wars.\ + Democracy revolts to Anarchy if any city remains in disorder for two turns.\ + Cities and units belonging to Democracy have triple the cost\ + to incite or bribe, respectively. \n\ "), _("\ -2 citizens are made unhappy by each aggressive unit.\n\ -No base corruption in cities\n\ -No extra corruption per each tile in distance from capital\n\ +2 citizens are made unhappy by each aggressive unit. \n\ +8% Base corruption in cities\n\ +0.4% Extra corruption per each tile in distance from capital\n\ ") + ;------------------------------------------------------------------------ -[government_fundamentalism] +[government_theocracy] -name = _("Fundamentalism") +name = _("Theocracy") reqs = { "type", "name", "range" - "tech", "Fundamentalism", "Player" + "tech", "Theocracy", "Player" } -graphic = "gov.fundamentalism" +graphic = "gov.theocracy" graphic_alt = "-" ruler_male_title = _("High Priest %s") ruler_female_title = _("High Priestess %s") helptext = _("\ -Fundamentalism is organized around central beliefs, usually religious. These form\ - rigid guidelines for the actions of the rulers and the people.\ +Theocracy is formed on religious beliefs which are the law of the land. \ "), _("\ -The people are entirely devoted to their beliefs, and are often willing to die to\ - preserve them. Enemies cannot establish hostile embassies without first making Cease-Fire\ - or Peace. Theocratic rule causes science output to suffer by 50%.\ +The people are devoted and often willing to die for their faith. Cities very\ + near a capital have very low corruption. Cost for enemies to incite cities or\ + bribe units is 2x, but Zealots cannot be bribed. Enemies cannot establish\ + embassies without first making Ceasefire or Peace. \ "), _("\ -Improvements that appease unhappy citizens produce gold tithes equal to\ - the number of citizens they would appease. Fanatics cannot be bribed. Palace\ - gives +50% to gold income in its city. In each city, two military units may impose\ - martial law, each making one citizen content. Pilgrims can be used to migrate and\ - grow the population in the cities directed by the ruling High Priest.\ +Improvements that appease unhappy citizens add +1 base gold in tithes for each\ + citizen appeased. Tithes also boost gold income by +20%, but science output\ + suffers -20%. Palace gives +50% to gold income in its city. In cities, two\ + military units may impose martial law, affecting one citizen each. Pilgrims\ + can be made to migrate and grow cities. \n\ "), _("\ -No citizens are made unhappy by each aggressive unit.\n\ +No citizens are made unhappy by each aggressive unit. \n\ 2% Base corruption in cities\n\ 2% Extra corruption per each tile in distance from capital\n\ ") +;------------------------------------------------------------------------ +[government_communism] + +name = _("Communism") +reqs = { "type", "name", "range" + "tech", "Communism", "Player" + } +graphic = "gov.communism" +graphic_alt = "-" + +ruler_male_title = _("Chairman %s") +ruler_female_title = _("?female:Comrade %s") + +helptext = _("\ +In Communism, all work, output, and goods are owned by the state.\ +"), _("\ +Each city gets 4 shields of free unit upkeep. Buildings with 1 upkeep\ + are free. The city with a Palace gets +25% production. \ +"), _("\ +Riflemen cost 5 less; Armor and Dive Bombers, 10 less.\ + Diplomats and Spies get +1 vet level. The effect of\ + Cathedrals and Michelangelo is reduced -1. \ +"), _("\ +Communists can transfer Proletarians between cities to\ + re-distribute population, or use them as workers on\ + State projects. The Communism tech allows a Communist government\ + to convert Workers to Riflemen and vice versa, if in domestic\ + territory and possessing the necessary tech. \n\ +"), _("\ +Gulag:You can starve cities without disorder, with 2 martial law units. \n\ +No citizens are made unhappy by aggressive units. \n\ +20% Base corruption in cities \n\ +No Extra corruption per each tile in distance from capital \n\ +") + +;------------------------------------------------------------------------ +[government_nationalism] + +name = _("Nationalism") +reqs = { "type", "name", "range" + "tech", "Nationalism", "Player" + } +graphic = "gov.nationalism" +graphic_alt = "-" + +ruler_male_title = _("Dictator %s") +ruler_female_title = _("Dictator %s") + +helptext = _("\ +Nationalism glorifies national supremacy over other peoples.\ + Citizens and corporatations align under a dictator\ + who rules over a unified populace, military, and isolationist economy. \n\ +"), _("\ +Content cities get a +1 trade bonus on Land tiles only.\ + Celebrating cities also get Ocean tiles. Cities may rapture if founded under\ + the original national hegemony. Luxury suffers a 15% penalty.\ + Government mandated Science gets +15% in original cities. \n\ +"), _("\ +Each city gets 1 shield of free unit upkeep. The city with a Palace gets +15% production.\ + Original cities have a 3x incite cost, otherwise cost one third. \n\ +"), _("\ +Police Stations suppress +1 unhappy Foreign National and cost 10 shields less.\ + Five military units may impose martial law, affecting one citizen each.\ + Migrants can be made to help grow cities. Tile workers gain a ⅑ move\ + bonus and for every three worker turns of work put in, get a fourth\ + worker turn free. Cost of upgrades is 25% less. Riflemen are produced at +1 vet\ + level. Armor gets a +1 move bonus. Fighters and Dive Bombers have 50% higher odds of promotion. \n\ +"), _("\ +No citizens are made unhappy by each aggressive unit.\n\ +8% Base corruption in capital,\n\ +2% Extra corruption per each tile in distance from capital\n\ +") + ; /* <-- avoid gettext warnings ; ; Multipliers (aka policies) diff --git a/freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/nations.ruleset b/freeciv/freeciv/data/mp2c-desert/nations.ruleset similarity index 89% rename from freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/nations.ruleset rename to freeciv/freeciv/data/mp2c-desert/nations.ruleset index 85937b425..6469005d1 100644 --- a/freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/nations.ruleset +++ b/freeciv/freeciv/data/mp2c-desert/nations.ruleset @@ -8,7 +8,7 @@ ; use your new customized file. [datafile] -description="Avant-garde nations data for Freeciv" +description="Nations data for Freeciv" options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" format_version=20 @@ -20,9 +20,11 @@ format_version=20 ; will be saved to nations.ruleset itself. nationlist = "default/nationlist.ruleset" +*include "nation/animals.ruleset" + ; List of nations to embed to main nations.ruleset despite separate nationlist ; being used for other nations. -embedded_nations = "barbarian", "pirate" +embedded_nations = "barbarian", "pirate", "animal kingdom" [compatibility] ; Initial government for all the nations that do not @@ -55,6 +57,11 @@ aggressive_min = 30 aggressive_max = 90 aggressive_default = 50 +; Value of trait "builder" defines how much AI wants to build buildings +builder_min = 30 +builder_max = 90 +builder_default = 60 + ; Please keep [ruledit] section in sync with these includes *include "default/nationlist.ruleset" ; This ruleset uses model of two separate barbarian nations diff --git a/freeciv/freeciv/data/.historic/mp2-May2019-historic/parser.lua b/freeciv/freeciv/data/mp2c-desert/parser.lua similarity index 100% rename from freeciv/freeciv/data/.historic/mp2-May2019-historic/parser.lua rename to freeciv/freeciv/data/mp2c-desert/parser.lua diff --git a/freeciv/freeciv/data/mp2-brava2/script.lua b/freeciv/freeciv/data/mp2c-desert/script.lua similarity index 57% rename from freeciv/freeciv/data/mp2-brava2/script.lua rename to freeciv/freeciv/data/mp2c-desert/script.lua index 7bf2a8d5d..82e260a26 100644 --- a/freeciv/freeciv/data/mp2-brava2/script.lua +++ b/freeciv/freeciv/data/mp2c-desert/script.lua @@ -18,6 +18,8 @@ -- This flags whether philosophy awards a bonus advance, and gets set to off (0) after T85. philosophy_possible = 1 game_turn = 0 +first_horse_warning = 0 +first_womens_suffrage = 0 --Give players custom messages on certain years. Currently at 1600 AD (T85), Philosophy expires. Let them know. function history_turn_notifications(turn, year) @@ -31,6 +33,8 @@ function history_turn_notifications(turn, year) -- Philosophy no longer gives advances after 1600 AD notify.all("Philosophers around the world mourn the execution of Giordano Bruno. Philosophy no longer gives a bonus advance.") philosophy_possible = 0 + notify.event(nil, nil, E.BEGINNER_HELP, +_("[`events/giordano`]
[`fire`] Philosophers hide their books after Giordano Bruno is burned.
Philosophy no longer gives a bonus advance.")) end return false @@ -80,12 +84,20 @@ function tech_researched_handler(tech, player, how) if id == find.tech_type("Horseback Riding").id and how == "researched" then if game_turn < 15 then for c in player:cities_iterate() do - if c:has_building(find.building_type("Palace")) then + if c:has_building(find.building_type("Palace")) and first_horse_warning > 0 then notify.event(NIL, c.tile, E.TECH_GAIN, - _("Travellers tell stories of the amazing skills of the %s, who ride wild beasts near %s! (%i,%i)"), + _("[`horsemen`] Travellers say the %s now ride horses, near %s. (%i,%i)"), player.nation:plural_translation(), c.name, c.tile.x, c.tile.y ) - - notify.all( _("Tribesmen have learned to ride wild beasts near %s (%i,%i)"), c.name, c.tile.x, c.tile.y) + notify.all( _(" A tribe has learned to ride horses near %s (%i,%i)"), + c.name, c.tile.x, c.tile.y) + end + if c:has_building(find.building_type("Palace")) and first_horse_warning == 0 then + first_horse_warning = 1 + notify.event(NIL, c.tile, E.TECH_GAIN, + _("[`events/wildbeasts`]
[`horsemen`] Travellers tell of the %s, who ride horses near %s! (%i,%i)"), + player.nation:plural_translation(), c.name, c.tile.x, c.tile.y ) + notify.all( _(" A tribe has learned to ride wild beasts near %s (%i,%i)"), + c.name, c.tile.x, c.tile.y) end end end @@ -154,12 +166,12 @@ function tech_researched_handler(tech, player, how) -- Notify the player. Include the tech names in a way that makes it -- look natural no matter if each tech is announced or not. notify.event(player, NIL, E.TECH_GAIN, - _("Great philosophers from all the world join your civilization: you get the immediate advance %s."), + _("[`events/philosophy`]
Great philosophers from all the world join your civilization: you get blueprints for %s."), gained:name_translation()) -- Notify research partners notify.research(player, false, E.TECH_GAIN, - _("Great philosophers from all the world join the %s: you get the immediate advance %s."), + _("[`events/philosophy`]
Great philosophers from all the world join the %s: you get blueprints for %s."), player.nation:plural_translation(), gained:name_translation()) @@ -167,7 +179,7 @@ function tech_researched_handler(tech, player, how) -- They should therefore be informed about the source here too. notify.research_embassies(player, E.TECH_EMBASSY, -- /* TRANS: first %s is leader or team name */ - _("Great philosophers from all the world teach the %s %s."), + _("[`events/philosophy2`]
Great philosophers from all the world give the %s %s."), player:research_name_translation(), gained:name_translation()) end @@ -176,11 +188,13 @@ end signal.connect("tech_researched", "tech_researched_handler") function turn_callback(turn, year) - if turn == 120 then + if turn == 99 then notify.event(nil, nil, E.SCRIPT, _("Prophets have Visions!\n\ Evangelists warn the End Times are near.\ ")) +notify.event(nil, nil, E.BEGINNER_HELP, +_("[`events/endtimes`]
Philosophers are concerned that weapons technology is becoming too advanced.")) end if turn == 2 then @@ -189,15 +203,100 @@ _("Hunt for Food!\n\ Meat from wild animals is an important part of the Stone Age diet. Use wandering Deer and Wild Boar for extra food.\ (TIP: Use Shift-W and Ctrl-Shift-Click to monitor and manage these resource opportunities.)\ ")) +notify.event(nil, nil, E.BEGINNER_HELP, +_("[`events/hunt`]
Wild animals are available to hunt for food.")) end - if turn == 17 then + if turn == 20 then notify.event(nil, nil, E.SCRIPT, _("Ecology Report\n\ Frequent hunting has reduced wild animal populations and frightened them from human settlements.\ ")) +notify.event(nil, nil, E.BEGINNER_HELP, +_("[`events/runningdeer`][`events/oldtribesmen`]
Animal populations no longer come near human settlements.
Next turn, Elder Tribesmen lose bonus for movement, work, vision, and recycle.
")) end end - signal.connect('turn_begin', 'turn_callback') + +function unit_lost_callback(unit, loser, reason) + num_owners = 0 + owner = "" + if reason == "killed" then + nation = loser.nation:name_translation() + if nation == "Animal Kingdom" then + for tile in unit.tile:square_iterate(1) do + for foe in tile:units_iterate() do + if unit.tile ~= tile then + foe_nation = foe.owner.nation:name_translation() + if owner ~= foe.owner and foe_nation ~= "Animal Kingdom" then + num_owners = num_owners + 1 + owner = foe.owner + end + end + end + end + end + + if num_owners == 1 then + gold = 3 + culture = 1 + edit.change_gold(owner, gold) + edit.add_player_history(owner, 1) + if owner:is_human() then + notify.player(owner, + "Wild animal killed, furs and meats are worth %d gold", gold) + end + end + end + + -- continue processing + return false +end + +signal.connect("unit_lost", "unit_lost_callback") + +function building_built_callback(building, city) + + if building:rule_name() == "Chand Baori" then + local owner = city.owner + local city_name = city.name + + notify.player(owner, "Chand Baori's deep well gives %s a free river.", city_name) + city.tile:create_extra("River", NIL) + -- continue processing + return false + end + + if building:rule_name() == "Women's Suffrage​" and first_womens_suffrage < 1 then + first_womens_suffrage = 1 + notify.event(nil, nil, E.SCRIPT, + _("Women in Republics and Democracies demand Women's Suffrage.\n\ + All cities under these governments now have one unhappy citizen demanding Women's Suffrage.\ + ")) + notify.event(nil, nil, E.BEGINNER_HELP, + _("[`events/womenssuffrage`]
Discontent reported in representative governments who lack Women's Suffrage.")) + end + + -- Grant Code of Laws when the wonder Code of Hammurabi is built. + if building:rule_name() == "Code of Hammurabi" then + local player = city.owner + local city_name = city.name + local gained = nil; + + if player:give_tech(find.tech_type("Code of Laws"), -1, false, "researched") then + notify.player(player, "The Code of Hammurabi provides blueprints for Code of Laws.") + elseif player:give_tech(find.tech_type("Writing"), -1, false, "researched") then + notify.player(player, "The Code of Hammurabi provides blueprints for Writing.") + end + + return false + end + -- continue processing + return false +end + +signal.connect("building_built", "building_built_callback") + + + diff --git a/freeciv/freeciv/data/.historic/mp2-May2019-historic/styles.ruleset b/freeciv/freeciv/data/mp2c-desert/styles.ruleset similarity index 100% rename from freeciv/freeciv/data/.historic/mp2-May2019-historic/styles.ruleset rename to freeciv/freeciv/data/mp2c-desert/styles.ruleset diff --git a/freeciv/freeciv/data/.historic/ag2/techs.ruleset b/freeciv/freeciv/data/mp2c-desert/techs.ruleset similarity index 90% rename from freeciv/freeciv/data/.historic/ag2/techs.ruleset rename to freeciv/freeciv/data/mp2c-desert/techs.ruleset index 64ed14034..1ce62adf3 100644 --- a/freeciv/freeciv/data/.historic/ag2/techs.ruleset +++ b/freeciv/freeciv/data/mp2c-desert/techs.ruleset @@ -1,5 +1,5 @@ -; Modifying this file: +; Modifying this file: ; You should not modify this file except to make bugfixes or ; for other "maintenance". If you want to make custom changes, ; you should create a new datadir subdirectory and copy this file @@ -8,7 +8,7 @@ ; use your new customized file. [datafile] -description="Avant-garde technology data for Freeciv" +description="Technology data for Freeciv" options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" format_version=20 @@ -24,7 +24,7 @@ format_version=20 ; /* <-- avoid gettext warnings ; -; Tech classes: +; Tech classes: ; ; First one is the default one. ; If there is none, tech classes feature is disabled @@ -46,14 +46,14 @@ format_version=20 ; /* <-- avoid gettext warnings ; -; Below: The individual advances, one per section. +; Below:The individual advances, one per section. ; The number can be variable, up to 250. ; ; The actual tag used (the * in [advance_*]) does not matter, except ; it must be unique within this file, and it may be used in debug ; output when reading this file. ; -; Notes: +; Notes: ; ; name = translatable name as seen by user ; rule_name = (optional) internal name for savegames, rulesets etc; if @@ -99,7 +99,7 @@ format_version=20 ; it should be listed as req1. ; ; As well as custom flags defined above, the following flag strings are -; possible: +; possible: ; ; "Bonus_Tech" = player gets extra tech if reached first ; "Bridge" = "Settler" unit types can build roads with @@ -185,7 +185,7 @@ req2 = "The Republic" flags = "" graphic = "a.banking" graphic_alt = "-" -helptext = _("Prevents Philosophy from awarding bonus tech.") +helptext = _("Infantry upkeep: 1 gold. Blocks Philosophy bonus. Globally expires capital trade route bonus.") cost = 364 [advance_bridge_building] @@ -231,7 +231,7 @@ req2 = "Horseback Riding" flags = "" graphic = "a.chivalry" graphic_alt = "-" -helptext = _("Obsoletes Horsemen, Chariots. Does not block Philosophy bonus.") +helptext = _("Obsoletes Horsemen, Chariots.") cost = 226 [advance_code_of_laws] @@ -258,7 +258,7 @@ req2 = "Explosives" flags = "" graphic = "a.combustion" graphic_alt = "-" -helptext = _("+1 move for Trains.") +helptext = _("Obsoletes Balloon. +1 move for Trains.") cost = 3810 [advance_communism] @@ -287,7 +287,7 @@ req2 = "Metallurgy" flags = "" graphic = "a.conscription" graphic_alt = "-" -helptext = _("Obsoletes Musketeers. Capable cities can make multiple caravans/infantry per turn.") +helptext = _("Obsoletes Musketeers, Falconeers. Cities can build >1 unit. Old infantry convert to Musketeers.") cost = 1890 [advance_construction] @@ -306,7 +306,6 @@ req2 = "None" flags = "" graphic = "a.currency" graphic_alt = "-" -helptext = _("Boats can build Wonders.") [advance_democracy] name = _("Democracy") @@ -315,7 +314,7 @@ req2 = "Invention" flags = "" graphic = "a.democracy" graphic_alt = "-" -helptext = _("Allows government Democracy.") +helptext = _("Obsoletes Code of Hammurabi. Allows government Democracy.") cost = 875 [advance_economics] @@ -362,7 +361,7 @@ req2 = "Space Flight" flags = "" graphic = "a.environmentalism" graphic_alt = "-" -helptext = _("-50% Pollution in all cities.") +helptext = _("Reduces pollution from population by half.") cost = 8040 [advance_espionage] @@ -393,6 +392,8 @@ flags = "" graphic = "a.feudalism" graphic_alt = "-" cost = 146 +helptext = _("Allows Castles (with Construction).") + [advance_flight] name = _("Flight") @@ -404,15 +405,6 @@ graphic_alt = "-" helptext = _("Traderoutes give less first time revenue.") cost = 4680 -[advance_fundamentalism] -name = _("Fundamentalism") -req1 = "Theology" -req2 = "Conscription" -flags = "" -graphic = "a.fundamentalism" -graphic_alt = "-" -helptext = _("Allows government Fundamentalism.") - [advance_fusion_power] name = _("Fusion Power") req1 = "Superconductors" @@ -420,14 +412,15 @@ req2 = "None" flags = "" graphic = "a.fusion_power" graphic_alt = "-" +helptext = _("Obsoletes Medici Bank.") cost = 8040 -[advance_genetic_engineering] -name = _("Genetic Engineering") +[advance_microbiology] +name = _("Microbiology") req1 = "Medicine" req2 = "The Corporation" flags = "" -graphic = "a.genetic_engineering" +graphic = "a.microbiology" graphic_alt = "-" cost = 3150 @@ -449,7 +442,7 @@ flags = "" graphic = "a.gunpowder" graphic_alt = "-" cost = 800 -helptext = _("Obsoletes Agōgē of Sparta, Barracks, earlier foot soldiers.") +helptext = _("Obsoletes Castle, Agōgē of Sparta, Barracks, earlier foot soldiers.") [advance_horseback_riding] name = _("Horseback Riding") @@ -459,6 +452,7 @@ flags = "" graphic = "a.horseback_riding" graphic_alt = "-" cost = 24 +helptext = _("Travellers spread news to the world if discovered before Turn 15.") [advance_industrialization] name = _("Industrialization") @@ -476,7 +470,7 @@ req2 = "Literacy" flags = "" graphic = "a.invention" graphic_alt = "-" -helptext = _("Extra vision for Fortress and Naval Base. Prevents Philosophy bonus.") +helptext = _("Extra vision in Fortress, Naval Base, Castle. Blocks Philosophy bonus.") [advance_iron_working] name = _("Iron Working") @@ -494,7 +488,7 @@ flags = "" graphic = "a.labor_union" graphic_alt = "-" cost = 5430 -helptext = _("Upkeep paid is 1 gold for: Foot Soldiers, Mechanized Infantry.") +helptext = _("Musketeers can convert to Riflemen.") [advance_laser] name = _("Laser") @@ -543,7 +537,7 @@ flags = "" graphic = "a.magnetism" graphic_alt = "-" helptext = _("Obsoletes Caravel.") -cost = 950 +cost = 875 [advance_map_making] name = _("Map Making") @@ -570,7 +564,7 @@ req1 = "Automobile" req2 = "The Corporation" graphic = "a.mass_production" graphic_alt = "-" -helptext = _("+25% population pollution.") +helptext = _("Obsoletes Goods. +25% population pollution.") cost = 4680 [advance_mathematics] @@ -597,7 +591,7 @@ req2 = "University" flags = "" graphic = "a.metallurgy" graphic_alt = "-" -helptext = _("Obsoletes Catapult.") +helptext = _("Obsoletes Catapult, all Siege Rams. City Walls cost +10.") cost = 1340 [advance_miniaturization] @@ -627,7 +621,7 @@ req2 = "Code of Laws" flags = "" graphic = "a.monarchy" graphic_alt = "-" -helptext = _("Allows government Monarchy.") +helptext = _("Obsoletes Chand Baori, Ziggurat. Allows government Monarchy.") [advance_monotheism] name = _("Monotheism") @@ -637,7 +631,7 @@ flags = "" graphic = "a.monotheism" helptext = _("Obsoletes Elephants.") graphic_alt = "-" -cost = 415 +cost = 384 [advance_mysticism] name = _("Mysticism") @@ -684,7 +678,7 @@ req2 = "Literacy" flags = "" graphic = "a.philosophy" graphic_alt = "-" -helptext = _("Bonus tech before 1600AD if no next tier techs are possessed.") +helptext = _("Obsoletes Sphinx. Bonus tech before 1600AD if no next tier techs are possessed.") cost = 276 [advance_physics] @@ -750,7 +744,7 @@ req2 = "Bridge Building" flags = "" graphic = "a.railroad" graphic_alt = "-" -helptext = _("Obsoletes Hanging Gardens. Traderoutes less first time revenue. Allows Railroads.") +helptext = _("Allows Railroads. Obsoletes Appian Way. Traderoutes less first time revenue. ") cost = 1820 [advance_recycling] @@ -762,6 +756,7 @@ flags = "" graphic = "a.recycling" graphic_alt = "-" cost = 4460 +helptext = _("Unit upgrades cost 20% less.") [advance_refining] name = _("Refining") @@ -770,7 +765,7 @@ req2 = "Steel" flags = "" graphic = "a.refining" graphic_alt = "-" -helptext = _("Allows Oil Wells on Glaciers.") +helptext = _("Allows Arctic Oil Wells. Oil Wells on Oil get +1 shield.") cost = 3630 [advance_refrigeration] @@ -849,7 +844,7 @@ req2 = "University" flags = "" graphic = "a.steam_engine" graphic_alt = "-" -helptext = _("Obsoletes Frigate.") +helptext = _("Obsoletes Frigate, Hanging Gardens. Ends Colossus discount on Commerce units.") cost = 1240 [advance_steel] @@ -859,6 +854,7 @@ req2 = "Industrialization" flags = "" graphic = "a.steel" graphic_alt = "-" +helptext = _("Allows Sea Bridge, Bunker.") cost = 3280 [advance_superconductors] @@ -888,7 +884,7 @@ req2 = "Industrialization" flags = "" graphic = "a.the_corporation" graphic_alt = "-" -helptext = _("Obsoletes Caravan.") +helptext = _("Obsoletes Caravan, Wagon. +25% Coinage for Stock Exchange") cost = 2900 [advance_the_republic] @@ -908,6 +904,16 @@ flags = "" graphic = "a.the_wheel" graphic_alt = "-" +[advance_theocracy] +name = _("Theocracy") +req1 = "Theology" +req2 = "None" +flags = "" +graphic = "a.theocracy" +graphic_alt = "-" +helptext = _("Obsoletes Pax Dei. Allows government Theocracy.") +cost = 725 + [advance_theology] name = _("Theology") req1 = "Feudalism" @@ -916,7 +922,7 @@ flags = "" graphic = "a.theology" graphic_alt = "-" helptext = _("Obsoletes Oracle. +1 Effect on Cathedral, Michelangelos Chapel.") -cost = 725 +cost = 600 [advance_theory_of_gravity] name = _("Theory of Gravity") @@ -934,7 +940,6 @@ req2 = "Code of Laws" flags = "" graphic = "a.trade" graphic_alt = "-" -helptext = _("Lets all Commerce units make Wonders, Traderoutes.") [advance_university] name = _("University") @@ -953,7 +958,7 @@ flags = "" graphic = "a.warrior_code" graphic_alt = "-" cost = 24 -helptext = _("Foot soldiers may make Hideouts, if enabled.") +helptext = _("Foot soldiers may make Hideouts.") [advance_writing] name = _("Writing") @@ -963,6 +968,25 @@ flags = "" graphic = "a.writing" graphic_alt = "-" +[advance_nationalism] +name = _("Nationalism") +req1 = "The Corporation" +req2 = "Communism" +flags = "" +graphic = "a.nationalism" +graphic_alt = "-" +helptext = _("Allows government Nationalism.") +cost = 2775 + +;[advance_agricultural] +;name = _("Agricultural") +;req1 = "None" +;req2 = "None" +;flags = "" +;graphic = "a.horseback_riding" +;graphic_alt = "-" + + ; A placeholder tech used to ensure that when ; a game is reloaded, a player can`t rebuild ; the "Darwin's Voyage" small wonder and get diff --git a/freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/terrain.ruleset b/freeciv/freeciv/data/mp2c-desert/terrain.ruleset similarity index 68% rename from freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/terrain.ruleset rename to freeciv/freeciv/data/mp2c-desert/terrain.ruleset index 142f5e375..cfd09142b 100644 --- a/freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/terrain.ruleset +++ b/freeciv/freeciv/data/mp2c-desert/terrain.ruleset @@ -11,7 +11,7 @@ ; than minor changes. [datafile] -description="Avant-garde terrain data for Freeciv" +description="Terrain data for Freeciv" options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" format_version=20 @@ -37,15 +37,17 @@ flags = extra_flags = { "name", "helptxt" _("Quayable"), _("Allows Quays to be built.") - _("IrrigationSource"), _("Allows Irrigation.") + _("IrrigationSource"), _("Is a water source for Irrigation.") + _("WaterwaySource"), _("Is a water source for inland Canals.") _("Railable"), _("Allows Railroads to be built.") + _("FortressHeal"), _("Damaged Land and Helicopter units +25% hp per turn resting.") } [parameters] ; Percentage of "land" tiles required to be adjacent to a water tile before ; it may be "reclaimed" into a land tile (0-101; 0=anywhere, default 101=nowhere) -ocean_reclaim_requirement = 30 +ocean_reclaim_requirement = 25 ; Percentage of "water" tiles required to be adjacent to a land tile before ; it may be "channeled" into a water tile (0-101; 0=anywhere, default 101=nowhere) @@ -53,11 +55,11 @@ land_channel_requirement = 10 ; Percentage of unfrozen tiles (no "Frozen" flag) required to be adjacent ; to a frozen tile before it can thaw (0-101; 0=anywhere, default 101=nowhere) -thaw_requirement = 0 +thaw_requirement = 1 ;1 tile is 12.5% ; Percentage of frozen tiles ("Frozen" flag) required to be adjacent to an ; unfrozen tile before it can freeze (0-101; 0=anywhere, default 101=nowhere) -freeze_requirement = 0 +freeze_requirement = 1 ;1 tile is 12.5% ; Bodies of water up to this size are considered freshwater lakes, if there is ; also terrain type(s) with flag "FreshWater" in the ruleset. @@ -208,45 +210,26 @@ ocean_resources = FALSE ; ; */ <-- avoid gettext warnings -[terrain_inaccesible] -name = _("Inaccessible") -graphic = "inaccessible" -graphic_alt = "arctic" -identifier = "i" -class = "Land" -movement_cost = 0 -defense_bonus = 0 -food = 0 -shield = 0 -trade = 0 -road_food_incr_pct = 0 -road_shield_incr_pct = 0 -road_trade_incr_pct = 0 -base_time = 0 -road_time = 0 -irrigation_result = "no" -irrigation_food_incr = 0 -irrigation_time = 0 -mining_result = "no" -mining_shield_incr = 0 -mining_time = 0 -transform_result = "no" -transform_time = 0 -pillage_time = 0 -clean_pollution_time = 0 -clean_fallout_time = 0 -animal = "None" -warmer_wetter_result = "no" -warmer_drier_result = "no" -cooler_wetter_result = "no" -cooler_drier_result = "no" -flags = "NotGenerated", "NoPollution", "NoCities", "UnsafeCoast", "Frozen" -color.r = 25 -color.g = 25 -color.b = 25 -helptext = _("\ -No unit can enter this terrain, nor can any city work its tiles.\ -") +; MAPGEN terrain deployment method: ZONES, PARAMETERS. VALUES. +; 1. ZONES are pre-decided definitions of regions over the map. +; ZONES are: plains (i.e. flat, not the terrain type), high elevation, wet, etc. +; ZONES then get a random terrain on each tile according to the logic of a tri-partite PARAMETER system: +; PARAMETERS are: TARGET, PREFERRED, AVOID. PARAMETERS take VALUES which are: +; VALUES: MG_TEMPERATE, MG_GREEN, MG_MOUNTAINOUS, i.o.w., the percentages given by property_temperate, etc., in terrain items defined in ruleset. +; Each parameter has a special logic. +; TARGET = all terrains with the passed PARAMTER property will be considered and one will be picked at random based on the % values for each terrain. +; PREFERRED = only terrains with (some of) that property will be chosen. +; AVOID = all terrains with any of that property will be blacklisted from appearing in this ZONE. +; +; ZONES are: +; Plains: MG_TEMPERATE, MG_GREEN, MG_MOUNTAINOUS. +; Cold: MG_COLD, MG_UNUSED, MG_MOUNTAINOUS +; Frozen: MG_FROZEN, MG_UNUSED, MG_MOUNTAINOUS +; Forest: MG_FOLIAGE, MG_TEMPERATE, MG_TROPICAL +; Jungle: MG_FOLIAGE, MG_TROPICAL, MG_COLD +; Wetland: MG_WET, MG_UNUSED, MG_FOLIAGE +; Desert: MG_DRY, MG_TROPICAL, MG_COLD +;Alt-desert: MG_DRY, MG_TROPICAL, MG_WET [terrain_lake] name = _("Lake") @@ -262,7 +245,7 @@ trade = 2 resources = "Fish" road_trade_incr_pct = 0 base_time = 1 -road_time = 12 +road_time = 12 ; Sea Bridge irrigation_result = "no" irrigation_food_incr = 0 irrigation_time = 0 @@ -274,19 +257,20 @@ transform_time = 36 pillage_time = 1 clean_pollution_time = 3 clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "no" -warmer_drier_result = "Swamp" -cooler_wetter_result = "Arctic" -cooler_drier_result = "Tundra" -native_to = "Sea", "Air", "Balloon", "Missile", "Helicopter", "Trireme", "RiverShip", "Submarine", "AirProtect", "AirPillage", "Bomb" +animal = "[Hippo]" +warmer_wetter_result = "Ocean" +warmer_drier_result = "Ocean" +cooler_wetter_result = "Swamp" +cooler_drier_result = "Swamp" +native_to = "Sea", "Air", "Balloon", "Zeppelin", "Missile", "Helicopter", "Trireme", "RiverShip", "Submarine", "AirProtect", "Air_High_Altitude", "Bomb", "Space" flags = "NoCities", "NoBarbs", "NoPollution", "FreshWater", "NoZoc", "NoFortify" property_ocean_depth = 0 -color.r = 46 -color.g = 120 -color.b = 182 +color.r = 80 +color.g = 176 +color.b = 247 helptext = _("\ Lakes are bodies of fresh water not connected to sea or ocean.\ + Transforming to Swamp requires two adjacent land tiles.\ ") [terrain_ocean] @@ -303,7 +287,7 @@ trade = 2 resources = "Fish", "Whales" road_trade_incr_pct = 0 base_time = 1 -road_time = 12 +road_time = 12 ; Sea Bridge irrigation_result = "no" irrigation_food_incr = 0 irrigation_time = 0 @@ -317,18 +301,19 @@ clean_pollution_time = 3 clean_fallout_time = 3 animal = "None" warmer_wetter_result = "no" -warmer_drier_result = "Swamp" -cooler_wetter_result = "Arctic" -cooler_drier_result = "Arctic" -native_to = "Sea", "Air", "Balloon", "Missile", "Helicopter", "Trireme", "RiverShip", "Submarine", "AirProtect", "AirPillage", "Bomb" +warmer_drier_result = "no" +cooler_wetter_result = "Swamp" +cooler_drier_result = "Swamp" +native_to = "Sea", "Air", "Balloon", "Zeppelin", "Missile", "Helicopter", "Trireme", "RiverShip", "Submarine", "AirProtect", "Air_High_Altitude", "Bomb", "Space" flags = "NoCities", "NoPollution", "UnsafeCoast", "NoZoc", "NoFortify" property_ocean_depth = 32 -color.r = 0 -color.g = 46 -color.b = 137 +color.r = 70 +color.g = 146 +color.b = 227 helptext = _("\ Shallow oceans are mostly found near coastlines, and are often rich\ - sources of food and other resources.\ + sources of food and other resources. Transforming to Swamp requires\ + two adjacent land tiles.\ ") [terrain_deep_ocean] @@ -357,110 +342,111 @@ transform_time = 0 pillage_time = 1 clean_pollution_time = 3 clean_fallout_time = 3 -animal = "None" +animal = "[Giant Squid]" warmer_wetter_result = "no" warmer_drier_result = "no" cooler_wetter_result = "no" cooler_drier_result = "no" -native_to = "Trireme", "Sea", "Air", "Balloon", "Missile", "Helicopter", "RiverShip", "Submarine", "AirProtect", "AirPillage", "Bomb" +native_to = "Trireme", "Sea", "Air", "Balloon", "Zeppelin", "Missile", "Helicopter", "RiverShip", "Submarine", "AirProtect", "Air_High_Altitude", "Bomb", "Space" flags = "NoCities", "NoPollution", "UnsafeCoast", "NoZoc", "NoFortify" property_ocean_depth = 87 -color.r = 0 -color.g = 33 -color.b = 129 +color.r = 55 +color.g = 125 +color.b = 255 helptext = _("\ Deep oceans cover much of the world away from coastlines, and only\ seaworthy units can travel on them.\ ") -[terrain_arctic] -name = _("Arctic") -graphic = "arctic" +[terrain_plains] +name = _("Plains") +graphic = "plains" graphic_alt = "-" -identifier = "a" +identifier = "p" class = "Land" -movement_cost = 2 +movement_cost = 1 defense_bonus = 0 -food = 0 -shield = 0 +food = 1 +shield = 1 trade = 0 -resources = "Ivory", "Oil" -road_trade_incr_pct = 0 +resources = "Buffalo", "Wheat" +road_trade_incr_pct = 100 base_time = 1 -road_time = 4 -irrigation_result = "Tundra" -irrigation_food_incr = 0 -irrigation_time = 15 -mining_result = "yes" -mining_shield_incr = 2 -mining_time = 10 -transform_result = "Ocean" +road_time = 2 +irrigation_result = "yes" +irrigation_food_incr = 1 +irrigation_time = 5 +mining_result = "Forest" +mining_shield_incr = 0 +mining_time = 15 +transform_result = "Grassland" transform_time = 24 pillage_time = 1 clean_pollution_time = 3 clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Tundra" -warmer_drier_result = "Tundra" -cooler_wetter_result = "no" -cooler_drier_result = "no" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "NoBarbs", "NoCities", "CanHaveRiver", "Oil", "Frozen" -property_frozen = 23 -property_cold = 16 -property_temperate = 7 -color.r = 232 -color.g = 232 -color.b = 232 +animal = "[Lion]" +warmer_wetter_result = "Desert" +warmer_drier_result = "Desert" +cooler_wetter_result = "Tundra" +cooler_drier_result = "Grassland" +native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Zeppelin", "Missile", "Helicopter", "AirProtect", "Air_High_Altitude", "Bomb", "Space" +flags = "NotGenerated", "Starter", "CanHaveRiver", "Low Land" +property_green = 38 +property_temperate = 38 +property_frozen = 90 +property_dry = 23 +color.r = 161 +color.g = 198 +color.b = 80 helptext = _("\ -Arctic terrain is cold icy permafrost, found only in the far north or south.\ -"), _("\ - Oil wells can be built when Refining is known.\ +Plains are broad flat regions with decent potential for\ + agriculture, production, and trade.\ ") -[terrain_desert] -name = _("Desert") -graphic = "desert" +[terrain_grassland] +name = _("Grassland") +graphic = "grassland" graphic_alt = "-" -identifier = "d" +identifier = "g" class = "Land" movement_cost = 1 defense_bonus = 0 -food = 0 -shield = 1 +food = 2 +shield = 0 trade = 0 -resources = "Oasis", "Oil" +resources = "Resources" road_trade_incr_pct = 100 base_time = 1 road_time = 2 irrigation_result = "yes" irrigation_food_incr = 1 irrigation_time = 5 -mining_result = "yes" -mining_shield_incr = 1 -mining_time = 5 -transform_result = "Plains" -transform_time = 24 +mining_result = "Forest" +mining_shield_incr = 0 +mining_time = 10 +transform_result = "Hills" +transform_time = 30 pillage_time = 1 clean_pollution_time = 3 clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Grassland" -warmer_drier_result = "no" -cooler_wetter_result = "Plains" +animal = "[Wolf]" +warmer_wetter_result = "Swamp" +warmer_drier_result = "Swamp" +cooler_wetter_result = "Tundra" cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "NotGenerated", "CanHaveRiver", "Oil", "Low Land" -property_dry = 75 +native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Zeppelin", "Missile", "Helicopter", "AirProtect", "Air_High_Altitude", "Bomb", "Space" +flags = "NotGenerated", "Starter", "CanHaveRiver", "Low Land" +property_green = 69 +property_temperate = 69 +property_cold = 20 +property_dry = 23 +property_wet = 100 property_tropical = 40 -property_temperate = 26 -color.r = 214 -color.g = 185 -color.b = 106 +color.r = 100 +color.g = 178 +color.b = 105 helptext = _("\ -Deserts are very dry. Agriculture is difficult if not on a river or oasis. \ -"), _("\ -Oil wells can be built when Construction is known.\ +Grassland affords exceptional agricultural opportunities and decent trade.\ ") [terrain_forest] @@ -474,131 +460,140 @@ defense_bonus = 33 food = 1 shield = 2 trade = 0 -resources = "Pheasant", "Silk" +;Multiple entries stack the odds. We are doing this just to "register" Berries as a resource. We want control over how they appear usually. +resources = "Pheasant","Silk","Pheasant","Silk","Pheasant","Silk","Pheasant","Silk","Pheasant","Silk","Pheasant","Silk","Pheasant","Silk","Pheasant","Silk","Pheasant","Silk","Pheasant","Silk","Pheasant","Silk","Pheasant","Silk","Pheasant","Silk","Pheasant","Silk","Pheasant","Silk","Berries" road_trade_incr_pct = 0 base_time = 1 road_time = 4 -irrigation_result = "Tundra" +irrigation_result = "Plains" irrigation_food_incr = 0 irrigation_time = 5 mining_result = "Swamp" mining_shield_incr = 0 -mining_time = 12 -transform_result = "Hill" +mining_time = 15 +transform_result = "Grassland" transform_time = 24 pillage_time = 1 clean_pollution_time = 3 clean_fallout_time = 3 -animal = "None" +animal = "[Leopard]" warmer_wetter_result = "Jungle" -warmer_drier_result = "Plains" -cooler_wetter_result = "Swamp" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "Starter", "CanHaveRiver", "Low Land" -property_cold = 16 -property_frozen = 7 -property_mountainous = 15 -property_wet = 25 -property_foliage = 16 -property_temperate = 16 +warmer_drier_result = "Jungle" +cooler_wetter_result = "no" +cooler_drier_result = "no" +native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Zeppelin", "Missile", "Helicopter", + "AirProtect", "Air_High_Altitude", "Bomb", "Space" +flags = "NotGenerated", "Starter", "CanHaveRiver", "Low Land" +property_cold = 21 +property_frozen = 17 +property_mountainous = 9 +property_wet = 34 +property_foliage = 50 +property_temperate = 50 +property_green = 18 color.r = 43 -color.g = 107 +color.g = 157 color.b = 19 helptext = _("\ -Forests are densely wooded, providing lumber for production, but\ - making agriculture somewhat problematic.\ +Forests are densely wooded, providing lumber for production — but\ + making agriculture problematic.\ ") -[terrain_grassland] -name = _("Grassland") -graphic = "grassland" +[terrain_swamp] +name = _("Swamp") +graphic = "swamp" graphic_alt = "-" -identifier = "g" +identifier = "s" class = "Land" -movement_cost = 1 -defense_bonus = 0 -food = 2 +movement_cost = 2 +defense_bonus = 33 +food = 1 shield = 0 trade = 0 -resources = "Resources" -road_trade_incr_pct = 100 +resources = "Peat", "Spice" +road_trade_incr_pct = 0 base_time = 1 -road_time = 2 -irrigation_result = "yes" -irrigation_food_incr = 1 -irrigation_time = 5 +road_time = 4 +irrigation_result = "Grassland" +irrigation_food_incr = 0 +irrigation_time = 13 mining_result = "Forest" mining_shield_incr = 0 -mining_time = 10 -transform_result = "Hills" -transform_time = 30 +mining_time = 13 +transform_result = "Lake" +transform_time = 12 pillage_time = 1 clean_pollution_time = 3 clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Lake" -warmer_drier_result = "Desert" -cooler_wetter_result = "Arctic" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "NotGenerated", "Starter", "CanHaveRiver", "Low Land" -property_green = 50 -property_temperate = 50 -property_cold = 12 -property_dry = 10 -property_tropical = 20 -color.r = 11 -color.g = 138 -color.b = 4 +animal = "[Crocodile]" +warmer_wetter_result = "Ocean" +warmer_drier_result = "Lake" +cooler_wetter_result = "Grassland" +cooler_drier_result = "Grassland" +native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Zeppelin", "Missile", "Helicopter", + "AirProtect", "Air_High_Altitude", "Bomb", "Space" +flags = "NotGenerated", "CanHaveRiver", "Low Land" +property_wet = 80 +property_tropical = 10 +color.r = 129 +color.g = 179 +color.b = 146 helptext = _("\ -Grassland affords exceptional agricultural opportunities.\ +Swamps suffer from an over-abundance of water, making agriculture\ + and trade problematic.\ ") -[terrain_hills] -name = _("Hills") -graphic = "hills" +[terrain_desert] +name = _("Desert") +graphic = "desert" graphic_alt = "-" -identifier = "h" +identifier = "d" class = "Land" -movement_cost = 2 -defense_bonus = 100 -food = 1 -shield = 0 +movement_cost = 1 +defense_bonus = 0 +food = 0 +shield = 1 trade = 0 -resources = "Coal", "Wine" -road_trade_incr_pct = 0 +resources = "Oasis", "Oil", "Spice" +road_trade_incr_pct = 100 base_time = 1 -road_time = 4 +road_time = 2 irrigation_result = "yes" irrigation_food_incr = 1 -irrigation_time = 10 +irrigation_time = 5 mining_result = "yes" -mining_shield_incr = 3 -mining_time = 10 +mining_shield_incr = 1 +mining_time = 5 transform_result = "Plains" transform_time = 24 pillage_time = 1 clean_pollution_time = 3 clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "no" +animal = "[Rhino]" +warmer_wetter_result = "Grassland" warmer_drier_result = "no" -cooler_wetter_result = "no" -cooler_drier_result = "no" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "Starter", "CanHaveRiver" -property_green = 25 -property_mountainous = 55 -property_cold = 25 -property_frozen = 25 -property_dry = 16 -color.r = 24 -color.g = 97 -color.b = 5 +cooler_wetter_result = "Plains" +cooler_drier_result = "Plains" +native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Zeppelin", "Missile", "Helicopter", "AirProtect", "Air_High_Altitude", "Bomb", "Space" +flags = "CanHaveRiver", "Oil", "Low Land", "Starter" +property_dry = 99 +property_tropical = 99 +property_temperate = 99 +property_mountainous = 99 +property_green = 99 +property_wet = 99 +property_cold = 99 +property_frozen = 99 +property_foliage = 99 +color.r = 247 +color.g = 222 +color.b = 187 helptext = _("\ -Hills are frequently rich in resources. Difficult access makes\ - them good for defense but poor for trade.\ +Deserts are very dry. Agriculture is difficult if not on a river or oasis. Cities on desert rivers\ + get +1 extra food. Irrigated desert rivers give an extra +1 food over the usual bonus, even on a\ + city center tile. \ +"), _("\ +Oil wells can be built when Construction is known. Refining gives +1 shield to Oil Wells built on Oil.\ ") [terrain_jungle] @@ -627,23 +622,72 @@ transform_time = 12 pillage_time = 1 clean_pollution_time = 3 clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Lake" -warmer_drier_result = "Desert" -cooler_wetter_result = "Swamp" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" +animal = "[Tiger]" +warmer_wetter_result = "no" +warmer_drier_result = "no" +cooler_wetter_result = "Forest" +cooler_drier_result = "Forest" +native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Zeppelin", "Missile", "Helicopter", + "AirProtect", "Air_High_Altitude", "Bomb", "Space" flags = "NotGenerated", "CanHaveRiver", "Low Land" -property_foliage = 45 -property_tropical = 50 -property_wet = 45 -color.r = 55 -color.g = 156 -color.b = 38 +property_foliage = 31 +property_tropical = 41 +property_wet = 40 +color.r = 71 +color.g = 227 +color.b = 0 helptext = _("\ Jungles are densely overgrown but sometimes provide rich resources and good defense.\ ") +[terrain_hills] +name = _("Hills") +graphic = "hills" +graphic_alt = "-" +identifier = "h" +class = "Land" +movement_cost = 2 +defense_bonus = 100 +food = 1 +shield = 0 +trade = 0 +resources = "Coal", "Wine" +road_trade_incr_pct = 0 +base_time = 1 +road_time = 4 +irrigation_result = "yes" +irrigation_food_incr = 1 +irrigation_time = 10 +mining_result = "yes" +mining_shield_incr = 3 +mining_time = 10 +transform_result = "Plains" +transform_time = 24 +pillage_time = 1 +clean_pollution_time = 3 +clean_fallout_time = 3 +animal = "[Wolf]" +warmer_wetter_result = "no" +warmer_drier_result = "no" +cooler_wetter_result = "no" +cooler_drier_result = "no" +native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Zeppelin", "Missile", "Helicopter", + "AirProtect", "Air_High_Altitude", "Bomb", "Space" +flags = "Starter", "CanHaveRiver" +property_mountainous = 3 +property_cold = 3 +property_frozen = 3 +property_dry = 3 +property_tropical = 3 +property_green = 3 +color.r = 222 +color.g = 230 +color.b = 134 +helptext = _("\ +Hills are frequently rich in resources. Difficult access makes\ + them good for defense but poor for trade.\ +") + [terrain_mountains] name = _("Mountains") graphic = "mountains" @@ -670,165 +714,153 @@ transform_time = 24 pillage_time = 1 clean_pollution_time = 3 clean_fallout_time = 3 -animal = "None" +animal = "[Bear]" warmer_wetter_result = "no" warmer_drier_result = "no" cooler_wetter_result = "no" cooler_drier_result = "no" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "CanHaveRiver" -property_mountainous = 16 -property_cold = 16 -property_temperate = 7 -color.r = 129 -color.g = 127 -color.b = 118 +native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Zeppelin", "Missile", "Helicopter", + "AirProtect", "Air_High_Altitude", "Bomb", "Space" +flags = "NoBarbs" +property_mountainous = 3 +property_cold = 3 +property_frozen = 3 +property_dry = 3 +property_tropical = 3 +property_green = 3 +color.r = 160 +color.g = 156 +color.b = 170 helptext = _("\ Mountains are regions of extreme altitude, excellent for defense but inferior\ for trade and agriculture.\ ") -[terrain_plains] -name = _("Plains") -graphic = "plains" +[terrain_tundra] +name = _("Tundra") +graphic = "tundra" graphic_alt = "-" -identifier = "p" +identifier = "t" class = "Land" movement_cost = 1 defense_bonus = 0 food = 1 -shield = 1 +shield = 0 trade = 0 -resources = "Buffalo", "Wheat" +resources = "Elk", "Furs", "Elk", "Furs", "Gold" ; 40/40/20 instead of 33/33/33 road_trade_incr_pct = 100 base_time = 1 road_time = 2 irrigation_result = "yes" irrigation_food_incr = 1 irrigation_time = 5 -mining_result = "Forest" +mining_result = "Desert" mining_shield_incr = 0 mining_time = 15 -transform_result = "Grassland" +transform_result = "Plains" transform_time = 24 pillage_time = 1 clean_pollution_time = 3 clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Lake" -warmer_drier_result = "Desert" -cooler_wetter_result = "Arctic" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "NotGenerated", "Starter", "CanHaveRiver", "Low Land" -property_green = 16 -property_frozen = 5 -property_dry = 16 -property_cold = 28 -property_tropical = 10 -property_temperate = 16 -property_mountainous = 35 -color.r = 122 -color.g = 156 -color.b = 46 +animal = "[Polar Bear]" +warmer_wetter_result = "Grassland" +warmer_drier_result = "Plains" +cooler_wetter_result = "Glacier" +cooler_drier_result = "Glacier" +native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Zeppelin", "Missile", "Helicopter", "AirProtect", "Air_High_Altitude", "Bomb", "Space" +flags = "NotGenerated", "Starter", "NoBarbs", "CanHaveRiver", "Low Land" +property_cold = 17 +property_frozen = 7 +color.r = 206 +color.g = 206 +color.b = 206 helptext = _("\ -Plains are broad flat regions with decent potential for\ - agriculture, production, and trade.\ +Tundra regions are cold and barren, only fit for mediocre agriculture and trade.\ ") -[terrain_swamp] -name = _("Swamp") -graphic = "swamp" +[terrain_arctic] +name = _("Arctic") +rule_name = "Glacier" +graphic = "arctic" graphic_alt = "-" -identifier = "s" +identifier = "a" class = "Land" movement_cost = 2 -defense_bonus = 33 -food = 1 +defense_bonus = 0 +food = 0 shield = 0 trade = 0 -resources = "Peat", "Spice" +resources = "Furs", "Ivory", "Oil" road_trade_incr_pct = 0 base_time = 1 road_time = 4 -irrigation_result = "Lake" +irrigation_result = "Tundra" irrigation_food_incr = 0 irrigation_time = 15 -mining_result = "Forest" -mining_shield_incr = 0 -mining_time = 15 -transform_result = "Grassland" +mining_result = "yes" +mining_shield_incr = 2 +mining_time = 10 +transform_result = "Desert" transform_time = 24 pillage_time = 1 clean_pollution_time = 3 clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Lake" -warmer_drier_result = "Desert" -cooler_wetter_result = "Arctic" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "CanHaveRiver", "Low Land" -property_wet = 35 -property_frozen = 3 -property_tropical = 10 -property_temperate = 7 -property_cold = 7 -color.r = 48 -color.g = 85 -color.b = 97 +animal = "[Polar Bear]" +warmer_wetter_result = "Tundra" +warmer_drier_result = "Tundra" +cooler_wetter_result = "no" +cooler_drier_result = "no" +native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Zeppelin", "Missile", "Helicopter", "AirProtect", "Air_High_Altitude", "Bomb", "Space" +flags = "NotGenerated", "NoBarbs", "NoCities", "CanHaveRiver", "Oil", "Frozen" +property_frozen = 30 +property_cold = 2 +color.r = 238 +color.g = 238 +color.b = 238 helptext = _("\ -Swamps suffer from an over-abundance of water, making agriculture\ - and trade problematic.\ +Arctic terrain is cold icy permafrost, found only in the far north or south.\ +"), _("\ + Oil wells can be built when Refining is known.\ ") -[terrain_tundra] -name = _("Tundra") -graphic = "tundra" -graphic_alt = "-" -identifier = "t" +[terrain_inaccesible] +name = _("Inaccessible") +graphic = "inaccessible" +graphic_alt = "arctic" +identifier = "i" class = "Land" -movement_cost = 1 +movement_cost = 0 defense_bonus = 0 -food = 1 +food = 0 shield = 0 trade = 0 -resources = "Game", "Furs", "Game", "Furs", "Gold" ; 40/40/20 instead of 33/33/33 -road_trade_incr_pct = 100 -base_time = 1 -road_time = 2 -irrigation_result = "yes" -irrigation_food_incr = 1 -irrigation_time = 5 -mining_result = "Swamp" +road_food_incr_pct = 0 +road_shield_incr_pct = 0 +road_trade_incr_pct = 0 +base_time = 0 +road_time = 0 +irrigation_result = "no" +irrigation_food_incr = 0 +irrigation_time = 0 +mining_result = "no" mining_shield_incr = 0 -mining_time = 15 -transform_result = "Plains" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 +mining_time = 0 +transform_result = "no" +transform_time = 0 +pillage_time = 0 +clean_pollution_time = 0 +clean_fallout_time = 0 animal = "None" -warmer_wetter_result = "Lake" -warmer_drier_result = "Desert" -cooler_wetter_result = "Arctic" +warmer_wetter_result = "no" +warmer_drier_result = "no" +cooler_wetter_result = "no" cooler_drier_result = "no" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "Starter", "NoBarbs", "CanHaveRiver", "Low Land" -property_cold = 60 -property_frozen = 55 -property_green = 50 -property_mountainous = 35 -property_wet = 55 -property_dry = 55 -property_foliage = 55 -property_temperate = 55 -property_tropical = 55 -color.r = 188 -color.g = 188 -color.b = 188 +flags = "NotGenerated", "NoPollution", "NoCities", "UnsafeCoast", "Frozen" +color.r = 25 +color.g = 25 +color.b = 25 helptext = _("\ -Tundra regions are cold and barren, only fit for mediocre agriculture and trade.\ +No unit can enter this terrain, nor can any city work its tiles.\ ") ; /* <-- avoid gettext warnings @@ -860,22 +892,22 @@ trade = 8 [resource_iron] extra = "Iron" identifier = "/" -shield = 3 +;shield = 3 ;added in effects because only generated resources tied to a terrain type can access this var # mountains. -[resource_game] -extra = "Game" +[resource_elk] +extra = "Elk" identifier = "e" -food = 2 -shield = 2 +;food = 2 +;shield = 2 ;added in effects because only generated resources tied to a terrain type can access this var # tundra. [resource_furs] extra = "Furs" identifier = "u" -food = 1 -shield = 1 -trade = 3 +;food = 1 +;shield = 1 +;trade = 3 ;added in effects because only generated resources tied to a terrain type can access this var # tundra [resource_coal] @@ -900,14 +932,14 @@ trade = 2 [resource_gems] extra = "Gems" identifier = "g" -trade = 5 +;trade = 5 ;added in effects because only generated resources tied to a terrain type can access this var # jungle. [resource_rubber] extra = "Rubber" identifier = "^" -shield = 2 -trade = 2 +;shield = 2 +;trade = 2 ;added in effects because only generated resources tied to a terrain type can access this var # jungle. ; "h" reserved for strategic horses @@ -918,17 +950,6 @@ identifier = "b" shield = 2 # plains (horses => buffalo => cattle). -[resource_forest_game] -extra = "Deer" -identifier = "d" -;food = 3 ;food added in effects because only generated resources tied to a terrain type can access this var - -[resource_wild_boar] -extra = "Wild Boar" -identifier = "q" -;food = 3 ;food added in effects because only generated resources tied to a terrain type can access this var - - [resource_wheat] extra = "Wheat" identifier = "j" @@ -944,13 +965,13 @@ food = 2 [resource_oasis] extra = "Oasis" identifier = "o" -food = 3 +;food = 3 ;added in effects because only generated resources tied to a terrain type can access this var # desert. [resource_peat] extra = "Peat" identifier = "a" -shield = 4 +;shield = 4 ;added in effects because only generated resources tied to a terrain type can access this var # swamp (petroleum => peat => petroleum). [resource_pheasant] @@ -959,8 +980,6 @@ identifier = "p" food = 2 # forest, forested. -; "r" reserved for rubber - [resource_bonus] extra = "Resources" identifier = "r" @@ -970,9 +989,9 @@ shield = 1 [resource_icy_ivory] extra = "Ivory" identifier = "i" -food = 1 -shield = 1 -trade = 4 +;food = 1 ;added in effects because only generated resources tied to a terrain type can access this var +;shield = 1 +;trade = 4 # arctic [resource_silk] @@ -984,8 +1003,8 @@ trade = 3 [resource_spice] extra = "Spice" identifier = "t" -food = 2 -trade = 4 +;food = 2 +;trade = 4 ;added in effects because only generated resources tied to a terrain type can access this var # swamp-only. ; "u" reserved for uranium @@ -1006,15 +1025,40 @@ trade = 4 [resource_oil] extra = "Oil" identifier = "x" +;was added in effects so it could be appearing resource; too many layer permutations to work out. shield = 3 ; arctic used to have 4, now it's 3+2 allowing an 0 2 0 tile. # arctic, desert +[resource_berries] +extra = "Berries" +identifier = "@" +;food = 1 +;trade = 2 ;added in effects because only generated resources tied to a terrain type can access this var +# forest, forested. + +[resource_forest_game] +extra = "Deer" +identifier = "d" +;food = 3 ;food added in effects because only generated resources tied to a terrain type can access this var + +[resource_wild_boar] +extra = "Wild Boar" +identifier = "q" +;food = 3 ;food added in effects because only generated resources tied to a terrain type can access this var + [extraui] ; Player visible names of the base gui types. + +; ui_name_base_fortress refers to all bases that have gui_type "Fortress" ui_name_base_fortress = _("?gui_type:Build Fort/Buoy") + +; ui_name_base_airbase refers to all bases that have gui_type "Airbase" ui_name_base_airbase = _("?gui_type:Build Airbase") +; ui_name_base_other refers to all bases that have gui_type "Other" +ui_name_base_other = _("?gui_type:Make Tile Claim/Hideout") + ; /* <-- avoid gettext warnings ; ; Each extra, including bases, roads, and resource, must have a section here. @@ -1039,8 +1083,10 @@ ui_name_base_airbase = _("?gui_type:Build Airbase") ; (the last three require a corresponding ; [resource_*] / [base_*] / [road_*] section) ; rmcauses = events that can remove extra type. -; "CleanPollution", "CleanFallout", "Pillage", or -; "Disappear" +; "CleanPollution", "CleanFallout", "Pillage", +; "Disappear", or "Enter" +; infracost = Number of infrapoints it costs to place this +; extra. 0 means extra cannot be placed. Default is 1 ; graphic = tag specifying preferred graphic ; graphic_alt = tag for alternate graphic if preferred graphic is ; not present. Can use eg "-" for no alternate @@ -1061,10 +1107,13 @@ ui_name_base_airbase = _("?gui_type:Build Airbase") ; disappearance_reqs = spontaneous disappearance requirements ; visibility_req = Tech a player needs to have to see the extra ; This affects visibility only, for all the rules -; extra is still there even if player can't see it. +; extra is still there even if player can’t see it. ; buildable = Can extra be built? Defaults to TRUE if extra has ; any causes indicating it can result from worker -; activity. +; activity. If extra is not buildable, it can appear +; in-game only if placed in the editor, it's placed by +; map generator, or on city tile if the extra +; also has "AlwaysOnCityCenter" flag set. ; generated = Can map generator place the extra? Applicable ; for Hut, Resource, and River extras. ; build_time = how long it takes a unit to build this extra. @@ -1100,7 +1149,7 @@ ui_name_base_airbase = _("?gui_type:Build Airbase") ; hidden_by = List of extra types that will make this extra ; type not to show on UI if both present. ; bridged_over = List of extra types that, if present in tile, will prevent -; building this extra if can't be bridged over +; building this extra if can’t be bridged over ; flags ; - "NativeTile" = Native units consider tile native regardless of ; terrain @@ -1148,12 +1197,13 @@ build_time = 0 removal_time = 0 conflicts = "Mine", "Oil Well" hidden_by = "Farmland" +flags = "IrrigationSource" helptext = _("\ Irrigating a suitable tile causes it to produce extra food each turn. Most\ tiles yield +1 extra food. A desert river that does not already benefit\ - from an oasis will yield +2, or +3 if it is a city on a desert river.\ + from an oasis will yield +2, or +3 if it is a city on a desert river. \n\ "), _("\ -Irrigating a tile with a mine or oil well will destroy it.\ +Irrigating a tile with a mine or oil well will destroy it. \n\ "), _("\ City center tiles get their terrain irrigation bonus automatically, \ if there is no conflicting mine or oil well on the tile; however, \ @@ -1186,7 +1236,7 @@ helptext = _("\ Mines can be built on some types of terrain, which increases the \ number of production points produced by that tile. Hills get an extra \ 3 production points per tile; other terrains get 1 extra production \ -point.\ +point. \n\ "), _("\ Building a mine on an irrigated tile will destroy the irrigation.\ ") @@ -1213,7 +1263,7 @@ conflicts = "Irrigation", "Farmland" helptext = _("\ Oil wells behave like mines (giving an extra production point), but \ require more technology. Oil wells can be built on Desert with knowledge \ -of Construction, and on Arctic terrain with knowledge of Refining.\ +of Construction, and on Arctic terrain with knowledge of Refining. \n\ "), _("\ Building an oil well on an irrigated tile will destroy the irrigation.\ ") @@ -1247,20 +1297,20 @@ Settlers, or Engineers with the \"clean pollution\" order.\ "), _("\ Pollution from production is likely to start becoming important as \ your civilization becomes more industrialized, giving you buildings \ -such as Factory and Power Plant which boost production. Replacing a \ -Power Plant with cleaner forms of energy -- a Hydro Plant / Hoover \ +such as Factory and Coal Plant which boost production. Replacing a \ +Coal Plant with cleaner forms of energy -- a Hydro Plant / Hoover \ Dam, Nuclear Plant, or Solar Plant -- will reduce pollution from \ production, as will a Recycling Center or knowledge of \ -Environmentalism.\ +Environmentalism. \n\ "), _("\ The city population starts adding to pollution with the discovery of \ Industrialization, and Automobile, Mass Production, and Plastics make \ this worse. Building a Mass Transit in a city eliminates the \ -populational contribution to pollution.\ +populational contribution to pollution. \n\ "), _("\ The contribution of these factors can be seen in the city dialog; once \ it exceeds a threshold, the excess is the percent chance of pollution \ -appearing each turn.\ +appearing each turn. \n\ "), _("\ When an unused tile becomes polluted, there is the temptation to avoid \ the effort of cleaning it; but the spread of pollution has far more \ @@ -1268,7 +1318,7 @@ terrible results than the immediate economic impact -- every polluted \ tile increases the chance of global warming. Each time global warming \ advances, the entire world loses coastal land to the sea and to jungles \ and swamps, and inland tiles are lost to desert. This tends to \ -devastate cities and leads to global impoverishment.\ +devastate cities and leads to global impoverishment. \n\ "), _("\ The risk of global warming is cumulative; the longer polluted tiles \ are left uncleaned, the higher the risk becomes, and the risk can \ @@ -1282,7 +1332,7 @@ name = _("Minor Tribe Village") rule_name = "Hut" category = "Bonus" causes = "Hut" -;rmcauses = "" +rmcauses = "Enter" graphic = "tx.village" graphic_alt = "-" activity_gfx = "None" @@ -1298,11 +1348,9 @@ helptext = _("\ Villages (also called \"huts\") are primitive communities spread \ across the world at the beginning of the game. Any land unit can enter \ a village, making the village disappear and deliver a random response. \ -If the village proves hostile, it could produce barbarians or the unit \ -entering may simply be destroyed. If they are friendly, the player \ -could receive gold, a new technology, a military unit (occasionally a \ -settler; and sometimes a unit that the player cannot yet create), or \ -even a new city.\ +If the village is friendly, the player \ +could receive artifacts worth some gold, or a mercenary military unit \ +with no upkeep. \n\ "), _("\ Later in the game, helicopters may also enter villages, but overflight \ by other aircraft will cause the villagers to take fright and disband.\ @@ -1328,12 +1376,13 @@ reqs = build_time = 0 removal_time = 0 conflicts = "Mine", "Oil Well" +flags = "IrrigationSource" helptext = _("\ Once Refrigeration is known, irrigation systems can be upgraded to \ -farmland by irrigating them a second time; if the city working the tile \ -has a Supermarket, a farmland tile provides twice as much food.\ +Farmland by irrigating them a second time; if the city working the tile \ +has a Supermarket, a Farmland tile provides twice as much food. \n\ "), _("\ -Like irrigation, farmland is incompatible with mines and oil wells.\ +Like irrigation, Farmland is incompatible with mines and oil wells.\ ") [extra_fallout] @@ -1353,22 +1402,22 @@ reqs = "TerrainFlag", "NoPollution", "Local", FALSE, TRUE } removal_time = 0 -disappearance_chance = 2000 +disappearance_chance = 1500 disappearance_reqs = { "type", "name", "range" } flags = "NuclearWinter" helptext = _("\ -Nuclear fallout can appear on land tiles when a Nuclear unit is \ -detonated. It halves all output from its tile.\ +Nuclear Fallout can appear on land tiles when a Nuclear unit is \ +detonated. It halves all output from its tile. \n\ "), _("\ -Every tile with nuclear fallout also increases the risk of global \ +Every tile with Fallout also increases the risk of global \ nuclear winter. If nuclear winter occurs, land across the globe \ -changes into desert, tundra, and ice, and lakes and oceans freeze.\ +changes to colder terrain. \n\ "), _("\ -Settlers, Workers, and Engineers can clean up nuclear fallout.\ - Nuclear fallout disperses and disappears randomly over time.\ - On average, it lasts for 5 turns.\ +Worker types can clean Fallout.\ + Fallout disperses and disappears randomly over time.\ + On average, it lasts for about 6 turns. \n\ ") ; ***************************** BASES **************************************** @@ -1387,22 +1436,25 @@ rmact_gfx = "None" rmact_gfx_alt = "-" reqs = { "type", "name", "range","present","quiet" + "ServerSetting","hideouts","World",TRUE, FALSE + "UnitFlag", "CanHide", "Local", TRUE, FALSE + "UnitFlag", "CanClaim", "Local", FALSE, FALSE "CityTile","Center", "Local", FALSE, TRUE + "Tech", "Warrior Code", "Player",TRUE, FALSE + "TerrainClass","Land", "Local", TRUE, FALSE "Terrain", "Hills", "Local", FALSE, FALSE "Terrain", "Plains", "Local", FALSE, FALSE "Terrain", "Grassland", "Local", FALSE, FALSE "Terrain", "Tundra", "Local", FALSE, FALSE "Terrain", "Desert", "Local", FALSE, FALSE - "Terrain", "Arctic", "Local", FALSE, FALSE - "Tech", "Warrior Code", "Player",TRUE, FALSE - "TerrainClass","Land", "Local", TRUE, FALSE - "UnitFlag","CanHide", "Local", TRUE, FALSE + "Terrain", "Glacier", "Local", FALSE, FALSE "Extra", "Naval Base","Local", FALSE, FALSE "Extra", "Fortress", "Local", FALSE, FALSE + "Extra", "Castle", "Local", FALSE, FALSE + "Extra", "Bunker", "Local", FALSE, FALSE "Extra", "Airbase", "Local", FALSE, FALSE "Extra", "Fort", "Local", FALSE, FALSE "Extra", "Quay", "Local", FALSE, FALSE - "ServerSetting","hideouts","World",TRUE, FALSE } disappearance_reqs = { "type", "name", "range", "present" @@ -1420,18 +1472,63 @@ Since the dawn of time, camouflaged and concealed terrain has been\ enhanced to make Hideouts. Usually the intent is to evade an\ aggressor or to set an ambush. Hideouts can only be put in Forests,\ Swamps, Mountains, and Jungle. Warrior Code must be known. Tile must\ - be Friendly or Unclaimed. Only Foot soldiers can make Hideouts. Only\ - Land units and Helicopters can hide in them. Other types will be seen.\ - Invisibility is the only bonus of a Hideout. Hideouts can't stack with\ + be Friendly or Unclaimed. Only a Foot soldier alone on a tile can make a Hideout.\ + Only Land units and Helicopters can hide in them. Other types will be seen.\ + Invisibility is the only bonus of a Hideout. Hideouts can’t stack with\ other bases. Hideouts are invisible to anyone not occupying the tile with\ a Land unit. For each turn it is unoccupied, a Hideout has a 15% chance\ of being lost to the elements of nature. The only way to know if there is\ - a Hideout on a tile is to move a Land unit onto it.\ + a Hideout on a tile is to move a Land unit onto it. \n\ "), _(" TIP: Hideouts are good for guarding a border or setting a trap for\ intruders. Be careful! An abandoned Hideout can be used against you!\ ") +[extra_tileclaim] +name = _("Tile Claim") +category = "Infra" +causes = "Base" +rmcauses = "Pillage" +graphic = "base.tileclaim" +graphic_alt = "-" +activity_gfx = "unit.tileclaim" +act_gfx_alt = "-" +act_gfx_alt2 = "-" +rmact_gfx = "None" +rmact_gfx_alt = "-" +reqs = + { "type", "name", "range","present", "quiet" + "TerrainClass", "Land", "Local", TRUE, FALSE +; Hard contradiction between Tile Claim and Hideout is necessary so that +; the actionenabler for one never allows the other to be made. Currently, +; "CanClaim" and "CanHide" never exist in the same unit. +; "MaxUnitsOnTile", "1", "Local", FALSE, FALSE +; "Extra", "Naval Base", "Local", FALSE, FALSE ; we now allow claiming a tile so you'd keep it after +; "Extra", "Fortress", "Local", FALSE, FALSE ; removing a base. no conflicts seen yet but we can +; "Extra", "Castle", "Local", FALSE, FALSE ; bring it back if any found. +; "Extra", "Bunker", "Local", FALSE, FALSE +;------------------- + "UnitFlag", "CanClaim", "Local", TRUE, FALSE + "UnitFlag", "CanHide", "Local", FALSE, FALSE + "TerrainClass", "Land", "Local", TRUE, FALSE ; Can't claim sea tiles on a boat. + "CityTile", "Center", "Local", FALSE, TRUE + } +build_time = 1 +removal_time = 0 +;conflicts = "Fortress", "Naval Base", "Castle", "Bunker" +defense_bonus = 0 +native_to = "Land", "LandAirSea", "LandNoKill" +;hidden_by = "Fortress", "Naval Base", "Castle", "Bunker" +flags = "ShowFlag", "NativeTile" +helptext = _("\ +A Tile Claim asserts sovereignty over a tile. Tile Claims can be made in\ + domestic territory with a single diplomatic unit. Non-domestic territory\ + requires adjacency to an existing Tile Claim, and the Diplomat must be\ + supported by another unit when making the claim. NOTE: if a claimed\ + tile is unoccupied, foreign units entering the tile will take\ + possession of it for their own nation.\ +") + [extra_fort] name = _("Fort") category = "Infra" @@ -1454,8 +1551,8 @@ reqs = } build_time = 3 removal_time = 0 -native_to = "Land", "LandAirSea", "LandNoKill", "Helicopter", "Balloon", "AirProtect" -hidden_by = "Fortress", "Naval Base" +native_to = "Land", "LandAirSea", "LandNoKill", "LandRoad", "Helicopter", "Balloon", "AirProtect" +hidden_by = "Fortress", "Naval Base", "Castle", "Bunker" flags = "NativeTile", "NoStackDeath" ;, "Refuel" ;NOTE: effect_fortress_regen should give 25% of 20HP to helicopter, +1hp for being stationary ;thus a fortress should give +6hp -2hp for not being in refuel spot or +4hp/turn. Healing 67% @@ -1466,7 +1563,7 @@ flags = "NativeTile", "NoStackDeath" ;, "Refuel" helptext = _("\ Forts are rapidly built fortifications which give Land units +33% defense\ against Land and Sea units. Defending units are lost one at a time instead\ - of the entire stack dying. A fort is necessary to start building a fortress.\ + of the entire stack dying. A fort is necessary to start building a Fortress. \n\ "), _(" TIP: Forts make great outposts for keeping watch on your borders. Be careful--\ an unmanned Fort can be claimed by a foreign unit.\ @@ -1485,28 +1582,31 @@ act_gfx_alt2 = "-" rmact_gfx = "None" rmact_gfx_alt = "-" reqs = - { "type", "name", "range", "present", "quiet" - "Extra", "Fort", "Local", TRUE, FALSE - "Extra", "Hideout", "Local", FALSE, FALSE - "Tech", "Construction", "Player", TRUE, FALSE - "TerrainClass", "Land", "Local", TRUE, FALSE - "UnitFlag", "CanFortress", "Local", TRUE, FALSE - "CityTile", "Center", "Local", FALSE, TRUE + { "type", "name", "range","present", "quiet" + "Extra", "Fort", "Local", TRUE, FALSE + "Extra", "Naval Base", "Local", FALSE, TRUE + "Extra", "Hideout", "Local", FALSE, FALSE + "Tech", "Construction", "Player", TRUE, FALSE + "TerrainClass", "Land", "Local", TRUE, FALSE + "UnitFlag", "CanFortress", "Local", TRUE, FALSE + "CityTile", "Center", "Local", FALSE, TRUE } build_time = 5 removal_time = 0 +conflicts = "Naval Base" defense_bonus = 67 -native_to = "Land", "LandAirSea", "LandNoKill", "Helicopter", "Balloon" -hidden_by = "Naval Base" -flags = "NativeTile", "Refuel", "NoStackDeath" +native_to = "Land", "LandAirSea", "LandNoKill", "LandRoad", "Cargo", "Helicopter", "Balloon", "Zeppelin" +hidden_by = "Castle", "Bunker" +flags = "NativeTile", "Refuel", "NoStackDeath", "FortressHeal" helptext = _("\ -Fortresses are improvements built on top of Forts which greatly improve defense.\ - A Land unit remaining in a fortress for a whole turn without moving recovers a\ - quarter of its hit points. With Invention, fortresses gain watchtowers from which\ - land units can see farther.\ +Fortresses are improvements built on top of Forts which greatly improve defense:\ + the general bonus against most land unit attacks is 2x. \n\ +A Land unit remaining in a Fortress for a whole turn without moving recovers a\ + quarter of its hit points. With Invention, Fortresses gain watchtowers from which\ + land units can see farther. \n\ "), _("\ Units in a Fortress die one at a time instead of the entire stack being lost.\ -Diplomatic units get a 25% defense bonus in diplomatic fights.\ + Diplomatic units get a 25% defense bonus in diplomatic fights.\ ") [extra_navalbase] @@ -1524,6 +1624,7 @@ rmact_gfx_alt = "-" reqs = { "type", "name", "range", "present", "quiet" "Extra", "Fort", "Local", TRUE, FALSE + "Extra", "Fortress", "Local", FALSE, TRUE "Extra", "Hideout", "Local", FALSE, FALSE "Tech", "Engineering", "Player", TRUE, FALSE "TerrainFlag", "Low Land", "Local", TRUE, FALSE @@ -1533,20 +1634,94 @@ reqs = } build_time = 8 removal_time = 0 -conflicts = "Airbase", "Fortress" +conflicts = "Fortress", "Castle", "Bunker" defense_bonus = 67 -native_to = "Trireme", "RiverShip", "Sea", "Submarine", "Balloon", - "Land", "LandAirSea", "LandNoKill", "Helicopter" -flags = "NativeTile", "NoStackDeath", "Refuel" +native_to = "Trireme", "RiverShip", "Sea", "Submarine", "Balloon", "Zeppelin", + "Land", "LandRoad", "Cargo", "LandAirSea", "LandNoKill", "Helicopter" +flags = "NativeTile", "NoStackDeath", "Refuel", "FortressHeal" helptext = _("\ Naval bases are coastal Fortresses with ocean access. They allow ships to enter and\ - receive a 1.33x bonus from superior fortifications and defensive position. Naval\ - Bases are built into Fortresses--all other units get the benefits of a Fortress.\ + receive a 2x bonus from superior fortifications. Naval\ + Bases are built on top of Forts. All other units get the benefits of a Fortress. \n\ "), _(" NOTE: Naval bases are the only location where ships can be sure to avoid stack death without\ suffering a defense disadvantage.\ ") +[extra_castle] +name = _("Castle") +category = "Infra" +causes = "Base" +rmcauses = "Pillage" +graphic = "base.castle" +graphic_alt = "base.fortress" +activity_gfx = "unit.castle" +act_gfx_alt = "unit.fortress" +act_gfx_alt2 = "-" +rmact_gfx = "None" +rmact_gfx_alt = "-" +reqs = + { "type", "name", "range", "present", "quiet" + "Extra", "Fortress", "Local", TRUE, FALSE + "Tech", "Construction", "Player", TRUE, FALSE + "Tech", "Feudalism", "Player", TRUE, FALSE + "Tech", "Gunpowder", "Player", FALSE, FALSE + "TerrainClass", "Land", "Local", TRUE, FALSE + "UnitFlag", "CanFortress", "Local", TRUE, FALSE + "CityTile", "Center", "Local", FALSE, TRUE +; "Extra", "River", "Local", FALSE, FALSE + } +build_time = 11 +removal_time = 0 +unit_seen = "Hidden" +native_to = "Land", "LandAirSea", "LandNoKill", "LandRoad", "Cargo", "Helicopter", "Balloon", "Zeppelin" +conflicts = "Airbase", "Naval Base", "Bunker" +flags = "NativeTile", "Refuel", "NoStackDeath", "FortressHeal" +helptext = _("\ +Before the age of Gunpowder, Castles were built as fortresses with an \ +administration center. Construction on them can only begin once the \ +underlying Fortress is complete. \n\ +"), _("\ +The Castle and its surrounding area is ruled by a vassal with a high \ +degree of autonomy. This makes a Castle able to control terrain far from \ +the borders of its nation’s cities.\ +") + +[extra_bunker] +name = _("Bunker") +category = "Infra" +causes = "Base" +;rmcauses = "None" +graphic = "base.bunker" +graphic_alt = "base.fortress" +activity_gfx = "unit.fortress" +act_gfx_alt = "unit.castle" +act_gfx_alt2 = "-" +rmact_gfx = "None" +rmact_gfx_alt = "-" +reqs = + { "type", "name", "range", "present", "quiet" + "Extra", "Fortress", "Local", TRUE, FALSE + "Extra", "Castle", "Local", FALSE, FALSE + "Tech", "Gunpowder", "Player", TRUE, FALSE + "Tech", "Steel", "Player", TRUE, FALSE + "TerrainClass", "Land", "Local", TRUE, FALSE + "UnitFlag", "CanFortress", "Local", TRUE, FALSE + "CityTile", "Center", "Local", FALSE, TRUE +; "Extra", "River", "Local", FALSE, FALSE + } +build_time = 36 +removal_time = 0 +unit_seen = "Hidden" +native_to = "Land", "LandAirSea", "LandNoKill", "LandRoad", "Cargo", "Helicopter", "Balloon", "Zeppelin" +conflicts = "Airbase", "Naval Base", "Castle" +flags = "NativeTile", "Refuel", "NoStackDeath", "FortressHeal" +helptext = _("\ +Bunkers are underground Fortresses made of concrete and steel, \ +immune to air and missile attacks. In some respects they are the \ +modern equivalent of a Castle.\ +") + [extra_airbase] name = _("Airbase") category = "Infra" @@ -1569,11 +1744,12 @@ reqs = } build_time = 3 removal_time = 0 -native_to = "Air", "Balloon", "Helicopter", "Missile", "Bomb", "AirProtect", "AirPillage" +native_to = "Air", "Balloon", "Zeppelin", "Helicopter", "Missile", "Bomb", "AirProtect", "Air_High_Altitude", "Cargo" +conflicts = "Castle", "Bunker" flags = "Refuel", "NoStackDeath" helptext = _("\ Airbases allow your air units to land and refuel outside cities. \ -Air units in an airbase may be attacked by land units.\ +Air units in an airbase may be attacked by land units. \n\ "), _("\ Units can paradrop from this tile.\ ") @@ -1597,11 +1773,12 @@ reqs = "Extra", "Airbase", "Local", TRUE, FALSE "TerrainClass", "Land", "Local", TRUE, FALSE "UnitFlag", "Airbase", "Local", TRUE, FALSE + "UnitType", "Marines", "Local", FALSE, TRUE "CityTile", "Center", "Local", FALSE, TRUE } build_time = 5 removal_time = 0 -native_to = "Air", "Balloon", "Helicopter", "Missile", "Bomb", "AirProtect", "AirPillage" +native_to = "Air", "Balloon", "Zeppelin", "Helicopter", "Missile", "Bomb", "AirProtect", "Air_High_Altitude" flags = "Refuel", "NoStackDeath" helptext = _("\ With the available tech, Radar can be added to an Airbase, which significantly increases its vision.\ @@ -1653,9 +1830,10 @@ reqs = } buildable = FALSE removal_time = 0 -flags = "TerrChangeRemoves" +flags = "TerrChangeRemoves", "NoStackDeath" helptext = _("\ -Ruins mark the former site of a city that was destroyed or abandoned.\ +Ruins mark the former site of a city that was destroyed or abandoned. Units in Ruins\ + do not experience Stack-Kill. Also, Hideouts made in Ruins will never disappear.\ ") [extra_quay] @@ -1672,7 +1850,6 @@ rmact_gfx = "None" rmact_gfx_alt = "-" reqs = { "type", "name", "range", "present", "quiet" -; "Extra", "River", "Local", TRUE, FALSE "ExtraFlag", "Quayable", "Local", TRUE, FALSE "Tech", "Pottery", "Player", TRUE, FALSE "TerrainClass","Land", "Local", TRUE, FALSE @@ -1681,22 +1858,23 @@ reqs = } build_time = 3 removal_time = 0 -native_to = "Land", "LandAirSea", "LandNoKill", "Trireme", "Balloon", "RiverShip" +native_to = "Land", "LandRoad", "LandAirSea", "LandNoKill", "Trireme", "Cargo", "Balloon", "Zeppelin", "RiverShip" ;hidden_by = "" flags = "NativeTile", "AutoOnCityCenter" helptext = _("\ -Quays are structures on both sides of rivers, where boats dock parallel to the\ - river bank for quick loading and unloading. River traffic can directly offload\ - onto nearby roads and be underway. Quays also have built-in infrastructure to ferry\ - units across a river——the ancient way to cross rivers before the advent of Bridge\ - Building. Stepping from a road onto a Quay uses a full move point: the time needed\ - to load up and use its infrastructure. Any unit already on a Quay can immediately\ - step onto connecting roads at no penalty. (Cargo units must first be unloaded by\ - the transport carrying them.)\ +Quays are structures on both sides of rivers, where boats dock parallel to the river\ + bank for quick loading and unloading. River and Canal traffic can directly offload\ + onto a quay. Quays have built-in infrastructure to ferry units across a\ + river——the ancient way to cross rivers before the advent of Bridge Building.\ + Passing from a road to a quay uses a full move point: the time needed\ + to load up and use its infrastructure. Any unit already on a quay can immediately\ + step onto connecting roads at no penalty. (Cargo units must first deboard\ + the transport carrying them.) A quay can equally be placed on a canal and will\ + behave the same as on a river. \n\ "), _(" -TIP: Quays can boost transportational logistics for ancient civilisations who have\ - built on rivers. Don't be tempted to make too many Quays. The unloading and movement\ - bonus is often the extra edge an enemy needs for an effective surprise attack.\ +TIP: Quays can boost transportational logistics for ancient civilizations who build\ + on rivers. Don’t be tempted to make too many Quays. The ability to unload on a\ + river may help an enemy do a surprise attack.\ "), _("Moves needed to cross a river to a tile on the other side:\n ⁶⁄₃ moves: No infrastructure.\n\ ⁴⁄₃ moves: Quay connected to roads.\n\ @@ -1728,7 +1906,7 @@ flags = "AutoOnCityCenter", "NativeTile", "Railable" bridged_over = "River" helptext = _("\ Roads allow your land units to move more quickly, and on some terrain,\ - also provide a trade bonus.\ + also provide a trade bonus. \n\ "), _("\ Building roads on river tiles requires knowledge of Bridge Building.\ City center tiles automatically get roads (unless they are on a river\ @@ -1763,11 +1941,11 @@ bridged_over = "River" helptext = _("\ Once you learn Railroad technology, you may upgrade your roads to\ railroads. Units travel three times faster along railroads than\ - along roads.\ + along roads. \n\ "), _("\ A railroad also increases any shield resources produced by a tile.\ A tile whose road is upgraded to a railroad retains any trade bonus\ - from the road as well.\ + from the road as well. \n\ "), _("\ City center tiles with roads are automatically upgraded to railroads\ when you learn the Railroad technology.\ @@ -1777,7 +1955,7 @@ City center tiles with roads are automatically upgraded to railroads\ name = _("Maglev") category = "Infra" causes = "Road" -rmcauses = "Pillage" +rmcauses = "Pillage", "Disappear" graphic = "road.maglev" graphic_alt = "road.rail" activity_gfx = "unit.maglev" @@ -1785,13 +1963,17 @@ act_gfx_alt = "unit.road" act_gfx_alt2 = "-" rmact_gfx = "None" rmact_gfx_alt = "-" +;For now this is how we disallow MagLev on ocean: it disappears if you make it. +disappearance_chance = 10000 +disappearance_reqs = + { "type", "name", "range", "present" + "TerrainClass", "Oceanic", "Local", TRUE + "Extra", "Sea Bridge","Local", FALSE + } reqs = { "type", "name", "range", "present", "quiet" "Tech", "Superconductors", "Player", TRUE, FALSE -; "Extra", "Railroad", "Local", TRUE, FALSE "UnitFlag", "CanRoad", "Local", TRUE, FALSE -; "UnitClass", "Sea", "Local", FALSE, TRUE -; "TerrainClass", "Land", "Local", TRUE, FALSE } build_time = 3 removal_time = 0 @@ -1801,7 +1983,7 @@ flags = "NativeTile", "AutoOnCityCenter" helptext = _("\ With Superconductors, you may build MAGnetic LEVitation tracks\ on tiles. Land units expend no movement points\ - when riding a MagLev; you may ride indefinitely.\ + when riding a MagLev; you may ride indefinitely. \n\ "), _("\ City center tiles with railroads are automatically upgraded to MagLev\ when you learn about Superconductors.\ @@ -1821,7 +2003,7 @@ rmact_gfx = "None" rmact_gfx_alt = "-" buildable = TRUE generated = TRUE -defense_bonus = 33 +;defense_bonus = 33 now a +0.50 flat bonus. reqs = { "type", "name", "range", "present" "TerrainClass", "Land", "Local", TRUE @@ -1833,13 +2015,13 @@ reqs = } build_time = 2 removal_time = 0 -flags = "NativeTile", "Quayable", "IrrigationSource" +flags = "NativeTile", "Quayable", "IrrigationSource", "WaterwaySource" native_to = "Land", "LandNoKill", "LandAirSea", "Trireme", "RiverShip" helptext = _("\ Any land terrain type may have a River on it. A River adds 1\ - trade to the resources produced by that tile. It also increases the tile\ - defense factor by 50%. Finally, land units may move along a River (but\ - not diagonally) for fast travel.\ + trade to the resources produced by that tile. It also adds +0.50 to\ + the tile defense bonus. Finally, land units may move cardinally along\ + a River and use 1/3 move point. \n\ "), _("\ Roads, railroads and MagLev can only be built on River tiles if your\ civilization has learned Bridge Building technology.\ @@ -1867,7 +2049,7 @@ reqs = } build_time = 12 removal_time = 0 -native_to = "Land", "LandNoKill", "LandAirSea", "LandRoad", "LandRail" +native_to = "Land", "LandNoKill", "LandAirSea", "LandRoad" flags = "NativeTile", "Railable" helptext = _("\ Sea Bridges are engineering marvels which span lakes and seas to connect them for \ @@ -1890,14 +2072,14 @@ generated = FALSE reqs = { "type", "name", "range", "present" "TerrainFlag", "Low Land", "Local", TRUE - "TerrainClass", "Oceanic", "Adjacent", TRUE + "TerrainClass", "Oceanic", "CAdjacent", TRUE "Tech", "Engineering", "Player", TRUE "UnitFlag", "CanRoad", "Local", TRUE } build_time = 10 removal_time = 0 native_to = "Trireme", "Sea", "RiverShip", "Land", "LandAirSea", "LandNoKill", "Helicopter", "Submarine" -flags = "NativeTile", "Quayable" +flags = "NativeTile", "Quayable", "IrrigationSource", "WaterwaySource" helptext = _("\ Canals allow ships to travel through land tiles. Canals can be built on \ low land tiles only, and not far inland.\ @@ -1918,14 +2100,14 @@ generated = FALSE reqs = { "type", "name", "range", "present" "TerrainFlag", "Low Land", "Local", TRUE - "Extra", "River", "Adjacent", TRUE + "ExtraFlag", "WaterwaySource", "CAdjacent", TRUE "Tech", "Engineering", "Player", TRUE "UnitFlag", "CanRoad", "Local", TRUE } build_time = 10 removal_time = 0 native_to = "Trireme", "Sea", "RiverShip", "Land", "LandAirSea", "LandNoKill", "Helicopter", "Submarine" -flags = "NativeTile", "Quayable" +flags = "NativeTile", "Quayable", "IrrigationSource" helptext = _("\ Waterways are navigational channels that connect canals with rivers. Essentially, they're the same as canals.\ ") @@ -1946,7 +2128,7 @@ rmact_gfx_alt = "-" [extra_iron] name = _("Iron") category = "Resource" -causes = "Resource" +causes = "Resource", "Appear" ;rmcauses = "" graphic = "ts.iron" graphic_alt = "-" @@ -1955,11 +2137,26 @@ act_gfx_alt = "-" act_gfx_alt2 = "-" rmact_gfx = "None" rmact_gfx_alt = "-" +;Resource distribution scripting to add more resources in leaner +;regions. Adds about +40 to specials, so adjust settings accordingly +appearance_chance = 1000 ; +10% if no adjacent resource +appearance_reqs = + { "type", "name", "range", "present" + "Terrain", "Mountains","Local", TRUE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE + "MinYear", "-4000", "World", TRUE + "MinYear", "-3900", "World", FALSE + "Extra", "Gold", "Adjacent", FALSE + "Extra", "Iron", "Adjacent", FALSE + "Extra", "Coal", "Adjacent", FALSE + "Extra", "Wine", "Adjacent", FALSE + } -[extra_game] -name = _("?animals:Game") +[extra_elk] +name = _("Elk") category = "Resource" -causes = "Resource" +causes = "Resource", "Appear" ;rmcauses = "" graphic = "ts.tundra_game" graphic_alt = "-" @@ -1968,11 +2165,27 @@ act_gfx_alt = "-" act_gfx_alt2 = "-" rmact_gfx = "None" rmact_gfx_alt = "-" +;Resource distribution scripting to add more resources in leaner +;regions. Adds about +40 to specials, so adjust settings accordingly +appearance_chance = 1100 ; +11% if no adjacent resource +appearance_reqs = + { "type", "name", "range", "present" + "Terrain", "Tundra", "Local", TRUE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE + "MinYear", "-4000", "World", TRUE + "MinYear", "-3900", "World", FALSE + "Extra", "Elk", "Adjacent", FALSE + "Extra", "Furs", "Adjacent", FALSE + "Extra", "Buffalo", "Adjacent", FALSE + "Extra", "Wheat", "Adjacent", FALSE + "Extra", "Pheasant", "Adjacent", FALSE + } [extra_furs] name = _("Furs") category = "Resource" -causes = "Resource" +causes = "Resource", "Appear" ;rmcauses = "" graphic = "ts.furs" graphic_alt = "-" @@ -1981,6 +2194,30 @@ act_gfx_alt = "-" act_gfx_alt2 = "-" rmact_gfx = "None" rmact_gfx_alt = "-" +;Resource distribution scripting to add more resources in leaner +;regions. Adds about +40 to specials, so adjust settings accordingly +appearance_chance = 900 ; +9% if no adjacent resource +appearance_reqs = + { "type", "name", "range", "present" + ;"Terrain", "Tundra", "Local", TRUE + "Terrain", "Grassland","Local", FALSE + "Terrain", "Desert", "Local", FALSE + "Terrain", "Mountains","Local", FALSE + "Terrain", "Hills", "Local", FALSE + "Terrain", "Forest", "Local", FALSE + "Terrain", "Jungle", "Local", FALSE + "Terrain", "Swamp", "Local", FALSE + "Terrain", "Plains", "Local", FALSE + "TerrainClass","Oceanic","Local", FALSE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE + "MinYear", "-4000", "World", TRUE + "MinYear", "-3900", "World", FALSE + "Extra", "Elk", "Adjacent", FALSE + "Extra", "Furs", "Adjacent", FALSE + "Extra", "Silk", "Adjacent", FALSE + "Extra", "Pheasant", "Adjacent", FALSE + } [extra_coal] name = _("Coal") @@ -2024,7 +2261,7 @@ rmact_gfx_alt = "-" [extra_gems] name = _("Gems") category = "Resource" -causes = "Resource" +causes = "Resource", "Appear" ;rmcauses = "" graphic = "ts.gems" graphic_alt = "-" @@ -2033,11 +2270,27 @@ act_gfx_alt = "-" act_gfx_alt2 = "-" rmact_gfx = "None" rmact_gfx_alt = "-" +;Resource distribution scripting to add more resources in leaner +;regions. Adds about +40 to specials, so adjust settings accordingly +appearance_chance = 200 ; +2% if no adjacent resource +appearance_reqs = + { "type", "name", "range", "present" + "Terrain", "Jungle", "Local", TRUE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE + "MinYear", "-4000", "World", TRUE + "MinYear", "-3900", "World", FALSE + "Extra", "Rubber", "Adjacent", FALSE + "Extra", "Fruit", "Adjacent", FALSE + "Extra", "Gems", "Adjacent", FALSE + "Extra", "Wine", "Adjacent", FALSE + "Extra", "Silk", "Adjacent", FALSE + } [extra_rubber] name = _("Rubber") category = "Resource" -causes = "Resource" +causes = "Resource", "Appear" ;rmcauses = "" graphic = "ts.rubber" graphic_alt = "ts.peat" @@ -2046,6 +2299,21 @@ act_gfx_alt = "-" act_gfx_alt2 = "-" rmact_gfx = "None" rmact_gfx_alt = "-" +;Resource distribution scripting to add more resources in leaner +;regions. Adds about +40 to specials, so adjust settings accordingly +appearance_chance = 300 ; +3% if no adjacent resource +appearance_reqs = + { "type", "name", "range", "present" + "Terrain", "Jungle", "Local", TRUE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE + "MinYear", "-4000", "World", TRUE + "MinYear", "-3900", "World", FALSE + "Extra", "Rubber", "Adjacent", FALSE + "Extra", "Fruit", "Adjacent", FALSE + "Extra", "Gems", "Adjacent", FALSE + "Extra", "Resources","Adjacent", FALSE + } [extra_buffalo] name = _("Buffalo") @@ -2060,54 +2328,6 @@ act_gfx_alt2 = "-" rmact_gfx = "None" rmact_gfx_alt = "-" -[extra_deer] -name = _("Deer") -category = "Resource" -causes = "Appear", "Resource" -rmcauses = "Disappear" -graphic = "ts.forest_game" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -disappearance_chance = 10000 -disappearance_reqs = - { "type", "name", "range" - } -appearance_chance = 400 -appearance_reqs = - { "type", "name", "range", "present" - "Terrain", "Grassland","Local", TRUE - "MinYear", "-2500", "World", FALSE - "Extra", "Deer", "Adjacent", FALSE - } - -[extra_wild_boar] -name = _("Wild Boar") -category = "Resource" -causes = "Appear", "Resource" -rmcauses = "Disappear" -graphic = "ts.boar" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -disappearance_chance = 10000 -disappearance_reqs = - { "type", "name", "range" - } -appearance_chance = 400 -appearance_reqs = - { "type", "name", "range", "present" - "Terrain", "Forest","Local", TRUE - "MinYear", "-2500", "World", FALSE - "Extra", "Wild Boar", "Adjacent", FALSE - } - [extra_wheat] name = _("Wheat") category = "Resource" @@ -2124,7 +2344,7 @@ rmact_gfx_alt = "-" [extra_oasis] name = _("Oasis") category = "Resource" -causes = "Resource" +causes = "Resource", "Appear" ;rmcauses = "" graphic = "ts.oasis" graphic_alt = "-" @@ -2133,11 +2353,27 @@ act_gfx_alt = "-" act_gfx_alt2 = "-" rmact_gfx = "None" rmact_gfx_alt = "-" +flags = "IrrigationSource" +;Resource distribution scripting to add more resources in leaner +;regions. Adds about +40 to specials, so adjust settings accordingly +appearance_chance = 400 ; +4% if no adjacent resource +appearance_reqs = + { "type", "name", "range", "present" + "Terrain", "Desert", "Local", TRUE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE + "MinYear", "-4000", "World", TRUE + "MinYear", "-3900", "World", FALSE + "Extra", "Oasis", "Adjacent", FALSE + "Extra", "Oil", "Adjacent", FALSE + "Extra", "Wheat", "Adjacent", FALSE + "Extra", "Fruit", "Adjacent", FALSE + } [extra_peat] name = _("Peat") category = "Resource" -causes = "Resource" +causes = "Resource", "Appear" ;rmcauses = "" graphic = "ts.peat" graphic_alt = "-" @@ -2146,6 +2382,20 @@ act_gfx_alt = "-" act_gfx_alt2 = "-" rmact_gfx = "None" rmact_gfx_alt = "-" +;Resource distribution scripting to add more resources in leaner +;regions. Adds about +40 to specials, so adjust settings accordingly +appearance_chance = 2280 ; +22.8% if no adjacent resource +appearance_reqs = + { "type", "name", "range", "present" + "Terrain", "Swamp", "Local", TRUE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE + "MinYear", "-4000", "World", TRUE + "MinYear", "-3900", "World", FALSE + "Extra", "Spice", "Adjacent", FALSE + "Extra", "Peat", "Adjacent", FALSE + "Extra", "Resources","Adjacent", FALSE + } [extra_pheasant] name = _("Pheasant") @@ -2176,7 +2426,7 @@ rmact_gfx_alt = "-" [extra_ivory] name = _("Ivory") category = "Resource" -causes = "Resource" +causes = "Resource", "Appear" ;rmcauses = "" graphic = "ts.arctic_ivory" graphic_alt = "-" @@ -2185,6 +2435,19 @@ act_gfx_alt = "-" act_gfx_alt2 = "-" rmact_gfx = "None" rmact_gfx_alt = "-" +;Resource distribution scripting to add more resources in leaner +;regions. Adds about +40 to specials, so adjust settings accordingly +appearance_chance = 4500 ;+45% +appearance_reqs = + { "type", "name", "range", "present" + "Terrain", "Glacier", "Local", TRUE + "TerrainClass","Oceanic","Adjacent",TRUE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE + "MinYear", "-4000", "World", TRUE + "MinYear", "-3900", "World", FALSE + "Extra", "Ivory", "CAdjacent",FALSE + } [extra_silk] name = _("Silk") @@ -2202,7 +2465,7 @@ rmact_gfx_alt = "-" [extra_spice] name = _("Spice") category = "Resource" -causes = "Resource" +causes = "Resource", "Appear" ;rmcauses = "" graphic = "ts.spice" graphic_alt = "-" @@ -2211,6 +2474,20 @@ act_gfx_alt = "-" act_gfx_alt2 = "-" rmact_gfx = "None" rmact_gfx_alt = "-" +;Resource distribution scripting to add more resources in leaner +;regions. Adds about +40 to specials, so adjust settings accordingly +appearance_chance = 2420 ;+24.2% extra chance if non-adjacent extra +appearance_reqs = + { "type", "name", "range", "present" + "Terrain", "Swamp", "Local", TRUE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE + "MinYear", "-4000", "World", TRUE + "MinYear", "-3900", "World", FALSE + "Extra", "Spice", "Adjacent", FALSE + "Extra", "Peat", "Adjacent", FALSE + "Extra", "Resources","Adjacent", FALSE + } [extra_whales] name = _("Whales") @@ -2241,7 +2518,7 @@ rmact_gfx_alt = "-" [extra_oil] name = _("Oil") category = "Resource" -causes = "Resource" +causes = "Resource";, "Appear" ;rmcauses = "" graphic = "ts.oil" graphic_alt = "-" @@ -2250,6 +2527,99 @@ activity_gfx = "None" act_gfx_alt = "-" rmact_gfx = "None" rmact_gfx_alt = "-" +;Resource distribution scripting to add more resources in leaner +;regions. Adds about +40 to specials, so adjust settings accordingly +;appearance_chance = 0 ;55% no longer appears because too many permutations for layered bonuses not working. +;appearance_reqs = +; { "type", "name", "range", "present" +; "Terrain", "Glacier", "Local", TRUE +; "TerrainClass","Oceanic","Adjacent",FALSE +; "MinYear", "-4000", "World", TRUE +; "MinYear", "-3900", "World", FALSE +; "Extra", "Oil", "CAdjacent",FALSE +; } + +[extra_berries] +name = _("Berries") +category = "Resource" +causes = "Resource", "Appear" +;rmcauses = "" +graphic = "ts.berries" +graphic_alt = "ts.gold" +activity_gfx = "None" +act_gfx_alt = "-" +act_gfx_alt2 = "-" +rmact_gfx = "None" +rmact_gfx_alt = "-" +;Resource distribution scripting to add more resources in leaner +;regions. Adds about +40 to specials, so adjust settings accordingly +appearance_chance = 700 ; +7% iff no adjacent rivers or resources i.e., far less than 4% +appearance_reqs = + { "type", "name", "range", "present" + "Terrain", "Forest", "Local", TRUE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE + "MinYear", "-4000", "World", TRUE + "MinYear", "-3900", "World", FALSE + "Extra", "Berries", "Adjacent", FALSE + "Extra", "Pheasant", "Adjacent", FALSE + "Extra", "Wheat", "Adjacent", FALSE + "Extra", "Buffalo", "Adjacent", FALSE + "Extra", "Resources","Adjacent", FALSE + "Extra", "Fruit", "Adjacent", FALSE + "Extra", "Silk", "Adjacent", FALSE + "Extra", "River", "Local", FALSE ;Forests need help to have less non-trade tiles + } + +; ************ WANDERING WILD ANIMAL RESOURCES ************************ +[extra_deer] +name = _("Deer") +category = "Resource" +causes = "Appear", "Resource" +rmcauses = "Disappear" +graphic = "ts.forest_game" +graphic_alt = "-" +activity_gfx = "None" +act_gfx_alt = "-" +act_gfx_alt2 = "-" +rmact_gfx = "None" +rmact_gfx_alt = "-" +disappearance_chance = 10000 +disappearance_reqs = + { "type", "name", "range" + } +appearance_chance = 360 +appearance_reqs = + { "type", "name", "range", "present" + "Terrain", "Grassland","Local", TRUE + "MinYear", "-2200", "World", FALSE + "Extra", "Deer", "Adjacent", FALSE + } + +[extra_wild_boar] +name = _("Wild Boar") +category = "Resource" +causes = "Appear", "Resource" +rmcauses = "Disappear" +graphic = "ts.boar" +graphic_alt = "-" +activity_gfx = "None" +act_gfx_alt = "-" +act_gfx_alt2 = "-" +rmact_gfx = "None" +rmact_gfx_alt = "-" +disappearance_chance = 10000 +disappearance_reqs = + { "type", "name", "range" + } +appearance_chance = 360 +appearance_reqs = + { "type", "name", "range", "present" + "Terrain", "Forest","Local", TRUE + "MinYear", "-2200", "World", FALSE + "Extra", "Wild Boar", "Adjacent", FALSE + } + ; /* <-- avoid gettext warnings ; @@ -2259,6 +2629,7 @@ rmact_gfx_alt = "-" ; (must have "Base" in its causes) ; gui_type = How gui should handle this base. ; Value can be "Fortress", "Airbase", or "Other" +; See also [extraui] section ; border_sq = Base will claim land ownership up to this radius, ; -1 to disable. If enabled, base cannot exist in city tile. ; vision_main_sq = Base will have main layer vision to this radius @@ -2276,6 +2647,11 @@ gui_type = "Other" border_sq = -1 vision_main_sq = 2 +[base_tileclaim] +extra = "Tile Claim" +gui_type = "Other" +border_sq = 0 + [base_fort] extra = "Fort" gui_type = "Fortress" @@ -2289,6 +2665,20 @@ border_sq = 4 vision_main_sq = 4 flags = "NoAggressive" +[base_castle] +extra = "Castle" +gui_type = "Fortress" +border_sq = 5 +vision_main_sq = 15 +flags = "NoAggressive" + +[base_bunker] +extra = "Bunker" +gui_type = "Fortress" +border_sq = 4 +vision_main_sq = 4 +flags = "NoAggressive" + [base_airbase] extra = "Airbase" gui_type = "Airbase" @@ -2357,11 +2747,29 @@ flags = "NoAggressive" ; flowing from land tiles to ocean ; - "UnrestrictedInfra" = Use of the enemy owned road is not restricted ; even if server setting 'restrictinfra' is set -; - "JumpFrom" = Move to a tile nativity providing "JumpTo" -; road is considered native -; - "JumpTo" = Move from a tile nativity providing "JumpFrom" -; road is considered native -; +; - "JumpFrom" = Allows movement to a dest tile natively, provided it +; has a "JumpTo" road which is considered native +; - "JumpTo" = Allow movement to this tile natively, provided the +; source tile has a road with "JumpFrom" and the road +; is considered native +; - "IntegrateCostUp" = If this road (type A) integrates with type B, then +; the move cost when going from A to B will be the +; greater of move_cost(A) and move_cost(B). +; This gives the ruleset several possibilities: +; if this flag is given to higher move cost road (A): +; the move cost from A to B will be the same as +; B to A: the higher of the two; i.e., symmetric +; higher move cost. In other words, the same as +; how roads work with railroads. +; if this flag is given to lower move cost road (B): +; the move cost from A to B and B to A will be the +; destination cost -- that is, asymmetric; BUT +; type B will have symmetric move costs integrating +; with roads of lower move cost than itself. +; if this flag is not used: +; move_cost will be that of the destination road: +; i.e., asymmetric move_cost for A-to-B and B-to-A + ; */ <-- avoid gettext warnings [road_road] @@ -2373,7 +2781,7 @@ trade_incr = 1 food_bonus = 0 shield_bonus = 0 trade_bonus = 0 -integrates = "Quay", "Sea Bridge" +integrates = "Quay", "Sea Bridge", "Maglev" compat_special = "Road" flags = "UnrestrictedInfra" @@ -2386,7 +2794,7 @@ trade_incr = 0 food_bonus = 0 shield_bonus = 0 trade_bonus = 0 -integrates = "Road" +integrates = "Road", "Quay" flags = "UnrestrictedInfra" [road_railroad] @@ -2398,7 +2806,7 @@ trade_incr = 0 food_bonus = 0 shield_bonus = 50 trade_bonus = 0 -integrates = "Sea Bridge" +integrates = "Sea Bridge", "Maglev" compat_special = "Railroad" [road_maglev] @@ -2410,6 +2818,7 @@ trade_incr = 0 food_bonus = 0 shield_bonus = 0 trade_bonus = 0 +integrates = "Sea Bridge", "Road", "Railroad" [road_river] extra = "River" @@ -2428,7 +2837,7 @@ trade_incr = 0 food_bonus = 0 shield_bonus = 0 trade_bonus = 0 -integrates = "Road", "Railroad" +integrates = "Road", "Railroad", "Maglev" flags = "UnrestrictedInfra" [road_canal] diff --git a/freeciv/freeciv/data/mp2-brava2/units.ruleset b/freeciv/freeciv/data/mp2c-desert/units.ruleset similarity index 61% rename from freeciv/freeciv/data/mp2-brava2/units.ruleset rename to freeciv/freeciv/data/mp2c-desert/units.ruleset index 136a5808b..4dd989e82 100644 --- a/freeciv/freeciv/data/mp2-brava2/units.ruleset +++ b/freeciv/freeciv/data/mp2c-desert/units.ruleset @@ -1,3 +1,4 @@ +;:::::::::::::::::::::::::::::::::::::::::’ × ; Modifying this file: ; You should not modify this file except to make bugfixes or ; for other "maintenance". If you want to make custom changes, @@ -11,11 +12,12 @@ ; the first available (not obsolete) such unit, or by picking the last ; such unit directly. When determining starting units, the first ; unit with the relevant role that the player can build will be chosen. -; If no such unit can be found (eg Explorers that require Seafaring), +; If no such unit can be found (eg Explorers that require Map Making), ; then the first unit with this role will be chosen. +;:::::::::::::::::::::::::::::::::::::::::’ × [datafile] -description="Unit definitions for the Avant-garde ruleset." +description="Unit definitions for the MP2 ruleset." options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" format_version=20 @@ -29,6 +31,7 @@ format_version=20 ; ************** MADE COMPATIBLE BETWEEN MP+ AND MP2 RULESETS AND POSSIBLY CLASSIC AND CIV2CIV3 SO THAT ; ************** THERE IS UNIFORMITY IN FCW CLIENT which checks these flags based on index #. Not keeping ; ************** uniformity results in loss of features as ability to check these flags would be lost. +; *** if you remove one, make it "unused" and add to it later, so the index of the others does not mess up flags = { "name", "helptxt" _("Airbase") @@ -52,7 +55,7 @@ flags = _("AddToCity"), _("Can add itself to the population of a city.") _("Nuclear"), _("Can perform a Nuclear Detonation obliterating all adjacent tiles.") _("Missile"), _("AEGIS and Armor II have a defense bonus against this unit.") - _("Well-Digger"), _("Can dig a well and irrigate tiles with no water.") + _("Well-Digger"), _("Can dig a well.") _("Infra"), _("Can build infrastructure.") _("Proletarian"), _("Controllable only by Communist governments.") _("Paratroopers"), _("Can be paradropped from a friendly city or suitable base.") @@ -63,18 +66,17 @@ flags = _("FortBuster"), _("Defending Forts get no bonus. +33% attack bonus vs. the 2× defense of a Fortress.") _("FortressBuster"), _("Defending Fortresses get no bonus.") _("AntiAir"), _("Anti-Air bonus of this unit is less effective against Stealth, which has a 25% bonus against this unit.") -;;; _("NeverProtects"), _("Does not protect other units on its tile.") ; UNCOMMENT THIS IF NOT USING SCL'S PATCH FOR THIS FLAG ;;; _("NeverBlocked"), _("Bypasses unreachable units when attacking a tile.") ; UNCOMMENT THIS IF NOT USING LEXXIE'S PATCH FOR THIS FLAG - _("MultiSlot"), _("Cities with proper requirements can produce more than one of these per turn.") ;uncomment if you don't have slot_control patch +;;; _("MultiSlot"), _("Cities with proper requirements can produce more than one of these per turn.") ;uncomment if you don't have slot_control patch _("CanHide"), _("In appropriate terrain, this unit can make a Hideout, which will conceal all land units on the tile.") _("WillNever") -;;; The following flag MUST be #34 position to work with hack in movement.c which allows transported AAA to defend on non-native: -;;; this comment can be removed when we have some smarter way for unit_can_defend_here(..) to get ruleset control. - _("TransportDefender"), _("Can defend while transported on non-native tiles.") +;;; _("TransportDefender"), _("Can defend while transported on non-native tiles.") ;uncomment if you don't have TransportDefender patch _("NonMilAttack"), _("Has military capacity but for peaceful purposes, can enter territories with whom you are at Peace") + _("Cant_Pillage"), _("Unable to pillage tiles.") + _("CanClaim"), _("Is able to claim sovereignty of foreign tiles bordering domestic territory.") } -; Names for custom unit class flags. There can be up to 8 of these. +; Names for custom unit class flags. There can be up to 12 of these. ; name = rule name; In some circumstances user may see this ; as part of some sentences, so try to make it descriptive ; and sensible. @@ -82,9 +84,11 @@ flags = ; with this flag (optional) class_flags = { "name", "helptxt" + _("AttFromNonNative"), _("Can launch attack from non-native tiles.") + _("Missile") + _("CanPillage") _("Airliftable"), _("Can be airlifted if it has remaining moves.") _("BorderPolice"), _("Military units from this class can peacefully expel certain foreign units.") - _("AttFromNonNative"), _("Can launch attack from non-native tiles.") _("CargoRestrained"), _("Can't attack as Cargo. Must first unload.") } @@ -147,7 +151,6 @@ veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 ; "TerrainDefense" = Unit Class gains defense bonus from terrain ; "DamageSlows" = Damaged units are slowed down ; "CanOccupyCity" = Military units of this class can occupy enemy cities -; "Missile" = Unit Class is destroyed when it attacks ; "BuildAnywhere" = Unit Class can be built even in the middle of non-native terrain ; "Unreachable" = Unit Class can be attacked only by units explicitly listing this ; class in its 'targets', unless on a city or native base. @@ -159,7 +162,6 @@ veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 ; override this ; "CanFortify" = Unit can fortify at land tiles. Unit type flag ; "Cant_Fortify" can override this -; "CanPillage" = Unit Class can pillage tile infrastructure ; "DoesntOccupyTile" = Even if this class of enemy unit is on tile, cities can ; still work that tile ; "AttackNonNative" = Unit Class can attack units on non-native tiles. Unit type @@ -172,19 +174,17 @@ veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 ; "KillCitizen" = Upon successful attack against a city, unit kills one ; citizen. The effect "Unit_No_Lose_Pop" and the server ; setting 'killcitizen' can disable this. - -; "Airliftable" = This Unit Class may be airlifted +; ; */ <-- avoid gettext warnings ; ********************************************************************************** ; ********************************************************************************** -; WARNING: ANY CHANGES TO WHAT TYPES OR CLASSES CAN LOAD ONTO WHICH TRANSPORTS MAY +; WARNING:ANY CHANGES TO WHAT TYPES OR CLASSES CAN LOAD ONTO WHICH TRANSPORTS MAY ; REQUIRE CHANGES TO FCW function unit_could_possibly_load() in unit.js ; ********************************************************************************** ; ********************************************************************************** [unitclass_missile] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Missile") min_speed = 1 hp_loss_pct = 0 @@ -206,7 +206,7 @@ helptext = _("\ name = _("?unitclass:LandRail") min_speed = 4 hp_loss_pct = 0 -flags = "Unreachable", "BuildAnywhere", "ZOC", "TerrainDefense", "TerrainSpeed" +flags = "Unreachable", "BuildAnywhere", "ZOC", "TerrainDefense", "TerrainSpeed", "DamageSlows" helptext = _("\ • Only able to move on railroad tiles.\ ") @@ -215,13 +215,18 @@ helptext = _("\ name = _("?unitclass:LandRoad") min_speed = 3 hp_loss_pct = 0 -flags = "BuildAnywhere", "ZOC", "TerrainDefense", "TerrainSpeed" +flags = "BuildAnywhere", "ZOC", "TerrainDefense", "DamageSlows", "TerrainSpeed", "CanFortify" helptext = _("\ • Only able to move on road tiles.\ ") +[unitclass_cargo] +name = _("?unitclass:Cargo") +min_speed = 1 +hp_loss_pct = 0 +flags = "BuildAnywhere", "ZOC", "TerrainSpeed" + [unitclass_land] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Land") min_speed = 1 hp_loss_pct = 0 @@ -260,31 +265,28 @@ helptext = _("\ ") [unitclass_sea] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Sea") min_speed = 3 hp_loss_pct = 0 flags = "DamageSlows", "AttackNonNative", "AttFromNonNative", "CanPillage" helptext = _("\ - • Crew Repair: each turn, regardless of movement, recovers 8% of its hit points (rounded down).\ + • Crew Repair:each turn, regardless of movement, recovers 8% of its hit points (rounded down).\ ") ; Separating the Submarine class finally allows it to be unreachable by Air. The old Submarine was ; far too offensively overpowered while simultaneously almost useless from ultra-vulnerability to Air units. ; Because it is now Unreachable, any unit able to attack it needs this class in its targets. [unitclass_submarine] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Submarine") -min_speed = 3 +min_speed = 4 hp_loss_pct = 0 flags = "DamageSlows", "AttackNonNative", "AttFromNonNative", "CanPillage", "Unreachable" helptext = _("\ - • Visibility bonus: not visible to other players unless they have a unit or city adjacent to it.\n\ - • Crew Repair: each turn, regardless of movement, recovers 2 hit points.\ + • Visibility bonus:not visible to other players unless they have a unit or city adjacent to it.\n\ + • Crew Repair:each turn, regardless of movement, recovers 2 hit points.\ ") [unitclass_trireme] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Trireme") min_speed = 2 hp_loss_pct = 0 @@ -298,7 +300,6 @@ hp_loss_pct = 0 flags = "DamageSlows", "AttackNonNative", "AttFromNonNative" [unitclass_heli] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Helicopter") min_speed = 1 hp_loss_pct = 5 @@ -306,7 +307,6 @@ flags = "Unreachable", "CanOccupyCity", "CollectRansom", "Airliftable" ; This class is for air units that are unreachable but do not protect a stack. [unitclass_air] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Air") min_speed = 1 hp_loss_pct = 0 @@ -314,47 +314,66 @@ hut_behavior = "Frighten" flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; This class is for air units that can pillage terrain (i.e. Jet Bomber) -[unitclass_airpillage] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:AirPillage") +[unitclass_air_high_altitude] +name = _("?unitclass:Air_High_Altitude") min_speed = 1 hp_loss_pct = 0 hut_behavior = "Frighten" -flags = "Unreachable", "DoesntOccupyTile", "Airliftable", "CanPillage" +flags = "Unreachable", "DoesntOccupyTile", "Airliftable" + +[unitclass_space] +name = _("?unitclass:Space") +min_speed = 60 +hp_loss_pct = 0 +hut_behavior = "Nothing" +flags = "Unreachable", "DoesntOccupyTile" + +;[unitclass_virtual] +;name = _("?unitclass:Virtual") +;min_speed = 5 +;hp_loss_pct = 0 +;flags = "DoesntOccupyTile", "Airliftable" +;helptext = _("\ +; • Must end each turn on Destroyer class or AEGIS Cruiser.\ +;") ; This class is for air units that can also protect a stack. -; (Fighters) -- technically a separate AirProtect class is not needed, but +; (Fighters) — technically a separate AirProtect class is not needed, but ; Fighters also have Border Police abilities, and a separate class ; facilitates future adjustments and balancing in an isolated class. [unitclass_air_protect] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:AirProtect") min_speed = 1 hp_loss_pct = 0 hut_behavior = "Frighten" flags = "Unreachable", "DoesntOccupyTile", "Airliftable", "BorderPolice" helptext = _("\ - • INTERCEPTOR: can be given the Vigil order to auto-attack adjacent Air units.\n\ - • AIR COVER: Most units who cannot attack this unit also cannot attack other units on the tile.\ + • INTERCEPTOR:can be given the Vigil order to auto-attack adjacent Air units.\n\ + • AIR COVER:Most units who cannot attack this unit also cannot attack other units on the tile.\ ") [unitclass_balloon] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Balloon") min_speed = 1 hp_loss_pct = 0 hut_behavior = "Frighten" flags = "Unreachable", "DoesntOccupyTile", "Airliftable" +[unitclass_zeppelin] +name = _("?unitclass:Zeppelin") +min_speed = 1 +hp_loss_pct = 0 +hut_behavior = "Frighten" +flags = "Unreachable", "DoesntOccupyTile" ; /* <-- avoid gettext warnings ; -; Below: The individual unit types, one per section. +; Below:The individual unit types, one per section. ; ; The number can be variable, up to 200. ; However for the "official" rulesets, units should not be removed ; because that would break backward compatability with savegames. ; -; The order here matters: later units are considered "better" for +; The order here matters:later units are considered "better" for ; a given flag or role. ; ; The actual tag used (the * in [unit_*]) does not matter, except @@ -387,7 +406,7 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; hitpoints = how much damage unit can withstand ; firepower = number of hitpoints removed per round of combat; at least 1 ; move_rate = base move rate (whole movement points) -; vision_radius_sq = base vision of unit: unit can see tile up to the square +; vision_radius_sq = base vision of unit:unit can see tile up to the square ; root of this value away ; convert_to = can be converted to another type of unit by name ; convert_time = number of movement points it takes to convert to @@ -402,7 +421,16 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; uk_* = upkeep costs, these are used as base values in the game ; cargo = Unit classes this unit can transport ; city_slots = How many of homecity's unit maintenance slots unit takes -; city_size = Initial size of the cities built by 'Found City' type units +; city_size = UNUSED in MP rulesets in its original form, so now it is used +; for bit-field for additional flags that won't break save game +; compatibility. +; BIT 0 = RESERVED for +1 bombard range. +; BIT 1 = bombard_stay_fortified, attacks do not lose fortified status. +; BITS 2-7 = move frags used (up to 63, 0=turn loss/oneattack) +; BITS 8-10 = bombard_primary_targets. 0=all, or 1-7. +; BITS 11-13 = bombard_primary_kills, max kills allowed. 0-7. +; ———————————————————————————————— +; FORMERLY:Initial size of the cities built by 'Found City' type units ; (but 'Join City' uses pop_cost) ; targets = list of unit classes this unit can attack against even ; if they have Unreachable unit class flag @@ -460,7 +488,8 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; "DefenseDividerPct" = Divide defense value by 1 + (value / 100). ; Value of 100 means division by 2, (2× for attacker) ; value of 50 means division by 1.5, (1.5× for attacker) -; i.e.: Effectively increases *attack* by value percent. +; i.e.:Effectively increases *attack* by value percent. +; Bonus is defined in attackers entry. ; "FirePower1" = Defender firepower is reduced to value 1 when ; ever this has non-zero value. ; Bonus is defined in attackers entry. @@ -469,20 +498,20 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; ; "IgZOC" = ignore Zones of Control (ZOC) even if unit class has ; "ZOC" flag -; "HasNoZOC" = unit has no Zone of Control (ZOC), thus any unit can move -; around it freely -; "NonMil" = a non-military unit: no martial law; can enter +; "HasNoZOC" = unit has no Zone of Control (ZOC), thus any unit can move +; around it freely +; "NonMil" = a non-military unit:no martial law; can enter ; peaceful borders; DoesntOccupyTile ; "IgTer" = use constant move cost defined in igter_cost (terrain.ruleset) ; rather than terrain/road etc cost, unless terrain cost is ; less -; "OneAttack" = can only make a single attack, regardless of movement points -; "FieldUnit" = cause unhappiness even when not being aggressive +; "OneAttack" = can only make a single attack, regardless of movement points +; "FieldUnit" = cause unhappiness even when not being aggressive ; "BeachLander" = won't lose all its movement when moving from non-native ; terrain to native terrain even if slow_invasions is on. -; "Settlers" = "can irrigate and build roads" but really seems to be a required flag for -; any tile improvement at all. -; "Diplomat" = can defend against diplomat actions (see diplchance +; "Settlers" = "can irrigate and build roads" but really seems to be a required flag for +; any tile improvement at all. +; "Diplomat" = can defend against diplomat actions (see diplchance ; server option) ; "Spy" = strong in diplomatic battles. _Must_ be "Diplomat" also ; "CoastStrict" = (sea only) cannot leave coast @@ -490,38 +519,36 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; to regularly end turn on coast ; "Only_Native_Attack" = cannot attack targets on non-native tiles even if ; unit class can -; "Cant_Fortify" = cannot fortify even if unit class has "CanFortify" flag -; "Fanatic" = can only be built by governments that allow them -; (see civ2/governments.ruleset, Fundamentalism government) -; "Unique" = a player can only have one of these units in the game at -; the same time; barbarians cannot use this at present -; "GameLoss" = losing one of these units means you lose the game, but it -; is produced without homecity and upkeep -; "EvacuateFirst" = the game will try to rescue units with this flag before +; "Cant_Fortify"= cannot fortify even if unit class has "CanFortify" flag +; "Fanatic" = can only be built by governments that allow them +; (see civ2/governments.ruleset, Fvndamentalist government) +; "Unique" = a player can only have one of these units in the game at +; the same time; barbarians cannot use this at present +; "GameLoss" = losing one of these units means you lose the game, but it +; is produced without homecity and upkeep +; "EvacuateFirst"=the game will try to rescue units with this flag before ; it tries to rescue units without it when their transport ; is destroyed. Think of the Birkenhead drill ("women and ; children first"). Replace "women and children" with ; "units with the EvacuateFirst unit type flag". -; "SuperSpy" = this unit always wins diplomatic contests, that is, unless -; it encounters another SuperSpy, in which case defender wins; -; can also be used on non-diplomat units, in which case it can -; protect cities from diplomats; also 100% spy survival chance -; "NoHome" = this unit has no homecity and will be free of all upkeep, and -; therefore will not revolt along with its city of origin should -; it be incited +; "SuperSpy" = this unit always wins diplomatic contests, that is, unless +; it encounters another SuperSpy, in which case defender wins; +; can also be used on non-diplomat units, in which case it can +; protect cities from diplomats; also 100% spy survival chance +; "NoHome" = this unit has no homecity and will be free of all upkeep, and +; therefore will not revolt along with its city of origin should +; it be incited ; "NoVeteran" = this unit cannot gain veteran levels through experience ; (as if both raise_chance and work_raise_chance were zero); ; it can still gain veterancy through Veteran_Build, etc ; "CityBuster" = this unit has double firepower against cities ; "NoBuild" = this unit cannot be built -; "BadWallAttacker" = the firepower of this unit is set to 1 if -; attacking a city -; defended by a city wall (or other city building defense) -; "BadCityDefender" = if attacked while in a city, firepower is set to 1 -; and firepower of attacker is doubled (the Pearl Harbour -; rule) +; "BadWallAttacker"=the firepower of this unit is set to 1 if attacking a city +; defended by a city wall (or other city building defense) +; "BadCityDefender"=if attacked while in a city, firepower is set to 1 +; and firepower of attacker is doubled (the Pearl Harbour rule) ; "BarbarianOnly" = only barbarians can build this unit -; "Shield2Gold" = Switch from shield upkeep to gold upkeep possible +; "Shield2Gold" = Switch from shield upkeep to gold upkeep possible. ; "NewCityGamesOnly" = unit can't be built on scenarios where founding new cities ; is not allowed. Give this flag to units that would make no sense ; to have in a game with such a scenario @@ -549,14 +576,22 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; is enabled and the unit class is unreachable ; "MultiSlot" = if server setting slot_control is ON, only unit types with this ; flag can use extra city_build_slots -; TO DO: make this a server UTYF flag that's used instead of Shield2Gold +; "TransportDefender" = Unit can always defend while transported, even on non-native +; terrain. +; "SentryAlways" = This unit always reports sentry-type information; give this flag to +; reconnaissance/scouting type units who can't sentry because they are +; fuel-type units (which can only sentry on refueling tiles.) +; "Reserved1" +; "Reserved2" +; "Reserved3" = reserved for future use. +; ------------------------------------------- ; Following actions require extra fields: -; "Attack" +; "Attack" and "Suicide Attack" ; attack = base attack strength ; "Bombard" ; attack = base attack strength ; bombard_rate = the number of shots fired at enemy units when attacking -; FOR NUKES: the amount to add to the default radius of 1 tile +; FOR NUKES:the amount to add to the default radius of 1 tile ; "Join City" ; pop_cost = the number of population added to the target city ; "Paradrop Unit" @@ -564,8 +599,10 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; Max range is 65534. ; paratroopers_mr_req = the move rate which is required at least for ; paradropping (whole movement points) -; paratroopers_mr_sub = the move rate which is subtracted after paradropping -; (whole movement points) +; paratroopers_mr_sub = +; This field, unused by any MP2 unit, is temporarily +; a bitfield for extra_unit_stats, to support added features +; without breaking savegame compatibility. ; "Upgrade Unit" ; obsolete_by = the unit type upgraded to. ; "Convert Unit" @@ -579,9 +616,9 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; "HutTech" = can be found in a hut, but its techs required ; "Partisan" = can be created as a partisan (only one unit can have this ; flag), see end of this file for its tech requirements option -; "DefendOk" = AI hint: ok for defending with -; "DefendGood" = AI hint: good for defending with -; "Ferryboat" = AI hint: useful for ferrying +; "DefendOk" = AI hint:ok for defending with +; "DefendGood" = AI hint:good for defending with +; "Ferryboat" = AI hint:useful for ferrying ; "Barbarian" = can be created as land barbarian ; "BarbarianTech" = can be created as land barbarian, if someone has ; researched its tech requirements @@ -594,7 +631,7 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; "BarbarianSeaTech" = can be created as a barbarian that disembarks from a barbarian boat ; if someone has researched its tech requirements ; "Settlers" = can irrigate and build roads -; "Hunter" = AI hint: good for hunting other units +; "Hunter" = AI hint:good for hunting other units ; "CitiesStartUnit" = Gets granted as 'c' startunit ; "WorkerStartUnit" = Gets granted as 'w' startunit ; "ExplorerStartUnit" = Gets granted as 'x' startunit @@ -605,8 +642,54 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; "DefendGoodStartUnit" = Gets granted as 'D' startunit ; "AttackFastStartUnit" = Gets granted as 'a' startunit ; "AttackStrongStartUnit" = Gets granted as 'A' startunit -; -; */ <-- avoid gettext warnings + +; "UserType1Startunit" = Gets granted as 'u' startunit +; "UserType2Startunit" = Gets granted as 'U' startunit +; "UserType3Startunit" = Gets granted as 'z' startunit +; "TradeStartUnit" = Gets granted as 't' startunit + +[unit_founders] +name = _("Founders") +class = "Land" +tech_req = "None" +obsolete_by = "None" +graphic = "u.founder_o" +graphic_alt = "-" +sound_move = "m_settlers" +sound_move_alt = "m_generic" +sound_fight = "f_settlers" +sound_fight_alt = "f_generic" +build_cost = 50 +pop_cost = 2 +attack = 0 +defense = 1 +hitpoints = 25 +firepower = 1 +move_rate = 2 +vision_radius_sq = 5 +transport_cap = 0 +fuel = 0 +city_size = 2 +uk_happy = 0 +uk_shield = 1 +uk_food = 1 +uk_gold = 0 +flags = "Settlers", "NoBuild", "Infra", "CanRoad", "CanFortress", "NonMil", "HasNoZOC", "AddToCity", "Cities", "Cant_Fortify", + "Expellable", "Unbribable" +; No veteran levels (level name is never displayed) +veteran_names = _("green") +veteran_base_raise_chance = 0 +veteran_work_raise_chance = 0 +veteran_power_fact = 100 +veteran_move_bonus = 0 +roles = "UserType1Startunit" +helptext = _("\ +At game start, Founders are a more populous portion of your nomadic tribe. \n\ +"), _("\ +Founders are Settlers who found a city of size 2—usually the first city and\ + capital of a tribe. They are a start unit that cannot be built. In all other\ + respects they are exactly like Settlers, except they cannot be bribed.\ +") [unit_settlers] name = _("Settlers") @@ -618,7 +701,7 @@ graphic_alt = "-" sound_move = "m_settlers" sound_move_alt = "m_generic" sound_fight = "f_settlers" -sound_fight_alt = "f_generic" +sound_fight_alt = "Pillage" build_cost = 40 pop_cost = 1 attack = 0 @@ -642,14 +725,15 @@ veteran_power_fact = 100 veteran_move_bonus = 0 roles = "CitiesStartUnit" helptext = _("\ -Settlers are your only means of founding new cities.\ +Population Cost: 1. Adds Population: 1.\n\n\ +Settlers are your only means of founding new cities. \ "), _("\ Settlers can perform most of the terrain alterations as\ - Workers (but cannot build Airbases or Buoys).\ + Workers (but can’t build Airbases or Buoys). \ "), _("\ Upkeep for Settlers costs food as well as production. A Settler\ can die if its supporting city runs out of food. Settlers in a\ - Republic, Democracy, or Fundamentalist nation require twice as\ + Republic, Democracy, or Theocratic nation require twice as\ much food per turn.\ ") @@ -659,50 +743,78 @@ class = "Land" tech_req = "None" obsolete_by = "None" graphic = "u.tribesmen" -graphic_alt = "u.engineers" ; for compatibility -sound_move = "m_worker" -sound_move_alt = "m_generic" -sound_fight = "f_worker" +graphic_alt = "-" +sound_move = "m_tribesmen" +sound_move_alt = "m_worker" +sound_fight = "f_warriors" sound_fight_alt = "f_generic" -build_cost = 20 +build_cost = 10 pop_cost = 0 -attack = 0 +attack = 1 defense = 1 -hitpoints = 5 +hitpoints = 8 firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 +move_rate = 1 +vision_radius_sq = 5 +transport_cap = 1 fuel = 0 uk_happy = 0 uk_shield = 0 uk_food = 0 uk_gold = 0 -flags = "NoBuild", "NonMil", "HasNoZOC", "Cant_Fortify", "Capturable", "Expellable" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_base_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 +cargo = "Cargo" +embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only +disembarks = "LandRoad", "LandRail", "Helicopter" +bonuses = + { "flag", "type", "value" + "NoBuild", "DefenseMultiplier", 1 ; all animals are "NoBuild" flag. technically this also means + "NoBuild", "DefenseDivider", 2 ; Barbarian Leader (which is 0D anyway), and Leader, which is hardly used. + } +flags = "NoBuild", "Settlers", "Infra", "CanRoad", "Capturable", "Expellable", + "HasNoZOC", "IgTer", "IgZOC", "NonMil", "NonMilAttack" roles = "DefendGoodStartUnit" ; re-purposed from Phalanx +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:spirit walker"), + _("?vet_rank:chief"), + _("?vet_rank:chief of all chiefs") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 250, 300, 350, 400 +veteran_move_bonus = 3, 4, 5, 6, 7, 8, 9 helptext = _("\ -Tribesmen are ancestors whose contributions are forgotten\ - in the sands of time. Tribesmen help new nations by disbanding,\ - dedicating their life work to 10 shields of the first output in\ - a city. They also explore the area around your new nation,\ - and watch for nearby tribes. They cannot do tile improvements.\ +Tribesmen came before cities and specialized division of labor. During\ + ancient times, they get primitive versatility bonuses: \n\ +Tribesmen can explore, moving over terrain with no penalty. They don’t obey\ + or exert ZOC. They can build roads, irrigate, or mine at half the rate of\ + Workers. \n\ +Tribesmen can make basic diplomatic contact and freely Investigate\ + cities. They can carry Goods and enter nations with whom you are at Peace.\ + They can do primitive combat—they can’t conquer cities and only attack for\ + 10 combat rounds. \n\ +Tribesmen help build nations by recycling into city production with\ + a 2× bonus, donating their life-work of 20 shields into any output EXCEPT\ + units. ** Changing production targets loses their work! ** \n\ +Tribesmen lose many versatility bonuses as you become more civilized. For\ + 3 turns they gain +⅓ move. After 20 turns, they lose another ⅓ move and\ + lose their vision, tile-work, and recycle bonuses. At such point, recycling\ + into a building or wonder yields 10 shields. \n\ +(In games with animals set to on, Tribesmen attack at 3× and defend at 2× against\ + wild animals.)\ ") ;A unique patch unit to provide fair starts regardless of lack of nearby water. -;to make as a start unit, use the letter "a": for example, cccwwwxxa +;to make as a start unit, use the letter "a":for example, cccwwwxxa [unit_welldigger] name = _("Well-Digger") class = "Land" tech_req = "None" obsolete_by = "Workers" graphic = "u.well_digger" -graphic_alt = "u.migrants" +graphic_alt = "-" sound_move = "m_worker" sound_move_alt = "m_generic" sound_fight = "f_worker" @@ -711,7 +823,7 @@ build_cost = 5 pop_cost = 0 attack = 0 defense = 1 -hitpoints = 10 +hitpoints = 8 firepower = 1 move_rate = 3 vision_radius_sq = 4 @@ -734,11 +846,12 @@ roles = "AttackFastStartUnit" ;this role taken over for well-digger helptext = _("\ This unit can fix unlucky starts, but has very high upkeep.\ If you have no water, make a Well-Digger in a city that can\ - support it, create a water source, then disband the unit.\n\ - This unit can dig wells; or irrigate any lowland tile. It will cost its home city\ - -2 Food -2 Prod. This unit WILL NOT WORK: • Outside your borders,\ - • After Alphabet or Pottery, • After any player discovers Writing, • After 10 turns.\ - >> Don't fool around: high upkeep will permanently hinder you. Only make this unit if you\ + support it, create a water source, then disband the unit. \n\ + This unit can dig wells to create irrigation sources. It will cost its home city\ + -2 Food -2 Prod. This unit WILL NOT WORK:• Outside your borders,\ + • After Alphabet or Pottery, • After any player discovers Writing,\ + • After it reaches an age of 10 turns.\ + >> Don't fool around:high upkeep will permanently hinder you. Only make this unit if you\ lack water when the game starts!\ ") @@ -749,21 +862,22 @@ tech_req = "Communism" gov_req = "Communism" obsolete_by = "None" graphic = "u.proletarian" -graphic_alt = "u.migrants" +graphic_alt = "-" sound_move = "m_worker" sound_move_alt = "m_generic" sound_fight = "f_worker" -sound_fight_alt = "f_generic" +sound_fight_alt = "Pillage" build_cost = 10 pop_cost = 1 attack = 0 defense = 1 -hitpoints = 10 +hitpoints = 8 firepower = 1 move_rate = 2 vision_radius_sq = 4 transport_cap = 0 fuel = 0 +city_size = 2 uk_happy = 0 uk_shield = 0 uk_food = 1 @@ -780,10 +894,14 @@ veteran_power_fact = 100 veteran_move_bonus = 1 roles = "Settlers" helptext = _("\ -Proletarians can only be controlled by Communist governments.\ +Population Cost: 1. Adds Population: 2.\n\n\ +Proletarians can only be controlled by Communist governments. \ "), _("\ Communist States can assign Proletarians from one city to another, which transfers population\ - from one to the other. They can also be ordered to the same tasks as Workers.\ + from one to the other. They can also be ordered to the same tasks as Workers. Proletarians\ + are extremely valuable as Workers for a third of the price. The disadvantage is that they\ + cost one population to make. However, this is more than compensated by the fact that when\ + they join a city, they add two to the population! \ "), _("\ Large numbers of Proletarians can be used to rapidly complete important State projects,\ which you may organize into Five-turn Plans.\ @@ -792,32 +910,33 @@ Large numbers of Proletarians can be used to rapidly complete important State pr [unit_pilgrims] name = _("Pilgrims") class = "Land" -tech_req = "Fundamentalism" -gov_req = "Fundamentalism" +tech_req = "Theocracy" +gov_req = "Theocracy" obsolete_by = "None" graphic = "u.pilgrims" -graphic_alt = "u.migrants" +graphic_alt = "-" sound_move = "m_worker" sound_move_alt = "m_generic" sound_fight = "f_worker" sound_fight_alt = "f_generic" build_cost = 10 -pop_cost = 1 +pop_cost = 0 attack = 0 defense = 1 -hitpoints = 10 +hitpoints = 8 firepower = 1 move_rate = 2 vision_radius_sq = 4 transport_cap = 0 fuel = 0 +city_size = 1 uk_happy = 0 uk_shield = 0 uk_food = 2 uk_gold = 0 embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only disembarks = "LandRoad", "LandRail", "Helicopter" -flags = "Fanatic", "Cant_Fortify", "NonMil", "HasNoZOC", "AddToCity", "Capturable", "Expellable" +flags = "Fanatic", "Cant_Fortify", "NonMil", "HasNoZOC", "AddToCity", "Capturable", "Expellable", "Cant_Pillage" ; No veteran levels (level name is never displayed) veteran_names = _("green") veteran_base_raise_chance = 0 @@ -825,12 +944,57 @@ veteran_work_raise_chance = 0 veteran_power_fact = 100 veteran_move_bonus = 0 helptext = _("\ -Pilgrims are wayfaring migrants from Fundamentalist nations. Like Fanatics,\ - they have no upkeep if under a Fundamentalist government. Heeding the call\ +Population Cost: 0. Adds Population: 1.\n\n\ +Pilgrims are wayfaring migrants from Theocratic nations. Like Zealots,\ + they have no upkeep if under a Theocratic government. Heeding the call\ of ecclesiastic authority, Pilgrims can be guided from one city to another in\ - order to transfer population from city to city.\ + order to transfer population from city to city. Pilgrims have no population\ + cost, so can be thought of as rapture for the price of 10 shields.\ ") +[unit_migrants] +name = _("Migrants") +class = "Land" +tech_req = "Nationalism" +gov_req = "Nationalism" +obsolete_by = "None" +graphic = "u.migrants" +graphic_alt = "-" +sound_move = "m_worker" +sound_move_alt = "m_generic" +sound_fight = "f_worker" +sound_fight_alt = "f_generic" +build_cost = 10 +pop_cost = 1 +attack = 0 +defense = 1 +hitpoints = 8 +firepower = 1 +move_rate = 2 +vision_radius_sq = 4 +transport_cap = 0 +fuel = 0 +city_size = 1 +uk_happy = 0 +uk_shield = 0 +uk_food = 2 +uk_gold = 0 +embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only +disembarks = "LandRoad", "LandRail", "Helicopter" +flags = "Cant_Fortify", "NonMil", "HasNoZOC", "AddToCity", "Capturable", "Expellable", "Cant_Pillage" +; No veteran levels (level name is never displayed) +veteran_names = _("green") +veteran_base_raise_chance = 0 +veteran_work_raise_chance = 0 +veteran_power_fact = 100 +veteran_move_bonus = 0 +helptext = _("\ +Population Cost: 1. Adds Population: 1.\n\n\ +Migrants are citizens under Nationalist governments who are encouraged to\ + settle in new cities, usually in conquered or colonized areas.\ + They can be guided to transfer population from city to city. This may\ + be used to increase national population growth.\ +") [unit_worker] name = _("?unit:Workers") @@ -838,16 +1002,16 @@ class = "Land" tech_req = "Pottery" obsolete_by = "Engineers" graphic = "u.worker" -graphic_alt = "u.engineers" ; for compatibility +graphic_alt = "-" sound_move = "m_worker" sound_move_alt = "m_generic" sound_fight = "f_worker" -sound_fight_alt = "f_generic" +sound_fight_alt = "Pillage" build_cost = 30 pop_cost = 0 attack = 0 defense = 1 -hitpoints = 10 +hitpoints = 8 firepower = 1 move_rate = 2 vision_radius_sq = 4 @@ -874,11 +1038,13 @@ veteran_power_fact = 100, 100, 100, 100 veteran_move_bonus = 0, 1, 1, 1 roles = "Settlers", "WorkerStartUnit" helptext = _("\ -Workers can improve terrain tiles. See the manual on Terrain for details.\ +Workers can improve terrain tiles. See the manual on Terrain for details. \ "), _("\ Masonry lets Workers build Forts. Construction lets them build Fortresses and\ - Oil Wells. Engineering lets them build Canals and Naval Bases. Radio lets them\ - build Airbases and Buoys, which Settlers cannot. Workers must be on a ship to build Buoys.\ + Oil Wells. Engineering lets them build Canals and Naval Bases. Feudalism with\ + Construction lets them build Castles. Steel lets them build Bunkers and Sea\ + Bridges. Radio lets them build Airbases and Buoys, which Settlers cannot. Workers\ + must be on a ship to build Buoys. \ "), _("\ Communism tech allows Communist governments to conscript Workers into Riflemen via the\ Convert order. And vice versa.\ @@ -890,11 +1056,11 @@ class = "Land" tech_req = "Explosives" obsolete_by = "None" graphic = "u.engineers" -graphic_alt = "u.worker" +graphic_alt = "-" sound_move = "m_engineers" sound_move_alt = "m_generic" sound_fight = "f_engineers" -sound_fight_alt = "f_generic" +sound_fight_alt = "Pillage" build_cost = 40 pop_cost = 0 attack = 0 @@ -923,7 +1089,7 @@ helptext = _("\ Engineers can do everything Workers can do, at twice the speed.\ Unlike Workers, Engineers can Transform, such as converting\ Desert to Plains. Converting Ocean to Swamp requires being on a ship\ - on a tile bordering 3 land tiles. Constructing a Sea Bridge requires\ + on a tile bordering 2 land tiles. Constructing a Sea Bridge requires\ being on a ship on a tile cardinally adjacent to land.\ ") @@ -938,7 +1104,7 @@ sound_move = "m_warriors" sound_move_alt = "m_generic" sound_fight = "f_warriors" sound_fight_alt = "f_generic" -build_cost = 10 +build_cost = 8 pop_cost = 0 attack = 1 defense = 1 @@ -946,6 +1112,8 @@ hitpoints = 10 firepower = 1 move_rate = 2 vision_radius_sq = 4 +convert_to = "Musketeers" +convert_time = 4 transport_cap = 0 fuel = 0 uk_happy = 1 @@ -957,7 +1125,10 @@ disembarks = "LandRoad", "LandRail", "Helicopter" flags = "FootSoldier", "CantReachAir", "Settlers", "CanHide", "MultiSlot", "Shield2Gold", "WillNever" roles = "DefendOk", "DefendOkStartUnit", "FirstBuild", "Hut" helptext = _("\ -The Warrior is the weakest military unit, but can also be very cost effective.\ +The Warrior is the weakest military unit, but can also be very cost effective. \n\ +With the discovery of Conscription, Warriors can convert to Musketeers in any domestic city. \ +"), _("\ +\nThe discovery of Banking changes upkeep from shields to gold.\ ") [unit_phalanx] @@ -965,13 +1136,13 @@ name = _("Phalanx") class = "Land" tech_req = "Bronze Working" obsolete_by = "Pikemen" -graphic = "u.phalanx" +graphic = "u.phalanx_o" graphic_alt = "-" sound_move = "m_phalanx" sound_move_alt = "m_generic" sound_fight = "f_phalanx" sound_fight_alt = "f_generic" -build_cost = 20 +build_cost = 16 pop_cost = 0 attack = 1 defense = 2 @@ -979,20 +1150,38 @@ hitpoints = 10 firepower = 1 move_rate = 2 vision_radius_sq = 4 +convert_to = "Musketeers" +convert_time = 4 transport_cap = 0 fuel = 0 +city_size = 278 ;000000,000,001,000101,1,0 atk_bonus=0, max_kiils=0, targets=1, move_cost=5 frags, stay_frtfy=1, reserverd=0 +paratroopers_mr_sub = 1 ;00,0000,000,0,1 iPill_rand_tgts=0, iPill_odds=-0 pentads, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=1 +;NOTE:iPillage changes in rules require client_rules_flag and get_what_can_unit_pillage_from() changes. uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only disembarks = "LandRoad", "LandRail", "Helicopter" -flags = "FootSoldier", "CantReachAir", "Settlers", "CanHide", "MultiSlot", "Shield2Gold", "WillNever" +flags = "FootSoldier", "CantReachAir", "Settlers", "CanHide", "MultiSlot", "Shield2Gold", "WillNever", "Bombarder" roles = "DefendGood", "FirstBuild", "HutTech" helptext = _("\ -The Phalanx is armored infantry, suitable for defending your cities. It offers good value\ - for defending.\ +The Phalanx is armored infantry, excellent for city defense and holding\ + tactical positions. Phalanxes can do standard attacks and Rumble attacks\ + while remaining fortified. \n\ + "), _("\ +If a Phalanx hasn’t moved, it can Rumble Attack adjacent enemies. Rumbles are\ + disciplined skirmish—not mortal combat. The formation gives the Phalanx little\ + or no vulnerability. The trade-off is that the Phalanx can only thrust at a\ + single target for 3 combat rounds. Rumble attacks are used to unsettle enemies:\ + they can discourage fortifying into tactical positions, or weaken them prior to\ + attacks from other units. The action uses ⁵⁄₉ of a move point and doesn’t alter\ + the fortified status of the Phalanx. \n\ +"), _("\ +With the discovery of Conscription, Phalanxes can convert to Musketeers in any\ + domestic city. The discovery of Banking changes upkeep from shields to gold.\ ") +bombard_rate = 3 [unit_archers] name = _("Archers") @@ -1005,7 +1194,7 @@ sound_move = "m_archers" sound_move_alt = "m_generic" sound_fight = "f_archers" sound_fight_alt = "f_generic" -build_cost = 30 +build_cost = 24 pop_cost = 0 attack = 3 defense = 2 @@ -1013,25 +1202,36 @@ hitpoints = 10 firepower = 1 move_rate = 2 vision_radius_sq = 4 +convert_to = "Musketeers" +convert_time = 2 transport_cap = 0 fuel = 0 +city_size = 826 ; 000000,000,011,001110,1,0 = atk_bonus=0, max_kills=0, targets=3, move_cost=14 frags, stay_fortfy=1, reserved = 0 +paratroopers_mr_sub = 4096 ; 00010,00,0000,000,0,0 - bbd_retal_rate=2, iPill_rand_tgts=0, iPill_odds=0, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 +;NOTE:iPillage changes in rules require client_rules_flag and get_what_can_unit_pillage_from() changes. uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only disembarks = "LandRoad", "LandRail", "Helicopter" -flags = "FootSoldier", "Capturer", "CantReachAir", "Bombarder", "Settlers", "CanHide", "MultiSlot", "Shield2Gold", "WillNever" +flags = "FootSoldier", "Capturer", "CantReachAir", "Bombarder", "Settlers", "CanHide", + "MultiSlot", "Shield2Gold", "WillNever" roles = "DefendOk", "DefendOkStartUnit" helptext = _("\ Archers fight with bows and arrows. They have good offense and decent defense.\ - Rather than fight to the death, Archers can also do a Ranged Attack with no risk\ - of retaliatory damage: a single volley of arrows is fired over all enemy units on the tile,\ - causing 1hp of damage to any units who are hit. This is useful for softening\ - enemies prior to battle, or for deterring an approach to a strategic location.\ - (Ranged Attack is not possible on Cities or Fortresses.)\ + Rather than fight to the death, Archers can also do a ranged Volley Attack which\ + avoids hand-to-hand retaliation:two volleys of arrows are fired on up to 3 enemy units on the tile,\ + causing 1-2hp of damage to any units who are hit. This includes Oceanic tiles if not\ + transported. This is useful for softening enemies prior to battle, or for deterring an\ + approach to a strategic location. (Volley Attack is not possible on Cities or Fortresses.)\ + Archers can do a retaliatory Volley attack against any unit which does a Special Unit Attack\ + on them. \n\ + With the discovery of Conscription, Archers can convert to Musketeers in any domestic city. \ +"), _("\ +\nThe discovery of Banking changes upkeep from shields to gold.\ ") -bombard_rate = 1 +bombard_rate = 2 [unit_legion] @@ -1045,7 +1245,7 @@ sound_move = "m_legion" sound_move_alt = "m_generic" sound_fight = "f_legion" sound_fight_alt = "f_generic" -build_cost = 40 +build_cost = 32 pop_cost = 0 attack = 4 defense = 2 @@ -1053,8 +1253,11 @@ hitpoints = 10 firepower = 1 move_rate = 2 vision_radius_sq = 4 +convert_to = "Musketeers" +convert_time = 2 transport_cap = 0 fuel = 0 +city_size = 70180 ; 000100,010,010,001001,00 = atk +4*25=+100% (2×), max_kills=2, targets=2, move_cost=9 frags, stay_fortfy=0, reserved = 0 uk_happy = 1 uk_shield = 1 uk_food = 0 @@ -1062,27 +1265,35 @@ uk_gold = 0 embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only disembarks = "LandRoad", "LandRail", "Helicopter" flags = "FootSoldier", "Settlers", "CanHide", "Infra", "CanRoad", "CanFortress", "Capturer", - "CantReachAir", "MultiSlot", "Shield2Gold", "WillNever" + "CantReachAir", "MultiSlot", "Shield2Gold", "WillNever", "Bombarder" roles = "DefendOk", "DefendOkStartUnit", "BarbarianBuild", "BarbarianSea" helptext = _("\ Legions are heavily armed well disciplined soldiers with excellent offensive strength.\ - They are famous and feared for their engineering abilities: with the required\ + They are famous for their engineering abilities:with the required\ technology they can build Forts and Fortresses. They can build Roads outside domestic\ - national territory and inside Forts and Fortresses.\ + national territory and inside Forts and Fortresses. \n\ +Legions are feared for how they start battle:a Pilum Assault targets the\ + shields of the enemy. A pilum stuck in a shield renders it useless, leaving\ + the front line vulnerable to a full-on charge. The Pilum Assault does 1 round\ + of combat at 2× attack bonus on up to 2 units on the tile. \n\ + With the discovery of Conscription, Legions can convert to Musketeers in any domestic city. \ +"), _("\ +\nThe discovery of Banking changes upkeep from shields to gold.\ ") +bombard_rate = 1; [unit_pikemen] name = _("Pikemen") class = "Land" tech_req = "Feudalism" obsolete_by = "Musketeers" -graphic = "u.pikemen" +graphic = "u.pikemen_o" graphic_alt = "-" sound_move = "m_pikemen" sound_move_alt = "m_generic" sound_fight = "f_pikemen" sound_fight_alt = "f_generic" -build_cost = 20 +build_cost = 18 pop_cost = 0 attack = 1 defense = 2 @@ -1090,6 +1301,8 @@ hitpoints = 10 firepower = 1 move_rate = 2 vision_radius_sq = 4 +convert_to = "Musketeers" +convert_time = 2 transport_cap = 0 fuel = 0 uk_happy = 1 @@ -1105,9 +1318,12 @@ bonuses = flags = "FootSoldier", "CantReachAir", "Settlers", "CanHide", "MultiSlot", "Shield2Gold", "WillNever" roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild" helptext = _("\ -Equipped with long pikes and a 2× defence bonus against\ - mounted units, Pikemen replace the Phalanx as the\ - preferred city defender.\ +Long sharp pikes give Pikemen a counter to the height and mobility of mounted\ + units. They enjoy a 2× defense bonus against mounted units. Pikemen replace\ + the Phalanx as the preferred city defender. \n\ + With the discovery of Conscription, Pikemen can convert to Musketeers in any domestic city. \ +"), _("\ +\nThe discovery of Banking changes upkeep from shields to gold.\ ") [unit_musketeers] @@ -1129,6 +1345,7 @@ hitpoints = 20 firepower = 1 move_rate = 2 vision_radius_sq = 4 +convert_to = "Riflemen" transport_cap = 0 fuel = 0 uk_happy = 1 @@ -1142,24 +1359,92 @@ flags = "FootSoldier", "Capturer", "CantReachAir", "Settlers", "CanHide" roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild", "BarbarianTech", "BarbarianBuildTech", "BarbarianSeaTech" helptext = _("\ -Musketeers are infantry equipped with early\ - firearms and replace Pikemen as the preferred\ - city defender, and replace Archers and Legions\ - for offensive foot soldiers.\ +Musketeers are infantry equipped with early firearms. They replace Pikemen as the preferred\ + city defender, and replace Archers and Legions for offensive foot soldiers.\ + The discovery of Labor Union allows upgrading Musketeers to Riflemen for free\ + in any domestic city. \ +"), _("\ +\nThe discovery of Banking changes upkeep from shields to gold.\ +") + +[unit_falconeers] +name = _("Falconeers") +class = "Land" +tech_req = "Theocracy" +gov_req = "Theocracy" +obsolete_by = "Zealots" +graphic = "u.falconeers" +sound_move = "m_musketeers" +sound_move_alt = "m_generic" +sound_fight = "f_falconeers" +sound_fight_alt = "f_musketeers" +build_cost = 20 +pop_cost = 0 +attack = 1 +defense = 1 +hitpoints = 20 +firepower = 20 +move_rate = 2 +vision_radius_sq = 4 +transport_cap = 0 +fuel = 0 +uk_happy = 2 +uk_shield = 1 +uk_food = 0 +uk_gold = 0 +embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only +disembarks = "LandRoad", "LandRail", "Helicopter" +targets = "LandRail" +bonuses = + { "flag", "type", "value" + ;The values below would be what we use if we went with normal veterancy levels. + ;"WillNever", "DefenseDividerPct", -90 ;The way to change general attack score on everyone without using integer attack score. + ;"WillNever", "DefenseMultiplierPct", -98 ;The way to change general defense score on everyone without using integer defense score. + ;However, the value below is with using the custom veterancy level. For 20FP unit, a D 20% of A emulates emulates a D 2/3 of A. + ;********* requires hard-coding fix to packhand.js:handle_non_integer_combat_scores() if changed:****************************** + "WillNever", "DefenseMultiplierPct", -50 ;The way to change general defense score on everyone without using integer defense score. + } +flags = "FootSoldier", "Capturer", "CantReachAir", "Settlers", "CanHide", "MultiSlot", "WillNever", "Shield2Gold" +roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:Hand of God") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 10, 15, 18, 20, 21, 22, 23 +veteran_move_bonus = 0, 0, 0, 0, 1, 2, 3 +helptext = _("\ +Falconeers are Theocratic holy warriors armed with Falconets—the\ + largest hand cannons humans can carry, it proves whose side God is\ + on. Ottoman Janissaries, Reconquistadores, Persian Safavid, and Indian\ + Mughal used them in holy wars. \n\ +Falconets are huge and heavy. They have woeful accuracy but lethal\ + firepower:they either kill or totally miss. On paper, attack odds\ + are closest to a Musketeer (A3). Yet there is a high chance of losing\ + when you expect to win, or winning when you expect to lose. The outcome\ + is in God's hands! Falconeers defend a bit worse than they attack. \n\ +Righteous faith is needed to fight with slow heavy inaccurate weaponry:\ + only Theocracies can train Falconeers. Other governments will incur\ + high upkeep or see them retire.\ ") -[unit_fanatics] -name = _("Fanatics") +[unit_zealots] +name = _("Zealots") class = "Land" -tech_req = "Fundamentalism" -gov_req = "Fundamentalism" +tech_req = "Conscription" +gov_req = "Theocracy" obsolete_by = "None" -graphic = "u.fanatics" -graphic_alt = "-" +graphic = "u.zealots" +graphic_alt = "u.fanatics" sound_move = "m_fanatics" sound_move_alt = "m_generic" -sound_fight = "f_fanatics" -sound_fight_alt = "f_generic" +sound_fight = "f_zealots" +sound_fight_alt = "f_riflemen" build_cost = 20 pop_cost = 0 attack = 4 @@ -1170,31 +1455,33 @@ move_rate = 2 vision_radius_sq = 4 transport_cap = 0 fuel = 0 +city_size = 1080; 000000,0,100,001110,0,0 = atk_bonus=0, max_kills=0, targets=4, move_cost=14 frags, sty_frtfy=0, reserved = 0 uk_happy = 2 -uk_shield = 2 +uk_shield = 1 uk_food = 0 uk_gold = 0 embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only disembarks = "LandRoad", "LandRail", "Helicopter" targets = "Balloon", "Helicopter", "LandRail" -flags = "Fanatic", "FootSoldier", "Capturer", "CantReachAir", "Unbribable", "Bombarder", - "Settlers", "CanHide", "MultiSlot", "Shield2Gold", "WillNever" -roles = "DefendGood", "DefendGoodStartUnit" +flags = "MultiSlot", "Shield2Gold", "Fanatic", "FootSoldier", "Capturer", + "CantReachAir", "Unbribable", "Bombarder", + "Settlers", "CanHide", "WillNever" +roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild" helptext = _("\ -Fanatics are warriors devoted to a higher cause. Their faith\ - is strong and they cannot be bribed.\ +Zealots are warriors devoted to a higher cause. Their faith\ + is strong and they cannot be bribed. \ "), _("\ -Fundamentalist nations can maintain Fanatics without paying\ - their steep upkeep. (Fanatics are unhappy if not under Fundamentalism,\ - requiring high upkeep to stay content.) Fanatics\ +Theocratic nations can maintain Zealots without paying\ + their steep upkeep. (Zealots are unhappy if not under Theocracy,\ + requiring high upkeep to stay content.) Zealots\ produced in a city with Ecclesiastical Palace are inspired by\ - fervorous faith to +1 higher veteran level.\ + fervorous faith to +1 higher veteran level. \ "), _("\ -Fanatics zealously defend their homeland, and can do surprise skirmish\ - assaults to snipe and injure foreign occupants: Each invader\ - on the tile will endure three combat rounds without defense.\ -"), _("\ -\nThe discovery of Labor Union changes upkeep from shields to gold.\ +Zealots fervently defend their homeland, and can do surprise skirmish\ + assaults to snipe and injure foreign occupants:Up to 4 invaders\ + on the tile will endure three combat rounds without defense. Skirmish\ + assaults can also be done to foreign occupied cities if they have\ + a remaining Foreign National population.\ ") bombard_rate = 3 @@ -1207,9 +1494,9 @@ graphic = "u.partisan" graphic_alt = "-" sound_move = "m_partisan" sound_move_alt = "m_generic" -sound_fight = "f_partisan" +sound_fight = "f_riflemen" sound_fight_alt = "f_generic" -build_cost = 50 +build_cost = 45 pop_cost = 0 attack = 4 defense = 4 @@ -1226,44 +1513,48 @@ uk_gold = 0 embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only disembarks = "LandRoad", "LandRail", "Helicopter" targets = "Balloon", "Helicopter", "LandRail" -flags = "MultiSlot", "IgTer", "IgZOC", "NoHome", "FootSoldier", "Capturer", "CantReachAir", - "Shield2Gold", "Settlers", "CanHide", "WillNever" -;yes Partisan has 0 upkeep so Shield2Gold is meaningless, but currently used to substitute MultiSlot inaccessible in c-server +flags = "MultiSlot", "Shield2Gold", "IgTer", "IgZOC", "NoHome", "FootSoldier", "Capturer", "CantReachAir", + "Settlers", "CanHide", "WillNever" roles = "DefendGood", "DefendGoodStartUnit", "Partisan", "BarbarianTech" helptext = _("\ -Partisans are guerilla fighters who can use the terrain to their advantage. Like the Explorer\ - that they upgrade, they can slip through ZOC and live off the land with no upkeep.\ +Partisans are guerilla fighters who can use the terrain to their advantage. Like the Explorer\ + that they upgrade, they can slip through ZOC and live off the land with no upkeep. \ "), _("\ Proportional to city size, up to 8 Partisans appear when an enemy conquers your city. They\ randomly fortify on any tile inside the circle defined by its workable radius. Partisans\ prefer defensive tiles, and ignore tile nationality. They spawn only when:\n\ - ➣ Guerilla Warfare is known by any player.\n\ - ➣ The city was originally built by you.\n\ - ➣ You know Communism and Gunpowder.\n\ - ➣ You must be Democracy or Communist.\ + ➣ Guerilla Warfare is known by any player. \n\ + ➣ The city was originally built by you. \n\ + ➣ You must be Theocracy, OR,\n\ + ➣ You must be Democracy or Communist, AND know Communism AND Gunpowder.\ ") -[unit_alpine_troops] -name = _("Alpine Troops") +[unit_riflemen] +name = _("Riflemen") class = "Land" -tech_req = "Tactics" +tech_req = "Conscription" obsolete_by = "None" -graphic = "u.alpine_troops" +graphic = "u.riflemen" graphic_alt = "-" -sound_move = "m_alpine_troops" +sound_move = "m_riflemen" sound_move_alt = "m_generic" -sound_fight = "f_alpine_troops" +sound_fight = "f_riflemen" sound_fight_alt = "f_generic" -build_cost = 50 +build_cost = 40 pop_cost = 0 attack = 5 -defense = 5 +defense = 4 hitpoints = 20 firepower = 1 move_rate = 2 vision_radius_sq = 4 +convert_to = "Workers" +convert_time = 2 transport_cap = 0 fuel = 0 +city_size = 2; ...xxxxx..., 1, 0 use bombard_stay_fortified on a non-bombard unit to specify can remain fortified when attacking. +paratroopers_mr_sub = 0 ;00,0000,000,0,0 iPill_rand_tgts=0, iPill_odds=-0 pentads, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 +;NOTE:iPillage changes in rules require client_rules_flag and get_what_can_unit_pillage_from() changes. uk_happy = 1 uk_shield = 1 uk_food = 0 @@ -1271,37 +1562,37 @@ uk_gold = 0 embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only disembarks = "LandRoad", "LandRail", "Helicopter" targets = "Balloon", "Helicopter", "LandRail" -flags = "MultiSlot", "IgTer", "FootSoldier", "Capturer", "CantReachAir", "Shield2Gold", "Settlers", "CanHide", "WillNever" -roles = "DefendGood", "DefendGoodStartUnit" +flags = "MultiSlot", "Shield2Gold", "FootSoldier", "Capturer", "CantReachAir", "Settlers", "CanHide", "WillNever" +roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild" helptext = _("\ -Alpine Troops are highly mobile units and\ - excellent defenders. Similar to an Explorer, they\ - treat every land tile like a road were on it.\ +Riflemen are World War-era infantry. They are good at defending cities and\ + strategic Fortresses. They also have good attack capability. \ +"), _("\ +Under Communism this unit costs 5 less. Also, Communism tech allows Communist\ + governments to de-commission Riflemen into Workers via the Convert order. And vice versa. \ "), _("\ -\nThe discovery of Labor Union changes upkeep from shields to gold.\ +\nThe discovery of Banking changes upkeep from shields to gold.\ ") -[unit_riflemen] -name = _("Riflemen") +[unit_alpine_troops] +name = _("Alpine Troops") class = "Land" -tech_req = "Conscription" +tech_req = "Tactics" obsolete_by = "None" -graphic = "u.riflemen" +graphic = "u.alpine_troops" graphic_alt = "-" -sound_move = "m_riflemen" +sound_move = "m_alpine_troops" sound_move_alt = "m_generic" -sound_fight = "f_riflemen" +sound_fight = "f_alpine_troops" sound_fight_alt = "f_generic" -build_cost = 40 +build_cost = 50 pop_cost = 0 attack = 5 -defense = 4 +defense = 5 hitpoints = 20 firepower = 1 move_rate = 2 vision_radius_sq = 4 -convert_to = "Workers" -convert_time = 2 transport_cap = 0 fuel = 0 uk_happy = 1 @@ -1311,16 +1602,15 @@ uk_gold = 0 embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only disembarks = "LandRoad", "LandRail", "Helicopter" targets = "Balloon", "Helicopter", "LandRail" -flags = "MultiSlot", "FootSoldier", "Capturer", "CantReachAir", "Shield2Gold", "Settlers", "CanHide", "WillNever" -roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild" +flags = "MultiSlot", "Shield2Gold", "IgTer", "FootSoldier", "Capturer", + "CantReachAir", "Settlers", "CanHide", "WillNever" +roles = "DefendGood", "DefendGoodStartUnit" helptext = _("\ -Riflemen are World War-era infantry. They are good at defending cities and\ - strategic Fortresses. They also have good attack capability.\ -"), _("\ -Under Communism this unit costs 5 less. Also, Communism tech allows Communist\ - governments to de-commission Riflemen into Workers via the Convert order. And vice versa.\ +Alpine Troops are highly mobile units and\ + excellent defenders. Similar to an Explorer, they\ + treat every land tile like a road were on it. \ "), _("\ -\nThe discovery of Labor Union changes upkeep from shields to gold.\ +\nThe discovery of Banking changes upkeep from shields to gold.\ ") [unit_marines] @@ -1334,7 +1624,7 @@ sound_move = "m_marines" sound_move_alt = "m_generic" sound_fight = "f_marines" sound_fight_alt = "f_generic" -build_cost = 60 +build_cost = 55 pop_cost = 0 attack = 8 defense = 5 @@ -1344,15 +1634,19 @@ move_rate = 2 vision_radius_sq = 8 ; hard-coded the +4 extra for effect_physics_vision since it is a pre-req anyway transport_cap = 0 fuel = 0 +city_size = 2618 ; 000000,001,010,001110,1,0 = atk_bonus=0, max_kills=1, targets=2, move_cost=14 frags, stay_frtfy=1, reserved = 0 +paratroopers_mr_sub = 1 ;00,0000,000,0,1 iPill_rand_tgts=0, iPill_odds=-0 pentads, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=1 +;NOTE:iPillage changes in rules require client_rules_flag and get_what_can_unit_pillage_from() changes. uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 embarks = "Helicopter", "Land", "Sea", "LandRoad", "LandRail" disembarks = "Helicopter", "Land", "Sea", "LandRoad", "LandRail" -targets = "Sea", "Balloon", "Helicopter", "LandRail" -flags = "MultiSlot", "Marines", "FootSoldier", "BeachLander", "Capturer", - "NeverBlocked", "Shield2Gold", "Settlers", "CanHide", "WillNever" +targets = "Sea", "Balloon", "Helicopter", "LandRail", "Zeppelin" +flags = "MultiSlot", "Shield2Gold", "Marines", "FootSoldier", "BeachLander", "Capturer", + "NeverBlocked", "Settlers", "CanHide", "WillNever", + "Airbase", "CanFortress", "Bombarder"; can Fort only, actually. veteran_names = _("?vet_rank:green"), _("?vet_rank:veteran"), @@ -1364,21 +1658,27 @@ veteran_names = veteran_base_raise_chance = 60, 50, 40, 30, 20, 15, 0 veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 veteran_power_fact = 100, 150, 175, 250, 300, 350, 400 -veteran_move_bonus = 0, 0, 0, 1, 1, 1, 1 +veteran_move_bonus = 0, 2, 4, 6, 8, 10, 12 roles = "DefendOk", "DefendOkStartUnit", "BarbarianSeaTech" helptext = _("\ Marines are experts at all-terrain warfare. They are the strongest\ - foot unit in the game, and are armed with diverse weaponry.\n\ + foot unit in the game, and are armed with diverse weaponry. \n\ Unlike other units, Marines can attack Sea units (at a 50% penalty).\ Air units do not stop them from attacking reachable targets.\ + They can attack while fortified and maintain fortified status.\ They can attack from a Transport or Helicopter, and can offload\ - without losing a turn of movement. Marines promoted to three\ - veteran levels become commandos suitable for special ops.\n\ + without losing a turn of movement. Marines can also makes Forts\ + and Airbases. Marines get an extra 2/9 movement points for each\ + veteran level they possess. Starting at v2, they gain the ability\ + to do Bazooka ranged attacks for 3 combat rounds, hitting up to 2\ + units on the tile and killing a maximum of 1. Bazooka attacks can\ + be done to Oceanic tiles if the Marines are not transported. \n\ Marines built in a city with an Airport, Port Facility, and Barracks III\ - receive the second veteran level (hardened.)\ + receive an extra veteran level. \ "), _("\ -\nThe discovery of Labor Union changes upkeep from shields to gold.\ +\nThe discovery of Banking changes upkeep from shields to gold.\ ") +bombard_rate = 3 [unit_paratroopers] name = _("Paratroopers") @@ -1391,10 +1691,10 @@ sound_move = "m_paratroopers" sound_move_alt = "m_generic" sound_fight = "f_paratroopers" sound_fight_alt = "f_generic" -build_cost = 60 +build_cost = 55 pop_cost = 0 -attack = 6 -defense = 4 +attack = 7 +defense = 5 hitpoints = 20 firepower = 1 move_rate = 2 @@ -1407,20 +1707,20 @@ uk_food = 0 uk_gold = 0 embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only disembarks = "LandRoad", "LandRail", "Helicopter" -targets = "Balloon", "Helicopter", "LandRail" +targets = "Balloon", "Helicopter", "LandRail", "Zeppelin" flags = "Paratroopers", "FootSoldier", "Capturer", "CantReachAir", "Provoking", - "Shield2Gold", "MultiSlot", "Settlers", "CanHide", "WillNever" + "MultiSlot", "Shield2Gold", "Settlers", "CanHide", "WillNever" roles = "DefendOk", "DefendOkStartUnit" helptext = _("\ Paratroopers are experts at airborne attacks.\ - From a friendly city or airbase, Paratroopers who have not used any\ - move points can paradrop directly to any tile in range, and be\ - immediately ready to act there. Beware dropping into unseen territory,\ + From a friendly city or airbase, Paratroopers who have moves left and\ + have not already paradropped in the current turn, can paradrop directly\ + to any tile in range, and be immediately ready to act there. Beware dropping into unseen territory,\ as Paratroopers landing on a tile occupied by enemy units will be lost.\ - Also note: Paradropping is assumed to be done from aircraft. Therefore,\ - Fighters on Vigil may auto-attack the tile you land on, if adjacent.\ + Also note:Paradropping is assumed to be done from aircraft. Therefore,\ + Fighters on Vigil may auto-attack the tile you land on, if adjacent. \ "), _("\ -\nThe discovery of Labor Union changes upkeep from shields to gold.\ +\nThe discovery of Banking changes upkeep from shields to gold.\ ") paratroopers_range = 14 paratroopers_mr_req = 1 @@ -1449,17 +1749,17 @@ vision_radius_sq = 4 transport_cap = 0 fuel = 0 uk_happy = 1 -uk_shield = 0 +uk_shield = 1 uk_food = 0 -uk_gold = 1 +uk_gold = 0 embarks = "Helicopter" ; transport helicopter only ;disembarks = "Helicopter" -targets = "Balloon", "Helicopter", "LandRail" -flags = "CantReachAir", "Shield2Gold", "MultiSlot", "WillNever" +targets = "Balloon", "Helicopter", "LandRail", "Zeppelin" +flags = "CantReachAir", "MultiSlot", "Shield2Gold", "WillNever" roles = "DefendGood", "DefendGoodStartUnit" helptext = _("\ Mechanized Infantry have the strongest general defense strength of any land unit.\ - They have decent attack strength in open field engagements, and excellent mobility.\ + They have decent attack strength in open field engagements, and excellent mobility. \ "), _("\ \nUpkeep for Mechanized infantry is paid in gold instead of shields.\ ") @@ -1475,7 +1775,7 @@ sound_move = "m_horsemen" sound_move_alt = "m_generic" sound_fight = "f_horsemen" sound_fight_alt = "f_generic" -build_cost = 20 +build_cost = 18 pop_cost = 0 attack = 2 defense = 1 @@ -1507,7 +1807,7 @@ sound_move = "m_chariot" sound_move_alt = "m_generic" sound_fight = "f_chariot" sound_fight_alt = "f_generic" -build_cost = 30 +build_cost = 27 pop_cost = 0 attack = 3 defense = 1 @@ -1538,7 +1838,7 @@ sound_move = "m_elephants" sound_move_alt = "m_generic" sound_fight = "f_elephants" sound_fight_alt = "f_generic" -build_cost = 40 +build_cost = 36 pop_cost = 0 attack = 4 defense = 1 @@ -1571,7 +1871,7 @@ sound_move = "m_crusaders" sound_move_alt = "m_generic" sound_fight = "f_crusaders" sound_fight_alt = "f_generic" -build_cost = 40 +build_cost = 38 pop_cost = 0 attack = 5 defense = 1 @@ -1604,7 +1904,7 @@ sound_move = "m_knights" sound_move_alt = "m_generic" sound_fight = "f_knights" sound_fight_alt = "f_generic" -build_cost = 40 +build_cost = 38 pop_cost = 0 attack = 4 defense = 1 @@ -1629,7 +1929,8 @@ roles = "AttackFastStartUnit", "BarbarianTech", helptext = _("\ Knights are heavily armored mounted warriors. They defend at D:3 against mounted units.\ They defend at D:2 against foot units. They defend at D:1 against everything else.\ - Their noble status allows them to attack cities without population reduction.\ + Their noble status allows them to attack cities without population reduction, and\ + conquer a size 1 city without destroying it.\ ") [unit_dragoons] @@ -1714,7 +2015,7 @@ graphic_alt = "-" sound_move = "m_armor" sound_move_alt = "m_generic" sound_fight = "f_armor" -sound_fight_alt = "f_generic" +sound_fight_alt = "Blitz Sack" build_cost = 80 pop_cost = 0 attack = 10 @@ -1725,19 +2026,21 @@ move_rate = 6 vision_radius_sq = 4 transport_cap = 0 fuel = 0 +paratroopers_mr_sub = 170 ;00,0101,010,1,0 iPill_rand_tgts=0, iPill_odds=-5 pentads=75%, iPill_moves=2, iPillage=1, ATK_Stay_Fortified=0 +;NOTE:iPillage changes in rules require client_rules_flag and get_what_can_unit_pillage_from() changes. uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 embarks = "Helicopter" ; transport helicopter only ;disembarks = "Helicopter" -targets = "Balloon", "Helicopter", "LandRail" +targets = "Balloon", "Helicopter", "LandRail", "Zeppelin" flags = "CantReachAir", "FortBuster", "WillNever" roles = "AttackFastStartUnit", "Hunter" helptext = _("\ Armor is the mechanized equivalent of a Cavalry unit. They have high attack strength,\ superb mobility, and the highest defense of any offensive unit. They are massive all-terrain\ - vehicles, well-suited for penetrating defensive fortifications: Units inside Forts get no defense\ + vehicles, well-suited for penetrating defensive fortifications:Units inside Forts get no defense\ bonus against Armor. Units inside Fortresses get a reduced bonus of 1.67× instead of 2×.\ ") @@ -1747,12 +2050,12 @@ class = "Land" tech_req = "Plastics" obsolete_by = "None" graphic = "u.armor_ii" -graphic_alt = "u.armor" +graphic_alt = "-" sound_move = "m_armor_ii" sound_move_alt = "m_armor" sound_fight = "f_armor_ii" -sound_fight_alt = "f_armor" -build_cost = 80 +sound_fight_alt = "Blitz Sack" +build_cost = 85 pop_cost = 0 attack = 16 defense = 6 @@ -1762,13 +2065,15 @@ move_rate = 6 vision_radius_sq = 4 transport_cap = 0 fuel = 0 +paratroopers_mr_sub = 170 ;00,0101,010,1,0 iPill_rand_tgts=0, iPill_odds=-5 pentads=80%, iPill_moves=2, iPillage=1, ATK_Stay_Fortified=0 +;NOTE:iPillage changes in rules require client_rules_flag and get_what_can_unit_pillage_from() changes. uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 embarks = "Helicopter" ; transport helicopter only ;disembarks = "Helicopter" -targets = "Balloon", "Helicopter", "LandRail" +targets = "Balloon", "Helicopter", "LandRail", "Zeppelin" bonuses = { "flag", "type", "value" "Missile", "DefenseMultiplier", 1 @@ -1794,7 +2099,7 @@ sound_move = "m_catapult" sound_move_alt = "m_generic" sound_fight = "f_catapult" sound_fight_alt = "f_generic" -build_cost = 40 +build_cost = 34 pop_cost = 0 attack = 6 defense = 1 @@ -1804,6 +2109,8 @@ move_rate = 2 vision_radius_sq = 4 transport_cap = 0 fuel = 0 +city_size = 2304 ; 000000,001,001,000000,00 = atk_bonus=0, max_kills=1, targets=1, move_cost=0 frags, stay_fortfy=0, reserved = 0 +paratroopers_mr_sub = 8192 ; 00100,00,0000,000,0,0 - bbd_retal_rate=4, iPill_rand_tgts=0, iPill_odds=0, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 uk_happy = 1 uk_shield = 1 uk_food = 0 @@ -1811,10 +2118,64 @@ uk_gold = 0 flags = "CantReachAir", "WillNever" roles = "" helptext = _("\ -Catapults are war machines that hurl massive rocks to crush\ - and break their targets. They are strong attackers but equally\ - weak defenders, and will need an escort to be effective.\ +Catapults are large rock-throwing war machines.\ + The ballistic delivery of massive\ + stones diminishes the defense bonus vs. land attacks by Fortifications and\ + City Walls by -25%, yielding a 1.25× and 2.75× bonus, respectively. \n\ +"), _(" +Catapults are weak defenders, and will need an escort to be effective.\ + Even so, it is better to rush attack them than do special unit attacks\ + from range: when attacked from range or rammed in a Fortress, Catapults\ + can retaliate for 4 rounds of combat.\ +") + +[unit_siege_ram] +name = _("Siege Ram") +class = "LandRoad" +tech_req = "Construction" +obsolete_by = "Cannon" +graphic = "u.siege_ram" +graphic_alt = "-" +sound_move = "m_catapult" +sound_move_alt = "m_generic" +sound_fight = "f_catapult" +sound_fight_alt = "f_generic" +build_cost = 45 +pop_cost = 0 +attack = 2 +defense = 1 +hitpoints = 10 +firepower = 1 +move_rate = 2 +vision_radius_sq = 4 +transport_cap = 1 +fuel = 0 +city_size = 507960 ; 011111,000,000,001110,00 = atk_bonus=8.75x, max_kills=0, targets=all, move_cost=14 frags, stay_fortfy=0, reserved = 0 +uk_happy = 1 +uk_shield = 1 +uk_food = 0 +uk_gold = 0 +cargo = "Land" +flags = "CantReachAir", "WillNever", "Diplomat", "Spy", "Bombarder" +roles = "" +helptext = _("\ +Siege Rams launch a tremendous thrusting force through\ + iron-capped timber shafts. They can break through City\ + Walls if they are not killed first. City Walls have counter\ + defenses, giving Siege Rams even odds of success. Wall\ + defense in capitals is twice as stiff—cutting odds to 25%. \n\ +Siege Rams may also ram Fortresses, doing up to 4hp of damage\ + on each occupant. This emulates damage to the Fortress defense\ + bonus, which is partly or fully repaired/recovered next turn. \n\ +Siege Rams can only travel by road. They can carry 1 Land\ + unit as cargo:their slow pace means this serves more for\ + disguise or defense. \n\ +Siege Rams need an escort for protection. They need a minimum of\ + 1 move point to attack a Fortress or City Walls.\ + Cities protected by the Great Wall are immune to Siege Rams. \n\ + The discovery of Metallurgy by any nation incapacitates Siege Rams.\ ") +bombard_rate = 4 [unit_cannon] name = _("Cannon") @@ -1837,6 +2198,8 @@ move_rate = 2 vision_radius_sq = 4 transport_cap = 0 fuel = 0 +city_size = 2560 ; 000000,001,010,000000,00 = atk_bonus=0, max_kills=1, targets=2, move_cost=0 frags, stay_fortfy=0, reserved = 0 +paratroopers_mr_sub = 10240 ; 00101,00,0000,000,0,0 - bbd_retal_rate=5, iPill_rand_tgts=0, iPill_odds=0, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 uk_happy = 1 uk_shield = 1 uk_food = 0 @@ -1847,8 +2210,16 @@ targets = "LandRail" flags = "CantReachAir", "WillNever" roles = "BarbarianTech", "BarbarianBuildTech" helptext = _("\ -Cannons are huge guns that fire heavy metallic projectiles. They are strong\ - attackers but weak defenders, so they need an escort to be effective.\ +Cannons are huge guns that use gunpowder to fire massive metallic projectiles\ + much faster and more accurately than earlier ballistic weapons. The\ + aerial delivery of high speed massive metal gives an edge against\ + Fortifications and City Walls. The defense bonuses vs. land attacks from those\ + are reduced by -50%. This leaves Fortifications only with their terrain bonus,\ + and reduces City walls to 2.5x. \n\ +"), _(" +While Cannons are strong attackers, they are also weak defenders. Yet\ + they are not without defensive purpose. They can retaliate 5 rounds\ + of bombardment against special unit attacks from other units.\ ") [unit_artillery] @@ -1872,18 +2243,27 @@ move_rate = 2 vision_radius_sq = 4 transport_cap = 0 fuel = 0 +city_size = 2816 ; 000000,001,011,000000,00 = atk_bonus=0, max_kills=1, targets=3, move_cost=0 frags, stay_fortfy=0, reserved = 0 +paratroopers_mr_sub = 12288 ; 00110,00,0000,000,0,0 - bbd_retal_rate=6, iPill_rand_tgts=0, iPill_odds=0, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 embarks = "Helicopter" ; transport helicopter only disembarks = "Helicopter" -targets = "Balloon", "LandRail" +targets = "Balloon", "LandRail", "Zeppelin" flags = "CantReachAir", "WillNever" roles = "" helptext = _("\ -Artillery are a major upgrade to Cannons, with doubled firepower. They are\ - superb attackers but poor at defense. They need an escort to be effective.\ +Artillery are a major upgrade to Cannons, with doubled firepower. Accuracy\ + and projectile speed go to a whole new level. Thus, they have an\ + even greater bonus than their predecessors against Fortifications\ + and City Walls. Such bonuses are reduced -75%. This leaves Fortifications\ + only with their terrain bonus, and reduces the bonus from Walls down to 2.25x. \n\ +"), _(" +Like their predecessors, Artillery are poor at defense, and need an\ + escort to be effective. However, they can retaliate 6 rounds of bombardment\ + against special unit attacks from other units.\ ") [unit_anti_aircraft] @@ -1892,7 +2272,7 @@ class = "LandAirSea" tech_req = "Flight" obsolete_by = "None" graphic = "u.anti_aircraft" -graphic_alt = "u.howitzer" +graphic_alt = "-" sound_move = "m_anti_aircraft" sound_move_alt = "m_generic" sound_fight = "f_anti_aircraft" @@ -1915,7 +2295,7 @@ uk_food = 0 uk_gold = 0 embarks = "LandRoad", "Helicopter" disembarks = "LandRoad", "Helicopter" -targets = "Air", "AirProtect", "Sea", "Balloon", "Helicopter", "LandRail" +targets = "Air", "AirProtect", "Sea", "Balloon", "Helicopter", "LandRail", "Zeppelin" bonuses = { "flag", "type", "value" "AirAttacker", "DefenseDivider", 1 @@ -1926,13 +2306,13 @@ roles = "" helptext = _("\ Anti-Aircraft Artillery (AAA) can attack almost anything from anywhere. AAA get a\ 2× bonus against Air units. AAA qualify as weaponry for Marines and have the same\ - abilities: they can be transported on any unit that carries Marines, can attack from\ + abilities:they can be transported on any unit that carries Marines, can attack from\ or to non-native tiles, and do not lose a turn when unloading. Transported AAA can\ - defend their tile on both Land and Sea. (AAA cannot attack Submarines, Missiles,\ + defend their tile on both Land and Sea. (AAA can’t attack Submarines, Missiles,\ or Jet Bombers.)\ "), _(" After Space Flight and 10 turns of service, AAA can be retrofitted to\ - Mobile SAM. The Convert order must be done in your capital, and takes 4 turns.\ + Mobile SAM. The Convert order must be done in a capital, and takes 4 turns.\ ") [unit_mobile_sam] @@ -1941,7 +2321,7 @@ class = "Land" tech_req = "Space Flight" obsolete_by = "None" graphic = "u.mobile_sam" -graphic_alt = "u.howitzer" +graphic_alt = "-" sound_move = "m_howitzer" sound_move_alt = "m_generic" sound_fight = "f_mobile_sam" @@ -1962,7 +2342,7 @@ uk_food = 0 uk_gold = 0 embarks = "Helicopter" ; transport helicopter only disembarks = "Helicopter" -targets = "Air", "AirProtect", "AirPillage", "Balloon", "Helicopter", "LandRail" +targets = "Air", "AirProtect", "Air_High_Altitude", "Balloon", "Helicopter", "LandRail", "Zeppelin" cargo = "Missile" bonuses = { "flag", "type", "value" @@ -1975,7 +2355,7 @@ helptext = _("\ The Mobile SAM is the strongest Anti-Air unit on the ground. It can\ attack nearby aircraft. It has a 2× bonus against all Air units. The\ Mobile SAM can also carry one Missile of any type. Unlike the AAA, it\ - cannot attack non-native tiles or attack while transported.\ + can’t attack non-native tiles or attack while transported.\ "), _(" AAA can upgrade to Mobile SAM for free on its 10th turn of service.\ The Convert order must be done in the capital city and takes 4 turns.\ @@ -1987,7 +2367,7 @@ class = "Land" tech_req = "Robotics" obsolete_by = "None" graphic = "u.howitzer_o" -graphic_alt = "u.howitzer" +graphic_alt = "-" sound_move = "m_howitzer" sound_move_alt = "m_generic" sound_fight = "f_howitzer" @@ -2002,26 +2382,33 @@ move_rate = 4 vision_radius_sq = 4 transport_cap = 0 fuel = 0 +city_size = 3072 ; 000000,001,100,000000,00 = atk_bonus=0, max_kills=1, targets=4, move_cost=0 frags, stay_fortfy=0, reserved = 0 +paratroopers_mr_sub = 14336 ; 00111,00,0000,000,0,0 - bbd_retal_rate=7, iPill_rand_tgts=0, iPill_odds=0, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 embarks = "Helicopter" ; transport helicopter only disembarks = "Helicopter" -targets = "Balloon", "LandRail" +targets = "Balloon", "LandRail", "Zeppelin" flags = "CantReachAir", "WillNever" roles = "" helptext = _("\ -Howitzers are upgraded Artillery with significant increase in mobility and attack strength. They can fire over city walls, ignoring their effect.\ +Howitzers are upgraded Artillery with a terrifying increase to mobility and attack strength.\ + Fortifications get no bonus except their terrain bonus, and City Walls\ + are completely ineffective against Howitzers. \n\ +"), _(" +While Howitzers are vulnerable when not escorted, they can retaliate 7 rounds of bombardment\ + against special unit attacks from other units. This is a strong deterrent.\ ") [unit_balloon] name = _("Balloon") class = "Balloon" tech_req = "Chemistry" -obsolete_by = "None" +obsolete_by = "Zeppelin" graphic = "u.balloon" -graphic_alt = "u.trireme" +graphic_alt = "-" sound_move = "m_balloon" sound_move_alt = "m_trireme" sound_fight = "f_warrior" @@ -2040,7 +2427,7 @@ uk_happy = 0 uk_shield = 0 uk_food = 0 uk_gold = 0 -flags = "Unbribable", "HasNoZOC", "NeverProtects", "NonMil", "NoVeteran" +flags = "Unbribable", "HasNoZOC", "NeverProtects", "NonMil", "NoVeteran", "SentryAlways" ; No veteran levels (level name is never displayed) veteran_names = _("green") veteran_base_raise_chance = 0 @@ -2051,13 +2438,73 @@ roles = "" helptext = _("\ Balloons gather intel on potential battle areas. They have great vision and\ are unreachable by units prior to Riflemen and Ironclads. They can stay in\ - the air for one Turn Change before landing in a City, Fortress, Naval Base,\ - Airbase, or transport unit with cargo capacity of 4+. Balloons do not block units under\ - them from being attacked, and cannot fly over mountains.\ + the air for one Turn Change before landing in a City, Base, Quay, or transport\ + unit with cargo capacity of 4+. Balloons give sentry reports of nearby unit\ + movements even when not on sentry. Balloons do not block units under them\ + from being attacked, and can’t fly over mountains.\ +"), _(" +NOTE:GOTO disallows unit loss from lack of fuel. You\ + can override this by ordering moves to adjacent tiles.\ +") + +[unit_zeppelin] +name = _("Zeppelin") +class = "Zeppelin" +tech_req = "Combustion" +obsolete_by = "None" +graphic = "u.zeppelin" +graphic_alt = "-" +sound_move = "m_balloon" +sound_move_alt = "m_trireme" +sound_fight = "f_musketeers" +sound_fight_alt = "f_riflemen" +build_cost = 45 +pop_cost = 0 +attack = 2 +defense = 1 +hitpoints = 20 +firepower = 2 +move_rate = 6 +vision_radius_sq = 24 +transport_cap = 0 +fuel = 3 +city_size = 2632 ;000000,001,010,010010,0,0 = atk_bonus=0, max_kills=1, targets=2, move_cost=18 frags, stay_frtfy=0, reserved = 0 +paratroopers_mr_sub = 0 ;00000,00,0000,000,0,0 = bbd_retal_rate=0, iPill_rand_tgts=0, iPill_odds=-0 pentads, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +flags = "Unbribable", "AirAttacker", "HasNoZOC", "NeverProtects", "Bombarder", + "Provoking", "SentryAlways" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:ace"), + _("?vet_rank:top gun") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 +roles = "" +helptext = _("\ +As new technology inspires the upgrade of Balloons, the Zeppelin appears.\ + In theory, it can be used for tactical advantage in combat. However,\ + vulnerability and cost make it better for intel. It can do limited attack\ + with bombs, or 20 combat rounds with medium caliber ordnance. It can stay out\ + for two Turn Changes before landing in a City, Quay, Fortress, Naval Base,\ + Airbase, or transport with 6+ capacity. \n\ +Zeppelins have great vision and are unreachable by units prior to Marines and\ + Destroyers. Zeppelins do not block units under them from being attacked. Zeppelins\ + give sentry reports of nearby unit movements even when not on sentry. Unlike\ + Balloons, they can fly over Mountains.\ "), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ +NOTE:GOTO disallows unit loss from lack of fuel. You\ can override this by ordering moves to adjacent tiles.\ ") +bombard_rate = 4 [unit_airplane] name = _("Airplane") @@ -2065,7 +2512,7 @@ class = "Air" tech_req = "Flight" obsolete_by = "None" graphic = "u.airplane" -graphic_alt = "u.awacs" +graphic_alt = "-" sound_move = "pm_prop_fighters" sound_move_alt = "m_generic" sound_fight = "f_fighter" @@ -2084,7 +2531,7 @@ uk_happy = 0 uk_shield = 1 uk_food = 0 uk_gold = 0 -flags = "HasNoZOC", "NoVeteran", "Unbribable", "Expellable", "NeverProtects", "CanEscape", "Provoking" +flags = "HasNoZOC", "NoVeteran", "Unbribable", "Expellable", "NeverProtects", "CanEscape", "Provoking", "NonMil" ; No veteran levels (level name is never displayed) veteran_names = _("green") veteran_base_raise_chance = 0 @@ -2092,13 +2539,14 @@ veteran_work_raise_chance = 0 veteran_power_fact = 100 veteran_move_bonus = 0 roles = "" -cargo = "Land" +cargo = "Land", "Cargo" helptext = _("\ -Airplanes can carry a single diplomatic unit. They can land in any domestic or allied\ - city. For missions to non-allied nations, an empty Airbase must be available for landing.\ - Airplanes have two turns of fuel. Each new aviation tech upgrades range by +2 moves per turn.\ +Airplanes can carry a diplomatic unit or a Freight unit. They can land in any domestic\ + or allied city. For diplomatic missions to non-allied nations, an empty Airbase must be available for landing.\ + Airplanes have two turns of fuel. Each new aviation tech upgrades range by +2 moves per turn. \n\ "), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ +Airplanes can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker.\ + NOTE:GOTO disallows unit loss from lack of fuel. You\ can override this by ordering moves to adjacent tiles.\ ") @@ -2127,9 +2575,10 @@ uk_happy = 0 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Air", "AirProtect", "Missile", "Balloon", "Helicopter", "LandRail" +targets = "Air", "AirProtect", "Missile", "Balloon", "Helicopter", "LandRail", "Zeppelin" bonuses = { "flag", "type", "value" + "AirAttacker", "DefenseMultiplierPct", 17 ; defends at 3.5 (3*1.17=3.51) vs air attackers } flags = "AirAttacker", "Unbribable", "HasNoZOC", "CanEscape", "AirProtector", "Provoking" @@ -2151,10 +2600,11 @@ Fighters are the first offensive Air units. Their superior mobility and firepowe the very nature of warfare. They can move anywhere and attack any unit (except Submarines\ and Jet Bombers.)\n\ "), _(" -INTERCEPTOR: the Vigil order lets Fighters auto-attack adjacent Air units if they\ - have better attack odds. A Fighter can Vigil if it uses 2 move points or less.\n\ +INTERCEPTOR:the Vigil order lets Fighters auto-attack adjacent Air units if they\ + have better attack odds. A Fighter can Vigil if it uses 2 move points or less. \n\ "), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ +Fighters can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker.\ + NOTE:GOTO disallows unit loss from lack of fuel. You\ can override this by ordering moves to adjacent tiles.\ ") @@ -2164,7 +2614,7 @@ class = "AirProtect" tech_req = "Radio" obsolete_by = "Jet Fighter" graphic = "u.escort_fighter" -graphic_alt = "u.fighter" +graphic_alt = "-" sound_move = "m_escort_fighter" sound_move_alt = "m_generic" sound_fight = "f_fighter" @@ -2183,9 +2633,15 @@ uk_happy = 0 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Air", "AirProtect", "Missile", "Balloon", "Helicopter", "LandRail" +targets = "Air", "AirProtect", "Missile", "Balloon", "Helicopter", "LandRail", "Zeppelin" bonuses = { "flag", "type", "value" +; Crease Base Attack of 3.5. Use flags to include all unit_types with no overlap: + "CantReachAir", "DefenseDividerPct", 17 ; all military Land, Sea, Bombers, EXCEPT AAA, Mobile SAM, AEGIS + "AntiAir", "DefenseDividerPct", 17 ; AAA, Mobile SAM, AEGIS + "NonMil", "DefenseDividerPct", 17 ; all NonMil units + "AirAttacker", "DefenseDividerPct", 17 ; Aircraft (including Bombers) + "FieldUnit", "DefenseDividerPct", -17 ; Cancel overlapped doubled bonus on Bombers. } flags = "AirAttacker", "Unbribable", "HasNoZOC", "CanEscape", "AirProtector", "Provoking" veteran_names = @@ -2207,10 +2663,11 @@ Escort Fighters are large fighters with high fuel capacity. Higher mass and\ as well as standard Fighters, but can return home on the next turn. They are\ good for long-range missions, defensive air support, and escorting bombers.\ "), _(" -INTERCEPTOR: the Vigil order lets Escort Fighters auto-attack adjacent Air units if they\ - have better attack odds. This unit can Vigil if it uses 3 move points or less.\n\ +INTERCEPTOR:the Vigil order lets Escort Fighters auto-attack adjacent Air units if they\ + have better attack odds. This unit can Vigil if it uses 3 move points or less. \n\ "), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ +This aircraft can Stack-Escape:a 60% chance to escape a killed stack if it has more remaining moves than the attacker.\ + NOTE:GOTO disallows unit loss from lack of fuel. You\ can override this by ordering moves to adjacent tiles.\ ") @@ -2223,8 +2680,8 @@ graphic = "u.dive_bomber" graphic_alt = "-" sound_move = "m_dive_bomber" sound_move_alt = "m_escort_fighter" -sound_fight = "f_medium_bomber" -sound_fight_alt = "f_artillery" +sound_fight = "f_dive_bomber" +sound_fight_alt = "Dive Bomb" build_cost = 60 pop_cost = 0 attack = 3 @@ -2235,25 +2692,26 @@ move_rate = 18 vision_radius_sq = 12 transport_cap = 0 fuel = 1 +paratroopers_mr_sub = 346 ;00,1010,110,1,0 - iPill_rand_tgts=0, iPill_odds=-10 pentads=50%, iPill_moves=6, iPillage=1, attack_stay_fortified=0 +;NOTE:iPillage changes in rules require client_rules_flag and get_what_can_unit_pillage_from() changes. uk_happy = 0 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Air", "AirProtect", "Balloon", "Helicopter", "LandRail" +targets = "Air", "AirProtect", "Balloon", "Helicopter", "LandRail", "Zeppelin" bonuses = { "flag", "type", "value" ; A4.5 vs all Surface Units "CantReachAir", "DefenseDividerPct", 50 - "NonMil", "DefenseDividerPct", 50 ; NonMil don't have CantReachAir flag - "AntiAir", "DefenseDividerPct", 50 ; AntiAir don't hav CantReachAir flag + "NonMil", "DefenseDividerPct", 50 ; NonMil do not have CantReachAir flag + "AntiAir", "DefenseDividerPct", 50 ; AntiAir do not have CantReachAir flag ; Cancel CantReachAir bonus on Bombers "FieldUnit", "DefenseDividerPct", -50 ; D4 vs Anti-Air "AntiAir", "DefenseMultiplierPct", 33 } -flags = "AirAttacker", "Unbribable", "CanEscape", - "NeverProtects", "Provoking", "WillNever" +flags = "AirAttacker", "Unbribable", "CanEscape", "NeverProtects", "Provoking", "WillNever" veteran_names = _("?vet_rank:green"), _("?vet_rank:veteran"), @@ -2268,22 +2726,24 @@ veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "" helptext = _("\ -Dive Bombers are like Fighters but fitted for Ground Attack and Sea combat. Range\ - is reduced by heavy armor and armaments which help in attacking surface targets\ - and in defending against Anti-Air, but hurt in Air-to-Air combat. Though unreachable\ - to Land units, they lack agility to block attacks on their same tile. But over a wider\ - radius, they exert ZoC on adjacent land tiles. The Dive Bomber is not an interceptor.\ - Role specialization yields the following gains and losses over a Fighter:\n\n\ - GAINS:\n\ - • A:4½ vs Surface units (Land or Sea)\n\ - • D:4 vs Anti-Air\n\ - • ZoC\n\ -LOSSES:\n\ - • A3 instead of A4 in Air-to-Air\n\ - • Can't block its tile\n\ - • Can't intercept\ +Dive Bombers are fitted with armor and armaments for ground attack and sea combat.\ + They do better attacking surface targets and defending vs Anti-Air, but have reduced\ + range and Air-to-Air ability. They do not block attacks on their same tile, but exert\ + ZoC on adjacent land tiles and can iPillage. The Dive Bomber is not an interceptor.\ + Role specialization yields the following gains and losses over a Fighter: \n\n\ + GAINS: \n\ + • A:4½ vs Surface units (Land or Sea) \n\ + • D:4 vs Anti-Air \n\ + • iPillage \n\ + • ZoC \n\ +LOSSES: \n\ + • A3/D3 in Air-to-Air \n\ + • Can’t block its tile \n\ + • Can’t intercept \n\ "), _(" -Communists pay 10 less for this unit. GOTO prevents unit loss from lack of fuel.\ +Communists pay 10 less for this unit. Can Stack-Escape:a 60% chance to escape a\ + killed stack if it has more remaining moves than the attacker.\ + GOTO prevents unit loss from lack of fuel.\ Override this by ordering adjacent moves.\ ") @@ -2293,7 +2753,7 @@ class = "Air" tech_req = "Advanced Flight" obsolete_by = "Jet Bomber" graphic = "u.medium_bomber" -graphic_alt = "u.bomber" +graphic_alt = "-" sound_move = "m_medium_bomber" sound_move_alt = "m_generic" sound_fight = "f_medium_bomber" @@ -2312,7 +2772,7 @@ uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Balloon", "LandRail" +targets = "Balloon", "LandRail", "Zeppelin" bonuses = { "flag", "type", "value" } @@ -2333,13 +2793,14 @@ veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "" helptext = _("\ The Medium Bomber is well suited for moderately strong targets or multiple weak targets.\ - It may not attack other Air units. It is a Soft Field Unit and can't carry Bomb\ - units, causing less discontent than other types of Bombers.\n\ -➤ Unhappy effect for Soft Field units:\n\ -Republic:0 Democracy:1 (non-aggressive)\n\ -Republic:1 Democracy:2 (aggressive)\ + It may not attack other Air units. It is a Soft Field Unit and can’t carry Bomb\ + units, causing less discontent than other types of Bombers. \n\ +➤ Unhappy effect for Soft Field units: \n\ +Republic:0 Democracy:1 (non-aggressive) \n\ +Republic:1 Democracy:2 (aggressive) \n\ "), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ +This aircraft can Stack-Escape:a 60% chance to escape a killed stack if it has more remaining moves than the attacker.\ + NOTE:GOTO disallows unit loss from lack of fuel. You\ can override this by ordering moves to adjacent tiles.\ ") @@ -2349,7 +2810,7 @@ class = "Air" tech_req = "Radar" obsolete_by = "Jet Bomber" graphic = "u.heavy_bomber_o" -graphic_alt = "u.bomber" +graphic_alt = "-" sound_move = "m_bomber" sound_move_alt = "m_generic" sound_fight = "f_heavy_bomber" @@ -2368,7 +2829,7 @@ uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Balloon", "LandRail" +targets = "Balloon", "LandRail", "Zeppelin" cargo = "Bomb" bonuses = { "flag", "type", "value" @@ -2391,12 +2852,13 @@ roles = "" helptext = _("\ Heavy Bombers are large and sturdy Bombers with larger payload and numerous gunner defense stations.\ They are excellent for hitting strong well-defended ground targets.\ - They cannot attack Air units. They can carry one Bomb. Like most Bombers, the Heavy Bomber is a Field Unit.\ - Field Units cause the same unhappiness no matter if aggressively or peacefully deployed.\n\ -➤ Unhappy effect for Field units:\n\ -Republic:1 Democracy:2\ + They can’t attack Air units. They can carry one Bomb. Like most Bombers, the Heavy Bomber is a Field Unit.\ + Field Units cause the same unhappiness no matter if aggressively or peacefully deployed. \n\ +➤ Unhappy effect for Field units: \n\ +Republic:1 Democracy:2 \n\ "), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ +This aircraft can Stack-Escape:a 60% chance to escape a killed stack if it has more remaining moves than the attacker.\ + NOTE:GOTO disallows unit loss from lack of fuel. You\ can override this by ordering moves to adjacent tiles.\ ") @@ -2406,11 +2868,11 @@ class = "Air" tech_req = "Rocketry" obsolete_by = "Jet Bomber" graphic = "u.ultra_heavy_bomber_o" -graphic_alt = "u.bomber" +graphic_alt = "-" sound_move = "m_strategic_bomber" sound_move_alt = "m_bomber" sound_fight = "f_strategic_bomber" -sound_fight_alt = "f_bomber" +sound_fight_alt = "Bomb" build_cost = 135 pop_cost = 0 attack = 13 @@ -2421,11 +2883,13 @@ move_rate = 16 vision_radius_sq = 12 transport_cap = 2 fuel = 3 +paratroopers_mr_sub = 782 ;01,1000,011,1,0 - iPill_rand_tgts=1, iPill_odds=-8 pentads=60%, iPill_moves=3, iPillage=1, ATK_Stay_Fortified=0 +;NOTE:iPillage changes in rules require client_rules_flag and get_what_can_unit_pillage_from() changes. uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Balloon", "LandRail" +targets = "Balloon", "LandRail", "Zeppelin" cargo = "Bomb" bonuses = { "flag", "type", "value" @@ -2447,9 +2911,11 @@ veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "" helptext = _("\ The Strategic Bomber offers a small improvement in attack. Higher altitude offers a good upgrade in\ - defense. It has considerably longer range, with one more turn of fuel. May carry two Bombs.\ + defense. It has considerably longer range, with one more turn of fuel. Upgraded payload enables\ + instant-Pillage bombing. May carry two Bombs. \n\ "), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ +This aircraft can Stack-Escape:a 60% chance to escape a killed stack if it has more remaining moves than the attacker.\ + NOTE:GOTO disallows unit loss from lack of fuel. You\ can override this by ordering moves to adjacent tiles.\ ") @@ -2459,7 +2925,7 @@ class = "Air" tech_req = "Radar" obsolete_by = "Spy Plane" graphic = "u.awacs_o" -graphic_alt = "u.awacs" +graphic_alt = "-" sound_move = "m_awacs" sound_move_alt = "m_generic" sound_fight = "f_awacs" @@ -2488,19 +2954,20 @@ veteran_move_bonus = 0 roles = "" helptext = _("\ The AWACS has great fuel capacity for long range flights, and advanced radar that can determine\ - the location of enemy units over a wide area. The AWACS has 2 turns of fuel.\ + the location of enemy units over a wide area. The AWACS has 2 turns of fuel. \n\ "), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ +AWACS can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker.\ + NOTE:GOTO disallows unit loss from lack of fuel. You\ can override this by ordering moves to adjacent tiles.\ ") [unit_spy_plane] name = _("Spy Plane") -class = "Air" +class = "Air_High_Altitude" tech_req = "Stealth" obsolete_by = "None" graphic = "u.spy_plane_o" -graphic_alt = "u.awacs" +graphic_alt = "-" sound_move = "m_awacs" sound_move_alt = "m_generic" sound_fight = "f_awacs" @@ -2520,7 +2987,7 @@ uk_shield = 1 uk_food = 0 uk_gold = 0 vision_layer = "Stealth" -flags = "HasNoZOC", "NoVeteran", "Unbribable", "NeverProtects", "CanEscape", "Provoking" +flags = "HasNoZOC", "NoVeteran", "Unbribable", "NeverProtects", "CanEscape", "Provoking", "WillNever" ; No veteran levels (level name is never displayed) veteran_names = _("green") veteran_base_raise_chance = 0 @@ -2531,20 +2998,71 @@ roles = "" helptext = _("\ The Spy Plane is an ultrasonic high altitude aircraft with long range. It gathers\ intel over a wide area. Stealth technology makes it invisible, except to enemies on\ - adjacent tiles. Spy Planes have 2 turns of fuel.\ + adjacent tiles. Spy Planes have 2 turns of fuel. They are unreachable to primitive\ + propeller-based aircraft.\ "), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ +Spy Planes can Stack-Escape:a 67% chance to escape a killed stack if they have more remaining moves than the attacker.\ + NOTE:GOTO disallows unit loss from lack of fuel. You\ can override this by ordering moves to adjacent tiles.\ ") +[unit_satellite] +name = _("Satellite") +class = "Space" +tech_req = "Laser" +impr_req = "Apollo Program" +obsolete_by = "None" +graphic = "u.satellite" +graphic_alt = "-" +sound_move = "" +sound_move_alt = "m_generic" +sound_fight = "f_awacs" +sound_fight_alt = "f_generic" +build_cost = 140 +pop_cost = 0 +attack = 0 +defense = 1 +hitpoints = 20 +firepower = 1 +move_rate = 65 +vision_radius_sq = 80 +transport_cap = 0 +fuel = 0 +uk_happy = 0 +uk_shield = 1 +uk_food = 0 +uk_gold = 0 +vision_layer = "Stealth" +flags = "Unique", "HasNoZOC", "NonMil", "NoVeteran", "Unbribable", "NeverProtects", "CanEscape", "WillNever" +; No veteran levels (level name is never displayed) +veteran_names = _("green") +veteran_base_raise_chance = 0 +veteran_work_raise_chance = 0 +veteran_power_fact = 100 +veteran_move_bonus = 0 +roles = "" +helptext = _("\ +Satellites orbit the Earth above the atmosphere. They are unreachable to anything\ + but missiles. Their orbital velocity allows them to circumnavigate the planet\ + in a couple turns. Telescopic cameras allow them to Investigate City, even if the\ + city has a Police Station. Satellites can’t be seen by others unless adjacent.\ + Satellites require Laser tech and can only be built in the city with the Apollo Program.\ +"), _(" +Satellites can Stack-Escape:a 100% chance to escape a killed stack if they have more remaining move points than the attacker.\ +"), _(" +NOTE: Due to game mechanics, a Satellite blocks terrestrial movement\ + over a tile. This is solved by killing it with any Missile. To avoid\ + being killed, end your turn in a friendly stack of units, or far away from\ + developed or trafficked areas.\ +") [unit_transport_helicopter] -; /* TRANS: unit type */ +; /* TRANS:unit type */ name = _("Transport Helicopter") class = "Helicopter" tech_req = "Combined Arms" obsolete_by = "None" graphic = "u.t_helicopter" -graphic_alt = "u.helicopter" +graphic_alt = "-" sound_move = "m_helicopter" sound_move_alt = "m_generic" sound_fight = "f_helicopter" @@ -2571,8 +3089,8 @@ bonuses = } cargo = "Land", "LandAirSea", "LandNoKill" flags = "Helicopter", "AirAttacker", "Unbribable", "Provoking", - "CanEscape", "WillNever", "HasNoZOC" - ; Tranport Heli is provoking; Fighters don't like them. + "CanEscape", "WillNever", "HasNoZOC", "NeverProtects" + ; Tranport Heli is provoking; Fighters do not like them. veteran_names = _("?vet_rank:green"), _("?vet_rank:veteran"), @@ -2587,21 +3105,22 @@ veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "" helptext = _("\ -Transport Helicopters can carry three land units.\ +Transport Helicopters can carry three land units, which they can pick up from anywhere.\ "), _("\ - Foot and artillery types can unload on any tile, but will lose moves (except Marines).\ - Other types need a city or base to unload.\n\ + Foot and artillery types can unload by stepping off to any adjacent tile, but will\ + lose all moves (except Marine types). Other types need a City, Airbase, or Naval Base to unload. \n\ "), _("\ Helicopters lose 1 hp for each turn not ended in a City, Base, or Carrier. +1 move\ - is awarded if starting a turn in a City or Airbase.\n\ + is awarded if starting a turn in a City or Airbase. \n\ "), _("\ All Helicopters can be attacked by land from Riflemen onward; by sea from Ironclad\ onward; get +50% defence vs. foot units; and are unreachable to artillery types.\ Unlike attack Helicopters, Transport Helicopters are intercepted by Fighters on vigil.\ + Transport Helicopters can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker.\ ") [unit_helicopter] -; /* TRANS: unit type */ +; /* TRANS:unit type */ name = _("Helicopter") class = "Helicopter" tech_req = "Combined Arms" @@ -2622,11 +3141,13 @@ move_rate = 12 vision_radius_sq = 12 transport_cap = 1 fuel = 0 +city_size = 2816 ; 000000,001,011,000000,00 = atk_bonus=0, max_kills=1, targets=3, move_cost=0 frags, stay_fortfy=0, reserved = 0 +paratroopers_mr_sub = 6144 ; 00011,00,0000,000,0,0 - bbd_retal_rate=3, iPill_rand_tgts=0, iPill_odds=0, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Balloon", "Helicopter", "LandRail" +targets = "Balloon", "Helicopter", "LandRail", "Zeppelin" bonuses = { "flag", "type", "value" "FootSoldier", "DefenseMultiplierPct", 50 ; all Infantry (Foot and Mech.) @@ -2635,8 +3156,8 @@ bonuses = } cargo = "LandAirSea" flags = "Helicopter", "AirAttacker", "Unbribable", - "CanEscape", "WillNever" - ; Heli is low-altitude and non-provoking: if it's ever thought to be OP, + "CanEscape", "WillNever", "NeverProtects" + ; Heli is low-altitude and non-provoking:if it is ever thought to be OP, ; changing this flag fixes that right away. But currently it MIGHT be UnP ; because hp_loss, range, city walls, and Ground Strike Fighter veteran_names = @@ -2655,17 +3176,18 @@ roles = "" helptext = _("\ Helicopters are the Air Cavalry of modern armies. They can attack multiple targets\ and conquer cities. Unaffected by terrain, they are good for Partisan suppression.\ - They can transport Marines and AAA and are thus well-suited for commando ops.\n\ + They can transport Marines and AAA and are thus well-suited for commando ops. \n\ "), _("\ For each turn not ended in a City, Base, or Carrier, 1hp is lost. +1 move\ - is awarded if starting a turn in a City or Airbase.\n\ + is awarded if starting a turn in a City or Airbase. \n\ "), _("\ Helicopters fly low to avoid Interception. This invites attacks by ground units from\ Riflemen onward. They are unreachable to Artillery types and get +50% defense\ - vs. foot units. City Walls get a defense bonus against them;\ - SAM Batteries do not. Helicopters can be attacked by Sea from Ironclad onward.\n\ + vs. foot units. Helicopters can be attacked by Sea from Ironclad onward. +Helicopters can retaliate 3 rounds against Special Unit Attacks. \n\ "), _("\ -Helicopters can transport one Marines or AAA unit.\ +Helicopters can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker.\ + Helicopters can transport one Marines or AAA unit.\ ") [unit_jet_fighter] @@ -2674,7 +3196,7 @@ class = "AirProtect" tech_req = "Avionics" obsolete_by = "None" graphic = "u.jet_fighter" -graphic_alt = "u.stealth_fighter" +graphic_alt = "-" sound_move = "m_jet_fighter" sound_move_alt = "m_stealth_fighter" sound_fight = "f_jet_fighter" @@ -2693,7 +3215,7 @@ uk_happy = 0 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Air", "AirProtect", "AirPillage", "Missile", "Balloon", "Helicopter", "LandRail" +targets = "Air", "AirProtect", "Air_High_Altitude", "Missile", "Balloon", "Helicopter", "LandRail", "Zeppelin" bonuses = { "flag", "type", "value" } @@ -2714,11 +3236,11 @@ roles = "" helptext = _("\ Jet Fighters upgrade the Fighter with improved attack, defense, and range.\ "), _(" -INTERCEPTOR: the Vigil order Jets Fighters auto-attack adjacent Air units if they\ - have better attack odds. This unit can Vigil if it uses 3 move points or less.\n\ +INTERCEPTOR:the Vigil order lets Jet Fighters auto-attack adjacent Air units if they\ + have better attack odds. This unit can Vigil if it uses 3 move points or less. \n\ "), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ +Jet Fighters can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker.\ + NOTE:GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.\ ") [unit_ground_strike_fighter] @@ -2730,8 +3252,8 @@ graphic = "u.strike_fighter" graphic_alt = "-" sound_move = "m_strike_fighter" sound_move_alt = "m_jet_fighter" -sound_fight = "f_medium_bomber" -sound_fight_alt = "f_artillery" +sound_fight = "f_fighter" +sound_fight_alt = "Ground Strike" build_cost = 80 pop_cost = 0 attack = 7 @@ -2742,11 +3264,13 @@ move_rate = 21 vision_radius_sq = 12 transport_cap = 0 fuel = 2 +paratroopers_mr_sub = 178 ;00,0101,100,1,0 - iPill_rand_tgts=0, iPill_odds=-5 pentads=75%, iPill_moves=4, iPillage=1, ATK_Stay_Fortified=0 +;NOTE:iPillage changes in rules require client_rules_flag and get_what_can_unit_pillage_from() changes. uk_happy = 0 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Air", "AirPillage", "Balloon", "Helicopter", "LandRail" +targets = "Air", "Air_High_Altitude", "Balloon", "Helicopter", "LandRail", "Zeppelin" bonuses = { "flag", "type", "value" "AntiAir", "DefenseMultiplierPct", 33 ; D5.33 vs Anti-Air @@ -2767,27 +3291,28 @@ veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "" helptext = _("\ -Ground Strike Fighters upgrade the Dive Bomber. They cannot block attacks on other\ +Ground Strike Fighters upgrade the Dive Bomber. They can’t block attacks on other\ units on their tile, nor engage against Fighters. However, like the Dive Bomber,\ they can interdict ZoC over land tiles. High fuel capacity allows two turns in the\ air. No unit can stop this unit from attacking surface units on a tile. This unit\ can also do pinpointed surgical strikes to pillage tiles. This aircraft is a\ - specialized niche unit. It is not an interceptor.\n\ -NOTE: GOTO prevents unit loss from lack of fuel. You\ + specialized niche unit. It is not an interceptor. \n\ +This aircraft can Stack-Escape:a 60% chance to escape a killed stack if it has more remaining moves than the attacker.\ + NOTE:GOTO prevents unit loss from lack of fuel. You\ can override this by ordering moves to adjacent tiles.\ ") [unit_jet_bomber] name = _("Jet Bomber") -class = "AirPillage" +class = "Air_High_Altitude" tech_req = "Space Flight" obsolete_by = "None" graphic = "u.jet_bomber_o" -graphic_alt = "u.bomber" +graphic_alt = "-" sound_move = "m_jet_bomber" sound_move_alt = "m_bomber" sound_fight = "f_jet_bomber" -sound_fight_alt = "f_bomber" +sound_fight_alt = "Carpet Bomb" build_cost = 145 pop_cost = 0 attack = 15 @@ -2798,6 +3323,8 @@ move_rate = 19 vision_radius_sq = 12 transport_cap = 3 fuel = 3 +paratroopers_mr_sub = 1198 ;10,0101,011,1,0 - iPill_rand_tgts=2, iPill_odds=-5 pentads=75%, iPill_moves=3, iPillage=1, ATK_Stay_Fortified=0 +;NOTE:iPillage changes in rules require client_rules_flag and get_what_can_unit_pillage_from() changes. uk_happy = 1 uk_shield = 1 uk_food = 0 @@ -2820,12 +3347,13 @@ veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "" helptext = _("\ -Jet Bombers are stratospheric long-range bombers with 3 turns of fuel: they can be airborne for two\ +Jet Bombers are stratospheric long-range bombers with 3 turns of fuel:they can be airborne for two\ turn-changes. Their range makes them useful even after Stealth Bombers are available. Stratospheric\ - altitude is unreachable to propeller-based Fighters and AAA. Jet Bombers can carpet-bomb,\ - pillaging tiles from the air. May carry three Bombs.\ + altitude is unreachable to propeller-based Fighters and AAA. Jet Bombers can Carpet Bomb, an\ + instant-Pillage of tiles from the air. May carry three Bombs. \n\ "), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ +Jet Bombers can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker.\ + NOTE:GOTO disallows unit loss from lack of fuel. You\ can override this by ordering moves to adjacent tiles.\ ") @@ -2854,7 +3382,7 @@ uk_happy = 0 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Air", "AirProtect", "AirPillage", "Missile", "Balloon", "Helicopter", "LandRail" +targets = "Air", "AirProtect", "Air_High_Altitude", "Missile", "Balloon", "Helicopter", "LandRail", "Zeppelin" bonuses = { "flag", "type", "value" "AntiAir", "DefenseDividerPct", 25 @@ -2876,14 +3404,16 @@ veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "" helptext = _("\ -The most advanced Fighter, with improved attack and longer range. Stealth Fighters cannot be seen unless adjacent\ +The most advanced Fighter, with improved attack and longer range. Stealth Fighters can’t be seen unless adjacent\ to an enemy. Stealth evasion gives a 25% bonus against all Anti-Air units, and reduces\ SAM Batteries down to a smaller 25% bonus.\ "), _(" -INTERCEPTOR: the Vigil order lets Stealth Fighters auto-attack adjacent Air units if they\ - have better attack odds. This unit can Vigil if it uses 4 move points or less.\n\ +INTERCEPTOR:the Vigil order lets Stealth Fighters auto-attack adjacent Air units if they\ + have better attack odds. This unit can Vigil if it uses 4 move points or less. \n\ +"), _(" +Stealth Fighters can Stack-Escape:a 67% chance to escape a killed stack if they have more remaining moves than the attacker.\ "), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ +NOTE:GOTO disallows unit loss from lack of fuel. You\ can override this by ordering moves to adjacent tiles.\ ") @@ -2893,7 +3423,7 @@ class = "Air" tech_req = "Stealth" obsolete_by = "None" graphic = "u.stealth_bomber_o" -graphic_alt = "u.stealth_bomber" +graphic_alt = "-" sound_move = "m_stealth_bomber" sound_move_alt = "m_generic" sound_fight = "f_stealth_bomber" @@ -2912,7 +3442,7 @@ uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Balloon", "LandRail" +targets = "Balloon", "LandRail", "Zeppelin" bonuses = { "flag", "type", "value" "AntiAir", "DefenseDividerPct", 25 @@ -2936,11 +3466,12 @@ veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "" helptext = _("\ -The deadliest Bomber, with improved attack and speed. Stealth Bombers cannot be seen\ +The deadliest Bomber, with improved attack and speed. Stealth Bombers can’t be seen\ unless adjacent to an enemy. Stealth evasion gives a 25% bonus against all Anti-Air\ - units, and reduces SAM Batteries down to only a 25% bonus. May carry two Bombs.\ + units, and reduces SAM Batteries down to only a 25% bonus. May carry two Bombs. \n\ "), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ +Stealth Bombers can Stack-Escape:a 67% chance to escape a killed stack if they have more remaining moves than the attacker.\ + NOTE:GOTO disallows unit loss from lack of fuel. You\ can override this by ordering moves to adjacent tiles.\ ") @@ -2969,18 +3500,29 @@ uk_happy = 0 uk_shield = 0 uk_food = 0 uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea", "LandRoad" +cargo = "Land", "LandNoKill", "LandAirSea", "Cargo" flags = "BadCityDefender", "HelpWonder", "TradeRoute", "CoastStrict", "NonMil", "HasNoZOC" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "Ferryboat", "FerryStartUnit" helptext = _("\ Boats were used pre-historically for exploration,\ transport, and interaction with other tribes. They\ can travel rivers and oceans, but must always stay\ near shore. Boats can carry one unit and do ancient\ - commerce: building Wonders or setting up Traderoutes\ - without Trade tech. Primitive bartering generates little\ - or no extra trade, but may help you advance faster or\ - create relations with ancient neighbors.\ + commerce:building Wonders or setting up Trade Routes.\ + Early bartering may help you advance faster or create\ + relations with ancient neighbors.\ ") [unit_trireme] @@ -3008,17 +3550,29 @@ uk_happy = 0 uk_shield = 1 uk_food = 0 uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea", "LandRoad" +cargo = "Land", "LandNoKill", "LandAirSea", "LandRoad", "Cargo" flags = "BadCityDefender", "CantReachAir", "HelpWonder", "TradeRoute", "Coast", "WillNever", "NonMil", "NonMilAttack" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "Ferryboat", "FerryStartUnit" helptext = _("\ Triremes are used for exploration, transport, and Commerce.\ The entry on Caravan explains what Commerce units may do.\ "), _(" -Triremes can enter Deep Ocean, but there is risk: they must end every second\ - turn on river, coastline, or a city—or else be lost at sea. They can travel\ - and attack on rivers, but cannot attack the shore.\ +Triremes can enter Deep Ocean, but there is risk:they must end every second\ + turn on river, coastline, or a city—or else be lost at sea. They can attack\ + and travel on rivers, but can’t attack the shore.\ "), _(" Like most ancient sea units, when it initiates combat there will be 15 rounds\ of combat and 15 total hp lost between both units. This may or may not\ @@ -3031,7 +3585,7 @@ class = "RiverShip" tech_req = "Map Making" obsolete_by = "Caravel" graphic = "u.longboat" -graphic_alt = "u.trireme" +graphic_alt = "-" sound_move = "m_longboat" sound_move_alt = "m_trireme" sound_fight = "f_trireme" @@ -3052,6 +3606,18 @@ uk_food = 0 uk_gold = 0 cargo = "Land", "LandNoKill", "LandAirSea", "LandRoad" flags = "BadCityDefender", "CantReachAir", "WillNever" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "Ferryboat", "Hunter" helptext = _("\ The Longboat is a warship. It can attack at sea, attack the shore, and carry one land\ @@ -3068,7 +3634,7 @@ class = "RiverShip" tech_req = "Seafaring" obsolete_by = "Caravel" graphic = "u.galley" -graphic_alt = "u.trireme" +graphic_alt = "-" sound_move = "m_galley" sound_move_alt = "m_trireme" sound_fight = "f_trireme" @@ -3087,15 +3653,27 @@ uk_happy = 0 uk_shield = 1 uk_food = 0 uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea", "LandRoad" +cargo = "Land", "LandNoKill", "LandAirSea", "LandRoad", "Cargo" flags = "BadCityDefender", "CantReachAir", "HelpWonder", "Traderoute", "Only_Native_Attack", "WillNever", "NonMil", "NonMilAttack" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "Ferryboat", "FerryStartUnit", "BarbarianBoat" helptext = _("\ The Galley is an all-purpose sea unit and upgrades the Trireme. It has decent\ combat strength, can transport, and is a Commerce unit. The entry on Caravan\ - explains what Commerce units may do. Galleys can travel and attack on rivers,\ - but cannot attack the shore. Galleys do not cause unhappiness.\ + explains what Commerce units may do. Galleys can attack and travel on rivers,\ + but can’t attack the shore. Galleys do not cause unhappiness.\ "), _(" Like most early sea units, when it initiates an attack, there will be 15 rounds\ of combat and 15 total hp lost between both units. This may or may not\ @@ -3108,7 +3686,7 @@ class = "RiverShip" tech_req = "Astronomy" obsolete_by = "Caravel" graphic = "u.war_galley" -graphic_alt = "u.trireme" +graphic_alt = "-" sound_move = "m_war_galley" sound_move_alt = "m_trireme" sound_fight = "f_trireme" @@ -3129,10 +3707,22 @@ uk_food = 0 uk_gold = 0 cargo = "Land", "LandNoKill", "LandAirSea", "LandRoad" flags = "BadCityDefender", "CantReachAir", "WillNever" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "Ferryboat", "FerryStartUnit", "BarbarianBoat", "Hunter" helptext = _("\ The War Galley has improved offense, defense, and cargo capacity, but lacks commerce\ - ability. War Galleys can travel and attack on rivers, and do shore attacks from the sea.\ + ability. War Galleys can attack and travel on rivers, and do shore attacks from the sea.\ "), _(" Like most ancient sea units, when it initiates combat there will be 15 rounds\ of combat and 15 total hitpoints lost between both units. This may or may not\ @@ -3141,11 +3731,11 @@ Like most ancient sea units, when it initiates combat there will be 15 rounds\ [unit_ram_ship] name = _("Ram Ship") -class = "Sea" +class = "RiverShip" tech_req = "Engineering" obsolete_by = "Caravel" graphic = "u.ram_ship" -graphic_alt = "u.trireme" +graphic_alt = "-" sound_move = "m_ram_ship" sound_move_alt = "m_trireme" sound_fight = "f_ram_ship" @@ -3158,20 +3748,32 @@ hitpoints = 10 firepower = 1 move_rate = 6 vision_radius_sq = 2 -transport_cap = 0 +transport_cap = 1 fuel = 0 uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea" +cargo = "Land", "LandNoKill", "LandAirSea", "LandRoad", "Cargo" flags = "BadCityDefender", "CantReachAir", "Only_Native_Attack", "WillNever" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "Hunter" helptext = _("\ -The Ram Ship has one purpose: to destroy other ships. It has poor vision, no transport or\ - commerce ability, and cannot travel rivers. Unlike other early ships, there will always be\ +The Ram Ship has one purpose:to destroy other ships. It has poor vision, and no transport or\ + commerce ability. Unlike other early ships, there will always be\ a winner and a loser when Ram Ships attack. They are good for first-strike, and are good\ - counter units for nations not invested into sea tech. Ram Ships cannot do shore attacks.\ + counter units for nations not invested into sea tech. Ram Ships can’t do shore attacks.\ ") [unit_caravel] @@ -3180,7 +3782,7 @@ class = "RiverShip" tech_req = "Navigation" obsolete_by = "Galleon" graphic = "u.caravel" -graphic_alt = "u.trireme" +graphic_alt = "-" sound_move = "m_caravel" sound_move_alt = "m_generic" sound_fight = "f_caravel" @@ -3195,16 +3797,30 @@ move_rate = 7 vision_radius_sq = 4 transport_cap = 3 fuel = 0 -uk_happy = 1 +uk_happy = 0 uk_shield = 1 uk_food = 0 uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea", "LandRoad" +cargo = "Land", "LandNoKill", "LandAirSea", "LandRoad", "Cargo" flags = "BadCityDefender", "CantReachAir", "Traderoute", "WillNever", "NonMil", "NonMilAttack" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "Ferryboat", "FerryStartUnit", "BarbarianBoat", "Hunter" helptext = _("\ -Caravels upgrade older sea units, and are a big advance in combat, speed, range, and transport capacity. They have\ - the commerce ability of the Galley, but cannot build Wonders. Caravels can travel and attack on rivers and do shore attacks.\ +Caravels upgrade older sea units, and are a big advance in combat, speed,\ + range, and transport capacity. They have the commerce ability of the Galley,\ + but cannot build Wonders. Caravels can attack and travel on rivers and do\ + shore attacks. As a Commerce unit, the Caravel does not cause unhappiness.\ "), _(" Like most early sea units, when it initiates an attack, there will be 15 rounds\ of combat and 15 total hitpoints lost between both units. This may or may not\ @@ -3232,23 +3848,38 @@ move_rate = 8 vision_radius_sq = 4 transport_cap = 4 fuel = 0 -uk_happy = 1 +uk_happy = 0 uk_shield = 1 uk_food = 0 uk_gold = 0 targets = "Submarine", "LandRail" -cargo = "Land", "LandNoKill", "LandAirSea", "Balloon", "LandRoad" -flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever" +cargo = "Land", "LandNoKill", "LandAirSea", "Balloon", "LandRoad", "Cargo" +flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever", + "NonMil", "NonMilAttack" ; maritime trade can continue after Caravel expires. +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "Ferryboat", "FerryStartUnit", "BarbarianBoat" helptext = _("\ -The Galleon is a heavily armed transport ship that can carry up to 4 units. Galleons can travel and attack on rivers,\ +The Galleon is a heavily armed transport ship that can carry up to 4 units. Galleons can attack and travel on rivers,\ and also do shore attacks. Galleon crews repair their ship an extra +1hp per turn, regardless of whether it has moved.\ "), _(" Like most early sea units, when it initiates combat there will be 15 rounds\ of combat and 15 total hitpoints lost between both units. This may or may not\ - result in the loss of one of the units.\ + result in the loss of one of the units. Although the Galleon is not a Commerce\ + unit, it retains one vestige of the commercial abilities for the ships it upgrades.\ + It can enter Peace waters to deliver commercial cargo, and does not cause unhappiness.\ "), _(" -Galleons can Stack-Escape: a 50% chance to escape a killed stack if they have more remaining moves than the attacker.\ +Galleons can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker.\ ") [unit_frigate] @@ -3282,26 +3913,131 @@ bonuses = { "flag", "type", "value" "Marines", "DefenseMultiplier", 1 } +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever" roles = "Hunter" helptext = _("\ -The Frigate is versatile — it's a superior offensive unit and also a decent transport ship. Frigates\ - can travel and attack on rivers, or make shore attacks from sea. Frigate crews repair their ship an\ +The Frigate is versatile — it is a superior offensive unit and also a decent transport ship. Frigates\ + can attack and travel on rivers, or make shore attacks from sea. Frigate crews repair their ship an\ extra +1hp per turn, regardless of whether it has moved.\ "), _(" From Frigates onward, all sea attacks end with a single victor.\ - Frigates can Stack-Escape: a 50% chance to escape a killed stack if they have more remaining move points than the attacker.\ + Frigates can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining move points than the attacker.\ ") -[unit_ironclad] -name = _("Ironclad") -class = "Sea" -tech_req = "Steam Engine" -obsolete_by = "Destroyer" -graphic = "u.ironclad" +[unit_cargo_ship] +name = _("Cargo Ship") +class = "RiverShip" +tech_req = "Industrialization" +obsolete_by = "None" +graphic = "u.cargo_ship" graphic_alt = "-" -sound_move = "m_ironclad" -sound_move_alt = "m_generic" +sound_move = "m_transport" +sound_move_alt = "m_transport" +sound_fight = "f_trireme" +sound_fight_alt = "f_generic" +build_cost = 45 +pop_cost = 0 +attack = 0 +defense = 1 +hitpoints = 30 +firepower = 1 +move_rate = 7 +vision_radius_sq = 4 +transport_cap = 4 +fuel = 0 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +cargo = "Land", "LandNoKill", "LandAirSea", "Balloon", "LandRoad", "Cargo" +flags = "BadCityDefender", "HelpWonder", "Traderoute", "NonMil", "HasNoZOC", "NoVeteran" +; No veteran levels (level name is never displayed) +veteran_names = _("green") +veteran_base_raise_chance = 0 +veteran_work_raise_chance = 0 +veteran_power_fact = 100 +veteran_move_bonus = 0 +roles = "" +helptext = _("\ +Cargo ships are Commerce units:they can establish Trade Routes and help\ + build Wonders. They can travel rivers and oceans. Cargo ships can also carry\ + four land units:thus, they are useful for transporting units by river or sea.\ +") + +[unit_transport] +name = _("Transport") +class = "Sea" +tech_req = "Industrialization" +obsolete_by = "None" +graphic = "u.transport" +graphic_alt = "-" +sound_move = "m_transport" +sound_move_alt = "m_generic" +sound_fight = "f_transport" +sound_fight_alt = "f_generic" +build_cost = 50 +pop_cost = 0 +attack = 0 +defense = 3 +hitpoints = 30 +firepower = 1 +move_rate = 10 +vision_radius_sq = 12 +transport_cap = 8 +fuel = 0 +uk_happy = 0 +uk_shield = 1 +uk_food = 0 +uk_gold = 0 +cargo = "Land", "LandNoKill", "LandAirSea", "Balloon", "LandRoad", "Cargo", "Zeppelin" +bonuses = + { "flag", "type", "value" + "Marines", "DefenseMultiplier", 1 + } +flags = "BadCityDefender", "CanEscape" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 +roles = "Ferryboat", "FerryStartUnit" +helptext = _("\ +The Transport can’t attack but can defend itself when under attack.\ + Marines and Anti-Aircraft Artillery can directly attack from a Transport. Its\ + large cargo capacity makes it a significant logistical upgrade for sea\ + transportation. The Transport is considered a military vessel:unwelcome in\ + the waters of nations with whom you are at Peace. Transports do not cause\ + unhappiness.\ +") + +[unit_ironclad] +name = _("Ironclad") +class = "Sea" +tech_req = "Steam Engine" +obsolete_by = "Destroyer" +graphic = "u.ironclad" +graphic_alt = "-" +sound_move = "m_ironclad" +sound_move_alt = "m_generic" sound_fight = "f_ironclad" sound_fight_alt = "f_generic" build_cost = 60 @@ -3324,6 +4060,18 @@ bonuses = "Marines", "DefenseMultiplier", 1 } flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "Hunter" helptext = _("\ The Ironclad is an armored ship that is much more sturdy than the Frigate but\ @@ -3331,7 +4079,7 @@ The Ironclad is an armored ship that is much more sturdy than the Frigate but\ onward, warships are excellent at attacking shore targets, and can also pillage\ buoys.\ "), _(" -Ironclads and all modern ships can Stack-Escape: a 50% chance to escape a killed stack if they have more remaining move points than the attacker.\ +Ironclads and all modern ships can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining move points than the attacker.\ ") [unit_destroyer] @@ -3359,13 +4107,26 @@ uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter", "LandRail" +targets = "Balloon", "Submarine", "Helicopter", "LandRail", "Zeppelin" +;cargo = "Virtual" bonuses = { "flag", "type", "value" "Submarine", "DefenseMultiplier", 3 "Marines", "DefenseMultiplier", 1 } flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "Hunter" helptext = _("\ Destroyers are the first of the modern ships to start your modern\ @@ -3373,6 +4134,8 @@ Destroyers are the first of the modern ships to start your modern\ anti-submarine warfare, shore bombardment of lighter targets,\ and supporting the needs of larger fleets. 4× ASW defence gives a\ 35% chance defending vs Submarines.\ +"), _(" +Destroyers can Stack-Escape:a 67% chance to escape a killed stack if they have more remaining move points than the attacker.\ ") [unit_cruiser] @@ -3400,17 +4163,29 @@ uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter", "LandRail" +targets = "Balloon", "Submarine", "Helicopter", "LandRail", "Zeppelin" bonuses = { "flag", "type", "value" "Submarine", "DefenseMultiplier", 1 "Marines", "DefenseMultiplier", 1 } flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "Hunter" helptext = _("\ The Cruiser is a large and fast surface warship with equally strong offensive and defensive strength. More often than not, its\ - 2× ASW defence allows it to survive a Submarine attack.\ + 2× ASW defence allows it to survive a Submarine attack. \ "), _("\ The main duties of the Cruiser are offensive strikes against lesser ships, and escorting weaker ships.\ ") @@ -3421,7 +4196,7 @@ class = "Sea" tech_req = "Rocketry" obsolete_by = "None" graphic = "u.missile_destroyer" -graphic_alt = "u.destroyer" +graphic_alt = "-" sound_move = "m_destroyer" sound_move_alt = "m_generic" sound_fight = "f_destroyer" @@ -3440,8 +4215,8 @@ uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter", "LandRail" -cargo = "Missile" +targets = "Balloon", "Submarine", "Helicopter", "LandRail", "Zeppelin" +cargo = "Missile"; , "Virtual" bonuses = { "flag", "type", "value" "Submarine", "DefenseMultiplier", 1 @@ -3450,11 +4225,25 @@ bonuses = "Missile", "DefenseMultiplier", 1 } flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "Hunter" helptext = _("\ The Missile Destroyer has double the firepower of a Destroyer, and shares the same roles\ as its ancestor. It gains 2× defense against Air and Missile units. It has a 2× ASW bonus\ and can can carry one Missile.\ +"), _(" +Missile Destroyers can Stack-Escape:a 67% chance to escape a killed stack if they have more remaining move points than the attacker.\ ") [unit_aegis_cruiser] @@ -3482,8 +4271,8 @@ uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Air", "AirProtect", "AirPillage", "Missile", "Helicopter", "Balloon", "Submarine", "LandRail" -cargo = "Missile" +targets = "Air", "AirProtect", "Air_High_Altitude", "Missile", "Helicopter", "Balloon", "Submarine", "LandRail", "Zeppelin" +cargo = "Missile";, "Virtual" bonuses = { "flag", "type", "value" "AirAttacker", "DefenseMultiplier", 2 @@ -3492,12 +4281,24 @@ bonuses = "Marines", "DefenseMultiplier", 1 } flags = "BadCityDefender", "CanEscape", "AntiAir", "WillNever" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "Hunter" helptext = _("\ The AEGIS Cruiser has an Anti-Air missile system. Radar and sonar\ give superior vision and 2× defense bonus against Submarines.\ The AEGIS can carry two Missiles, and is the only ship that can attack\ - Air and Missile units.\ + Air and Missile units. \ "), _("\ Excellent vision and 3× Anti-Air bonus are ideal for scouting and escorting.\ ") @@ -3508,7 +4309,7 @@ class = "Sea" tech_req = "Refining" obsolete_by = "None" graphic = "u.battleship" -graphic_alt = "u.battleship" +graphic_alt = "-" sound_move = "m_battleship" sound_move_alt = "m_generic" sound_fight = "f_battleship" @@ -3523,21 +4324,38 @@ move_rate = 10 vision_radius_sq = 12 transport_cap = 0 fuel = 0 +city_size = 3252 ; 000000,001,100,101101,00 = atk_bonus=0, max_kills=1, targets=4, move_cost=45 frags, stay_fortfy=0, reserved = 0 +paratroopers_mr_sub = 6144 ; 00011,00,0000,000,0,0 - bbd_retal_rate=3, iPill_rand_tgts=0, iPill_odds=0, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter", "LandRail" +targets = "Balloon", "Submarine", "Helicopter", "LandRail", "Zeppelin" bonuses = { "flag", "type", "value" "Submarine", "DefenseMultiplier", 1 "Marines", "DefenseMultiplier", 1 } -flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever" +flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever", "Bombarder" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "" helptext = _("\ -The Battleship is the supreme naval unit with excellent offensive and defensive strength. It has a 2× defense bonus vs Submarines.\ +The Battleship is the supreme naval unit, with excellent offensive and defensive strength. It has a 2× defense bonus vs Submarines.\ + Battleships may expend 5 move points to do a 3 round bombardment which hits up to 4 units within a stack, of which only a maximum\ + of one can be killed. Defending Battleships get a free bombardment against Special Unit Attacks.\ ") +bombard_rate = 3 [unit_submarine] name = _("Submarine") @@ -3573,15 +4391,29 @@ bonuses = } flags = "NeverProtects", "BadCityDefender", "Only_Native_Attack", "Submarine", "CanEscape", "CantReachAir", "WillNever" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "Hunter" helptext = _("\ Submarines are strong attackers but weak defenders. They can carry 8 Missiles.\ They are unreachable by Air units, but do not block air attacks on surface ships.\ - Submarines cannot attack units on shore. Submarines cannot be seen by other players\ - unless they have a unit or city adjacent to it.\ + Submarines can’t attack units on shore. Submarines can’t be seen by other players\ + unless they have a unit or city adjacent to it. \ "), _("\ Submarines have superior attrition rates when attacking in numbers. They excel\ at hit-and-run against weaker ships.\ +"), _(" +Submarines can Stack-Escape:a 75% chance to escape a killed stack if they have more remaining move points than the attacker.\ ") [unit_carrier] @@ -3603,108 +4435,41 @@ hitpoints = 40 firepower = 2 move_rate = 10 vision_radius_sq = 12 -transport_cap = 9 +transport_cap = 10 fuel = 0 uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter" -cargo = "Air", "AirProtect", "AirPillage", "Missile", "Helicopter", "Balloon", "LandAirSea" +targets = "Balloon", "Submarine", "Helicopter", "Zeppelin" +cargo = "Air", "AirProtect", "Air_High_Altitude", "Missile", "Helicopter", "Balloon", "LandAirSea", "Zeppelin" bonuses = { "flag", "type", "value" "Marines", "DefenseMultiplier", 1 } flags = "BadCityDefender", "Only_Native_Attack", "CanEscape", "CantReachAir", "WillNever" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "" helptext = _("\ The Carrier is a mobile airport that can carry Air units, Helicopters, AAA, Marines, and Missiles.\ Fighters can Vigil on a Carrier if they have enough moves and the Carrier has not moved since the\ - Vigil order was given.\ + Vigil order was given. \ "), _("\ Carriers are very expensive and thus, usually protected by a fleet of scouts and escorts.\ ") -[unit_cargo_ship] -name = _("Cargo Ship") -class = "RiverShip" -tech_req = "Industrialization" -obsolete_by = "None" -graphic = "u.cargo_ship" -graphic_alt = "u.transport" -sound_move = "m_transport" -sound_move_alt = "m_transport" -sound_fight = "f_trireme" -sound_fight_alt = "f_generic" -build_cost = 45 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 30 -firepower = 1 -move_rate = 7 -vision_radius_sq = 4 -transport_cap = 4 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea", "Balloon", "LandRoad" -flags = "BadCityDefender", "HelpWonder", "Traderoute", "NonMil", "HasNoZOC", "NoVeteran" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_base_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "" -helptext = _("\ -Cargo ships are Commerce units: they can establish Trade Routes and help\ - build Wonders. They can travel rivers and oceans. Cargo ships can also carry\ - four land units: thus, they are useful for transporting units by river or sea.\ -") - -[unit_transport] -name = _("Transport") -class = "Sea" -tech_req = "Industrialization" -obsolete_by = "None" -graphic = "u.transport" -graphic_alt = "-" -sound_move = "m_transport" -sound_move_alt = "m_generic" -sound_fight = "f_transport" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 0 -defense = 3 -hitpoints = 30 -firepower = 1 -move_rate = 10 -vision_radius_sq = 12 -transport_cap = 8 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea", "Balloon", "LandRoad" -bonuses = - { "flag", "type", "value" - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "CanEscape" -roles = "Ferryboat", "FerryStartUnit" -helptext = _("\ -The Transport cannot attack but can defend itself when under attack.\ - Marines and Anti-Aircraft Artillery can directly attack from a Transport. Its\ - large cargo capacity makes it a significant logistical upgrade in\ - sea transportation.\ -") - [unit_cruise_missile] name = _("Cruise Missile") class = "Missile" @@ -3732,17 +4497,17 @@ uk_food = 0 uk_gold = 0 embarks = "Submarine" disembarks = "Submarine" -targets = "LandRail" +targets = "LandRail", "Space" flags = "NeverProtects", "FieldUnit", "OneAttack", "HasNoZOC", "Unbribable", "CantReachAir", "Missile", "NeverBlocked", "WillNever" roles = "" helptext = _("\ A Cruise Missile can strike distant targets. It\ - cannot attack Air units, but Air units never block\ + can’t attack Air units, but Air units never block\ a strike on reachable surface units. Cruise Missiles\ can be relocated by ending their turn on a city,\ airbase, Submarine, Missile Destroyer, AEGIS Cruiser,\ - Carrier, or Mobile SAM. A Cruise Missile cannot\ + Carrier, or Mobile SAM. A Cruise Missile can’t\ block attacks on other units on its tile.\ ") @@ -3752,7 +4517,7 @@ class = "Bomb" tech_req = "Nuclear Fission" obsolete_by = "None" graphic = "u.atom_bomb" -graphic_alt = "u.nuclear" +graphic_alt = "-" sound_move = "m_atom_bomb" sound_move_alt = "m_generic" sound_fight = "f_atom_bomb" @@ -3771,8 +4536,8 @@ uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Balloon", "Helicopter", "Air", "AirProtect", "AirPillage", "Missile", "Submarine", "LandRail","LandRoad" -disembarks = "Air", "AirPillage" +targets = "Balloon", "Helicopter", "Air", "AirProtect", "Air_High_Altitude", "Missile", "Submarine", "LandRail", "LandRoad", "Space", "Zeppelin" +disembarks = "Air", "Air_High_Altitude" flags = "NeverProtects", "FieldUnit", "OneAttack", "Nuclear", "HasNoZOC", "Unbribable", "NeverBlocked", "WillNever", "NoVeteran" ; No veteran levels (level name is never displayed) @@ -3786,7 +4551,7 @@ helptext = _("\ If you have Nuclear Fission and the Manhattan Project has been built by any player, you can make Atom Bombs.\ A Bomber can drop it within two tiles of its location. Unload the bomb and fly the Bomber out of range, then\ attack the target (or detonate by pressing D twice.) The blast destroys ALL cardinally adjacent tiles. City population\ - is reduced by half. Land tiles may get nuclear fallout.\ + is reduced by half. Land tiles may get nuclear fallout. \ "), _("\ Fallout reduces tile output and increases risk of nuclear winter.\ ") @@ -3799,7 +4564,7 @@ tech_req = "Fusion Power" impr_req = "Enrichment Facility" obsolete_by = "None" graphic = "u.hbomb" -graphic_alt = "u.nuclear" +graphic_alt = "-" sound_move = "m_atom_bomb" sound_move_alt = "m_generic" sound_fight = "f_atom_bomb" @@ -3818,8 +4583,8 @@ uk_happy = 2 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Balloon", "Helicopter", "Air", "AirProtect", "AirPillage", "Missile", "Submarine", "LandRail", "LandRoad" -disembarks = "Air", "AirPillage" +targets = "Balloon", "Helicopter", "Air", "AirProtect", "Air_High_Altitude", "Missile", "Submarine", "LandRail", "LandRoad", "Space", "Zeppelin" +disembarks = "Air", "Air_High_Altitude" flags = "NeverProtects", "FieldUnit", "OneAttack", "Nuclear", "HasNoZOC", "Unbribable", "NeverBlocked", "WillNever", "NoVeteran" ; No veteran levels (level name is never displayed) @@ -3832,9 +4597,9 @@ roles = "" helptext = _("\ Hydrogen Bombs make Atom Bombs seem tame. Any unprotected city at Ground Zero will be absolutely annihilated.\ In other cities in the blast radius, population is reduced by about 75%. Blast area is 21 tiles:\ - the same area as an entire city (5×5 minus the corners.) All units within the blast are destroyed.\n\ + the same area as an entire city (5×5 minus the corners.) All units within the blast are destroyed. \n\ A Bomber can drop a Hydrogen Bomb within two tiles of its location. Unload the bomb, fly the Bomber out of\ - range, then detonate by pressing D twice.\n\ + range, then detonate by pressing D twice. \n\ If you have Fusion Power and the Manhattan Project was built, a Hydrogen Bomb\ can be made in a city with an Enrichment Facility. \ "), _("\ @@ -3849,7 +4614,7 @@ tech_req = "Fusion Power" impr_req = "Enrichment Facility" obsolete_by = "None" graphic = "u.ddomb" -graphic_alt = "u.atom_bomb" +graphic_alt = "-" sound_move = "m_atom_bomb" sound_move_alt = "m_generic" sound_fight = "f_atom_bomb" @@ -3868,8 +4633,8 @@ uk_happy = 4 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Balloon", "Helicopter", "Air", "AirProtect", "AirPillage", "Missile", "Submarine", "LandRail", "LandRoad" -disembarks = "Air", "AirPillage" +targets = "Balloon", "Helicopter", "Air", "AirProtect", "Air_High_Altitude", "Missile", "Submarine", "LandRail", "LandRoad", "Space", "Zeppelin" +disembarks = "Air", "Air_High_Altitude" flags = "NeverProtects", "FieldUnit", "OneAttack", "Nuclear", "HasNoZOC", "Unbribable", "NeverBlocked", "WillNever", "Unique", "NoVeteran" ; No veteran levels (level name is never displayed) @@ -3883,15 +4648,15 @@ helptext = _("\ The Doomsday Bomb is the mother of all bombs. Blast area is about 100 tiles.\ Only one can be made at a time. A city at Ground Zero will be\ annihilated. Other cities in the blast area lose about 75% of their population.\ - All units within the blast are completely destroyed.\n\ + All units within the blast are completely destroyed. \n\ A Bomber can drop the Bomb within two tiles of its location. Unload the Bomb and\ - pray that you can fly the Bomber out of range. Detonate by pressing D twice.\n\ + pray that you can fly the Bomber out of range. Detonate by pressing D twice. \n\ If you have Fusion Power and the Manhattan Project was built, a Doomsday Bomb\ can be made in a city with an Enrichment Facility. \ "), _("\ The Fallout from a Doomsday Bomb is a sure ticket to Nuclear Winter.\ ") -bombard_rate = 25 ; radius = sqrt(27) = 5.19 +bombard_rate = 27 ; radius = sqrt(25) = 5.19 [unit_nuclear_missile] name = _("Nuclear Missile") @@ -3920,7 +4685,7 @@ uk_food = 0 uk_gold = 0 embarks = "Submarine" disembarks = "Submarine" -targets = "Balloon", "Helicopter", "Air", "AirProtect", "AirPillage", "Missile", "Submarine", "LandRail", "LandRoad" +targets = "Balloon", "Helicopter", "Air", "AirProtect", "Air_High_Altitude", "Missile", "Submarine", "LandRail", "LandRoad", "Space", "Zeppelin" flags = "NeverProtects", "FieldUnit", "OneAttack", "Nuclear", "HasNoZOC", "Unbribable", "NeverBlocked", "WillNever", "NoVeteran" ; No veteran levels (level name is never displayed) @@ -3933,11 +4698,11 @@ roles = "" helptext = _("\ If you have Space Flight and the Manhattan Project has been built by any player, you can make Nuclear Missiles.\ Nuclear blasts destroy ALL units in a 3×3 area. City population is reduced by half. Land tiles may get nuclear fallout.\ - Fallout reduces tile output and increases risk of nuclear winter.\ + Fallout reduces tile output and increases risk of nuclear winter. \ "), _("\ If Fallout is cleaned on the turn it appears, the chance of nuclear winter is reduced.\ ") -bombard_rate = 0 ; default sq_radius of 2: every adjacent tile. +bombard_rate = 0 ; default sq_radius of 2:every adjacent tile. [unit_tactical_nuke] name = _("Tactical Nuke") @@ -3951,7 +4716,7 @@ sound_move = "m_nuclear" sound_move_alt = "m_generic" sound_fight = "f_nuclear" sound_fight_alt = "f_generic" -build_cost = 140 +build_cost = 130 pop_cost = 0 attack = 100 defense = 0 @@ -3967,7 +4732,7 @@ uk_food = 0 uk_gold = 0 embarks = "Submarine" disembarks = "Submarine" -targets = "Balloon", "Helicopter", "Air", "AirProtect", "AirPillage", "Missile", "Submarine", "LandRail", "LandRoad" +targets = "Balloon", "Helicopter", "Air", "AirProtect", "Air_High_Altitude", "Missile", "Submarine", "LandRail", "LandRoad", "Space", "Zeppelin" flags = "NeverProtects", "FieldUnit", "OneAttack", "Nuclear", "HasNoZOC", "Unbribable", "NeverBlocked", "WillNever", "NoVeteran" ; No veteran levels (level name is never displayed) @@ -3981,11 +4746,11 @@ helptext = _("\ Tactical Nukes are very small warheads attached to missiles. A Tactical Nuke destroys all units on\ a single tile. City population is reduced by half. The target tile may get Fallout. In theory,\ Tactical Nukes are small enough to get the advantages of nuclear armaments without the severity of\ - consequences. In reality, they might be a gateway that escalates toward mutual assured destruction.\n\ + consequences. In reality, they might be a gateway that escalates toward mutual assured destruction. \n\ If you have Fusion Power and the Manhattan Project was built, a Tactical Nuke\ can be made in a city with an Enrichment Facility. \ ") -bombard_rate = -2 ; 2 - 2 = 0: only nukes target tile. +bombard_rate = -2 ; 2 - 2 = 0:only nukes target tile. [unit_diplomat] name = _("Diplomat") @@ -3998,11 +4763,11 @@ sound_move = "m_diplomat" sound_move_alt = "m_generic" sound_fight = "f_diplomat" sound_fight_alt = "f_generic" -build_cost = 30 +build_cost = 26 pop_cost = 0 attack = 0 defense = 0 -hitpoints = 10 +hitpoints = 8 firepower = 1 move_rate = 4 vision_radius_sq = 4 @@ -4014,7 +4779,7 @@ uk_food = 0 uk_gold = 0 embarks = "LandRail", "Helicopter" ; transport helicopter only disembarks = "LandRail", "Helicopter" -flags = "Diplomat", "IgZOC", "NonMil", "HasNoZOC", "Expellable" +flags = "Diplomat", "IgZOC", "NonMil", "HasNoZOC", "Expellable", "Cant_Pillage", "CanClaim", "Settlers" veteran_names = _("?diplomatic_rank:attaché"), _("?diplomatic_rank:secretary"), @@ -4024,16 +4789,20 @@ veteran_names = _("?diplomatic_rank:statesman"), _("?diplomatic_rank:plenipotentiary") -veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_base_raise_chance = 60, 50, 40, 30, 20, 15, 0 veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 veteran_power_fact = 100, 110, 115, 120, 125, 130, 135 -veteran_move_bonus = 0, 0, 0, 0, 0, 0, 0 +veteran_move_bonus = 0, 0, 0, 0, 3, 3, 3 roles = "DiplomatStartUnit" helptext = _("\ -A Diplomat performs official or covert actions. Covert acts make incidents\ - which let Senates break treaties. Diplomats in cities defend such acts with\ - combat. Diplomats can • Bribe a lone unit • Establish embassy • Investigate City\ - • Sabotage production/buildings • Steal tech • Steal maps • Incite city revolt.\n\ +A Diplomat performs official or covert actions. Covert actions make incidents\ + which let Senates break treaties. Diplomats in cities may defend such acts with\ + diplomatic combat. Diplomats can • Bribe a lone unit • Establish embassy • Investigate City\ + • Sabotage random production or buildings • Steal tech • Steal maps • Incite city revolt. \n\ +Except for Bribing and Investigate City, diplomatic actions will spend the Diplomat,\ + making it unavailable for further use. Diplomats may claim a tile for your nation\ + if adjacent to a tile claim made inside your own national border. Foreign tile claims require\ + the Diplomat be accompanied by another unit.\ "), _("\ Full rules for Diplomats are in the Manual.\ ") @@ -4053,7 +4822,7 @@ build_cost = 35 pop_cost = 0 attack = 0 defense = 0 -hitpoints = 10 +hitpoints = 8 firepower = 1 move_rate = 6 vision_radius_sq = 8 @@ -4065,7 +4834,7 @@ uk_food = 0 uk_gold = 0 embarks = "LandRail", "Helicopter" ; transport helicopter only disembarks = "LandRail", "Helicopter" -flags = "Diplomat", "IgZOC", "NonMil", "HasNoZOC", "Spy", "Expellable" +flags = "Diplomat", "IgZOC", "NonMil", "HasNoZOC", "Spy", "Expellable", "CanClaim", "Settlers" veteran_names = _("?spy_level:informant"), _("?spy_level:handler"), @@ -4074,19 +4843,22 @@ veteran_names = _("?spy_level:secret agent"), _("?spy_level:neutralizer"), _("?spy_level:spymaster") - -veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 + +veteran_base_raise_chance = 60, 50, 40, 30, 20, 15, 0 veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 veteran_power_fact = 100, 110, 115, 120, 125, 130, 135 -veteran_move_bonus = 0, 0, 0, 0, 0, 0, 0 +veteran_move_bonus = 0, 0, 0, 0, 3, 3, 3 roles = "DiplomatStartUnit" helptext = _("\ -Spies can do what a Diplomat can, and also: • Survive ops\ +Spies can do what a Diplomat can, and also:• Survive ops\ • Sabotage lone units • Poison city water • Steal specific tech\ - • Steal tech from cities more than once • Sabotage specific targets in cities.\ + • Steal tech from cities more than once • Sabotage specific targets in cities. \ "), _("\ Spies who survive ops escape to the nearest friendly city. Spies have\ - a 25% advantage over Diplomats in combat: a base 75% chance to win.\ + a 25% advantage over Diplomats in combat:a base 75% chance to win.\ + Spies may claim a tile for your nation if adjacent to a tile claim made\ + inside your own national border. Tile claims require the Spy to be accompanied\ + by another unit.\ Full rules are in the Manual.\ ") @@ -4094,7 +4866,7 @@ Spies who survive ops escape to the nearest friendly city. Spies have\ name = _("Caravan") class = "Land" tech_req = "Trade" -obsolete_by = "Freight" +obsolete_by = "Truck" graphic = "u.caravan" graphic_alt = "-" sound_move = "m_caravan" @@ -4109,35 +4881,140 @@ hitpoints = 10 firepower = 1 move_rate = 2 vision_radius_sq = 4 -transport_cap = 0 fuel = 0 uk_happy = 0 uk_shield = 0 uk_food = 0 uk_gold = 0 +transport_cap = 2 +cargo = "Cargo" embarks = "LandRoad", "Helicopter" ; transport helicopter only disembarks = "LandRoad", "Helicopter" -flags = "HelpWonder", "TradeRoute", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Expellable", "Shield2Gold" -roles = "AttackStrongStartUnit" ;note: MP2 doesn't start games with ASSU's so has co-opted this for caravan start unit. +flags = "HelpWonder", "TradeRoute", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Expellable", "Cant_Pillage" +roles = "AttackStrongStartUnit" ;note:MP2 does not start games with ASSUs so has co-opted this for caravan start unit. +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite runner"), + _("?vet_rank:caravaneer"), + _("?vet_rank:master runner"), + _("?vet_rank:zaeim alqafila") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 250, 300, 350, 400 +veteran_move_bonus = 7, 7, 7, 7, 8, 9, 10 helptext = _("\ -Caravans are Commerce units. Commerce units can help build Wonders in any city with whom\ - you are not at war. In foreign cities 12+ tiles distant, they can create Trade Routes,\ +Compared to other early Commerce units, the Caravan is the only one who can\ + travel by land off roads and rails, and cause no military threat to\ + trade partners. It can defend itself and also fortify. They have 2 7/9 moves.\n\ +Commerce units can help build Wonders in any city with whom\ + you are not at war. In foreign cities 15+ tiles distant, they can create Trade Routes,\ increasing net trade in both cities relative to their combined trade. Routes are inactive\ - during war and (re)activate during peace.\n\ -Commerce units can enter the Marketplace of non-hostile foreign cities to sell goods: revenue derives\ - from total trade in both cities. This is only profitable between cities with very high trade.\n\ + during war and (re)activate during peace. \n\ Commerce units can build any Wonders for which you have the tech requirement. To use them\ - for a Trade Route, the Trade tech is needed, and they need to have an assigned Home City.\n\ -➤ Caravans are the only Commerce unit that can be produced more than once per turn, if the city\ - has appropriate output bonuses.\ + for a Trade Route, they need to have given a Home City. \n\ +All Commerce units can carry Goods as cargo.\ ") -[unit_freight] -name = _("Freight") +[unit_wagon] +name = _("Wagon") +class = "LandRoad" +tech_req = "The Wheel" +obsolete_by = "Truck" +graphic = "u.wagon" +graphic_alt = "-" +sound_move = "m_wagon" +sound_move_alt = "m_explorer" +sound_fight = "f_caravan" +sound_fight_alt = "f_generic" +build_cost = 25 +pop_cost = 0 +attack = 0 +defense = 0 +hitpoints = 10 +firepower = 1 +move_rate = 3 +vision_radius_sq = 4 +transport_cap = 2 +fuel = 0 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +cargo = "Land", "Cargo", "LandAirSea" +flags = "HelpWonder", "TradeRoute", "Cant_Fortify", "NonMil", "HasNoZOC", "Capturable", "Expellable", "NoVeteran" +roles = "" +; No veteran levels (level name is never displayed) +veteran_names = _("green") +veteran_base_raise_chance = 0 +veteran_work_raise_chance = 0 +veteran_power_fact = 100 +veteran_move_bonus = 3 +helptext = _("\ +Wagons are the first Commerce unit that can travel by land. Compared to a Caravan, they are defenseless.\ + They must stay on roads and quays. Wagons are useful for\ + transporting slower units. Wagons have 3⅓ move points, giving a range of 10 tiles on roads. \n\ +"), _("\ +Wagons allow units with less than 3 move points to travel your roads faster.\ + Any cargo can board a Wagon anywhere; but needs a city, quay, or base to deboard.\ + Cargo can disembark anywhere, but it uses up all move points. \n\ +Read the help on Caravans to see what Commerce units can do.\ +") + +[unit_train] +name = _("Train") +class = "LandRail" +tech_req = "Railroad" +obsolete_by = "None" +graphic = "u.train" +graphic_alt = "-" +sound_move = "m_train" +sound_move_alt = "m_generic" +sound_fight = "f_generic" +sound_fight_alt = "f_generic" +build_cost = 35 +pop_cost = 0 +attack = 0 +defense = 1 +hitpoints = 30 +firepower = 1 +move_rate = 4 +vision_radius_sq = 4 +transport_cap = 6 +fuel = 0 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +cargo = "Land", "LandAirSea", "Balloon", "Bomb", "Cargo", "Zeppelin" +flags = "HelpWonder", "TradeRoute", "NonMil", "HasNoZOC", "Cant_Fortify", "NoVeteran", "Capturable" +; No veteran levels (level name is never displayed) +veteran_names = _("green") +veteran_base_raise_chance = 0 +veteran_work_raise_chance = 0 +veteran_power_fact = 100 +veteran_move_bonus = 0 +roles = "" +helptext = _("\ +Trains are Commerce units with a bonus:they allow units with less than 3 move points\ + to travel your rails at distances comparable to other units. Transport logistics for\ + Trains are more restricted than for Wagons and Trucks. Except for Foot soldiers,\ + all units need to be in a city to get on or off a Train. \n\ +Foot Soldiers use Trains the same as Wagons and Trucks, and can: \n\ + 1. Board anywhere; \n 2. Deboard in a Base or Quay.; \n\ + 3. Disembark outside a City (loses all moves.) \n\n\ +On non-allied foreign rails, Trains incur full terrain movement cost.\ + Pre-gunpowder units can’t attack Trains. \n\n\ +Electricity and Combustion each give Trains an additional +1 move.\ +") + +[unit_truck] +name = _("Truck") class = "LandRoad" tech_req = "The Corporation" obsolete_by = "None" -graphic = "u.freight" +graphic = "u.truck" graphic_alt = "-" sound_move = "m_freight" sound_move_alt = "m_generic" @@ -4147,22 +5024,112 @@ build_cost = 50 pop_cost = 0 attack = 0 defense = 1 -hitpoints = 10 +hitpoints = 20 firepower = 1 -move_rate = 4 +move_rate = 6 vision_radius_sq = 4 +transport_cap = 3 +fuel = 0 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +cargo = "Land", "LandAirSea", "Bomb", "Cargo" +flags = "HelpWonder", "TradeRoute", "NonMil", "HasNoZOC", "Capturable", "Expellable", "NoVeteran", "Cant_Pillage" +roles = "" +helptext = _("\ +The Truck replaces the Caravan as the basic Commerce unit on Land. It moves at\ + more than twice the speed; but is restricted to the same roads and quays\ + as Wagons, and can't use rails. Each Truck used to build a Wonder\ + will add 50 shields. See the entry on Caravan to read what Commerce units may do. \n\ +"), _("\ +Trucks allow units with less than 3 move points to travel your roads faster: Like\ + the Wagon, any cargo can board a Truck anywhere, but a city, quay, or base is\ + needed to deboard. Disembarking is legal for all cargo types, but uses up all\ + moves (except Marines.)\ +") + +[unit_goods] +name = _("Goods") +class = "Cargo" +tech_req = "Currency" +obsolete_by = "Freight" +graphic = "u.amphorae" +graphic_alt = "-" +sound_move = "m_generic" +sound_move_alt = "m_generic" +sound_fight = "f_generic" +sound_fight_alt = "f_generic" +build_cost = 25 +pop_cost = 0 +attack = 0 +defense = 0 +hitpoints = 1 +firepower = 1 +move_rate = 1 +vision_radius_sq = 2 transport_cap = 0 fuel = 0 uk_happy = 0 uk_shield = 0 uk_food = 0 uk_gold = 0 -flags = "HelpWonder", "TradeRoute", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Expellable" +flags = "TradeRoute", "NonMil", "HasNoZOC", "Capturable", "Cant_Fortify", "NoVeteran", "Cant_Pillage" roles = "" helptext = _("\ -The Freight unit replaces the Caravan as the basic Commerce unit on Land. It moves at\ - twice the speed, but must stay on roads. Each Freight used to build a wonder will add\ - 50 shields. See the entry on Caravan to read what Commerce units may do.\ +Goods are commodities.\ + The cargo containers of the ancient world were amphorae, which carried\ + trade goods. \n\ +Goods can be used to establish Trade Routes. They can\ + be carried by Commerce units, allowing you to establish multiple\ + trade routes in one voyage. Also, Goods can Recycle Production with only\ + a 25% penalty, rendering 19 shields into a city production target. \n\ +"), _("\ +By themselves, Goods can only move onto tiles with a City, Quay, Fortress,\ + Airbase, or Naval Base. Commerce units, Tribesmen, and Galleons must carry them as cargo.\ + If adjacent to a foreign city, use the Do command (D) for Commerce functions.\ +") + +[unit_freight] +name = _("Freight") +class = "Cargo" +tech_req = "Mass Production" +obsolete_by = "None" +graphic = "u.container" +graphic_alt = "u.freight" +sound_move = "m_generic" +sound_move_alt = "m_generic" +sound_fight = "f_generic" +sound_fight_alt = "f_generic" +build_cost = 25 +pop_cost = 0 +attack = 0 +defense = 0 +hitpoints = 1 +firepower = 1 +move_rate = 1 +vision_radius_sq = 2 +transport_cap = 0 +fuel = 0 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +disembarks = "Air", "LandRoad", "LandRail", "Sea", "RiverShip" +flags = "HelpWonder", "TradeRoute", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Cant_Fortify", "NoVeteran", "Cant_Pillage" +roles = "" +helptext = _("\ +The methodical logistics of modern shipping render the Freight unit:a cargo\ + container separate from the transport vehicle. Freight brings benefits of\ + organized efficiency. Like all Commerce units, it can Help Build\ + Wonders, and Establish Trade Route.\ + Unlike other Commerce units, it can Disband to Recycle Production with\ + no net loss in shields. This gives Freight a variety of creative industrial uses. \n\ +"), _("\ +By itself, Freight is only able to move to tiles with loading infrastructure:\ + Cities, Quays, Fortresses, Airbases, and Naval Bases. To be transported, it must be carried\ + by Train, Truck, Airplane, or ship. If adjacent to a foreign city, use the D key to\ + do Commerce functions.\ ") [unit_explorer] @@ -4176,7 +5143,7 @@ sound_move = "m_explorer" sound_move_alt = "m_generic" sound_fight = "f_explorer" sound_fight_alt = "f_generic" -build_cost = 25 +build_cost = 20 pop_cost = 0 attack = 0 defense = 1 @@ -4192,55 +5159,17 @@ uk_food = 0 uk_gold = 0 embarks = "LandRoad", "Helicopter" ; transport helicopter only disembarks = "LandRoad", "Helicopter" -flags = "IgTer", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Expellable" +flags = "IgTer", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Expellable", "Cant_Pillage", "NoHome" roles = "Explorer", "ExplorerStartUnit" helptext = _("\ Explorers are brave individuals who map unknown territory. They can slip through enemy\ - ZOC, and have no unit upkeep.\ -") - -[unit_train] -name = _("Train") -class = "LandRail" -tech_req = "Railroad" -obsolete_by = "None" -graphic = "u.train" -graphic_alt = "u.transport" -sound_move = "m_train" -sound_move_alt = "m_generic" -sound_fight = "f_generic" -sound_fight_alt = "f_generic" -build_cost = 35 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 30 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 6 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 1 -cargo = "Land", "LandAirSea", "Balloon", "Bomb", "LandRoad" -flags = "HelpWonder", "TradeRoute", "NonMil", "HasNoZOC", "NoVeteran", "Capturable" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_base_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "" -helptext = _("\ -Trains are Commerce units with a bonus: they allow units with 2 or less\ - move points to travel your rails at distances comparable to other units. Only Foot Soldiers\ - can:\n1. load outside a city or base;\n2. unload (T) in a base;\n3.step off the Train outside a city\ - (loses all moves.)\nAll other units must load/unload inside a city.\n\n\ -On non-allied foreign rails, Trains incur full terrain movement cost.\ - Pre-gunpowder units can't attack Trains.\n\n\ -Electricity and Combustion each give Trains an additional +1 move.\ + ZOC, and, like Tribesmen, ignore all terrain penalties; basically, treating every tile\ + as if it had a road, they can move 6 tiles per turn. As a non-military traveler, they\ + can also visit far off cities to Investigate City and gather intel. Sometimes generals\ + will use their scouting information for strategic advantage. Explorers can make contact\ + with far-off lands to arrange cease-fire or peace. Best of all, Explorers live off the\ + land and have no unit upkeep. In later times, Explorers upgrade to Partisans. For\ + all these reasons, the Explorer is perhaps one of the most undervalued of all units.\ ") [unit_leader] @@ -4249,7 +5178,7 @@ class = "Land" tech_req = "None" obsolete_by = "None" graphic = "u.leader" -graphic_alt = "u.explorer" +graphic_alt = "-" sound_move = "m_leader" sound_move_alt = "m_generic" sound_fight = "f_leader" @@ -4281,9 +5210,9 @@ veteran_power_fact = 100 veteran_move_bonus = 0 roles = "KingStartUnit" helptext = _("\ -This is you. If you lose this unit, you lose the game.\ +This is you. If you lose this unit, you lose the game. \ "), _("\ -Will not unleash barbarians from huts.\ +Will not unleash barbarians from huts. \ "), _("\ You can use the DO command to change the gender of the Leader.\ ") @@ -4327,14 +5256,13 @@ veteran_move_bonus = 0 roles = "KingStartUnit" helptext = _("\ (Alternate form of Leader. Behaves identically in-game.)\ - This is you. If you lose this unit, you lose the game.\ + This is you. If you lose this unit, you lose the game. \ "), _("\ -Will not unleash barbarians from huts.\ +Will not unleash barbarians from huts. \ "), _("\ You can use the DO command to change the gender of the Leader.\ ") - [unit_barbarian_leader] name = _("Barbarian Leader") class = "Land" @@ -4371,8 +5299,426 @@ veteran_move_bonus = 0 roles = "BarbarianLeader" helptext = _("\ One Barbarian Leader appears every time there is a barbarian uprising\ - somewhere in the world.\ + somewhere in the world. \ "), _("\ When a Barbarian Leader is killed on a tile without any defending units,\ the 100 gold ransom is paid, but only to land units and helicopters.\ ") + +[unit_peasants] +name = _("Peasants") +class = "Land" +tech_req = "Monarchy" +gov_req = "Monarchy" +impr_req = "Magna Carta" +obsolete_by = "None" +graphic = "u.peasants" +graphic_alt = "u.migrants" +sound_move = "m_worker" +sound_move_alt = "m_generic" +sound_fight = "f_worker" +sound_fight_alt = "f_generic" +build_cost = 10 +pop_cost = 1 +attack = 0 +defense = 1 +hitpoints = 8 +firepower = 1 +move_rate = 2 +vision_radius_sq = 4 +transport_cap = 0 +fuel = 0 +city_size = 1 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only +disembarks = "LandRoad", "LandRail", "Helicopter" +flags = "Cant_Fortify", "NonMil", "HasNoZOC", "AddToCity", "Capturable", "Expellable", "Cant_Pillage", "MultiSlot" +; No veteran levels (level name is never displayed) +veteran_names = _("green") +veteran_base_raise_chance = 0 +veteran_work_raise_chance = 0 +veteran_power_fact = 100 +veteran_move_bonus = 0 +helptext = _("\ +Population Cost: 1. Adds Population: 1.\n\n\ +Peasants are the common people of Monarchies. You can encourage them\ + by royal edict to migrate to other cities and help colonize new\ + areas. But to have such access, you must be a Constitutional Monarchy\ + with the Magna Carta wonder: Peasants can only be made in\ + the city with Magna Carta, so choose that city carefully. \n\ +If managed correctly, Peasants can increase your national population\ + growth. They give a tremendous advantage for growing new colonies\ + and settlements faster. \n\ +Peasants can only be made in one city, but you can make more than one per\ + turn under the right conditions. When a city completes a unit, it will try\ + to make more of them if it doesn’t have a worklist. So be careful!\ +") + +;*** This unit can be turned on by uncommenting this, the Virtual class above, and adding "Virtual" as native to oceanic tiles +;*** in terrain.ruleset. +;[unit_sonar] +;name = _("Sonar Ping") +;class = "Virtual" +;tech_req = "Radar" +;obsolete_by = "None" +;graphic = "u.sonar" +;graphic_alt = "-" +;sound_move = "m_sonar" +;sound_move_alt = "m_generic" +;sound_fight = "f_generic" +;sound_fight_alt = "f_generic" +;build_cost = 1 +;pop_cost = 0 +;attack = 0 +;defense = 0 +;hitpoints = 1 +;firepower = 1 +;move_rate = 6 +;vision_radius_sq = 2 +;transport_cap = 0 +;fuel = 1 +;uk_happy = 0 +;uk_shield = 0 +;uk_food = 0 +;uk_gold = 0 +;vision_layer = "Subsurface" +;embarks = "Sea" +;disembarks = "Sea" +;flags = "IgZOC", "IgTer", "NonMil", "HasNoZOC", "Unbribable", "WillNever", "NoHome", "NoVeteran", "MultiSlot" +;helptext = _("\ +;A Sonar Ping represents active focusing of ship sonar on a\ +; specific area. Destroyer class and AEGIS Cruisers may take\ +; this virtual unit as cargo. Then the ship can send the\ +; Sonar Ping virtual unit out to sea, manually directing the\ +; focus of the sonar investigation. The virtual unit must end\ +; its turn back on the ship, or sonar capability is lost. \ +;"), _("\ +;This unit can be made with other units in the same turn, and can be\ +; made multiple times in a turn.\ +;") + +[unit_animal_wolf] +name = _("[Wolf]") +class = "Land" +tech_req = "None" +obsolete_by = "None" +graphic = "u.wolf" +graphic_alt = "-" +sound_move = "m_generic" +sound_move_alt = "m_generic" +sound_fight = "f_generic" +sound_fight_alt = "f_generic" +build_cost = 10 +pop_cost = 0 +attack = 2 +defense = 1 +hitpoints = 5 +firepower = 1 +move_rate = 2 +vision_radius_sq = 2 +transport_cap = 0 +fuel = 0 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +flags = "NoBuild", "Cant_Fortify", "Unbribable", "IgZOC", "HasNoZOC", "SuperSpy", "NoVeteran", "Cant_Pillage" +roles = "Barbarian" +helptext = _("\ +Watch out for wild animals. \ +"), _("\ +Wolves are mean wild ancestors of dogs, who hunt grasslands and hills.\ +") +[unit_animal_leopard] +name = _("[Leopard]") +class = "Land" +tech_req = "None" +obsolete_by = "None" +graphic = "u.leopard" +graphic_alt = "-" +sound_move = "m_generic" +sound_move_alt = "m_generic" +sound_fight = "f_generic" +sound_fight_alt = "f_generic" +build_cost = 10 +pop_cost = 0 +attack = 2 +defense = 1 +hitpoints = 4 +firepower = 1 +move_rate = 2 +vision_radius_sq = 2 +transport_cap = 0 +fuel = 0 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +flags = "NoBuild", "Cant_Fortify", "Unbribable", "IgZOC", "HasNoZOC", "SuperSpy", "NoVeteran", "Cant_Pillage" +roles = "Barbarian" +helptext = _("\ +Watch out for wild animals. \ +"), _("\ +Leopards are mean wild cats, who hunt in the forests.\ +") +[unit_animal_tiger] +name = _("[Tiger]") +class = "Land" +tech_req = "None" +obsolete_by = "None" +graphic = "u.tiger" +graphic_alt = "-" +sound_move = "m_generic" +sound_move_alt = "m_generic" +sound_fight = "f_generic" +sound_fight_alt = "f_generic" +build_cost = 10 +pop_cost = 0 +attack = 2 +defense = 1 +hitpoints = 5 +firepower = 1 +move_rate = 2 +vision_radius_sq = 2 +transport_cap = 0 +fuel = 0 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +flags = "NoBuild", "Cant_Fortify", "Unbribable", "IgZOC", "HasNoZOC", "SuperSpy", "NoVeteran", "Cant_Pillage" +roles = "Barbarian" +helptext = _("\ +Watch out for wild animals. \ +"), _("\ +Tigers are mean wild cats, who hunt in the jungles.\ +") +[unit_animal_lion] +name = _("[Lion]") +class = "Land" +tech_req = "None" +obsolete_by = "None" +graphic = "u.lion" +graphic_alt = "-" +sound_move = "m_generic" +sound_move_alt = "m_generic" +sound_fight = "f_generic" +sound_fight_alt = "f_generic" +build_cost = 10 +pop_cost = 0 +attack = 2 +defense = 1 +hitpoints = 5 +firepower = 1 +move_rate = 2 +vision_radius_sq = 2 +transport_cap = 0 +fuel = 0 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +flags = "NoBuild", "Cant_Fortify", "Unbribable", "IgZOC", "HasNoZOC", "SuperSpy", "NoVeteran", "Cant_Pillage" +roles = "Barbarian" +helptext = _("\ +Watch out for wild animals. \ +"), _("\ +Lions hunt the savannahs and plains.\ +") +[unit_animal_bear] +name = _("[Bear]") +class = "Land" +tech_req = "None" +obsolete_by = "None" +graphic = "u.bear" +graphic_alt = "-" +sound_move = "m_generic" +sound_move_alt = "m_generic" +sound_fight = "f_generic" +sound_fight_alt = "f_generic" +build_cost = 10 +pop_cost = 0 +attack = 2 +defense = 2 +hitpoints = 6 +firepower = 1 +move_rate = 2 +vision_radius_sq = 2 +transport_cap = 0 +fuel = 0 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +flags = "NoBuild", "Cant_Fortify", "Unbribable", "IgZOC", "HasNoZOC", "SuperSpy", "NoVeteran", "Cant_Pillage" +roles = "Barbarian" +helptext = _("\ +Watch out for wild animals. \ +"), _("\ +Bears live in the mountains.\ +") +[unit_animal_crocodile] +name = _("[Crocodile]") +class = "Land" +tech_req = "None" +obsolete_by = "None" +graphic = "u.crocodile" +graphic_alt = "-" +sound_move = "m_generic" +sound_move_alt = "m_generic" +sound_fight = "f_generic" +sound_fight_alt = "f_generic" +build_cost = 10 +pop_cost = 0 +attack = 2 +defense = 1 +hitpoints = 6 +firepower = 1 +move_rate = 1 +vision_radius_sq = 2 +transport_cap = 0 +fuel = 0 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +flags = "NoBuild", "Cant_Fortify", "Unbribable", "IgZOC", "HasNoZOC", "SuperSpy", "NoVeteran", "Cant_Pillage" +roles = "Barbarian" +helptext = _("\ +Watch out for wild animals. \ +"), _("\ +Crocodiles live in the swamps, where they wait to catch and eat prey.\ +") +[unit_animal_hippo] +name = _("[Hippo]") +class = "Sea" +tech_req = "None" +obsolete_by = "None" +graphic = "u.hippo" +graphic_alt = "-" +sound_move = "m_generic" +sound_move_alt = "m_generic" +sound_fight = "f_generic" +sound_fight_alt = "f_generic" +build_cost = 10 +pop_cost = 0 +attack = 1 +defense = 1 +hitpoints = 9 +firepower = 1 +move_rate = 1 +vision_radius_sq = 2 +transport_cap = 0 +fuel = 0 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +flags = "NoBuild", "Cant_Fortify", "Unbribable", "IgZOC", "HasNoZOC", "SuperSpy", "NoVeteran", "Cant_Pillage" +roles = "Barbarian" +helptext = _("\ +Watch out for wild animals. \ +"), _("\ +Hippos live in shallow smaller lakes.\ +") +[unit_animal_rhino] +name = _("[Rhino]") +class = "Land" +tech_req = "None" +obsolete_by = "None" +graphic = "u.rhino" +graphic_alt = "-" +sound_move = "m_generic" +sound_move_alt = "m_generic" +sound_fight = "f_generic" +sound_fight_alt = "f_generic" +build_cost = 10 +pop_cost = 0 +attack = 1 +defense = 2 +hitpoints = 6 +firepower = 1 +move_rate = 2 +vision_radius_sq = 2 +transport_cap = 0 +fuel = 0 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +flags = "NoBuild", "Cant_Fortify", "Unbribable", "IgZOC", "HasNoZOC", "SuperSpy", "NoVeteran", "Cant_Pillage" +roles = "Barbarian" +helptext = _("\ +Watch out for wild animals. \ +"), _("\ +Rhinos roam the edge of the deserts.\ +") +[unit_animal_polarbear] +name = _("[Polar Bear]") +class = "Land" +tech_req = "None" +obsolete_by = "None" +graphic = "u.polar_bear" +graphic_alt = "-" +sound_move = "m_generic" +sound_move_alt = "m_generic" +sound_fight = "f_generic" +sound_fight_alt = "f_generic" +build_cost = 10 +pop_cost = 0 +attack = 2 +defense = 1 +hitpoints = 6 +firepower = 1 +move_rate = 1 +vision_radius_sq = 2 +transport_cap = 0 +fuel = 0 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +flags = "NoBuild", "Cant_Fortify", "Unbribable", "IgZOC", "HasNoZOC", "SuperSpy", "NoVeteran", "Cant_Pillage" +roles = "Barbarian" +helptext = _("\ +Watch out for wild animals. \ +"), _("\ +Polar Bears live in the tundra and frozen arctic. They think of people as food.\ +") +[unit_animal_giantsquid] +name = _("[Giant Squid]") +class = "Sea" +tech_req = "None" +obsolete_by = "None" +graphic = "u.squid" +graphic_alt = "-" +sound_move = "m_generic" +sound_move_alt = "m_generic" +sound_fight = "f_generic" +sound_fight_alt = "f_generic" +build_cost = 10 +pop_cost = 0 +attack = 1 +defense = 1 +hitpoints = 9 +firepower = 1 +move_rate = 2 +vision_radius_sq = 2 +transport_cap = 0 +fuel = 0 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +flags = "NoBuild", "Cant_Fortify", "Unbribable", "IgZOC", "HasNoZOC", "SuperSpy", "NoVeteran", "Cant_Pillage" +roles = "Barbarian" +helptext = _("\ +Watch out for wild animals. \ +"), _("\ +Giant Squids live out at sea; they do not come near shore or shallow waters. Avoid them at all costs.\ +") + +;THIS LINE RESERVED FOR NECESSARY BLANK END OF LINE: diff --git a/freeciv/freeciv/data/ag2.serv b/freeciv/freeciv/data/mp2c-occ.serv similarity index 84% rename from freeciv/freeciv/data/ag2.serv rename to freeciv/freeciv/data/mp2c-occ.serv index 6f921ee2d..f6763228d 100644 --- a/freeciv/freeciv/data/ag2.serv +++ b/freeciv/freeciv/data/mp2c-occ.serv @@ -1,6 +1,6 @@ # Server commands to make multiplayer-evo Freeciv rules # -rulesetdir ag2 +rulesetdir mp2c-occ # changed game settings are defined in game.ruleset diff --git a/freeciv/freeciv/data/mp2c-occ/(un)Load (de)Board (dis)Embark rules.txt b/freeciv/freeciv/data/mp2c-occ/(un)Load (de)Board (dis)Embark rules.txt new file mode 100644 index 000000000..ca1daca08 --- /dev/null +++ b/freeciv/freeciv/data/mp2c-occ/(un)Load (de)Board (dis)Embark rules.txt @@ -0,0 +1,134 @@ +Load/Unload Board/Deboard Rules +============================================================================ +THESE ARE GOALS TO IMPLEMENT FOR THE MIGRATION FROM CLIENT HARD-CODING TO +USING THE RULESET FOR TRANSPORT LOGISTICS CONTROL. + +Transport swapping +============================================================================ +Transport swapping at sea between Ship types (maybe create a "Ship" flag) +OR between RiverShip class on a river: + uses all moves; EXCEPT: + LandAirSea, uses 1 5/9 moves + can't be done if cargo has no moves left + +Transport swapping on SHIP units in a Quay, Naval Base, City + Legal, uses no moves + +Transport swapping on other transporters: + Legal in all cases where Unload is legal (assumes Load is also legal) + +Disembarking and Embarking +============================================================================= +Disembarking LandAirSea to adjacent transport on blank sea tile should cost 1 5/9 moves, not 1 move. + +"Unload" can be thought of as "Disembark to same tile" and can get a twin actionenabler + in all cases where Disembark adjacent is allowed, with same move_cost. + + +Wagon type: + Allowed for all at full cost to all units (except LandAirSea) + This means an making an "Unload" enabler for emulating "Disembark to same tile" + LandAirSea costs 1 move for each. + +Truck type: + Disallowed except for Foot Soldiers, costs full moves. + This means an making an "Unload" enabler for emulating "Disembark to same tile" + LandAirSea costs 1 move for each. + +LandRail class: + Disallowed except for Foot Soldiers, costs full moves. + This means an making an "Unload" enabler for emulating "Disembark to same tile" + LandAirSea costs 1 move for each. + +Helicopter class: + Allowed only for "Foot" and Artillery types, at full cost (emulating disembark to same tile) + + +Boarding/Loading +============================================================================= +note: if it's legal cargo server already allows it. If not, it doesn't. +Forbid only cases the ruleset wants to "outlaw": + +Wagons + Unit Types with less than 3 moves can do the Board command AND Cargo-class, all else cannot: + If we can't check base move score, we can make a UnitFlag, otherwise we need a separate + UnitClass and change cargo characteristics. + +Trucks + Unit Types with less than 3 moves can do the Board command, AND Bomb, AND Cargo-class, but: + Boarding on a blank tile (no base or city) is illegal except for "Foot" soldiers + +Trains (LandRail class) + Unit Types with less than 3 moves can do the Board command AND Bomb, AND Cargo-class AND Zeppelin + Boarding on a blank tile (no base or city) is illegal except for "Foot soldiers" and Zeppelins + +Sea class: + Allowed in all cases where Sea units are allowed to go: City, Quay, Naval Base, Blank Sea tile (e.g., Fighter on Carrier) + +RiverShip class: + Allowed in all cases: City, Quay, Naval Base, Blank River tile. + +Helicopter class: + Loading allowed for all legal cargo, anywhere. (rescue pick-up!) + + +=============================================================================== +Deboard/Unloading: + +Wagons and Trucks (LandRoad class) + Allowed at no cost in ALL bases and cities for all cargo types. + was Disallowed on blank tile to all except LandAirSea (change cost from 0 to 1 move) + now allowed to all, at full cost (emulates disembark to adjacent) + +Trains (LandRail) + Allowed at no cost in cities for all units. + Allowed at no cost in a base or quay. + was Disallowed on blank tile to all except LandAirSea (change cost from 0 to 1move) + now allowed to Foot Soldiers at full cost (emulates disembark to adjacent) + +Sea Class: + Allowed in all cases at no cost, where Sea units are allowed to go: City, Naval Base. + +Rivership: + Unloading in City/Quay/Naval Base always legal, at no cost. + Unloading in other bases and blank tiles was disallowed. + was Disallowed on blank tile to all except LandAirSea (change cost from 0 to 1 move) + now allowed to Foot Soldiers at full cost (emulates disembark to adjacent) + +Helicopter class: + Allowed in city, naval base, or airbase, for all legal cargo, at no cost. + Allowed to blank tile for "Foot" and Artillery types, at full cost (emulating disembark to same tile) + LandAirSea (cost 1 move) + +================================================================================== +What will change/simplify in unit helptext, documentation, and logistics charts: + +Transport swapping rules simplified/changed for all and LandAirSea. +Disembarking rules for Marines swapping at sea. +UnitType "Goods" is not limited to load on commerce units only. +Logistic charts will change "Step of" to "Disembark" and show unload as "all moves" instead of "all" +LandAirSea unloading emulates disembarking to same tile at 1 move cost. + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/freeciv/freeciv/data/mp2c-occ/Makefile.am b/freeciv/freeciv/data/mp2c-occ/Makefile.am new file mode 100644 index 000000000..58ba4c0c3 --- /dev/null +++ b/freeciv/freeciv/data/mp2c-occ/Makefile.am @@ -0,0 +1,22 @@ +## Process this file with automake to produce Makefile.in + +## Override automake so that "make install" puts these in proper place: +pkgdatadir = $(datadir)/$(PACKAGE)/mp2c-occ + +pkgdata_DATA = \ + buildings.ruleset \ + cities.ruleset \ + effects.ruleset \ + game.ruleset \ + governments.ruleset \ + nations.ruleset \ + default.lua \ + script.lua \ + parser.lua \ + styles.ruleset \ + techs.ruleset \ + terrain.ruleset \ + units.ruleset \ + README.txt + +EXTRA_DIST = $(pkgdata_DATA) diff --git a/freeciv/freeciv/data/mp2c-occ/README.txt b/freeciv/freeciv/data/mp2c-occ/README.txt new file mode 100644 index 000000000..afca24381 --- /dev/null +++ b/freeciv/freeciv/data/mp2c-occ/README.txt @@ -0,0 +1,43 @@ +Full Game Manual, MP2-Caravel +Useful supplements to the in-game manual (from the Full Game Manual): +Combat +Economy +Diplomacy +Zone of Control (ZOC) +Multiplayer Strategy Guide +Charts: +Bases +Terrain +Governments +Special Unit Attacks +Special Unit Defense +Terrain+Base Defense Bonus Quick-Reference +Diplomatic Odds Charts +Vigil Engagement Chart +Hotkeys and Mouse Control + +The MP2 Caravel ruleset is the third official release of the Multiplayer-Evolution II ruleset, and is a major revision. Multiplayer II Evolution rulesets are modernized rulesets to take advantage of cutting-edge advancements in Freeciv Server development. Earlier versions are closer to a version of Civ 2 that has been perfected for massive multiplayer game balance. Later versions evolve to import features, improvements, and novel ideas from all other versions of Freeciv, later versions of the commercial series, as well as original ideas from experienced players. + +Major changes to MP2-Caravel include: +• Technology blueprints +• Re-design and re-balance of governments +• New governments +• Reworking of the Bronze Age: greater strategic diversity and engagement +• Integration of Trade routes as a significant aspect of the game +• Special Unit Attacks + Special Unit Defense: broadens tactical depth and realism +• Expanded transportational units, especially on Land +• Expansion and re-balance of Migrant-type units +• New units +• New wonders +• Civil Wonders force civilizations to uniquely define themselves +• Major overhaul of Power Plants to meaningfully integrate into the game +• Coinage made meaningful by mechanics that enhance its exchange rate +• Casus belli and diplomatic states: greatly expanded to be more meaningful +• Castles, Bunkers, and Tile Claims +• Numerous other fixes and improvements +For more details, see links below: + +MP2 Caravel changelog +MP2 Caravel Design Log + + diff --git a/freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/buildings.ruleset b/freeciv/freeciv/data/mp2c-occ/buildings.ruleset similarity index 57% rename from freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/buildings.ruleset rename to freeciv/freeciv/data/mp2c-occ/buildings.ruleset index e3c704959..37ae2e7a3 100644 --- a/freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/buildings.ruleset +++ b/freeciv/freeciv/data/mp2c-occ/buildings.ruleset @@ -1,4 +1,4 @@ -; Modifying this file: +; Modifying this file: ; You should not modify this file except to make bugfixes or ; for other "maintenance". If you want to make custom changes, ; you should create a new datadir subdirectory and copy this file @@ -10,20 +10,20 @@ ; than minor changes. [datafile] -description="Avant-garde buildings data for Freeciv" +description="Buildings data for Freeciv" options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" format_version=20 ; /* <-- avoid gettext warnings ; -; Below: The individual buildings, one per section. +; Below:The individual buildings, one per section. ; (Buildings = City Improvements and Wonders) ; ; The actual tag used (the * in [building_*]) does not matter, except ; it must be unique within this file, and it may be used in debug ; output when reading this file. ; -; Notes: +; Notes ; ; name = translatable name as seen by user ; rule_name = (optional) internal name for savegames, rulesets etc; if @@ -31,7 +31,7 @@ format_version=20 ; the name used in savegames must not change, if you want ; to rename an item after a ruleset has been released, you ; should set "rule_name" to the original value of "name". -; genus = genus; one of: +; genus = genus; one of: ; "GreatWonder", "SmallWonder", "Improvement", "Special". ; reqs = requirements to build the building (see effects.ruleset ; and README.effects for help on requirements) @@ -106,7 +106,7 @@ sabotage = 100 sound = "b_colosseum" sound_alt = "b_generic" helptext = _("\ -Entertains the citizens of a city, making 3 unhappy citizens content. \ +Entertains the citizens of a city, making three unhappy citizens content. \ (Four after the discovery of Electricity.) However, it does not\ affect citizens made unhappy by military activity.\ ") @@ -153,10 +153,11 @@ upkeep = 2 sabotage = 100 sound = "b_bank" sound_alt = "b_generic" -; /* xgettext:no-c-format */ helptext = _("\ -Together, a Bank and Marketplace double the tax and luxury production in a city.\ - That is, the Bank adds another +50% to the +50% of the Marketplace.\ +Together, a Bank and Marketplace double the tax and luxury output in a city.\ + That is, the Bank adds another +50% to the +50% of the Marketplace. \n\ +Banks also increase the conversion rate of Coinage by +25%. A Bank and\ + Marketplace each add +25%, yielding a rate of 2.0 gold per 1 shield invested.\ ") [building_barracks] @@ -164,7 +165,7 @@ name = _("Barracks") genus = "Improvement" reqs = { "type", "name", "range" - + "Tech", "Warrior Code", "Player" } graphic = "b.barracks_i" graphic_alt = "-" @@ -179,13 +180,12 @@ upkeep = 1 sabotage = 100 sound = "b_barracks_i" sound_alt = "b_generic" -; /* xgettext:no-c-format */ helptext = _("\ With a Barracks I, each new land unit built in a city will\ automatically have Veteran V1 status, which means that its attack and\ - defense strengths are increased by 50%. Also, damaged land units\ + defense strengths are increased by 50%. Also, damaged land units\ which stay in town for one full turn without moving are completely\ - healed. Obsolete by: Gunpowder.\ + healed. Obsolete by:Gunpowder.\ ") [building_barracks_ii] @@ -202,18 +202,17 @@ obsolete_by = "Tech", "Mobile Warfare", "Player" "Building", "Barracks III", "City" } -build_cost = 30 +build_cost = 35 upkeep = 1 sabotage = 100 sound = "b_barracks_ii" sound_alt = "b_generic" -; /* xgettext:no-c-format */ helptext = _("\ With a Barracks II, each new land unit built in a city will\ automatically have Veteran V1 status, which means that its attack and\ defense strengths are increased by 50%. Also, damaged land units\ which stay in town for one full turn without moving are completely\ - restored. Obsolete by: Mobile Warfare.\ + restored. Obsolete by:Mobile Warfare.\ ") [building_barracks_iii] @@ -228,12 +227,11 @@ graphic_alt = "b.barracks_i" obsolete_by = { "type", "name", "range" } -build_cost = 30 +build_cost = 40 upkeep = 1 sabotage = 100 sound = "b_barracks_iii" sound_alt = "b_generic" -; /* xgettext:no-c-format */ helptext = _("\ With a Barracks III, each new land unit built in a city will\ automatically have Veteran V1 status, which means that its attack and\ @@ -266,7 +264,7 @@ sound_alt = "b_generic" helptext = _("\ A Cathedral makes 3 unhappy citizens content, but does not affect citizens\ made unhappy by military activity. Theology increases the effect by +1.\ - Communist government decreases the effect by -1. (Michelangelos Chapel enhances\ + Communist government decreases the effect by -1. (Michelangelo’s Chapel enhances\ the effect of Cathedrals by +1 happy citizen and +1 forced content citizen.)\ ") @@ -276,29 +274,34 @@ genus = "Improvement" flags = "VisibleByOthers" reqs = { "type", "name", "range" - "Tech", "Masonry", "Player" + "Tech", "Construction", "Player" } graphic = "b.city_walls" graphic_alt = "-" obsolete_by = { "type", "name", "range" } -build_cost = 60 +build_cost = 65 upkeep = 0 sabotage = 50 sound = "b_city_walls" sound_alt = "b_generic" helptext = _("\ -City Walls give a 3x bonus to ALL units in a City against attacks from\ - Land units and Helicopters. City Walls are ineffective against Air, Sea, Missile, and\ - Howitzers. City Walls always prevent population loss when a defending unit\ - is destroyed by a Land unit. If an enemy attempts to sabotage City Walls,\ - the odds of success are halved.\ +City Walls give a 3× bonus to every unit in a City against Land unit attacks.\ + City Walls are useless against Air, Sea, and Missile units; and the bonus is\ + reduced when attacked by Catapults, Cannons, Artillery, and Howitzers.\n\ + "), _("\ +City Walls prevent population loss when a defending unit is killed. If an enemy\ + attempts to sabotage City Walls, the odds of success are halved. In a city with\ + Fortifications, only the terrain bonus adds to the City Wall bonus. \n\ + "), _("\ + Discovery of Metallurgy increases cost to 75 shields.\ ") [building_coastal_defense] name = _("Coastal Defense") genus = "Improvement" +flags = "VisibleByOthers" reqs = { "type", "name", "range" "Tech", "Gunpowder", "Player" @@ -309,8 +312,8 @@ graphic_alt = "-" obsolete_by = { "type", "name", "range" } -build_cost = 60 -upkeep = 1 +build_cost = 65 +upkeep = 2 sabotage = 100 sound = "b_coastal_defense" sound_alt = "b_generic" @@ -336,20 +339,23 @@ upkeep = 1 sabotage = 100 sound = "b_courthouse" sound_alt = "b_generic" -; /* xgettext:no-c-format */ helptext = _("\ -Courthouses reduce corruption by about half (60% rounded down),\ - eliminate tile output penalties for Anarchy and Despotism, and\ - give +1 unit free of upkeep.\ +Courthouses reduce corruption by half, eliminate\ + tile output penalties for Anarchy and Despotism, and\ + give +1 shield of free unit upkeep.\ "), _("\ Diplomatic combat gets a bonus of ¼ of base odds. (At general base odds\ - of ½, odds of losing become: ½ - ⅛ = ⅜). All other hostile diplomatic\ + of ½, odds of losing become:½ - ⅛ = ⅜). All other hostile diplomatic\ actions are 20% less effective (80% - 20% = 60%).\ "), _("\ - In Democracy, Courthouses make 1 unhappy citizen content, unless the\ + Courthouses make 1 unhappy citizen content, unless the\ citizen is unhappy about military activity).\ "), _("\ - Cost to incite revolt in the city is 2x if empty and 4x if occupied.\ + Cost to incite revolt in the city is 2× if empty and 4× if occupied.\ +"), _("\ + A unique bonus that only a local Courthouse provides to its city: \ + Diplomats can’t establish embassies unless you permit it through\ + Cease-fire or Peace. (Spies require a Police Station to block them.)\ ") [building_factory] @@ -369,12 +375,11 @@ upkeep = 4 sabotage = 100 sound = "b_factory" sound_alt = "b_generic" -; /* xgettext:no-c-format */ helptext = _("\ Increases the shield production in a city by +50%. This increase may\ contribute to pollution.\ "), _("\ - This building lets you conscript one extra infantry/foot unit per turn.\ + This building lets you build one extra infantry unit per turn.\ ") [building_enrichment_facility] @@ -383,7 +388,6 @@ genus = "Improvement" reqs = { "type", "name", "range" "Tech", "Fusion Power", "Player" - "Building", "Fusion Reactor","City" "ServerSetting","nukes_major", "World" } graphic = "b.enrichment_facility" @@ -398,31 +402,43 @@ sound = "b_enrichment_facility" sound_alt = "b_generic" helptext = _("\ Allows refining the fissile isotopes needed to create nuclear fusion weapons.\ - To make these weapons, a city requires an Enrichment Facility, which first\ - requires a Fusion Reactor.\ ") -[building_fusion_reactor] -name = _("Fusion Reactor") +[building_fortifications] +name = _("Fortifications") genus = "Improvement" +flags = "VisibleByOthers" reqs = { "type", "name", "range" - "Tech", "Fusion Power", "Player" + "Tech", "Masonry", "Player" } -graphic = "b.fusion_reactor" -graphic_alt = "-" +graphic = "b.fortifications" +graphic_alt = "b.city_walls" obsolete_by = { "type", "name", "range" } -build_cost = 200 -upkeep = 4 -sabotage = 100 -sound = "b_fusion_reactor" +build_cost = 35 +upkeep = 0 +sabotage = 50 +sound = "b_fortifications" sound_alt = "b_generic" -; /* xgettext:no-c-format */ helptext = _("\ -Increases the shield production in a city by +75% of base production levels.\ - Gives +1 build slot and +5 free shield upkeep on units.\ +Fortifications give 1.5× defense to every unit in a City vs. attacks by Land.\ + This bonus is reduced if attacked by Catapult or the units to which it upgrades.\ + Fortifications prevent population loss when a defending unit is killed. \n\ +"), _("\ +Fortifications raise the terrain bonus of Lowlands tiles by +17%.\ + (Flatland is 1.17×, Forest and Swamp are 1.5×, and Jungle is 1.67×.)\ + A terrain bonus helps defending Land units against attacks from units\ + of all types. \n\ +"), _("\ +Fortifications are unassailable by Siege Rams.\ + If an enemy attempts sabotage, odds of success are halved. \n\ +"), _("\ +➤ Except for any possible terrain bonus, this improvement offers no bonus when\ + City Walls are in place. \n\ +➤ AFTER making City Walls, you can sell Fortifications with a full return of gold\ + cost.\ ") [building_granary] @@ -492,43 +508,10 @@ sound = "b_homeland_security" sound_alt = "b_generic" helptext = _("\ You can build Homeland Security offices if you own the Supreme Court. Homeland Security\ - gives the same bonus as a Courthouse vs. all hostile diplomatic acts. As a ministry of the\ + gives the same bonus as a Courthouse vs. hostile diplomatic acts. As a ministry of the\ Supreme Court, it has no upkeep and cannot be sabotaged.\ ") -[building_hydro_plant] -name = _("Hydro Plant") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Electronics", "Player" - "Building", "Factory", "City" - "Extra", "River", "Adjacent" - } -graphic = "b.hydro_plant" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 180 -upkeep = 4 -sabotage = 100 -sound = "b_hydro_plant" -sound_alt = "b_generic" -helptext = _("\ -For each Factory or Mfg. Plant in a city, a Hydro Plant adds +25% to\ - base production, and reduces pollution from production by -25%.\ -"), _("\ -*If a city has either a Factory or Mfg. Plant, this makes a combined +75%\ - production bonus with a 25% decrease in pollution from production.\ -"), _("\ -*In a city with both a Factory and Mfg. Plant, this makes a combined +150%\ - production bonus with a 50% decrease in pollution from production.\ -"), _("\ -*Only one Power Plant, Hydro Plant, Nuclear Plant, or\ - Solar Plant can have an active effect in a city.\ -") - [building_library] name = _("Library") genus = "Improvement" @@ -546,7 +529,6 @@ upkeep = 1 sabotage = 100 sound = "b_library" sound_alt = "b_generic" -; /* xgettext:no-c-format */ helptext = _("\ Increases the science output in a city by +100%.\ ") @@ -568,16 +550,17 @@ upkeep = 0 sabotage = 100 sound = "b_marketplace" sound_alt = "b_generic" -; /* xgettext:no-c-format */ helptext = _("\ Increases the luxury and tax output in a city by +50%.\ +Also increases the conversion rate of Coinage by +25%,\ + yielding a rate of 1.75 gold per 1 shield invested.\ ") [building_mass_transit] name = _("Mass Transit") genus = "Improvement" reqs = - { "type", "name", "range" + { "type", "name", "range" "Tech", "Mass Production", "Player" } graphic = "b.mass_transit" @@ -604,9 +587,9 @@ name = _("Manufacturing Plant") rule_name = "Mfg. Plant" genus = "Improvement" reqs = - { "type", "name", "range" - "Tech", "Robotics", "Player" - "Building", "Factory", "City" + { "type", "name", "range" + "Tech", "Robotics", "Player" + "Building", "Factory", "City" } graphic = "b.mfg_plant" graphic_alt = "-" @@ -619,73 +602,229 @@ sabotage = 100 sound = "b_mfg_plant" sound_alt = "b_generic" helptext = _("\ -A Manufacturing Plant increases base production by +50%.\ +A Manufacturing Plant increases base production by +50%. \n\ "), _("\ -A Mfg. Plant & Factory together double the production in a city.\ - That is, the Mfg. Plant adds another +50% to the +50% of the Factory.\ + A Mfg. Plant & Factory together double the production in a city.\ + That is, the Mfg. Plant adds another +50% to the +50% of the Factory. \n\ "), _("\ -A Mfg. Plant with a Factory AND a Power, Hydro, Nuclear, or Solar Plant\ - will combine for a total +150% increase over base production.\ + A Mfg. Plant with a Factory AND a Power or Hydro Plant\ + will combine for a total +140% increase over base production.\ + (With Nuclear Plant: +160%) \n\ "), _("\ -The pollution reduction of a Hydro, Nuclear, or Solar Plant is applied one more\ - time to cities with Mfg. Plants, effectively doubling the bonus percentage.\ + The pollution reduction of a Hydro, Nuclear, or Solar Plant is applied one more\ + time to cities with Mfg. Plants, doubling the pollution reduction bonus.\n\ +"), _("\ + This building lets you build one extra infantry unit per turn.\ +") + +[building_offshore_platform] +name = _("Offshore Platform") +genus = "Improvement" +reqs = + { "type", "name", "range" + "Tech", "Miniaturization", "Player" + "TerrainClass", "Oceanic", "Adjacent" + } +graphic = "b.offshore_platform" +graphic_alt = "-" +obsolete_by = + { "type", "name", "range" + } +build_cost = 120 +upkeep = 3 +sabotage = 100 +sound = "b_offshore_platform" +sound_alt = "b_generic" +helptext = _("\ +Adds 1 extra production to all Oceanic tiles worked by a city. The\ + city needs to be coastal to build this improvement.\ +") + +[building_coal_plant] +name = _("Coal Plant") +genus = "Improvement" +reqs = + { "type", "name", "range", "present" + "Tech", "Refining", "Player", TRUE + "Building", "Factory", "City", TRUE + ;Shortens Production List choices when unwanted: + "Building", "Hoover Dam", "City", FALSE + "Building","Fusion Reactor","Player",FALSE + "Building", "Hydro Plant", "City", FALSE + "Building", "Nuclear Plant","City", FALSE + + } +graphic = "b.power_plant" +graphic_alt = "-" +obsolete_by = + { "type", "name", "range" + } +build_cost = 120 +upkeep = 4 +sabotage = 100 +sound = "b_power_plant" +sound_alt = "b_generic" +helptext = _("\ +A Coal Plant boosts the +50% bonus of the Factory and Mfg. Plant to\ + +70%. The extra production may lead to more pollution. \n\ +"), _("\ +➤ In a city with both a Factory and Mfg. Plant, this makes a combined +140%\ + production bonus. \n\ "), _("\ - This building lets you conscript one extra infantry/foot unit per turn.\ +➤ Only one Coal Plant, Hydro Plant, Nuclear Plant, or Fusion Reactor\ + can have an active effect in a city.\ +") + +[building_hydro_plant] +name = _("Hydro Plant") +genus = "Improvement" +reqs = + { "type", "name", "range", "present" + "Tech", "Electronics", "Player", TRUE + "Building", "Factory", "City", TRUE + "Extra", "River", "Adjacent",TRUE + "Building", "Hoover Dam", "City", FALSE + "Building","Fusion Reactor","Player",FALSE + "Building", "Nuclear Plant","City", FALSE + } +graphic = "b.hydro_plant" +graphic_alt = "-" +obsolete_by = + { "type", "name", "range" + } +build_cost = 175 +upkeep = 3 +sabotage = 100 +sound = "b_hydro_plant" +sound_alt = "b_generic" +helptext = _("\ +A Hydro Plant boosts the +50% bonus of the Factory and Mfg. Plant to\ + +70%. For each of those, it reduces pollution from production by -25%. \n\ +"), _("\ +➤ In a city with both a Factory and Mfg. Plant, this makes a combined +140%\ + production bonus with a 50% decrease in pollution from production. \n\ +"), _("\ +➤ For both Factory and Mfg. Plant, -25% in production-based\ + pollution cancels slightly more than the pollution generated by\ + the 20% increase in production. \n\ +"), _("\ +➤ Only one Coal Plant, Hydro Plant, Nuclear Plant, or\ + Fusion Reactor can have an active effect in a city. \n\ +"), _("\ +➤ The sale price of a Coal Plant becomes 85% original value\ + instead of 50% original value, after a city has built a Hydro Plant. \n\n\ +Hydro Plants can only be built in cities adjacent to rivers.\ ") [building_nuclear_plant] name = _("Nuclear Plant") genus = "Improvement" reqs = - { "type", "name", "range" - "Tech", "Nuclear Power", "Player" - "Building", "Factory", "City" + { "type", "name", "range", "present" + "Tech", "Nuclear Power","Player", TRUE + "Building", "Factory", "City", TRUE + "Building", "Hoover Dam", "City", FALSE + "Building","Fusion Reactor","Player",FALSE } graphic = "b.nuclear_plant" graphic_alt = "-" obsolete_by = { "type", "name", "range" } -build_cost = 120 -upkeep = 2 +build_cost = 185 +upkeep = 4 sabotage = 100 sound = "b_nuclear_plant" sound_alt = "b_generic" helptext = _("\ -For each Factory or Mfg. Plant in a city, a Nuclear Plant adds +25% to\ - base production, and reduces pollution from production by -25%.\ +A Nuclear Plant boosts the +50% bonus of the Factory and Mfg. Plant to\ + +80%. For each of those, it reduces pollution from production by -25%. \n\ "), _("\ -*If a city has either a Factory or Mfg. Plant, this makes a combined +75%\ - production bonus with a 25% decrease in pollution from production.\ +➤ In a city with both a Factory and Mfg. Plant, this makes a combined +160%\ + production bonus with a 50% decrease in pollution from production. \n\ "), _("\ -*In a city with both a Factory and Mfg. Plant, this makes a combined +150%\ - production bonus with a 50% decrease in pollution from production.\ +➤ For both Factory and Mfg. Plant, -25% in production-based\ + pollution cancels most of the pollution generated by\ + the 30% increase in production. \n\ "), _("\ -*Only one Power Plant, Hydro Plant, Nuclear Plant, or\ - Solar Plant can have an active effect in a city.\ +➤ Only one Coal Plant, Hydro Plant, Nuclear Plant, or\ + Fusion Reactor can have an active effect in a city. \n\ +"), _("\ +➤ The sale price of a Coal Plant becomes 85% original value\ + instead of 50% original value, after a city has built a Nuclear Plant.\ ") -[building_offshore_platform] -name = _("Offshore Platform") +[building_solar_plant] +name = _("Solar Plant") genus = "Improvement" reqs = { "type", "name", "range" - "Tech", "Miniaturization", "Player" - "TerrainClass", "Oceanic", "Adjacent" + "Tech", "Environmentalism", "Player" + "Building", "Factory", "City" } -graphic = "b.offshore_platform" +graphic = "b.solar_plant" graphic_alt = "-" obsolete_by = { "type", "name", "range" } -build_cost = 120 -upkeep = 3 +build_cost = 150 +upkeep = -3 sabotage = 100 -sound = "b_offshore_platform" +sound = "b_solar_plant" sound_alt = "b_generic" helptext = _("\ -Adds 1 extra production to all Oceanic tiles worked by a city. The\ - city needs to be coastal to build this improvement.\ +A Solar Plant boosts the production in a city by +20%. Although this is\ + modest compared to other Power Plants, a Solar Plant has four major\ + benefits:\n\ +"), _("\ +➤ The Solar Plant can co-exist with a Coal Plant, Hydro Plant,\ + Nuclear Plant, or Fusion Reactor, adding its +20% bonus to the\ + existing bonus.\ +"), _("\ +➤ Free Solar energy reduces the infrastructural upkeep of other buildings\ + in the city by -3, and gives free upkeep to two units supported by\ + the city. \n\ +"), _("\ +➤ The pollution reduction from other kinds of Power Plants is replaced\ + by the superior bonus of the Solar Plant, reducing Pollution from\ + production by 75%. This makes Solar Plants an ideal improvement for\ + cities which still use Coal Plants. \n\ +➤ A Solar Plant is the only kind of Power Plant whose bonus against\ + Pollution can combine with a Recycling Center. Together, they reduce\ + pollution from production by 90% !\ +") + +[building_wind_plant] +name = _("Wind Plant") +genus = "Improvement" +reqs = + { "type", "name", "range" + "Tech", "Environmentalism", "Player" + } +graphic = "b.wind_farm" +graphic_alt = "-" +obsolete_by = + { "type", "name", "range" + } +build_cost = 60 +upkeep = -3 +sabotage = 100 +sound = "b_wind_plant" +sound_alt = "b_generic" +helptext = _("\ +A Wind Plant boosts the production in a city by 5%. This is\ + modest; but in yield per cost it’s competitive with other\ + Power Plants, when considering its unique benefits: \n\ +"), _("\ +➤ The Wind Plant can co-exist with any other type of Power Plant, and\ + needs no Factory to be built.\ +"), _("\ +➤ Free Wind energy reduces the infrastructural upkeep of other buildings\ + in the city by -3, while also giving 2 free shield upkeep for units supported by\ + the city. \n\ +"), _("\ +➤ A Wind Plant reduces pollution from production by -10%. It combines\ + with all other pollution bonuses.\ ") [building_police_station] @@ -706,13 +845,15 @@ sabotage = 100 sound = "b_police_station" sound_alt = "b_generic" helptext = _("\ -Police Stations neutralize the unhappiness caused by two military units, and\ - prevent enemies from estalishing embassies without first agreeing to cease-fire\ - or peace.\ +Police Stations neutralize the unhappiness caused by two military units or two\ + unhappy Foreign Nationals. Under Nationalism the effect is +1, affecting three\ + citizens. Police Stations prevent Estalishing Embassy without first agreeing to\ + Cease-Fire or Peace. They also half the odds to Investigate City under all governments\ + except Democracy.\ "), _("\ Diplomatic combat gets a bonus of ¼ of base odds. (At general base odds\ - of ½, odds of losing become: ½ - ⅛ = ⅜). All other hostile diplomatic\ - actions are 20% less effective (80% - 20% = 60%).\ + of ½, odds of losing become:½ - ⅛ = ⅜). All other hostile diplomatic\ + actions are 20% less effective (e.g., 80% - 20% = 60%).\ "), _("\ Diplomats and Spies made in a city with Police Station gain +1 veteran level.\ ") @@ -741,39 +882,6 @@ Allows a city to build veteran sea units. Damaged sea units\ restored.\ ") -[building_power_plant] -name = _("Power Plant") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Refining", "Player" - "Building", "Factory", "City" - } -graphic = "b.power_plant" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 130 -upkeep = 4 -sabotage = 100 -sound = "b_power_plant" -sound_alt = "b_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -For each Factory or Mfg. Plant in a city, a Power Plant adds +25% to\ - base production. The extra production may lead to more pollution.\ -"), _("\ -*If a city has either a Factory or Mfg. Plant, this makes a combined +75%\ - production bonus.\ -"), _("\ -*In a city with both a Factory and Mfg. Plant, this makes a combined +150%\ - production bonus.\ -"), _("\ -*Only one Power Plant, Hydro Plant, Nuclear Plant, or\ - Solar Plant can have an active effect in a city.\ -") - [building_radar_tower] name = _("Radar Tower") genus = "Improvement" @@ -813,12 +921,15 @@ upkeep = 1 sabotage = 100 sound = "b_recycling_center" sound_alt = "b_generic" -; /* xgettext:no-c-format */ helptext = _("\ -A Recycling Center reduces the pollution\ - generated by production in a city by -66%. Supply of raw\ - recycled materials adds +2 producton to the city\ - center tile.\ +A Recycling Center replaces pollution bonuses from Hydro and Nuclear\ + Plants with its own superior bonus. It reduces pollution\ + generated by production in a city by -66%. Supply of raw recycled\ + materials adds +2 producton to the city center tile. \n\ +"), _("\ +When combined with a Solar Plant, pollution from production is\ + nearly eliminated by -90%, leaving pollution from population\ + as the only significant polluting factor.\ ") [building_research_lab] @@ -839,10 +950,9 @@ upkeep = 3 sabotage = 100 sound = "b_research_lab" sound_alt = "b_generic" -; /* xgettext:no-c-format */ helptext = _("\ Adds +100% to base science output for each Library and University\ - in a city.\ + in a city. \ *In a city with a Library or University, the combined increase to science\ output is +200%. \ *In a city with a Library and a University, the combined increase\ @@ -861,14 +971,14 @@ graphic_alt = "-" obsolete_by = { "type", "name", "range" } -build_cost = 70 +build_cost = 80 upkeep = 2 sabotage = 100 sound = "b_sam_battery" sound_alt = "b_generic" helptext = _("\ Doubles the defense of all units inside the city when attacked by\ - aircraft (not including Helicopters or Missiles). Stealth aircraft\ + aircraft and Helicopters (but not Missiles). Stealth aircraft\ reduce the bonus to 25%.\ ") @@ -923,38 +1033,6 @@ Allows a city to grow larger than size 12. An Aqueduct is first\ ; There is also an effect to reduce the chance of plague, but you have to ; enable illness in game.ruleset for that to be relevant. -[building_solar_plant] -name = _("Solar Plant") -genus = "Improvement" -reqs = - { "type", "name", "range" - "Tech", "Environmentalism", "Player" - "Building", "Factory", "City" - } -graphic = "b.solar_plant" -graphic_alt = "-" -obsolete_by = - { "type", "name", "range" - } -build_cost = 140 -upkeep = 4 -sabotage = 100 -sound = "b_solar_plant" -sound_alt = "b_generic" -helptext = _("\ -For each Factory or Mfg. Plant in a city, a Solar Plant adds +25% to\ - base production, and reduces pollution from production by -50%.\ -"), _("\ -*If a city has either a Factory or Mfg. Plant, this makes a combined +75%\ - production bonus with a 50% decrease in pollution from production.\ -"), _("\ -*In a city with both a Factory and Mfg. Plant, this makes a combined +150%\ - production bonus with 100% elimination of all pollution from production.\ -"), _("\ -*Only one Power Plant, Hydro Plant, Nuclear Plant, or\ - Solar Plant can have an active effect in a city.\ -") - [building_space_component] name = _("Space Component") genus = "Special" @@ -978,7 +1056,7 @@ Space Components can be differentiated into Propulsion and Fuel Components.\ Each pair of them reduces spaceship travel time. You can build up to 8 pairs.\ "), _("\ Before you can build any spaceship parts, your nation must have built the\ - Apollo Program.\ + Apollo Program; and a city needs a Factory.\ ") [building_space_module] @@ -1001,20 +1079,20 @@ sound = "b_space_module" sound_alt = "b_generic" helptext = _("\ Space Modules are the most expensive parts of spaceships. There\ - are three different types of Space Module:\ + are three different types of Space Module:\ "), _("\ -- Habitation Module: provides living space for 10,000 people.\ +- Habitation Module:provides living space for 10,000 people.\ "), _("\ -- Life Support Module: provides food and water for the population of\ +- Life Support Module:provides food and water for the population of\ one Habitation Module.\ "), _("\ -- Solar Panels: provides the energy needed for any two of the other\ +- Solar Panels:provides the energy needed for any two of the other\ Modules.\ "), _("\ You can build up to 4 Space Modules of each kind.\ "), _("\ Before you can build any spaceship parts, your nation must have built the\ - Apollo Program.\ + Apollo Program; and a city needs a Factory.\ ") [building_space_structural] @@ -1041,7 +1119,7 @@ Space Structurals form the base of your spaceship. All other\ function. You can build up to 32 Space Structurals.\ "), _("\ Before you can build any spaceship parts, your nation must have built the\ - Apollo Program.\ + Apollo Program; and a city needs a Factory.\ ") [building_stock_exchange] @@ -1062,16 +1140,19 @@ upkeep = 3 sabotage = 100 sound = "b_stock_exchange" sound_alt = "b_generic" -; /* xgettext:no-c-format */ helptext = _("\ In cities with a Bank, a Stock Exchange boosts tax and luxury\ - production by an additional +50%.\ + production by an additional +50%. \ "), _("\ -*A Bank and Stock Exchange together boost\ +* A Bank and Stock Exchange together boost\ tax and luxury production by +100%.\ "), _("\ -*A Marketplace, Bank, and Stock Exchange together boost\ - tax and luxury production by +150%.\ +* A Marketplace, Bank, and Stock Exchange together boost\ + tax and luxury production by +150%. \ +"), _("\ +After discovery of The Corporation, non-Communist governments see the conversion rate of\ + Coinage increase by +25%. A Bank, Marketplace, and Stock Exchange each add +25%, yielding\ + a total rate of 2.25 gold per 1 shield invested.\ ") [building_super_highways] @@ -1144,6 +1225,35 @@ Makes one unhappy citizen content. Mysticism doubles\ activity.\ ") +[building_totem_pole] +name = _("Totem Pole") +genus = "Improvement" +reqs = + { "type", "name", "range", "present" + "Tech", "Ceremonial Burial", "Player", FALSE + } +graphic = "b.totem_pole" +graphic_alt = "-" +obsolete_by = + { "type", "name", "range" + "Tech", "Ceremonial Burial", "Player" + "Building", "Temple", "City" + } +build_cost = 30 +upkeep = 0 +sabotage = 100 +sound = "b_totem_pole" +sound_alt = "b_generic" +helptext = _("\ +Gives two luxury to a city. In small tribal settlements, this can\ + be more effective than a Temple for aiding celebration. \n\ +The process of building a Totem Pole is sometimes more useful than\ + finishing it. It keeps your tribe productive by storing shields that\ + can transfer into a building made available by a future scientific\ + discovery. \n\ +Obsolete by:Temple, Ceremonial Burial.\ +") + [building_university] name = _("University") genus = "Improvement" @@ -1163,7 +1273,7 @@ sabotage = 100 sound = "b_university" sound_alt = "b_generic" helptext = _("\ -Adds +150% to science output in a city with a Library.\ +Adds +150% to science output in a city with a Library. \ "), _("\ *A University and Library combine for a +250% increase\ in science output.\ @@ -1175,7 +1285,6 @@ genus = "SmallWonder" flags = "SaveSmallWonder" reqs = { "type", "name", "range" - "Tech", "Masonry", "Player" } graphic = "b.palace" graphic_alt = "-" @@ -1188,13 +1297,13 @@ sabotage = 0 sound = "b_palace" sound_alt = "b_generic" helptext = _("\ -Sets the main capital of your nation. Loss of your main capital: \ +Sets the main capital of your nation. Loss of your main capital:\ (1) creates a new Palace and capital in a random city,\ (2) destroys any Spaceship you are building, (3) may cause civil war.\ "), _("\ Capital cities gain +1 happy citizen.\ "), _("\ - Capitals cannot be incited to revolt. The closer a city is to a capital,\ + Capitals can’t be incited to revolt. The closer a city is to a capital,\ the higher the cost to bribe or incite revolt. In a capital, the chance of\ enemy agents defeating your agents or sabotaging buildings is halved.\ "), _("\ @@ -1205,8 +1314,8 @@ Sets the main capital of your nation. Loss of your main capital: \ a safer location or reduce corruption for nearby cities.\ "), _("\ The Palace gives a production bonus of +75% under Despotism,\ - +50% under Monarchy, and +25% under Communism. Fundamentalism gets\ - a +50% gold bonus.\ + +50% under Monarchy, +25% under Communism, +15% under\ + Nationalism; and Theocracy gets a +50% gold bonus.\ "), _("\ A Palace automatically appears in your first city. This nullifies\ the move bonus for nations who have no cities, due to sedentary\ @@ -1239,7 +1348,7 @@ Sets your religious capital and second center of government. Loss of this\ "), _("\ Capital cities gain +1 happy citizen.\ "), _("\ - Capitals cannot be incited to revolt. The closer a city is to a capital,\ + Capitals can’t be incited to revolt. The closer a city is to a capital,\ the higher the cost to bribe or incite revolt. In a capital, the chance of\ enemy agents defeating your agents or sabotaging buildings is halved.\ "), _("\ @@ -1247,14 +1356,48 @@ Sets your religious capital and second center of government. Loss of this\ enjoy a further reduction of corruption by half.\ "), _("\ Religious capitals have a gold income bonus of +75% under Despotism,\ - +50% under Monarchy, +50% under Fundamentalism, and +25% under Communism.\ + +50% under Monarchy, +50% under Theocracy, +25% under Communism, and\ + +15% under Nationalism.\ "), _("\ - Under Fundamentalism, Fanatics produced in the city with this building\ + Under Theocracy, Zealots produced in the city with this building\ are inspired by fervorous faith to +1 higher veteran level.\ "), _("\ With Conscription, allows producing one extra qualifying unit per turn.\ ") +[building_asmiths_trading_co] +name = _("A.Smith's Trading Co.") +genus = "SmallWonder" +reqs = + { "type", "name", "range", "present", "quiet" + "Tech", "Economics", "Player", TRUE, FALSE + "Building", "A.Smith's Trading Co.", "Player", FALSE, TRUE + } +graphic = "b.asmiths_trading_co" +graphic_alt = "-" +obsolete_by = + { "type", "name", "range" + } +build_cost = 320 +upkeep = 0 +sabotage = 0 +sound = "w_asmiths_trading_co" +sound_alt = "w_generic" +helptext = _("\ +Adam Smith’s Trading Company increases your nation’s knowledge of\ + economics. In all your cities, Buildings with upkeep of 1 gold become\ + free. This Wonder enables three new specialists:\n\ +"), _(" + * Each Laborer produces 1 production point for their city per turn; \n\ +"), _(" + * Each Merchant produces 1 gold and 2 trade points per turn.\ + Trade is then distributed by your national tax rates. \n\ +"), _(" + * Each Farmer provides 1 food for their city per turn. \n\ +"), _(" + This wonder is never obsolete.\ +") + [building_agoge] name = _("Agōgē of Sparta") genus = "SmallWonder" @@ -1279,11 +1422,51 @@ The Agōgē creates a culture of extreme fitness, and is famous for\ vigilant patrols, secret shortcut trails, and battle readiness.\ All your foot soldiers get +⅓ move. Phalanx and Pikemen receive a\ +50% attack bonus. Foot units in the city with the Agōgē begin\ - their turn with +1 move. Obsolete by: Gunpowder.\ + their turn with +1 move. Obsolete by:Gunpowder.\ ") -[building_apollo_program] -name = _("Apollo Program") +[building_angkor_wat] +name = _("Angkor Wat") +genus = "SmallWonder" +reqs = + { "type", "name", "range","present","quiet", "survives" + "Tech", "Code of Laws", "Player", TRUE, FALSE, FALSE + "Building", "Angkor Wat", "Player", FALSE, TRUE, FALSE + "Gov", "Democracy", "Player", FALSE, TRUE, FALSE + "Gov", "Theocracy", "Player", FALSE, TRUE, FALSE + "Gov", "Communism", "Player", FALSE, TRUE, FALSE + "Gov", "Nationalism", "Player", FALSE, TRUE, FALSE +;requires 23Sept2021 changes to requirements.c, so obsolete wonders don't re-enable others + "Building", "Hanging Gardens", "Player", FALSE, FALSE, TRUE + "Building","Mausoleum of Mausolos","Player", FALSE, FALSE, TRUE + "Building", "Code of Hammurabi", "Player", FALSE, FALSE, TRUE + } +graphic = "b.angkor_wat" +graphic_alt = "-" +obsolete_by = + { "type", "name", "range", "survives" + } +build_cost = 200 +upkeep = 0 +sabotage = 0 +sound = "w_angkor" +sound_alt = "w_generic" +helptext = _("\ +Angkor Wat gives you the glorious ancient city of\ + splendor and culture. In Despotism and Monarchy,\ + cities of size 3+ get the tile celebration bonus even if not celebrating.\ + All cities gain +1 happy citizen. Work done on Jungle and Swamp tiles\ + is 2× faster. In addition, the cost of Elephants is reduced by 5\ + shields. \n\ +"), _(" +This Wonder is never obsolete, but it only has an effect in\ + Despotism, Monarchies, and Republic. \ +"), _(" +Angkor Wat is a Civil Wonder. You can build only one Civil Wonder.\ +") + +[building_apollo_program] +name = _("Apollo Program") genus = "SmallWonder" reqs = { "type", "name", "range", "present", "quiet" @@ -1303,39 +1486,118 @@ sound_alt = "w_generic" helptext = _("\ Allows you to start building spaceship parts in cities\ with factories (assuming you have researched the necessary\ - technologies).\ + technologies). With Laser tech, the city with the Apollo\ + Program can build a Satellite.\ ") -[building_asmiths_trading_co] -name = _("A.Smith's Trading Co.") +[building_appian_way] +name = _("Appian Way") genus = "SmallWonder" reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Economics", "Player", TRUE, FALSE - "Building", "A.Smith's Trading Co.", "Player", FALSE, TRUE + { "type", "name", "range", "present", "quiet" + "Tech", "The Wheel", "Player", TRUE, FALSE + "Building", "Appian Way", "Player", FALSE, TRUE } -graphic = "b.asmiths_trading_co" +graphic = "b.appian_way" graphic_alt = "-" obsolete_by = { "type", "name", "range" + "Tech", "Railroad", "Player" } -build_cost = 300 +build_cost = 100 upkeep = 0 sabotage = 0 -sound = "w_asmiths_trading_co" +sound = "w_appian" sound_alt = "w_generic" helptext = _("\ -In all your cities, Buildings with upkeep of 1 gold become free.\ - This Wonder also allows three new specialists:\ -"), _(" - * Each Laborer produces 1 production point for their city per turn;\ -"), _(" - * Each Merchant produces 1 gold and 2 trade points per turn.\ - Trade is then distributed by your national tax rates.\ -"), _(" - * Each Farmer provides 1 food for their city per turn;\ -"), _(" - This wonder is never obsolete.\ +The Appian Way is the first stone-paved highway that can drain\ + rainwater. The Appian Way gives the following National bonuses:\n\ + ➤ Trade Routes with 4 or more revenue get a slight increase in revenue. \n\ + ➤ Tile-workers build Roads at twice the speed. \n\ +If not in Foreign territory:\n\ + ➤ Wagons, Chariots, and Foot soldiers gain +⅓ move when starting\ + their turn on a Road. \n\ + ➤ Tile Workers gain +⅓ move. \n\n\ +The city with the Appian Way gets additional bonuses:\n\ + ➤ Each trade-producing tile produces +1 extra trade, if there is a road on it. \n\ + ➤ Wagons cost 5 shields less. \n\n\ +Obsolete by:Railroad.\ +") + +[building_chand_baori] +name = _("Chand Baori") +genus = "SmallWonder" +reqs = + { "type", "name", "range", "present", "quiet" + "Tech", "Monarchy", "Player", FALSE, TRUE + "Tech", "The Republic","Player", FALSE, TRUE + "Gov", "Despotism", "Player", TRUE, FALSE + "Building", "Chand Baori", "Player", FALSE, TRUE + } +graphic = "b.chand_baori" +graphic_alt = "-" +obsolete_by = + { "type", "name", "range" + } +build_cost = 80 +upkeep = 0 +sabotage = 0 +sound = "w_chand_baori" +sound_alt = "w_generic" +helptext = _("\ +Chand Baori can only be built during your first Despotism regime. All city\ + centers become irrigation sources, and you can irrigate diagonal to any irrigation\ + source. Your Tribesmen can still irrigate after turn 20. \ +Chand Baori’s home city gets a free well on the city center (i.e., river). \n\n\ +"), _("\ +During Despotism, Chand Baori gets two more bonuses:\n(1) In its city\ + there is no tile penalty on food output. \n\ +"), _("\ +(2) Workers irrigate, cultivate, and plant faster on Grasslands, Plains, and Swamp: \n\ +• Irrigate is 2 turns instead of 3. On Swamp, Cultivate and Plant\ + are 4 turns instead of 7. Plant time on Grassland and Plains is 4 and 5 turns. \n\ +• Tribesmen: Irrigate:3; Cultivate/Plant on Swamp:8; Plant on Grassland/Plains: 6,9. \n\n\ +Chand Baori is never obsolete.\ +") + +[building_code_of_hammurabi] +name = _("Code of Hammurabi") +genus = "SmallWonder" +reqs = + { "type", "name", "range", "present", "quiet", "survives" + "Tech", "Alphabet", "Player", TRUE, FALSE, FALSE + "Tech", "Democracy", "Player", FALSE, FALSE, FALSE + "Building", "Code of Hammurabi", "Player", FALSE, TRUE, FALSE +;requires 23Sept2021 changes to requirements.c, so obsolete wonders don't re-enable others + "Building", "Hanging Gardens", "Player", FALSE, FALSE, TRUE + "Building", "Angkor Wat", "Player", FALSE, FALSE, TRUE + "Building", "Mausoleum of Mausolos","Player",FALSE, FALSE, TRUE + } +graphic = "b.hammurabi" +graphic_alt = "-" +obsolete_by = + { "type", "name", "range" + "Tech", "Democracy", "Player" + } +build_cost = 130 +upkeep = 0 +sabotage = 0 +sound = "w_hammurabi" +sound_alt = "w_generic" +helptext = _("\ +The Code of Hammurabi is a first step toward legal organized\ + civilization. It is a primitive version of later societal\ + advancements. In some ways, this Wonder closes the gap\ + between Despotism and Monarchy by exactly half. \n\ +Improvements to Despotism:\n\ + • base corruption is 26% (was 37%) \n\ + • distance corruption is 3% (was 4%) \n\ + • penalties eliminated on Lowland tiles. \n\ +Other bonuses:\n\ + • awards blueprints for Code of Laws (or Writing if the former is known.) \n\ + • cities with no Temple get +1 content citizen. \n\n\ +The Code of Hammurabi is a Civil Wonder. You can build only one Civil Wonder. \n\ +Obsolete by:Democracy.\ ") [building_colossus] @@ -1345,6 +1607,7 @@ reqs = { "type", "name", "range", "present", "quiet" "Tech", "Bronze Working", "Player", TRUE, FALSE "Building", "Colossus", "Player", FALSE, TRUE + "TerrainClass", "Oceanic", "Adjacent",TRUE, FALSE } graphic = "b.colossus" graphic_alt = "-" @@ -1358,12 +1621,20 @@ sabotage = 0 sound = "w_colossus" sound_alt = "w_generic" helptext = _("\ -In the city where this wonder is built, +1 trade is added to every tile\ - that generates trade on its own.\ - Obsolete by: Automobile.\ +In the coastal city where this wonder is built, +1 trade is added to every\ + tile that makes trade. The city center tile gets an additional +1 trade.\ + Until you discover Steam Engine, the\ + Colossus city receives a discount on all maritime Commerce units:\n\ + Boat: 7 shields. \n\ + Trireme: 15 shields. \n\ + Goods: 20 shields. \n\ + Galley: 25 shields. \n\ + Caravel: 35 shields. \n\ + A trade route established from this city gets +40% one-time revenue,\ + and roughly +25% in ongoing revenue. \n\ + Obsolete by:Automobile.\ ") - [building_copernicus_observatory] name = _("Copernicus' Observatory") genus = "SmallWonder" @@ -1382,61 +1653,69 @@ upkeep = 0 sabotage = 0 sound = "w_copernicus_observatory" sound_alt = "w_generic" -; /* xgettext:no-c-format */ helptext = _("\ Boosts science production by 100% in the city where it is built.\ That is, the base science level before any improvements were made,\ is added to the total science. This wonder is never obsolete.\ ") -[building_cure_for_cancer] -name = _("Cure For Cancer") -genus = "GreatWonder" +[building_eiffel_tower] +name = _("Eiffel Tower") +genus = "SmallWonder" reqs = - { "type", "name", "range" - "Tech", "Genetic Engineering", "Player" + { "type", "name", "range", "present", "quiet" + "Tech", "Steam Engine", "Player", TRUE, FALSE + "Building", "Eiffel Tower", "Player", FALSE, TRUE } -graphic = "b.cure_for_cancer" +graphic = "b.eiffel_tower" graphic_alt = "-" obsolete_by = { "type", "name", "range" } -build_cost = 400 +build_cost = 125 upkeep = 0 sabotage = 0 -sound = "w_cure_for_cancer" +sound = "w_eiffel_tower" sound_alt = "w_generic" helptext = _("\ -This stunning technological achievement makes two content citizens\ - happy in all cities of all players who know Genetic\ - Engineering. In the event where there are not enough\ - content citizens to benefit from this effect, the wonder\ - applies to unhappy citizens (including those unhappy about military\ - activity), making each content then happy. This wonder is never obsolete.\ +The Eiffel Tower gives one free shield upkeep for units\ + to every city in your nation. This wonder is never obsolete.\ ") -[building_eiffel_tower] -name = _("Eiffel Tower") +[building_fusion_reactor] +name = _("Fusion Reactor") genus = "SmallWonder" reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Steam Engine", "Player", TRUE, FALSE - "Building", "Eiffel Tower", "Player", FALSE, TRUE + { "type", "name", "range", "present", "quiet" + "Tech", "Fusion Power", "Player", TRUE, FALSE + "Building", "Fusion Reactor","Player", FALSE, TRUE } -graphic = "b.eiffel_tower" +graphic = "b.fusion_reactor_wonder" graphic_alt = "-" obsolete_by = { "type", "name", "range" } -build_cost = 100 +build_cost = 700 upkeep = 0 sabotage = 0 -sound = "w_eiffel_tower" +sound = "w_fusion_reactor_wonder" sound_alt = "w_generic" -; /* xgettext:no-c-format */ helptext = _("\ -All your cities support one unit free of\ - shield upkeep. This wonder is never obsolete.\ +Replaces Power Plants with Fusion Reactor power in all your\ + cities. This boosts the +50% bonus of a Factory or Mfg. Plant to +90%. \n\ +➤ In a city with both a Factory and Mfg. Plant present, there is a\ + combined +180% production bonus. \n\ +"), _("\ +Pollution reduction from Recycling Center and Power Plants\ + is upgraded to a higher bonus of a flat -80%. \n\ +"), _("\ +➤ Only one Coal Plant, Hydro Plant, Nuclear Plant, or Fusion\ + Plant can have an active effect in a city. A nation that owns\ + the Fusion Reactor can sell off all Power Plants and gain a\ + large savings in ongoing upkeep costs. \n\ +"), _("\ +➤ The Fusion Reactor's surplus power gives 1 free unit upkeep\ + to every city in your nation, and 1 extra unit build slot.\ ") [building_genghis_khans_equestrian_school] @@ -1461,7 +1740,7 @@ sound = "w_sun_tzus_war_academy" sound_alt = "w_generic" helptext = _("\ Gives all mounted units +1 movement point, except for Cavalry. Must be\ - built in a city with Barracks I (not II). Obsolete by: Mobile Warfare.\ + built in a city with Barracks I (not II). Obsolete by:Mobile Warfare.\ ") [building_gibraltar_fortress] @@ -1470,32 +1749,41 @@ genus = "SmallWonder" reqs = { "type", "name", "range", "present", "quiet" "Tech", "Metallurgy", "Player", TRUE, FALSE + "Building", "Coastal Defense", "City", TRUE, FALSE "Building", "Gibraltar Fortress", "Player", FALSE, TRUE - "TerrainClass", "Oceanic", "Adjacent", TRUE, FALSE +; "TerrainClass", "Oceanic", "Adjacent", TRUE, FALSE ; redundant to #2 req. } graphic = "b.gibraltar_fortress" graphic_alt = "b.great_wall" obsolete_by = { "type", "name", "range" } -build_cost = 350 +build_cost = 330 upkeep = 0 sabotage = 0 sound = "w_gibraltar_fortress" sound_alt = "w_generic" helptext = _("\ -Gives a Coastal Defense in all your coastal cities. This has no effect\ - when Coastal Defense is already present. This Wonder must be built\ - in a coastal city. It does not become obsolete.\ +When facing attacks by sea, Gibraltar Fortress brings defensive capabilities\ + to cities with Coastal Defense, especially to the city in which it’s built:\n\ +"), _("\ +1. Reduces cost of Coastal Defense by 15, to 50 shields. \n\ +2. The city with Gibraltar Fortress gains a +100% defense bonus, for a total\ + of 3× defense against sea attacks. \n\ +3. All other cities with Coastal Defence gain +25% defense, for a total of 2.25×\ + defense against sea attacks. \n\n\ +"), _("\ +Gibraltar Fortress must be built in a city with Coastal Defense, and is never obsolete.\ ") [building_great_wall] name = _("Great Wall") genus = "SmallWonder" reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Masonry", "Player", TRUE, FALSE - "Building", "Great Wall", "Player", FALSE, TRUE + { "type", "name", "range", "present","quiet" + "Tech", "Construction", "Player", TRUE, FALSE + "Building", "Great Wall", "Player", FALSE, TRUE + "Tech", "Machine Tools", "World", FALSE, FALSE } graphic = "b.great_wall" graphic_alt = "-" @@ -1509,44 +1797,50 @@ sabotage = 0 sound = "w_great_wall" sound_alt = "w_generic" helptext = _("\ -The Great Wall protects your cities with City Walls. It takes three\ +The Great Wall protects your cities with City Walls. Unlike normal\ + City Walls, The Great Wall is impervious to Siege Rams. It takes three\ turns after founding a city for the Great Wall to extend protection\ to the new city. Also, the city must have been founded by you, or\ - assimilated to where less than a fifth of its citizens are foreign.\n\ + assimilated to where less than a fifth of its citizens are foreign. \n\ +"), _("\ The Great Wall gives no extra effect when City Walls are already present.\ However, regular City Walls still protect a city in which the Great\ - Wall has not yet activated.\nWarning! This Wonder is obsolete when\ - ANY nation in the world discovers Machine Tools. You may not know\ - which nations have Machine Tools. This makes it possible for you to\ - build an obsolete wonder!\ + Wall has not yet activated. \n Warning! This Wonder is obsolete when\ + ANY nation in the world discovers Machine Tools.\ ") [building_hanging_gardens] name = _("Hanging Gardens") genus = "SmallWonder" reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Pottery", "Player", TRUE, FALSE - "Building", "Hanging Gardens", "Player", FALSE, TRUE + { "type", "name", "range", "present","quiet", "survives" + "Tech", "Pottery", "Player", TRUE, FALSE, FALSE + "Building", "Hanging Gardens", "Player", FALSE, TRUE, FALSE +;requires 23Sept2021 changes to requirements.c, so obsolete wonders don't re-enable others + "Building", "Angkor Wat", "Player", FALSE, FALSE, TRUE + "Building", "Code of Hammurabi", "Player", FALSE, FALSE, TRUE + "Building","Mausoleum of Mausolos","Player", FALSE, FALSE, TRUE } graphic = "b.hanging_gardens" graphic_alt = "-" obsolete_by = { "type", "name", "range" - "Tech", "Railroad", "Player" + "Tech", "Steam Engine", "Player" } -build_cost = 200 +build_cost = 210 upkeep = 0 sabotage = 0 sound = "w_hanging_gardens" sound_alt = "w_generic" helptext = _("\ Makes two content citizens happy in every city in your nation.\ - In the event where there are no content citizens to get the\ - effect of Hanging Gardens, the wonder applies to unhappy citizens\ - (including those unhappy about military activity), making each content\ - then happy. Gives +2 luxury in the city where it is built.\ - Obsolete by: Railroad.\ + If there are no content citizens, the wonder makes one unhappy\ + citizen happy, even if unhappy about military activity. Gives\ + +2 luxury in the city where it’s built. \n\ +"), _(" +The Hanging Gardens are a Civil Wonder. You can build only one Civil Wonder. \n\ +"), _(" + Obsolete by:Steam Engine.\ ") [building_hoover_dam] @@ -1564,15 +1858,51 @@ obsolete_by = { "type", "name", "range" } build_cost = 600 -upkeep = 0 +upkeep = -15 sabotage = 0 sound = "w_hoover_dam" sound_alt = "w_generic" helptext = _("\ -Works exactly as a Hydro Plant in all your cities.\ - (This reduces pollution and increases the effects\ - of Factories and Mfg. Plants.) Must be built adjacent\ - to a river. This wonder is never obsolete.\ +In the city where it’s built, Hoover Dam counts exactly as a Hydro Plant,\ + Factory, and Manufacturing Plant. If any of those buildings already\ + exist in the city, they will have no effect and can be sold. \n\ +"), _(" +In all cities with a Hydro Plant, Hoover Dam increases their +20% production\ + bonus for each Factory and Mfg. Plant to +27%. (In other words, it increases\ + the production bonus on your Hydro Plants by +35%.) \n\ +"), _(" +➤ In the city with Hoover Dam, the above bonuses make for a combined +154%\ + production bonus, and a 50% decrease in pollution from production. \n\ +"), _("\ +Hoover Dam reduces the cost of other Hydro Plants by 5 shields. The\ + excess power from Hoover Dam is so great that in its home city, it\ + supports up to 15 free upkeep for other buildings!\ +"), _(" +Must be built adjacent to a river. This wonder is never obsolete.\ +") + +[building_internet] +name = _("The Internet") +genus = "SmallWonder" + reqs = + { "type", "name", "range", "present", "quiet" + "Tech", "Computers", "Player", TRUE, FALSE + "Building", "The Internet", "Player", FALSE, TRUE + } +graphic = "b.internet" +graphic_alt = "b.seti_program" +obsolete_by = + { "type", "name", "range" + } +build_cost = 600 +upkeep = 0 +sabotage = 0 +sound = "w_internet" +sound_alt = "w_generic" +helptext = _("\ +Adds to science production in all your cities with\ + a Research Lab, 100% of base output.\ + This Wonder does not become obsolete.\ ") [building_isaac_newtons_college] @@ -1588,12 +1918,11 @@ graphic_alt = "-" obsolete_by = { "type", "name", "range" } -build_cost = 400 +build_cost = 420 upkeep = 0 sabotage = 0 sound = "w_isaac_newtons_college" sound_alt = "w_generic" -; /* xgettext:no-c-format */ helptext = _("\ Adds 100% of base science production to every city in your\ nation that has a University. That is, the boost that a\ @@ -1602,56 +1931,56 @@ Adds 100% of base science production to every city in your\ This wonder is never obsolete.\ ") -[building_jtids] -name = _("JTIDS") +[building_js_bachs_cathedral] +name = _("J.S. Bach's Cathedral") genus = "SmallWonder" reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Computers", "Player", TRUE, FALSE - "Building", "JTIDS", "Player", FALSE, TRUE + { "type", "name", "range", "present", "quiet" + "Tech", "Theology", "Player", TRUE, FALSE + "Building", "J.S. Bach's Cathedral", "Player", FALSE, TRUE } -graphic = "b.seti_program" +graphic = "b.js_bachs_cathedral" graphic_alt = "-" obsolete_by = { "type", "name", "range" } -build_cost = 230 +build_cost = 300 upkeep = 0 sabotage = 0 -sound = "w_seti_program" +sound = "w_js_bachs_cathedral" sound_alt = "w_generic" -; /* xgettext:no-c-format */ helptext = _("\ -JTIDS (Joint Tactical Information Distribution System) is a radio\ - battlefield information network that provides real-time intel to forces\ - on the ground. Effectively, this Wonder modernizes the weaponry and info systems\ - for all the infantry in your army.\n\n\ -All foot soldiers and Mechanized Infantry are built with +1 vet level.\ - Odds of veteran promotion are increased.\ +Makes two unhappy citizens content in every city in your nation\ + (including citizens unhappy about military activity).\ + This wonder is never obsolete.\ ") -[building_js_bachs_cathedral] -name = _("J.S. Bach's Cathedral") +[building_jtids] +name = _("JTIDS") genus = "SmallWonder" reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Theology", "Player", TRUE, FALSE - "Building", "J.S. Bach's Cathedral", "Player", FALSE, TRUE + { "type", "name", "range", "present", "quiet" + "Tech", "Computers", "Player", TRUE, FALSE + "Building", "JTIDS", "Player", FALSE, TRUE } -graphic = "b.js_bachs_cathedral" +graphic = "b.seti_program" graphic_alt = "-" obsolete_by = { "type", "name", "range" } -build_cost = 300 +build_cost = 230 upkeep = 0 sabotage = 0 -sound = "w_js_bachs_cathedral" +sound = "w_seti_program" sound_alt = "w_generic" helptext = _("\ -Makes two unhappy citizens content in every city in your nation\ - (including citizens unhappy about military activity).\ - This wonder is never obsolete.\ +JTIDS (Joint Tactical Information Distribution System) is a radio\ + battlefield information network that provides real-time intel to forces\ + on the ground. Effectively, this Wonder modernizes the weaponry and info systems\ + for all the infantry in your army. \n\n\ +"), _("\ +All foot soldiers and Mechanized Infantry are built with +1 vet level.\ + Odds of veteran promotion are increased.\ ") [building_king_richards_crusade] @@ -1674,10 +2003,10 @@ sabotage = 0 sound = "w_king_richards_crusade" sound_alt = "w_generic" helptext = _("\ -In the city where it is built, adds one extra shield resource on every\ - tile. Lets you build one extra qualifying unit per turn —— without\ +In the city where it’s built, adds one extra shield resource on every\ + tile and lets you build one extra infantry unit per turn —— without\ Conscription tech.\ - Obsolete by: Robotics.\ + Obsolete by:Robotics.\ ") [building_leonardos_workshop] @@ -1700,7 +2029,7 @@ sabotage = 0 sound = "w_leonardos_workshop" sound_alt = "w_generic" helptext = _("\ -Upgrades two obsolete units per game turn. Obsolete by:\ +Upgrades two obsolete units per game turn. Obsolete by:\ Automobile.\ ") @@ -1726,7 +2055,8 @@ sound = "w_lighthouse" sound_alt = "w_generic" helptext = _("\ Gives all your sea units 2 additional movement points,\ - while increasing their vision. Obsolete by: Miniaturization.\ + while increasing their vision. Must be built adjacent\ + to Ocean. Obsolete by:Miniaturization.\ ") [building_magellans_expedition] @@ -1751,7 +2081,45 @@ sound_alt = "w_generic" helptext = _("\ All your new sea units built in cities in your nation start with an\ additional veteran level (this is cumulative with any Port Facility.)\ - This wonder is never obsolete.\ + Must be built in a coastal city. This wonder is never obsolete.\ +") + +[building_magna_carta] +name = _("Magna Carta") +genus = "SmallWonder" +reqs = + { "type", "name", "range", "present", "quiet" + "Tech", "Monarchy", "Player", TRUE, FALSE + "Building", "Magna Carta", "Player", FALSE, TRUE + } +graphic = "b.magna_carta" +graphic_alt = "-" +obsolete_by = + { "type", "name", "range" + } +build_cost = 300 +upkeep = 0 +sabotage = 0 +sound = "w_magna_carta" +sound_alt = "w_generic" +helptext = _("\ +If you are a Monarchy, the Magna Carta establishes Constitutional Monarchy.\ + This makes Monarchy more like a representative government: \n\ +"), _(" +Constitutional Monarchy summary:\n\ + ➣ Empire base size goes from 11 to 23 (identical to +1 content citizen.) \n\ + ➣ All Land tiles get celebration bonus for free. (+1 trade) \n\ + ➣ Allows rapture in cities founded by you. \n\ + ➣ Magna Carta city can build Peasants. \n\ + ➣ Magna Carta city can build an extra infantry or Peasant per turn, without Conscription. \n\ +"), _(" +Setbacks from standard Monarchy:\n\ + ➣ One unit may be used for Martial Law (not 3). \n\ + ➣ One unit is free of upkeep (not 3). \n\ + ➣ 2 military units may be abroad. Each extra causes a discontent citizen. \n\ + ➣ Gives you a Senate, which can be ignored if both King Richard’s Crusade \ +and J.S. Bach’s Cathedral are owned. \n\ +See Government⟶Monarchy for more info.\ ") [building_manhattan_project] @@ -1771,7 +2139,7 @@ upkeep = 0 sabotage = 0 sound = "w_manhattan_project" sound_alt = "w_generic" -;helptext is set in client/helpdata.c:helptext_wonder() +;helptext is set in client/helpdata.c.helptext_wonder() helptext = _("\ Allows all nations who know Nuclear Fission to make nuclear weapons.\ This Wonder does not become obsolete.\ @@ -1780,6 +2148,7 @@ Allows all nations who know Nuclear Fission to make nuclear weapons.\ [building_marco_polos_embassy] name = _("Marco Polo's Embassy") genus = "SmallWonder" +flags = "SaveSmallWonder" reqs = { "type", "name", "range", "present", "quiet" "Tech", "Trade", "Player", TRUE, FALSE @@ -1795,11 +2164,80 @@ upkeep = 0 sabotage = 0 sound = "w_marco_polos_embassy" sound_alt = "w_generic" -; /* xgettext:no-c-format */ helptext = _("\ This Wonder increases Trade, the very lifeblood of your tax income, science output,\ and luxury for happiness. With this Wonder, Trade in each city increases by 40%.\ - This Wonder does not become obsolete.\ + This Wonder does not become obsolete, and cannot be lost.\ +") + +[building_mausoleum_of_mausolos] +name = _("Mausoleum of Mausolos") +genus = "SmallWonder" +reqs = + { "type", "name", "range","present","quiet", "survives" + "Tech", "Ceremonial Burial", "Player", TRUE, FALSE, FALSE + "Building", "Mausoleum of Mausolos", "Player", FALSE, TRUE, FALSE +;requires 23Sept2021 changes to requirements.c, so obsolete wonders don't re-enable others + "Building", "Angkor Wat", "Player", FALSE, FALSE, TRUE + "Building", "Hanging Gardens", "Player", FALSE, FALSE, TRUE + "Building", "Code of Hammurabi", "Player", FALSE, FALSE, TRUE + } +graphic = "b.mausoleum" +graphic_alt = "-" +obsolete_by = + { "type", "name", "range", "survives" + "Tech", "Radio", "Player", FALSE + } +build_cost = 200 +upkeep = 0 +sabotage = 0 +sound = "w_oracle" +sound_alt = "w_generic" +helptext = _("\ +The Mausoleum of Mausolos brings a spirit of prudence to your nation, giving\ + subtle security and reduced corruption. This makes your people happier. \n\ +"), _(" +➤ A Courthouse or City Walls gives each city +1 content citizen, unless\ + unhappy about military activity. \n\ +➤ Having both the above results in +1 content and +1 happy citizen. \n\ +➤ Acts like half a Courthouse in cities which lack Courthouse or\ + Supreme Court effects: \n\ + • 30% corruption reduction \n\ + • Tile corruption penalty begins at 4 in Anarchy and Despotism (not 3) \n\ + • 10% bonus vs diplomatic actions and combat \n\ +➤ Adds (at least) +35% to the cost of bribing your units. \n\ +➤ Prevents your cities from being incited to revolt. \n\ +➤ Halves the odds of investigating your cities (85% / 2 = 43%) \n\ +"), _(" +The Mausoleum of Mausolos is a Civil Wonder. You can make only one Civil Wonder. \n\ +Obsolete by:Radio.\ +") + +[building_medici_bank] +name = _("Medici Bank") +genus = "SmallWonder" +reqs = + { "type", "name", "range", "present", "quiet" + "Tech", "Banking", "Player", TRUE, FALSE + "Building","Medici Bank", "Player", FALSE, TRUE + "Gov", "Communism", "Player", FALSE, TRUE + } +graphic = "b.medici_bank" +graphic_alt = "-" +obsolete_by = + { "type", "name", "range", "survives" + "Tech", "Fusion Power", "Player", FALSE + } +build_cost = 300 +upkeep = 0 +sabotage = 0 +sound = "w_medici_bank" +sound_alt = "w_generic" +helptext = _("\ +The Medici Bank gives every city with a Bank +7% in gold revenue,\ + and the rate on shield-to-coinage exchange also increases by +7%.\ + This wonder has no effect under Communism. \n\ +Obsolete by:Fusion Power.\ ") [building_michelangelos_chapel] @@ -1825,39 +2263,34 @@ This Wonder counts as a Cathedral in all cities which lack one.\ That is, it makes 3 unhappy citizens content in each city,\ but does not affect citizens unhappy about military activity.\ (Theology increases the effect by +1. Communist government\ - reduces the effect by -1.)\ + reduces the effect by -1.) \ "), _(" In cities which already have a Cathedral, this Wonder enhances the\ effects of the Cathedral, adding +1 happy citizen and +1 forced content.\ This Wonder is never obsolete.\ ") -;this is wonder #61 -[building_mausoleum_of_mausolos] -name = _("Mausoleum of Mausolos") +[building_olympics] +name = _("The Olympics") genus = "SmallWonder" reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Ceremonial Burial", "Player", TRUE, FALSE - "Building", "Mausoleum of Mausolos", "Player", FALSE, TRUE + { "type", "name", "range", "present", "quiet" + "Tech", "Currency", "Player", TRUE, FALSE + "Building", "The Olympics", "Player", FALSE, TRUE } -graphic = "b.mausoleum" -graphic_alt = "b.oracle" +graphic = "b.olympics" +graphic_alt = "-" obsolete_by = - { "type", "name", "range", "survives" - "Tech", "Radio", "Player", FALSE + { "type", "name", "range" } -build_cost = 200 +build_cost = 100 upkeep = 0 sabotage = 0 -sound = "w_oracle" +sound = "w_olympics" sound_alt = "w_generic" helptext = _("\ -With this wonder, City Walls and Courthouses each make one unhappy citizen\ - content in their city, unless that citizen is unhappy about military activity.\ - Also, no cities in the empire with this Wonder can be incited to revolt.\ - The discovery of Radio makes the Mausoleum obsolete.\ -") +THIS WONDER DOES NOTHING AND IS RESERVED FOR FUTURE RELEASE.\ + ") [building_oracle] name = _("Oracle") @@ -1881,15 +2314,75 @@ sound_alt = "w_generic" helptext = _("\ Makes two of your unhappy citizens content in every city\ with a Temple in your nation. Does not affect citizens made\ - unhappy by military activity. Obsolete by: Theology.\ + unhappy by military activity. Obsolete by:Theology.\ +") + +[building_pasteur_institute] +name = _("Pasteur Institute") +genus = "GreatWonder" +reqs = + { "type", "name", "range" + "Tech", "Microbiology", "Player" + } +graphic = "b.pasteur_institute" +graphic_alt = "-" +obsolete_by = + { "type", "name", "range" + } +build_cost = 400 +upkeep = 0 +sabotage = 0 +sound = "w_pasteur_institute" +sound_alt = "w_generic" +helptext = _("\ +This wonder is a breakthrough for the health of the world. It makes\ + two content citizens happy in all cities of all players who\ + know Microbiology. If there are no content citizens, the wonder\ + makes one unhappy citizen happy, even if unhappy about military\ + activity. This wonder is never obsolete.\ +") + +[building_pax_dei] +name = _("Pax Dei") +genus = "GreatWonder" +flags = "PaxDeiCounter" +reqs = + { "type", "name", "range", "present", "quiet" + "Tech", "Philosophy", "Player", TRUE, FALSE + "Building", "Pax Dei", "Player", FALSE, TRUE + "Building", "Pax Dei", "World", FALSE, TRUE + "Tech", "Theocracy", "World", FALSE, FALSE + } +graphic = "b.pax_dei" +graphic_alt = "-" +obsolete_by = + { "type", "name", "range", "survives" + "Tech", "Theocracy", "World", FALSE + } +build_cost = 115 +upkeep = 0 +sabotage = 0 +sound = "w_pax_dei" +sound_alt = "w_generic" +helptext = _("\ +Pax Dei is a socio-philosophical movement against war and violence. \n\ +"), _("\ +All nations with Philosophy gain +2 unhappy about each aggressive military\ + unit, and a Senate. \n\ +Nations with Monotheism are unable to attack unless defending their own\ + domestic territory! \n\ +"), _("\ +Obsolete by: Theocracy, or 13 turns after built. \n\ +(The server settings 'pax_dei_counter' and 'pax_dei_set' may\ + alter this wonder’s effects in specific games.)\ ") [building_pyramids] name = _("Pyramids") genus = "SmallWonder" reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Masonry", "Player", TRUE, FALSE + { "type", "name", "range", "present", "quiet" + "Tech", "Mathematics", "Player", TRUE, FALSE "Building", "Pyramids", "Player", FALSE, TRUE } graphic = "b.pyramids" @@ -1897,18 +2390,44 @@ graphic_alt = "-" obsolete_by = { "type", "name", "range" } -build_cost = 160 +build_cost = 200 upkeep = 0 sabotage = 0 sound = "w_pyramids" sound_alt = "w_generic" -; /* xgettext:no-c-format */ helptext = _("\ -Every city will gain +25% to its food storage when population changes.\ - In addition, the city with the Pyramids can rapture when celebrating.\ +Every city will gain +25% to its food storage when the city grows,\ + starves, or is founded. In addition, the city with the Pyramids\ + can rapture when celebrating.\ This Wonder does not become obsolete.\ ") +[building_roman_colosseum] +name = _("Roman Colosseum") +genus = "SmallWonder" +reqs = + { "type", "name", "range", "present", "quiet" + "Tech", "Engineering", "Player", TRUE, FALSE + "Building", "Roman Colosseum", "Player", FALSE, TRUE + } +graphic = "b.roman_colosseum" +graphic_alt = "-" +obsolete_by = + { "type", "name", "range" + } +build_cost = 400 +upkeep = 0 +sabotage = 0 +sound = "w_roman_colosseum" +sound_alt = "w_generic" +helptext = _("\ +The Roman Colosseum centralizes and gives prestige to the entertainment\ + events of your empire. Every city with an Amphitheater gains +1 happy\ + citizen and +1 luxury. In all your cities, Entertainers add 3 luxury\ + instead of 2. This means your Entertainers equal the net trade value of\ + Taxmen, Scientists, and Merchants. This Wonder is never obsolete.\ +") + [building_shakespeares_theatre] name = _("Shakespeare's Theater") rule_name = "Shakespeare's Theatre" ; en_GB used originally @@ -1934,6 +2453,34 @@ Makes all angry and unhappy citizens content in the city where it\ This Wonder does not become obsolete.\ ") +[building_sphinx] +name = _("The Sphinx") +genus = "SmallWonder" +reqs = + { "type", "name", "range", "present", "quiet" + "Gov", "Despotism", "Player", TRUE, FALSE + "Tech", "Philosophy", "Player", FALSE, TRUE + "Building", "The Sphinx", "Player", FALSE, TRUE + } +graphic = "b.sphinx" +graphic_alt = "-" +obsolete_by = + { "type", "name", "range" + "Tech", "Philosophy", "Player" + } +build_cost = 70 +upkeep = 0 +sabotage = 0 +sound = "w_sphinx" +sound_alt = "w_generic" +helptext = _("\ +The Sphinx is said to watch over all citizens to ensure they are good.\ + The result is loss of tile corruption penalties on all worked tiles in\ + the city where it’s built. As a shared work of community art and culture, it\ + adds +1 luxury. In addition, it reduces corruption in the city by half. \n\ +Obsolete by:Philosophy.\ +") + ;this should be wonder #65 if we counted correctly and need it for the "statue hack" to determine if player can get gov. [building_statue_of_liberty] name = _("Statue of Liberty") @@ -1957,9 +2504,10 @@ helptext = _("\ Allows you to instantly change government, including governments not\ yet researched by your civilization, and without the transition period\ of Anarchy. It also allows unprovoked declaration of war regardless of\ - any Senate or United Nations. Democracies cannot fall into Anarchy from\ - two turns of city disorder.\n\ - This Wonder does not become obsolete.\ + any Senate or United Nations. Democracies can’t fall into Anarchy from\ + two turns of city disorder. \n\ +"), _("\ +This Wonder does not become obsolete.\ ") [building_statue_of_zeus] @@ -1982,10 +2530,15 @@ sound = "w_oracle" sound_alt = "w_generic" helptext = _("\ The powerful Zeus gives order and organization to both city and nation.\ - In every city in your nation, this Wonder neutralizes the unhappiness\ - caused by one military unit. In the city the statue is located, it makes\ - one citizen happy and provides free upkeep to 4 units. Except for one permanent\ - happy citizen, the discovery of Tactics makes the Statue of Zeus obsolete.\ + In every city in your nation, this Wonder neutralizes one unhappy\ + citizen caused by military units. (For governments who do not experience\ + discontent from military activity, it simply makes one citizen content.) \n\ +"), _(" +Before the discovery of The Republic, increases odds of promotion by one third. \n\ +"), _(" +In the city the statue is located, it makes one citizen happy and provides\ + free upkeep to 4 units. Except for one permanent happy citizen, the\ + discovery of Tactics makes the Statue of Zeus obsolete.\ ") [building_supreme_court] @@ -2006,7 +2559,6 @@ upkeep = 0 sabotage = 0 sound = "w_great_library" sound_alt = "w_generic" -; /* xgettext:no-c-format */ helptext = _("\ With respect to corruption, incite protection, upkeep, and other bonuses, the\ Supreme Court gives the same effect as an extra Courthouse in all your cities. By\ @@ -2029,7 +2581,7 @@ obsolete_by = { "type", "name", "range" "Tech", "Mobile Warfare", "Player" } -build_cost = 300 +build_cost = 310 upkeep = 0 sabotage = 0 sound = "w_sun_tzus_war_academy" @@ -2037,8 +2589,8 @@ sound_alt = "w_generic" helptext = _("\ All your new military land units produced in cities in your nation\ start with an additional veteran level (this is cumulative with any\ - Barracks in a city: with both, units are created as Hardened).\ - Obsolete by: Mobile Warfare.\ + Barracks in a city:with both, units are created as Hardened).\ + Obsolete by:Mobile Warfare.\ ") [building_temple_of_artemis] @@ -2064,10 +2616,10 @@ sound = "w_oracle" sound_alt = "w_generic" helptext = _("\ The bounteous Artemis bestows a multitudinous benefaction to all cities\ - with Temples: +1 production, +1 luxury, +1 science, and +1 gold.\ + with Temples:+1 production, +1 luxury, +1 science, and +1 gold.\ Requires a Temple in the city where it will be built. (This wonder also\ - recovers the lost bonus shield in cities built on resources of +1 shield:\ - i.e. Grassland shield resource, Tundra fur.) Obsolete by: Computers.\ + recovers the lost bonus shield in cities built on resources of +1 shield:\ + i.e. Grassland shield resource, Tundra fur.) Obsolete by:Computers.\ ") [building_teslas_laboratory] @@ -2093,31 +2645,6 @@ Upgrades one obsolete unit per turn. Reduces price of unit upgrades by\ 20%. This Wonder does not become obsolete.\ ") -[building_internet] -name = _("The Internet") -genus = "SmallWonder" - reqs = - { "type", "name", "range", "present", "quiet" - "Tech", "Computers", "Player", TRUE, FALSE - "Building", "The Internet", "Player", FALSE, TRUE - } -graphic = "b.internet" -graphic_alt = "b.seti_program" -obsolete_by = - { "type", "name", "range" - } -build_cost = 600 -upkeep = 0 -sabotage = 0 -sound = "w_internet" -sound_alt = "w_generic" -; /* xgettext:no-c-format */ -helptext = _("\ -Adds to science production in all your cities with\ - a Research Lab, 100% of base output.\ - This Wonder does not become obsolete.\ -") - [building_united_nations] name = _("United Nations") genus = "GreatWonder" @@ -2130,15 +2657,17 @@ graphic_alt = "-" obsolete_by = { "type", "name", "range" } -build_cost = 600 +build_cost = 500 upkeep = 0 sabotage = 0 sound = "w_united_nations" sound_alt = "w_generic" helptext = _("\ -Creates a World Senate that may prevent declarations of war in some circumstances. If\ - any city in the world is in revolt for more than two turns, its whole government falls.\ - This Wonder does not become obsolete.\ +Creates a World Senate with the following effects:\n\ + 1. Breaking of a treaty by any nation, will give casus belli to all other nations.\ + 2. May block declarations of war, as if each national government had a Senate.\ + 3. If any city in the world is in revolt for more than two turns, its government\ + goes into Anarchy for a turn. This Wonder does not become obsolete.\ ") [building_voyage_of_darwin] @@ -2165,13 +2694,20 @@ In the city where this wonder is built, +1 trade is added to every tile\ This Wonder is never obsolete.\ ") -[building_womens_suffrage] +[building_womens_suffrage_small_wonder] name = _("Women's Suffrage") genus = "SmallWonder" reqs = { "type", "name", "range", "present", "quiet" "Tech", "Industrialization", "Player", TRUE, FALSE "Building", "Women's Suffrage", "Player", FALSE, TRUE + "Building", "Women's Suffrage​", "Player", FALSE, TRUE ;has a zero width space in it, for the great wonder + "Building", "Women's Suffrage​", "World", TRUE, TRUE ;has a zero width space in it, for the great wonder + "Gov", "Despotism", "Player", FALSE, TRUE + "Gov", "Monarchy", "Player", FALSE, TRUE + "Gov", "Theocracy", "Player", FALSE, TRUE + "Gov", "Communism", "Player", FALSE, TRUE + "Gov", "Nationalism", "Player", FALSE, TRUE } graphic = "b.womens_suffrage" graphic_alt = "-" @@ -2184,11 +2720,76 @@ sabotage = 0 sound = "w_womens_suffrage" sound_alt = "w_generic" helptext = _("\ -In the capacity of reducing Military Unhappiness, this Wonder neutralizes the\ - unhappiness caused by two military units. This Wonder has no other\ - effect. It does not confer bonuses against hostile diplomats like a Police\ - Station. It gives no bonus to cities which already have a Police Station.\ - This Wonder does not become obsolete.\ +Women's Suffrage brings equality and happiness to half the population, resulting\ + in +1 happy in every city with Republic and Democracy. On the other hand, once\ + this Wonder is achieved by any player in the world, any Republic or Democracy\ + that does NOT have it, will suffer +1 unhappy citizen, as vocal dissidents will\ + arise and demand the adoption of this progressive advancement.\ +") + +;This has a zero width space in it to be the first one made. +[building_womens_suffrage_great_wonder] +name = _("Women's Suffrage​") ;great wonder marker +genus = "GreatWonder" +reqs = + { "type", "name", "range", "present", "quiet" + "Tech", "Industrialization", "Player", TRUE, FALSE + "Building", "Women's Suffrage", "Player", FALSE, TRUE ;can't own small wonder. + "Building", "Women's Suffrage​", "Player", FALSE, TRUE ;can't own great wonder. has a zero width space in it, for the great wonder + "Gov", "Despotism", "Player", FALSE, TRUE + "Gov", "Monarchy", "Player", FALSE, TRUE + "Gov", "Theocracy", "Player", FALSE, TRUE + "Gov", "Communism", "Player", FALSE, TRUE + "Gov", "Nationalism", "Player", FALSE, TRUE + } +graphic = "b.womens_suffrage" +graphic_alt = "-" +obsolete_by = + { "type", "name", "range" + } +build_cost = 300 +upkeep = 0 +sabotage = 0 +sound = "w_womens_suffrage" +sound_alt = "w_generic" +helptext = _("\ +Women's Suffrage brings equality and happiness to half the population, resulting\ + in +1 happy in every city with Republic and Democracy. On the other hand, once\ + this Wonder is achieved by any player in the world, any Republic or Democracy\ + that does NOT have it, will suffer +1 unhappy citizen, as vocal dissidents will\ + arise and demand the adoption of this progressive advancement!\ +") + +[building_ziggurat] +name = _("Ziggurat") +genus = "SmallWonder" +flags = "VisibleByOthers" +reqs = + { "type", "name", "range", "present", "quiet" + "Tech", "Masonry", "Player", TRUE, FALSE + "Building", "Ziggurat", "Player", FALSE, TRUE + "Gov", "Despotism","Player", TRUE, FALSE + } +graphic = "b.ziggurat" +graphic_alt = "-" +obsolete_by = + { "type", "name", "range", "present" + "Tech", "Monarchy", "Player", TRUE + } +build_cost = 80 +upkeep = 0 +sabotage = 0 +sound = "w_ziggurat" +sound_alt = "w_generic" +helptext = _("\ +The Ziggurat moves the production bonus from your Palace to the Ziggurat city,\ + and gains the same corruption reduction and happy bonus effects. \n \ +The Ziggurat gathers all ruling functions of early civilization into one\ + wondrous building. It counts as a Granary, Temple, and Barracks. In cities\ + without Walls or Fortifications, it gives a defense bonus similar to\ + Fortifications, but gives a guaranteed 1.75× defense, regardless of attacker\ + or terrain type. \n\ +Obsolete by:Monarchy or switching from Despotism.\ ") [building_capitalization] @@ -2208,6 +2809,12 @@ build_cost = 999 upkeep = 0 sabotage = 0 helptext = _("\ -This is not a normal improvement. Setting production to Coinage converts\ - normal output into tax output (money, coins!)\ +Coinage converts production output to gold. The base rate is 2 shield\ + to 3 gold. The base rate is favorable only in niche contexts. Under\ + non-Communist government, city improvements increase the rate of return:\n\ + ➤ 1.50 gold per shield: Base rate. \n\ + ➤ 1.75 gold per shield: Marketplace (adds +25%). \n\ + ➤ 2.00 gold per shield: Bank (adds +25%). \n\ + ➤ 2.25 gold per shield: Stock Exchange + The Corporation (adds +25%). \n\ +Fractional income is resolved by randomized Banker’s Rounding.\ ") diff --git a/freeciv/freeciv/data/mp2c-occ/changelog.txt b/freeciv/freeciv/data/mp2c-occ/changelog.txt new file mode 100644 index 000000000..da859bc66 --- /dev/null +++ b/freeciv/freeciv/data/mp2c-occ/changelog.txt @@ -0,0 +1,564 @@ +Brief Explanations of goals and challenges. + Simplicity vs. Complexity. + Unneeded complexity should be reduced. Where needed for balance it is acceptable, but look for + other additions or modifications to ultimately reduce it. + Simplicity is ideal exactly up to the point where it doesn't create imbalance, spam, or golden + path. Sometimes this can be obtained quite easily, other times it is difficult and first + solutions to solve balance issues might be more complex then later ways are found to reduce it. + Balance, Playability, Realism, ideally all three, conflicts are resolved in that respective order. + Several other Manifesto points: + "Game of a lifetime", "Depth of strategy, diversity of strategy: i.e., reduce spamming contexts, + reduce/eliminate Golden Path formulas." + + What motivates Ruleset additions + Obviously a lot of new things appear, which seems to be throwing "the kitchen sink into the rules + just for the fun of it." This is not what is happening. Everything is driven by #1 goal of balance, + and additions happen when the easiest way to achieve that is to add something. Some new additions + rarely happen because of Playability and Realism, but most are because of Balance. We can't just + throw in "Saw Mill" because it seems "cool", as this may affect the balance of every other thing. + Rather, when a balance issue is identified, sometimes the easiest way to solve it is through + creating a "holistic" counterbalance. If that counterbalance also supplies more playability, fun, + and realism, THEN we add it. + Issues + 2x movement, side effect balancing. + Non-infinite rails, side effect balancing. + Rewonder 1.0, side effect balancing. Largest side effects: + 1. overpowering the rapture-based govs. + 2. "counts as a ... in every city" had rendered many improvements in the game useless, e.g. power plant, + hydro plant, nuclear plant, police station, cathedral, courthouse, etc. One by one, these are being + morphed into more interesting layered effects instead of just "x in every city", which worked for + Great Wonders fine, but created a kind of exponential imbalance where the more powerful you were, + the more powerful you were (because the wonders represent cheaper and cheaper improvements), thus + resulting in a more exaggerated power imbalance between players. + Almost all changes since MP2 started have been in response to these. Most smaller areas have already been + resolved or finalized (air unit balance and mechanics, unreachable exploits, infinite rails, etc.) + +Focus goals for MP2-Caravel +1. Increase splendor of the Bronze Age. Define your national race, characteristics, and unique path. +1a. Increase progress in the ruleset goal that the variety of wonders is such that there are too many to build: if you try, say hello + to Horseys coming for you! Contunued enhancing of the "Too many wonders" characteristic continues to reduce the sameness or + similarity in national characteristics and same strategies, especially among the "Wonderboy" players. Each nation has to + carefully pick its diverse traits and advantages. Final result: more strategic breadth and variety, further progress toward + the goal of "game of a lifetime", continued elimination of "golden path" traits of the game. +2. Attempt the Final Re-balance of what 2x movement rates have done to foot units. + Make Foot units a true tactical component again. +3. Re-balance of Govs toward the vibe and vision of what we know it should be like. +4. Enhance Trade routes and other mechanics to increase the Diplomatic / Economic bloc / Sovereign concerns of + each individual nation: Nerf mechanics forcing gang-alliance loyalties. + +WONDERS: +======== +1. Colossus: +1 trade on city center, -5 cost on most commerce units built in that city. 2 notch or ~22% increase to trade in its city. Bug-fix: Now must be built adjacent to Ocean. +2. Hanging Gardens now costs 210 and is obsolete by Steam Engine: + increase diversity of other early wonder strategies + encourage Frigates before Ironclads + more difficult for representative govs to rapture simultaneous to mid-game invasions +3. Magna Carta, new wonder, creates a new government Constitutional Monarchy which is half between Monarchy and Republic. + for the price of Oracle, Eiffel Tower, and Statue of Zeus, you basically get those same effects and a Republic-ish government: + 1 extra content, 1 free unit upkeep, 1 more content about military than Republic, extra trade on land tiles, ability to rapture. + One can also consider no lost turn of anarchy as a hidden discount in the 300 shield price. + What you don't get: 1 free trade on water (unless celebrating), lower chance of civil war, 80% max tax, the ability to choose + those 300 shields went to some other more desired first investment than Oracle, Zeus, Eiffel Tower, as much trust from your + peaceful neighbours. + What you get Republic that Republic doesn't, if it had spent 300 on Oracle, Eiffel Tower, and Zeus: one free martial law, + keep your capital production bonus, the ability to still make 1) Oracle, Eiffel Tower, and Zeus; 2) Your "free" Oracle and Zeus won't + expire/become obsolete, less trust from your neighbours. +4. New Wonder Appian Way: Foot units, Chariots and Wagons get move bonus from Appian Way. City with Appian gets discounts on Wagons. + increases revenue from trade routes approx. 10%, gives +1 trade to every road tile in its home city, + workers +1/3 move and build roads at double speed +5. Women's Suffrage small wonder combined with JSB small wonder made Democracy almost immune to the intended disadvantages it's supposed to have + to counterbalance its superior economy. Women's Suffrage now counts as +1 happy in every city. This will keep a city content from one military + but not necessarily help rapture it since rapture needs no unhappy; instead of formerly, 4 unhappy citizens about military all being forced + content. This makes slightly tunes Democracies to perform better at Peace and not as well for war. However, this also represents another slight + nerf to democracy because once ONE player has it, it causes discontent in all representative governments which DON'T have it, thereby causing + an obligatory 300 shield expense for democracies OR a nerf of +1 unhappy person in all democracies without it. +6. United Nations Wonder has new features which make it more globally interesting and strategic. + 1. When someone violates a treaty with another player, United Nations will give the whole world casus belli against that player. + 2. Now that casus belli is tuned to work better, this opens up a lot more diplomatic intrigue and strategies from this wonder. + 3. Cost 500, was 600. +7. Statue of Zeus gains new ability, increases odds of veteran promotion by one third prior to discovery of Republic. +8. Gibraltar Fortress was another "wonder in every city" that made the original improvement worthless, while itself adding no extra dynamic to the + game. It now becomes an extra commitment in cost to make existing coastal defenses stronger; also gives the one city it's built in a 3x defense + against sea attacks, as an additional point of interest to balance out the new bombard abilities of battleships. Cost: 330 (was 350) +9. Hoover as small wonder made FOUR different improvements useless. This was an acceptable hack since Power Plants were one of the very + few areas that was imbalanced in original Civ2. Now, all 4 power plants are well-balanced, uniquely useful, and create different Economic + paths and decisions regarding preferences over production/pollution/investment costs/tech priorities. Hoover is now a mega-production wonder + in its individual city while giving small bonuses to all hydro plants in other cities. See also: Power Plants. +10. Fusion Reactor. The wonder model of "counts as x all cities" was moved from Hoover to The Fusion Reactor, which makes more sense. This model is + now frowned on for small wonders but, in this case it makes sense in the very end game when no one wants to be messing with power + plant upgrades in 75 cities. Not just for that reason: the major bonus of Fusion Power is selling off all the other power plants and going to + lower upkeep, lower pollution, and instantly having fusion power in all newly acquired cities. +11. Pyramids gain from the server upgrade on EFT_GROWTH and confer 25% food to newly founded cities, now cost 200, and require Mathematics. +12. Wonder price adjustments + ** HG 210 + ** A.Smith 320 - it's powerful! + ** Eiffel 125 - it was underpriced + ** Isaac 420 - slightly discourage everyone doing isaac + ** Sun Tzu 310 - slightly discourage everyone having hardened units +13. The Sphinx, cost 70, tech req: none, reduces tile corruption (anarchy/despotism), halves city corruption, gives +1 luxury to city. +14. Marco Polo, as an embassy and outer relations/connections type of wonder, can't be lost in the conquest of a single city. + This is especially fair since: this is the only wonder in the game that is "required", one might say. This provides fairness to + all players who otherwise would prefer a "no wonder" strategy. +15. Roman Colosseum added. Entertainers give 3 lux instead of 2, now equal in net trade to scientists or taxmen. Each city with an + Amphitheater gains +1 happy and +1 luxury. +16. Chand Baori +17. Medici Bank +18. Roman Colosseum +19. Ziggurat. +20. Pax Dei, a diplomatic/political intrigue or trump card to capture middle ages dynamics. Works as a (very) short-term kind of united nations, + but can be used in devious ways as well. +CIVIL WONDERS are wonders that help define the charactertistics of your race, nation, and culture, and may alter its strategic + path and possibilities. +1. HG is now a Civil Wonder. +2. Angkor Wat. +1 happy, all tiles in cities 3+ get celebration bonus when city is not celebrating, tile work on jungle/swamp 50% faster, + irrigation of lowlands faster, cost of Elephants -5 shields. +3. Mausoleum of Mausolos. +4. Code of Hammurabi, halves the gap between Despotism and Monarchy, and gives one content citizen. CIVIL WONDER. + +BUILDINGS: +========== +1. Barracks requirement is Warrior Code. Besides making sense and rewarding early discovery of that tech as a diverse strategy to pursue, it + balances out the longturn's format of giving starting gold and extra disbandable units. + a. Barracks II 35, Barracks III 40. +2. Coinage yields 3 gold per 2 shields, (i.e., 1.5 gold per shield), so it no longer a "useless" feature taking up game space. + a. Marketplace, Bank, and Stock Exchange each add 0.25 to the conversion rate (1.75,2.00,2.25, respectively). + 1. requires all earlier buildings present, 2. not Communist gov, 3. the final bonus for Stock Exchange also requires The Corporation +3. Police Station prevents investigate city for all govs except Democracy. + a. Since Foreign Nationals are categorised as "discontent about military", Police Station now works on those for all governments (was Repub/Demo only) +4. Courthouse prevents Diplomats (not Spies) from doing hostile Embassy without first cease-fire or peace. +5. City Walls were sometimes too cheap, sometimes too expensive, sometimes too OP, etc., this was very similar to the issue with Fortresses + that was fixed earlier with the Fort/Fortress distinction. The new City Walls solution breaks into two types somewhat modeled on the + Fort / Fortress solution now. + City Fortifications are available with Masonry and provide 1.75x; + City Walls come with Construction and remain 3x. (Same for Great Wall wonder.) + Just as with Fort/Fortress, City Fortifications are cheaper/easier to build but not as strong. Also same is that they don't + stack. And also same is Masonry for first, Construction for second. + City Walls which cost 80 in Civ2, cost 65 now in early game, and 75 after discovery of Steel. + Fortifications for cities that get Walls later are not lost investment. Selling Fortifications in a city with City Walls will recoup + the full gold price of the Fortifications. Be sure to have the City Walls made first. + If City Walls are sabotaged, you can keep the Fortifications for a weaker backup. + With some kinds of terrain, Fortifications modify, integrate, and are built into the terrain itself: Swamp, Forest, Jungle. + This raises the terrain defense bonus of Swamp, Forest, and Jungle to 1.5x, 1.5x, and 1.67x respectively (+17%) +6. SAM Battery cost 80 (was 70) [100 in Civ2] +7. Coastal Defense cost 65, upkeep 2. (Civ2: 80, 1). Micro-balances economic inflation effects and complaints C.D. is too cheap/strong/easy/common + for preventing naval attacks. See also: Gibraltar Fortress. +8. Power Plants refactoring. Formerly, each plant had identical characteristics in upkeep and output, with the only difference being that + you paid WAY more than it's worth to get less pollution. Now, each Power Plant has a different profile for output, pollution, upgrade + incentives, and so on. They fit together well in a meta-system, not just with themselves, but with other improvements. + a. Solar Plant and the new Wind Plant are no longer (only one type can co-exist in the same city.) + +GOVERNMENT RE-BALANCE: +* ALL NON-REPRESENTATIVE GOVERNMENTS: +1. Courthouse gives +1 content to all govs, not just Democracy +2. Statue of Zeus makes 1 citizen content about military for govs who need that, and if not, simply 1 citizen content. +* DESPOTISM + Gains new "Gulag" ability: can starve cities without disorder if 2 martial law units are there. +* MONARCHY: + gets the option to build Magna Carta to become a half/hybrid between monarchy and republic characteristics, which opens + up intriguing different strategies or counter-strategies to others. Magna Carta activates the new gov +* CONSTITUTIONAL MONARCHY +* FUNDAMENTALISM: +0. Renamed to Theocracy and re-balanced to be more competitive. +1. Theocratic govs are harder to bribe, cost is 2x. +2. Pilgrams have no pop_cost! Now, it's like buying rapture for 10 shields. Pilgrims use ONE city-build-slot instead of all. +3. Government now gets the "generate partisans" effect. +4. Fanatics renamed to Zealots, otherwise same unit, except: + a. They can skirmish assault cities which have foreign populations (e.g., your recently conquered city) + b. Available with Conscription, not Fundamentalism which is no longer a tech. +5. -50% bulbs in exchange for free upkeep on temples/make_content buildings, was a harsh penalty. Changed to: + a. Bonus/penalty is symmetric now: -20% for sci, +20% for gold. +6. New unit Falconeer represents the Janissaries and Hand cannoneers employed by mediaevel theocratic orders. +* COMMUNISM: +1. Proletarians have 1 pop_cost but add 2 pop. Same +1 net pop as Pilgrims, but can better use granary dynamics and magnify state populace control of "boom-town" growth. One city build slot used, not all. +2. Communists: 10 shield discount on Armor I. +3. Gains new "Gulag" ability: can starve cities without disorder if martial_law count is 3 or more. (each unit counts for 2, each police station for 2.) +* DEMOCRACY: +1. Democracy has base corruption level of 8%, (half of Republic/Monarchy) +2. Democracy: corruption increases by 0.4% per tile from capital (1/5 that of most other govs (=2%)) +3. Democracies can now be BRIBED, but cost is 3x. +4. Democacies can now be INCITED TO REVOLT, but cost is 3x. +5. Democracy can't rapture with 10% or more foreign citizens. +6. Also see, Hanging Gardens, Police Station, Women's Suffrage. +* NATIONALISM +1. New government, see manual for details. An modern authoritarian warlike government that, on a one-for-one per capita population comparison, is quite economically + capable of competing with democracies. +* FOREIGN NATIONALS: +1. 40% are unhappy, increase from 34%. +2. Fixed, was sometimes rounding up too high, the number of your own nationals in a newly conquered city. + +UNITS/COMBAT/MECHANICS: +* FOOT UNITS +1. "Hand-me-down upgrade bonus": + Early foot convert to Musketeers for free in domestic cities upon discovering Conscription. + Musketeers " " Riflemen " " " " " " " Labor Union. +2. Pre-feudal foot units (Warrior, Archer, Phalanx, Legion) cost 20% less. +3. Feudal foot units (Pikemen) cost 10% less. +4. Marines can now: build Fort/Airbase, but not Airbase in a Fort. + Gain +2 move frags per vet level + V2+ can do ranged Bazooka Attack for 3 rounds on up to 2 targets. + Note this does not represent superior range of Marines to other units/weaponry, but rather + special commando training for fast initiative surprise degradation tactics, concealment advantage, etc. + Marines cost 55 (was 60). +5. Paratroopers A7 D5. Cost 55 (was 60) +6. Partisans cost 45 (was 50). +7. Shift from shield to gold upkeep for Infantry changed from Labor Union to Banking. Allows realistic foot soldier compositions to affect more of the game. +* SPECIAL UNIT ABILITIES - This is a new MP2 design goal to increase tactical depth, unit diversity, playstyle variety, realism accuracy, and even further reduce "golden pathing" of military strategies. +1. SPECIAL UNIT ATTACKS. Tactical depth blossoms: Now possible are: Hit-and-run tactics; multiple ranged attacks per turn; engagements with less than all units on the tile. + Phalanx, Rumble Attack: 3 combat rounds, stays fortified, can hit 1 unit, can kill no units, uses 5/9 moves, requires 1 move left, requires fortified or not moved prior. + Legion, Pilum Assault: 1 combat round, 2x attack, can hit 2 units, can kill 2 units, uses 1 move. + Archers, Volley attack: 2 combat rounds (was 1), stays fortified, can hit up to 7 units (was unlimited), can kill no units, uses 1 5/9 moves (was turn loss), can attack water. + Fanatics, Skirmish assault: 3 combat rounds, can hit up to 4 units, can kill no units, uses 1 5/9 moves. Now, can also assault conquered foreign-occupied cities. + Marines, Bazooka attack: 3 combat rounds, can hit up to 4 units, can kill 1 unit, uses 1 5/9 moves, can hit oceanic (but not while transported) + Battleship, Bombard attack: 3 combat rounds, 4 units, can kill 1, uses 5 moves. + Catapult, Cannon, Artillery, Howitzer can defend against bombard/ranged/special unit attacks at 4,5,6,7 combat rounds, respectively. +2. iPILLAGE. Instant Pillage is tactically significant. Formerly, roads under rails couldn't be pillaged in one turn. Scorched Earth and Blitz tactics barely existed in the game. + NOTE: iPillage Odds increase +5% per vet level. + Dive Bomber - 50% odds, 1 selectable target, 7 move cost. + Ground Strike Fighter - 75% odds, 1 selectable target, 3 moves cost. + Armor I/II - 75% odds, 1 selectable target, 2 move cost. + Strategic Bomber - 60% odds, 1 random target, 3 move cost. + Jet Bomber - 75% odds, 2 random targets, 3 move cost. +3. SPECIAL STANDARD ATTACKS + Phalanx and Marines can stay fortified during attack. +* PRICE CHANGES + Pre-feudal units -20% foot, -10% mounted. Catapult 34. + Feudal: -10% foot, -5% mounted. Armor II: 85 (was 80) +* UNITS: +1. Siege Ram: Must use roads. SPECIAL UNIT ATTACKS: + Attack City Walls. 50% chance to destroy city walls (requires 1 full move point), odds halved against capitals. + Ram Fortress: attack on fortified walls is emulated by up to 4hp damage on each occupant, emulating a 0 to 80% reduction of Fortress defense bonus; which may be partly/fully repaired/recovered each successive turn. + Two Rams will likely render Fortress defense into liability. Troops who remain in a Fortress facing two Siege Rams will be damaged and demoralized from breaches + and crushing stone debris. But, proactive defenders can pillage the Fortress and use its stone to improvise fortified structures (a Fort, which is left after a Fortress is pillaged) + That is, render the tile into an unrammable Fort which still gets a 1.33x bonus protection from stack kill. + The net effect of this realistically emulates that Fortresses are dominant military presences until attackers take the time and wherewithal to get around + to protracted siege, whereafter they are still defendable but at a lesser bonus. +2. Satellite: invisible, can investigate all cities (even with Police Station), has superior vision and movement. Requires Apollo Program. +3. Zeppelin: upgrades balloon, greater vision/movement/fuel, some limited attack capabilities, can do limited bombing. +4. Helicopter fixed, correctly susceptible to SAM Battery not City Walls (fixes a nerf of 3x for a land unit not from original game) + this fix was retroactive to AG and Brava also, as it was a really bad treason against the branch's DNA. +5. Battleship gets ranged attack: 3 rounds, can hit up to 4 units, can kill up to 1 unit, uses 5 moves. +6. Truck replaces Freight. Changes: Road only, moves: 6, can carry 3 land units. load/unload rules same as Train. +7. Discovery of Recycling reduces unit upgrades 20%, stacks with other discounts. +8. A server flaw sometimes + a. allowed military units to clean fallout and pollution. This fix affects ALL rulesets. + b. For non-military units, only spies and worker types can pillage now. Excluded are: Caravans, Explorers, Diplomats, Pilgrims, Tribesmen, Trucks, Freight. +9. Base Stack Escape odds are 60%, not 50%. 50% is too coin-flip on live or die for anyone to really use or count on this bonus. + Higher, however, can give too much power to stacks. +9a. Destroyer types are fast and have 67% stack escape odds. Submarines are submerged and have 75% stack escape odds. +10. Fighter is D3.5, Escort Fighter is A3.5. + +BALLISTIC sub-class +1. Catapults and their upgrade line (Cannon, Artillery, Howitzer) are now the Ballstic sub-class of the Land unit class. This line of units gets an increasing +25% upgrade over + the obsolete unit, in how much of the Fortification/City Wall bonus it reduces. Catapult takes -25% from Fortifications and Wall bonuses. This represents their + special unit ability, makes them all a more logical family progression (instead of all -0% then Howitzer is suddenly -100% bonus). It also helps these + slow units fit much better into their historic realistic tactical uses, inside the game. +2. Catapult > Cannon > Artillery > Howitzer is now an evolutionary sub-class of land units for Ballistic/Siege/City Busting as their + special unit ability or distinction. Each one gets a special bonus against City Defense improvements that progressively grows until + arriving at Howitzer. This does a lot for game balance and logic. +2. Ballistic sub-class special unit ability is that it can retaliate against ranged special unit attacks from other unit types. They may be + weak defenders up close, but be careful shooting arrows or bazookas at them from far away, or you might regret it. + +SPIES/DIPLOMATS: +1. Diplomatic units now defend a unit on a tile from hostile diplomatic acts (bribe/sabotage), the same as they defend a city from hostile diplomat attacks. + a. In the case where bribe/sabotage isn't possible (i.e., other non-diplomat units > 1), no defense is necessary since it's "No action possible." + b. Where it is only the case of 1 diplomat vs. 1 enemy diplomat, they enter into diplomatic combat, the same as in a city. + c. Spies promotion odds increased to compensate for the weaker strength of their veterancy levels, to make it track more similar + to other units for number of successful surviving actions. + d. Spies can investigate city from a transport, but not other actions. + e. Diplomats can investigate city without being spent. +2. Investigate City is now no longer hard-coded in server to 100% success. What this means for MP2: + 80% chance to COVERTLY SLIP past enemy diplomats/spies WITHOUT diplomatic combat. (100% if unprotected) + If slipped past OR defeated enemy diplomats in combat, 85% chance to succeed at investigating city. + FINAL ODDS: + 85% chance to investigate unprotected city + ~75% chance to succeed vs. protected city (varies slightly up or down with the vet levels of the spy units in combat.) + causes casus belli on failure! +3. Conquered cities with Foreigners have a +10% chance of success in sabotage actions. +4. Cities with 50% or more foreign citizens are considered occupied warzones, rather than cozy places where spies can + steal weapons techs from scientists at the university. No tech theft from a city that is half or more foreign. + This fixes some ridiculous cases where u couldn't conquer a city because ur afraid to give Mass Production to your enemy, + even though u could try as hard as hell to make sure no soldiers are carrying out tech briefcases on how to do Mass Prod. + +OTHER: +1.Casus Belli Expansions: + a. In a foreign territory casus belli is given by: Transforming Terrain, Building Base, or making road-types (road,rail,quay,canal,etc.) + b. Bribe enemy unit. + c. Found City on foreign territory (i.e., in a Fort.) + d. Capture Units (fixed an unknown server bug that allows this to work now.) + e. Investigate City if discovered when dong it. + f. Moving military units inside foreign territory with whom you have Cease-fire, Peace, Armistice: + NOTE, if you accept cease-fire while inside someone's territory, moving the units will give casus belli. Be out first. + g. Formerly, casus belli lasted 2 turns: the turn of the incident and one after. mp2c now uses the new server setting + casusbelliturns and defaults to 12. +2. Improved tuning of terrain dispersion; less domination in some areas by a single terrain type. +3. Balance Alignment of Resource Distribution (BARD. 1. On the first TC, BARD allocates a SMALL amount of: + Berries, Spice, Peat, Oasis, Rubber, Gems, Elk, Furs, Ivory, and Iron, in order to enhance statistical + balance in each climactic region. Typically this is less than a 4% chance per tile, with exact value tuned to regional + geographic balance. (Swamp and Arctic get somewhat more.) 2. BARD overcomes the map generator's forced 35% + chance a tile gets a resource, regardless of terrain, resource type, or scarcity of nearby resources on other tiles. + 3. BARD discourages settling on the first turn, giving one turn of "oxygen" for all players to look around before settling + their cities. This was preferred to proposals to disallow settling on first turn, or to exaggerate inconsistent special + exception bonuses for starting moves, exceptions to terrain movement penalties for x turns, etc., etc. +3a. Furs can now exist on Arctic terrain. This provides more balance to the worst terrain type in the game. +4. "Blood for Oil": After Refining, Oil Wells built on Oil get +1 shield after other bonuses. + (Previously, it was arguably better to irrigate rather than mine.) Oil tiles with more value are now more worth fighting for. +5. Monotheism 384 (was 415), Theology 600 (was 725), Theocracy 725 +6. Added Castle. Built on top of Fortress. a. Units inside can't be seen. b. Moat prevents Siege Rams. c. Claims more surrounding tiles. d. Sees farther. + e. No extra defense bonus. + reqs: Construction, Feudalism. Obsolete by: Gunpowder. +7. Added Bunker. Built on top of Fortress. a. Units inside can't be seen. b. Prevents Air and Missile attacks. + c. Prevents tile pillage (so Jet Bomber etc. can't remove it) d. Claims less surrounding tiles, doesn't see as far, no extra defense bonus. + reqs: steel +8. Trade re-balance. You've only got one trade route per city so we're going to make it mean something. Trade and Project Honeycomb are now + ready to come into the game with some real meaning! + Traderoutes add a hard +1 trade to the city centre. + One-time gold bonus for establishing a trade route is now the standard freeciv bonus. It's a lot more, but it's only once per city. + 4x one-time gold bonus for establishing trade routes between capitals, if it's before Banking is discovered. + Base route revenues is now 50% higher than standard. With only one route instead of 4, this means you're still getting + only 37.5% from trade routes as the former (OP) trade dynamics. But 37.% of OP is something substantial. + Marco Polo continues to take care of the other 3 routes you would have had under standard rules, keeping the game simpler. + For all these bonuses is a price to pay. Minimum distance for trade routes is now 20 tiles... reaching out farther is a small balance + to pay for your higher bonus. Encourages more world-interconnectivity and intrigue, and even banditry and piracy. + +MISC. +--------------- +Commerce units simplified. All commerce can build wonders and do trade routes at all times under all conditions. + Trade tech isn't needed for Trade routes. Trade tech simply increases Trade revenue higher rates. +Ships cost 2x to bribe -- injured ships far from home had too low bribe costs for what you're getting, additionally, input showed a + split on whether ships should even be bribable at all. +Damaged Submarine min_speed=4 (was 3); makes hit-and-run and escape somewhat more viable. +Nuclear winter was patches of random arctic everywhere, now it a temperature downgrade of each affected tile to one level colder. +Starting Caravans have all restrictions and complications removed. Can Help Wonder or Establish Trade Route (remember to set Home City first!) +Camels move faster than people, Caravans get 2 7/9 moves. They can also carry 2 Goods units. +Capturable commerce units can't become uncapturable just by carrying Goods or being on same tile with other capturable commerce units. + This prevents mere cargo from making commerce units immune to capture. Cargo becomes lost in a capture event: e.g., Caravan carrying + goods gets captured. Goods are lost, Caravan transfers ownership. +Tribesmen become primitive generalists who can do a mediocre job at many things, rather than specialized to one thing like other units. + This makes them perfect start units for a primitive tribe to slowly get itself going: + They can work tiles like Workers, but only contribute a half-worker turn instead of a full worker-turn. + They can now fight (A1D1 HP6), but at 60% the strength of a warrior, are not so amazing. + Semi-military, semi-civilian: + They cannot capture, expel, or conquer cities. + Like before, they are capturable and expellable. +Workers now have 6hp, so they are not equal to a Warrior in combat, yet still can feel safer running for the hills or other defense terrain. +Because Workers and Tribesmen are 6hp, the Warrior now becomes somewhat more meaningful as having primitive military ability. +Coastal Defense is visible without middle-clicking for city info: it puts 4 cannon towers in the corners, and cannon placements along the walls. +Masonry is not needed for Palace (simplification) +Tribesmen, Diplomats, and Explorers can investigate cities without being spent. Let the games of ancient espionage and paranoia begin ! +Train goes from 1 gold upkeep to 0. Cost was too high for achieving parity for foot unit mobility on rails. +Worker turns to irrigate swamp or plant forest go from 8 to 6½. In almost all cases, that means 7. +CANALS + Formerly: + Coastal Canals could be made Adjacent to Ocean. + Inland Canals could be made Adjacent to River. + results: canal length artificially limited, some glitch cases where diagonal canal doesn't really connect to Ocean. + Now: + Coastal Canals can be made CAdjacent to Ocean. + Inland Canals can be made CAdjacent to River OR Coastal Canal. + results: max canal length across an isthmus goes from 2 to 3, and all canals properly and visibly exit into Oceans. + thanks to @Dino for figuring out some logic to do these things. +MINOR +------------------------ +Conscription bonus simplified - applies to infantry only. +Galleon, like Caravel,Galley,etc., can enter Peace Waters but may not attack unless war declared: this ensures a naval vessel + always exists which can bring commerce units to coastal cities; and realistically reflects the historic use of real Galleons. +Spy Plane correctly made to be unreachable to propeller-based aircraft. +Can't make road-types while transported in foreign lands (road/quay/rail/maglev/canal) + move to mp2-brava ++1/9 move bonus for v4+ aircraft was changed to +1, as it too frequently led to death of precious v4 units from tired attack on last move. + move to MP2-brava +Ram Ship can see 1 tile around it and travel on rivers - prevents unintended attacks when travelling diagonally. + move to MP2-brava (except not the travel on river part) +Fallout disappear chance changed from 20% to 15% +Small clarification: to use a train requires < 3 moves, not <= 2 moves. (Doesn't change who can use it, just clarifies rare cases.) +Canals can serve as an irrigation source. +Magnetism tech costs 875, was 950. Halves the extra cost over Gunpowder. Further encourages Frigates before Ironclads. +Environmentalism "hack" to reduce production pollution by 50% was removed. It was a hacked misfit for flaws in other pollution reduction. + Now that other solutions exist for that, this advance reduces pollution from population by 50% instead. + Regarding production pollution, please see notes on how Power Plants, Recycling Center, Solar Plant, Wind Plant, and Fusion Reactor, layer together. + +SERVER UPGRADES: +1. Special Unit Actions / Attacks: + a. can optionally specify a move cost up to 7 moves points. + b. can optionally specify a limit to number of units on tile which can be hit + c. can optionally specify a maximum number of units who can be potentially killed + d. can optionally specify a unit stays fortified when doing the action. +2. Population units can specify pop-cost and add-pop differently. +3. Non-diplomatic units can be made to enter "direct combat with buildings": e.g., Siege Ram vs. City Walls. +5. Bulb cost displays now reflect non-default sciencebox settings +6. Fixed design flaw in server that made pop-cost units take up all a city's build slots. +7. Made units-display in lower-right update correctly more often (not showing dead/spent/disbanded units.) Please report any exceptional cases. +8. Fixed possibilities for some rare backdoors. +9. DIPLOMATIC ACTION REPORTING TRANSPARENCY: all diplomatic actions show the odds and results for all stages to both contestants. +10. Unit vision range now reported in raw tile units rather than square of radius. +11. Fortresses and Naval Bases show a flag of who owns them to prevent confusion, fixed first version incorrectly showed a buoy. +12. Fixed variety of small quirks/inconsistencies in loading/unloading of transports. +13. Added ability for rulesets to include the "Sea Bridge" improvement over water. Must be CAdjacent on lake or ocean (not deep ocean) +16. Hovering over a Special Unit Attack button in the Attack pop-up window, now gives info-text for all its special traits and requirements (from mp2-c onward) +17. Fixed rounding errors in displayed upgrade costs on client side. +18. Fixed upstream server bug that didn't allow capture units to trigger casus belli. +19. Added ability for effects to be triggered by unit activity states (instead of only completed actions.) +20. There was a hidden flaw in 3.0 server, any unit who can do ANYTHING to a tile gets magic bonus to also clean pollution and fallout. + This was affecting foot soldiers (who can make hideouts) so we went with the flow. But now this flaw is fixed, and we're back to the + classical orthodoxy: only non-military tile workers can clean fallout and pollution (worker, engineer, settler, proletarian) +21. A bug in main freeciv server caused climate change to lag, often not completing for several minutes, with a high probability of crashing. This exists in all + versions of freeciv but FCW had to hard-code global warming out because the problem was exponentially worse on larger maps. + This now has following fixes and upgrades: + 1. New settings for STRENGTH of nuclear winter and global warming exist (how much of earth is affected if triggered.) + 2. New percent setting allows adjusting the threshold that triggers climate events, and the tolerance/absorption of the earth to diminish + the accumulation of impact over time. + 3. TC Climate Change processing takes onyl seconds instead of several minutes. + 4. It doesn't crash. + 5. Note: the defaults for these settings were always ON in all games, they were just not triggered because a patch prevented their + execution to prevent crashing. So, be careful of global warming. + 6. New feature: IPCC report gives transparency on risk of climate change if the risk starts to escalate. + 7. Climate Report is now in Gov tab. +22. Landmass can be set from 10 to 99 (was 15 to 85) +UI / Ease of use / Macro-management mechanics. +23. Mass select Airlift: you can select multiple units and give them simultaneous airlift command, which will execute in sequential order if each is legal. + This upgrades one-at-a-time airlifting. +24 Intelligent Load/Unload/Activate Cargo are now upgraded to work holistically with each other. + UNLOAD TRANSPORT 'T': + a. 'T' tells a selected Transport(s) to unload their specific cargo. + b. 'T' tells selected Cargo to unload from their Transports. + LOAD 'L': + a. 'L' Load selected units on Transport(s). + b. 'L' Load ONE selected Transport with all units on the tile which it can legally take as cargo. ("Cargo Scoop") + c. 'L' Transfer selected Cargo units to other Transports IFF such action would be legal if the cargo can legally unload then reload. + d. 'L' command given at Sea, to tell selected Cargo to move to a new Transport, is legal if current Transport has moved no more than 4 + moves and has at least 3 moves left. + + has used half or more of its + moves AND has more than 3 moves left. This may seem complex but it is a "Sweet spot" compromise to allow legitimate "Transport transfer" + while hindering the "Transport shuffle" exploit. + SELECT CARGO on TRANSPORT 'U': + a. 'U' command will only select Cargo units on the SELECTED Transport(s). + b. If no Transport is selected, 'U' commamnd does its old behaviour to select ALL cargo units on the tile. + What no longer happens: + 1. 'T' will never do as previously, it unloaded ALL cargo on same tile, making multiple load/unload operations tedious. + 2. 'U' command will never select all cargo on same tile, only on selected Transports. + 3. 'L' command won't disallow swapping Cargo between Transports in cities because you didn't take the extra step of unloading first. + 4. 'L' command doesn't force you to click-select every unit you want to load. Now you can select the Transport who scoops up all legal units instead. +24a. Can "Transport swap" Land-type cargo units in + 1) where it's legal to unload anyway, to save an extra step (cities, naval bases, quays) + 2) in sea units who have enough moves (see 24.'L.d.) +25. iPillage - this uses the server's new surgical strike pillage feature, where tiles can be destroyed in real-time on par with everything else + (buildingis, units, etc.) iPillage brings Scorched Earth and Blitzkrieg into the game; gives Air Strikes more of a real purpose, increases + the tactical importance of Vigil, as well as the placement of Forts, more Foot soldiers, and AAA, to protect regional infrastructure. + Features can be set for each unit: + success odds, move cost, pin-point single target, or multiple random targets in one strike. + note: the documented iPillage odds go up +5% for each veteran level. +26. Added "gold per shield" info to the City screen (custom user column) and on pop-up window to buy item. +27. Added option to enter Full Screen (full immersion) like every non-browser game, when the game launches. ESC is now dedicated to exiting + Full Immersion (ALT-S or Options>>Full Screen) to re-enter. You are no longer required to hit ESC to exit tabs and pop-up windows, and lose + full screen display. Instead, the command to exit any tab or pop-up window is "W" for (W)ithdraw (W)indow. This now allows the game to default + into an orthodox full screen experience like Freeciv Native Client and EVERY OTHER GAME, instead of being a "second class browser game." + Recommended: become familiar with your OS's hotkeys, which better enable you to navigate while having a fullscreen process: +28. Fortify given to non-fortifiable units will sentry them instead, and if they can't sentry, they will be given "No Orders" (J) and stay put. + This turns the F key into the magic spam key for making unit(s) stay put and select their best option on the tile. It allows giving F + to a large stack and every unit who can fortify will, while sentrying the rest, so you can move on, and maybe spam F again, rapidly. + Reason: quicker/easier micro-management during late game. +28a. Sentry given to non-sentryable units will NO-ORDERS them instead. +29. Triremes on sentry on all legal refueling spots (formerly could not sentry on coastline.) +30. Size 1 cities aren't impervious to infinite nukes while every other city is cut in half each time. Now s1 cities die if nuked. +31. Investigate City now has: + 1. "diplchance" odds (80%) of avoiding diplomatic battle even if enemy spy is present (was 100%) - "Covert Slip Attempt" + 2. Then [possibly] diplomatic battle, + 3. Then "diplchance"+(ruleset odds) chance to succeed. MP2 gives a +5% over base diplchance of 80, or 85% chance to succeed at this phase. +What this means for MP2 rules: + 80% chance to slip past enemy diplomats/spies without diplomatic combat. (100% if unprotected) + If slipped past OR defeated enemy diplomats in combat, 85% chance to succeed at investigating city. + Thus, 85% chance to investigate unprotected city, and about 75% chance to succeed vs. protected city (plus or minus with vet levels of spies.) +32. Spies could only sabotage city production at random but not targeted. This was fixed: targeted sabotage now lists "Production" as one of the + choices along with the improvements. +33. Info-codes. Special info symbols mark the messages you get in the chat window, to make it easier/faster to scan and read important events, + or to scroll back to find again. +34. 3 NEW DEMOGRAPHICS statistics: Units Built, Units Killed, Units Lost. We can also select which rows in demographics report to show, and also + which of 3 columns to turn on (your quantitative score, your rank, who is #1 and their quantitative score [if you have embassy]) +35. Discovery of new government gives instant click-link icon to change government, in the chat window. +36. Recycling Unit is smarter to differentiate single or plural simultaneous; and differentiate a disbanding from a recycling into production. Also new + Orders button for Recycle/Disband has same intelligence to it. +37 CTRL-click: clicks a tile as if a city is not there: good for selecting units without extra UI fussing (going inside a city to pick the unit etc.) +38. Special retaliation ability: units defending from ranged attacks now have the potential to retaliate if they also can range attack... + "ranged defense". This opens up new tactics currently given only to units that benefit from big balance improvement from it + (Archer, Battleship, Helicopter.) Note that ranged defense requires there to be move points left. + one Bship bombards 2, now they have 37 hp and 1 Bship beats both. This prevents such possibilities and indeed, + the 2 battleships properly retaliate leaving the single Bship in worse, not better condition. This dynamic is + carefully used to allow deeper level of tactics for some units and to slightly buff units whose special + role abilities were represented weaker than the realistic and tactical use they should have. +39. fixed rounding errors in calculation of move points on damaged units. +40. adding a pop unit to a city arranges tiles by its CMA (server default or governor) instead of making entertainer. +40a. fixed small bug where ranged attacks did not reduce movement points of damaged units. +41. TC reports on UWT activity delays now only report activities that finish this turn; Not anymore, e.g., transform or mine that finishes on a future turn. +42. possibly fixed spurious message re:UWT +43. Note, unit emoji are not for gimmick fun, but: + a) help you scan a long list of info to parse it or find the right info, + b) the ACTOR unit has the emoji before the name, the TARGET unit has the emoji after the name (after getting the habit, this helps a lot with #1) +44. Middle-click in tech screen for setting future goal, doesn't slip into scroll-pane mode. Alt-right click now works as middle click in tech screen +45. defending units lost in cities, now inform the player what city they were in when they were lost, so they can know better where the attack was + without having to click the text link. +47. chatbox scrolling to end of page after getting a message, was sometimes slow and lazy, just like that person that does most of the job but + quits before it's done. now after a certain time of getting a new message and scrolling it, it is force snapped to the bottom. +48. every event in chat that took place somewhere on the map, is a link to center the map there, AND will select the unit there if there is one, + OR else make a signal marker to identify the exact tile. +49. Poisoning a size 1 city eliminates it. (all rulesets) +50. Kill-stack events sometimes left you ignorant, seeing "Killed the Riflemen and 5 other units!". Now, up to 6 other unit kills are reported in a kill-stack, + individually, before it will start to just say (and x other units!) +51. CITY GOVERNOR, with advanced features not found in native client or upstream server. +52. fixed, sound effect for sold building only happens when server confirms it's really a legal sale. +53. server has new effect rulesets can use, for increasing/decreasing the work rate of units. +54. units fortifying inside a hideout now have aqua fortifying icon to show they're in a hideout, similar to sentry and (already) fortified. +55. new server settings hangry and fulldisorder. + hangry - fixes a logic flaw in TC processing, where people were happier starving with lux, than being fed to avoid starvation and death. + fulldisorder - closes a couple exploits/loopholes where heavy micromanagement of disorder gains a competitive edge. + disorder is very simple now: all production and purchasing power for 1 turn is stopped if disorder is not prevented before TC; + like celebration, when disorder status occurs, the effects of it are felt on the turn when it's reached (i.e., the TC after it happens) + 2. conquered cities count as a kind of disorder as far as being able to produce anything after conquest, and/or also toward + the rule of 2 turns of disorder causing anarchy to democracy. +56. fixed a bug that was not giving score for small wonders +57. full 2-way casus belli status displayed in nations tab. +58. Diplomacy Pacts Upgrades: + a. You may forget or excuse a casus belli, possibly from some verbal agreement over an action or maneuver which generates a casus belli, + simply by doing another Cease-Fire, or Peace. This clears the casus belli or "forgives past casus belli". + b. When a Cease-Fire has 3 or less turns left, you may create a new one, instead of being forced to wait for it to expire into war. + c. Doing a Cease-Fire or Peace agreement when you already have one but there is casus belli, will not reset the length of the agreement, + but only pardon the casus belli. + d. Doing a Cease-Fire or after casus belli is reset, sets a new one with a new length of time, as set by GM in game.server.ceasefirelength. + e. (b,c,d) give players the ability to choose separate combinations of excusing casus belli and re-affirming + cease-fire for a new time period. + f. De-jankification of all kinds of rare edge cases is tedious to explain but there are 2 charts for full disclosure at + diplhand.c line 545 and line 603. In general it's made to be softer more fluid and do what's logical in edge cases, rather than fall + and get stuck in one of the "stupid logic holes of freeciv diplomacy". + Short answer: if you ask for the same type of pact as you had before, it will excuse casus belli if you have it, otherwise, if the pact + expires very soon, it assumes you want to offer to renew it before expiration. +59. Server settings armisticelength and ceasefirelength are now under the control of the GM. +60. Two-way state of casus belli is shown in nations list in nations tab now. Mouse hover shows turns left. +61. chat marks speaker with their flag. sent messages are right aligned, allied chat and global chat are center, incoming are left aligned. +62. added game.server.casusbelli turns for better control over casus belli. Formerly it was 2 turns (turn of incident and one after.) + Now it is configurable by GM, and multiple violations/aggrievances can push it beyond the default time length (12 for mp2c, 2 for all others.) +63. New Prefs option: Focus Lock, keeps the current selected unit centered on map (ALT-SHIFT-F). It's more of a preference on a PC, but might + make a big improvement for mobile. On mobile it defaults to on. +64. Prefs options for "Show pollution on map" and "Movement Point Display" can now be permanently set instead of temporarily. +65. There was no way for EFT_GROWTH_FOOD to be applied at city founding and this is now fixed. Rulesets wanting old behaviour of no extra food + in this situation, need to put a MinSize, "1", City condition into them. +66. Stack Escape changed to be unit is of equal or greater moves than attacker. (was greater) +67. New server effect "Stack_Escape_Pct" allows regulating odds of stack escape in certain situations, instead of hard-coded universal 50%, always. +68. New server feature to allow negative upkeep buildings. Allows improvements which gather infrastructural support to other buildings, + e.g., wind mills, khan's tribute collection office, etc. +69. Improvement super panel in city list now filters out obsolete buildings and buildings who tech req is 2 or more tiers away. This makes the + list much more compact and easy to use. +70. minor_nukes and major_nukes are not shown in tech tree unless the server setting allows them for that game. if you see it, you can build it! + + + + + +These help with much more than Freeciv and other Full-screen apps. They help you with everything you do on your computer: + Switch active Program Flip to Last Program Switch Browser tab See all Programs on Workspace Swap Workspaces +Linux* Alt-Tab Alt-ESC CTRL-Shift-Tab 🐧, ALT-F1 CTRL-ALT-arrow +Windows Alt-Tab Alt-ESC CTRL-Shift-Tab Three fingers up, ⊞-tab ⊞-CTRL-arrow, four finger side swipe +Mac ⌘-Tab ⌘-Shift-Tab CTRL-Tab Three fingers up, F3 4 finger side-swipe + + + + Every other type of transported-scenario, swapping is not allowed. \ No newline at end of file diff --git a/freeciv/freeciv/data/mp2-brava2/cities.ruleset b/freeciv/freeciv/data/mp2c-occ/cities.ruleset similarity index 99% rename from freeciv/freeciv/data/mp2-brava2/cities.ruleset rename to freeciv/freeciv/data/mp2c-occ/cities.ruleset index 9ca8f04d4..bc26a1198 100644 --- a/freeciv/freeciv/data/mp2-brava2/cities.ruleset +++ b/freeciv/freeciv/data/mp2c-occ/cities.ruleset @@ -157,7 +157,7 @@ nationality = TRUE ; account for the nationality of the citizens convert_speed = 1000 ; per mille, base probability of 1 citizen nationalizing. x/1000 partisans_pct = 0 ; percentage of own nationality to inspire partisans ; if 0, original city owner information is used instead -conquest_convert_pct = 34 ; percentage which converts to the new nation +conquest_convert_pct = 33 ; percentage which converts to the new nation ; after a city was conquered. Applied separately for each ; nationality present in the city, and number of ; converted people rounded up diff --git a/freeciv/freeciv/data/.historic/ag2/default.lua b/freeciv/freeciv/data/mp2c-occ/default.lua similarity index 68% rename from freeciv/freeciv/data/.historic/ag2/default.lua rename to freeciv/freeciv/data/mp2c-occ/default.lua index 2145db452..ad45837c6 100644 --- a/freeciv/freeciv/data/.historic/ag2/default.lua +++ b/freeciv/freeciv/data/mp2c-occ/default.lua @@ -4,14 +4,35 @@ -- ruleset is easier as you do not need to keep your own copy of -- default.lua updated when ever it changes in Freeciv distribution. +-- only show partisan banner events the first few times it happens +partisan_spawns = 0 + -- Get gold from entering a hut. function _deflua_hut_get_gold(unit, gold) local owner = unit.owner - notify.event(owner, unit.tile, E.HUT_GOLD, PL_("You found %d gold.", - "You found %d gold.", gold), - gold) - owner:change_gold(gold) + if gold == 1 then + notify.event(owner, unit.tile, E.HUT_GOLD, PL_("[`gold`] You found beads worth %d gold.", + "[`gold`] You found beads worth %d gold.", gold), + gold) + owner:change_gold(gold) + elseif gold == 2 then + notify.event(owner, unit.tile, E.HUT_GOLD, PL_("[`gold`] You found medicinal herbs worth %d gold.", + "[`gold`] You found medicinal herbs worth %d gold.", gold), + gold) + owner:change_gold(gold) + elseif gold == 5 then + notify.event(owner, unit.tile, E.HUT_GOLD, PL_("[`gold`] You found stone tools worth %d gold.", + "[`gold`] You found stone tools worth %d gold.", gold), + gold) + owner:change_gold(gold) + elseif gold == 10 then + notify.event(owner, unit.tile, E.HUT_GOLD, PL_("[`gold`] You found furs worth %d gold.", + "[`gold`] You found furs worth %d gold.", gold), + gold) + owner:change_gold(gold) + end + end -- Default if intended hut behavior wasn`t possible. @@ -26,16 +47,16 @@ function _deflua_hut_get_tech(unit) if tech then notify.event(owner, unit.tile, E.HUT_TECH, - _("You found %s in ancient scrolls of wisdom."), + _("[`bulb`] You found %s in ancient scrolls of wisdom."), tech:name_translation()) notify.research(owner, false, E.TECH_GAIN, -- /* TRANS: One player got tech for the whole team. */ - _("The %s found %s in ancient scrolls of wisdom for you."), + _("[`bulb`] The %s found %s in ancient scrolls of wisdom for you."), owner.nation:plural_translation(), tech:name_translation()) notify.research_embassies(owner, E.TECH_EMBASSY, -- /* TRANS: first %s is leader or team name */ - _("%s has acquired %s from ancient scrolls of wisdom."), + _("[`bulb`] The %s have acquired %s from ancient scrolls of wisdom."), owner:research_name_translation(), tech:name_translation()) return true @@ -47,19 +68,19 @@ end -- Get a mercenary unit from entering a hut. function _deflua_hut_get_mercenaries(unit) local owner = unit.owner - local type = find.role_unit_type('HutTech', owner) + local utype = find.role_unit_type('HutTech', owner) - if not type or not type:can_exist_at_tile(unit.tile) then - type = find.role_unit_type('Hut', nil) - if not type or not type:can_exist_at_tile(unit.tile) then - type = nil + if not utype or not utype:can_exist_at_tile(unit.tile) then + utype = find.role_unit_type('Hut', nil) + if not utype or not utype:can_exist_at_tile(unit.tile) then + utype = nil end end - if type then + if utype then notify.event(owner, unit.tile, E.HUT_MERC, - _("A band of friendly mercenaries joins your cause.")) - owner:create_unit(unit.tile, type, 0, unit:get_homecity(), -1) + _("[`warriors`] A band of friendly mercenaries joins your cause.")) + owner:create_unit(unit.tile, utype, 0, unit:get_homecity(), -1) return true else return false @@ -93,12 +114,12 @@ end -- Unit may die: returns true if unit is alive function _deflua_hut_get_barbarians(unit) local tile = unit.tile - local type = unit.utype + local utype = unit.utype local owner = unit.owner if server.setting.get("barbarians") == "DISABLED" or unit.tile:city_exists_within_max_city_map(true) - or type:has_flag('Gameloss') then + or utype:has_flag('Gameloss') then notify.event(owner, unit.tile, E.HUT_BARB_CITY_NEAR, _("An abandoned village is here.")) return true @@ -107,11 +128,11 @@ function _deflua_hut_get_barbarians(unit) local alive = tile:unleash_barbarians() if alive then notify.event(owner, tile, E.HUT_BARB, - _("You have unleashed a horde of barbarians!")); + _("[`warning`] You have unleashed a horde of barbarians!")); else notify.event(owner, tile, E.HUT_BARB_KILLED, - _("Your %s has been killed by barbarians!"), - type:name_translation()); + _("[`warning`] Your %s has been killed by barbarians!"), + utype:name_translation()); end return alive end @@ -167,7 +188,7 @@ signal.connect("hut_frighten", "_deflua_hut_frighten_callback") with the Partisan role. In the default ruleset, the requirements for inspiring partisans are: - a) Guerilla warfare must be known by atleast 1 player + a) Guerilla warfare must be known by at least 1 player b) The player must know about Communism and Gunpowder c) The player must run either a democracy or a communist society. ]]-- @@ -182,10 +203,13 @@ function _deflua_make_partisans_callback(city, loser, winner, reason) partisans = 8 end city.tile:place_partisans(loser, partisans, city:map_sq_radius()) - notify.event(loser, city.tile, E.CITY_LOST, - _("The loss of %s has inspired partisans!"), city.name) - notify.event(winner, city.tile, E.UNIT_WIN_ATT, - _("The loss of %s has inspired partisans!"), city.name) + partisan_spawns = partisan_spawns + 1 + if partisan_spawns < 5 then + notify.event(loser, city.tile, E.CITY_LOST, + _("[`events/partisans`]
[`partisan`] The loss of %s inspires %d Partisans!"), city.name, partisans) + notify.event(winner, city.tile, E.UNIT_WIN_ATT, + _("[`events/partisans`]
[`partisan`] The loss of %s inspires %d Partisans!"), city.name, partisans) + end end signal.connect("city_transferred", "_deflua_make_partisans_callback") diff --git a/freeciv/freeciv/data/mp2c-occ/effects.ruleset b/freeciv/freeciv/data/mp2c-occ/effects.ruleset new file mode 100644 index 000000000..7170969f0 --- /dev/null +++ b/freeciv/freeciv/data/mp2c-occ/effects.ruleset @@ -0,0 +1,7741 @@ +; Modifying this file: +; You should not modify this file except to make bugfixes or +; for other "maintenance". If you want to make custom changes, +; you should create a new datadir subdirectory and copy this file +; into that directory, and then modify that copy. Then use the +; command "rulesetdir " in the server to have freeciv +; use your new customized file. + +; Note that the freeciv AI may not cope well with anything more +; than minor changes. + +[datafile] +description="Effects data for Freeciv" +options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" +format_version=20 + +; /* <-- avoid gettext warnings +; +; Effects +; +; type = What the effect does. Values of multiple active effects +; of the same type get summed for the total. +; See README.effects for list of possible types +; value = Value added for the effect type when this effect is active, +; i.e., all requirements are fulfilled +; multiplier = Name of the policy that gives a multiplier for effect's value +; reqs = Requirements for the effect to be active. +; See README.effects for help on requirements +; +; */ <-- avoid gettext warnings + +; Med. Bomber is a "Soft Field Unit." If non-aggressively deployed, 0 unhappy in Republic, +; 1 unhappy in Democracy: +[effect_medium_bomber_field_unit_minus_one] +type = "Peaceful_Field_Unit_Bonus" +value = 1 +reqs = + { "type", "name", "range", "present" + "UnitType", "Medium Bomber", "Local", TRUE + } + +; EXAMPLE OF HOW TO USE NEW Unit_Unhappy_Cost EFFECT, almost same +; as the above effect (don't use both!) +;[effect_medium_bomber_field_unit_minus_one] +;type = "Unit_Unhappy_Cost" +;value = -1 +;reqs = +; { "type", "name", "range", "present" +; "UnitType", "Medium Bomber", "Local", TRUE +; "UnitState","OnDomesticTile","Local", TRUE +; } +; Combat_rounds Tribesmen +[effect_combat_rounds_tribesmen] +type = "Combat_Rounds" +value = 10 +reqs = + { "type", "name", "range", "present" + "UnitType", "Tribesmen", "Local", TRUE + } +; Combat_rounds for ancient ships +[effect_combat_rounds_riverships] +type = "Combat_Rounds" +value = 15 +reqs = + { "type", "name", "range", "present" + "UnitClass", "RiverShip", "Local", TRUE + "UnitType", "Frigate", "Local", FALSE + "UnitType", "Ram Ship", "Local", FALSE + } +[effect_combat_rounds_trireme] +type = "Combat_Rounds" +value = 15 +reqs = + { "type", "name", "range", "present" + "UnitType", "Trireme", "Local", TRUE + } +[effect_combat_rounds_zeppelin] +type = "Combat_Rounds" +value = 20 +reqs = + { "type", "name", "range", "present" + "UnitType", "Zeppelin", "Local", TRUE + } + +; Cheating AI effects are in separate file +*include "default/ai_effects.ruleset" + +[effect_unhappysize] +type = "City_Unhappy_Size" +value = 4 + +; Percent foreign citizens who are unhappy if at war with +; their original nation. See also effect below this one. +[effect_angry_conquered_1] +type = "Enemy_Citizen_Unhappy_Pct" +value = 45 + +; The above is rounded down, so use y=mx+b to get a better algorithm: +; Unhappy = (0.45 * of Foreign citizens) + 1 +[effect_angry_conquered_2] +type = "Make_Content" +value = -1 +reqs = + { "type", "name", "range", "present" + "MinForeignPct", "1", "City", TRUE + } + +; Barbarian effects +[effect_barb1] +type = "No_Diplomacy" +value = 1 +reqs = + { "type", "name", "range" + "NationGroup", "Barbarian", "Player" + } + +; Barbarian disappearance +[effect_barb_disappear] +type = "Retire_Pct" +value = 10 +reqs = + { "type", "name", "range", "present" + "NationGroup", "Barbarian", "Player", TRUE + "Age", "5", "Local", TRUE + "CityTile", "Center", "Local", FALSE + } + +; Lone Leader might escape on coast (33% chance) +; Complement of the two effects should be 0.9 * 0.66 = 0.594 +; (100 - 59) - 10 = 31 +[effect_leader_escape] +type = "Retire_Pct" +value = 31 +reqs = + { "type", "name", "range" + "UnitType", "Barbarian Leader", "Local" + "Age", "5", "Local" + "TerrainClass", "Oceanic", "Adjacent" + "MaxUnitsOnTile", "1", "Local" + } + +; Specialist output bonuses +[effect_elvis] +type = "Specialist_Output" +value = 2 +reqs = + { "type", "name", "range", "present" + "Specialist", "elvis", "Local", TRUE + "OutputType", "Luxury", "Local", TRUE + "Building", "Roman Colosseum", "Player", FALSE + } +[effect_elvis_roman_colosseum] +type = "Specialist_Output" +value = 3 +reqs = + { "type", "name", "range" + "Specialist", "elvis", "Local" + "OutputType", "luxury", "Local" + "Building", "Roman Colosseum", "Player" + } + +[effect_scientist] +type = "Specialist_Output" +value = 3 +reqs = + { "type", "name", "range" + "Specialist", "scientist", "Local" + "OutputType", "Science", "Local" + } + +[effect_taxman] +type = "Specialist_Output" +value = 3 +reqs = + { "type", "name", "range" + "Specialist", "taxman", "Local" + "OutputType", "Gold", "Local" + } + +[effect_merchant] +type = "Specialist_Output" +value = 2 +reqs = + { "type", "name", "range" + "Specialist", "merchant", "Local" + "OutputType", "Trade", "Local" + "Building", "A.Smith's Trading Co.", "Player" + } +[effect_merchant2] +type = "Specialist_Output" +value = 1 +reqs = + { "type", "name", "range" + "Specialist", "merchant", "Local" + "OutputType", "Gold", "Local" + "Building", "A.Smith's Trading Co.", "Player" + } +[effect_laborer] +type = "Specialist_Output" +value = 1 +reqs = + { "type", "name", "range" + "Specialist", "worker", "Local" + "OutputType", "Shield", "Local" + "Building", "A.Smith's Trading Co.", "Player" + } +[effect_farmer] +type = "Specialist_Output" +value = 1 +reqs = + { "type", "name", "range" + "Specialist", "farmer", "Local" + "OutputType", "Food", "Local" + "Building", "A.Smith's Trading Co.", "Player" + } + +; ***************** Resources generated by both cause="Resource" AND cause="Appear" +; ***************** need their output values set in EFFECTS. +[effect_berries] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Extra", "Berries", "Local" + "OutputType", "Food", "Local" + "Terrain", "Forest", "Local" + } +[effect_berries2] +type = "Output_Add_Tile" +value = 2 +reqs = + { "type", "name", "range" + "Extra", "Berries", "Local" + "OutputType", "Trade", "Local" + "Terrain", "Forest", "Local" + } +[effect_spice] +type = "Output_Add_Tile" +value = 2 +reqs = + { "type", "name", "range" + "Extra", "Spice", "Local" + "OutputType", "Food", "Local" + "Terrain", "Swamp", "Local" + } +[effect_spice2] +type = "Output_Add_Tile" +value = 4 +reqs = + { "type", "name", "range" + "Extra", "Spice", "Local" + "OutputType", "Trade", "Local" + "Terrain", "Swamp", "Local" + } +[effect_ivory] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Extra", "Ivory", "Local" + "OutputType", "Food", "Local" + "Terrain", "Glacier", "Local" + } +[effect_ivory2] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Extra", "Ivory", "Local" + "OutputType", "Shield", "Local" + "Terrain", "Glacier", "Local" + } +[effect_ivory3] +type = "Output_Add_Tile" +value = 4 +reqs = + { "type", "name", "range" + "Extra", "Ivory", "Local" + "OutputType", "Trade", "Local" + "Terrain", "Glacier", "Local" + } +[effect_peat] +type = "Output_Add_Tile" +value = 4 +reqs = + { "type", "name", "range" + "Extra", "Peat", "Local" + "OutputType", "Shield", "Local" + "Terrain", "Swamp", "Local" + } +[effect_peat_rails] +type = "Output_Add_Tile" +value = 2 +reqs = + { "type", "name", "range" + "Extra", "Peat", "Local" + "OutputType", "Shield", "Local" + "Terrain", "Swamp", "Local" + "Extra", "Railroad","Local" + } +[effect_oasis] +type = "Output_Add_Tile" +value = 3 +reqs = + { "type", "name", "range" + "Extra", "Oasis", "Local" + "OutputType", "Food", "Local" + "Terrain", "Desert", "Local" + } +[effect_rubber1] +type = "Output_Add_Tile" +value = 2 +reqs = + { "type", "name", "range" + "Extra", "Rubber", "Local" + "OutputType", "Trade", "Local" + "Terrain", "Jungle", "Local" + } +[effect_rubber2] +type = "Output_Add_Tile" +value = 2 +reqs = + { "type", "name", "range" + "Extra", "Rubber", "Local" + "OutputType", "Shield", "Local" + "Terrain", "Jungle", "Local" + } +[effect_rubber_rails] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Extra", "Rubber", "Local" + "OutputType", "Shield", "Local" + "Terrain", "Jungle", "Local" + "Extra", "Railroad", "Local" + } +[effect_gems] +type = "Output_Add_Tile" +value = 5 +reqs = + { "type", "name", "range" + "Extra", "Gems", "Local" + "OutputType", "Trade", "Local" + "Terrain", "Jungle", "Local" + } +[effect_furs] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Extra", "Furs", "Local" + "OutputType", "Food", "Local" + "Terrain", "Tundra", "Local" + } +[effect_furs2] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Extra", "Furs", "Local" + "OutputType", "Shield", "Local" + "Terrain", "Tundra", "Local" + } +[effect_furs3] +type = "Output_Add_Tile" +value = 3 +reqs = + { "type", "name", "range" + "Extra", "Furs", "Local" + "OutputType", "Trade", "Local" + "Terrain", "Tundra", "Local" + } +[effect_furs4] +type = "Output_Add_Tile" +value = 2 +reqs = + { "type", "name", "range" + "Extra", "Furs", "Local" + "OutputType", "Food", "Local" + "Terrain", "Glacier", "Local" + } +[effect_furs5] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Extra", "Furs", "Local" + "OutputType", "Shield", "Local" + "Terrain", "Glacier", "Local" + } +[effect_furs6] +type = "Output_Add_Tile" +value = 3 +reqs = + { "type", "name", "range" + "Extra", "Furs", "Local" + "OutputType", "Trade", "Local" + "Terrain", "Glacier", "Local" + } +[effect_elk] +type = "Output_Add_Tile" +value = 2 +reqs = + { "type", "name", "range" + "Extra", "Elk", "Local" + "OutputType", "Food", "Local" + "Terrain", "Tundra", "Local" + } +[effect_elk2] +type = "Output_Add_Tile" +value = 2 +reqs = + { "type", "name", "range" + "Extra", "Elk", "Local" + "OutputType", "Shield", "Local" + "Terrain", "Tundra", "Local" + } +[effect_elk_rails] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Extra", "Elk", "Local" + "OutputType", "Shield", "Local" + "Terrain", "Tundra", "Local" + "Extra", "Railroad", "Local" + } +[effect_iron] +type = "Output_Add_Tile" +value = 3 +reqs = + { "type", "name", "range" + "Extra", "Iron", "Local" + "OutputType", "Shield", "Local" + "Terrain", "Mountains", "Local" + } +[effect_iron_rails_no_mine] +type = "Output_Add_Tile" +value = 2 +reqs = + { "type", "name", "range" + "Extra", "Iron", "Local" + "OutputType", "Shield", "Local" + "Terrain", "Mountains", "Local" + "Extra", "Railroad", "Local" + } +[effect_iron_rails_mine] +type = "Output_Add_Tile" +value = -1 ;was overproducing by 1 +reqs = + { "type", "name", "range" + "Extra", "Iron", "Local" + "OutputType", "Shield", "Local" + "Terrain", "Mountains", "Local" + "Extra", "Railroad", "Local" + "Extra", "Mine", "Local" + } +; *** WANDERING RESOURCES ** +[effect_deer] +type = "Output_Add_Tile" +value = 3 +reqs = + { "type", "name", "range" + "Extra", "Deer", "Local" + "OutputType", "Food", "Local" + } +[effect_wild_boar] +type = "Output_Add_Tile" +value = 3 +reqs = + { "type", "name", "range" + "Extra", "Wild Boar", "Local" + "OutputType", "Food", "Local" + } +; *** "BLOOD FOR OIL" ** +[effect_blood_for_oil] +type = "Output_Add_Tile" ; Refining gives +1 shield to Oil Wells IFF on Oil. +value = 1 +reqs = + { "type", "name", "range", "present" + "Tech", "Refining", "Player", TRUE + "Extra", "Oil Well", "Local", TRUE + "Extra", "Oil", "Local", TRUE + "OutputType", "Shield", "Local", TRUE + } +; ***************************************************** + +; Vision benefit from mountains (for every land unit) +[effect_mountains_vision] +type = "Unit_Vision_Radius_Sq" +value = 5 +reqs = + { "type", "name", "range" + "Terrain", "Mountains", "Local" + "UnitClass", "Land", "Local" + } +[effect_mountains_vision_1] +type = "Unit_Vision_Radius_Sq" +value = 5 +reqs = + { "type", "name", "range" + "Terrain", "Mountains", "Local" + "UnitClass", "LandAirSea", "Local" + } +[effect_mountains_vision_2] +type = "Unit_Vision_Radius_Sq" +value = 5 +reqs = + { "type", "name", "range" + "Terrain", "Mountains", "Local" + "UnitClass", "LandNoKill", "Local" + } + +; basic free tech upkeep +[effect_upkeep_tech_free] +type = "Tech_Upkeep_Free" +value = 3 +; ******************************** TRADE ROUTES ********************************* +[effect_trade_routes] +type = "Max_Trade_Routes" +value = 1 + +;pow(2, value/1000) = Base % +; ------------ ESTABLISH TRADE ROUTE, ONE TIME BONUS ----------------- +;pow(2, value/1000) USE STANDARD BONUS. +;[effect_base_trade_revenue_reduce] +;type = "Trade_Revenue_Bonus" +;value = 0 + +;-40% +[effect_railroad_trade_revenue_reduce] +type = "Trade_Revenue_Bonus" +value = -585 +reqs = + { "type", "name", "range" + "Tech", "Railroad", "Player" + } +;-40% +[effect_flight_trade_revenue_reduce] +type = "Trade_Revenue_Bonus" +value = -585 +reqs = + { "type", "name", "range" + "Tech", "Flight", "Player" + } +;Adjust as a one time bonus with slightly higher ROI than coinage. +;-33% +[effect_enter_marketplace_bonus_increase] +type = "Trade_Revenue_Bonus" +value = -585 +reqs = + { "type", "name", "range" + "Action", "Enter Marketplace", "Local" + } +[effect_early_trade_capitals_bonus] +type = "Trade_Revenue_Bonus" +value = 2000 +reqs = + { "type", "name", "range", "present" + "Building", "Palace", "City", TRUE + "Building", "Palace", "Traderoute", TRUE + "Tech", "Banking", "World", FALSE + } +;------------------------------------------------------------------------ + +; Minimum trade from a traderoute is 1; change down-round to up-round by +; adding 1 to city center. +[effect_traderoute_minimum2] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + ; This was the ONLY req we could find for detecting a TradeRoute, + ; everything else was false + or - + "CityStatus", "OwnedByOriginal", "TradeRoute" + "CityTile", "Center", "Local" + "OutputType", "Trade", "Local" + } +; ******************************************************************************* + + +; ***************************** SEA UNIT REPAIR ******************************* +; Sea units have crews which pro-actively repair damage regardless of movement. +; This is almost comparable to land unit healing. Sea units being "Use once +; and dispose", and/or unable to re-enter action for literally centuries, had +; created issues in realism, playability, and balance. 8% repair/turn effect: +; 10hp units: +0 hp/turn 20hp units: +1 hp/turn +; 30hp units: +2 hp/turn 40hp units: +3 hp/turn +;[effect_sea_hp_regen] +;type = "Unit_Recover_Pct" +;value = 8 +;reqs = +; { "type", "name", "range" +; "UnitClass", "Sea", "Local" +; } +;[effect_sub_hp_regen] +;type = "Unit_Recover_Pct" +;value = 8 +;reqs = +; { "type", "name", "range" +; "UnitClass", "Submarine", "Local" +; } +;[effect_rivership_hp_regen] +;type = "Unit_Recover_Pct" +;value = 8 +;reqs = +; { "type", "name", "range" +; "UnitClass", "RiverShip", "Local" +; } +; The effects above replace the effects below after Unit_Recover_Pct is up +; The effects below substitute if Unit_Recover_Pct is missing from server +[effect_sea_hp_regen] +type = "Unit_Recover" ;30 hp units get + 2 +value = 2 +reqs = + { "type", "name", "range" + "UnitClass", "Sea", "Local" + } +[effect_sub_hp_regen] ;30 hp units get + 2 +type = "Unit_Recover" +value = 2 +reqs = + { "type", "name", "range" + "UnitClass", "Submarine", "Local" + } +[effect_rivership_hp_regen] ;20 hp units get + 1 +type = "Unit_Recover" +value = 1 +reqs = + { "type", "name", "range", "present" + "UnitClass", "RiverShip", "Local", TRUE + "UnitType", "Boat", "Local", FALSE ;have to exclude all 10hp ships + "UnitType", "Galley", "Local", FALSE + "UnitType", "War Galley", "Local", FALSE + "UnitType", "Longboat", "Local", FALSE + "UnitType", "Caravel", "Local", FALSE + "UnitType", "Ram Ship", "Local", FALSE + } +[effect_battleship_hp_regen] ;40 hp units get + 3 +type = "Unit_Recover" +value = 1 ; 2+1=3 +reqs = + { "type", "name", "range" + "UnitType", "Battleship", "Local" + } +[effect_carrier_hp_regen] ;40 hp units get + 3 +type = "Unit_Recover" +value = 1 ; 2+1=3 +reqs = + { "type", "name", "range" + "UnitType", "Carrier", "Local" + } +; **************************** STACK ESCAPE ODDS *************************** +[effect_base_stack_escape_odds] ; all stack escape units have 60% base odds. +type = "Stack_Escape_Pct" +value = 10 ; 50% → = 60% + +[effect_satellite_stack_escape_odds] +type = "Stack_Escape_Pct" +value = 40 ; 60% → 100% +reqs = + { "type", "name", "range" + "UnitType", "Satellite", "Local" + } +[effect_submarine_stack_escape_odds] +type = "Stack_Escape_Pct" +value = 15 ; 60% → 75% +reqs = + { "type", "name", "range" + "UnitType", "Submarine", "Local" + } +[effect_destroyer_stack_escape_odds] +type = "Stack_Escape_Pct" +value = 7 ; 60% → 67% +reqs = + { "type", "name", "range" + "UnitType", "Destroyer", "Local" + } +[effect_missile_destroyer_stack_escape_odds] +type = "Stack_Escape_Pct" +value = 7 ; 60% → 67% +reqs = + { "type", "name", "range" + "UnitType", "Missile Destroyer", "Local" + } +[effect_stealth_fighter_stack_escape_odds] +type = "Stack_Escape_Pct" +value = 7 ; 60% → 67% +reqs = + { "type", "name", "range" + "UnitType", "Stealth Fighter", "Local" + } +[effect_stealth_bomber_stack_escape_odds] +type = "Stack_Escape_Pct" +value = 7 ; 60% → 67% +reqs = + { "type", "name", "range" + "UnitType", "Stealth Bomber", "Local" + } +[effect_spy_plane_stack_escape_odds] +type = "Stack_Escape_Pct" +value = 7 ; 60% → 67% +reqs = + { "type", "name", "range" + "UnitType", "Spy Plane", "Local" + } + +; ******** ruleset bonus ********** FORTIFY and RIVER ********************* +[effect_fortified] +type = "Fortify_Defense_Bonus" +value = 50 +reqs = + { "type", "name", "range" + "Activity", "Fortified", "Local" + } + +[effect_city_fortified] +type = "Fortify_Defense_Bonus" +value = 50 +reqs = + { "type", "name", "range", "present" + "CityTile", "Center", "Local", TRUE + "Activity", "Fortified", "Local", FALSE + "UnitClassFlag", "CanFortify", "Local", TRUE + "UnitFlag", "Cant_Fortify", "Local", FALSE + } + +[effect_terrain_bonus_river] +type = "Terrain_Defend_Add_Bonus" +value = 50 + reqs = + { "type", "name", "range" + "Extra", "River", "Local" + "UnitClassFlag", "TerrainDefense", "Local" + } + +; ****************************** RECYCLE SHIELDS ************************** +[effect_unit_shield_value_recycle] +type = "Unit_Shield_Value_Pct" +value = -50 +reqs = + { "type", "name", "range", "present" + "Action", "Recycle Unit", "Local", TRUE + "UnitClass", "Cargo", "Local", FALSE + "UnitType", "Tribesmen", "Local", FALSE + ; Everything except Cargo class has classic 50% recycle penalty: + } +[effect_unit_shield_value_recycle_cargo_unit] +;The Goods unit_Type has 25% recycle penalty. Freight +;is caught by no effects so remains 100% +type = "Unit_Shield_Value_Pct" +value = -24 +reqs = + { "type", "name", "range", "present" + "Action", "Recycle Unit", "Local", TRUE + "UnitType", "Goods", "Local", TRUE + } +;Tribesmen recycle bonus into anything but units: +[effect_tribesmen_recycle] +type = "Unit_Shield_Value_Pct" +value = 100 ; 20 shields recycle for Tribesmen. +reqs = + { "type", "name", "range", "present" + "Action", "Recycle Unit", "Local", TRUE + "UnitType", "Tribesmen", "Local", TRUE + "MinYear", "-2000", "World", FALSE + } + +;TO DO: this could be used in interesting ways: e.g., foot units, bombers, etc. +[effect_unit_shield_value_in_upgrade_price_calc] +type = "Unit_Shield_Value_Pct" +value = -50 +reqs = + { "type", "name", "range", "present" + "Action", "Upgrade Unit", "Local", TRUE + } + +; *********************************** BASES ******************************* + +; **** FORT ***** +[effect_fort_defense] +type = "Defend_Bonus" +value = 33 +reqs = + { "type", "name", "range", "present" + "Extra", "Fort", "Local", TRUE + "Extra", "Fortress", "Local", FALSE ; Fortress calculated separately even if a fort is under it. + "Extra", "Naval Base", "Local", FALSE ; Naval base calculated separately even if a fort is under it. + "UnitClass", "Helicopter", "Local", FALSE ; ... these attackers do not activate Fort defense bonus + "UnitClass", "Air", "Local", FALSE ; ... " " " " " " " " + "UnitClass", "Air_High_Altitude","Local", FALSE ; ... " " " " " " " " + "UnitClass", "AirProtect", "Local", FALSE ; ... " " " " " " " " + "UnitType", "Armor", "Local", FALSE ; ... " " " " " " " " + "UnitType", "Armor II", "Local", FALSE ; ... " " " " " " " " + } +; Fort HP regen +[effect_fort_hp_regen] +type = "HP_Regen" +value = 10 +reqs = + { "type", "name", "range" + "Extra", "Fort", "Tile" + "UnitClass", "Land", "Local" + } +[effect_fort_hp_regen_1] +type = "HP_Regen" +value = 10 +reqs = + { "type", "name", "range" + "Extra", "Fort", "Tile" + "UnitClass", "LandAirSea", "Local" + } +[effect_fort_hp_regen_2] +type = "HP_Regen" +value = 10 +reqs = + { "type", "name", "range" + "Extra", "Fort", "Tile" + "UnitClass", "LandNoKill", "Local" + } + +; **** FORTRESS/NAVAL BASE *************************************************** + +; Adjust the 1.67xdefense_bonus in terrain.ruleset for some attackers: +; **************************************************************************** +[effect_nonfortbuster_vs_fortress] +type = "Defend_Bonus" +value = 20 ;increase 1.67x to 2x except when defending against FortBuster types. +;note: 1.20*1.67=2.0 (this bonus is multiplied after terrain defense_bonus was multiplied) +reqs = + { "type", "name", "range", "present" + "Extra", "Fortress", "Local", TRUE + "UnitFlag", "FortBuster", "Local", FALSE + "UnitFlag", "FortressBuster", "Local", FALSE + "UnitFlag", "AirAttacker", "Local", FALSE + } +[effect_nonfortbuster_vs_navalbase] ;same as above but for naval base +type = "Defend_Bonus" +value = 20 ;increase 1.67x to 2x except when defending against FortBuster types. +;note: 1.20*1.67=2.0 (this bonus is multiplied after terrain defense_bonus was multiplied) +reqs = + { "type", "name", "range", "present" + "Extra", "Naval Base", "Local", TRUE + "UnitFlag", "FortBuster", "Local", FALSE + "UnitFlag", "FortressBuster", "Local", FALSE + "UnitFlag", "AirAttacker", "Local", FALSE + } +[effect_fortressbuster_fortress] +type = "Attack_Bonus" +value = 67 ;Cancel defender's 1.67x with attacker getting 1.67x +reqs = + { "type", "name", "range", "present" + "Extra", "Fortress", "Local", TRUE + "UnitFlag", "FortressBuster", "Local", TRUE + } +[effect_fortressbuster_navalbase] +type = "Attack_Bonus" +value = 67 ;Cancel defender's 1.67x with attacker getting 1.67x +reqs = + { "type", "name", "range", "present" + "Extra", "Naval Base", "Local", TRUE + "UnitFlag", "FortressBuster", "Local", TRUE + } +; ****** ^^ defense_bonus_correctives ^^ ************************************* + +; Vision benefit from fortress watchtowers +[effect_fortress_vision] +type = "Unit_Vision_Radius_Sq" +value = 8 +reqs = + { "type", "name", "range" + "Extra", "Fortress", "tile" + "Tech", "Invention", "Player" + "UnitClass", "Land", "Local" + } +[effect_fortress_vision_1] ;Marines, AAA +type = "Unit_Vision_Radius_Sq" +value = 8 +reqs = + { "type", "name", "range" + "Extra", "Fortress", "tile" + "Tech", "Invention", "Player" + "UnitClass", "LandAirSea", "Local" + } +[effect_fortress_vision_2] ;Knights +type = "Unit_Vision_Radius_Sq" +value = 8 +reqs = + { "type", "name", "range" + "Extra", "Fortress", "tile" + "Tech", "Invention", "Player" + "UnitClass", "LandNoKill", "Local" + } +[effect_castle_vision] +type = "Unit_Vision_Radius_Sq" +value = 8 +reqs = + { "type", "name", "range" + "Extra", "Castle", "tile" + "Tech", "Invention", "Player" + "UnitClass", "Land", "Local" + } +[effect_castle_vision_1] ;Marines, AAA +type = "Unit_Vision_Radius_Sq" +value = 8 +reqs = + { "type", "name", "range" + "Extra", "Castle", "tile" + "Tech", "Invention", "Player" + "UnitClass", "LandAirSea", "Local" + } +[effect_castle_vision_2] ;Knights +type = "Unit_Vision_Radius_Sq" +value = 8 +reqs = + { "type", "name", "range" + "Extra", "Castle", "tile" + "Tech", "Invention", "Player" + "UnitClass", "LandNoKill", "Local" + } +[effect_navalbase_vision] +type = "Unit_Vision_Radius_Sq" +value = 8 +reqs = + { "type", "name", "range" + "Extra", "Naval Base", "tile" + "Tech", "Invention", "Player" + "UnitClass", "Land", "Local" + } +[effect_navalbase_vision_1] ;Marines, AAA +type = "Unit_Vision_Radius_Sq" +value = 8 +reqs = + { "type", "name", "range" + "Extra", "Naval Base", "tile" + "Tech", "Invention", "Player" + "UnitClass", "LandAirSea", "Local" + } +[effect_navalbase_vision_2] ;Knights +type = "Unit_Vision_Radius_Sq" +value = 8 +reqs = + { "type", "name", "range" + "Extra", "Naval Base", "tile" + "Tech", "Invention", "Player" + "UnitClass", "LandNoKill", "Local" + } + +; Fortress types, HP regen -------------------------------------------- +[effect_fortress_hp_regen] +; Cumulative with fort: 10+15=25 +type = "HP_Regen" +value = 15 +reqs = + { "type", "name", "range" + "ExtraFlag", "FortressHeal", "Tile" + "UnitClass", "Land", "Local" + } +[effect_fortress_hp_regen_1] +type = "HP_Regen" +value = 15 +reqs = + { "type", "name", "range" + "ExtraFlag", "FortressHeal", "Tile" + "UnitClass", "LandAirSea", "Local" + } +[effect_fortress_hp_regen_2] +type = "HP_Regen" +value = 15 +reqs = + { "type", "name", "range" + "ExtraFlag", "FortressHeal", "Tile" + "UnitClass", "LandNoKill", "Local" + } +[effect_fortress_hp_regen_3] +type = "HP_Regen" +value = 25 ;25 because not cumulative with Fort (Fort only nullfies hp loss each turn) +reqs = + { "type", "name", "range" + "ExtraFlag", "FortressHeal", "Tile" + "UnitClass", "Helicopter", "Local" + } + +; Airbase HP regen --------------------------------------------------- +[effect_airbase_hp_regen] +type = "HP_Regen" +value = 25 +reqs = + { "type", "name", "range" + "Extra", "Airbase", "Tile" + "UnitClass", "Helicopter", "Local" + } +[effect_airbase_hp_regen1] +type = "HP_Regen" +value = 15 +reqs = + { "type", "name", "range" + "Extra", "Airbase", "Tile" + "UnitClass", "AirProtect", "Local" + } +[effect_airbase_hp_regen2] +type = "HP_Regen" +value = 15 +reqs = + { "type", "name", "range" + "Extra", "Airbase", "Tile" + "UnitClass", "Air", "Local" + } +[effect_airbase_hp_regen3] +type = "HP_Regen" +value = 15 +reqs = + { "type", "name", "range" + "Extra", "Airbase", "Tile" + "UnitClass", "Air_High_Altitude", "Local" + } + +; ****************** NAVAL BASE ****************************** +[effect_navbase_vision] +type = "Unit_Vision_Radius_Sq" +value = 8 +reqs = + { "type", "name", "range" + "Extra", "Naval Base", "tile" + "Tech", "Invention", "Player" + "UnitClass", "Trireme", "Local" + } +[effect_navbase_vision1] +type = "Unit_Vision_Radius_Sq" +value = 8 +reqs = + { "type", "name", "range" + "Extra", "Naval Base", "tile" + "Tech", "Invention", "Player" + "UnitClass", "RiverShip", "Local" + } +[effect_navbase_vision2] +type = "Unit_Vision_Radius_Sq" +value = 8 +reqs = + { "type", "name", "range" + "Extra", "Naval Base", "tile" + "Tech", "Invention", "Player" + "UnitClass", "Sea", "Local" + } +; Naval Base HP regen +[effect_navbase_hp_regen] +type = "HP_Regen" +value = 20 +reqs = + { "type", "name", "range" + "Extra", "Naval Base", "Tile" + "UnitClass", "Sea", "Local" + } +[effect_navbase_hp_regen_1] +type = "HP_Regen" +value = 20 +reqs = + { "type", "name", "range" + "Extra", "Naval Base", "Tile" + "UnitClass", "RiverShip", "Local" + } +[effect_navbase_hp_regen_2] +type = "HP_Regen" +value = 20 +reqs = + { "type", "name", "range" + "Extra", "Naval Base", "Tile" + "UnitClass", "Trireme", "Local" + } +[effect_navbase_hp_regen_3] +type = "HP_Regen" +value = 20 +reqs = + { "type", "name", "range" + "Extra", "Naval Base", "Tile" + "UnitClass", "Submarine", "Local" + } +; *********************************************************** + +; Base vision range - radius of vision is sqrt(5) = 2.24 +[effect_city_vision] +type = "City_Vision_Radius_Sq" +value = 5 + +;PERCENTAGE CHANCE OF STEALING A TECH WHEN CONQUERING A CITY. +[effect_conquest_tech] +type = "Conquest_Tech_Pct" +value = 100 + +;Tribesmen------------------------------------------ +[effect_tribesmen_first_three_turns] +type = "Move_Bonus" +value = 3 +reqs = + { + "type", "name", "range", "present" + "UnitType", "Tribesmen", "Local", TRUE + "MinYear", "-3700", "World", FALSE + } +[effect_tribesmen_slow] +type = "Move_Bonus" +value = -3 +reqs = + { + "type", "name", "range" + "UnitType", "Tribesmen", "Local" + "MinYear", "-2000", "World" + } +[effect_tribesmen_glaucoma] +type = "Unit_Vision_Radius_Sq" +value = -1 +reqs = + { + "type", "name", "range" + "UnitType", "Tribesmen", "Local" + "MinYear", "-2000", "World" + } +;------------------------------------------------------ + +;Freshly fueled full hp helicopters get +1 move per turn +[effect_fresh_helicopter] +type = "Move_Bonus" +value = 9 +reqs = + { "type", "name", "range" + "UnitClass", "Helicopter", "Local" + "Extra", "Airbase", "Local" + } +;Freshly fueled full hp helicopters get +1 move per turn +[effect_fresh_helicopter2] +type = "Move_Bonus" +value = 9 +reqs = + { "type", "name", "range" + "UnitClass", "Helicopter", "Local" + "CityTile", "Center", "Local" + } + +; Nuclear power gives +1 moves to sea units (+2 under 2x) +[effect_nuclear_powered_boats] +type = "Move_Bonus" +value = 18 +reqs = + { "type", "name", "range" + "Tech", "Nuclear Power", "Player" + "UnitClass", "Sea", "Local" + } +; Nuclear power gives +1 moves to sea units (+2 under 2x) +[effect_nuclear_powered_subs] +type = "Move_Bonus" +value = 18 +reqs = + { "type", "name", "range" + "Tech", "Nuclear Power", "Player" + "UnitClass", "Submarine", "Local" + } + +;************************************* GOVERNMENT CORRUPTION +[effect_corruption_anarchy_1] +type = "Output_Waste" +value = 25 +reqs = + { "type", "name", "range" + "Gov", "Anarchy", "Player" + "OutputType", "Trade", "Local" + } +[effect_corruption_anarchy_2] +type = "Output_Waste_By_Distance" +value = 200 +reqs = + { "type", "name", "range" + "Gov", "Anarchy", "Player" + "OutputType", "Trade", "Local" + } +[effect_corruption_despotism_1] +type = "Output_Waste" +value = 37 +reqs = + { "type", "name", "range" + "Gov", "Despotism", "Player" + "OutputType", "Trade", "Local" + } +[effect_corruption_despotism_2] +type = "Output_Waste_By_Distance" +value = 400 +reqs = + { "type", "name", "range" + "Gov", "Despotism", "Player" + "OutputType", "Trade", "Local" + } +[effect_corruption_monarchy_1] +type = "Output_Waste" +value = 15 +reqs = + { "type", "name", "range" + "Gov", "Monarchy", "Player" + "OutputType", "Trade", "Local" + } +[effect_corruption_monarchy_2] +type = "Output_Waste_By_Distance" +value = 200 +reqs = + { "type", "name", "range" + "Gov", "Monarchy", "Player" + "OutputType", "Trade", "Local" + } +[effect_corruption_republic_1] +type = "Output_Waste" +value = 15 +reqs = + { "type", "name", "range" + "Gov", "Republic", "Player" + "OutputType", "Trade", "Local" + } +[effect_corruption_republic_2] +type = "Output_Waste_By_Distance" +value = 200 +reqs = + { "type", "name", "range" + "Gov", "Republic", "Player" + "OutputType", "Trade", "Local" + } +[effect_corruption_democracy_1] +type = "Output_Waste" +value = 8 +reqs = + { "type", "name", "range" + "Gov", "Democracy", "Player" + "OutputType", "Trade", "Local" + } +[effect_corruption_democracy_2] +type = "Output_Waste_By_Distance" +value = 40 +reqs = + { "type", "name", "range" + "Gov", "Democracy", "Player" + "OutputType", "Trade", "Local" + } +[effect_corruption_communism_1] +type = "Output_Waste" +value = 20 +reqs = + { "type", "name", "range" + "Gov", "Communism", "Player" + "OutputType", "Trade", "Local" + } +;[effect_corruption_communism_2] +;No output waste by distance + +[effect_corruption_theocracy_2] +type = "Output_Waste" +value = 2 +reqs = + { "type", "name", "range" + "Gov", "Theocracy", "Player" + "OutputType", "Trade", "Local" + } +[effect_corruption_theocracy1] +type = "Output_Waste_By_Distance" +value = 200 +reqs = + { "type", "name", "range" + "Gov", "Theocracy", "Player" + "OutputType", "Trade", "Local" + } +[effect_corruption_nationalism0] +type = "Output_Waste" +value = 8 +reqs = + { "type", "name", "range" + "Gov", "Nationalism", "Player" + "OutputType", "Trade", "Local" + } +[effect_corruption_nationalism1] +type = "Output_Waste_By_Distance" +value = 200 +reqs = + { "type", "name", "range" + "Gov", "Nationalism", "Player" + "OutputType", "Trade", "Local" + } +;*********************************************** UNIT UPKEEP +[effect_base_unit_upkeep] +type = "Upkeep_Factor" +value = 1 + +[effect_upkeep_free_units_anarchy] +type = "Unit_Upkeep_Free_Per_City" +value = 3 +reqs = + { "type", "name", "range" + "Gov", "Anarchy", "Player" + "OutputType", "Shield", "Local" + } +[effect_anarchy_upkeep_tech_free] +type = "Tech_Upkeep_Free" +value = 9999 +reqs = + { "type", "name", "range" + "Gov", "Anarchy", "Player" + } +[effect_anarchy_upkeep] +type = "Upkeep_Free" +value = 99 +reqs = + { "type", "name", "range" + "Gov", "Anarchy", "Player" + } +[effect_upkeep_free_units_despotism] +type = "Unit_Upkeep_Free_Per_City" +value = 3 +reqs = + { "type", "name", "range" + "Gov", "Despotism", "Player" + "OutputType", "Shield", "Local" + } +[effect_upkeep_free_units_monarchy] +type = "Unit_Upkeep_Free_Per_City" +value = 3 +reqs = + { "type", "name", "range", "present" + "Gov", "Monarchy", "Player", TRUE + "OutputType", "Shield", "Local", TRUE + "Building", "Magna Carta", "Player", FALSE + } +[effect_upkeep_free_units_magna_carta] +type = "Unit_Upkeep_Free_Per_City" +value = 1 +reqs = + { "type", "name", "range", "present" + "Gov", "Monarchy", "Player", TRUE + "OutputType", "Shield", "Local", TRUE + "Building", "Magna Carta", "Player", TRUE + } +[effect_magna_carta_unit_unhappiness] +type = "Unhappy_Factor" +value = 1 +reqs = + { "type", "name", "range", "present" + "Gov", "Monarchy", "Player", TRUE + "Building", "Magna Carta", "Player", TRUE + } +[effect_magna_carta_free_deployment] +type = "Make_Content_Mil" +value = 2 +reqs = + { "type", "name", "range", "present" + "Gov", "Monarchy", "Player", TRUE + "Building", "Magna Carta", "Player", TRUE + } +[effect_republic_free_deployment] +type = "Make_Content_Mil" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Republic", "Player" + } +[effect_republic_settler_food_upkeep] +type = "Upkeep_Factor" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Republic", "Player" + "OutputType", "Food", "Local" + } +[effect_republic_unit_unhappiness] +type = "Unhappy_Factor" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Republic", "Player" + } +[effect_democracy_settler_food_upkeep] +type = "Upkeep_Factor" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Democracy", "Player" + "OutputType", "Food", "Local" + } +[effect_democracy_unit_unhappiness] +type = "Unhappy_Factor" +value = 2 +reqs = + { "type", "name", "range" + "Gov", "Democracy", "Player" + } +[effect_upkeep_free_units_communism] +type = "Unit_Upkeep_Free_Per_City" +value = 4 +reqs = + { "type", "name", "range" + "Gov", "Communism", "Player" + "OutputType", "Shield", "Local" + } +[effect_building_upkeep_communism] +type = "Upkeep_Free" ; +value = 1 +reqs = + { "type", "name", "range", "quiet" + "Gov", "Communism", "Player", TRUE + } +[effect_theocracy_settler_food_upkeep] +type = "Upkeep_Factor" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Theocracy", "Player" + "OutputType", "Food", "Local" + } +[effect_upkeep_free_units_theocracy] +type = "Unit_Upkeep_Free_Per_City" +value = 10 +reqs = + { "type", "name", "range" + "Gov", "Theocracy", "Player" + "OutputType", "Shield", "Local" + } +[effect_nationalism_unit_upkeep] +type = "Upkeep_Factor" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Nationalism", "Player" + "OutputType", "Food", "Local" + } +[effect_upkeep_free_units_nationalism] +type = "Unit_Upkeep_Free_Per_City" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Nationalism", "Player" + "OutputType", "Shield", "Local" + } +;************************************************ CIVIL WAR +[effect_civil_war_anarchy] +type = "Civil_War_Chance" +value = 90 +reqs = + { "type", "name", "range" + "Gov", "Anarchy", "Player" + } +[effect_civil_war_despotism] +type = "Civil_War_Chance" +value = 80 +reqs = + { "type", "name", "range" + "Gov", "Despotism", "Player" + } +[effect_civil_war_monarchy] +type = "Civil_War_Chance" +value = 70 +reqs = + { "type", "name", "range", "present" + "Gov", "Monarchy", "Player", TRUE + "Building", "Magna Carta", "Player", FALSE + } +[effect_civil_war_constitutional_monarchy] +type = "Civil_War_Chance" +value = 50 +reqs = + { "type", "name", "range", "present" + "Gov", "Monarchy", "Player", TRUE + "Building", "Magna Carta", "Player", TRUE + } +[effect_civil_war_republic] +type = "Civil_War_Chance" +value = 40 +reqs = + { "type", "name", "range" + "Gov", "Republic", "Player" + } +[effect_civil_war_democracy] +type = "Civil_War_Chance" +value = 30 +reqs = + { "type", "name", "range" + "Gov", "Democracy", "Player" + } +[effect_civil_war_communism] +type = "Civil_War_Chance" +value = 50 +reqs = + { "type", "name", "range" + "Gov", "Communism", "Player" + } +[effect_civil_war_nationalism] +type = "Civil_War_Chance" +value = 40 +reqs = + { "type", "name", "range" + "Gov", "Nationalism", "Player" + } +;[effect_civil_war_theocracy] +;type = "Civil_War_Chance" +;value = 0 +;reqs = +; { "type", "name", "range" +; "Gov", "Theocracy", "Player" +; } +;******************************************* EMPIRE SIZE / cities +[effect_empire_size_base_anarchy] +type = "Empire_Size_Base" +value = 9 +reqs = + { "type", "name", "range" + "Gov", "Anarchy", "Player" + } +[effect_empire_size_step_anarchy] +type = "Empire_Size_Step" +value = 6 +reqs = + { "type", "name", "range" + "Gov", "Anarchy", "Player" + } +[effect_empire_size_base_despotism] +type = "Empire_Size_Base" +value = 10 +reqs = + { "type", "name", "range" + "Gov", "Despotism", "Player" + } +[effect_empire_size_step_despotism] +type = "Empire_Size_Step" +value = 10 +reqs = + { "type", "name", "range" + "Gov", "Despotism", "Player" + } +[effect_empire_size_base_monarchy] +type = "Empire_Size_Base" +value = 11 +reqs = + { "type", "name", "range" + "Gov", "Monarchy", "Player" + } +[effect_empire_size_base_constitutional_monarchy] +type = "Empire_Size_Base" +value = 12 +reqs = + { "type", "name", "range" + "Gov", "Monarchy", "Player" + "Building", "Magna Carta", "Player" + } +[effect_empire_size_step_monarchy] +type = "Empire_Size_Step" +value = 12 +reqs = + { "type", "name", "range" + "Gov", "Monarchy", "Player" + } +;Replaced by [effect_empire_size_base_constitutional_monarchy] in order to make the Happy Tab more "accurately" +;portray the cause as the 'government' constitutional monarchy rather than caused by the 'building' +;[effect_23_12_empire_base_step_magna_carta] +;type = "Make_Content" +;value = 1 ; One extra content creates a 23/12 base/step +;reqs = +; { "type", "name", "range", "present" +; "Gov", "Monarchy", "Player", TRUE +; "Building", "Magna Carta", "Player", TRUE +; } +[effect_empire_size_base_republic] +type = "Empire_Size_Base" +value = 13 +reqs = + { "type", "name", "range" + "Gov", "Republic", "Player" + } +[effect_empire_size_step_republic] +type = "Empire_Size_Step" +value = 14 +reqs = + { "type", "name", "range" + "Gov", "Republic", "Player" + } +[effect_empire_size_base_democracy] +type = "Empire_Size_Base" +value = 14 +reqs = + { "type", "name", "range" + "Gov", "Democracy", "Player" + } +[effect_empire_size_step_democracy] +type = "Empire_Size_Step" +value = 16 +reqs = + { "type", "name", "range" + "Gov", "Democracy", "Player" + } +[effect_empire_size_base_theocracy] +type = "Empire_Size_Base" +value = 14 +reqs = + { "type", "name", "range" + "Gov", "Theocracy", "Player" + } +[effect_empire_size_step_theocracy] +type = "Empire_Size_Step" +value = 15 +reqs = + { "type", "name", "range" + "Gov", "Theocracy", "Player" + } +[effect_empire_size_base_communism] +type = "Empire_Size_Base" +value = 12 +reqs = + { "type", "name", "range" + "Gov", "Communism", "Player" + } + +; Empire_Size_Step disabled for Communism + +[effect_empire_size_base_nationalism] +type = "Empire_Size_Base" +value = 20 +reqs = + { "type", "name", "range" + "Gov", "Nationalism", "Player" + } +[effect_empire_size_step_nationalism] +type = "Empire_Size_Step" +value = 12 +reqs = + { "type", "name", "range" + "Gov", "Nationalism", "Player" + } +;******************************************** MAX TAX RATES +[effect_max_rates_anarchy] +type = "Max_Rates" +value = 100 +reqs = + { "type", "name", "range" + "Gov", "Anarchy", "Player" + } +[effect_max_rates_despotism] +type = "Max_Rates" +value = 60 +reqs = + { "type", "name", "range" + "Gov", "Despotism", "Player" + } +[effect_max_rates_monarchy] +type = "Max_Rates" +value = 70 +reqs = + { "type", "name", "range" + "Gov", "Monarchy", "Player" + } +[effect_max_rates_republic] +type = "Max_Rates" +value = 80 +reqs = + { "type", "name", "range" + "Gov", "Republic", "Player" + } +[effect_max_rates_democracy] +type = "Max_Rates" +value = 100 +reqs = + { "type", "name", "range" + "Gov", "Democracy", "Player" + } +[effect_max_rates_theocracy] +type = "Max_Rates" +value = 80 +reqs = + { "type", "name", "range" + "Gov", "Theocracy", "Player" + } +[effect_max_rates_communism] +type = "Max_Rates" +value = 80 +reqs = + { "type", "name", "range" + "Gov", "Communism", "Player" + } +[effect_max_rates_nationalism] +type = "Max_Rates" +value = 90 +reqs = + { "type", "name", "range" + "Gov", "Nationalism", "Player" + } +;********************************************** MARTIAL LAW, governments +[effect_martial_law_each_anarchy] +type = "Martial_Law_Each" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Anarchy", "Player" + } +[effect_martial_law_max_anarchy] +type = "Martial_Law_Max" +value = 100 +reqs = + { "type", "name", "range" + "Gov", "Anarchy", "Player" + } +[effect_martial_law_each_despotism] +type = "Martial_Law_Each" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Despotism", "Player" + } +[effect_martial_law_max_despotism] +type = "Martial_Law_Max" +value = 100 +reqs = + { "type", "name", "range" + "Gov", "Despotism", "Player" + } +[effect_martial_law_each_monarchy] +type = "Martial_Law_Each" +value = 1 +reqs = + { "type", "name", "range", "present" + "Gov", "Monarchy", "Player", TRUE + } +[effect_martial_law_max_monarchy] +type = "Martial_Law_Max" +value = 3 +reqs = + { "type", "name", "range", "present" + "Gov", "Monarchy", "Player", TRUE + "Building", "Magna Carta", "Player", FALSE + } +[effect_martial_law_max_magna_carta] +type = "Martial_Law_Max" +value = 1 +reqs = + { "type", "name", "range", "present" + "Gov", "Monarchy", "Player", TRUE + "Building", "Magna Carta", "Player", TRUE + } +[effect_martial_law_each_theocracy] +type = "Martial_Law_Each" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Theocracy", "Player" + } +[effect_martial_law_max_theocracy] +type = "Martial_Law_Max" +value = 2 +reqs = + { "type", "name", "range" + "Gov", "Theocracy", "Player" + } +[effect_martial_law_each_communism] +type = "Martial_Law_Each" +value = 2 +reqs = + { "type", "name", "range" + "Gov", "Communism", "Player" + } +[effect_martial_law_max_communism] +type = "Martial_Law_Max" +value = 3 +reqs = + { "type", "name", "range" + "Gov", "Communism", "Player" + } +[effect_martial_law_each_nationalism] +type = "Martial_Law_Each" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Nationalism", "Player" + } +[effect_martial_law_max_nationalism] +type = "Martial_Law_Max" +value = 5 +reqs = + { "type", "name", "range" + "Gov", "Nationalism", "Player" + } +;********************************************* RAPTURE +[effect_rapture_grow_magna_carta] +type = "Rapture_Grow" +value = 3 +reqs = + { "type", "name", "range", "present" + "CityStatus", "OwnedByOriginal", "City", TRUE + "Building", "Magna Carta", "Player", TRUE + "Gov", "Monarchy", "Player", TRUE + } +[effect_rapture_grow_republic] +type = "Rapture_Grow" +value = 3 +reqs = + { "type", "name", "range" + "Gov", "Republic", "Player" + } +[effect_rapture_grow_democracy] +type = "Rapture_Grow" +value = 3 +reqs = + { "type", "name", "range", "present" + "Gov", "Democracy", "Player", TRUE + "MinForeignPct", "9", "City", FALSE + } +[effect_rapture_grow_nationalism] +type = "Rapture_Grow" +value = 3 +reqs = + { "type", "name", "range" + "Gov", "Nationalism", "Player" + "CityStatus", "OwnedByOriginal", "City" + } + +;********************************************** GOVERNMENT VET BONUSES +[effect_communist_spy_vets] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Communism", "Player" + "UnitFlag", "Diplomat", "Local" + } +[effect_nationalism_vet_riflemen] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Nationalism", "Player" + "UnitType", "Riflemen", "Local" + } +;veteran_raise_chance = 40, 25, 16, 10, 10, 10, 0 +[effect_nationalism_fighters_vet_promotion] +type = "Veteran_Combat" +value = 50 ;60 37.5 24 15 15 15 +reqs = + { "type", "name", "range" + "Gov", "Nationalism", "Player" + "UnitType", "Fighter", "Local" + } +[effect_nationalism_divebomber_vet_promotion] +type = "Veteran_Combat" +value = 50 ;60 37.5 24 15 15 15 +reqs = + { "type", "name", "range" + "Gov", "Nationalism", "Player" + "UnitType", "Fighter", "Local" + } +;************************************************ GOVERNMENT TILE OUTPUT penalty/bonus +[effect_gov_tile_penalty_anarchy] +type = "Output_Penalty_Tile" +value = 2 +reqs = + { "type", "name", "range" + "Gov", "Anarchy", "Player" + } +[effect_gov_tile_penalty_despotism] +type = "Output_Penalty_Tile" +value = 2 +reqs = + { "type", "name", "range" + "Gov", "Despotism", "Player" + } + +[effect_gov_tile_bonus_monarchy] +type = "Output_Inc_Tile_Celebrate" +value = 1 +reqs = + { "type", "name", "range", "present" + "Gov", "Monarchy", "Player", TRUE + "Building", "Magna Carta", "Player", FALSE ;handled separately by the wonder + "Building", "Angkor Wat", "Player", FALSE ;handled separately by the wonder + "OutputType", "Trade", "Local", TRUE + } + +; Constitutional Monarchy gets trade bonus only on Land tiles unless celebrating. +[effect_gov_tile_bonus_magna_carta_1] +type = "Output_Inc_Tile" +value = 1 +reqs = + { "type", "name", "range", "present" + "Gov", "Monarchy", "Player", TRUE + "Building", "Magna Carta", "Player", TRUE + "Building", "Angkor Wat", "Player", FALSE ;auto-provided by this wonder + "OutputType", "Trade", "Local", TRUE + "TerrainClass","Oceanic", "Local", FALSE + } +;Handle the case where Angkor Wat doesn't increase because of city size. +;Size 1-2 cities with Angkor Wat still get this as a Gov Bonus. +[effect_gov_tile_bonus_magna_carta_1_angkor_wat_exception] +type = "Output_Inc_Tile" +value = 1 +reqs = + { "type", "name", "range", "present" + "Gov", "Monarchy", "Player", TRUE + "Building", "Magna Carta", "Player", TRUE + "Building", "Angkor Wat", "Player", TRUE + "MinSize", "3", "City", FALSE + "OutputType", "Trade", "Local", TRUE + "TerrainClass","Oceanic", "Local", FALSE + } +[effect_gov_tile_bonus_magna_carta_2] +type = "Output_Inc_Tile_Celebrate" +value = 1 +reqs = + { "type", "name", "range", "present" + "Gov", "Monarchy", "Player", TRUE + "Building", "Magna Carta", "Player", TRUE + "Building", "Angkor Wat", "Player", FALSE ;auto-provided by this wonder + "OutputType", "Trade", "Local", TRUE + "TerrainClass", "Oceanic", "Local", TRUE + } +[effect_gov_tile_bonus_republic] +type = "Output_Inc_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Republic", "Player" + "OutputType", "Trade", "Local" + } +[effect_gov_tile_bonus_democracy] +type = "Output_Inc_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Democracy", "Player" + "OutputType", "Trade", "Local" + } +[effect_gov_tile_bonus_theocracy] +type = "Output_Inc_Tile_Celebrate" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Theocracy", "Player" + "OutputType", "Trade", "Local" + } +[effect_gov_tile_bonus_communism] +type = "Output_Inc_Tile_Celebrate" +value = 1 +reqs = + { "type", "name", "range" + "OutputType", "Trade", "Local" + "Gov", "Communism", "Player" + } +; Nationalism gets trade bonus only on Land tiles unless celebrating. +[effect_gov_tile_bonus_7] +type = "Output_Inc_Tile" +value = 1 +reqs = + { "type", "name", "range", "present" + "Gov", "Nationalism", "Player", TRUE + "OutputType", "Trade", "Local", TRUE + "TerrainClass", "Oceanic", "Local", FALSE + } +[effect_gov_tile_bonus_7a] +type = "Output_Inc_Tile_Celebrate" +value = 1 +reqs = + { "type", "name", "range", "present" + "Gov", "Nationalism", "Player",TRUE + "OutputType", "Trade", "Local", TRUE + "TerrainClass", "Oceanic", "Local", TRUE + } +;***************************************************** Representative Gov penalties +[effect_anarchy_disorder_democracy] +type = "Revolution_Unhappiness" +value = 2 ; 2 turns = anarchy +reqs = + { "type", "name", "range" + "Gov", "Democracy", "Player" + } +[effect_senate_republic] +type = "Has_Senate" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Republic", "Player" + } +[effect_senate_democracy] +type = "Has_Senate" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Democracy", "Player" + } +[effect_parliament_magna_carta] +type = "Has_Senate" +value = 1 +reqs = + { "type", "name", "range", "present" + "Gov", "Monarchy", "Player", TRUE + "Building", "Magna Carta", "Player", TRUE + } +[effect_popular_parliament_magna_carta] +type = "Has_Senate" +value = -1 +reqs = + { "type", "name", "range", "present" + "Gov", "Monarchy", "Player", TRUE + "Building", "Magna Carta", "Player", TRUE + "Building", "King Richard's Crusade", "Player", TRUE + "Building", "J.S. Bach's Cathedral", "Player", TRUE + } +;*************************************************** Partisans for Governemnts +[effect_partisans_democracy] +type = "Inspire_Partisans" +value = 1 +reqs = + { "type", "name", "range", "present" + "Gov", "Democracy", "Player", TRUE + "Tech", "Communism", "Player", TRUE + "Tech", "Gunpowder", "Player", TRUE + "Tech", "Guerilla Warfare", "World", TRUE + "NationGroup", "Barbarian", "Player", FALSE + } +[effect_partisans_communism] +type = "Inspire_Partisans" +value = 1 +reqs = + { "type", "name", "range", "present" + "Gov", "Communism", "Player", TRUE + "Tech", "Communism", "Player", TRUE + "Tech", "Gunpowder", "Player", TRUE + "Tech", "Guerilla Warfare", "World", TRUE + "NationGroup", "Barbarian", "Player", FALSE + } +[effect_partisans_theocracy] +type = "Inspire_Partisans" +value = 1 +reqs = + { "type", "name", "range", "present" + "Gov", "Theocracy", "Player", TRUE + "Tech", "Guerilla Warfare", "World", TRUE + "NationGroup", "Barbarian", "Player", FALSE + } +;******************************************************** Other Economic Adjustments for Governments +[effect_bad_sci_theocracy] +type = "Output_Bonus_2" +value = -20 +reqs = + { "type", "name", "range" + "Gov", "Theocracy", "Player" + "OutputType", "Science", "local" + } +[effect_tithes_theocracy_1] +type = "Happiness_To_Gold" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Theocracy", "Player" + } +[effect_tithes_theocracy_2] +type = "Output_Bonus_2" +value = 20 +reqs = + { "type", "name", "range" + "Gov", "Theocracy", "Player" + "OutputType", "Gold", "local" + } +[effect_bad_lux_nationalism] +type = "Output_Bonus_2" +value = -15 +reqs = + { "type", "name", "range" + "Gov", "Nationalism", "Player" + "OutputType", "Luxury", "local" + } +[effect_sci_adjustment_nationalism] +type = "Output_Bonus_2" +value = 15 +reqs = + { "type", "name", "range" + "Gov", "Nationalism", "Player" + "OutputType", "Science", "local" + "CityStatus", "OwnedByOriginal", "City" + } +;************************************************************************************************** + +[effect_airport_2] +type = "Airlift" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Airport", "City" + } + +[effect_airport_v0] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Airport", "City", TRUE + "UnitClass", "Air", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_airport_v1] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Airport", "City", TRUE + "UnitClass", "AirProtect", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_airport_v2] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Airport", "City", TRUE + "UnitClass", "Air_High_Altitude", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_airport_v3] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Airport", "City", TRUE + "UnitClass", "Helicopter", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_airport_v4] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Airport", "City", TRUE + "UnitClass", "Missile", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } + +[effect_airport_h1] +type = "HP_Regen" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Airport", "City" + "UnitClass", "Air", "Local" + } +[effect_airport_h2] +type = "HP_Regen" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Airport", "City" + "UnitClass", "AirProtect", "Local" + } +[effect_airport_h3] +type = "HP_Regen" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Airport", "City" + "UnitClass", "Air_High_Altitude", "Local" + } +[effect_airport_h4] +type = "HP_Regen" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Airport", "City" + "UnitClass", "Helicopter", "Local" + } + +; Base max city size of 8 +[effect_aqueduct_size] +type = "Size_Adj" +value = 8 + +[effect_aqueduct] +type = "Size_Adj" +value = 4 +reqs = + { "type", "name", "range" + "Building", "Aqueduct", "City" + } + +[effect_aqueduct_health] +type = "Health_Pct" +value = 50 +reqs = + { "type", "name", "range" + "Building", "Aqueduct", "City" + } + +[effect_bank_gold] +type = "Output_Bonus" +value = 50 +reqs = + { "type", "name", "range" + "Building", "Marketplace", "City" + "Building", "Bank", "City" + "OutputType", "Gold", "Local" + } +[effect_bank_luxury] +type = "Output_Bonus" +value = 50 +reqs = + { "type", "name", "range" + "Building", "Marketplace", "City" + "Building", "Bank", "City" + "OutputType", "Luxury", "Local" + } +;Changes require changes to city_force_income_update() in city.js +[effect_bank_coinage] +type = "Coinage_Bonus_Pm" +value = 250 ; 250 ‰ = +25 % +reqs = + { "type", "name", "range", "present" + "Building", "Marketplace", "City", TRUE + "Building", "Bank", "City", TRUE + "Gov", "Communism", "Player",FALSE + } + +[effect_barracks] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks", "City", TRUE + "UnitClass", "Land", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_barracks_1] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks", "City", TRUE + "UnitClass", "LandNoKill", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_barracks_2] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks", "City", TRUE + "UnitClass", "LandRoad", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_barracks_a] +type = "HP_Regen" +value = 100 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks", "City", TRUE + "UnitClass", "Land", "Local", TRUE + } +[effect_barracks_b] +type = "HP_Regen" +value = 100 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks", "City", TRUE + "UnitClass", "LandAirSea", "Local", TRUE ; might be resting in allied city with Barracks I + } +[effect_barracks_c] +type = "HP_Regen" +value = 100 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks", "City", TRUE + "UnitClass", "LandNoKill", "Local", TRUE + } + +[effect_barracks_ii] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks II", "City", TRUE + "UnitClass", "Land", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_barracks_ii_1] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks II", "City", TRUE + "UnitClass", "LandAirSea", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_barracks_ii_2] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks II", "City", TRUE + "UnitClass", "LandNoKill", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_barracks_ii_a] +type = "HP_Regen" +value = 100 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks II", "City", TRUE + "UnitClass", "Land", "Local", TRUE + } +[effect_barracks_ii_b] +type = "HP_Regen" +value = 100 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks II", "City", TRUE + "UnitClass", "LandAirSea", "Local", TRUE + } +[effect_barracks_ii_c] +type = "HP_Regen" +value = 100 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks II", "City", TRUE + "UnitClass", "LandNoKill", "Local", TRUE + } + +[effect_barracks_iii] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks III", "City", TRUE + "UnitClass", "Land", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_barracks_iii_1] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks III", "City", TRUE + "UnitClass", "LandAirSea", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_barracks_iii_2] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks III", "City", TRUE + "UnitClass", "LandNoKill", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_barracks_iii_a] +type = "HP_Regen" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Barracks III", "City" + "UnitClass", "Land", "Local" + } +[effect_barracks_iii_b] +type = "HP_Regen" +value = 100 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks III", "City", TRUE + "UnitClass", "LandAirSea", "Local", TRUE + } +[effect_barracks_iii_c] +type = "HP_Regen" +value = 100 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks III", "City", TRUE + "UnitClass", "LandNoKill", "Local", TRUE + } + +;prolongs time-window relevance of amphibious invasions later in game +[effect_triple_training_marines] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Barracks III", "City", TRUE + "Building", "Port Facility", "City", TRUE + "Building", "Airport", "City", TRUE + "UnitType", "Marines", "Local", TRUE + } + +;--- STANDARD CATHEDRAL sans Michelangelo ------------------------ +[effect_cathedral] +type = "Make_Content" +value = 3 +reqs = + { "type", "name", "range", "present" + "Building", "Cathedral", "City", TRUE + "Building", "Michelangelo's Chapel", "Player", FALSE + } +[effect_cathedral_1] +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range", "present" + "Tech", "Theology", "Player", TRUE + "Building", "Cathedral", "City", TRUE + "Building", "Michelangelo's Chapel", "Player", FALSE + } +[effect_cathedral_2] +type = "Make_Content" +value = -1 +reqs = + { "type", "name", "range", "present" + "Gov", "Communism", "Player", TRUE + "Building", "Cathedral", "City", TRUE + "Building", "Michelangelo's Chapel", "Player", FALSE + } +;--- ENHANCED CATHEDRAL with Michelangelo: *** +[effect_cathedral_ma] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Cathedral", "City", TRUE + "Building", "Michelangelo's Chapel", "Player", TRUE + } +[effect_cathedral_ma2] +type = "Force_Content" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Cathedral", "City", TRUE + "Building", "Michelangelo's Chapel", "Player", TRUE + } +;============================================================== +[effect_city_walls_vs_Land] +type = "Defend_Bonus" +value = 200 ; 3x vs most Land +reqs = + { "type", "name", "range", "present" + "Building", "City Walls", "City", TRUE + "UnitClass", "Land", "Local", TRUE + "UnitType", "Catapult", "Local", FALSE + "UnitType", "Cannon", "Local", FALSE + "UnitType", "Artillery", "Local", FALSE + "UnitType", "Howitzer", "Local", FALSE + } +[effect_city_walls_vs_Catapult_25pct_bonus] +type = "Defend_Bonus" +value = 175 ; 2.75x vs Catapult +reqs = + { "type", "name", "range", "present" + "Building", "City Walls", "City", TRUE + "UnitType", "Catapult", "Local", TRUE + } +[effect_city_walls_vs_Cannon_50pct_bonus] +type = "Defend_Bonus" +value = 150 ; 2.5x vs Cannon +reqs = + { "type", "name", "range", "present" + "Building", "City Walls", "City", TRUE + "UnitType", "Cannon", "Local", TRUE + } +[effect_city_walls_vs_Artillery_75pct_bonus] +type = "Defend_Bonus" +value = 125 ; 2.25x vs Artillery +reqs = + { "type", "name", "range", "present" + "Building", "City Walls", "City", TRUE + "UnitType", "Artillery", "Local", TRUE + } +[effect_city_walls_vs_Land_2] +type = "Defend_Bonus" +value = 200 +reqs = + { "type", "name", "range", "present" + "Building", "City Walls", "City", TRUE + "UnitClass", "LandAirSea", "Local", TRUE + } +[effect_city_walls_vs_Land_3] +type = "Defend_Bonus" +value = 200 +reqs = + { "type", "name", "range", "present" + "Building", "City Walls", "City", TRUE + "UnitClass", "LandNoKill", "Local", TRUE + } +[effect_city_walls_1] +type = "Unit_No_Lose_Pop" +value = 1 +reqs = + { "type", "name", "range" + "Building", "City Walls", "City" + } +[effect_city_walls_visible] +type = "Visible_Walls" +value = 1 +reqs = + { "type", "name", "range" + "Building", "City Walls", "City" + } +;Metallurgy increases cost of city walls +[effect_city_wall_metallurgy_price_increase] +type = "Building_Build_Cost_Pct" +value = 16 +reqs = + { + "type", "name", "range", "present" + "Tech", "Metallurgy", "Player", TRUE + "Building", "City Walls", "Local", TRUE + } + +; FORTIFICATIONS ***************************************** +[effect_fortifications_visible] +type = "Visible_Walls" +value = 4 +reqs = + { "type", "name", "range" + "Building", "Fortifications", "City" + } +[effect_fortifications_in_lowlands_bonus] +type = "Terrain_Defend_Add_Bonus" +value = 17 +reqs = + { "type", "name", "range", "present" + "Building", "Fortifications", "City", TRUE + "Terrain", "Mountains", "Local", FALSE + "Terrain", "Hills", "Local", FALSE + } +[effect_fortifications_vs_Land] +type = "Defend_Bonus" +value = 50 ; 1.50x vs most Land; (1.5 * 1.17= 1.755; WAS: 75,1.75 on lowlands) +reqs = + { "type", "name", "range", "present" + "Building", "Fortifications", "City", TRUE + "Building", "City Walls", "City", FALSE + "Building", "Great Wall", "Player", FALSE + "UnitClass", "Land", "Local", TRUE + "UnitType", "Catapult", "Local", FALSE + "UnitType", "Cannon", "Local", FALSE + "UnitType", "Artillery", "Local", FALSE + "UnitType", "Howitzer", "Local", FALSE + } +[effect_fortifications_vs_Catapult] +type = "Defend_Bonus" +value = 25 ; 1.25x vs Catapult's 25% bonus hills,lowlands: 1.25,1.4625; WAS: 1.50,1.50 hills @50% +reqs = + { "type", "name", "range", "present" + "Building", "Fortifications", "City", TRUE + "Building", "City Walls", "City", FALSE + "Building", "Great Wall", "Player", FALSE + "UnitType", "Catapult", "Local", TRUE + } + +;NOTE: -50% from Cannon nullifies +50% bonus: +;[effect_fortifications_vs_Cannon] +;type = "Defend_Bonus" +;value = 0 ; 1.00x vs Cannon's 50% bonus hills,lowlands: 1.00,1.17; WAS: 1.25,1.25 @ 25% +;reqs = +; { "type", "name", "range", "present" +; "Building", "Fortifications", "City", TRUE +; "Building", "City Walls", "City", FALSE +; "Building", "Great Wall", "Player", FALSE +; "UnitType", "Cannon", "Local", TRUE +; } + +;-75% from Artillery nullifies +50% bonus: 1.00,1.17; WAS: 1.00,1.00 @0% +;no need for an effect, therefore. + +; HOWITZER nullifies bonus: 1.00,1.17; WAS: 1.00,1.00 @0% + +[effect_fortifications_vs_Land_2] +type = "Defend_Bonus" +value = 50 +reqs = + { "type", "name", "range", "present" + "Building", "Fortifications", "City", TRUE + "Building", "City Walls", "City", FALSE + "Building", "Great Wall", "Player", FALSE + "UnitClass", "LandAirSea", "Local", TRUE + } +[effect_fortifications_vs_Land_3] +type = "Defend_Bonus" +value = 50 +reqs = + { "type", "name", "range", "present" + "Building", "Fortifications", "City", TRUE + "Building", "City Walls", "City", FALSE + "Building", "Great Wall", "Player", FALSE + "UnitClass", "LandNoKill", "Local", TRUE + } +[effect_fortifications_1] +type = "Unit_No_Lose_Pop" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Fortifications", "City" + } +[effect_fortifications_sale_value] +type = "Improvement_Sale_Pct" +value = 100 ; full 'recycle value' after City Walls go up. +reqs = + { "type", "name", "range" + "Building", "Fortifications", "Local" + "Building", "City Walls", "City" + } + +; GREAT Wall +;-------------------------------------------------------- +[effect_great_wall_0_vs_Land_original] +type = "Defend_Bonus" +value = 200 ; 3x vs most Land +reqs = + { "type", "name", "range", "present" + "Building", "Great Wall", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Age", "3", "City", TRUE + "CityStatus", "OwnedByOriginal", "City", TRUE + "UnitClass", "Land", "Local", TRUE + "CityTile", "Center", "Local", TRUE + "UnitType", "Catapult", "Local", FALSE + "UnitType", "Cannon", "Local", FALSE + "UnitType", "Artillery", "Local", FALSE + "UnitType", "Howitzer", "Local", FALSE + "Tech", "Machine Tools", "World", FALSE + } +[effect_great_wall_0_vs_Catapult25pct_bonus_original] +type = "Defend_Bonus" +value = 175 ; 2.75x vs Catapult +reqs = + { "type", "name", "range", "present" + "Building", "Great Wall", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Age", "3", "City", TRUE + "CityStatus", "OwnedByOriginal", "City", TRUE + "CityTile", "Center", "Local", TRUE + "UnitType", "Catapult", "Local", TRUE + "Tech", "Machine Tools", "World", FALSE + } +[effect_great_wall_0_vs_Cannon50pct_bonus_original] +type = "Defend_Bonus" +value = 150 ; 2.5x vs Cannon +reqs = + { "type", "name", "range", "present" + "Building", "Great Wall", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Age", "3", "City", TRUE + "CityStatus", "OwnedByOriginal", "City", TRUE + "CityTile", "Center", "Local", TRUE + "UnitType", "Cannon", "Local", TRUE + "Tech", "Machine Tools", "World", FALSE + } + +; 2.25x vs Artillery not needed since Machine Tools expires it. + +[effect_great_wall_0_assimilated] +type = "Defend_Bonus" +value = 200 ; 3x vs most Land +reqs = + { "type", "name", "range", "present" + "Building", "Great Wall", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Age", "3", "City", TRUE + "CityStatus", "OwnedByOriginal", "City", FALSE + "MinForeignPct", "19", "City", FALSE + "UnitClass", "Land", "Local", TRUE + "CityTile", "Center", "Local", TRUE + "UnitType", "Catapult", "Local", FALSE + "UnitType", "Cannon", "Local", FALSE + "UnitType", "Artillery", "Local", FALSE + "UnitType", "Howitzer", "Local", FALSE + "Tech", "Machine Tools", "World", FALSE + } +[effect_great_wall_0_vs_Catapult25pct_bonus_assimilated] +type = "Defend_Bonus" +value = 175 ; 2.75x vs Catapult +reqs = + { "type", "name", "range", "present" + "Building", "Great Wall", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Age", "3", "City", TRUE + "CityStatus", "OwnedByOriginal", "City", FALSE + "MinForeignPct", "19", "City", FALSE + "CityTile", "Center", "Local", TRUE + "UnitType", "Catapult", "Local", TRUE + "Tech", "Machine Tools", "World", FALSE + } +[effect_great_wall_0_vs_Cannon50pct_bonus_assimilated] +type = "Defend_Bonus" +value = 150 ; 2.5x vs. Cannon +reqs = + { "type", "name", "range", "present" + "Building", "Great Wall", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Age", "3", "City", TRUE + "CityStatus", "OwnedByOriginal", "City", FALSE + "MinForeignPct", "19", "City", FALSE + "CityTile", "Center", "Local", TRUE + "UnitType", "Cannon", "Local", TRUE + "Tech", "Machine Tools", "World", FALSE + } + +; 2.25x vs Artillery not needed since Machine Tools expires it. + +[effect_great_wall_1_original] +type = "Defend_Bonus" +value = 200 +reqs = + { "type", "name", "range", "present" + "Building", "Great Wall", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Age", "3", "City", TRUE + "CityStatus", "OwnedByOriginal", "City", TRUE + "UnitClass", "LandNoKill", "Local", TRUE + "CityTile", "Center", "Local", TRUE + "Tech", "Machine Tools", "World", FALSE + } +[effect_great_wall_1_assimilated] +type = "Defend_Bonus" +value = 200 +reqs = + { "type", "name", "range", "present" + "Building", "Great Wall", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Age", "3", "City", TRUE + "CityStatus", "OwnedByOriginal", "City", FALSE + "MinForeignPct", "19", "City", FALSE + "UnitClass", "LandNoKill", "Local", TRUE + "CityTile", "Center", "Local", TRUE + "Tech", "Machine Tools", "World", FALSE + } +[effect_great_wall_3_original] +type = "Defend_Bonus" +value = 200 +reqs = + { "type", "name", "range", "present" + "Building", "Great Wall", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Age", "3", "City", TRUE + "CityStatus", "OwnedByOriginal", "City", TRUE + "UnitClass", "LandAirSea", "Local", TRUE + "CityTile", "Center", "Local", TRUE + "Tech", "Machine Tools", "World", FALSE + } +[effect_great_wall_3_assimilated] +type = "Defend_Bonus" +value = 200 +reqs = + { "type", "name", "range", "present" + "Building", "Great Wall", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Age", "3", "City", TRUE + "CityStatus", "OwnedByOriginal", "City", FALSE + "MinForeignPct", "19", "City", FALSE + "UnitClass", "LandAirSea", "Local", TRUE + "CityTile", "Center", "Local", TRUE + "Tech", "Machine Tools", "World", FALSE + } +[effect_great_wall_poploss_original] +type = "Unit_No_Lose_Pop" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Great Wall", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Age", "3", "City", TRUE + "CityStatus", "OwnedByOriginal", "City", TRUE + "Tech", "Machine Tools", "World", FALSE + } +[effect_great_wall_poploss_assimilated] +type = "Unit_No_Lose_Pop" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Great Wall", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Age", "3", "City", TRUE + "CityStatus", "OwnedByOriginal", "City", FALSE + "MinForeignPct", "19", "City", FALSE + "Tech", "Machine Tools", "World", FALSE + } +[effect_great_wall_visible_original] +type = "Visible_Walls" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Great Wall", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Age", "3", "City", TRUE + "CityStatus", "OwnedByOriginal", "City", TRUE + "Tech", "Machine Tools", "World", FALSE + } +[effect_great_wall_visible_assimilated] +type = "Visible_Walls" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Great Wall", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Age", "3", "City", TRUE + "CityStatus", "OwnedByOriginal", "City", FALSE + "MinForeignPct", "19", "City", FALSE + "Tech", "Machine Tools", "World", FALSE + } +;============================================================== + +[effect_coastal_defense] +type = "Defend_Bonus" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Coastal Defense", "City" + "UnitClass", "Sea", "Local" + } +[effect_coastal_defense_1] +type = "Defend_Bonus" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Coastal Defense", "City" + "UnitClass", "RiverShip", "Local" + } +[effect_coastal_defense_2] +type = "Defend_Bonus" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Coastal Defense", "City" + "UnitClass", "Submarine", "Local" + } +[effect_coastal_defense_trireme] +type = "Defend_Bonus" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Coastal Defense", "City" + "UnitClass", "Trireme", "Local" + } +[effect_coastal_defense_visible] +type = "Visible_Walls" +value = 2 ; 2 is for coastal +reqs = + { "type", "name", "range" + "Building", "Coastal Defense", "City" + } +;============================================================== +[effect_gibraltar_fortress_city] +type = "Defend_Bonus" +value = 100 +reqs = + { "type", "name", "range", "present" + "Building", "Gibraltar Fortress", "City", TRUE + "Building", "Coastal Defense", "City", TRUE + "UnitClass", "Sea", "Local" + } +[effect_gibraltar_fortress_city_1] +type = "Defend_Bonus" +value = 100 +reqs = + { "type", "name", "range", "present" + "Building", "Gibraltar Fortress", "City", TRUE + "Building", "Coastal Defense", "City", TRUE + "UnitClass", "RiverShip", "Local" + } +[effect_gibraltar_fortress_city_2] +type = "Defend_Bonus" +value = 100 +reqs = + { "type", "name", "range", "present" + "Building", "Gibraltar Fortress", "City", TRUE + "Building", "Coastal Defense", "City", TRUE + "UnitClass", "Submarine", "Local" + } +[effect_gibraltar_fortress_city_trireme] +type = "Defend_Bonus" +value = 100 +reqs = + { "type", "name", "range", "present" + "Building", "Gibraltar Fortress", "City", TRUE + "Building", "Coastal Defense", "City", TRUE + "UnitClass", "Trireme", "Local" + } +[effect_gibraltar_fortress] +type = "Defend_Bonus" +value = 25 +reqs = + { "type", "name", "range", "present" + "Building", "Gibraltar Fortress", "Player", TRUE + "Building", "Gibraltar Fortress", "City", FALSE + "Building", "Coastal Defense", "City", TRUE + "UnitClass", "Sea", "Local" + } +[effect_gibraltar_fortress_1] +type = "Defend_Bonus" +value = 25 +reqs = + { "type", "name", "range", "present" + "Building", "Gibraltar Fortress", "Player", TRUE + "Building", "Gibraltar Fortress", "City", FALSE + "Building", "Coastal Defense", "City", TRUE + "UnitClass", "RiverShip", "Local" + } +[effect_gibraltar_fortress_2] +type = "Defend_Bonus" +value = 25 +reqs = + { "type", "name", "range", "present" + "Building", "Gibraltar Fortress", "Player", TRUE + "Building", "Gibraltar Fortress", "City", FALSE + "Building", "Coastal Defense", "City", TRUE + "UnitClass", "Submarine", "Local" + } +[effect_gibraltar_fortress_trireme] +type = "Defend_Bonus" +value = 25 +reqs = + { "type", "name", "range", "present" + "Building", "Gibraltar Fortress", "Player", TRUE + "Building", "Gibraltar Fortress", "City", FALSE + "Building", "Coastal Defense", "City", TRUE + "UnitClass", "Trireme", "Local" + } +[effect_gibraltar_fortress_coastal_defense_discount] +type = "Building_Build_Cost_Pct" +value = -23 ; 15 shields. 65-15 = 50. +reqs = + { "type", "name", "range", "present" + "Building", "Gibraltar Fortress", "Player", TRUE + "Building", "Coastal Defense", "Local", TRUE + } +;Waiting on an Effect which can compare or inject range value. +;[effect_building_upkeep_gibratalar_fortress] +;type = "Upkeep_Reduce" +;value = 1 +;reqs = +; { "type", "name", "range" +; "Building", "Gibraltar Fortress", "Player" +; "Building", "Coastal Defense", "Local" +; } +;------------------------------------------------------------ + +[effect_amphitheatre] +type = "Make_Content" +value = 3 +reqs = + { "type", "name", "range" + "Building", "Amphitheatre", "City" + } + +[effect_amphitheatre_1] +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range" + "Tech", "Electricity", "Player" + "Building", "Amphitheatre", "City" + } + +; BECAUSE OF ROUNDING, AVERAGE EFFECT OF 50 ENDS UP BEING 41%, WHEREAS 60 YIELDS ABOUT 53% WHICH IS CLOSER TO ADVERTISED +[effect_courthouse_corruption1] +type = "Output_Waste_Pct" +value = 60 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "OutputType", "Trade", "Local", TRUE + } +; Removes output penalties (Despotism/Anarchy) for cities with courthouses +[effect_courthouse_tile_corruption] +type = "Output_Penalty_Tile" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Courthouse", "City" + } +[effect_courthouse] +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range" +; "Gov", "Democracy", "Player" ; all govs get it, Democracy doesn't need an exclusive buff here. + "Building", "Courthouse", "City" + } +[effect_courthouse_incite_cost_occupied] +type = "Incite_Cost_Pct" +value = 300 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "MaxUnitsOnTile", "0", "Local", FALSE + } +[effect_courthouse_incite_cost_empty] +type = "Incite_Cost_Pct" +value = 100 +reqs = + { "type", "name", "range", "present" + "MaxUnitsOnTile", "0", "Local", TRUE + "Building", "Courthouse", "City", TRUE + } +; Law and order provides +1 upkeep +[effect_courthouse_upkeep] +type = "Unit_Upkeep_Free_Per_City" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Courthouse", "City" + "OutputType", "Shield", "Local" + } +[effect_courthouse_spy_resistance] +type = "Spy_Resistant" +value = 25 ;25% reduction of 50% base chance is 12.5% bonus. 50%-12.5%=37.5% success rate + ; No protection= 1/2, HL = 3/8, CH+HL = 1/4, CH+HL+PS = 1/8 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + } +[effect_courthouse_hostile_diplomat0] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Action", "Steal Tech", "Local", TRUE + } +[effect_courthouse_hostile_diplomat_1] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Action", "Steal Tech Escape Expected", "Local", TRUE + } +[effect_courthouse_hostile_diplomat_2] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Action", "Targeted Steal Tech", "Local", TRUE + } +[effect_courthouse_hostile_diplomat_3] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE + } +[effect_courthouse_hostile_diplomat_4] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Action", "Sabotage City", "Local", TRUE + } +[effect_courthouse_hostile_diplomat_5] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Action", "Sabotage City Escape", "Local", TRUE + } +[effect_courthouse_hostile_diplomat_6] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Action", "Targeted Sabotage City", "Local", TRUE + } +[effect_courthouse_hostile_diplomat_7] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Action", "Targeted Sabotage City Escape", "Local", TRUE + } +[effect_courthouse_hostile_diplomat_8] +type = "Action_Odds_Pct" +value = -25 ;40 minus 25%*80 = 20% +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Action", "Steal Maps Escape", "Local", TRUE + } +[effect_courthouse_hostile_diplomat_9] +type = "Action_Odds_Pct" +value = -25 ;40 minus 25%*80 = 20% +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Action", "Steal Maps", "Local", TRUE + } +[effect_courthouse_hostile_diplomat_10] +type = "Action_Odds_Pct" +value = -25 ;40 minus 25%*80 = 20% +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Action", "Poison City Escape", "Local", TRUE + } +[effect_courthouse_hostile_diplomat_11] +type = "Action_Odds_Pct" +value = -25 ;40 minus 25%*80 = 20% +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Action", "Incite City", "Local", TRUE + } +[effect_courthouse_hostile_diplomat_12] +type = "Action_Odds_Pct" +value = -25 ;40 minus 25%*80 = 20% +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Action", "Incite City Escape", "Local", TRUE + } + +[effect_diplomat_defense_fortress] +type = "Spy_Resistant" +value = 25 +reqs = + { "type", "name", "range" + "Extra", "Fortress", "Local" + } + +[effect_incite_cost_empty] +type = "Incite_Cost_Pct" +value = -50 +reqs = + { "type", "name", "range", "present" + "MaxUnitsOnTile", "0", "Local", TRUE + "Building", "Courthouse", "City", FALSE + "Building", "Supreme Court", "Player", FALSE + } + +[effect_factory] +type = "Output_Bonus" +value = 50 +reqs = + { "type", "name", "range", "present" + "Building", "Factory", "City", TRUE + "Building", "Hoover Dam", "City", FALSE ;counts as factory + "OutputType", "Shield", "Local", TRUE + } + +[effect_granary] +type = "Growth_Food" +value = 50 +reqs = + { "type", "name", "range" + "Building", "Granary", "City" + } + +[effect_harbour] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "TerrainClass", "Oceanic", "Local" + "Building", "Harbour", "City" + "OutputType", "Food", "Local" + } + +[effect_library] +type = "Output_Bonus" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Library", "City" + "OutputType", "Science", "Local" + } + +[effect_marketplace_gold] +type = "Output_Bonus" +value = 50 +reqs = + { "type", "name", "range" + "Building", "Marketplace", "City" + "OutputType", "Gold", "Local" + } +[effect_marketplace_luxury] +type = "Output_Bonus" +value = 50 +reqs = + { "type", "name", "range" + "Building", "Marketplace", "City" + "OutputType", "Luxury", "Local" + } +;Changes require changes to city_force_income_update() in city.js +[effect_marketplace_coinage] +type = "Coinage_Bonus_Pm" +value = 250; 250‰=25% +reqs = + { "type", "name", "range", "present" + "Building", "Marketplace", "City", TRUE + "Gov", "Communism", "Player", FALSE + } + +; No population pollution until certain techs researched +[effect_pollu_pop_base] +type = "Pollu_Pop_Pct_2" +value = -100 + +[effect_pollu_pop_automobile] +type = "Pollu_Pop_Pct_2" +value = 25 +reqs = + { "type", "name", "range" + "Tech", "Automobile", "Player" + } +[effect_pollu_pop_industrialization] +type = "Pollu_Pop_Pct_2" +value = 25 +reqs = + { "type", "name", "range" + "Tech", "Industrialization", "Player" + } +[effect_pollu_pop_mass_production] +type = "Pollu_Pop_Pct_2" +value = 25 +reqs = + { "type", "name", "range" + "Tech", "Mass Production", "Player" + } +[effect_pollu_pop_plastics] +type = "Pollu_Pop_Pct_2" +value = 25 +reqs = + { "type", "name", "range" + "Tech", "Plastics", "Player" + } +[effect_enviromentalism] +type = "Pollu_Pop_Pct_2" +value = -50 +reqs = + { "type", "name", "range" + "Tech", "Environmentalism", "Player" + } +[effect_mass_transit] +type = "Pollu_Pop_Pct" +value = -100 +reqs = + { "type", "name", "range" + "Building", "Mass Transit", "City" + } +; Increased citizen mobility and ticket revenues increase city base trade by +2 +[effect_mass_transit_1] +type = "Output_Add_Tile" +value = 2 +reqs = + { "type", "name", "range" + "Building", "Mass Transit", "City" + "CityTile", "Center", "Local" + "OutputType", "Trade", "Local" + } + +[effect_mfg_plant] +type = "Output_Bonus" +value = 50 +reqs = + { "type", "name", "range", "present" + "Building", "Mfg. Plant", "City", TRUE + "Building", "Hoover Dam", "City", FALSE + "OutputType", "Shield", "Local", TRUE + } + +[effect_offshore_platform] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "TerrainClass", "Oceanic", "Local" + "Building", "Offshore Platform", "City" + "OutputType", "Shield", "Local" + } + +;Having a Palace means having a city, the beginning of +;sedentary culture and loss of game-start move bonus. +[effect_sedentary_people_are_slow] +type = "Move_Bonus" +value = 3 +reqs = + { + "type", "name", "range", "present" + "Building", "Palace", "Player", FALSE + "UnitClass", "Land", "Local", TRUE + } +[effect_palace_capital] +type = "Capital_City" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Palace", "City" + } +[effect_palace_gov_center] +type = "Gov_Center" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Palace", "City" + } +[effect_palace_corruption_reduction] +type = "Output_Waste_Pct" +value = 60 +reqs = + { "type", "name", "range" + "Building", "Palace", "City" + "OutputType", "Trade", "Local" + } +[effect_palace_sabotage] +type = "Building_Saboteur_Resistant" +value = 50 +reqs = + { "type", "name", "range" + "Building", "Palace", "City" + } +[effect_palace_spy_resistant] +type = "Spy_Resistant" +value = 50 +reqs = + { "type", "name", "range" + "Building", "Palace", "City" + } +[effect_palace_happy] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Palace", "City" + } +[effect_palace_despotism] +type = "Output_Bonus" +value = 75 +reqs = + { "type", "name", "range", "present" + "Gov", "Despotism", "Player", TRUE + "Building", "Palace", "City", TRUE + "Building", "Ziggurat", "Player", FALSE + "OutputType", "Shield", "Local", TRUE + } +[effect_palace_monarchy] +type = "Output_Bonus" +value = 50 +reqs = + { "type", "name", "range" + "Gov", "Monarchy", "Player" + "Building", "Palace", "City" + "OutputType", "Shield", "Local" + } +[effect_palace_theocracy] +type = "Output_Bonus" +value = 50 +reqs = + { "type", "name", "range", "present", "quiet" + "Gov", "Theocracy", "Player", TRUE, TRUE + "Building", "Palace", "City", TRUE, FALSE + "OutputType", "Gold", "Local", TRUE, FALSE + } +[effect_palace_communism] +type = "Output_Bonus" +value = 25 +reqs = + { "type", "name", "range" + "Gov", "Communism", "Player" + "Building", "Palace", "City" + "OutputType", "Shield", "Local" + } +[effect_palace_nationalism] +type = "Output_Bonus" +value = 15 +reqs = + { "type", "name", "range", "present" + "Gov", "Nationalism", "Player" + "Building", "Palace", "City" + "OutputType", "Shield", "Local" + } +[effect_palace_onecitychallenge] +type = "Output_Add_Tile" +value = 2 +reqs = + { "type", "name", "range" + "Building", "Palace", "City" + "CityTile", "Center", "Local" + "OutputType", "Science", "Local" + } + +[effect_ecclesiastical_palace] +type = "Output_Waste_Pct" +value = 60 +reqs = + { "type", "name", "range", "present" + "Building", "Ecclesiastical Palace", "City", TRUE + "OutputType", "Trade", "Local", TRUE + } +[effect_ecclesiastical_palace_2] +type = "Spy_Resistant" +value = 50 +reqs = + { "type", "name", "range", "present" + "Building", "Ecclesiastical Palace", "City", TRUE + } +[effect_ecclestiastical_palace_3] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Ecclesiastical Palace", "City" + } +[effect_ecclesiastical_palace_4] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Ecclesiastical Palace", "City", TRUE + "UnitType", "Zealots", "Local", TRUE + } +[effect_ecclesiastical_palace_gov_center] +type = "Gov_Center" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Ecclesiastical Palace", "City", TRUE + "Building", "Palace", "City", FALSE + } +[effect_ecclesiastical_palace_despotism] +type = "Output_Bonus" +value = 75 +reqs = + { "type", "name", "range", "present", "quiet" + "Gov", "Despotism", "Player", TRUE, TRUE + "Building", "Ecclesiastical Palace", "City", TRUE, FALSE + "OutputType", "Gold", "Local", TRUE, FALSE + } +[effect_ecclesiastical_palace_monarchy] +type = "Output_Bonus" +value = 50 +reqs = + { "type", "name", "range", "present", "quiet" + "Gov", "Monarchy", "Player", TRUE, TRUE + "Building", "Ecclesiastical Palace", "City", TRUE, FALSE + "OutputType", "Gold", "Local", TRUE, FALSE + } +[effect_ecclesiastical_palace_theocracy] +type = "Output_Bonus" +value = 50 +reqs = + { "type", "name", "range", "present", "quiet" + "Gov", "Theocracy", "Player", TRUE, TRUE + "Building", "Ecclesiastical Palace", "City", TRUE, FALSE + "OutputType", "Gold", "Local", TRUE, FALSE + } +[effect_ecclesiastical_palace_communism] +type = "Output_Bonus" +value = 25 +reqs = + { "type", "name", "range", "present", "quiet" + "Gov", "Communism", "Player", TRUE, TRUE + "Building", "Ecclesiastical Palace", "City", TRUE, FALSE + "OutputType", "Gold", "Local", TRUE, FALSE + } +[effect_ecclesiastical_palace_nationalism] +type = "Output_Bonus" +value = 15 +reqs = + { "type", "name", "range", "present", "quiet" + "Gov", "Nationalism", "Player", TRUE, TRUE + "Building", "Ecclesiastical Palace", "City", TRUE, FALSE + "OutputType", "Gold", "Local", TRUE, FALSE + } + +[effect_ecclesiastical_palace_culture] +type = "History" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Ecclesiastical Palace", "City", TRUE + } +[effect_ecclesiastical_palace_2_sabotage] +type = "Building_Saboteur_Resistant" +value = 50 +reqs = + { "type", "name", "range" + "Building", "Ecclesiastical Palace", "City" + } + +[effect_police_station_base_level_all_govs] +type = "Make_Content_Mil" +value = 2 ; handles foreign nationals for every gov. +reqs = + { "type", "name", "range", "present" + "Building", "Police Station", "City", TRUE + } +[effect_police_station_1] +type = "Make_Content_Mil" +value = 2 ; 2+2 = 4 +reqs = + { "type", "name", "range", "present" + "Gov", "Democracy", "Player", TRUE + "Building", "Police Station", "City", TRUE + } +[effect_police_station_nationalism] +type = "Make_Content_Mil" +value = 1 ; 2+1 = 3 effect for police station +reqs = + { "type", "name", "range", "present" + "Building", "Police Station", "City", TRUE + "Gov", "Nationalism", "Player", TRUE + } +[effect_police_station_vet_diplo] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Police Station", "City", TRUE + "UnitFlag", "NoVeteran", "Local", FALSE + "UnitFlag", "Diplomat", "Local", TRUE + } +[effect_police_station_spy_resistant] +type = "Spy_Resistant" +value = 25 ; 25% of 50% = -12.5% 4/8-1/8 = 3/8 +reqs = + { "type", "name", "range", "present" + "Building", "Police Station", "City", TRUE + } +[effect_police_station_hostile_diplomat_0] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Police Station", "City", TRUE + "Action", "Steal Tech", "Local", TRUE + } +[effect_police_station_hostile_diplomat_1] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Police Station", "City", TRUE + "Action", "Steal Tech Escape Expected", "Local", TRUE + } +[effect_police_station_hostile_diplomat_2] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Police Station", "City", TRUE + "Action", "Targeted Steal Tech", "Local", TRUE + } +[effect_police_station_hostile_diplomat_3] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Police Station", "City", TRUE + "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE + } +[effect_police_station_hostile_diplomat_4] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Police Station", "City", TRUE + "Action", "Sabotage City", "Local", TRUE + } +[effect_police_station_hostile_diplomat_5] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Police Station", "City", TRUE + "Action", "Sabotage City Escape", "Local", TRUE + } +[effect_police_station_hostile_diplomat_6] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Police Station", "City", TRUE + "Action", "Targeted Sabotage City", "Local", TRUE + } +[effect_police_station_hostile_diplomat_7] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Police Station", "City", TRUE + "Action", "Targeted Sabotage City Escape", "Local", TRUE + } +[effect_police_station_hostile_diplomat_8] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Police Station", "City", TRUE + "Action", "Steal Maps Escape", "Local", TRUE + } +[effect_police_station_hostile_diplomat_9] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Police Station", "City", TRUE + "Action", "Steal Maps", "Local", TRUE + } +[effect_police_station_hostile_diplomat_10] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Police Station", "City", TRUE + "Action", "Poison City Escape", "Local", TRUE + } +[effect_police_station_hostile_diplomat_11] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Police Station", "City", TRUE + "Action", "Incite City", "Local", TRUE + } +[effect_police_station_hostile_diplomat_12] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Police Station", "City", TRUE + "Action", "Incite City Escape", "Local", TRUE + } +[effect_police_station_investigate_resistance] +type = "Action_Odds_Pct" +value = -54 ; +7% - 54% = -47% ... -0.47 * 80 = 37.6% ... 80%-37.6% = 42.4% ... (85%/2 = 42.5%) ✓ +reqs = + { "type", "name", "range", "present" + "Building", "Police Station", "City", TRUE + "Action", "Investigate City", "Local", TRUE + "UnitType", "Satellite", "Local", FALSE + } +;Cancel out the above bonus for democracies: +[effect_police_station_investigate_democracy] +type = "Action_Resist_Pct" +value = -54 ; +7% - 54% = -47% ... -0.47 * 80 = 37.6% ... 80%-37.6% = 42.4% ... (85%/2 = 42.5%) ✓ +reqs = + { "type", "name", "range" + "Building", "Police Station", "City" + "Gov", "Democracy", "Player" ;Action_Resist_Pct uses target player. + "Action", "Investigate City", "Local" + "UnitType", "Satellite", "Local", FALSE + } + +[effect_port_facility] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Port Facility", "City", TRUE + "UnitClass", "Sea", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_port_facility_a] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Port Facility", "City", TRUE + "UnitClass", "RiverShip", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_port_facility_b] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Port Facility", "City", TRUE + "UnitClass", "Submarine", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_port_facility_1] +type = "HP_Regen" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Port Facility", "City" + "UnitClass", "Sea", "Local" + } +[effect_port_facility_1a] +type = "HP_Regen" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Port Facility", "City" + "UnitClass", "RiverShip", "Local" + } +[effect_port_facility_1b] +type = "HP_Regen" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Port Facility", "City" + "UnitClass", "Submarine", "Local" + } +[effect_port_facility_trireme] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Port Facility", "City", TRUE + "UnitClass", "Trireme", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_port_facility_trireme_1] +type = "HP_Regen" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Port Facility", "City" + "UnitClass", "Trireme", "Local" + } +;************************************************************************** POWER PLANTS +[effect_coal_plant] +type = "Output_Bonus" +value = 20 +reqs = + { "type", "name", "range", "present" + "Building", "Factory", "City", TRUE + "Building", "Coal Plant", "City", TRUE + "OutputType", "Shield", "Local", TRUE + "Building", "Nuclear Plant", "City", FALSE + "Building", "Hydro Plant", "City", FALSE + "Building", "Hoover Dam", "City", FALSE + "Building", "Fusion Reactor", "Player", FALSE + } +[effect_coal_plant_1] +type = "Output_Bonus" +value = 20 +reqs = + { "type", "name", "range", "present" + "Building", "Mfg. Plant", "City", TRUE + "Building", "Coal Plant", "City", TRUE + "OutputType", "Shield", "Local", TRUE + "Building", "Nuclear Plant", "City", FALSE + "Building", "Hydro Plant", "City", FALSE + "Building", "Hoover Dam", "City", FALSE + "Building", "Fusion Reactor", "Player", FALSE + } +[effect_coal_plant_upgrade_1] +type = "Improvement_Sale_Pct" +value = 70 ; full 'recycle value' after City Walls go up. +reqs = + { "type", "name", "range" + "Building", "Coal Plant", "Local" + "Building", "Hoover Dam", "City" + } +[effect_coal_plant_upgrade_2] +type = "Improvement_Sale_Pct" +value = 70 ; full 'recycle value' after City Walls go up. +reqs = + { "type", "name", "range" + "Building", "Coal Plant", "Local" + "Building", "Hydro Plant", "City" + } +[effect_coal_plant_upgrade_3] +type = "Improvement_Sale_Pct" +value = 70 ; full 'recycle value' after City Walls go up. +reqs = + { "type", "name", "range","present" + "Building", "Coal Plant", "Local", TRUE + "Building", "Nuclear Plant", "City", TRUE + "Building", "Hydro Plant", "City", FALSE + ;^ closes super rare loophole + } +;--------------------------------------------------------- +[effect_hydro_plant] +type = "Output_Bonus" +value = 20 +reqs = + { "type", "name", "range", "present" + "Building", "Factory", "City", TRUE + "Building", "Hydro Plant", "City", TRUE + "OutputType","Shield", "Local", TRUE + "Building", "Nuclear Plant", "City", FALSE + "Building", "Hoover Dam", "City", FALSE + "Building", "Fusion Reactor", "Player", FALSE + } +[effect_hydro_plant_1] +type = "Output_Bonus" +value = 20 +reqs = + { "type", "name", "range", "present" + "Building", "Mfg. Plant", "City", TRUE + "Building", "Hydro Plant", "City", TRUE + "OutputType","Shield", "Local", TRUE + "Building", "Nuclear Plant", "City", FALSE + "Building", "Hoover Dam", "City", FALSE + "Building", "Fusion Reactor","Player", FALSE + } +[effect_hydro_plant_2] +type = "Pollu_Prod_Pct" +value = -25 +reqs = + { "type", "name", "range", "present" + "Building", "Factory", "City", TRUE + "Building", "Hydro Plant", "City", TRUE + "Building", "Recycling Center", "City", FALSE + "Building", "Fusion Reactor", "Player",FALSE + "Building", "Solar Plant", "City", FALSE + "Building", "Hoover Dam", "City", FALSE + "Building", "Nuclear Plant", "City", FALSE + } +[effect_hydro_plant_3] +type = "Pollu_Prod_Pct" +value = -25 +reqs = + { "type", "name", "range", "present" + "Building", "Mfg. Plant", "City", TRUE + "Building", "Hydro Plant", "City", TRUE + "Building", "Recycling Center", "City", FALSE + "Building", "Fusion Reactor", "Player",FALSE + "Building", "Solar Plant", "City", FALSE + "Building", "Hoover Dam", "City", FALSE + "Building", "Nuclear Plant", "City", FALSE + } +;--------------------------------------------------------- +[effect_hoover_dam_city_1] +type = "Output_Bonus" +value = 154 +reqs = + { "type", "name", "range" + "Building", "Hoover Dam", "City" + "OutputType", "Shield", "Local" + } +[effect_hoover_dam_city_2] +type = "Pollu_Prod_Pct" ;-25 for factory, -25 for mfg_plant +value = -50 +reqs = + { "type", "name", "range", "present" + "Building", "Hoover Dam", "City", TRUE + "Building", "Recycling Center","City", FALSE + "Building", "Solar Plant", "City", FALSE + "Building", "Fusion Reactor", "Player", FALSE + } +[effect_hoover_dam_city_3] +type = "Pollu_Prod_Pct" ;-25 for factory, -25 for mfg_plant +value = -80 +reqs = + { "type", "name", "range", "present" + "Building", "Hoover Dam", "City", TRUE + "Building", "Fusion Reactor", "Player", TRUE + } +; _ _ _ Bonuses for Hydro Plants in other cities: _ _ _ +[effect_hoover_hydro_plant_bonus_1] +type = "Output_Bonus" +value = 7 +reqs = + { "type", "name", "range", "present" + "Building", "Hoover Dam", "Player", TRUE + "Building", "Hoover Dam", "City", FALSE + "Building", "Factory", "City", TRUE + "Building", "Hydro Plant", "City", TRUE + "OutputType","Shield", "Local", TRUE + "Building", "Nuclear Plant", "City", FALSE + "Building", "Fusion Reactor", "Player", FALSE + } +[effect_hoover_hydro_plant_bonus_2] +type = "Output_Bonus" +value = 7 +reqs = + { "type", "name", "range", "present" + "Building", "Hoover Dam", "Player", TRUE + "Building", "Hoover Dam", "City", FALSE + "Building", "Mfg. Plant", "City", TRUE + "Building", "Hydro Plant", "City", TRUE + "OutputType","Shield", "Local", TRUE + "Building", "Nuclear Plant", "City", FALSE + "Building", "Fusion Reactor","Player", FALSE + } +;Hydro Plants cost less +[effect_hoover_dam_cheaper_hydro_plants] +type = "Building_Build_Cost_Pm" +value = -28; -0.028 * 175 = -4.9 shields (c rounds negative numbers to lower (more magnitude) value) +reqs = + { "type", "name", "range", "present" + "Building", "Hoover Dam" , "Player", TRUE + "Building", "Hydro Plant", "Local", TRUE + } +[effect_hoover_city_build_slots] +type = "City_Build_Slots" +value = 2 ; counts as Factory + Mfg.Plant in its city +reqs = + { "type", "name", "range", "present" + "Tech", "Conscription", "Player", TRUE + "Building", "Hoover Dam", "City", TRUE + } +;Waiting on an Effect which can compare or inject range value. +;[effect_hoover_hydro_upkeep] +;type = "Upkeep_Reduce" +;value = 1 +;reqs = +; { "type", "name", "range", "present" +; "Building", "Hoover Dam", "Player", TRUE +; "Building", "Hydro Plant", "Local", TRUE +; } +;--------------------------------------------------------- +[effect_nuclear_plant] +type = "Output_Bonus" +value = 30 +reqs = + { "type", "name", "range", "present" + "Building", "Factory", "City", TRUE + "Building", "Nuclear Plant", "City", TRUE + "OutputType", "Shield", "Local", TRUE + "Building", "Hoover Dam", "City", FALSE + "Building", "Fusion Reactor","Player", FALSE + } +[effect_nuclear_plant_1] +type = "Output_Bonus" +value = 30 +reqs = + { "type", "name", "range", "present" + "Building", "Mfg. Plant", "City", TRUE + "Building", "Nuclear Plant", "City", TRUE + "OutputType","Shield", "Local", TRUE + "Building", "Fusion Reactor", "Player", FALSE + "Building", "Hoover Dam", "City", FALSE + } +[effect_nuclear_plant_2] +type = "Pollu_Prod_Pct" +value = -25 +reqs = + { "type", "name", "range", "present" + "Building", "Factory", "City", TRUE + "Building", "Nuclear Plant", "City", TRUE + "Building", "Recycling Center", "City", FALSE + "Building", "Fusion Reactor", "Player", FALSE + "Building", "Hoover Dam", "City", FALSE + "Building", "Solar Plant", "City", FALSE + } +[effect_nuclear_plant_3] +type = "Pollu_Prod_Pct" +value = -25 +reqs = + { "type", "name", "range", "present" + "Building", "Mfg. Plant", "City", TRUE + "Building", "Nuclear Plant", "City", TRUE + "Building", "Recycling Center", "City", FALSE + "Building", "Fusion Reactor", "Player", FALSE + "Building", "Hoover Dam", "City", FALSE + "Building", "Solar Plant", "City", FALSE + } +;--------------------------------------------------------- +[effect_fusion_reactor] +type = "Output_Bonus" +value = 40 +reqs = + { "type", "name", "range", "present" + "Building", "Fusion Reactor", "Player", TRUE + "Building", "Factory", "City", TRUE + "OutputType", "Shield", "Local", TRUE + } +[effect_fusion_reactor_1] +type = "Output_Bonus" +value = 40 +reqs = + { "type", "name", "range", "present" + "Building", "Fusion Reactor", "Player", TRUE + "Building", "Mfg. Plant", "City", TRUE + "OutputType", "Shield", "Local", TRUE + } +[effect_fusion_reactor_1a_hoover] +type = "Output_Bonus" +value = 80 +reqs = + { "type", "name", "range", "present" + "Building", "Fusion Reactor", "Player", TRUE + "Building", "Hoover Dam", "City", TRUE + "Building", "Mfg. Plant", "City", FALSE + "Building", "Factory", "City", FALSE + "OutputType", "Shield", "Local", TRUE + } +[effect_fusion_reactor_2] +type = "Pollu_Prod_Pct" +value = -80 +reqs = + { "type", "name", "range", "present" + "Building", "Factory", "City", TRUE + "Building", "Fusion Reactor", "Player", TRUE + } +[effect_fusion_reactor_3] +type = "Unit_Upkeep_Free_Per_City" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Fusion Reactor", "Player" + "OutputType", "Shield", "Local" + } +[effect_fusion_reactor_4] +type = "City_Build_Slots" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Fusion Reactor", "Player" + } +;--------------------------------------------------------- +[effect_solar_plant] +type = "Output_Bonus" +value = 20 +reqs = + { "type", "name", "range" + "Building", "Factory", "City" + "Building", "Solar Plant", "City" + "OutputType", "Shield", "Local" + } +[effect_solar_plant_pollution_1] +type = "Pollu_Prod_Pct" +value = -75 +reqs = + { "type", "name", "range", "present" + "Building", "Solar Plant", "City", TRUE + ;80% from Fusion Reactor is greater than 75% from Solar. + "Building","Fusion Reactor","Player", FALSE + } +[effect_solar_plant_unit_upkeep] +type = "Unit_Upkeep_Free_Per_City" +value = 2 + reqs = + { "type", "name", "range" + "Building", "Solar Plant", "City" + "OutputType", "Shield", "Local" + } +[effect_solar_plant_culture] +type = "History" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Solar Plant", "City" + } +;--------------------------------------------------------- +[effect_wind_plant] +type = "Output_Bonus" +value = 5 +reqs = + { "type", "name", "range" + "Building", "Wind Plant", "City" + "OutputType", "Shield", "Local" + } +[effect_wind_plant_pollution] +type = "Pollu_Prod_Pct" +value = -10 +reqs = + { "type", "name", "range" + "Building", "Wind Plant", "City" + } +[effect_wind_plant_unit_upkeep] +type = "Unit_Upkeep_Free_Per_City" +value = 2 + reqs = + { "type", "name", "range" + "Building", "Solar Plant", "City" + "OutputType", "Shield", "Local" + } +;********************************************************************** RECYCLING CENTER +; All pollution bonus effects are layered in Power Plants with nice +; clean logic: each lower ones turn its effect off for better ones +; to take effect, all the way to the top. Finally we arrive at +; Recycling Center which has to do the heavy lifting on special +; combination rules of the ruleset: +; .... +; A Solar Plant combines with Recycling Center to eliminate 90% +; pollution. A Fusion Reactor saves 80% instead of 66%, in which case +; we prefer the Fuction Reactor's bonus. A Fusion reactor supersedes +; the Solar Plant's 75% bonus but doesn't get the combination bonus, so +; has to "unsupersede" in the case of Recycling and Solar both present: +; .... +; Case 1: neither SP or FR is present. Highest in food chain, full 66%: +[effect_recycling_center_1] +type = "Pollu_Prod_Pct" +value = -66 +reqs = + { "type", "name", "range", "present" + "Building", "Recycling Center", "City", TRUE + "Building", "Fusion Reactor", "Player", FALSE + "Building", "Solar Plant", "City", FALSE + } +; Case 2: SP is present, FR is absent. Second highest in food chain, +; and obligation to deliver on the 90% reduction effect: +[effect_recycling_center_2] +type = "Pollu_Prod_Pct" +value = -15 ; Solar is higher and ACTIVE at -75%. -15 = -90%. +reqs = + { "type", "name", "range", "present" + "Building", "Recycling Center", "City", TRUE + "Building", "Fusion Reactor", "Player", FALSE + "Building", "Solar Plant", "City", TRUE + } +; Case 3: SP and Fusion Reactor both present and higher on food chain. +; Solar Plant "wakes up" from being superseded by Fusion Reactor to +; deliver its promised 90% combinatorial bonus with Recycling Center: +[effect_recycling_center_3] +type = "Pollu_Prod_Pct" +value = -10 ; Fusion reactor superseded to -80%. -10 = -90% +reqs = + { "type", "name", "range", "present" + "Building", "Recycling Center", "City", TRUE + "Building", "Fusion Reactor", "Player", TRUE + "Building", "Solar Plant", "City", TRUE + } +; Case 4: SP absent and Fusion Reactor present +; Fusion reactor is superceding Recycling Center: +; DO NOTHING +; .... +; Raw materials generated from Recycling add +2 base shields to city production. +[effect_recycling_center_4] +type = "Output_Add_Tile" +value = 2 +reqs = + { "type", "name", "range" + "Building", "Recycling Center", "City" + "CityTile", "Center", "Local" + "OutputType", "Shield", "Local" + } +[effect_recycling_center_5] +type = "Upgrade_Price_Pct" +value = -20 +reqs = + { "type", "name", "range" + "Tech", "Recycling", "Player" + } + +[effect_research_lab] +type = "Output_Bonus" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Library", "City" + "Building", "Research Lab", "City" + "OutputType", "Science", "Local" + } +[effect_research_lab_1] +type = "Output_Bonus" +value = 100 +reqs = + { "type", "name", "range" + "Building", "University", "City" + "Building", "Research Lab", "City" + "OutputType", "Science", "Local" + } + +[effect_sam_battery] +type = "Defend_Bonus" +value = 100 +reqs = + { "type", "name", "range", "present" + "Building", "SAM Battery", "City", TRUE + "UnitClass", "Air", "Local", TRUE + "UnitType", "Stealth Bomber", "Local", FALSE + } +[effect_sam_battery_1] +type = "Defend_Bonus" +value = 100 +reqs = + { "type", "name", "range", "present" + "Building", "SAM Battery", "City", TRUE + "UnitClass", "AirProtect", "Local", TRUE + "UnitType", "Stealth Fighter", "Local", FALSE + } +[effect_sam_battery_2] +type = "Defend_Bonus" +value = 100 +reqs = + { "type", "name", "range" + "Building", "SAM Battery", "City" + "UnitClass", "Air_High_Altitude", "Local" + } +[effect_sam_battery_3] +type = "Defend_Bonus" +value = 100 +reqs = + { "type", "name", "range" + "Building", "SAM Battery", "City" + "UnitClass", "Helicopter", "Local" + } +[effect_sam_battery_stealth_bomber] +type = "Defend_Bonus" +value = 25 +reqs = + { "type", "name", "range", "present" + "Building", "SAM Battery", "City", TRUE + "UnitType", "Stealth Bomber", "Local", TRUE + } +[effect_sam_battery_stealth_fighter] +type = "Defend_Bonus" +value = 25 +reqs = + { "type", "name", "range", "present" + "Building", "SAM Battery", "City", TRUE + "UnitType", "Stealth Fighter", "Local", TRUE + } + +[effect_sdi_defense] +type = "Nuke_Proof" +value = 100 +reqs = + { "type", "name", "range", "present" + "Building", "SDI Defense", "City", TRUE + "DiplRel", "Foreign", "Local", TRUE + "DiplRel", "Team", "Local", FALSE + } +[effect_sdi_defense_1] +type = "Defend_Bonus" +value = 100 +reqs = + { "type", "name", "range" + "Building", "SDI Defense", "City" + "UnitClass", "Missile", "Local" + } + +[effect_sewer_system] +type = "Size_Unlimit" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Aqueduct", "City" + "Building", "Sewer System", "City" + } +[effect_sewer_system_health] +type = "Health_Pct" +value = 30 +reqs = + { "type", "name", "range" + "Building", "Aqueduct", "City" + "Building", "Sewer System", "City" + } + +[effect_space_component] +type = "SS_Component" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Space Component", "City" + } + +[effect_space_module] +type = "SS_Module" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Space Module", "City" + } + +[effect_space_structural] +type = "SS_Structural" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Space Structural", "City" + } + +;Timeline is already way behind and too slow, REMOVE: +;[effect_plastics_slowdown] +;type = "Slow_Down_Timeline" +;value = 1 +;reqs = +; { "type", "name", "range", "survives" +; "Tech", "Plastics", "World", TRUE +; } + +;[effect_superconductor_slowdown] +;type = "Slow_Down_Timeline" +;value = 1 +;reqs = +; { "type", "name", "range", "survives" +; "Tech", "Superconductors", "World", TRUE +; } +;1 year per turn ensures spaceship travel time calibrated. +;this can be removed after game.info.spacerace bug of not changing +;timeline gets fixed in server. +[effect_spaceflight_slowdown] +type = "Turn_Years" +value = 1 +reqs = + { "type", "name", "range", "survives" + "Tech", "Space Flight", "World", TRUE + } + +[effect_stock_exchange_gold] +type = "Output_Bonus" +value = 50 +reqs = + { "type", "name", "range" + "Building", "Bank", "City" + "Building", "Stock Exchange", "City" + "OutputType", "Gold", "Local" + } +[effect_stock_exchange_luxury] +type = "Output_Bonus" +value = 50 +reqs = + { "type", "name", "range" + "Building", "Bank", "City" + "Building", "Stock Exchange", "City" + "OutputType", "Luxury", "Local" + } +;Changes require changes to city_force_income_update() in city.js +[effect_stock_exchange_coinage] +type = "Coinage_Bonus_Pm" +value = 250 ; 250‰ = 25% +reqs = + { "type", "name", "range","present" + "Building", "Marketplace", "City", TRUE + "Building", "Bank", "City", TRUE + "Building", "Stock Exchange", "City", TRUE + "Gov", "Communism", "Player",FALSE + "Tech", "The Corporation","Player",TRUE + } + +[effect_super_highways] +type = "Output_Per_Tile" +value = 50 +reqs = + { "type", "name", "range" + "Extra", "Road", "Local" + "Building", "Super Highways", "City" + "OutputType", "Trade", "Local" + } + +; Super Highways increase logistical efficiency to +; get more use out of an airport in size 12+ city. +[effect_super_highways_airlift_facilitation] +type = "Airlift" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Super Highways", "City" + "Building", "Airport", "City" + "Building", "Sewer System", "City" + } + +[effect_mine] +type = "Mining_Pct" +value = 100 +reqs = + { "type", "name", "range" + "Extra", "Mine", "Local" + } + +[effect_oil_well] +type = "Mining_Pct" +value = 100 +reqs = + { "type", "name", "range" + "Extra", "Oil Well", "Local" + } + +[effect_irrigation] +type = "Irrigation_Pct" +value = 100 +reqs = + { "type", "name", "range" + "Extra", "Irrigation", "Local" + } +; Desert with river (and no Oasis) gets 1 extra food from irrigation (total 2) +; ("Nile floods" effect) +[effect_irrigation_2] +type = "Irrigation_Pct" +value = 100 +reqs = + { "type", "name", "range", "present" + "Terrain", "Desert", "Local", TRUE + "Extra", "River", "Local", TRUE + "Extra", "Oasis", "Local", FALSE + "Extra", "Irrigation", "Local", TRUE + } +; ...same for city centers +[effect_irrigation_3] +type = "Irrigation_Pct" +value = 100 +reqs = + { "type", "name", "range", "present" + "Terrain", "Desert", "Local", TRUE + "Extra", "River", "Local", TRUE + "Extra", "Oasis", "Local", FALSE + "CityTile", "Center", "Local", TRUE +; "Extra", "Irrigation", "Local", FALSE + "TerrainAlter", "CanIrrigate", "Local", TRUE + "Extra", "Mine", "Local", FALSE + "Extra", "Oil Well", "Local", FALSE + } + +[effect_irrigation_center] +type = "Irrigation_Pct" +value = 100 +reqs = + { "type", "name", "range", "present" + "CityTile", "Center", "Local", TRUE + "Extra", "Irrigation", "Local", FALSE + "TerrainAlter", "CanIrrigate", "Local", TRUE + "Extra", "Mine", "Local", FALSE + "Extra", "Oil Well", "Local", FALSE + } + +[effect_supermarket] +type = "Output_Per_Tile" +value = 100 +reqs = + { "type", "name", "range" + "Extra", "Farmland", "Local" + "Building", "Supermarket", "City" + "OutputType", "Food", "Local" + } + +[effect_supermarket_center] +type = "Output_Per_Tile" +value = 50 +reqs = + { "type", "name", "range", "present" + "CityTile", "Center", "Local", TRUE + "Extra", "Farmland", "Local", FALSE + "TerrainAlter", "CanIrrigate", "Local", TRUE + "Building", "Supermarket", "City", TRUE + "OutputType", "Food", "Local", TRUE + "Extra", "Mine", "Local", FALSE + "Extra", "Oil Well", "Local", FALSE + } + +[effect_temple] +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Temple", "City" + } + +[effect_temple_1] +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range" + "Tech", "Mysticism", "Player" + "Building", "Temple", "City" + } + +[effect_totem_pole] +type = "Output_Add_Tile" +value = 2 +reqs = + { "type", "name", "range" + "Building", "Totem Pole", "City" + "CityTile", "Center", "Local" + "OutputType", "Luxury", "Local" + } + +[effect_university] +type = "Output_Bonus" +value = 150 +reqs = + { "type", "name", "range" + "Building", "Library", "City" + "Building", "University", "City" + "OutputType", "Science", "Local" + } +;********************************************************************************* VISION BONUSES (non-wonder) +[effect_telegraph_border_vision] +type = "Border_Vision" +value = 1 +reqs = + { "type", "name", "range" + "Tech", "Electricity", "Player" + } +; Air+Sea+LandAirSea CLASS units REQUIRE PHYSICS so their BONUS +; is in their stats to AVOID more [effect_] entries. +[effect_physics_vision] +type = "Unit_Vision_Radius_Sq" +value = 4 +reqs = + { "type", "name", "range" + "Tech", "Physics", "Player" + "UnitClass", "Land", "Local" + } +[effect_physics_vision_1] +type = "Unit_Vision_Radius_Sq" +value = 4 +reqs = + { "type", "name", "range" + "Tech", "Physics", "Player" + "UnitClass", "LandNoKill", "Local" + } +[effect_physics_vision_2] +type = "Unit_Vision_Radius_Sq" +value = 4 +reqs = + { "type", "name", "range" + "Tech", "Physics", "Player" + "UnitClass", "Trireme", "Local" + } +[effect_physics_vision_3] +type = "Unit_Vision_Radius_Sq" +value = 4 +reqs = + { "type", "name", "range" + "Tech", "Physics", "Player" + "UnitClass", "RiverShip", "Local" + } +[effect_satellite_vision] ;Vision benefit from satellite communication to land units +type = "Unit_Vision_Radius_Sq" +value = 7 +reqs = + { "type", "name", "range" + "Tech", "Space Flight", "Player" + "UnitClass", "Land", "Local" + } +[effect_satellite_vision_1] ;Vision benefit from satellite communication to land units (Marines) +type = "Unit_Vision_Radius_Sq" +value = 7 +reqs = + { "type", "name", "range" + "Tech", "Space Flight", "Player" + "UnitClass", "LandAirSea", "Local" + } +[effect_satellite_vision_2] ;Vision benefit from satellite communication to sea units +type = "Unit_Vision_Radius_Sq" +value = 7 +reqs = + { "type", "name", "range" + "Tech", "Space Flight", "Player" + "UnitClass", "Sea", "Local" + } +[effect_satellite_vision_2a] ;Vision benefit from satellite communication to sea units +type = "Unit_Vision_Radius_Sq" +value = 7 +reqs = + { "type", "name", "range" + "Tech", "Space Flight", "Player" + "UnitClass", "Submarine", "Local" + } +[effect_satellite_vision_3] ;Vision benefit from satellite communication to sea units +type = "Unit_Vision_Radius_Sq" +value = 7 +reqs = + { "type", "name", "range" + "Tech", "Space Flight", "Player" + "UnitClass", "Air", "Local" + } +[effect_satellite_vision_3a] ;Vision benefit from satellite communication to sea units +type = "Unit_Vision_Radius_Sq" +value = 7 +reqs = + { "type", "name", "range" + "Tech", "Space Flight", "Player" + "UnitClass", "AirProtect", "Local" + } +[effect_satellite_vision_4] ;Vision benefit from satellite communication to cities +type = "City_Vision_Radius_Sq" +value = 36 +reqs = + { "type", "name", "range" + "Tech", "Space Flight", "Player" + } +[effect_radar_vision] +type = "City_Vision_Radius_Sq" +value = 50 ;7 cardinal, 5 diagonal +reqs = + { "type", "name", "range" + "Tech", "Radar", "Player" + "Building", "Radar Tower", "City" + } +;[effect_radar_vision2] +;type = "Unit_Vision_Radius_Sq" +;value = 16 +;reqs = +; { "type", "name", "range", "present" +; "Extra", "Airbase", "tile", TRUE +; "Tech", "Radar", "Player", TRUE +; "MaxUnitsOnTile", "0", "Local", FALSE ;occupied base +; } +;------------------------------------------------------------- + +;********************************************************************************* MOVE BONUSES +[effect_airplane_range_1] +type = "Move_Bonus" +value = 18 +reqs = + { "type", "name", "range" + "Tech", "Radio", "Player" + "UnitType", "Airplane", "Local" + } +[effect_airplane_range_2] +type = "Move_Bonus" +value = 18 +reqs = + { "type", "name", "range" + "Tech", "Advanced Flight", "Player" + "UnitType", "Airplane", "Local" + } +[effect_airplane_range_3] +type = "Move_Bonus" +value = 18 +reqs = + { "type", "name", "range" + "Tech", "Radar", "Player" + "UnitType", "Airplane", "Local" + } +[effect_airplane_range_4] +type = "Move_Bonus" +value = 18 +reqs = + { "type", "name", "range" + "Tech", "Rocketry", "Player" + "UnitType", "Airplane", "Local" + } +[effect_airplane_range_5] +type = "Move_Bonus" +value = 18 +reqs = + { "type", "name", "range" + "Tech", "Space Flight", "Player" + "UnitType", "Airplane", "Local" + } +[effect_airplane_range_6] +type = "Move_Bonus" +value = 18 +reqs = + { "type", "name", "range" + "Tech", "Avionics", "Player" + "UnitType", "Airplane", "Local" + } + +[effect_rail_electricity] +type = "Move_Bonus" +value = 9 +reqs = + { "type", "name", "range" + "Tech", "Electricity", "Player" + "UnitClass", "LandRail", "Local" + } +[effect_rail_combustion] +type = "Move_Bonus" +value = 9 +reqs = + { "type", "name", "range" + "Tech", "Combustion", "Player" + "UnitClass", "LandRail", "Local" + } +;************************************************************************ Adam Smith +[effect_asmiths_trading_co] +type = "Upkeep_Free" +value = 1 +reqs = + { "type", "name", "range" + "Building", "A.Smith's Trading Co.", "Player" + } +;************************************************************************ Agoge of Sparta +[effect_agoge_move_bonus_1] +type = "Move_Bonus" +value = 3 +reqs = + { "type", "name", "range", "present" + "Building", "Agōgē of Sparta", "Player", TRUE + "UnitFlag", "FootSoldier", "Local", TRUE + } +[effect_agoge_move_bonus_2] +type = "Move_Bonus" +value = 6 ; 3/9 + 6/9 = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Agōgē of Sparta", "City", TRUE + "UnitFlag", "FootSoldier", "Local", TRUE + } +[effect_agoge_phalanx] +type = "Attack_Bonus" +value = 50 +reqs = + { "type", "name", "range", "present" + "Building", "Agōgē of Sparta", "Player", TRUE + "UnitType", "Phalanx", "Local", TRUE + } +[effect_agoge_pikemen] +type = "Attack_Bonus" +value = 50 +reqs = + { "type", "name", "range", "present" + "Building", "Agōgē of Sparta", "Player", TRUE + "UnitType", "Pikemen", "Local", TRUE + } +;************************************************************************ Angkor Wat +[effect_angkor_wat_free_tile_bonus_monarchy] ;free celebration tile output +type = "Output_Inc_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Angkor Wat", "Player" + "Gov", "Monarchy", "Player" + "OutputType", "Trade", "Local" + "MinSize", "3", "City" + } +[effect_angkor_wat_free_tile_bonus_despotism] ;free celebration tile output +type = "Output_Penalty_Tile" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Angkor Wat", "Player" + "Gov", "Despotism", "Player" + "MinSize", "3", "City" + } +[effect_angkor_wat_happy] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Angkor Wat", "Player", TRUE + "Gov", "Democracy", "Player", FALSE + "Gov", "Theocracy", "Player", FALSE + "Gov", "Communism", "Player", FALSE + "Gov", "Nationalism","Player", FALSE + } +[effect_angkor_wat_jungleswamp_all_work_bonus] +type = "Unit_Work_Pct" +value = 100 ; 100% faster is half the time (or more, since rounded up) +reqs = + { "type", "name", "range","present" + "Building", "Angkor Wat", "Player",TRUE + "Gov", "Democracy", "Player", FALSE + "Gov", "Theocracy", "Player", FALSE + "Gov", "Communism", "Player", FALSE + "Gov", "Nationalism", "Player", FALSE +; "Activity", "Irrigate", "Local", TRUE ; all work is 50% bonus + "UnitFlag", "Infra", "Local", TRUE + "Terrain", "Grassland", "Local", FALSE ; exclude everything but Swamp/Jungle. + "Terrain", "Plains", "Local", FALSE + "Terrain", "Desert", "Local", FALSE + "Terrain", "Tundra", "Local", FALSE + "Terrain", "Glacier", "Local", FALSE + "Terrain", "Forest", "Local", FALSE + "Terrain", "Hills", "Local", FALSE + "Terrain", "Mountains", "Local", FALSE + "Terrain", "Ocean", "Local", FALSE + "Terrain", "Deep Ocean", "Local", FALSE + } +[effect_angkor_wat_elephant_discount] +type = "Unit_Build_Cost_Pct" +value = -13 ; 36 - 5 = - 13% +reqs = + { + "type", "name", "range", "present" + "Building", "Angkor Wat", "Player", TRUE + "UnitType", "Elephants", "Local", TRUE + "Gov", "Democracy", "Player", FALSE + "Gov", "Theocracy", "Player", FALSE + "Gov", "Communism", "Player", FALSE + "Gov", "Nationalism", "Player", FALSE + } +[effect_angkor_wat_culture] +type = "History" +value = 2 +reqs = + { "type", "name", "range", "present" + "Building", "Angkor Wat", "City", TRUE + } +;************************************************************************ Apollo Program +[effect_apollo_program] +type = "Enable_Space" +value = 1 +reqs = + { "type", "name", "range", "survives" + "Building", "Apollo Program", "Player", TRUE + } +;************************************************************************ Appian Way +[effect_appian_ongoing_trade_bonus] +type = "Traderoute_Pct" +value = 25 ; trunc-rounding gives a (mean+median)/2 of +9.97% for routes pulling 1-9 revenue per turn; + ; approaches +25% as this goes higher but that is hard-limited by game-context +reqs = + { "type", "name", "range", "present" + "Building", "Appian Way", "Player", TRUE + } +[effect_appian_road_trade_bonus] +type = "Output_Inc_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Extra", "Road", "Local" + "Building", "Appian Way", "City" + "OutputType", "Trade", "Local" + } +[effect_appian_wagon_discount] +type = "Unit_Build_Cost_Pct" +value = -20 ; 25 - 5 = - 20% +reqs = + { + "type", "name", "range", "present" + "Building", "Appian Way", "City", TRUE + "UnitType", "Wagon", "Local", TRUE + "Tech", "Railroad", "Player", FALSE + } +[effect_appian_move_bonus_foot_soldier1] ; bonus for unclaimed territory +type = "Move_Bonus" +value = 3 +reqs = + { "type", "name", "range","present" + "Building", "Appian Way", "Player",TRUE + "UnitFlag", "FootSoldier", "Local", TRUE + "Extra", "Road", "Local", TRUE + "CityTile", "Claimed", "Local", FALSE + } +[effect_appian_move_bonus_foot_soldier2] ; bonus for national territory +type = "Move_Bonus" +value = 3 +reqs = + { "type", "name", "range","present" + "Building", "Appian Way", "Player",TRUE + "UnitFlag", "FootSoldier", "Local", TRUE + "Extra", "Road", "Local", TRUE + "UnitState", "OnDomesticTile","Local",TRUE + } +[effect_appian_move_bonus_chariot1] +type = "Move_Bonus" +value = 6 +reqs = + { "type", "name", "range", "present" + "Building", "Appian Way", "Player", TRUE + "UnitType", "Chariot", "Local", TRUE + "Extra", "Road", "Local", TRUE + "CityTile", "Claimed", "Local", FALSE + } +[effect_appian_move_bonus_chariot2] +type = "Move_Bonus" +value = 6 +reqs = + { "type", "name", "range", "present" + "Building", "Appian Way", "Player", TRUE + "UnitType", "Chariot", "Local", TRUE + "Extra", "Road", "Local", TRUE + "UnitState", "OnDomesticTile","Local",TRUE + } +[effect_appian_move_bonus_wagon1] +type = "Move_Bonus" +value = 3 +reqs = + { "type", "name", "range","present" + "Building", "Appian Way", "Player",TRUE + "UnitType", "Wagon", "Local", TRUE + "Extra", "Road", "Local", TRUE + "CityTile", "Claimed", "Local", FALSE + } +[effect_appian_move_bonus_wagon2] +type = "Move_Bonus" +value = 3 +reqs = + { "type", "name", "range","present" + "Building", "Appian Way", "Player",TRUE + "UnitType", "Wagon", "Local", TRUE + "Extra", "Road", "Local", TRUE + "UnitState", "OnDomesticTile","Local",TRUE + } +[effect_appian_move_workers1] +type = "Move_Bonus" +value = 3 +reqs = + { "type", "name", "range","present" + "Building", "Appian Way", "Player",TRUE + "UnitFlag", "Infra", "Local", TRUE + "UnitType", "Legion", "Local", FALSE ;Legions already got a bonus above. + "CityTile", "Claimed", "Local", FALSE + } +[effect_appian_move_workers2] +type = "Move_Bonus" +value = 3 +reqs = + { "type", "name", "range","present" + "Building", "Appian Way", "Player",TRUE + "UnitType", "Workers", "Local", TRUE + "Extra", "Fallout", "Local", FALSE ; UnitState tile check will segfault without a tile target in the reqs list. + "UnitState", "OnDomesticTile","Local",TRUE + } +[effect_appian_work_workers1] +type = "Unit_Work_Pct" +value = 100 +reqs = + { "type", "name", "range","present" + "Building", "Appian Way", "Player",TRUE + "UnitFlag", "Infra", "Local", TRUE + "Activity", "Road", "Local", TRUE + } +;************************************************************************ Chand Baori +[effect_chand_baori] +type = "Output_Penalty_Tile" +value = 3 ; 3+3 = 6; i.e., gone for fruit but in place for irrigated deer. +reqs = + { "type", "name", "range", "present" + "Building", "Chand Baori", "City", TRUE + "Gov", "Despotism", "Player", TRUE + "OutputType", "Food", "Local", TRUE + } +[effect_chand_baori_irrigation_rate] +type = "Unit_Work_Pct" +value = 63 ; 33% bonus +; believe it or not, because of trunc-rounding, 63 is the number that gives closest to true 33.3% bonus! +; 1. It yields the SAME as value=34 when irrigating grass/plains for a true +33.3% work rate. +; 2. But yields "8 -> 5" (+37.5%) rather than "8 -> 6" (which lost 32% of the 33% bonus to trunc-rounding!) +reqs = + { "type", "name", "range","present" + "Building", "Chand Baori", "Player",TRUE + "Gov", "Despotism", "Player",TRUE + "UnitFlag", "Infra", "Local", TRUE + "Activity", "Irrigate", "Local", TRUE ; irrigate is currently synonymous with cultivate for backward compatibility + "Terrain", "Hills", "Local", FALSE + "Terrain", "Desert", "Local", FALSE + "Terrain", "Forest", "Local", FALSE + "Terrain", "Jungle", "Local", FALSE + "Terrain", "Tundra", "Local", FALSE + "Terrain", "Glacier", "Local", FALSE + "Terrain", "Mountains", "Local", FALSE + } +[effect_chand_baori_cultivation_rate] +type = "Unit_Work_Pct" +value = 63 ; 33% bonus +; believe it or not, because of trunc-rounding, 63 is the number that gives closest to true 33.3% bonus! +; 1. It yields the SAME as value=34 when irrigating grass/plains for a true +33.3% work rate. +; 2. But yields "8 -> 5" (+37.5%) rather than "8 -> 6" (which lost 32% of the 33% bonus to trunc-rounding!) +reqs = + { "type", "name", "range","present" + "Building", "Chand Baori", "Player",TRUE + "Gov", "Despotism", "Player",TRUE + "UnitFlag", "Infra", "Local", TRUE + "Activity", "Cultivate", "Local", TRUE ; but for forward compatibility we need cultivate also + "Terrain", "Hills", "Local", FALSE + "Terrain", "Desert", "Local", FALSE + "Terrain", "Forest", "Local", FALSE + "Terrain", "Jungle", "Local", FALSE + "Terrain", "Tundra", "Local", FALSE + "Terrain", "Glacier", "Local", FALSE + "Terrain", "Mountains", "Local", FALSE + } +[effect_chand_baori_mine_rate] +type = "Unit_Work_Pct" +value = 63 ; 33% bonus +; believe it or not, because of trunc-rounding, 63 is the number that gives closest to true 33.3% bonus! +; 1. It yields the SAME as value=34 when irrigating grass/plains for a true +33.3% work rate. +; 2. But yields "8 -> 5" (+37.5%) rather than "8 -> 6" (which lost 32% of the 33% bonus to trunc-rounding!) +reqs = + { "type", "name", "range","present" + "Building", "Chand Baori", "Player",TRUE + "Gov", "Despotism", "Player",TRUE + "UnitFlag", "Infra", "Local", TRUE + "Activity", "Mine", "Local", TRUE ; mine is currently synonymous with plant for backward compatibility + "Terrain", "Hills", "Local", FALSE + "Terrain", "Desert", "Local", FALSE + "Terrain", "Forest", "Local", FALSE + "Terrain", "Jungle", "Local", FALSE + "Terrain", "Tundra", "Local", FALSE + "Terrain", "Glacier", "Local", FALSE + "Terrain", "Mountains", "Local", FALSE + } +[effect_chand_baori_plant_rate] +type = "Unit_Work_Pct" +value = 63 ; 33% bonus +; believe it or not, because of trunc-rounding, 63 is the number that gives closest to true 33.3% bonus! +; 1. It yields the SAME as value=34 when irrigating grass/plains for a true +33.3% work rate. +; 2. But yields "8 -> 5" (+37.5%) rather than "8 -> 6" (which lost 32% of the 33% bonus to trunc-rounding!) +reqs = + { "type", "name", "range","present" + "Building", "Chand Baori", "Player",TRUE + "Gov", "Despotism", "Player",TRUE + "UnitFlag", "Infra", "Local", TRUE + "Activity", "Plant", "Local", TRUE ; but for forward compatibility we need plant also + "Terrain", "Hills", "Local", FALSE + "Terrain", "Desert", "Local", FALSE + "Terrain", "Forest", "Local", FALSE + "Terrain", "Jungle", "Local", FALSE + "Terrain", "Tundra", "Local", FALSE + "Terrain", "Glacier", "Local", FALSE + "Terrain", "Mountains", "Local", FALSE + } + +;IrrigationSource of city is in game.ruleset +;************************************************************************ Code of Hammurabi +[effect_hammurabi_corruption_1] +type = "Output_Waste" +value = -11 ; 37-11 = 26 +reqs = + { "type", "name", "range" + "Gov", "Despotism", "Player" + "Building", "Code of Hammurabi", "Player" + "OutputType", "Trade", "Local" + } +[effect_hammurabi_corruption_2] +type = "Output_Waste_By_Distance" +value = -100 ; 400-100 = 300 +reqs = + { "type", "name", "range" + "Gov", "Despotism", "Player" + "Building", "Code of Hammurabi", "Player" + "OutputType", "Trade", "Local" + } +[effect_hammurabi_tile_bonus] ; Code of Hammurabi removes tile penalty on lowlands tiles +type = "Output_Penalty_Tile" +value = 100 +reqs = + { "type", "name", "range", "present" + "Gov", "Despotism", "Player", TRUE + "Building", "Code of Hammurabi","Player", TRUE + "TerrainFlag", "Low Land", "Local", TRUE + } +[effect_hammurabi_content_no_temple] +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Code of Hammurabi", "Player", TRUE + "Building", "Temple", "City", FALSE + } +[effect_hammurabi_culture] +type = "History" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Code of Hammurabi", "City" + } +;************************************************************************ Colossus +[effect_colossus_tile_trade] +type = "Output_Inc_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Colossus", "City" + "OutputType", "Trade", "Local" + } +[effect_colossus_city_center_tile] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Colossus", "City" + "CityTile", "Center", "Local" + "OutputType", "Trade", "Local" + } +[effect_colossus_trade_revenue_bonus] +type = "Trade_Revenue_Bonus" +value = 528 ; +40% increase one time revenue +reqs = + { "type", "name", "range", "present" + "Building", "Colossus", "City", TRUE + } +[effect_colossus_traderoute_pct] +type = "Traderoute_Pct" +value = 34 ; because trunc-rounding, this gives closest to +25% to ongoing revenue +reqs = + { "type", "name", "range", "present" + "Building", "Colossus", "City", TRUE + } + +[effect_colossus_commerce_unit_discount] +type = "Unit_Build_Cost_Pct" +value = -11 +reqs = + { + "type", "name", "range", "present" + "Building", "Colossus", "City", TRUE + "UnitFlag", "HelpWonder", "Local", TRUE + "UnitClass", "Land", "Local", FALSE + "UnitClass", "LandRoad", "Local", FALSE + "Tech", "Steam Engine", "Player", FALSE + } +[effect_colossus_galley_discount] +type = "Unit_Build_Cost_Pct" +value = -4 ;30-5 = -17% +reqs = + { + "type", "name", "range", "present" + "Building", "Colossus", "City", TRUE + "UnitType", "Galley", "Local", TRUE + "Tech", "Steam Engine", "Player", FALSE + } +[effect_colossus_trireme_discount] +type = "Unit_Build_Cost_Pct" +value = -13 ;20-5 = -25% +reqs = + { + "type", "name", "range", "present" + "Building", "Colossus", "City", TRUE + "UnitType", "Trireme", "Local", TRUE + "Tech", "Steam Engine", "Player", FALSE + } +[effect_colossus_boat_discount] +type = "Unit_Build_Cost_Pct" +value = -18 ;10-3 = -30% +reqs = + { + "type", "name", "range", "present" + "Building", "Colossus", "City", TRUE + "UnitType", "Boat", "Local", TRUE + "Tech", "Steam Engine", "Player", FALSE + } +[effect_colossus_caravel_discount] +type = "Unit_Build_Cost_Pct" +value = -12 ;40-5 = -12% +reqs = + { + "type", "name", "range", "present" + "Building", "Colossus", "City", TRUE + "UnitType", "Caravel", "Local", TRUE + "Tech", "Steam Engine", "Player", FALSE + } +[effect_colossus_goods_discount] +type = "Unit_Build_Cost_Pct" +value = -20 ;25-5 = -20% +reqs = + { + "type", "name", "range","present" + "Building", "Colossus", "City", TRUE + "UnitType", "Goods", "Local", TRUE + "Tech", "Steam Engine", "Player",FALSE + } +;************************************************************************ Copernicus +[effect_copernicus_observatory] +type = "Output_Bonus" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Copernicus' Observatory", "City" + "OutputType", "Science", "Local" + } +;************************************************************************ Eiffel Tower +[effect_eiffel_tower] +type = "Unit_Upkeep_Free_Per_City" +value = 1 + reqs = + { "type", "name", "range" + "Building", "Eiffel Tower", "Player" + "OutputType", "Shield", "Local" + } +;************************************************************************ Fusion Reactor +; see POWER PLANTS section +;************************************************************************ Hanging Gardens +[effect_hanging_gardens] +type = "Make_Happy" +value = 2 +reqs = + { "type", "name", "range" + "Building", "Hanging Gardens", "Player" + } +[effect_hanging_gardens_1] +type = "Output_Add_Tile" +value = 2 +reqs = + { "type", "name", "range" + "Building", "Hanging Gardens", "City" + "CityTile", "Center", "Local" + "OutputType", "Luxury", "Local" + } +[effect_hanging_gardens_culture] +type = "History" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Hanging Gardens", "City" + } +;************************************************************************ Hoover Dam +; see POWER PLANTS section +;************************************************************************ Isaac Newton +[effect_isaac_newtons_college] +type = "Output_Bonus" +value = 100 +reqs = + { "type", "name", "range" + "Building", "University", "City" + "Building", "Isaac Newton's College", "Player" + "OutputType", "Science", "Local" + } +;************************************************************************ JTIDS +[effect_jtids] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "JTIDS", "Player", TRUE + "UnitFlag", "FootSoldier", "Local", TRUE + } +[effect_jtids_1] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "JTIDS", "Player", TRUE + "UnitType", "Mech. Inf.", "Local", TRUE ; uses rule_name + } +[effect_jtids_2] +type = "Veteran_Combat" +value = 75 ; 87 57::35 26 26 26 +reqs = + { "type", "name", "range", "present" + "Building", "JTIDS", "Player", TRUE + "UnitFlag", "FootSoldier", "Local", TRUE + "UnitType", "Marines", "Local", FALSE + } +[effect_jtids_3] +type = "Veteran_Combat" +value = 60 ; 80 52::32 24 24 24 +reqs = + { "type", "name", "range", "present" + "Building", "JTIDS", "Player", TRUE + "UnitType", "Mech. Inf.", "Local", TRUE ; uses rule_name + } +[effect_jtids_4] +type = "Veteran_Combat" +value = 40 ;84 70::56 42 28 21 +reqs = + { "type", "name", "range", "present" + "Building", "JTIDS", "Player", TRUE + "UnitFlag", "FootSoldier", "Local", TRUE + "UnitType", "Marines", "Local", TRUE + } +;************************************************************************ J.S. Bach +[effect_js_bachs_cathedral] +type = "Force_Content" +value = 2 +reqs = + { "type", "name", "range" + "Building", "J.S. Bach's Cathedral", "Player" + } +;************************************************************************ King Richard +[effect_king_richards_crusade] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Building", "King Richard's Crusade", "City" + "OutputType", "Shield", "Local" + } +[effect_city_build_slots_kr] +type = "City_Build_Slots" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "King Richard's Crusade", "City", TRUE + } +;************************************************************************ Leonardo +[effect_leonardos_workshop] +type = "Upgrade_Unit" +value = 2 +reqs = + { "type", "name", "range" + "Building", "Leonardo's Workshop", "Player" + } +;************************************************************************ Genghis Khan +[effect_genghis_khans_equestrian_school] +type = "Move_Bonus" +value = 9 +reqs = + { "type", "name", "range", "present" + "Building", "Genghis Khan's Equestrian School", "Player", TRUE + "UnitFlag", "Horse", "Local", TRUE + } +[effect_genghis_khans_equestrian_school2] +type = "Move_Bonus" +value = 9 +reqs = + { "type", "name", "range", "present" + "Building", "Genghis Khan's Equestrian School", "Player", TRUE + "UnitType", "Explorer", "Local", TRUE + } +;************************************************************************ Lighthouse +[effect_lighthouse] +type = "Move_Bonus" +value = 18 +reqs = + { "type", "name", "range" + "Building", "Lighthouse", "Player" + "UnitClass", "Sea", "Local" + } +[effect_lighthouse_a] +type = "Move_Bonus" +value = 18 +reqs = + { "type", "name", "range" + "Building", "Lighthouse", "Player" + "UnitClass", "Submarine", "Local" + } +[effect_lighthouse_1] +type = "Move_Bonus" +value = 18 +reqs = + { "type", "name", "range" + "Building", "Lighthouse", "Player" + "UnitClass", "Trireme", "Local" + } +[effect_lighthouse_2] +type = "Move_Bonus" +value = 18 +reqs = + { "type", "name", "range" + "Building", "Lighthouse", "Player" + "UnitClass", "RiverShip", "Local" + } +[effect_lighthouse_3] +type = "Unit_Vision_Radius_Sq" +value = 6 +reqs = + { "type", "name", "range" + "Building", "Lighthouse", "Player" + "UnitClass", "Sea", "Local" + } +[effect_lighthouse_3a] +type = "Unit_Vision_Radius_Sq" +value = 6 +reqs = + { "type", "name", "range" + "Building", "Lighthouse", "Player" + "UnitClass", "Submarine", "Local" + } +[effect_lighthouse_4] +type = "Unit_Vision_Radius_Sq" +value = 6 +reqs = + { "type", "name", "range" + "Building", "Lighthouse", "Player" + "UnitClass", "Trireme", "Local" + } +[effect_lighthouse_5] +type = "Unit_Vision_Radius_Sq" +value = 6 +reqs = + { "type", "name", "range" + "Building", "Lighthouse", "Player" + "UnitClass", "RiverShip", "Local" + } +;************************************************************************ Magellan +[effect_magellans_expedition] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Magellan's Expedition", "Player", TRUE + "UnitClass", "Sea", "Local", TRUE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_magellans_expedition_a] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Magellan's Expedition", "Player", TRUE + "UnitClass", "RiverShip", "Local", TRUE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_magellans_expedition_b] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Magellan's Expedition", "Player", TRUE + "UnitClass", "Submarine", "Local", TRUE + "UnitFlag", "NoVeteran", "Local", FALSE + } +;************************************************************************ Manhattan +[effect_manhattan_project] +type = "Enable_Nuke" +value = 1 +reqs = + { "type", "name", "range", "survives" + "Building", "Manhattan Project", "World", TRUE + } +;************************************************************************ Marco Polo +[effect_marco_polos_embassy] +type = "Output_Bonus" +value = 40 +reqs = + { "type", "name", "range" + "Building", "Marco Polo's Embassy", "Player" + "OutputType", "Trade", "Local" + } +;************************************************************************ Mausoleum +; ╭╯╭╯╭╯╭╯╭╯╭╯ Devs: THIS IS WHY REQS NEED TO BE ABLE TO DO "OR" LOGIC! +; ..................................... +; EFFECT CHART: CH SC CW GW result +; 0 0 0 0 ✓ +; 0 0 0 1 1c ✓ +; 0 0 1 0 1c ✓ +; 0 0 1 1 1c ✓ +; 0 1 0 0 1c ✓ +; 0 1 0 1 1c 1h ✓ +; 0 1 1 0 1c 1h ✓ +; 0 1 1 1 1c 1h ✓ +; 1 0 0 0 1c ✓ +; 1 0 0 1 1c 1h ✓ +; 1 0 1 0 1c 1h ✓ +; 1 0 1 1 1c 1h ✓ +; 1 1 0 0 1c ✓ +; 1 1 0 1 1c 1h ✓ +; 1 1 1 0 1c 1h ✓ +; 1 1 1 1 1c 1h ✓ +; Yes, it's "brute force" but do we want 93% chance of human error? No. +; Real reason: my brain exploded after multiple tries. +[effect_mausoleum_of_mausolos_0001_c] ; 0001 = ---------------------CONTENT +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", FALSE + "Building", "Supreme Court", "Player", FALSE + "Building", "City Walls", "City", FALSE + "Building", "Great Wall", "Player", TRUE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_0010_c] ; 0010 = ---------------------CONTENT +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", FALSE + "Building", "Supreme Court", "Player", FALSE + "Building", "City Walls", "City", TRUE + "Building", "Great Wall", "Player", FALSE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_0011_c] ; 0011 = ---------------------CONTENT +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", FALSE + "Building", "Supreme Court", "Player", FALSE + "Building", "City Walls", "City", TRUE + "Building", "Great Wall", "Player", TRUE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_0100_c] ; 0100 = ---------------------CONTENT +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", FALSE + "Building", "Supreme Court", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Building", "Great Wall", "Player", FALSE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_0101_c] ; 0101 = -------------------HAPPY+CONTENT +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", FALSE + "Building", "Supreme Court", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Building", "Great Wall", "Player", TRUE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_0101_H] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", FALSE + "Building", "Supreme Court", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Building", "Great Wall", "Player", TRUE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_0110_c] ; 0110 = -------------------HAPPY+CONTENT +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", FALSE + "Building", "Supreme Court", "Player", TRUE + "Building", "City Walls", "City", TRUE + "Building", "Great Wall", "Player", FALSE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_0110_H] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", FALSE + "Building", "Supreme Court", "Player", TRUE + "Building", "City Walls", "City", TRUE + "Building", "Great Wall", "Player", FALSE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_0111_c] ; 0111 = -------------------HAPPY+CONTENT +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", FALSE + "Building", "Supreme Court", "Player", TRUE + "Building", "City Walls", "City", TRUE + "Building", "Great Wall", "Player", TRUE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_0111_H] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", FALSE + "Building", "Supreme Court", "Player", TRUE + "Building", "City Walls", "City", TRUE + "Building", "Great Wall", "Player", TRUE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_1000_c] ; 1000 = ---------------------CONTENT +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Building", "Supreme Court", "Player", FALSE + "Building", "City Walls", "City", FALSE + "Building", "Great Wall", "Player", FALSE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_1001_c] ; 1001 = -------------------HAPPY+CONTENT +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Building", "Supreme Court", "Player", FALSE + "Building", "City Walls", "City", FALSE + "Building", "Great Wall", "Player", TRUE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_1001_H] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Building", "Supreme Court", "Player", FALSE + "Building", "City Walls", "City", FALSE + "Building", "Great Wall", "Player", TRUE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_1010_c] ; 1010 = -------------------HAPPY+CONTENT +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Building", "Supreme Court", "Player", FALSE + "Building", "City Walls", "City", TRUE + "Building", "Great Wall", "Player", FALSE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_1010_H] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Building", "Supreme Court", "Player", FALSE + "Building", "City Walls", "City", TRUE + "Building", "Great Wall", "Player", FALSE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_1011_c] ; 1011 = -------------------HAPPY+CONTENT +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Building", "Supreme Court", "Player", FALSE + "Building", "City Walls", "City", TRUE + "Building", "Great Wall", "Player", TRUE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_1011_H] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Building", "Supreme Court", "Player", FALSE + "Building", "City Walls", "City", TRUE + "Building", "Great Wall", "Player", TRUE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_1100_c] ; 1100 = ---------------------CONTENT +type = "Make_Content" +value = 2 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Building", "Supreme Court", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Building", "Great Wall", "Player", FALSE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_1101_c] ; 1101 = -------------------HAPPY+CONTENT +type = "Make_Content" +value = 2 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Building", "Supreme Court", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Building", "Great Wall", "Player", TRUE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_1101_H] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Building", "Supreme Court", "Player", TRUE + "Building", "City Walls", "City", FALSE + "Building", "Great Wall", "Player", TRUE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_1110_c] ; 1110 = -------------------HAPPY+CONTENT +type = "Make_Content" +value = 2 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Building", "Supreme Court", "Player", TRUE + "Building", "City Walls", "City", TRUE + "Building", "Great Wall", "Player", FALSE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_1110_H] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Building", "Supreme Court", "Player", TRUE + "Building", "City Walls", "City", TRUE + "Building", "Great Wall", "Player", FALSE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_1111_c] ; 1111 = -------------------HAPPY+CONTENT +type = "Make_Content" +value = 2 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Building", "Supreme Court", "Player", TRUE + "Building", "City Walls", "City", TRUE + "Building", "Great Wall", "Player", TRUE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +[effect_mausoleum_of_mausolos_1111_H] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Courthouse", "City", TRUE + "Building", "Supreme Court", "Player", TRUE + "Building", "City Walls", "City", TRUE + "Building", "Great Wall", "Player", TRUE + ; - - - - - - - - - - - - - - - - - - - - - - - - - - + "Building", "Mausoleum of Mausolos","Player", TRUE + } +;----------------------------------------------- +[effect_mausoleum_of_mausolos_bribe] +type = "Unit_Bribe_Cost_Pct" +value = 35 +reqs = + { "type", "name", "range" + "Building", "Mausoleum of Mausolos", "Player" + } +[effect_mausoleum_of_mausolos_half_courthouse_corruption] +type = "Output_Waste_Pct" +value = 34 + reqs = + { "type", "name", "range", "present" + "Building", "Mausoleum of Mausolos", "Player", TRUE + "Building", "Supreme Court", "Player", FALSE + "Building", "Courthouse", "City", FALSE + "OutputType", "Trade", "Local", TRUE + } +[effect_mausoleum_of_mausolos_half_courthouse_tile_corruption] +type = "Output_Penalty_Tile" +value = 1 + reqs = + { "type", "name", "range", "present" + "Building", "Mausoleum of Mausolos", "Player", TRUE + "Building", "Supreme Court", "Player", FALSE + "Building", "Courthouse", "City", FALSE + "Gov", "Monarchy", "Player", FALSE + "Gov", "Republic", "Player", FALSE + "Gov", "Democracy", "Player", FALSE + "Gov", "Theocracy", "Player", FALSE + "Gov", "Communism", "Player", FALSE + "Gov", "Nationalism", "Player", FALSE + } +[effect_mausoleum_half_courthouse_spy_resistance] +type = "Spy_Resistant" ;13% reduction of 50% base chance is 6.5% bonus. 50%-6.5%=43.5% success rate +value = 13 + reqs = + { "type", "name", "range", "present" + "Building", "Mausoleum of Mausolos", "Player", TRUE + "Building", "Supreme Court", "Player", FALSE + "Building", "Courthouse", "City", FALSE + } +[effect_mausoleum_half_courthouse_hostile_diplomat] +type = "Action_Resist_Pct" +value = 13 + reqs = + { "type", "name", "range", "present" + "Building", "Mausoleum of Mausolos", "Player", TRUE + "Building", "Supreme Court", "Player", FALSE + "Building", "Courthouse", "City", FALSE + "Action", "Investigate City", "Local", FALSE ;investigate is exclusive bonus below + } +[effect_mausoleum_of_mausolos_investigate_resistance] +type = "Action_Resist_Pct" +value = 54 ; +7% - 54% = -47% ... -0.47 * 80 = 37.6% ... 80%-37.6% = 42.4% ... (85%/2 = 42.5%) ✓ +reqs = + { "type", "name", "range", "present" + "Building", "Mausoleum of Mausolos", "Player", TRUE + "Action", "Investigate City", "Local", TRUE + } +[effect_mausoleum_of_mausolos_culture] +type = "History" +value = 2 +reqs = + { "type", "name", "range" + "Building", "Mausoleum of Mausolos", "City" + } + +;[effect_mausoleum_of_mausolos_incite] = blocked in game.ruleset actionenabler + +;************************************************************************ Medici Bank +[effect_medici_coins_bank] +;Changes require changes to city_force_income_update() in city.js +type = "Coinage_Bonus_Pm" +;EFT_COINAGE_BONUS_PM does precise bankers (not trunc rounding) +value = 140 ; Marketplace + Bank = 2 * .07 = 140 per mille +reqs = + { "type", "name", "range", "present" + "Building", "Medici Bank", "Player", TRUE + "Building", "Marketplace", "City", TRUE + "Building", "Bank", "City", TRUE + "Building","Stock Exchange","City", FALSE + "Gov", "Communism", "Player", FALSE + } +;Changes require changes to city_force_income_update() in city.js +[effect_medici_coins_stock_exchange] +type = "Coinage_Bonus_Pm" +;EFT_COINAGE_BONUS_PM does precise bankers rounding (not trunc rounding) +value = 158 ; MP + Bank + SE = 2.25 * .07 = 157.5 per mille +reqs = + { "type", "name", "range", "present" + "Building", "Medici Bank", "Player", TRUE + "Building", "Marketplace", "City", TRUE + "Building", "Bank", "City", TRUE + "Building", "Stock Exchange","City", TRUE + "Gov", "Communism", "Player", FALSE + } +[effect_medici_gold] +type = "Output_Bonus_2" +; Output_Bonus_2 uses trunc rounding. True +7% is achieved knowing the following: +; 8% with trunc rounding: x̄ = +7.06% gold. (median is slightly lower) +; 7% with trunc rounding: x̄ = +5.96% gold. (median is lower) +; (NB: bonus suffers somewhat more under lower gold tax rates) +; If changing from 7% to another value, use "Medici Rounding.ods" to calibrate +value = 8 +reqs = + { "type", "name", "range", "present" + "Building", "Medici Bank", "Player", TRUE + "Building", "Bank", "City", TRUE + "OutputType", "Gold", "Local", TRUE + "Gov", "Communism", "Player", FALSE + } +;************************************************************************ Michelangelo +[effect_michelangelos_chapel] +type = "Make_Content" +value = 3 +reqs = + { "type", "name", "range" + "Building", "Michelangelo's Chapel", "Player" + } +[effect_michelangelos_chapel_1] +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range" + "Tech", "Theology", "Player" + "Building", "Michelangelo's Chapel", "Player" + } +[effect_michelangelos_chapel_2] +type = "Make_Content" +value = -1 +reqs = + { "type", "name", "range" + "Building", "Michelangelo's Chapel", "Player" + "Gov", "Communism", "Player" + } +;************************************************************************ Oracle +[effect_oracle] +type = "Make_Content" +value = 2 +reqs = + { "type", "name", "range" + "Building", "Temple", "City" + "Building", "Oracle", "Player" + } +[effect_oracle_ziggurat] +type = "Make_Content" +value = 2 +reqs = + { "type", "name", "range", "present" + "Building", "Temple", "City", FALSE + "Building", "Oracle", "Player", TRUE + "Building", "Ziggurat", "City", TRUE + "Gov", "Despotism","Player", TRUE + + } +;************************************************************************ Pasteur Institute +[effect_pasteur_institute] +type = "Make_Happy" +value = 2 + reqs = + { "type", "name", "range" + "Building", "Pasteur Institute", "World" + "Tech", "Microbiology", "Player" + } +;************************************************************************ Pax Dei +[effect_pax_dei] +type = "Has_Senate" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Pax Dei", "World", TRUE + "Tech", "Philosophy","Player",TRUE + "Tech", "Theocracy", "World", FALSE + } +[effect_pax_dei_unit_unhappiness] +type = "Unhappy_Factor" +value = 2 +reqs = + { "type", "name", "range", "present" + "Building", "Pax Dei", "World", TRUE + "Tech", "Philosophy","Player",TRUE + "Tech", "Theocracy", "World", FALSE + } + +;************************************************************************ Pyramids +[effect_pyramids] +type = "Growth_Food" +value = 25 +reqs = + { "type", "name", "range" + "Building", "Pyramids", "Player" + } +[effect_pyramids_1] +type = "Rapture_Grow" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Pyramids", "City" + } +;************************************************************************ Roman Colosseum +[effect_roman_colosseum] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Roman Colosseum","Player" + "Building", "Amphitheatre", "City" + } +[effect_roman_colosseum_luxury] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Roman Colosseum","Player" + "Building", "Amphitheatre", "City" + "CityTile", "Center", "Local" + "OutputType", "Luxury", "Local" + } +;entertainer effect handled in the elvis effects section. +;************************************************************************ Sphinx +[effect_sphinx_tile] +type = "Output_Penalty_Tile" +value = 100 +reqs = + { "type", "name", "range" + "Building", "The Sphinx", "City" + } +[effect_sphinx_luxury] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Building", "The Sphinx", "City" + "CityTile", "Center", "Local" + "OutputType", "Luxury", "Local" + } +[effect_sphinx_corruption] +type = "Output_Waste_Pct" +value = 60 +reqs = + { "type", "name", "range" + "Building", "The Sphinx", "City" + "OutputType", "Trade", "Local" + } +;************************************************************************ Shakespeare +[effect_shakespeares_theatre] +type = "No_Unhappy" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Shakespeare's Theatre", "City" + } +;************************************************************************ Statue of Liberty +[effect_statue_of_liberty] +type = "Any_Government" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Statue of Liberty", "Player" + } +[effect_statue_of_liberty_1] +type = "No_Anarchy" +value = 11 ; (val >= 10) means, no anarchy but switch is NOT immediate +reqs = + { "type", "name", "range" + "Building", "Statue of Liberty", "Player" + } +;************************************************************************ Statue of Zeus +[effect_statue_of_zeus_content_nonrep] +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Statue of Zeus", "Player", TRUE + "Gov", "Republic", "Player", FALSE + "Gov", "Democracy", "Player", FALSE + "Tech", "Tactics", "Player", FALSE + } +[effect_statue_of_zeus_mil_content_magna_carta] +type = "Make_Content_Mil" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Statue of Zeus", "Player", TRUE + "Gov", "Monarchy", "Player", TRUE + "Building", "Magna Carta", "Player", TRUE + "Tech", "Tactics", "Player", FALSE + } +[effect_statue_of_zeus_mil_content_republic] +type = "Make_Content_Mil" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Statue of Zeus", "Player", TRUE + "Gov", "Republic", "Player", TRUE + "Tech", "Tactics", "Player", FALSE + } +[effect_statue_of_zeus_mil_content_democracy] +type = "Make_Content_Mil" +value = 2 +reqs = + { "type", "name", "range", "present" + "Building", "Statue of Zeus", "Player", TRUE + "Gov", "Democracy", "Player", TRUE + "Tech", "Tactics", "Player", FALSE + } +[effect_statue_of_zeus_1] +type = "Unit_Upkeep_Free_Per_City" +value = 4 +reqs = + { "type", "name", "range", "present" + "Building", "Statue of Zeus", "City", TRUE + "Tech", "Tactics", "Player", FALSE + "OutputType", "Shield", "Local", TRUE + } +[effect_statue_of_zeus_2] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Statue of Zeus", "City" + } +[effect_statue_of_zeus_3] +type = "Veteran_Combat" +value = 34 ; [50,33,20,15,15,15] → [67,44,26,20,20,20] +reqs = + { "type", "name", "range", "present" + "Building", "Statue of Zeus", "Player", TRUE + "Tech", "The Republic", "Player", FALSE + } +;************************************************************************ Sun Tzu +[effect_sun_tzus_war_academy] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Sun Tzu's War Academy", "Player", TRUE + "UnitClass", "Land", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_sun_tzus_war_academy_1] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Sun Tzu's War Academy", "Player", TRUE + "UnitClass", "LandAirSea", "Local", TRUE + } +[effect_sun_tzus_war_academy_2] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Sun Tzu's War Academy", "Player", TRUE + "UnitClass", "LandNoKill", "Local", TRUE + } +;************************************************************************ Supreme Court +[effect_supreme_court_corruption1] +type = "Output_Waste_Pct" +value = 60 + reqs = + { "type", "name", "range" + "Building", "Supreme Court", "Player" + "OutputType", "Trade", "Local" + } +[effect_supreme_court_all_govs] +type = "Make_Content" ; keeping in equal with courthouse +value = 1 +reqs = + { "type", "name", "range" + "Building", "Supreme Court", "Player" + } +[effect_supreme_court_incite_occupied] +type = "Incite_Cost_Pct" +value = 300 +reqs = + { "type", "name", "range", "present" + "Building", "Supreme Court", "Player", TRUE + "MaxUnitsOnTile", "0", "Local", FALSE + } +[effect_supreme_court_incite_empty] +type = "Incite_Cost_Pct" +value = 100 +reqs = + { "type", "name", "range", "present" + "MaxUnitsOnTile", "0", "Local", TRUE + "Building", "Supreme Court", "Player", TRUE + } +[effect_supreme_court_upkeep] +type = "Unit_Upkeep_Free_Per_City" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Supreme Court", "Player" + "OutputType", "Shield", "Local" + } +; Removes penalties (Despotism/Anarchy) for tiles >3 output +[effect_supreme_court_tile_corruption] +type = "Output_Penalty_Tile" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Supreme Court", "Player" + } +; HOMELAND SECURITY EFFECTS +; ********************************************************** +[effect_homeland_security_spy_resistance] +type = "Spy_Resistant" +value = 25 ;25% reduction of 50% base chance is 12.5% bonus. 50%-12.5%=37.5% success rate + ; No protection= 1/2, HL = 3/8, CH+HL = 1/4, CH+HL+PS = 1/8 +reqs = + { "type", "name", "range", "present" + "Building", "Homeland Security", "City", TRUE + } +[effect_homeland_security_hostile_diplomat0] +type = "Action_Odds_Pct" +value = -25 ; 25% of 80% base rate = 20% + ; No protection = 4/5, HL = 3/5, CH+HL = 2/5, CH+HL+PS = 1/5 +reqs = + { "type", "name", "range", "present" + "Building", "Homeland Security", "City", TRUE + "Action", "Steal Tech", "Local", TRUE + } +[effect_homeland_security_hostile_diplomat_1] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Homeland Security", "City", TRUE + "Action", "Steal Tech Escape Expected", "Local", TRUE + } +[effect_homeland_security_hostile_diplomat_2] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Homeland Security", "City", TRUE + "Action", "Targeted Steal Tech", "Local", TRUE + } +[effect_homeland_security_hostile_diplomat_3] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Homeland Security", "City", TRUE + "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE + } +[effect_homeland_security_hostile_diplomat_4] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Homeland Security", "City", TRUE + "Action", "Sabotage City", "Local", TRUE + } +[effect_homeland_security_hostile_diplomat_5] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Homeland Security", "City", TRUE + "Action", "Sabotage City Escape", "Local", TRUE + } +[effect_homeland_security_hostile_diplomat_6] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Homeland Security", "City", TRUE + "Action", "Targeted Sabotage City", "Local", TRUE + } +[effect_homeland_security_hostile_diplomat_7] +type = "Action_Odds_Pct" +value = -25 ;// -25*.8 = -20 +reqs = + { "type", "name", "range", "present" + "Building", "Homeland Security", "City", TRUE + "Action", "Targeted Sabotage City Escape", "Local", TRUE + } +[effect_homeland_security_hostile_diplomat_8] +type = "Action_Odds_Pct" +value = -25 ;40 minus 25%*80 = 20% +reqs = + { "type", "name", "range", "present" + "Building", "Homeland Security", "City", TRUE + "Action", "Steal Maps Escape", "Local", TRUE + } +[effect_homeland_security_hostile_diplomat_9] +type = "Action_Odds_Pct" +value = -25 +reqs = + { "type", "name", "range", "present" + "Building", "Homeland Security", "City", TRUE + "Action", "Steal Maps", "Local", TRUE + } +[effect_homeland_security_hostile_diplomat_10] +type = "Action_Odds_Pct" +value = -25 +reqs = + { "type", "name", "range", "present" + "Building", "Homeland Security", "City", TRUE + "Action", "Poison City Escape", "Local", TRUE + } +[effect_homeland_security_hostile_diplomat_11] +type = "Action_Odds_Pct" +value = -25 +reqs = + { "type", "name", "range", "present" + "Building", "Homeland Security", "City", TRUE + "Action", "Incite City", "Local", TRUE + } +[effect_homeland_security_hostile_diplomat_12] +type = "Action_Odds_Pct" +value = -25 +reqs = + { "type", "name", "range", "present" + "Building", "Homeland Security", "City", TRUE + "Action", "Incite City Escape", "Local", TRUE + } +;************************************************************************ Temple of Artemis +[effect_temple_of_artemis] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Temple", "City" + "Building", "Temple of Artemis", "Player" + "CityTile", "Center", "Local" + "OutputType", "Luxury", "Local" + } +;Note: the city applies +1 to 0-shield city tiles on grass,swamp,hills,tundra +;Thus this bonus negates the condition of getting that +1 and needs a +;compensating +1 further below +[effect_temple_of_artemis_1] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Temple", "City" + "Building", "Temple of Artemis", "Player" + "CityTile", "Center", "Local" + "OutputType", "Shield", "Local" + } +;-------- +;Give the city its extra shield if it was built on a 0-shield (grass/hills/swamp/tundra) +;tile or +1-shield resource (grass-shield,fur) +[effect_temple_of_artemis_1a] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Terrain", "Grassland", "Local" + "Building", "Temple", "City" + "Building", "Temple of Artemis","Player" + "CityTile", "Center", "Local" + "OutputType", "Shield", "Local" + } +[effect_temple_of_artemis_1b] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range", "present" + "Terrain", "Hills", "Local", TRUE + "Extra", "Coal", "Local", FALSE ; only apply to 0 shield tile + "Extra", "Mine", "Local", FALSE ; only apply to 0 shield tile + "Building", "Temple", "City", TRUE + "Building", "Temple of Artemis", "Player", TRUE + "CityTile", "Center", "Local", TRUE + "OutputType", "Shield", "Local", TRUE + } +[effect_temple_of_artemis_1d] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range", "present" + "Terrain", "Swamp", "Local", TRUE + "Building", "Temple", "City", TRUE + "Building", "Temple of Artemis", "Player" + "CityTile", "Center", "Local", TRUE + "OutputType", "Shield", "Local", TRUE + "Extra", "Peat", "Local", FALSE ; only apply to 0 shield tile + } +[effect_temple_of_artemis_1e] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range", "present" + "Terrain", "Tundra", "Local", TRUE + "Extra", "Elk", "Local", FALSE ; only apply to 0 shield tile + "Building", "Temple", "City", TRUE + "Building", "Temple of Artemis", "Player", TRUE + "CityTile", "Center", "Local", TRUE + "OutputType", "Shield", "Local", TRUE + } +;------ +[effect_temple_of_artemis_2] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Temple", "City" + "Building", "Temple of Artemis", "Player" + "CityTile", "Center", "Local" + "OutputType", "Gold", "Local" + } +[effect_temple_of_artemis_3] +type = "Output_Add_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Temple", "City" + "Building", "Temple of Artemis", "Player" + "CityTile", "Center", "Local" + "OutputType", "Science", "Local" + } +;************************************************************************ Tesla +[effect_teslas_laboratory] +type = "Upgrade_Unit" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Tesla's Laboratory", "Player" + } +[effect_tesla_laboratory2] +type = "Upgrade_Price_Pct" +value = -20 +reqs = + { "type", "name", "range" + "Building", "Tesla's Laboratory", "Player" + } +;************************************************************************ The Internet +[effect_internet] +type = "Output_Bonus" +value = 100 +reqs = + { "type", "name", "range" + "Building", "Research Lab", "City" + "Building", "The Internet", "Player" + "OutputType", "Science", "Local" + } + +;************************************************************************ United Nations +[effect_united_nations] +type = "Has_Senate" +value = 1 +reqs = + { "type", "name", "range" + "Building", "United Nations", "World" + } +[effect_united_nations_1] +type = "Revolution_Unhappiness" +value = 2 +reqs = + { "type", "name", "range", "present" + "Building", "United Nations", "World", TRUE +; Without !present UN would make revolution less likely instead +; of enabling it with Democracy (value 2 -> 4 instead of 0 -> 2) + "Gov", "Democracy", "Player", FALSE + } + +;[effect_foreign_national_tuner] +;type = "Enemy_Citizen_Unhappy_Pct" +;value = 50 +;reqs = +; { +; +; } +;************************************************************************ Voyage of Darwin +; There are nasty hard-coded things to the original Wonder, so it had +; to be given a name change (Voyage of Darwin) to avoid messy problems. +[effect_voyage_of_darwin] +type = "Output_Inc_Tile" +value = 1 +reqs = + { "type", "name", "range" + "Building", "Voyage of Darwin", "City" + "OutputType", "Trade", "Local" + } +;************************************************************************ Women's Suffrage small wonder version +[effect_womens_suffrage_republic] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range", "present" + "Gov", "Republic", "Player", TRUE + "Building", "Women's Suffrage", "Player", TRUE + "Building", "Women's Suffrage​", "Player", FALSE + ; has zero-width space for the great wonder. can't get double women's suffrage bonus. + } +; causes +1 unhappy for all cities, usually over s2 or s3 (depending on empire size) +[effect_no_womens_suffrage_unhappy_republic] +type = "Empire_Size_Base" +value = -13 +reqs = + { "type", "name", "range", "present" + "Gov", "Republic", "Player", TRUE + ; small. if you have neither you get the unhappy + "Building", "Women's Suffrage", "Player", FALSE + ; great. zero-width space for the great wonder + "Building", "Women's Suffrage​", "Player", FALSE + ; great. zero-width space for the great wonder + "Building", "Women's Suffrage​", "World", TRUE + } +[effect_womens_suffrage_democracy] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range", "present" + "Gov", "Democracy", "Player", TRUE + ; small wonder. if you own neither you get the unhappy: + "Building", "Women's Suffrage", "Player", TRUE + ; has zero-width space for the great wonder. can't get double women's suffrage bonus. + "Building", "Women's Suffrage​", "Player", FALSE + } +; causes +1 unhappy for all cities, usually over s2 or s3 (depending on empire size) +[effect_no_womens_suffrage_unhappy_democracy] +type = "Empire_Size_Base" +value = -14 +reqs = + { "type", "name", "range", "present" + "Gov", "Democracy", "Player", TRUE + ; small wonder. if you own neither you get the unhappy: + "Building", "Women's Suffrage", "Player", FALSE + ; great wonder. zero-width space for the great wonder: + "Building", "Women's Suffrage​", "Player", FALSE + ; great wonder. has zero-width space for the great wonder: + "Building", "Women's Suffrage​", "World", TRUE + } +;************************************************************************ Women's Suffrage great wonder version +[effect_womens_suffrage_gw_republic] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Republic", "Player" + "Building", "Women's Suffrage​", "Player" ; has zero-width space for the great wonder + } +[effect_womens_suffrage_gw_democracy] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Democracy", "Player" + "Building", "Women's Suffrage​", "Player" ; has zero-width space for the great wonder + } +;************************************************************************ Ziggurat +[effect_ziggurat_visible] +type = "Visible_Walls" +value = 4 +reqs = + { "type", "name", "range", "present" + "Building", "Ziggurat", "City", TRUE + "Gov", "Despotism", "Player", TRUE + "Building", "Fortifications", "City", FALSE + } +[effect_ziggurat_barracks_effect] +type = "Veteran_Build" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Ziggurat", "City", TRUE + "Gov", "Despotism", "Player",TRUE + "Building", "Barracks", "City", FALSE + "UnitClass","Land", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "UnitFlag", "NoVeteran", "Local", FALSE + } +[effect_ziggurat_temple] +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range","present" + "Building", "Ziggurat", "City", TRUE + "Gov", "Despotism","Player",TRUE + "Building", "Temple", "City", FALSE + } +[effect_ziggurat_temple_2] +type = "Make_Content" +value = 1 +reqs = + { "type", "name", "range", "present" + "Building", "Ziggurat", "City", TRUE + "Gov", "Despotism", "Player", TRUE + "Tech", "Mysticism", "Player", TRUE + "Building", "Temple", "City", FALSE + } +[effect_ziggurat_granary] +type = "Growth_Food" +value = 50 +reqs = + { "type", "name", "range","present" + "Building", "Ziggurat", "City", TRUE + "Gov", "Despotism","Player",TRUE + "Building", "Granary", "City", FALSE + } +[effect_ziggurat_fortifications] +type = "Defend_Bonus" +value = 75 ; 1.75x vs everything +reqs = + { "type", "name", "range","present" + "Building", "Ziggurat", "City", TRUE + "Gov", "Despotism", "Player",TRUE + "Building", "Fortifications", "City", FALSE + "Building", "City Walls", "City", FALSE + "Building", "Great Wall", "Player",FALSE + } +;Ziggurat semi-relocation of capital effects-------------------------- +[effect_ziggurat_palace_gov_center] +type = "Gov_Center" +value = 1 +reqs = + { "type", "name", "range","present" + "Building", "Ziggurat", "City", TRUE + "Gov", "Despotism","Player",TRUE + "Building", "Palace", "City", FALSE + } +[effect_ziggurat_palace_corruption] +type = "Output_Waste_Pct" +value = 60 +reqs = + { "type", "name", "range","present" + "Building", "Ziggurat","City", TRUE + "Gov", "Despotism","Player",TRUE + "Building", "Palace", "City", FALSE + "OutputType","Trade", "Local", TRUE + } +[effect_ziggurat_palace_happy] +type = "Make_Happy" +value = 1 +reqs = + { "type", "name", "range","present" + "Building", "Ziggurat", "City", TRUE + "Gov", "Despotism","Player",TRUE + "Building", "Palace", "City", FALSE + } +[effect_ziggurat_palace_despotism_prod_bonus] +type = "Output_Bonus" +value = 75 +reqs = + { "type", "name", "range","present" + "Building", "Ziggurat", "City", TRUE + "Gov", "Despotism","Player", TRUE + "OutputType","Shield", "Local", TRUE + } +;------------------------------------------------------------------------------- + +; Calibrate sabotage City Walls odds to 50% +[effect_siege_ram_city_walls] +type = "Action_Odds_Pct" +value = 100 ; diplomats.c::diplomat_sabotage does separate 50% odds of failure + ; which is immune to this Action_Odds_Pct, therefore ensure it passes + ; first roll every time, leaving a simple 50% chance on second check. + ; (25% if city has Palace or Ecclesiastical Palace) +reqs = + { "type", "name", "range", "present" + "UnitType", "Siege Ram", "Local", TRUE + "Action", "Targeted Sabotage City Escape", "Local", TRUE + } + +[effect_calendar_base] +type = "Turn_Years" +value = 100 + +; 100 - 50 = 50 +[effect_calendar_1] +type = "Turn_Years" +value = -50 +reqs = + { "type", "name", "range" + "MinYear", "0", "World" + } + +; 50 - 25 = 25 +[effect_calendar_2] +type = "Turn_Years" +value = -25 +reqs = + { "type", "name", "range" + "MinYear", "1000", "World" + } + +; 25 - 15 = 10 +[effect_calendar_3] +type = "Turn_Years" +value = -15 +reqs = + { "type", "name", "range" + "MinYear", "1800", "World" + } + +; 10 - 5 = 5 +[effect_calendar_4] +type = "Turn_Years" +value = -5 +reqs = + { "type", "name", "range" + "MinYear", "1900", "World" + } + +; 5 - 3 = 2 +[effect_calendar_5] +type = "Turn_Years" +value = -3 +reqs = + { "type", "name", "range" + "MinYear", "1950", "World" + } + +; 2 - 1 = 1 +[effect_calendar_6] +type = "Turn_Years" +value = -1 +reqs = + { "type", "name", "range" + "MinYear", "2012", "World" + } + +[effect_tech_cost_base] +type = "Tech_Cost_Factor" +value = 1 + +; Cities can always work tiles +[effect_tile_workable] +type = "Tile_Workable" +value = 1 +reqs = + { "type", "name", "range", "present" + "Terrain", "Inaccessible", "Local", FALSE + } + +; Each city has at least one slot to build units +[effect_city_build_slots_basic] +type = "City_Build_Slots" +value = 1 + +; Capital has two slots +[effect_city_build_slots_capital] +type = "City_Build_Slots" +value = 1 +reqs = + { "type", "name", "range", "present" + "Tech", "Conscription", "Player", TRUE + "Building", "Palace", "City", TRUE + } +[effect_city_build_slots_capital2] +type = "City_Build_Slots" +value = 1 +reqs = + { "type", "name", "range", "present" + "Tech", "Conscription", "Player", TRUE + "Building", "Ecclesiastical Palace", "City", TRUE + } +[effect_city_build_slots_magna_carta] +type = "City_Build_Slots" +value = 1 +reqs = + { "type", "name", "range", "present" + "Gov", "Monarchy", "Player", TRUE + "Building", "Magna Carta", "City", TRUE + } +[effect_city_build_slots_factory] +type = "City_Build_Slots" +value = 1 +reqs = + { "type", "name", "range", "present" + "Tech", "Conscription", "Player", TRUE + "Building", "Factory", "City", TRUE + "Building", "Hoover Dam", "City", FALSE + } +[effect_city_build_slots_mfg_plant] +type = "City_Build_Slots" +value = 1 +reqs = + { "type", "name", "range", "present" + "Tech", "Conscription", "Player", TRUE + "Building", "Mfg. Plant", "City", TRUE + "Building", "Hoover Dam", "City", FALSE + } + +[effect_city_image_1] +type = "City_Image" +value = 1 +reqs = + { "type", "name", "range" + "MinSize", "4", "City" + } + +[effect_city_image_2] +type = "City_Image" +value = 1 +reqs = + { "type", "name", "range" + "MinSize", "8", "City" + } + +[effect_city_image_3] +type = "City_Image" +value = 1 +reqs = + { "type", "name", "range" + "MinSize", "12", "City" + } + +[effect_city_image_4] +type = "City_Image" +value = 1 +reqs = + { "type", "name", "range" + "MinSize", "16", "City" + } + +[effect_pollution] +type = "Output_Tile_Punish_Pct" +value = 50 +reqs = + { "type", "name", "range", "present" + "Extra", "Pollution", "Local", TRUE + "Extra", "Fallout", "Local", FALSE + } + +[effect_fallout] +type = "Output_Tile_Punish_Pct" +value = 50 +reqs = + { "type", "name", "range", "present" + "Extra", "Fallout", "Local", TRUE + "Extra", "Pollution", "Local", FALSE + } + +[effect_pollution_fallout] +type = "Output_Tile_Punish_Pct" +value = 75 +reqs = + { "type", "name", "range" + "Extra", "Fallout", "Local" + "Extra", "Pollution", "Local" + } + +; **** Action Odds for Hostile Diplomatic Actions ******* +;******************************************************** +;Jan 2021 this effect should be non-zero so that it triggers +;not showing 100% in pop-up odds, since certain improvement +;effects may now disallow this action. +[effect_no_free_investigation] +type = "Action_Odds_Pct" +value = 7 ;80 plus 7%*80 = 85% +reqs = + { "type", "name", "range", "present" + "Action", "Investigate City", "Local", TRUE + } +[effect_satellite_espionage] +type = "Action_Odds_Pct" +value = 1000 ;ensure 100% +reqs = + { "type", "name", "range", "present" + "Action", "Investigate City", "Local", TRUE + "UnitType", "Satellite", "Local", TRUE + } + +[effect_reduced_chance_steal_maps_escape] +type = "Action_Odds_Pct" +value = -32 ;80 minus 31%*80 = 55% +reqs = + { "type", "name", "range", "present" + "Action", "Steal Maps Escape", "Local", TRUE + } +[effect_reduced_chance_steal_maps] +type = "Action_Odds_Pct" +value = -13 ;80 minus 13%*80 = 70% +reqs = + { "type", "name", "range", "present" + "Action", "Steal Maps", "Local", TRUE + } +[effect_reduced_targeted_sabotage_city] +type = "Action_Odds_Pct" +value = -32 ;80 minus 31%*80 = 55% +reqs = + { "type", "name", "range", "present" + "Action", "Targeted Sabotage City Escape", "Local", TRUE + } +[effect_reduced_poison_city_escape] +type = "Action_Odds_Pct" +value = -13 ;80 minus 13%*80 = 70% +reqs = + { "type", "name", "range", "present" + "Action", "Poison City Escape", "Local", TRUE + } +[effect_increased_sabotage_foreigners_in_non_original1] +type = "Action_Odds_Pct" +value = 13 ;// 13%*80% = +10.4% +reqs = + { "type", "name", "range","present" + "CityStatus", "OwnedByOriginal", "City", FALSE + "MinForeignPct", "1", "City", FALSE + "Action", "Sabotage City", "Local",TRUE + } +[effect_increased_sabotage_foreigners_in_non_original2] +type = "Action_Odds_Pct" +value = 13 ;// 13%*80% = +10.4% +reqs = + { "type", "name", "range","present" + "CityStatus", "OwnedByOriginal", "City", FALSE + "MinForeignPct", "1", "City", FALSE + "Action", "Sabotage City Escape", "Local", TRUE + } +[effect_increased_sabotage_foreigners_in_non_original3] +type = "Action_Odds_Pct" +value = 13 ;// 13%*80% = +10.4% +reqs = + { "type", "name", "range","present" + "CityStatus", "OwnedByOriginal", "City", FALSE + "MinForeignPct", "1", "City", FALSE + "Action", "Targeted Sabotage City", "Local", TRUE + } +[effect_increased_sabotage_foreigners_in_non_original4] +type = "Action_Odds_Pct" +value = 13 ;// 13%*80% = +10.4% +reqs = + { "type", "name", "range","present" + "CityStatus", "OwnedByOriginal", "City", FALSE + "MinForeignPct", "1", "City", FALSE + "Action", "Targeted Sabotage City Escape", "Local", TRUE + } +[effect_sabotage_city_production_city_54percent] +type = "Action_Odds_Pct" +value = -32 ;; 32%*80% = 26%. 80%-26%=54%, same as all targeted actions and identical to if alternatively doing action from targeted building pop-up. +reqs = + { "type", "name", "range", "present" + "Action", "Sabotage City Production Escape", "Local", TRUE + } + +;********************************************************* +; Bribe and Incite Costs ********************************* +[effect_unit_bribe_cost_settlers] +type = "Unit_Bribe_Cost_Pct" +value = -50 +reqs = + { "type", "name", "range" + "UnitFlag", "NonMil", "Local" + } +[effect_bribe_democracy] +type = "Unit_Bribe_Cost_Pct" +value = 200 +reqs = + { "type", "name", "range" + "Gov", "Democracy", "Player" + } +[effect_bribe_theocracy] +type = "Unit_Bribe_Cost_Pct" +value = 100 +reqs = + { "type", "name", "range" + "Gov", "Theocracy", "Player" + } +[effect_ship_bribe_correction] ; ships far from home were too cheap and it just wasn't right +type = "Unit_Bribe_Cost_Pct" +value = 100 +reqs = + { "type", "name", "range" + "UnitFlag", "BadCityDefender", "Local" + } +[effect_incite_theocracy] +type = "Incite_Cost_Pct" +value = 100 +reqs = + { "type", "name", "range", "present" + "Gov", "Theocracy", "Player", TRUE + } +[effect_incite_democracy] +type = "Incite_Cost_Pct" +value = 200 +reqs = + { "type", "name", "range", "present" + "Gov", "Democracy", "Player", TRUE + } +[effect_incite_nationalism1] +type = "Incite_Cost_Pct" +value = 200 +reqs = + { "type", "name", "range" + "Gov", "Nationalism", "Player" + "CityStatus", "OwnedByOriginal", "City" + } +[effect_incite_nationalism2] +type = "Incite_Cost_Pct" +value = -67 +reqs = + { "type", "name", "range", "present" + "Gov", "Nationalism", "Player", TRUE + "CityStatus", "OwnedByOriginal", "City", FALSE + } + +;********************************************************* + + +;LOSING MOVES FROM ILLEGAL ACTION NEVER MADE SENSE. JUST FORBID IT AND LET THEM PICK A LEGAL ACTION. +;[effect_illegal_action_move_cost_base] +;type = "Illegal_Action_Move_Cost" +;value = 0 +;reqs = +; { "type", "name", "range", "present" +; "Action", "Found City", "Local", FALSE +; "Action", "Join City", "Local", FALSE +; } + +;CASUS BELLI INCIDENTS +;******************************************************** +[effect_incident_caught_spying_on_city] +type = "Casus_Belli_Caught" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Investigate City", "Local", TRUE + "DiplRel", "War", "Local", FALSE + "DiplRel", "Alliance", "Local", FALSE + } +[effect_incident_success_spy_attack] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Spy Attack", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_caught_spy_attack] +type = "Casus_Belli_Caught" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Spy Attack", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_success_pillage] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Pillage", "Local", TRUE + "DiplRel", "War", "Local", FALSE + "DiplRel", "Alliance", "Local", FALSE + } +[effect_incident_success_sneaky_road] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Build Road", "Local", TRUE + "DiplRel", "War", "Local", FALSE + "DiplRel", "Alliance", "Local", FALSE + } +[effect_incident_success_sneaky_fort] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Build Base", "Local", TRUE + "DiplRel", "War", "Local", FALSE + "DiplRel", "Alliance", "Local", FALSE + } +[effect_incident_success_sneaky_transform] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Transform Terrain", "Local", TRUE + "DiplRel", "War", "Local", FALSE + "DiplRel", "Alliance", "Local", FALSE + } +[effect_incident_caught_steal_maps1] +type = "Casus_Belli_Caught" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Steal Maps Escape", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_success_steal_maps1] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Steal Maps Escape", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_caught_steal_maps2] +type = "Casus_Belli_Caught" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Steal Maps", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_success_steal_maps2] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Steal Maps", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_caught_steal_tech] +type = "Casus_Belli_Caught" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Steal Tech", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_success_steal_tech] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Steal Tech", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_caught_steal_tech_esc] +type = "Casus_Belli_Caught" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Steal Tech Escape Expected", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_success_steal_tech_esc] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Steal Tech Escape Expected", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_caught_tgt_steal_tech] +type = "Casus_Belli_Caught" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_success_tgt_steal_tech] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Targeted Steal Tech Escape Expected", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_success_bribe_unit] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Bribe Unit", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_success_capture_unit] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Capture Units", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_success_sabotage_unit] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Sabotage Unit Escape", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_caught_sabotage_unit] +type = "Casus_Belli_Caught" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Sabotage Unit Escape", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_success_sabotage_unit_1] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Sabotage Unit", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_caught_sabotage_unit_1] +type = "Casus_Belli_Caught" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Sabotage Unit", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_success_incite] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Incite City", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_caught_incite] +type = "Casus_Belli_Caught" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Incite City", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_success_incite_esc] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Incite City Escape", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_caught_incite_esc] +type = "Casus_Belli_Caught" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Incite City Escape", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_success_poison] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Poison City Escape", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_caught_poison] +type = "Casus_Belli_Caught" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Poison City Escape", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_success_sabotage_city] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Sabotage City", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_caught_sabotage_city] +type = "Casus_Belli_Caught" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Sabotage City", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_success_sabotage_city_esc] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Sabotage City Escape", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_caught_sabotage_city_esc] +type = "Casus_Belli_Caught" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Sabotage City Escape", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_success_tgt_sabotage_city] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Targeted Sabotage City Escape", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_caught_tgt_sabotage_city] +type = "Casus_Belli_Caught" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Targeted Sabotage City Escape", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_success_sabotage_city_production] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Sabotage City Production Escape", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_caught_sabotage_city_production] +type = "Casus_Belli_Caught" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Sabotage City Production Escape", "Local", TRUE + "DiplRel", "War", "Local", FALSE + } +[effect_incident_success_explode_nuke] +type = "Casus_Belli_Success" +value = 1000 +reqs = + { "type", "name", "range", "present" + "Action", "Explode Nuclear", "Local", TRUE + "DiplRel", "Foreign", "Local", TRUE ; no outrage at nuking yourself + } +[effect_incident_success_nuke_city] +type = "Casus_Belli_Success" +value = 1000 +reqs = + { "type", "name", "range", "present" + "Action", "Nuke City", "Local", TRUE + "DiplRel", "Foreign", "Local", TRUE ; no outrage at nuking yourself + } +[effect_incident_success_nuke_unit] +type = "Casus_Belli_Success" +value = 1000 +reqs = + { "type", "name", "range", "present" + "Action", "Nuke Units", "Local", TRUE + "DiplRel", "Foreign", "Local", TRUE ; no outrage at nuking yourself + } + +[effect_incident_success_found_city] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Found City", "Local", TRUE + "DiplRel", "War", "Local", FALSE + "DiplRel", "Alliance", "Local", FALSE + } +[effect_incident_paradrop_invasion] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "Action", "Paradrop Unit", "Local", TRUE + "DiplRel", "War", "Local", FALSE + "DiplRel", "Alliance", "Local", FALSE + } + +;******************************************************************** + +; Double (+100%) buy cost for Great Wonders +[effect_great_wonder_buy_cost] +type = "Building_Buy_Cost_Pct" +value = 100 +reqs = + { "type", "name", "range" + "BuildingGenus", "GreatWonder", "Local" + } + +; Double buy cost for Small Wonders except Palaces +[effect_small_wonder_buy_cost] +type = "Building_Buy_Cost_Pct" +value = 100 +reqs = + { "type", "name", "range", "present" + "BuildingGenus", "SmallWonder", "Local", TRUE + "Building", "Palace", "Local", FALSE + "Building", "Ecclesiastical Palace", "Local", FALSE + } + +;******************************************************************** MOVE COSTS +;TODO: by having control over embark/board and disembark/deboard, +;we can gracefully upgrade mechanics to minimalist nirvana: +;[effect_action_success_move_cost_embark] +;type = "Action_Success_Actor_Move_Cost" +;value = 0 +;reqs = +; { "type", "name", "range", "present" +; "Action", "Transport Embark", "Local", TRUE +; } +;[effect_action_success_move_cost_disembark] +;type = "Action_Success_Actor_Move_Cost" +;value = 0 +;reqs = +; { "type", "name", "range", "present" +; "Action", "Transport Disembark", "Local", TRUE +; } +;[effect_action_success_move_cost_board] +;type = "Action_Success_Actor_Move_Cost" +;value = 0 +;reqs = +; { "type", "name", "range", "present" +; "Action", "Transport Board", "Local", TRUE +; } +;[effect_action_success_move_cost_deboard] +;type = "Action_Success_Actor_Move_Cost" +;value = 0 +;reqs = +; { "type", "name", "range", "present" +; "Action", "Transport Deboard", "Local", TRUE ;renamed to Transport Deboard later. +; } + +;[effect_action_success_siege_ram_city_walls] +;type = "Action_Success_Actor_Move_Cost" +;value = 9 ; 1 move +;reqs = +; { "type", "name", "range", "present" +; "Action", "Targeted Sabotage City Escape", "Local", TRUE +; "UnitType", "Siege Ram", LOCAL, TRUE +; } + +[effect_action_success_move_cost_embassy] +type = "Action_Success_Actor_Move_Cost" +value = 3 ; 1/3 move +reqs = + { "type", "name", "range", "present" + "Action", "Establish Embassy", "Local", TRUE + } + +[effect_action_success_move_cost_investigate] +type = "Action_Success_Actor_Move_Cost" +value = 3 ; 1/3 move +reqs = + { "type", "name", "range", "present" + "Action", "Investigate City", "Local", TRUE + } + +[effect_action_success_move_cost_capture] +type = "Action_Success_Actor_Move_Cost" +value = 9 ; 1 move +reqs = + { "type", "name", "range", "present" + "Action", "Capture Units", "Local", TRUE + } + +[effect_action_success_move_cost_expel] +type = "Action_Success_Actor_Move_Cost" +value = 6 ; 2/3 move +reqs = + { "type", "name", "range", "present" + "Action", "Expel Unit", "Local", TRUE + } + +;TODO: We no longer need bitfields for move cost of SUA and could code the move cost in here +[effect_action_success_move_cost_bombard] +type = "Action_Success_Actor_Move_Cost" +value = 0 ; currently, keep using bitfield for move cost +reqs = + { "type", "name", "range", "present" + "Action", "Bombard", "Local", TRUE + } + +;Expelled units lose all move points. +[effect_action_success_move_cost_expelled] +type = "Action_Success_Target_Move_Cost" +value = 65535 +reqs = + { "type", "name", "range", "present" + "Action", "Expel Unit", "Local", TRUE + } +;******************************************************************** + +; The Well-Digger can move 3 before you know Pottery or Alphabet. +[effect_welldigger_movement] +type = "Move_Bonus" +value = -27 +reqs = + { + "type", "name", "range", "present" + "UnitFlag", "Well-Digger", "Local", TRUE + "Tech", "Alphabet", "Player", TRUE + } +[effect_welldigger_movement_1] +type = "Move_Bonus" +value = -27 +reqs = + { + "type", "name", "range", "present" + "UnitFlag", "Well-Digger", "Local", TRUE + "Tech", "Pottery", "Player", TRUE + } + +;******** DESPOTISM EFFECTS **************************************** +;DESPOTISM No disorder from starvation +[effect_despotism_gulag] +type = "Gulag" +value = 2 ; 2 martial law units needed to suppress disorder from Famine +reqs = + { + "type", "name", "range" + "Gov", "Despotism", "Player" + } +;******** THEOCRACY EFFECTS **************************************** +[effect_sabotage_bonus_theocracy1] +type = "Action_Odds_Pct" +value = 13 ;// 13%*80% = 10.4% +reqs = + { "type", "name", "range", "present" + "Gov", "Theocracy", "Player", TRUE + "Action", "Sabotage City", "Local", TRUE + } +[effect_sabotage_bonus_theocracy2] +type = "Action_Odds_Pct" +value = 13 ;// 13%*80% = 10.4% +reqs = + { "type", "name", "range", "present" + "Gov", "Theocracy", "Player", TRUE + "Action", "Sabotage City Escape", "Local", TRUE + } +[effect_sabotage_bonus_theocracy3] +type = "Action_Odds_Pct" +value = 13 ;// 13%*80% = 10.4% (int rounds to 10%) +reqs = + { "type", "name", "range", "present" + "Gov", "Theocracy", "Player", TRUE + "Action", "Targeted Sabotage City", "Local", TRUE + } +[effect_sabotage_bonus_theocracy4] +type = "Action_Odds_Pct" +value = 13 ;// 13%*80% = 10.4% (int rounds to 10%) +reqs = + { "type", "name", "range", "present" + "Gov", "Theocracy", "Player", TRUE + "Action", "Targeted Sabotage City Escape", "Local", TRUE + } +[effect_zealots_theocracy] +type = "Fanatics" +value = 1 +reqs = + { "type", "name", "range" + "Gov", "Theocracy", "Player" + } +[effect_retiring_falconeers_theocracy] +type = "Retire_Pct" +value = 15 +reqs = + { "type", "name", "range", "present" + "UnitType", "Falconeers", "Local", TRUE + "Age", "5", "Local", TRUE + "Gov", "Theocracy", "Player",FALSE + "CityTile", "Center", "Local", FALSE + } + +;******** NATIONALISM EFFECTS ************************************** +;NATIONALISM WORKER-TYPES MOVE BONUS +[effect_worker_movement_nationalism] +type = "Move_Bonus" +value = 1 +reqs = + { + "type", "name", "range", "present" + "UnitFlag", "Infra", "Local", TRUE + "Gov", "Nationalism", "Player", TRUE + } +[effect_worker_workrate_nationalism] +type = "Unit_Work_Pct" ;Unit_Work_Frag_Bonus +value = 34 +reqs = + { + "type", "name", "range", "present" + "UnitFlag", "Infra", "Local", TRUE + "Gov", "Nationalism", "Player", TRUE + } +;NATIONALISM ARMOR MOVE BONUS +[effect_armor_movement_nationalism] +type = "Move_Bonus" +value = 9 +reqs = + { + "type", "name", "range", "present" + "UnitType", "Armor", "Local", TRUE + "Gov", "Nationalism", "Player", TRUE + } +[effect_armor2_movement_nationalism] +type = "Move_Bonus" +value = 9 +reqs = + { + "type", "name", "range", "present" + "UnitType", "Armor II", "Local", TRUE + "Gov", "Nationalism", "Player", TRUE + } +; Police Stations Cost less +[effect_nationalism_cheaper_police_stations] +type = "Building_Build_Cost_Pct" +value = -20; 50-10 = 40 +reqs = + { "type", "name", "range", "present" + "Gov", "Nationalism", "Player", TRUE + "Building", "Police Station", "Local", TRUE + } +;NATIONALISM 25% DISCOUNT MILITARY UPGRADES +[effect_nationalism_military_upgrades] +type = "Upgrade_Price_Pct" +value = -25 +reqs = + { + "type", "name", "range", "present" + "Gov", "Nationalism", "Player", TRUE + ; "UnitFlag", "NonMil", "Local", FALSE ;can't seem to access this. + } +;******** COMMUNISM EFFECTS **************************************** +;Proletarians useless unless communist. +[effect_proletarian_movement_penalty] +type = "Move_Bonus" +value = -18 +reqs = + { + "type", "name", "range", "present" + "UnitType", "Proletarians", "Local", TRUE + "Gov", "Communism", "Player", FALSE + } +[effect_proletarian_work_rate_penalty] +type = "Unit_Work_Frag_Bonus" +value = -18 +reqs = + { + "type", "name", "range", "present" + "UnitType", "Proletarians", "Local", TRUE + "Gov", "Communism", "Player", FALSE + } + +;COMMUNISM 5 shield discount Riflemen +[effect_communist_riflemen] +type = "Unit_Build_Cost_Pct" +value = -12 +reqs = + { + "type", "name", "range", "present" + "UnitType", "Riflemen", "Local", TRUE + "Gov", "Communism", "Player", TRUE + } +;COMMUNISM 10 shield discount "Sturmovik Effect". +[effect_communist_dive_bombers] +type = "Unit_Build_Cost_Pct" +value = -16 +reqs = + { + "type", "name", "range", "present" + "UnitType", "Dive Bomber", "Local", TRUE + "Gov", "Communism", "Player", TRUE + } +;COMMUNISM 10 shield discount Armor +[effect_communist_armor] +type = "Unit_Build_Cost_Pct" +value = -12 +reqs = + { + "type", "name", "range", "present" + "UnitType", "Armor", "Local", TRUE + "Gov", "Communism", "Player", TRUE + } +;COMMUNISM No disorder from starvation +[effect_communist_gulag] +type = "Gulag" ; 2 martial law units needed to suppress disorder from Famine +value = 3 ; or 1 + Police Station. +reqs = + { + "type", "name", "range" + "Gov", "Communism", "Player" + } + +;********************************************************************* +;Banking changes upkeep of infantry to gold +[effect_banking_upkeep] +type = "Shield2Gold_Factor" +value = 100 +reqs = + { + "type", "name", "range", "present" + "Tech", "Banking", "Player", TRUE + } + +;Changes require changes to city_force_income_update() in city.js +[effect_coinage_base_rate] +type = "Coinage_Bonus_Pm" +value = 500 +reqs = + { "type", "name", "range", "present" + } + +;This is supposed to be outrage for violating a treaty but looks to me more like +;it causes outrage for any invasion of foreign territory. That's not necessarily +;bad, but: (1) This needs testing. (2) A separate effect for treaty violation +;outrage where DiplRel != {War} and all the benevolent actions are left with +;,FALSE clauses and all the malevolent actions are commented out so they'd cause it. +[effect_united_nations_international_outrage_invasion] +type = "Casus_Belli_Success" +value = 1000 +reqs = + { "type", "name", "range", "present" + "DiplRel", "War", "Local", FALSE + "DiplRel", "Alliance", "Local", FALSE + "DiplRel", "Armistice", "Local", FALSE ; Time to get units out of the territory + "DiplRel", "Foreign", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "Building", "United Nations", "World", TRUE +; TO DO: shouldn't the actions below which would vioalte treaty be commented out so that they also +; cause the outrage for a treaty violation? + "Action", "Establish Embassy", "Local", FALSE + "Action", "Establish Embassy Stay", "Local", FALSE + "Action", "Investigate City", "Local", FALSE + "Action", "Investigate City Spend Unit", "Local", FALSE + "Action", "Poison City", "Local", FALSE + "Action", "Poison City Escape", "Local", FALSE + "Action", "Steal Gold", "Local", FALSE + "Action", "Steal Gold Escape", "Local", FALSE + "Action", "Sabotage City", "Local", FALSE + "Action", "Sabotage City Escape", "Local", FALSE + "Action", "Targeted Sabotage City", "Local", FALSE + "Action", "Targeted Sabotage City Escape", "Local", FALSE + "Action", "Sabotage City Production Escape", "Local", FALSE + "Action", "Steal Tech", "Local", FALSE + "Action", "Steal Tech Escape Expected", "Local", FALSE + "Action", "Targeted Steal Tech", "Local", FALSE + "Action","Targeted Steal Tech Escape Expected","Local", FALSE + "Action", "Incite City", "Local", FALSE + "Action", "Incite City Escape", "Local", FALSE + "Action", "Establish Trade Route", "Local", FALSE + "Action", "Enter Marketplace", "Local", FALSE + "Action", "Help Wonder", "Local", FALSE + "Action", "Bribe Unit", "Local", FALSE + "Action", "Sabotage Unit", "Local", FALSE + "Action", "Sabotage Unit Escape", "Local", FALSE + "Action", "Capture Units", "Local", FALSE + "Action", "Found City", "Local", FALSE + "Action", "Join City", "Local", FALSE + "Action", "Steal Maps", "Local", FALSE + "Action", "Steal Maps Escape", "Local", FALSE + "Action", "Bombard", "Local", FALSE + "Action", "Bombard 2", "Local", FALSE + "Action", "Bombard 3", "Local", FALSE + "Action", "Suitcase Nuke", "Local", FALSE + "Action", "Suitcase Nuke Escape", "Local", FALSE + "Action", "Explode Nuclear", "Local", FALSE + "Action", "Nuke City", "Local", FALSE + "Action", "Nuke Units", "Local", FALSE + "Action", "Destroy City", "Local", FALSE + "Action", "Expel Unit", "Local", FALSE + "Action", "Recycle Unit", "Local", FALSE + "Action", "Disband Unit", "Local", FALSE + "Action", "Home City", "Local", FALSE + "Action", "Upgrade Unit", "Local", FALSE + "Action", "Paradrop Unit", "Local", FALSE + "Action", "Airlift Unit", "Local", FALSE + "Action", "Attack", "Local", FALSE + "Action", "Conquer City", "Local", FALSE + "Action", "Heal Unit", "Local", FALSE + "Action", "Transform Terrain", "Local", FALSE + "Action", "Cultivate", "Local", FALSE + "Action", "Plant", "Local", FALSE + "Action", "Pillage", "Local", FALSE + "Action", "Fortify", "Local", FALSE + "Action", "Build Road", "Local", FALSE + "Action", "Convert Unit", "Local", FALSE + "Action", "Build Base", "Local", FALSE + "Action", "Build Mine", "Local", FALSE + "Action", "Build Irrigation", "Local", FALSE + "Action", "Clean Pollution", "Local", FALSE + "Action", "Clean Fallout", "Local", FALSE + "Action", "Spy Attack", "Local", FALSE + } + +;Implement 'ugly hack' of kvilhaugsvik for invading cease-fire +;territory to be casus belli in 3.0 rulesets +;********************************************************************* +[effect_incident_success_move] +type = "Casus_Belli_Success" +value = 1 +reqs = + { "type", "name", "range", "present" + "DiplRel", "War", "Local", FALSE + "DiplRel", "Alliance", "Local", FALSE + "DiplRel", "Armistice", "Local", FALSE ; Time to get units out of the territory + "DiplRel", "Foreign", "Local", TRUE + "UnitFlag", "NonMil", "Local", FALSE + "Action", "Establish Embassy", "Local", FALSE + "Action", "Establish Embassy Stay", "Local", FALSE + "Action", "Investigate City", "Local", FALSE + "Action", "Investigate City Spend Unit", "Local", FALSE + "Action", "Poison City", "Local", FALSE + "Action", "Poison City Escape", "Local", FALSE + "Action", "Steal Gold", "Local", FALSE + "Action", "Steal Gold Escape", "Local", FALSE + "Action", "Sabotage City", "Local", FALSE + "Action", "Sabotage City Escape", "Local", FALSE + "Action", "Targeted Sabotage City", "Local", FALSE + "Action", "Targeted Sabotage City Escape", "Local", FALSE + "Action", "Sabotage City Production Escape", "Local", FALSE + "Action", "Steal Tech", "Local", FALSE + "Action", "Steal Tech Escape Expected", "Local", FALSE + "Action", "Targeted Steal Tech", "Local", FALSE + "Action","Targeted Steal Tech Escape Expected","Local", FALSE + "Action", "Incite City", "Local", FALSE + "Action", "Incite City Escape", "Local", FALSE + "Action", "Establish Trade Route", "Local", FALSE + "Action", "Enter Marketplace", "Local", FALSE + "Action", "Help Wonder", "Local", FALSE + "Action", "Bribe Unit", "Local", FALSE + "Action", "Sabotage Unit", "Local", FALSE + "Action", "Sabotage Unit Escape", "Local", FALSE + "Action", "Capture Units", "Local", FALSE + "Action", "Found City", "Local", FALSE + "Action", "Join City", "Local", FALSE + "Action", "Steal Maps", "Local", FALSE + "Action", "Steal Maps Escape", "Local", FALSE + "Action", "Bombard", "Local", FALSE + "Action", "Bombard 2", "Local", FALSE + "Action", "Bombard 3", "Local", FALSE + "Action", "Suitcase Nuke", "Local", FALSE + "Action", "Suitcase Nuke Escape", "Local", FALSE + "Action", "Explode Nuclear", "Local", FALSE + "Action", "Nuke City", "Local", FALSE + "Action", "Nuke Units", "Local", FALSE + "Action", "Destroy City", "Local", FALSE + "Action", "Expel Unit", "Local", FALSE + "Action", "Recycle Unit", "Local", FALSE + "Action", "Disband Unit", "Local", FALSE + "Action", "Home City", "Local", FALSE + "Action", "Upgrade Unit", "Local", FALSE + "Action", "Paradrop Unit", "Local", FALSE + "Action", "Airlift Unit", "Local", FALSE + "Action", "Attack", "Local", FALSE + "Action", "Conquer City", "Local", FALSE + "Action", "Heal Unit", "Local", FALSE + "Action", "Transform Terrain", "Local", FALSE + "Action", "Cultivate", "Local", FALSE + "Action", "Plant", "Local", FALSE + "Action", "Pillage", "Local", FALSE + "Action", "Fortify", "Local", FALSE + "Action", "Build Road", "Local", FALSE + "Action", "Convert Unit", "Local", FALSE + "Action", "Build Base", "Local", FALSE + "Action", "Build Mine", "Local", FALSE + "Action", "Build Irrigation", "Local", FALSE + "Action", "Clean Pollution", "Local", FALSE + "Action", "Clean Fallout", "Local", FALSE + "Action", "Spy Attack", "Local", FALSE + } + +;This line intentionally left blank: diff --git a/freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/game.ruleset b/freeciv/freeciv/data/mp2c-occ/game.ruleset similarity index 52% rename from freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/game.ruleset rename to freeciv/freeciv/data/mp2c-occ/game.ruleset index 831f9b852..935f5262e 100644 --- a/freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/game.ruleset +++ b/freeciv/freeciv/data/mp2c-occ/game.ruleset @@ -10,7 +10,7 @@ ; than minor changes. [datafile] -description="Avant-garde game rules for Freeciv" +description="MP2-Caravel game rules for Freeciv" options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" format_version=20 @@ -19,32 +19,55 @@ format_version=20 [ruledit] ; Which file to read description in from. -description_file = "mp2-brava/README.brava" +description_file = "mp2c-occ/README.txt" [about] ; Ruleset name ; DO NOT CHANGE, FCW unfortunately has to hard-code certain special cases for this. -name = _("MP2 Brava") +name = _("MP2 Caravel") ; There`s no separate versioning in rulesets part of main freeciv distribution ;version = "" +; When about to migrate ruleset under a new name in the future version, set +; alt_dir to the name of that future directory. Then savegames saved with this +; version of freeciv can find the ruleset from the correct place when loading +; the savegame to the future version. +;alt_dir = "" + ; Summary of the ruleset ; /* TRANS: In the client, this is displayed alongside the contents of -; README.brava, which are not localized. */ +; README.txt, which are not localized. */ summary = _("") ; Detailed description ; When updating this, update also desciption_file in [ruledit] section to match -description = *mp2-brava/README.brava* +description = *mp2-caravel/README.txt* ; What capabilities ruleset provides for the scenarios. ; mimimum-default-sets - Default units, terrains, buildings, etc -capabilities = "minimum-default-sets" +;capabilities = "minimum-default-sets" +capabilities = "std-terrains" [options] global_init_techs="" global_init_buildings="Palace" +popup_tech_help = FALSE + +[tileset] +; If preferred tileset is set, clients that support the feature will suggest +; using that tileset with the ruleset. +preferred = "amplio2" + +[soundset] +; If preferred soundset is set, clients that support the feature will suggest +; using that soundset with the ruleset. +; preferred = "" + +[musicset] +; If preferred musicset is set, clients that support the feature will suggest +; using that musicset with the ruleset. +; preferred = "" [civstyle] ; Value added to city pollution @@ -71,10 +94,10 @@ min_city_center_shield = 1 min_city_center_trade = 0 ; Square of initial city radius -init_city_radius_sq = 5 +init_city_radius_sq = 15 ; Square of initially visible radius (true distance). -init_vis_radius_sq = 5 +init_vis_radius_sq = 20 ; A base bribe cost, modified heavily by other factors base_bribe_cost = 750 @@ -109,6 +132,12 @@ tech_loss_allow_holes = FALSE ; Whether civil war is possible at all civil_war_enabled = TRUE +; How many percents each celebrating city affects chance of civil war +civil_war_bonus_celebrating = -5 + +; How many percents each disorder city affects chance of civil war +civil_war_bonus_unhappy = 5 + ; Comma separated list of things to happen, in addition to death ; of owner, when gameloss unit dies ; "CivilWar" - Part of the empire remains, controlled by a new player @@ -142,6 +171,10 @@ paradrop_to_transport = FALSE ; upkeep are disbanded. gold_upkeep_style = "City" +; How many points of output one basic unit consists of. Typically you +; want this to be some 10^n. +output_granularity = 1 + [illness] ; Whether plagues (illness) are possible ; There are some latent building effects in effects.ruleset which affect @@ -168,7 +201,7 @@ illness_pollution_factor = 50 total_factor = 100 ; TF = 100 (effectively makes 100x cost at capital and 1x cost at DIST=32) ;city_size_adjusted ; SZ (happy*2 + content*1 + unhappy*0 - angry*2) ;nationality factor ; NF native=1.0, was_conquered=0.67, originally_belonged_to_inciter=0.5 -base_incite_cost = 1500 ; BIC =1100 (base cost before modifiers) +base_incite_cost = 1500 ; BIC =1500 (base cost before modifiers) ; content bonus. ;city is content ; CON ;city is celebrating ; CEL @@ -197,15 +230,45 @@ slow_invasions = TRUE ; have only fractional moves left. tired_attack = TRUE +; With some rules it`s possible that neither side of a combat dies. +; Set this to TRUE if unit should never gain veterancy from such a combat. +only_killing_makes_veteran = FALSE + +; Percentage of population lost by a city after nuclear attack. If set to +; 100 city is destroyed along with all the units. If set to 0 city does not +; loose population. Any value below 100 means the city can never be +; destroyed completely using nuclear. NOTE THIS SETTING MAY BE HARD-CODED DIFFERENTLY IN FCW SERVER +nuke_pop_loss_pct = 50 + +; Percentage chance of a city defender surviving nuclear attack. When set +; to 50 roughly half of defenders will survive nuclear attack. When set to +; 0 no defenders will survive. When set to 100 all defenders will survive. +nuke_defender_survival_chance_pct = 0 + [auto_attack] ; An auto attack may be triggered when another unit moves to an adjacent ; tile and the autoattack server setting is enabled. The following details ; are ruleset controlled. +; attack_actions - the actions to try during an auto attack in the order +; they should be tried. +; if_attacker - this requirement vector must be true before a unit even +; considers to auto attack. +; NOTE: "will_never" was replaced by if_attacker req vector in 2021. ; will_never - units with this unit type flag will never auto attack. +;possible attack_actions= "Capture Units", "Bombard", "Attack", "Suicide Attack" +attack_actions= "Attack" + ; Non-fighters don't auto-attack. will_never = "WillNever" +if_attacker = + { "type", "name", "range", "present" + "DiplRel", "War", "Local", TRUE + "MinMoveFrags", "9", "Local", TRUE + "UnitFlag", "WillNever", "Local", FALSE ; in theory, replaces: will_never="WillNever" + } + [actions] ; If force_trade_route is set to TRUE it is illegal for an actor unit to ; enter the marketplace of a city if it can establish a trade route to it @@ -229,7 +292,7 @@ force_explode_nuclear = TRUE ; If poison_empties_food_stock is set to TRUE a successful "Poison City" ; or "Poison City Escape" will empty the food stock. -poison_empties_food_stock = FALSE +poison_empties_food_stock = TRUE ; The maximum distance from the actor unit to the target of the "Bombard" ; action. The value 1 means that the targets must be on a tile adjacent to @@ -238,6 +301,49 @@ poison_empties_food_stock = FALSE ; distance. bombard_max_range = 1 +; The maximum distance from the actor unit to the target of the "Bombard 2" +; action. The value 1 means that the targets must be on a tile adjacent to +; the actor unit. The special value "unlimited" lifts the maximum distance +; restriction. The maximum distance can`t be smaller than the minimum +; distance. +bombard_2_max_range = 2 + +; The maximum distance from the actor unit to the target of the "Bombard 3" +; action. The value 1 means that the targets must be on a tile adjacent to +; the actor unit. The special value "unlimited" lifts the maximum distance +; restriction. The maximum distance can`t be smaller than the minimum +; distance. +bombard_3_max_range = 3 + +; The maximum distance from the actor unit to the target of the +; "Explode Nuclear" action. The value 0 means that the target tile must be +; the tile of the actor unit. The value 1 means that the tile must be a tile +; adjacent to the actor unit. The special value "unlimited" lifts the +; maximum distance restriction. The maximum distance can`t be smaller than +; the minimum distance. +explode_nuclear_max_range = 0 + +; The maximum distance from the actor unit to the target of the +; "Nuke City" action. The value 1 means that the tile must be a tile +; adjacent to the actor unit. The special value "unlimited" lifts the +; maximum distance restriction. The maximum distance can`t be smaller than +; the minimum distance. +nuke_city_max_range = 1 + +; The maximum distance from the actor unit to the target of the +; "Nuke Units" action. The value 1 means that the tile must be a tile +; adjacent to the actor unit. The special value "unlimited" lifts the +; maximum distance restriction. The maximum distance can`t be smaller than +; the minimum distance. +nuke_units_max_range = 1 + +; The maximum distance from the actor unit to the target of the "Airlift Unit" +; action. The value 1 means that the targets must be on a tile adjacent to +; the actor unit. The special value "unlimited" lifts the maximum distance +; restriction. The maximum distance can`t be smaller than the minimum +; distance. +airlift_max_range = "unlimited" + ; What each action should be called when showing them to the player. ; The first %s should be before the mnemonic of the action. A Freeciv client ; that supports mnemonics will replace it with the in-band signal that marks @@ -265,6 +371,12 @@ ui_name_sabotage_city_escape = _("%sSabotage City Escape%s") ; /* TRANS: Industrial _Sabotage (3% chance of success). */ ui_name_targeted_sabotage_city_escape = _("Targeted %sSabotage%s") +; /* TRANS: Industrial _Sabotage (3% chance of success). */ +;ui_name_targeted_sabotage_city = _("%Destroy Building%s") + +; /* TRANS: Industrial _Sabotage Production (3% chance of success). */ +ui_name_sabotage_city_production_escape = _("Industrial %sSabotage Production%s") + ; /* TRANS: Incite a _Revolt (3% chance of success). */ ui_name_incite_city = _("Incite a %sRevolt%s") @@ -302,16 +414,16 @@ ui_name_steal_maps = _("Steal %sMap Fragments%s") ui_name_investigate_city = _("%sInvestigate City%s") ; /* TRANS: _Investigate City (spends the unit) (100% chance of success). */ -ui_name_investigate_city_spend_unit = _("%sInvestigate City (spends the unit)%s") +;ui_name_investigate_city_spend_unit = _("%sInvestigate City (spends the unit)%s") ; /* TRANS: Help _build Wonder (100% chance of success). */ -ui_name_help_wonder = _("Help %sbuild Wonder%s") +ui_name_help_wonder = _("Help %sBuild Wonder%s") ; /* TRANS: Rec_ycle Unit (100% chance of success). */ ui_name_recycle_unit = _("Rec%sycle Unit%s") ; /* TRANS: _You're Fired (100% chance of success). */ -ui_name_disband_unit = _("%sYou're Fired%s") +ui_name_disband_unit = _("%sDisband Unit%s") ; /* TRANS: _Capture Units (100% chance of success). */ ui_name_capture_units = _("%sCapture Units%s") @@ -322,8 +434,14 @@ ui_name_found_city = _("%sBuild City%s") ; /* TRANS: _Add to City (100% chance of success). */ ui_name_join_city = _("%sAdd to City%s") -; /* TRANS: Explode _Nuclear (100% chance of success). */ -ui_name_explode_nuclear = _("Explode %sNuclear%s") +; /* TRANS: Explode _Nuclear In Place (100% chance of success). */ +ui_name_explode_nuclear = _("Detonate %sNuke%s") + +; /* TRANS: _Nuke City (100% chance of success). */ +ui_name_nuke_city = _("%sNuke City%s") + +; /* TRANS: _Nuke Units (100% chance of success). */ +ui_name_nuke_units = _("%sNuke Units%s") ; /* TRANS: Destroy _City (100% chance of success). */ ;ui_name_destroy_city = _("Destroy %sCity%s") ;ready to be enabled if we think of how @@ -332,61 +450,90 @@ ui_name_explode_nuclear = _("Explode %sNuclear%s") ui_name_home_city = _("Set %sHome City%s") ; /* TRANS: _Upgrade Unit (100% chance of success). */ -ui_name_upgrade_unit = _("%sUpgrade Unit%s") +ui_name_upgrade_unit = _("%sUpgrade%s") ; /* TRANS: Drop _Paratrooper (100% chance of success). */ -ui_name_paradrop_unit = _("Drop %sParatrooper%s") +ui_name_paradrop_unit = _("%sParadrop%s") ; /* TRANS: _Airlift to City (100% chance of success). */ -ui_name_airlift_unit = _("%sAirlift to City%s") +ui_name_airlift_unit = _("%sAirlift%s") ; /* TRANS: _Attack (100% chance of success). */ ui_name_attack = _("%sAttack%s") +; /* TRANS: Eliminate _Spy (100% chance of success). */ +ui_name_spy_attack = _("Eliminate %sSpy%s") + ; /* TRANS: _Bombard (100% chance of success). */ -ui_name_bombard = _("Range%sd Attack%s") +ui_name_bombard = _("%sSpecial Attack%s") -;UPGRADE ; /* TRANS: _Explode Missile (100% chance of success). */ -;ui_name_suicide_attack = _("%sExplode Missile%s") +ui_name_suicide_attack = _("%sExplode Missile%s") ; /* TRANS: _Conquer City (100% chance of success). */ ui_name_conquer_city = _("%sConquer City%s") ; /* TRANS: _Transform Terrain (3% chance of success). */ - ui_name_transform_terrain = _("%sTransform Terrain%s") +ui_name_transform_terrain = _("%sTransform Terrain%s") -; /* TRANS: Transform by _Irrigate (3% chance of success). */ - ui_name_irrigate_tf = _("Transform by %sIrrigate%s") +; /* TRANS: Transform by _Cultivating (3% chance of success). */ +ui_name_cultivate = _("%sCultivate%s") -; /* TRANS: Transform by _Mine (3% chance of success). */ - ui_name_mine_tf = _("Transform by %sMine%s") +; /* TRANS: Transform by _Planting (3% chance of success). */ +ui_name_plant = _("%sPlant%s") ; /* TRANS: Pilla_ge (100% chance of success). */ - ui_name_pillage = _("Pilla%sge%s") +ui_name_pillage = _("Pilla%sge%s") + +; /* TRANS: Clean _Pollution (100% chance of success). */ +ui_name_clean_pollution = "Clean %sPollution%s" + +; /* TRANS: Clean _Fallout (100% chance of success). */ +ui_name_clean_fallout = "Clean %sFallout%s" ; /* TRANS: _Fortify (100% chance of success). */ - ui_name_fortify = _("%sFortify%s") +ui_name_fortify = _("%sFortify%s") ; /* TRANS: Build _Road (100% chance of success). */ - ui_name_road = _("Build %sRoad%s") +ui_name_road = _("Build %sRoad%s") ; /* TRANS: Build _Canal (100% chance of success). */ - ui_name_canal = _("Build %Canal%s") - ui_name_waterway = _("Build Water%way%s") +ui_name_canal = _("Build %Canal%s") +ui_name_waterway = _("Build Water%way%s") ; /* TRANS: _Build Base (100% chance of success). */ - ui_name_build_base = _("%sBuild Base%s") +ui_name_build_base = _("%sBuild Base%s") ; /* TRANS: Build _Mine (100% chance of success). */ - ui_name_build_mine = _("Build %sMine%s") +ui_name_build_mine = _("Build %sMine%s") ; /* TRANS: Build _Irrigation (100% chance of success). */ - ui_name_irrigate = _("Build %sIrrigation%s") +ui_name_irrigate = _("%sIrrigate%s") + +; /* TRANS: _Deboard (100% chance of success). */ +ui_name_transport_deboard = _("%sDeboard%s") + +; /* TRANS: _Board (100% chance of success). */ +ui_name_transport_board = _("%sBoard%s") + +; /* TRANS: _Unload (100% chance of success). */ +ui_name_transport_unload = _("%sUnload%s") + +; /* TRANS: _Disembark (100% chance of success). */ +ui_name_transport_disembark = _("%sDisembark%s") + +; /* TRANS: _Embark (100% chance of success). */ +ui_name_transport_embark = _("%sEmbark%s") -; NOT IMPLEMENTED IN SERVER YET - ; /* TRANS: _Unload (100% chance of success). */ -;ui_name_transport_unload = _("%sUnload%s") +; Three Blank ruleset defined user actions. See README.actions +; See the section "Ruleset defined actions" is doc/README.actions +; Example: set up "User Action 1" +;ui_name_user_action_1 = _("%sDisrupt Supply Lines%s") +;user_action_1_target_kind = "individual units" +;user_action_1_min_range = 1 +;user_action_1_max_range = 3 +;user_action_1_actor_consuming_always = FALSE +; ; Suppress automatic help text generation about what enables and/or ; disables the following actions. @@ -462,6 +609,30 @@ actor_reqs = "Tech", "Space Flight", "Player" "Age", "10", "Local" } +[actionenabler_foot_to_musket] ;;old foot units become muskets with Conscription +action = "Convert Unit" +actor_reqs = + { "type", "name", "range", "present" + "UnitClass","Land", "Local", TRUE + "UnitFlag", "FootSoldier", "Local", TRUE + "UnitType", "Riflemen", "Local", FALSE ; Don't allow Riflemen to become Workers with this enabler + "UnitType", "Musketeers", "Local", FALSE ; SAFETY: block future convert features that Musketeers might get + "UnitType", "Alpine Troops", "Local", FALSE ; SAFETY: block future convert features that Alpines might get + "UnitType", "Marines", "Local", FALSE ; SAFETY: block future convert features that Marines might get + "UnitType", "Paratroopers", "Local", FALSE ; SAFETY: block future convert features that Paratroopers might get + "UnitState","OnDomesticTile", "Local", TRUE + "CityTile", "Center", "Local", TRUE + "Tech", "Conscription", "Player",TRUE + } +[actionenabler_musket_to_rifle] ;;Musketeers become Riflemen with Labor Union +action = "Convert Unit" +actor_reqs = + { "type", "name", "range", "present" + "UnitType", "Musketeers", "Local", TRUE + "UnitState","OnDomesticTile", "Local", TRUE + "CityTile", "Center", "Local", TRUE + "Tech", "Labor Union", "Player",TRUE + } [actionenabler_sabotage_city] action = "Sabotage City" @@ -477,23 +648,47 @@ actor_reqs = [actionenabler_sabotage_city_spy] action = "Sabotage City Escape" actor_reqs = - { "type", "name", "range" - "UnitFlag", "Spy", "Local" - "DiplRel", "War", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" + { "type", "name", "range", "present" + "UnitFlag", "Spy", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "UnitState", "OnLivableTile", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "UnitType", "Siege Ram", "Local", FALSE } [actionenabler_sabotage_city_target] action = "Targeted Sabotage City Escape" actor_reqs = - { "type", "name", "range" - "DiplRel", "War", "Local" - "UnitFlag", "Spy", "Local" - "UnitState", "OnLivableTile", "Local" - "MinMoveFrags", "1", "Local" + { "type", "name", "range", "present" + "DiplRel", "War", "Local", TRUE + "UnitFlag", "Spy", "Local", TRUE + "UnitState", "OnLivableTile", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "UnitType", "Siege Ram", "Local", FALSE + } +;Batter Walls +[actionenabler_break_walls_siege_ram] +action = "Targeted Sabotage City Escape" +actor_reqs = + { "type", "name", "range", "present" + "Tech", "Metallurgy", "World", FALSE + "DiplRel", "War", "Local", TRUE + "UnitFlag", "Spy", "Local", TRUE + "UnitType", "Siege Ram", "Local", TRUE + "UnitState", "OnLivableTile", "Local", TRUE + "MinMoveFrags", "9", "Local", TRUE } +[actionenabler_sabotage_city_production] +action = "Sabotage City Production Escape" +actor_reqs = + { "type", "name", "range", "present" + "DiplRel", "War", "Local", TRUE + "UnitFlag", "Spy", "Local", TRUE + "UnitState", "OnLivableTile", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "UnitType", "Siege Ram", "Local", FALSE + } ; ************************ ESTABLISH EMBASSY *********************** ; DIPLOMAT: normal establish embassy--if not at war @@ -513,7 +708,7 @@ target_reqs = { "type", "name", "range", "present" "NationGroup", "Barbarian", "Player", FALSE } -;if at war, police station/fundie will block embassy: do a cease-fire first! +;if at war, courthouse/police station/fundie will block embassy: do a cease-fire first! [actionenabler_establish_embassy_war] action = "Establish Embassy Stay" actor_reqs = @@ -527,10 +722,12 @@ actor_reqs = "DiplRel", "War", "Local", TRUE } target_reqs = - { "type", "name", "range", "present" - "NationGroup", "Barbarian", "Player", FALSE - "Building", "Police Station", "City", FALSE ; to do: when we can check for spy present to stop it - "Gov", "Fundamentalism", "Player", FALSE + { "type", "name", "range", "present" + "NationGroup", "Barbarian", "Player", FALSE + "Building", "Courthouse", "City", FALSE + "Building", "Homeland Security", "City", FALSE + "Building", "Police Station", "City", FALSE ; to do: when we can check for spy present to stop it + "Gov", "Theocracy", "Player", FALSE } ; SPY: normal establish embassy--if not at war @@ -539,6 +736,7 @@ action = "Establish Embassy" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Spy", "Local", TRUE + "UnitType", "Siege Ram", "Local", FALSE "UnitState", "OnLivableTile", "Local", TRUE "UnitState", "Transported", "Local", FALSE "MinMoveFrags", "1", "Local", TRUE @@ -555,6 +753,7 @@ action = "Establish Embassy" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Spy", "Local", TRUE + "UnitType", "Siege Ram", "Local", FALSE "UnitState", "OnLivableTile", "Local", TRUE "UnitState", "Transported", "Local", FALSE "MinMoveFrags", "1", "Local", TRUE @@ -565,37 +764,59 @@ target_reqs = { "type", "name", "range", "present" "NationGroup", "Barbarian", "Player", FALSE "Building", "Police Station","City", FALSE ; to do: when we can check for spy present to stop it - "Gov", "Fundamentalism","Player", FALSE + "Gov", "Theocracy", "Player", FALSE } ; *************************************************** [actionenabler_investigate_city] -action = "Investigate City Spend Unit" +action = "Investigate City" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Diplomat", "Local", TRUE + "UnitType", "Siege Ram", "Local", FALSE + "UnitState", "OnLivableTile", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "DiplRel", "Foreign", "Local", TRUE + "UnitState", "Transported", "Local", FALSE + } +[actionenabler_investigate_city_tribesmen_explorer] +action = "Investigate City" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "IgTer", "Local", TRUE + "UnitFlag", "NonMil", "Local", TRUE "UnitState", "OnLivableTile", "Local", TRUE "MinMoveFrags", "1", "Local", TRUE "DiplRel", "Foreign", "Local", TRUE "UnitState", "Transported", "Local", FALSE - "UnitFlag", "Spy", "Local", FALSE } + +[actionenabler_investigate_city_satellite] +action = "Investigate City" +actor_reqs = + { "type", "name", "range","present" + "UnitType", "Satellite", "Local", TRUE + "DiplRel", "Foreign", "Local", TRUE + } + +;Spy can investigate city even if transported... [actionenabler_investigate_city_spy] action = "Investigate City" actor_reqs = { "type", "name", "range","present" "UnitFlag", "Spy", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE + "UnitType", "Siege Ram", "Local", FALSE "MinMoveFrags", "1", "Local", TRUE - "UnitState", "Transported", "Local", FALSE "DiplRel", "Foreign", "Local", TRUE } +; *********************************************************** [actionenabler_poison_city] action = "Poison City Escape" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Spy", "Local", TRUE + "UnitType", "Siege Ram", "Local", FALSE "UnitState", "Transported", "Local", FALSE "DiplRel", "War", "Local", TRUE "UnitState", "OnLivableTile", "Local", TRUE @@ -603,7 +824,7 @@ actor_reqs = } target_reqs = { "type", "name", "range" - "MinSize", "2", "City" +; "MinSize", "2", "City" ;; use poison to stop colonialism } [actionenabler_steal_maps_escape] @@ -611,6 +832,7 @@ action = "Steal Maps Escape" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Spy", "Local", TRUE + "UnitType", "Siege Ram", "Local", FALSE "UnitState", "OnLivableTile", "Local", TRUE "MinMoveFrags", "1", "Local", TRUE "DiplRel", "Foreign", "Local", TRUE @@ -625,6 +847,7 @@ action = "Steal Maps" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Diplomat", "Local" + "UnitType", "Siege Ram", "Local", FALSE "UnitState", "OnLivableTile", "Local" "MinMoveFrags", "1", "Local" "DiplRel", "Foreign", "Local" @@ -649,6 +872,7 @@ actor_reqs = target_reqs = { "type", "name", "range", "present" "NationGroup", "Barbarian", "Player", FALSE + "MinForeignPct", "49", "City", FALSE ; < 50% foreign before occupied city has tech blueprints floating around } [actionenabler_steal_tech_random_esc] @@ -656,6 +880,7 @@ action = "Steal Tech Escape Expected" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Spy", "Local", TRUE + "UnitType", "Siege Ram", "Local", FALSE "UnitState", "OnLivableTile", "Local", TRUE "MinMoveFrags", "1", "Local", TRUE "DiplRel", "Foreign", "Local", TRUE @@ -664,6 +889,7 @@ actor_reqs = target_reqs = { "type", "name", "range", "present" "NationGroup", "Barbarian", "Player", FALSE + "MinForeignPct", "49", "City", FALSE ; < 50% foreign before occupied city has tech blueprints floating around } [actionenabler_steal_tech_target] @@ -671,6 +897,7 @@ action = "Targeted Steal Tech Escape Expected" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Spy", "Local", TRUE + "UnitType", "Siege Ram", "Local", FALSE "UnitState", "OnLivableTile", "Local", TRUE "MinMoveFrags", "1", "Local", TRUE "DiplRel", "Foreign", "Local", TRUE @@ -679,6 +906,7 @@ actor_reqs = target_reqs = { "type", "name", "range", "present" "NationGroup", "Barbarian", "Player", FALSE + "MinForeignPct", "49", "City", FALSE ; < 50% foreign before occupied city has tech blueprints floating around } [actionenabler_incite_city] @@ -696,7 +924,6 @@ actor_reqs = } target_reqs = { "type", "name", "range", "present" - "Gov", "Democracy", "Player", FALSE "Building", "Palace", "City", FALSE "Building", "Ecclesiastical Palace", "City", FALSE "Building", "Mausoleum of Mausolos", "Player", FALSE @@ -707,6 +934,7 @@ action = "Incite City Escape" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Spy", "Local", TRUE + "UnitType", "Siege Ram", "Local", FALSE "DiplRel", "Alliance", "Local", FALSE "DiplRel", "Team", "Local", FALSE "UnitState", "OnLivableTile", "Local", TRUE @@ -716,7 +944,6 @@ actor_reqs = } target_reqs = { "type", "name", "range", "present" - "Gov", "Democracy", "Player", FALSE "Building", "Palace", "City", FALSE "Building", "Ecclesiastical Palace", "City", FALSE "Building", "Mausoleum of Mausolos", "Player", FALSE @@ -727,6 +954,7 @@ action = "Bribe Unit" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Diplomat", "Local", TRUE + "UnitType", "Siege Ram", "Local", FALSE "DiplRel", "Alliance", "Local", FALSE "DiplRel", "Team", "Local", FALSE "UnitState", "OnLivableTile", "Local", TRUE @@ -737,7 +965,6 @@ target_reqs = { "type", "name", "range", "present" "UnitFlag", "Unbribable", "Local", FALSE "CityTile", "Center", "Local", FALSE - "Gov", "Democracy", "Player", FALSE "MaxUnitsOnTile", "1", "Local", TRUE } @@ -746,6 +973,7 @@ action = "Sabotage Unit Escape" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Spy", "Local", TRUE + "UnitType", "Siege Ram", "Local", FALSE "DiplRel", "War", "Local", TRUE "UnitState", "OnLivableTile", "Local", TRUE "MinMoveFrags", "1", "Local", TRUE @@ -759,108 +987,133 @@ target_reqs = "MaxUnitsOnTile", "1", "Local", TRUE } -[actionenabler_traderoute] -action = "Establish Trade Route" +[actionenabler_eliminate_spy] +action = "Spy Attack" actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Spy", "Local", TRUE + "UnitType", "Siege Ram", "Local", FALSE + "UnitState","OnLivableTile","Local", TRUE + "UnitState","Transported", "Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "DiplRel", "Alliance", "Local", FALSE + "DiplRel", "Team", "Local", FALSE + "DiplRel", "Foreign", "Local", TRUE + } +target_reqs = { "type", "name", "range", "present" - "UnitFlag", "TradeRoute", "Local", TRUE - "Tech", "Trade", "Player", TRUE - "MinMoveFrags", "1", "Local", TRUE -; "DiplRel", "War", "Local", FALSE ; allows establishing during war then awaiting diplomatic relation to activate trade income. + "CityTile", "Center", "Local", FALSE } -[actionenabler_traderoute_boat] +[actionenabler_traderoute] action = "Establish Trade Route" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "TradeRoute", "Local", TRUE + "UnitState", "Transporting", "Local", FALSE ; avoids bug where land cargo "drowns" even on land terrain "MinMoveFrags", "1", "Local", TRUE - "UnitType", "Boat", "Local", TRUE -; "DiplRel", "War", "Local", FALSE ; allows establishing during war then awaiting diplomatic relation to activate trade income. + "UnitState", "HasHomeCity", "Local", TRUE } -[actionenabler_marketplace] -action = "Enter Marketplace" -actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "TradeRoute", "Local", TRUE - "Tech", "Trade", "Player", TRUE - "MinMoveFrags", "1", "Local", TRUE - "DiplRel", "War", "Local", FALSE - } -target_reqs = - { "type", "name", "range" - "Building", "Marketplace", "City" - } +;S12 cities with colossus giving 486 gold from a wagon; this has to be turned OFF until if/when +;we balance it or make a whole new formula for that stuff, based on simple value of the +;commerce unit times a simple multiplier. +;[actionenabler_marketplace] +;action = "Enter Marketplace" +;actor_reqs = +; { "type", "name", "range", "present" +; "UnitFlag", "TradeRoute", "Local", TRUE +; "UnitState", "Transporting", "Local", FALSE ; avoids bug where land cargo "drowns" even on land terrain +; "MinMoveFrags", "1", "Local", TRUE +; "DiplRel", "War", "Local", FALSE +; } +;target_reqs = +; { "type", "name", "range" +; "Building", "Marketplace", "City" +; } -[actionenabler_help_build_wonder] +[actionenabler_help_build_great_wonder] action = "Help Wonder" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "HelpWonder", "Local", TRUE -; "Tech", "Trade", "Player", TRUE + "UnitState", "Transporting", "Local", FALSE ; avoids bug where land cargo "drowns" even on land terrain "DiplRel", "War", "Local", FALSE - "UnitType", "Caravel", "Local", FALSE } target_reqs = { "type", "name", "range" "BuildingGenus", "GreatWonder", "Local" } +;This could also be used for "Great Units"; e.g., Doomsday Bomb. [actionenabler_help_build_small_wonder] action = "Help Wonder" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "HelpWonder", "Local", TRUE -; "Tech", "Trade", "Player", TRUE + "UnitState", "Transporting", "Local", FALSE ; avoids bug where land cargo "drowns" even on land terrain "DiplRel", "War", "Local", FALSE - "UnitType", "Caravel", "Local", FALSE } target_reqs = { "type", "name", "range", "present" "BuildingGenus", "SmallWonder", "Local", TRUE -; "Building", "Palace", "Local", FALSE } -[actionenabler_help_build_wonder_boat] -action = "Help Wonder" +[actionenabler_recycle_unit] +action = "Recycle Unit" actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "HelpWonder", "Local", TRUE -; "Tech", "Currency", "Player", TRUE - "DiplRel", "War", "Local", FALSE - "UnitType", "Boat", "Local", TRUE + { "type", "name", "range", "present", "quiet" + "UnitFlag", "EvacuateFirst","Local", FALSE, TRUE + "UnitType", "Tribesmen", "Local", FALSE, TRUE + "DiplRel", "War", "Local", FALSE, TRUE + "DiplRel", "Cease-fire", "Local", FALSE, TRUE + "DiplRel", "Armistice", "Local", FALSE, TRUE + "DiplRel", "Peace", "Local", FALSE, TRUE + } +;TRIBESMEN RECYCLE: Building, Wonder, or Coinage (special) +[actionenabler_recycle_unit_tribesmen_1] +action = "Recycle Unit" +actor_reqs = + { "type", "name", "range", "present", "quiet" + "UnitType", "Tribesmen", "Local", TRUE, TRUE + "DiplRel", "War", "Local", FALSE, TRUE + "DiplRel", "Cease-fire", "Local", FALSE, TRUE + "DiplRel", "Armistice", "Local", FALSE, TRUE + "DiplRel", "Peace", "Local", FALSE, TRUE } target_reqs = { "type", "name", "range", "present" "BuildingGenus", "SmallWonder", "Local", TRUE -; "Building", "Palace", "Local", FALSE } -; Allow no-home commerce units to be used on a first wonder: -[actionenabler_help_build_wonder_starting_caravan] -action = "Help Wonder" +[actionenabler_recycle_unit_tribesmen_2] +action = "Recycle Unit" actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "HelpWonder", "Local", TRUE - "UnitState", "HasHomeCity", "Local", FALSE - "DiplRel", "War", "Local", FALSE + { "type", "name", "range", "present", "quiet" + "UnitType", "Tribesmen", "Local", TRUE, TRUE + "DiplRel", "War", "Local", FALSE, TRUE + "DiplRel", "Cease-fire", "Local", FALSE, TRUE + "DiplRel", "Armistice", "Local", FALSE, TRUE + "DiplRel", "Peace", "Local", FALSE, TRUE } target_reqs = { "type", "name", "range", "present" - "BuildingGenus", "SmallWonder", "Local", TRUE + "BuildingGenus", "Improvement", "Local", TRUE } - -[actionenabler_recycle_unit] +[actionenabler_recycle_unit_tribesmen_3] action = "Recycle Unit" actor_reqs = { "type", "name", "range", "present", "quiet" - "UnitFlag", "EvacuateFirst","Local", FALSE, TRUE + "UnitType", "Tribesmen", "Local", TRUE, TRUE "DiplRel", "War", "Local", FALSE, TRUE "DiplRel", "Cease-fire", "Local", FALSE, TRUE "DiplRel", "Armistice", "Local", FALSE, TRUE "DiplRel", "Peace", "Local", FALSE, TRUE } - +target_reqs = + { "type", "name", "range", "present" + "BuildingGenus", "Special", "Local", TRUE + } +;--------------------------- [actionenabler_disband_unit] action = "Disband Unit" actor_reqs = @@ -888,16 +1141,55 @@ target_reqs = "MaxUnitsOnTile", "1", "Local", TRUE "Extra", "Fort", "Local", FALSE "Extra", "Fortress", "Local", FALSE + "Extra", "Naval Base", "Local", FALSE + "Extra", "Castle", "Local", FALSE + "Extra", "Bunker", "Local", FALSE + } +;CAPTURING LAND COMMERCE UNIT CARRYING CARGO: +;Transported commercial cargo does not prevent capture! +[actionenabler_capture_commerce] +action = "Capture Units" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Capturer", "Local", TRUE + "UnitState", "Transported", "Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "DiplRel", "Foreign", "Local", TRUE + "DiplRel", "Alliance", "Local", FALSE + } +target_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Capturable", "Local", TRUE + "CityTile", "Center", "Local", FALSE + "Terrain", "Mountains", "Local", FALSE + "MaxUnitsOnTile","1", "Local", FALSE ; only applies to stack + "Extra", "Fort", "Local", FALSE + "Extra", "Fortress", "Local", FALSE + "Extra", "Naval Base", "Local", FALSE + "Extra", "Castle", "Local", FALSE + "Extra", "Bunker", "Local", FALSE + ;exclusions to only leave commerce and cargo: + "UnitFlag", "Settlers", "Local", FALSE ; workers and foot units who make hideouts + "UnitFlag", "NonMil", "Local", TRUE ; all military excluded + "UnitFlag", "HasNoZOC", "Local", TRUE ; " " " + "UnitFlag", "Diplomat", "Local", FALSE ; no diplomat + "UnitType", "Explorer", "Local", FALSE ; no explorer + "TerrainClass", "Oceanic", "Local", FALSE ; not on a ship + "UnitClass", "RiverShip", "Local", FALSE ; no ships + "UnitClass", "Trireme", "Local", FALSE ; no ships + "UnitClass", "Sea", "Local", FALSE ; no ships } ; ***************** BOMBARDS ***************************** ;Archers can do volley attacks +; can hit ocean from land, and land from ocean. [actionenabler_archer_volley] action = "Bombard" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Bombarder", "Local", TRUE "UnitType", "Archers", "Local", TRUE + "UnitState", "Transported", "Local", TRUE "MinMoveFrags", "1", "Local", TRUE "DiplRel", "War", "Local", TRUE } @@ -908,18 +1200,127 @@ target_reqs = "Extra", "Naval Base", "Local", FALSE "TerrainClass", "Oceanic", "Local", FALSE } +;Can hit Oceanic but not while transported. +[actionenabler_archer_volley2] +action = "Bombard" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Bombarder", "Local", TRUE + "UnitType", "Archers", "Local", TRUE + "UnitState", "Transported", "Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "DiplRel", "War", "Local", TRUE + } +target_reqs = + { "type", "name", "range","present" + "CityTile", "Center", "Local", FALSE + "Extra", "Fortress", "Local", FALSE + "Extra", "Naval Base", "Local", FALSE + } + +;Fortified Phalanxes can "rumble" +[actionenabler_phalanx_rumble_fortified] +action = "Bombard" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Bombarder", "Local", TRUE + "UnitType", "Phalanx", "Local", TRUE + "UnitState", "Transported", "Local", FALSE + "UnitState", "Fortified", "Local", TRUE ;"Activity","Fortified","Local",TRUE ;3.1 version, which we now have working also. + "MinMoveFrags", "9", "Local", TRUE + "DiplRel", "War", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" + "CityTile", "Center", "Local", FALSE + "Extra", "Fort", "Local", FALSE + "Extra", "Fortress", "Local", FALSE + "Extra", "Naval Base","Local", FALSE + "TerrainClass","Oceanic", "Local", FALSE + } +;Phalanxes who haven't moved can "rumble" +[actionenabler_phalanx_rumble_unmoved] +action = "Bombard" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Bombarder", "Local", TRUE + "UnitType", "Phalanx", "Local", TRUE + "UnitState", "Transported", "Local", FALSE + "UnitState", "MovedThisTurn","Local", FALSE + "MinMoveFrags", "9", "Local", TRUE + "DiplRel", "War", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" + "CityTile", "Center", "Local", FALSE + "Extra", "Fort", "Local", FALSE + "Extra", "Fortress", "Local", FALSE + "Extra", "Naval Base","Local", FALSE + "TerrainClass","Oceanic", "Local", FALSE + } +;Legions can do Pilum assault +[actionenabler_legion_pilum_assault] +action = "Bombard" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Bombarder", "Local", TRUE + "UnitType", "Legion", "Local", TRUE + "UnitState", "Transported", "Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "DiplRel", "War", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" + "CityTile", "Center", "Local", FALSE + "Extra", "Fortress", "Local", FALSE + "Extra", "Fort", "Local", FALSE + "Extra", "Naval Base", "Local", FALSE + "TerrainClass", "Oceanic", "Local", FALSE + } +;Siege Rams can assault Fortress Perimeter +[actionenabler_siege_ram_fortress_assault] +action = "Bombard" +actor_reqs = + { "type", "name", "range", "present" + "Tech", "Metallurgy", "World", FALSE + "UnitFlag", "Bombarder", "Local", TRUE + "UnitType", "Siege Ram", "Local", TRUE + "UnitState", "Transported", "Local", FALSE + "MinMoveFrags", "10", "Local", TRUE + "DiplRel", "War", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" + "Extra", "Fortress", "Local", TRUE + } +;Siege Rams can assault Fortress Perimeter +[actionenabler_siege_ram_navbase_assault] +action = "Bombard" +actor_reqs = + { "type", "name", "range", "present" + "Tech", "Metallurgy", "World", FALSE + "UnitFlag", "Bombarder", "Local", TRUE + "UnitType", "Siege Ram", "Local", TRUE + "UnitState", "Transported", "Local", FALSE + "MinMoveFrags", "9", "Local", TRUE + "DiplRel", "War", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" + "Extra", "Naval Base", "Local", TRUE + } -;Fanatics can do skirmish assaults -[actionenabler_fanatic_skirmish_assault] +;Zealots can do skirmish assaults +[actionenabler_zealot_skirmish_assault] action = "Bombard" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Bombarder", "Local", TRUE - "UnitType", "Fanatics", "Local", TRUE + "UnitType", "Zealots", "Local", TRUE "UnitState", "OnDomesticTile", "Local", TRUE "MinMoveFrags", "1", "Local", TRUE "DiplRel", "War", "Local", TRUE - "Gov", "Fundamentalism", "Player", TRUE + "Gov", "Theocracy", "Player", TRUE ; "UnitState", "Transported", "Local", FALSE } target_reqs = @@ -929,6 +1330,98 @@ target_reqs = "Extra", "Naval Base", "Local", FALSE "TerrainClass", "Oceanic", "Local", FALSE } +;Zealots can infiltrate/skirmish foreign occupied cities +[actionenabler_zealot_skirmish_original_city] +action = "Bombard" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Bombarder", "Local", TRUE + "UnitType", "Zealots", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "Gov", "Theocracy", "Player", TRUE + } +target_reqs = + { "type", "name", "range", "present" + "CityTile", "Center", "Local", TRUE + "Extra", "Fortress", "Local", FALSE + "Extra", "Naval Base", "Local", FALSE + "TerrainClass", "Oceanic", "Local", FALSE + "CityStatus","OwnedByOriginal","City", FALSE + "MinForeignPct","1", "City", TRUE + } +;Zeppelins can bomb +[actionenabler_zeppelin_bomb] +action = "Bombard" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Bombarder", "Local", TRUE + "UnitType", "Zeppelin", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "DiplRel", "War", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" +; "CityTile", "Center", "Local", FALSE + "UnitClass", "Air", "Local", FALSE + "UnitClass", "AirProtect", "Local", FALSE + "UnitClass", "Missile", "Local", FALSE + "UnitClass", "Helicopter", "Local", FALSE + "UnitClass", "Space", "Local", FALSE + "UnitClass", "Balloon", "Local", FALSE + "UnitClass", "Bomb", "Local", FALSE + "UnitClass", "Zeppelin", "Local", FALSE + "UnitClass", "Air_High_Altitude", "Local", FALSE + } + +;Marines can do mortar/bazooka/rocket attacks at V3 +[actionenabler_marines_bombard] +action = "Bombard" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Bombarder", "Local", TRUE + "UnitType", "Marines", "Local", TRUE + "UnitState", "Transported", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "MinVeteran", "2", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" + "CityTile", "Center", "Local", FALSE + "Extra", "Fortress", "Local", FALSE + "Extra", "Naval Base", "Local", FALSE + "TerrainClass", "Oceanic", "Local", FALSE + } +;Can hit Oceanic but not while transported +[actionenabler_marines_bombard2] +action = "Bombard" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Bombarder", "Local", TRUE + "UnitType", "Marines", "Local", TRUE + "UnitState", "Transported", "Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "MinVeteran", "2", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" + "CityTile", "Center", "Local", FALSE + "Extra", "Fortress", "Local", FALSE + "Extra", "Naval Base", "Local", FALSE + } + +;Battleships can do bombardment +[actionenabler_battleship_bombard] +action = "Bombard" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Bombarder", "Local", TRUE + "UnitType", "Battleship", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "DiplRel", "War", "Local", TRUE + } ; ******************************************************** [actionenabler_build_city_pioneer] @@ -983,6 +1476,27 @@ actor_reqs = "MinMoveFrags", "1", "Local", TRUE } +;Reserved for Surgical Strike Actions Later +;TODO? Siege Ram could now use this instead of Spy Flag hacky solution. +;[actionenabler_surgical_strike_building] +;action = "Surgical Strike Building" +;actor_reqs = +; { "type", "name", "range", "present" +;; "UnitType", "Ground Strike Fighter", "Local", TRUE +;; "UnitFlag", "Building_Bomber", "Local", TRUE +; "DiplRel", "War", "Local", TRUE +; } +; Reserved for "production bombing" future feature; will need +; action_odds effects that are reduced by sam batteries and etc. +;[actionenabler_surgical_strike_production] +;action = "Surgical Strike Production" +;actor_reqs = +; { "type", "name", "range", "present" +; "UnitFlag", "Production_Bomber", "Local", TRUE +; "DiplRel", "War", "Local", TRUE +; "UnitState", "Transported", "Local", FALSE +; } + ;Land expel: must be not on a mountain nor an air expeller/expellee [actionenabler_border_police] action = "Expel Unit" @@ -993,7 +1507,9 @@ actor_reqs = "UnitClass", "AirProtect", "Local", FALSE "UnitFlag", "NonMil", "Local", FALSE ;Non-Military land class can't expel "UnitType", "Warriors", "Local", FALSE ;Warriors are too weak to expel + "UnitType", "Tribesmen", "Local", FALSE ;Tribesmen too. "UnitState", "OnDomesticTile", "Local", TRUE + "UnitState", "OnNativeTile", "Local", TRUE ;Transported units can expel on rivers but not from ocean "DiplRel", "Foreign", "Local", TRUE "DiplRel", "Team", "Local", FALSE "DiplRel", "Alliance", "Local", FALSE @@ -1039,121 +1555,559 @@ actor_reqs = "UnitFlag", "Nuclear", "Local", TRUE, FALSE "ServerSetting","nukes_minor","World", TRUE, FALSE } - -;DESTROY CITY -; The GameLoss unit requirement makes sending units on a suicide mission to -; capture and destroy cities deep inside enemy terrain national suicide. -; The risk of moving a GameLoss unit to the target city increases the cost -; of the action. Rationalization for the requirement: the physical presence -; of the Leader makes it easier to comply with the order to destroy the -; city. (See the "orders by phone" Milgram experiment variation) -; -; The domestic city requirement forces the player to invade a city before -; he can destroy it. If this limit is weakened by allowing the destruction -; of undefended (MaxUnitsOnTile) foreign cities during war it will lead to -; situations where a player can destroy a city but is unable to occupy it. -; Rationalization: the resistance must be crushed before the destruction. -; -; TODO: create an international incident (set the Casus_Belli_Success -; effect value to 1000) if "Destroy City" still is overpowered. -[actionenabler_scorched_earth] -action = "Destroy City" + +[actionenabler_nuke_city] +action="Nuke City" +actor_reqs= + { "type", "name", "range" + "UnitFlag", "Nuclear", "Local" + "MinMoveFrags", "1", "Local" + "DiplRel", "War", "Local" + } + +[actionenabler_nuke_units] +action="Nuke Units" +actor_reqs= + { "type", "name", "range" + "UnitFlag", "Nuclear", "Local" + "MinMoveFrags", "1", "Local" + "DiplRel", "War", "Local" + } +target_reqs= + { "type", "name", "range", "present" + "CityTile", "Center", "Local", FALSE + } + +;DESTROY CITY +; The GameLoss unit requirement makes sending units on a suicide mission to +; capture and destroy cities deep inside enemy terrain national suicide. +; The risk of moving a GameLoss unit to the target city increases the cost +; of the action. Rationalization for the requirement: the physical presence +; of the Leader makes it easier to comply with the order to destroy the +; city. (See the "orders by phone" Milgram experiment variation) +; +; The domestic city requirement forces the player to invade a city before +; he can destroy it. If this limit is weakened by allowing the destruction +; of undefended (MaxUnitsOnTile) foreign cities during war it will lead to +; situations where a player can destroy a city but is unable to occupy it. +; Rationalization: the resistance must be crushed before the destruction. +; +; TODO: create an international incident (set the Casus_Belli_Success +; effect value to 1000) if "Destroy City" still is overpowered. +[actionenabler_scorched_earth] +action = "Destroy City" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "GameLoss", "Local", TRUE + "DiplRel", "Foreign", "Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "UnitState", "OnLivableTile", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" + "MaxUnitsonTile","0", "Local", TRUE + } + +;ATTACKS every enabler below has 2 more duplicates in sections below, to +;handle Pax Dei logic. Always keep them identical except for Pax Dei +;reqs, which fall below the ;... marker. +;--------------------------------------------------------------------------- +;Tribesmen can attack: +[actionenabler_attack_native_tribesmen] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitType", "Tribesmen", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "UnitState", "OnNativeTile", "Local", TRUE + "UnitState", "Transported", "Local", FALSE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", FALSE + } +;Native attack ALWAYS allowed for units who aren't CargoRestrained +[actionenabler_landclass_attacker_native_unrestrained] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMil", "Local", FALSE + "UnitClassFlag","CargoRestrained","Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "UnitState", "OnNativeTile", "Local", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", FALSE + } +;Native attack ALWAYS allowed for units who aren't CargoRestrained +[actionenabler_non_landclass_attacker_native_unrestrained] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMil", "Local", FALSE + "UnitClassFlag","CargoRestrained","Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "UnitState", "OnNativeTile", "Local", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", FALSE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", FALSE + } +target_reqs = + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE + } +;Native attack for CargoRestrained units allowed, if not Transported +[actionenabler_landclass_attacker_native_restrained] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMil", "Local", FALSE + "UnitClassFlag","CargoRestrained","Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "UnitState", "OnNativeTile", "Local", TRUE + "UnitState", "Transported", "Local", FALSE + "UnitClassFlag","TerrainSpeed", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", FALSE + } +;Non-Land units can't attack Bunkers +[actionenabler_non_landclass_attacker_native_restrained] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMil", "Local", FALSE + "UnitClassFlag","CargoRestrained","Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "UnitState", "OnNativeTile", "Local", TRUE + "UnitState", "Transported", "Local", FALSE + "UnitClassFlag", "TerrainSpeed", "Local", FALSE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", FALSE + } +target_reqs = + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE + } +;Marines +[actionenabler_attack_marines] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMil", "Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "UnitFlag", "Marines", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", FALSE + } +[actionenabler_landclass_attack_from_non_native] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMil", "Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "UnitClassFlag", "AttFromNonNative", "Local", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", FALSE + } +[actionenabler_non_landclass_attack_from_non_native] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMil", "Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "UnitClassFlag", "AttFromNonNative", "Local", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", FALSE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", FALSE + } +target_reqs = + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE + } +; ***** NON-MIL ATTACKER rules (commerce units) +;Commerce units have to be NonMil to enter peaceful waters +;but they can also attack those with whom they are at war: +[actionenabler_attack_native_nonmil_attacker] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMilAttack", "Local", TRUE + "UnitClassFlag","CargoRestrained","Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "UnitState", "OnNativeTile", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", FALSE + } +target_reqs = + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE + } +[actionenabler_attack_from_non_native_nonmil_attacker] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMilAttack", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "UnitClassFlag", "AttFromNonNative", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", FALSE + } +target_reqs = + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE + } + +[actionenabler_explode_missile] +action = "Suicide Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMil", "Local", FALSE + "UnitClassFlag", "Missile", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "DiplRel", "War", "Local", TRUE + } + +;--------------------------------------------------------------------------- +; Same as above. For PAX DEI without Monotheism, it's legal. +;--------------------------------------------------------------------------- +;Native attack ALWAYS allowed for units who aren't CargoRestrained +[actionenabler_landclass_attacker_native_unrestrained_pd_no_m] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMil", "Local", FALSE + "UnitClassFlag","CargoRestrained","Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "UnitState", "OnNativeTile", "Local", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "Tech", "Monotheism", "Player",FALSE + } +;Native attack ALWAYS allowed for units who aren't CargoRestrained +[actionenabler_non_landclass_attacker_native_unrestrained_pd_no_m] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMil", "Local", FALSE + "UnitClassFlag","CargoRestrained","Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "UnitState", "OnNativeTile", "Local", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", FALSE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "Tech", "Monotheism", "Player",FALSE + } +target_reqs = + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE + } +;Native attack for CargoRestrained units allowed, if not Transported +[actionenabler_landclass_attacker_native_restrained_pd_no_m] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMil", "Local", FALSE + "UnitClassFlag","CargoRestrained","Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "UnitState", "OnNativeTile", "Local", TRUE + "UnitState", "Transported", "Local", FALSE + "UnitClassFlag","TerrainSpeed", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "Tech", "Monotheism", "Player",FALSE + } +;Non-Land units can't attack Bunkers +[actionenabler_non_landclass_attacker_native_restrained_pd_no_m] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMil", "Local", FALSE + "UnitClassFlag","CargoRestrained","Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "UnitState", "OnNativeTile", "Local", TRUE + "UnitState", "Transported", "Local", FALSE + "UnitClassFlag", "TerrainSpeed", "Local", FALSE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "Tech", "Monotheism", "Player",FALSE + } +target_reqs = + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE + } +;Marines +[actionenabler_attack_marines_pd_no_m] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMil", "Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "UnitFlag", "Marines", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "Tech", "Monotheism", "Player",FALSE + } +[actionenabler_landclass_attack_from_non_native_pd_no_m] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMil", "Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "UnitClassFlag", "AttFromNonNative", "Local", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "Tech", "Monotheism", "Player",FALSE + } +[actionenabler_non_landclass_attack_from_non_native_pd_no_m] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMil", "Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "UnitClassFlag", "AttFromNonNative", "Local", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", FALSE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "Tech", "Monotheism", "Player",FALSE + } +target_reqs = + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE + } +; ***** NON-MIL ATTACKER rules (commerce units) +;Commerce units have to be NonMil to enter peaceful waters +;but they can also attack those with whom they are at war: +[actionenabler_attack_native_nonmil_attacker_pd_no_m] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMilAttack", "Local", TRUE + "UnitClassFlag","CargoRestrained","Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "UnitState", "OnNativeTile", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "Tech", "Monotheism", "Player",FALSE + } +target_reqs = + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE + } +[actionenabler_attack_from_non_native_nonmil_attacker_pd_no_m] +action = "Attack" actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "GameLoss", "Local", TRUE - "DiplRel", "Foreign", "Local", FALSE - "MinMoveFrags", "1", "Local", TRUE - "UnitState", "OnLivableTile", "Local", TRUE + { "type", "name", "range", "present" + "UnitFlag", "NonMilAttack", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + "UnitClassFlag", "AttFromNonNative", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "Tech", "Monotheism", "Player",FALSE } -target_reqs = - { "type", "name", "range", "present" - "MaxUnitsonTile","0", "Local", TRUE +target_reqs = + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE } - -;UPGRADE - all the below need Missile=FALSE after merge with main branch ;--------------------------------------------------------------------------- +; Last one. For PAX DEI on your own territory, it's legal. +;--------------------------------------------------------------------------- +;Native attack ALWAYS allowed for units who aren't CargoRestrained +[actionenabler_landclass_attacker_native_unrestrained_pd_m_domestic] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMil", "Local", FALSE + "UnitClassFlag","CargoRestrained","Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "UnitState", "OnNativeTile", "Local", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "UnitState", "OnDomesticTile", "Local", TRUE + } ;Native attack ALWAYS allowed for units who aren't CargoRestrained -[actionenabler_attack_native_unrestrained] +[actionenabler_non_landclass_attacker_native_unrestrained_pd_m_domestic] action = "Attack" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "NonMil", "Local", FALSE -; "UnitClassFlag","Missile", "Local", FALSE "UnitClassFlag","CargoRestrained","Local", FALSE "MinMoveFrags", "1", "Local", TRUE "UnitState", "OnNativeTile", "Local", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", FALSE "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "UnitState", "OnDomesticTile", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE } ;Native attack for CargoRestrained units allowed, if not Transported -[actionenabler_attack_native_restrained] +[actionenabler_landclass_attacker_native_restrained_pd_m_domestic] action = "Attack" -;Should Archers attack from Rivers? Probably, but then what is the Pandora's box? Muskets, etc? actor_reqs = { "type", "name", "range", "present" "UnitFlag", "NonMil", "Local", FALSE -; "UnitClassFlag","Missile", "Local", FALSE "UnitClassFlag","CargoRestrained","Local", TRUE "MinMoveFrags", "1", "Local", TRUE "UnitState", "OnNativeTile", "Local", TRUE "UnitState", "Transported", "Local", FALSE + "UnitClassFlag","TerrainSpeed", "Local", TRUE "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "UnitState", "OnDomesticTile", "Local", TRUE } -;Commerce units have to be NonMil to enter peaceful waters -;but they can also attack those with whom they are at war: -[actionenabler_attack_native_nonmil_attacker] +;Non-Land units can't attack Bunkers +[actionenabler_non_landclass_attacker_native_restrained_pd_m_domestic] action = "Attack" actor_reqs = { "type", "name", "range", "present" - "UnitFlag", "NonMilAttack", "Local", TRUE -; "UnitClassFlag","Missile", "Local", FALSE - "UnitClassFlag","CargoRestrained","Local", FALSE + "UnitFlag", "NonMil", "Local", FALSE + "UnitClassFlag","CargoRestrained","Local", TRUE "MinMoveFrags", "1", "Local", TRUE "UnitState", "OnNativeTile", "Local", TRUE + "UnitState", "Transported", "Local", FALSE + "UnitClassFlag", "TerrainSpeed", "Local", FALSE "DiplRel", "War", "Local", TRUE - } + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "UnitState", "OnDomesticTile", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE + } ;Marines -[actionenabler_attack_marines] +[actionenabler_attack_marines_pd_m_domestic] action = "Attack" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "NonMil", "Local", FALSE -; "UnitClassFlag","Missile", "Local", FALSE "MinMoveFrags", "1", "Local", TRUE "UnitFlag", "Marines", "Local", TRUE "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "UnitState", "OnDomesticTile", "Local", TRUE } -[actionenabler_attack_from_non_native] +[actionenabler_landclass_attack_from_non_native_pd_m_domestic] action = "Attack" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "NonMil", "Local", FALSE -; "UnitClassFlag", "Missile", "Local", FALSE "MinMoveFrags", "1", "Local", TRUE "UnitClassFlag", "AttFromNonNative", "Local", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", TRUE "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "UnitState", "OnDomesticTile", "Local", TRUE } -[actionenabler_attack_from_non_native_nonmil_attacker] +[actionenabler_non_landclass_attack_from_non_native_pd_m_domestic] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMil", "Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "UnitClassFlag", "AttFromNonNative", "Local", TRUE + "UnitClassFlag", "TerrainSpeed", "Local", FALSE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "UnitState", "OnDomesticTile", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE + } +; ***** NON-MIL ATTACKER rules (commerce units) +;Commerce units have to be NonMil to enter peaceful waters +;but they can also attack those with whom they are at war: +[actionenabler_attack_native_nonmil_attacker_pd_m_domestic] +action = "Attack" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "NonMilAttack", "Local", TRUE + "UnitClassFlag","CargoRestrained","Local", FALSE + "MinMoveFrags", "1", "Local", TRUE + "UnitState", "OnNativeTile", "Local", TRUE + "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "UnitState", "OnDomesticTile", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE + } +[actionenabler_attack_from_non_native_nonmil_attacker_pd_m_domestic] action = "Attack" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "NonMilAttack", "Local", TRUE -; "UnitClassFlag", "Missile", "Local", FALSE "MinMoveFrags", "1", "Local", TRUE "UnitClassFlag", "AttFromNonNative", "Local", TRUE "DiplRel", "War", "Local", TRUE + "UnitClassFlag", "Missile", "Local", FALSE + ;... + "Building", "Pax Dei", "World", TRUE + "UnitState", "OnDomesticTile", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" + "Extra", "Bunker", "Local", FALSE } - -;/* REQUIRED after merge -;[actionenabler_explode_missile] -;action = "Suicide Attack" -;actor_reqs = -; { "type", "name", "range", "present" -; "UnitFlag", "NonMil", "Local", FALSE -; "UnitClassFlag", "Missile", "Local", TRUE -; "MinMoveFrags", "1", "Local", TRUE -; "DiplRel", "War", "Local", TRUE -; } -;*/ ;--------------------------------------------------------------------------- [actionenabler_conquer_city_native_unrestrained] action = "Conquer City" @@ -1161,10 +2115,12 @@ actor_reqs = { "type", "name", "range", "present" "UnitClassFlag", "CanOccupyCity", "Local", TRUE "UnitClassFlag", "CargoRestrained","Local", FALSE + "UnitType", "Transport Helicopter", "Local", FALSE "UnitFlag", "NonMil", "Local", FALSE "DiplRel", "War", "Local", TRUE "MinMoveFrags", "1", "Local", TRUE "UnitState", "OnLivableTile", "Local", TRUE + "Nation", "Animal Kingdom", "Player",FALSE } target_reqs = { "type", "name", "range", "present" @@ -1181,6 +2137,7 @@ actor_reqs = "DiplRel", "War", "Local", TRUE "MinMoveFrags", "1", "Local", TRUE "UnitState", "OnLivableTile", "Local", TRUE + "Nation", "Animal Kingdom", "Player",FALSE } target_reqs = { "type", "name", "range", "present" @@ -1198,6 +2155,7 @@ actor_reqs = "UnitType", "Anti-Aircraft Artillery", "Local", FALSE ;AAA got Marines flag only to enable reasonable attacks, ;not for conquering cities from a Transport. + "Nation", "Animal Kingdom", "Player",FALSE } target_reqs = { "type", "name", "range", "present" @@ -1215,6 +2173,7 @@ actor_reqs = "UnitType", "Anti-Aircraft Artillery", "Local", FALSE ;AAA got AttFromNonNative only to enable reasonable attacks, ;not for conquering cities from a Transport. + "Nation", "Animal Kingdom", "Player",FALSE } target_reqs = { "type", "name", "range", "present" @@ -1263,7 +2222,8 @@ actor_reqs = action = "Upgrade Unit" actor_reqs = { "type", "name", "range", "present" - "DiplRel", "Foreign", "Local", FALSE + "DiplRel", "Foreign", "Local", FALSE + "CityTile", "Center", "Local", TRUE } [actionenabler_airlift_unit] @@ -1291,17 +2251,26 @@ actor_reqs = "Terrain", "Grassland", "Local", FALSE } -[actionenabler_irrigate_tf] -action = "Irrigate TF" +[actionenabler_cultivate] +action = "Cultivate" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE "UnitFlag", "CanHide", "Local", FALSE -; "UnitType", "Legion", "Local", FALSE + "UnitFlag", "CanClaim", "Local", FALSE + "UnitType", "Tribesmen", "Local", FALSE "UnitType", "Proletarians", "Local", FALSE } -[actionenabler_irrigate_tf_prole] -action = "Irrigate TF" +[actionenabler_cultivate_tribesmen] +action = "Cultivate" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Settlers", "Local", TRUE + "UnitType", "Tribesmen", "Local", TRUE + "MinYear", "-2000", "World", FALSE ; they get old + } +[actionenabler_cultivate_prole] +action = "Cultivate" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE @@ -1309,19 +2278,29 @@ actor_reqs = "Gov", "Communism", "Player", TRUE } -[actionenabler_mine_tf_outside_city] -action = "Mine TF" +[actionenabler_plant_outside_city] +action = "Plant" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE - "UnitFlag", "CanHide", "Local", FALSE -; "UnitType", "Legion", "Local", FALSE + "UnitFlag", "CanHide", "Local", FALSE + "UnitFlag", "CanClaim", "Local", FALSE + "UnitType", "Tribesmen", "Local", FALSE "UnitType", "Proletarians","Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE + "UnitFlag", "Well-Digger", "Local", FALSE + "CityTile", "Center", "Local", FALSE + } +[actionenabler_plant_outside_city_tribesmen] +action = "Plant" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Settlers", "Local", TRUE + "UnitType", "Tribesmen", "Local", TRUE "CityTile", "Center", "Local", FALSE + "MinYear", "-2000", "World", FALSE ; they get old } -[actionenabler_mine_tf_outside_city_prole] -action = "Mine TF" +[actionenabler_plant_outside_city_prole] +action = "Plant" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE @@ -1329,37 +2308,70 @@ actor_reqs = "Gov", "Communism", "Player", TRUE "CityTile", "Center", "Local", FALSE } -[actionenabler_mine_tf_inside_city] ;you can't plant a forest in an existing city -action = "Mine TF" +[actionenabler_plant_inside_city] ;you can't plant a forest in an existing city +action = "Plant" actor_reqs = - { "type", "name", "range", "present" - "UnitFlag", "Settlers", "Local", TRUE -; "UnitType", "Legion", "Local", FALSE - "UnitFlag", "CanHide", "Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - "CityTile", "Center", "Local", TRUE - "Terrain", "Grassland", "Local", FALSE - "Terrain", "Plains", "Local", FALSE + { "type", "name", "range", "present" + "UnitFlag", "Settlers", "Local", TRUE + "UnitFlag", "CanHide", "Local", FALSE + "UnitFlag", "CanClaim", "Local", FALSE + "UnitFlag", "Well-Digger", "Local", FALSE + "UnitType", "Proletarians","Local", FALSE + "CityTile", "Center", "Local", TRUE + "Terrain", "Grassland", "Local", FALSE + "Terrain", "Plains", "Local", FALSE } [actionenabler_pillage] action = "Pillage" actor_reqs = - { "type", "name", "range" - "UnitClassFlag", "CanPillage", "Local" + { "type", "name", "range", "present" + "UnitClassFlag", "CanPillage", "Local", TRUE + "UnitFlag", "Cant_Pillage", "Local", FALSE + "MinMoveFrags", "1", "Local", TRUE } [actionenabler_pillage2] action = "Pillage" actor_reqs = - { "type", "name", "range" - "UnitType", "Ground Strike Fighter", "Local" + { "type", "name", "range", "present" + "UnitType", "Dive Bomber", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + } +[actionenabler_pillage2a] +action = "Pillage" +actor_reqs = + { "type", "name", "range", "present" + "UnitType", "Ground Strike Fighter", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE } [actionenabler_pillage3] action = "Pillage" actor_reqs = - { "type", "name", "range" - "UnitType", "Jet Bomber", "Local" + { "type", "name", "range", "present" + "UnitType", "Strategic Bomber", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + } +[actionenabler_pillage3a] +action = "Pillage" +actor_reqs = + { "type", "name", "range", "present" + "UnitType", "Jet Bomber", "Local", TRUE + "MinMoveFrags", "1", "Local", TRUE + } + +[actionenabler_clean_pollution] +action = "Clean Pollution" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Settlers", "Local", TRUE + "UnitFlag", "NonMil", "Local", TRUE + } +[actionenabler_clean_fallout] +action = "Clean Fallout" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Settlers", "Local", TRUE + "UnitFlag", "NonMil", "Local", TRUE } [actionenabler_fortify] @@ -1374,20 +2386,23 @@ actor_reqs = ;******************************** ROADS ************************ [actionenabler_road] -action = "Road" +action = "Build Road" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE "UnitFlag", "CanHide", "Local", FALSE + "UnitFlag", "CanClaim", "Local", FALSE "UnitType", "Proletarians", "Local", FALSE + "UnitType", "Tribesmen", "Local", FALSE "UnitState", "Transported", "Local", FALSE ; Prevent quay exploit } [actionenabler_road1] ; can't road while transported in foreign lands -action = "Road" +action = "Build Road" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE "UnitFlag", "CanHide", "Local", FALSE + "UnitFlag", "CanClaim", "Local", FALSE "UnitType", "Proletarians", "Local", FALSE "UnitState", "Transported", "Local", TRUE } @@ -1396,21 +2411,32 @@ target_reqs = "CityTile", "Claimed", "Local", FALSE } [actionenabler_road2_sea_bridge] -action = "Road" +action = "Build Road" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE "UnitFlag", "CanHide", "Local", FALSE - "Tech", "Explosives", "Player", TRUE + "UnitFlag", "CanClaim", "Local", FALSE + "Tech", "Steel", "Player", TRUE "UnitType", "Proletarians", "Local", FALSE + "UnitType", "Tribesmen", "Local", FALSE } target_reqs = { "type", "name", "range", "present" "TerrainClass", "Oceanic", "Local", TRUE "TerrainClass", "Land", "CAdjacent",TRUE } +[actionenabler_road_tribesmen] +action = "Build Road" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Settlers", "Local", TRUE + "UnitType", "Tribesmen", "Local", TRUE + "UnitState", "Transported", "Local", FALSE ; Prevent quay exploit + "MinYear", "-2000", "World", FALSE ; they get old + } [actionenabler_road_prole] -action = "Road" +action = "Build Road" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE @@ -1419,7 +2445,7 @@ actor_reqs = "UnitState", "Transported", "Local", FALSE ; Prevent quay exploit } [actionenabler_road_prole1] ; can't road while transported in foreign lands -action = "Road" +action = "Build Road" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE @@ -1432,7 +2458,7 @@ target_reqs = "CityTile", "Claimed", "Local", FALSE } [actionenabler_road_prole2_sea_bridge] -action = "Road" +action = "Build Road" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE @@ -1446,7 +2472,7 @@ target_reqs = "TerrainClass", "Land", "CAdjacent",TRUE } [actionenabler_legion_road] -action = "Road" +action = "Build Road" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE @@ -1457,7 +2483,7 @@ actor_reqs = ; Don't force legions to road BEFORE making a fortress ; from fortress being "domestic national territory" [actionenabler_legion_road2] -action = "Road" +action = "Build Road" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE @@ -1472,8 +2498,24 @@ actor_reqs = { "type", "name", "range", "present" "UnitFlag", "CanFortress", "Local", TRUE "UnitType", "Proletarians", "Local", FALSE + "UnitType", "Marines", "Local", FALSE "UnitFlag", "Well-Digger", "Local", FALSE } +;Somewhat counterintuitive but this results in Marines able to build +;Forts and airbases, though no airbase inside an existing fort, +;because otherwise they'd also be able to build Fortresses. +[actionenabler_marines_can_fort_only] +action = "Build Base" +actor_reqs = + { "type", "name", "range", "present" + "UnitType", "Marines", "Local", TRUE + "UnitState", "Transported", "Local", FALSE + "UnitFlag", "CanFortress", "Local", TRUE + } +target_reqs = + { "type", "name", "range", "present" + "Extra", "Fort", "Local", FALSE + } [actionenabler_base_prole] action = "Build Base" actor_reqs = @@ -1486,7 +2528,11 @@ actor_reqs = action = "Build Base" actor_reqs = { "type", "name", "range", "present" - "UnitFlag", "CanHide", "Local", TRUE +; Hard contradiction between Tile Claim and Hideout is necessary so that +; the actionenabler for one never allows the other to be made. TODO: +; req is just a CanHide unit, when actionenabler req can check base type: + "UnitFlag", "CanHide", "Local", TRUE + "UnitFlag", "CanClaim", "Local", FALSE "UnitState", "OnLivableTile", "Local", TRUE "DiplRel", "Foreign", "Local", FALSE } @@ -1494,29 +2540,88 @@ actor_reqs = action = "Build Base" actor_reqs = { "type", "name", "range", "present" - "UnitFlag", "CanHide", "Local", TRUE "UnitState", "OnLivableTile", "Local", TRUE +; Hard contradiction between Tile Claim and Hideout is necessary so that +; the actionenabler for one never allows the other to be made. TODO: +; req is just a CanHide unit, when actionenabler req can check base type: + "UnitFlag", "CanHide", "Local", TRUE + "UnitFlag", "CanClaim", "Local", FALSE } target_reqs = { "type", "name", "range", "present" - "CityTile", "Claimed", "Local", FALSE + "CityTile", "Claimed", "Local", FALSE } ;******************************************************* +[actionenabler_build_tileclaim_domestic] +action = "Build Base" +actor_reqs = + { "type", "name", "range", "present" +; Hard contradiction between Tile Claim and Hideout is necessary so that +; the actionenabler for one never allows the other to be made. TODO: +; req is just a military unit, when actionenabler req can check base type: + "UnitState", "OnLivableTile", "Local", TRUE ; disallow sea claims +;-------------------------------- + "UnitFlag", "CanClaim", "Local", TRUE + "UnitFlag", "CanHide", "Local", FALSE + "DiplRel", "Foreign", "Local", FALSE + } +target_reqs = + { "type", "name", "range","present" + "CityTile", "Claimed", "Local", TRUE ; ensures inside domestic territory + } +[actionenabler_build_tileclaim_nondomestic] +action = "Build Base" +actor_reqs = + { "type", "name", "range", "present" +; Hard contradiction between Tile Claim and Hideout is necessary so that +; the actionenabler for one never allows the other to be made. Currently, +; that req is CanClaim which never co-exists with CanHide in the same unit. +; "TerrainClass", "Land", "Adjacent", TRUE ; can't allow extending sea claims ad infinitum +; "DiplRel", "Foreign", "Local", TRUE ; can claim unclaimed territory +; "DiplRel", "Armistice", "Local", FALSE ; allow negotiating tile exchanges +; "DiplRel", "Alliance", "Local", FALSE ; " +; "DiplRel", "Peace", "Local", FALSE ; casus belli allows retaliation if needed. +;-------------------------------- + "UnitState", "OnLivableTile", "Local", TRUE ; disallow sea claims + "UnitFlag", "CanClaim", "Local", TRUE + "UnitFlag", "CanHide", "Local", FALSE + "Extra", "Tile Claim", "Adjacent", TRUE + "MaxUnitsOnTile", "1", "Local", FALSE ; need a diplo + 1 other unit. + } +target_reqs = + { "type", "name", "range","present" + ; "CityTile", "Claimed", "Local", TRUE ; can claim unclaimed lands too + } +;******************************************************* [actionenabler_mining] action = "Build Mine" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE "UnitFlag", "Well-Digger", "Local", FALSE -; "UnitType", "Legion", "Local", FALSE "UnitFlag", "CanHide", "Local", FALSE + "UnitFlag", "CanClaim", "Local", FALSE "UnitType", "Proletarians", "Local", FALSE + "UnitType", "Tribesmen", "Local", FALSE } target_reqs = { "type", "name", "range", "present" "TerrainFlag", "Oil", "Local", FALSE } +[actionenabler_mining_tribesmen] +action = "Build Mine" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Settlers", "Local", TRUE + "UnitType", "Tribesmen", "Local", TRUE + "UnitState", "Transported", "Local", FALSE + "MinYear", "-2000", "World", FALSE ; they get old + } +target_reqs = + { "type", "name", "range", "present" + "TerrainFlag", "Oil", "Local", FALSE + } [actionenabler_mining_prole] action = "Build Mine" actor_reqs = @@ -1529,15 +2634,16 @@ target_reqs = { "type", "name", "range", "present" "TerrainFlag", "Oil", "Local", FALSE } - + [actionenabler_desert_oil] action = "Build Mine" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE -; "UnitType", "Legion", "Local", FALSE - "UnitFlag", "CanHide", "Local", FALSE + "UnitFlag", "CanHide", "Local", FALSE + "UnitFlag", "CanClaim", "Local", FALSE "UnitType", "Proletarians", "Local", FALSE + "UnitType", "Tribesmen", "Local", FALSE "UnitFlag", "Well-Digger", "Local", FALSE "Tech", "Construction", "Player", TRUE } @@ -1564,15 +2670,16 @@ action = "Build Mine" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE -; "UnitType", "Legion", "Local", FALSE "UnitFlag", "CanHide", "Local", FALSE + "UnitFlag", "CanClaim", "Local", FALSE "UnitType", "Proletarians", "Local", FALSE "UnitFlag", "Well-Digger", "Local", FALSE + "UnitType", "Tribesmen", "Local", FALSE "Tech", "Refining", "Player", TRUE } target_reqs = { "type", "name", "range" - "Terrain", "Arctic", "Local" + "Terrain", "Glacier", "Local" } [actionenabler_arctic_oil_prole] action = "Build Mine" @@ -1585,7 +2692,7 @@ actor_reqs = } target_reqs = { "type", "name", "range" - "Terrain", "Arctic", "Local" + "Terrain", "Glacier", "Local" } [actionenabler_irrigate_welldigger] @@ -1603,50 +2710,61 @@ target_reqs = "Tech", "Alphabet","Player", FALSE "Tech", "Writing", "World", FALSE } - + +[actionenabler_irrigate_src_city_chand_baori] +action = "Build Irrigation" +actor_reqs = + { "type", "name", "range", "present" + "UnitFlag", "Settlers", "Local", TRUE + "UnitFlag", "CanHide", "Local", FALSE + "UnitFlag", "CanClaim", "Local", FALSE + "Building", "Chand Baori", "Player",TRUE + } +target_reqs = + { "type", "name", "range", "present" + "CityTile", "Center", "Adjacent", TRUE + } + [actionenabler_irrigate_src_ocean] action = "Build Irrigation" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE "UnitFlag", "Well-Digger", "Local", FALSE -; "UnitType", "Legion", "Local", FALSE "UnitFlag", "CanHide", "Local", FALSE + "UnitFlag", "CanClaim", "Local", FALSE "UnitType", "Proletarians", "Local", FALSE + "UnitType", "Tribesmen", "Local", FALSE } target_reqs = { "type", "name", "range", "present" "TerrainClass", "Oceanic", "CAdjacent", TRUE } -[actionenabler_irrigate_src_ocean_prole] +[actionenabler_irrigate_src_ocean_tribesmen] action = "Build Irrigation" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player",TRUE + "UnitType", "Tribesmen", "Local", TRUE + "MinYear", "-2000", "World", FALSE ; they get old } target_reqs = { "type", "name", "range", "present" "TerrainClass", "Oceanic", "CAdjacent", TRUE } - -[actionenabler_irrigate_src_river] ;canal and waterway too +[actionenabler_irrigate_src_ocean_tribesmen_chand_baori] action = "Build Irrigation" actor_reqs = { "type", "name", "range", "present" + "Building", "Chand Baori", "Player", TRUE "UnitFlag", "Settlers", "Local", TRUE -; "UnitType", "Legion", "Local", FALSE - "UnitFlag", "CanHide", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE - "UnitFlag", "Well-Digger", "Local", FALSE + "UnitType", "Tribesmen", "Local", TRUE } target_reqs = - { "type", "name", "range", "present" - "ExtraFlag", "IrrigationSource", "CAdjacent", TRUE -; "Extra", "River", "CAdjacent", TRUE + { "type", "name", "range", "present" + "TerrainClass", "Oceanic", "CAdjacent", TRUE } -[actionenabler_irrigate_src_river_prole] ;canal and water way too +[actionenabler_irrigate_src_ocean_prole] action = "Build Irrigation" actor_reqs = { "type", "name", "range", "present" @@ -1655,53 +2773,53 @@ actor_reqs = "Gov", "Communism", "Player",TRUE } target_reqs = - { "type", "name", "range", "present" - "ExtraFlag", "IrrigationSource", "CAdjacent", TRUE -; "Extra", "River", "CAdjacent", TRUE + { "type", "name", "range", "present" + "TerrainClass", "Oceanic", "CAdjacent", TRUE } - -[actionenabler_irrigate_src_oasis] + +[actionenabler_irrigate_from_source] action = "Build Irrigation" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE -; "UnitType", "Legion", "Local", FALSE "UnitFlag", "CanHide", "Local", FALSE + "UnitFlag", "CanClaim", "Local", FALSE "UnitType", "Proletarians", "Local", FALSE + "UnitType", "Tribesmen", "Local", FALSE "UnitFlag", "Well-Digger", "Local", FALSE } target_reqs = { "type", "name", "range", "present" - "Extra", "Oasis", "CAdjacent", TRUE - } -[actionenabler_irrigate_src_oasis_prole] + "ExtraFlag", "IrrigationSource", "CAdjacent", TRUE + } +[actionenabler_irrigate_from_source_chand_baori] action = "Build Irrigation" actor_reqs = { "type", "name", "range", "present" + "Building", "Chand Baori", "Player", TRUE "UnitFlag", "Settlers", "Local", TRUE - "UnitType", "Proletarians", "Local", TRUE - "Gov", "Communism", "Player",TRUE + "UnitFlag", "CanHide", "Local", FALSE + "UnitFlag", "CanClaim", "Local", FALSE + "UnitType", "Proletarians", "Local", FALSE + "UnitFlag", "Well-Digger", "Local", FALSE } target_reqs = { "type", "name", "range", "present" - "Extra", "Oasis", "CAdjacent", TRUE - } - -[actionenabler_irrigate_src_irrigation] + "ExtraFlag", "IrrigationSource", "Adjacent", TRUE + } +[actionenabler_irrigate_from_source_tribesmen] action = "Build Irrigation" actor_reqs = { "type", "name", "range", "present" "UnitFlag", "Settlers", "Local", TRUE - "UnitFlag", "Well-Digger", "Local", FALSE - "UnitType", "Proletarians", "Local", FALSE -; "UnitType", "Legion", "Local", FALSE - "UnitFlag", "CanHide", "Local", FALSE + "UnitType", "Tribesmen", "Local", TRUE + "MinYear", "-2000", "World", FALSE ; they get old } target_reqs = - { "type", "name", "range", "present" - "Extra", "Irrigation", "CAdjacent", TRUE + { "type", "name", "range", "present" + "ExtraFlag", "IrrigationSource", "CAdjacent", TRUE } -[actionenabler_irrigate_src_irrigation_prole] +[actionenabler_irrigate_from_source_prole] action = "Build Irrigation" actor_reqs = { "type", "name", "range", "present" @@ -1710,23 +2828,132 @@ actor_reqs = "Gov", "Communism", "Player",TRUE } target_reqs = - { "type", "name", "range", "present" - "Extra", "Irrigation", "CAdjacent", TRUE + { "type", "name", "range", "present" + "ExtraFlag", "IrrigationSource", "CAdjacent", TRUE } - -; NOT IMPLEMENTED IN SERVER YET -;[actionenabler_unload] -;action = "Transport Unload" +;NO LONGER NEEDED NOW THAT WE USE IrrigationSource flag: +;[actionenabler_irrigate_src_oasis] +;action = "Build Irrigation" +;actor_reqs = +; { "type", "name", "range", "present" +; "UnitFlag", "Settlers", "Local", TRUE +; "UnitFlag", "CanHide", "Local", FALSE +; "UnitFlag", "CanClaim", "Local", FALSE +; "UnitType", "Proletarians", "Local", FALSE +; "UnitFlag", "Well-Digger", "Local", FALSE +; } +;target_reqs = +; { "type", "name", "range", "present" +; "Extra", "Oasis", "CAdjacent", TRUE +; } +;[actionenabler_irrigate_src_oasis_prole] +;action = "Build Irrigation" ;actor_reqs = -; { "type", "name", "range" -; "UnitState", "Transporting", "Local" +; { "type", "name", "range", "present" +; "UnitFlag", "Settlers", "Local", TRUE +; "UnitType", "Proletarians", "Local", TRUE +; "Gov", "Communism", "Player",TRUE ; } ;target_reqs = -; { "type", "name", "range" -; "UnitState", "OnLivableTile", "Local" -; "UnitState", "Transported", "Local" +; { "type", "name", "range", "present" +; "Extra", "Oasis", "CAdjacent", TRUE +; } +; +;[actionenabler_irrigate_src_irrigation] +;action = "Build Irrigation" +;actor_reqs = +; { "type", "name", "range", "present" +; "UnitFlag", "Settlers", "Local", TRUE +; "UnitFlag", "Well-Digger", "Local", FALSE +; "UnitType", "Proletarians", "Local", FALSE +; "UnitFlag", "CanHide", "Local", FALSE +; "UnitFlag", "CanClaim", "Local", FALSE +; } +;target_reqs = +; { "type", "name", "range", "present" +; "Extra", "Irrigation", "CAdjacent", TRUE +; } +;[actionenabler_irrigate_src_irrigation_prole] +;action = "Build Irrigation" +;actor_reqs = +; { "type", "name", "range", "present" +; "UnitFlag", "Settlers", "Local", TRUE +; "UnitType", "Proletarians", "Local", TRUE +; "Gov", "Communism", "Player",TRUE +; } +;target_reqs = +; { "type", "name", "range", "present" +; "Extra", "Irrigation", "CAdjacent", TRUE ; } +[actionenabler_deboard] +action = "Transport Deboard" +actor_reqs = + { "type", "name", "range" + "UnitState", "OnLivableTile", "Local" + "UnitState", "Transported", "Local" + } +target_reqs = + { "type", "name", "range" + "UnitState", "Transporting", "Local" + } + +;TO DO: this gives ruleset control over logical requirements for +;when units can board as cargo onto transporters. This should be +;extended and exploited to finally give ruleset supreme control +;over smooth minimalist non-exploitable behaviours. +[actionenabler_board] +action = "Transport Board" +actor_reqs = + { "type", "name", "range", "present" + "DiplRel", "Armistice", "Local", FALSE + "DiplRel", "War", "Local", FALSE + "DiplRel", "Cease-fire", "Local", FALSE + "DiplRel", "Peace", "Local", FALSE + "DiplRel", "Never met", "Local", FALSE + } + +;TO DO: this gives ruleset control over logical requirements for +;when units can unload. Finally ruleset could have supreme control +;over everything, and it should be taken advantage of. +[actionenabler_unload] +action = "Transport Unload" +actor_reqs = + { "type", "name", "range" + "UnitState", "Transporting", "Local" + } +target_reqs = + { "type", "name", "range" + "UnitState", "OnLivableTile", "Local" + "UnitState", "Transported", "Local" + } + +;TO DO: this now enables ruleset to control disembarkation stipulations, rather +;than hard-coded client. This actionenabler should be extended with all the +;rules logic for mp2c, and taken advantage of for upgraded/simplified mechanics. +[actionenabler_disembark] +action = "Transport Disembark" +actor_reqs = + { "type", "name", "range" + "UnitState", "Transported", "Local" + "MinMoveFrags", "1", "Local" + } + +;TO DO: this now enables ruleset to control embarkation stipulations, rather +;than hard-coded client. This actionenabler should be extended with all the +;mp2c logic and taken advantage of for expanded/simplified/upgraded mechanics. +[actionenabler_embark] +action = "Transport Embark" +actor_reqs = + { "type", "name", "range", "present" + "MinMoveFrags", "1", "Local", TRUE + "DiplRel", "Armistice", "Local", FALSE + "DiplRel", "War", "Local", FALSE + "DiplRel", "Cease-fire", "Local", FALSE + "DiplRel", "Peace", "Local", FALSE + "DiplRel", "Never met", "Local", FALSE + } + [borders] ; Base border radius from city. radius_sq_city = 17 @@ -1808,6 +3035,11 @@ victory_min_points = 1000 ; How big lead relative to second best player is needed for victory victory_lead_pct = 200 +; How much existing history grows each turn. This makes older history +; of the same original value more valuable as newer history, as it has +; gained more interest. +history_interest_pml = 0 + ; How much each culture point affects the migration ; from/to the city. Each culture point count as this many permilles ; of a migration point. @@ -1828,8 +3060,8 @@ fragments = 0 ; Calendar fragment names. If name is missing, only a fragment number +1 (so human readable ; numbers begin from 1 and not 0) is shown. -;fragment_name0 = "Jan" -;fragment_name1 = "Feb" +;fragment_name0 = _("Jan") +;fragment_name1 = _("Feb") ; ... ; What labels are used for positive and negative years. @@ -1908,20 +3140,20 @@ negative_label = _("BC") [trade] settings = { "type", "pct", "cancelling", "bonus" - "National", 0, "Cancel", "None" - "NationalIC", 0, "Cancel", "None" - "IN", 35, "Inactive", "Gold" - "INIC", 35, "Inactive", "Gold" - "Ally", 35, "Inactive", "Gold" - "AllyIC", 35, "Inactive", "Gold" - "Enemy", 0, "Inactive", "Gold" - "EnemyIC", 0, "Inactive", "Gold" - "Team", 35, "Inactive", "Gold" - "TeamIC", 35, "Inactive", "Gold" + "National", 0, "Cancel", "None" + "NationalIC", 0, "Cancel", "None" + "IN", 35, "Inactive", "Gold" + "INIC", 35, "Inactive", "Gold" + "Ally", 35, "Inactive", "Gold" + "AllyIC", 35, "Inactive", "Gold" + "Enemy", 1, "Inactive", "Gold" ; 1 = allow establishing but still get 0 after rounding. + "EnemyIC", 1, "Inactive", "Gold" + "Team", 35, "Inactive", "Gold" + "TeamIC", 35, "Inactive", "Gold" } ; When are goods for the trade route chosen. -; "Leaving" - Goods to carry are assigned to unit when it`s built, or it changes homecity +; "Leaving" - Goods to carry are assigned to unit when it's built, or it changes homecity ; "Arrival" - Goods are chosen when trade route is established, when unit arrives to destination goods_selection = "Arrival" @@ -1956,7 +3188,8 @@ goods_selection = "Arrival" [goods_good] name = _("Goods") - +;onetime_pct = 100 ; uses standard bonus both here and in effects.ruleset (except gold only) +from_pct = 150 ; /* <-- avoid gettext warnings ; @@ -1967,11 +3200,35 @@ name = _("Goods") ; type = Type of the clause, one of "Advance", "Gold", "Map", "Seamap", ; "City", "Ceasefire", "Peace", "Alliance", "Vision", "Embassy" ; +; giver_reqs = requirements that the giving side of the clause needs to fulfill +; (see effects.ruleset and README.effects for help on requirements) +; receiver_reqs = requirements that the receiving side of the clause needs to fulfill +; ; */ <-- avoid gettext warnings -[clause_advance] +;[clause_advance_player_has_embassy] +;type = "Advance" +;giver_reqs = +; { "type", "name", "range" +; "DiplRel", "Has real embassy", "Local" +; } +;receiver_reqs = +; { "type", "name", "range" +; } +;[clause_advance_player_hosts_embassy] +;type = "Advance" +;giver_reqs = +; { "type", "name", "range" +; "DiplRel", "Hosts real embassy", "Local" +; } +;receiver_reqs = +; { "type", "name", "range" +; } + +[clause_advance_player_hosts_embassy] type = "Advance" +; /* TO DO, when the above works, apply req vector to all the below except Ceasefire and Peace */ [clause_gold] type = "Gold" @@ -2120,14 +3377,10 @@ names = ; RESTRICTINFRA ENABLED ONLY RESTRICTS ENEMY RAILS TO FUNCTION AS ROADS [settings] -; TO DISABLE SPACERACE INCLUDE THESE LINES BELOW: -; "endspaceship", DISABLED, FALSE -; "victories", "ALLIED", FALSE - set = { "name", "value", "lock" "mapsize", "PLAYER", FALSE - "tilesperplayer", 300, FALSE + "tilesperplayer", 80, FALSE "netwait", 20, FALSE "nettimeout", 120, FALSE "pingtime", 30, FALSE @@ -2137,30 +3390,43 @@ set = "aifill", 6, FALSE "airliftingstyle", "FROM_ALLIES|TO_ALLIES", FALSE "airliftdestdivisor", 3, FALSE + "animals", 0, FALSE + "armisticelength", 5, FALSE "autoattack", "enabled", FALSE "autoattack_style", 1, FALSE "barbarians", "DISABLED", FALSE + "blueprints", 80, FALSE "borders", "SEE_INSIDE", FALSE + "casusbelli_allies", 1, FALSE ; casus belli on one, is casus belli on all (allies). + "casusbelliturns", 12, FALSE ; how many turns casus belli lasts after an incident, if not reset. will go +1 higher for further incidents. will be reset by any new non-aggression pact. + "ceasefirelength", 15, FALSE + "city_output_style", 1, FALSE ; whether tiles and specialists have WYSIWYG output, or calculate output for gold/science AFTER city growth/shrink events. "contactturns", 10, FALSE - "conquercost", 0, FALSE + "conquercost", 0, FALSE ; thefts/conquests at 0 means we use (100-blueprints%) tax on theft/conquest. if blueprints off then 0 means no tax (or override it to a val) "diplomacy", "ALL", FALSE "diplgoldcost", 5, FALSE - "diplbulbcost", 5, FALSE + "diplbulbcost", 0, FALSE ; tech trades are overridden by blueprint %; if blueprints are off, there is no tax on theft/conquest. "dispersion", 0, FALSE - "endspaceship", "ENABLED", FALSE + "endspaceship", "DISABLED", FALSE ; prevent game from instantly ending "foggedborders", TRUE, FALSE - "freecost", 0, FALSE + "fixedlength", "ENABLED", TRUE ; Turn done doesn't advance turn if there is a timeout. + "freecost", 1, FALSE ; 0 would get overridden by the 'blueprints' setting: 1 gives 99% of the bulbs of the tech awarded by Philosophy. + "fulldisorder", "ENABLED", FALSE ; disorder fully halts one turn of production or buying in a city: closes lots of complex time-consuming micromanaged exploits one would feel obligated to do to be competitive "generator", "RANDOM", FALSE "gold", 70, FALSE + "globalwarming", 50, FALSE + "globalwarming_percent", 50, FALSE "hideouts", TRUE, FALSE - "huts", 10, FALSE - "killcitizen_pct", 60, FALSE ; regulates % chance of pop kill by city pop-killer units + "hangry", 1, FALSE ; Famine causes disorder. Closes a flaw where people are happier starving with lux than food and less lux. Helps re-balance rapture vs non-rapture govs (martial law/gulag effect/etc.) + "huts", 20, FALSE + "killcitizen_pct", 50, FALSE ; regulates % chance of pop kill by city pop-killer units "landmass", 63, FALSE - "looting", "BASE_TRADE", FALSE + "looting", "PROPERTY", FALSE "minplayers", 0, FALSE "move_bonus_in_frags", "ENABLED", TRUE ;locked + "multiresearch", "ENABLED", FALSE "nationset", "all", FALSE - "nuclearwinter_percent", 15, FALSE + "nuclearwinter_percent", 50, FALSE "nukes_minor", "ENABLED", FALSE ; set to DISABLED to completely disallow nuclear detonations "nukes_major", "ENABLED", FALSE ; set to DISABLED to disallow nuclear fusion weapons "polarstrip", "DISABLED", FALSE ; blocks making horizontal polar strips on most generators @@ -2171,19 +3437,20 @@ set = "slot_control_style", 1, FALSE ; 1 = Shield2Gold units only "spaceship_travel_time", 225, FALSE "specials", 350, FALSE - "startpos", "SINGLE", FALSE - "startunits", "xxcccwwwaADD", FALSE + "startcity", "ENABLED", FALSE + "startpos", "DEFAULT", FALSE + "startunits", "wwwAxa", "FALSE" ;3 Tribesmen, 3 Workers, 1 Caravan, 1 Founders, 2 Settlers, 1 Well-Digger + "steepness", 20, FALSE "techleak", 25, FALSE "techlossforgiveness", 200, FALSE "techlossrestore", 100, FALSE "techpenalty", 0, FALSE "temperature", 50, FALSE - "tilesperplayer", 290, FALSE "tinyisles", "DISABLED", FALSE - "wetness", 50, FALSE - "steepness", 30, FALSE + "steepness", 15, FALSE "tinyisles", FALSE, FALSE - "trademindist", 12, FALSE + "trademindist", 15, FALSE + "trademinforeign", 15, FALSE "trade_revenue_style", "SIMPLE", FALSE ;"simple" formula based on average trade in both cities (sans distance etc.) "trading_city", "DISABLED", FALSE "topology", "WRAPX", FALSE @@ -2192,6 +3459,10 @@ set = "unload_override", 0, FALSE ;0=native unloading same as non-native. 1+ = move_fragment cost for unloading. "unreachableprotects", "ENABLED", FALSE "unitwaittime_style", "ACTIVITIES|FORTIFY|DELAYGOTO", FALSE + "wetness", 50, FALSE "victories", "ALLIED|SPACERACE", FALSE "zoc_purity", "ENABLED", FALSE ; igZOC units don't lift ZOC for units subject to ZOC +; TESTING ONLY, REMOVE FOR SURE: *(***************************************) +; "fogofwar", FALSE, FALSE +; "revealmap", "start", FALSE } diff --git a/freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/governments.ruleset b/freeciv/freeciv/data/mp2c-occ/governments.ruleset similarity index 60% rename from freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/governments.ruleset rename to freeciv/freeciv/data/mp2c-occ/governments.ruleset index e10046924..b94ba8b8c 100644 --- a/freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/governments.ruleset +++ b/freeciv/freeciv/data/mp2c-occ/governments.ruleset @@ -11,7 +11,7 @@ ; than minor changes. [datafile] -description="Avant-garde governments data for Freeciv" +description="Governments data for Freeciv" options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" format_version=20 @@ -28,7 +28,7 @@ during_revolution="Anarchy" ; ; For the "official" rulesets, the order of these sections should not ; be changed because that would break backward compatability with -; savegames. (In particular, if Fundamentalism is added to default +; savegames. (In particular, if Theocracy is added to default ; ruleset, should be added at end.) ; ; Notes on fields: @@ -46,8 +46,13 @@ during_revolution="Anarchy" ; otherwise may be "-" ; ai_better = AI will not consider this government for use if the ; government listed here is available -; ruler_titles = ruler titles by nation, "-" is default, and non-matched -; nations are ignored +; ruler_male_title = The default male ruler title for the government type. +; It's a format string where name of the ruler is marked +; by '%s'. +; Individual nations may override this by their +; own title. +; ruler_female_title = The default female ruler title for the government type. +; See above ruler_male_title. ; helptext = optional help text string; should escape all raw newlines ; so that xgettext parsing works ; @@ -72,7 +77,7 @@ Anarchy is simply the absence of any recognizable government.\ penalty if they produce 3 or more of any resource.\ "), _("\ Anarchy offers slightly less corruption than Despotism,\ - but slightly more unhappiness.\ + but slightly more unhappiness. \n\ "), _("\ No citizens are made unhappy by each aggressive unit.\n\ 25% Base corruption in cities\n\ @@ -95,14 +100,15 @@ helptext = _("\ Under Despotism, you are the absolute ruler of your people. Your\ control over your citizens is maintained largely by martial law.\ Under Despotism, tiles suffer a -1 tile output penalty if they\ - produce 3 resource points.\ + produce 3 resource points. \ "), _("\ Despotism suffers the highest level of corruption of all\ - forms of government.\ + forms of government.\n\ \ "), _("\ -No citizens are made unhappy by each aggressive unit.\n\ -37% Base corruption in cities\n\ -4% Extra corruption per each tile in distance from capital\n\ +Gulag:You can starve cities without disorder, with 2 martial law units. \n\ +No citizens are made unhappy by each aggressive unit. \n\ +37% Base corruption in cities \n\ +4% Extra corruption per each tile in distance from capital \n\ ") ;------------------------------------------------------------------------ @@ -121,51 +127,14 @@ ruler_female_title = _("Queen %s") helptext = _("\ Under Monarchy, a king or queen serves as a hereditary figurehead\ - for your government.\ + for your government. \ "), _("\ Monarchy suffers the same small amount of corruption that\ - the Republic does.\ -"), _("\ -No citizens are made unhappy by each aggressive unit.\n\ -15% Base corruption in cities\n\ -2% Extra corruption per each tile in distance from capital\n\ -") - -;------------------------------------------------------------------------ -[government_communism] - -name = _("Communism") -reqs = { "type", "name", "range" - "tech", "Communism", "Player" - } -graphic = "gov.communism" -graphic_alt = "-" - -ruler_male_title = _("Comrade %s") -ruler_female_title = _("?female:Comrade %s") - -helptext = _("\ -In Communism, all work, output, and goods are owned by the state.\ -"), _("\ -Corruption does not vary by distance from the capital;\ - all cities have the same base level of corruption. Each city gets 4\ - units free of upkeep. Buildings with 1 upkeep are free.\ - The capital city with Palace gets a +25% production bonus.\ -"), _("\ -Communist governments get a cost discount of -5 on Riflemen and -10\ - on Dive Bombers. Diplomats and Spies are produced with +1 veteran\ - status. The effect of Cathedrals and Michelangelo is reduced -1.\ -"), _("\ -Communist states can transfer Proletarians between cities to\ - re-distribute population. Large numbers of Proletarians can be\ - used to finish State projects. The Communism tech allows a\ - Communist government to convert Workers to Riflemen and vice\ - versa, if inside national territory and if possessing the necessary\ - technologies.\ + the Republic does. \ "), _("\ -No citizens are made unhappy by each aggressive unit.\n\ -20% Base corruption in cities\n\ -No Extra corruption per each tile in distance from capital\n\ +No citizens are made unhappy by each aggressive unit. \n\ +15% Base corruption in cities \n\ +2% Extra corruption per each tile in distance from capital \n\ ") ;------------------------------------------------------------------------ @@ -187,9 +156,9 @@ Under a Republican government, citizens hold an election to select a\ remain popular to remain in control, citizens are given a greater\ degree of freedom. Citizens under the Republic become unhappy\ easily, but the self-sufficiency of your citizens allows high levels\ - of trade.\ + of trade. \n\ "), _("\ -1 citizen is made unhappy by each aggressive unit*.\n\ +1 citizen is made unhappy by each aggressive unit*. \n\ (* first aggressive unit does not cause unhappy)\n\ 15% Base corruption in cities\n\ 2% Extra corruption per each tile in distance from capital\n\ @@ -210,49 +179,123 @@ ruler_female_title = _("?female:Prime Minister %s") helptext = _("\ Under Democracy, citizens govern directly by voting on issues.\ - Democracy offers the highest possible level of trade, but also\ - offers the most potential for unhappiness. There is no corruption\ - during Democracy, but citizens become very upset during\ - wars.\ -Democracy revolts to Anarchy if any city remains in disorder for two turns.\ - Cities and units belonging to Democracy cannot be incited or bribed.\ + Democracy offers the highest level of trade. Base corruption\ + is half that of Republic or Monarchy, and corruption from distance to\ + a capital is very low. Citizens become very upset during wars.\ + Democracy revolts to Anarchy if any city remains in disorder for two turns.\ + Cities and units belonging to Democracy have triple the cost\ + to incite or bribe, respectively. \n\ "), _("\ -2 citizens are made unhappy by each aggressive unit.\n\ -No base corruption in cities\n\ -No extra corruption per each tile in distance from capital\n\ +2 citizens are made unhappy by each aggressive unit. \n\ +8% Base corruption in cities\n\ +0.4% Extra corruption per each tile in distance from capital\n\ ") + ;------------------------------------------------------------------------ -[government_fundamentalism] +[government_theocracy] -name = _("Fundamentalism") +name = _("Theocracy") reqs = { "type", "name", "range" - "tech", "Fundamentalism", "Player" + "tech", "Theocracy", "Player" } -graphic = "gov.fundamentalism" +graphic = "gov.theocracy" graphic_alt = "-" ruler_male_title = _("High Priest %s") ruler_female_title = _("High Priestess %s") helptext = _("\ -Fundamentalism is organized around central beliefs, usually religious. These form\ - rigid guidelines for the actions of the rulers and the people.\ +Theocracy is formed on religious beliefs which are the law of the land. \ "), _("\ -The people are entirely devoted to their beliefs, and are often willing to die to\ - preserve them. Enemies cannot establish hostile embassies without first making Cease-Fire\ - or Peace. Theocratic rule causes science output to suffer by 50%.\ +The people are devoted and often willing to die for their faith. Cities very\ + near a capital have very low corruption. Cost for enemies to incite cities or\ + bribe units is 2x, but Zealots cannot be bribed. Enemies cannot establish\ + embassies without first making Ceasefire or Peace. \ "), _("\ -Improvements that appease unhappy citizens produce gold tithes equal to\ - the number of citizens they would appease. Fanatics cannot be bribed. Palace\ - gives +50% to gold income in its city. In each city, two military units may impose\ - martial law, each making one citizen content. Pilgrims can be used to migrate and\ - grow the population in the cities directed by the ruling High Priest.\ +Improvements that appease unhappy citizens add +1 base gold in tithes for each\ + citizen appeased. Tithes also boost gold income by +20%, but science output\ + suffers -20%. Palace gives +50% to gold income in its city. In cities, two\ + military units may impose martial law, affecting one citizen each. Pilgrims\ + can be made to migrate and grow cities. \n\ "), _("\ -No citizens are made unhappy by each aggressive unit.\n\ +No citizens are made unhappy by each aggressive unit. \n\ 2% Base corruption in cities\n\ 2% Extra corruption per each tile in distance from capital\n\ ") +;------------------------------------------------------------------------ +[government_communism] + +name = _("Communism") +reqs = { "type", "name", "range" + "tech", "Communism", "Player" + } +graphic = "gov.communism" +graphic_alt = "-" + +ruler_male_title = _("Chairman %s") +ruler_female_title = _("?female:Comrade %s") + +helptext = _("\ +In Communism, all work, output, and goods are owned by the state.\ +"), _("\ +Each city gets 4 shields of free unit upkeep. Buildings with 1 upkeep\ + are free. The city with a Palace gets +25% production. \ +"), _("\ +Riflemen cost 5 less; Armor and Dive Bombers, 10 less.\ + Diplomats and Spies get +1 vet level. The effect of\ + Cathedrals and Michelangelo is reduced -1. \ +"), _("\ +Communists can transfer Proletarians between cities to\ + re-distribute population, or use them as workers on\ + State projects. The Communism tech allows a Communist government\ + to convert Workers to Riflemen and vice versa, if in domestic\ + territory and possessing the necessary tech. \n\ +"), _("\ +Gulag:You can starve cities without disorder, with 2 martial law units. \n\ +No citizens are made unhappy by aggressive units. \n\ +20% Base corruption in cities \n\ +No Extra corruption per each tile in distance from capital \n\ +") + +;------------------------------------------------------------------------ +[government_nationalism] + +name = _("Nationalism") +reqs = { "type", "name", "range" + "tech", "Nationalism", "Player" + } +graphic = "gov.nationalism" +graphic_alt = "-" + +ruler_male_title = _("Dictator %s") +ruler_female_title = _("Dictator %s") + +helptext = _("\ +Nationalism glorifies national supremacy over other peoples.\ + Citizens and corporatations align under a dictator\ + who rules over a unified populace, military, and isolationist economy. \n\ +"), _("\ +Content cities get a +1 trade bonus on Land tiles only.\ + Celebrating cities also get Ocean tiles. Cities may rapture if founded under\ + the original national hegemony. Luxury suffers a 15% penalty.\ + Government mandated Science gets +15% in original cities. \n\ +"), _("\ +Each city gets 1 shield of free unit upkeep. The city with a Palace gets +15% production.\ + Original cities have a 3x incite cost, otherwise cost one third. \n\ +"), _("\ +Police Stations suppress +1 unhappy Foreign National and cost 10 shields less.\ + Five military units may impose martial law, affecting one citizen each.\ + Migrants can be made to help grow cities. Tile workers gain a ⅑ move\ + bonus and for every three worker turns of work put in, get a fourth\ + worker turn free. Cost of upgrades is 25% less. Riflemen are produced at +1 vet\ + level. Armor gets a +1 move bonus. Fighters and Dive Bombers have 50% higher odds of promotion. \n\ +"), _("\ +No citizens are made unhappy by each aggressive unit.\n\ +8% Base corruption in capital,\n\ +2% Extra corruption per each tile in distance from capital\n\ +") + ; /* <-- avoid gettext warnings ; ; Multipliers (aka policies) diff --git a/freeciv/freeciv/data/.historic/mp2sandbox/nations.ruleset b/freeciv/freeciv/data/mp2c-occ/nations.ruleset similarity index 89% rename from freeciv/freeciv/data/.historic/mp2sandbox/nations.ruleset rename to freeciv/freeciv/data/mp2c-occ/nations.ruleset index b59b60a46..6469005d1 100644 --- a/freeciv/freeciv/data/.historic/mp2sandbox/nations.ruleset +++ b/freeciv/freeciv/data/mp2c-occ/nations.ruleset @@ -8,7 +8,7 @@ ; use your new customized file. [datafile] -description="Multiplayer nations data for Freeciv" +description="Nations data for Freeciv" options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" format_version=20 @@ -20,9 +20,11 @@ format_version=20 ; will be saved to nations.ruleset itself. nationlist = "default/nationlist.ruleset" +*include "nation/animals.ruleset" + ; List of nations to embed to main nations.ruleset despite separate nationlist ; being used for other nations. -embedded_nations = "barbarian", "pirate" +embedded_nations = "barbarian", "pirate", "animal kingdom" [compatibility] ; Initial government for all the nations that do not @@ -55,6 +57,11 @@ aggressive_min = 30 aggressive_max = 90 aggressive_default = 50 +; Value of trait "builder" defines how much AI wants to build buildings +builder_min = 30 +builder_max = 90 +builder_default = 60 + ; Please keep [ruledit] section in sync with these includes *include "default/nationlist.ruleset" ; This ruleset uses model of two separate barbarian nations diff --git a/freeciv/freeciv/data/.historic/mp2-preArctic/parser.lua b/freeciv/freeciv/data/mp2c-occ/parser.lua similarity index 100% rename from freeciv/freeciv/data/.historic/mp2-preArctic/parser.lua rename to freeciv/freeciv/data/mp2c-occ/parser.lua diff --git a/freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/script.lua b/freeciv/freeciv/data/mp2c-occ/script.lua similarity index 56% rename from freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/script.lua rename to freeciv/freeciv/data/mp2c-occ/script.lua index bdd38e4e2..82e260a26 100644 --- a/freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/script.lua +++ b/freeciv/freeciv/data/mp2c-occ/script.lua @@ -18,6 +18,8 @@ -- This flags whether philosophy awards a bonus advance, and gets set to off (0) after T85. philosophy_possible = 1 game_turn = 0 +first_horse_warning = 0 +first_womens_suffrage = 0 --Give players custom messages on certain years. Currently at 1600 AD (T85), Philosophy expires. Let them know. function history_turn_notifications(turn, year) @@ -29,8 +31,10 @@ function history_turn_notifications(turn, year) if turn == 85 then -- Philosophy no longer gives advances after 1600 AD - notify.all("Philosophers around the world mourn the execution of Giordano Bruno. Philosophy no longer gives a bonus advance.") + notify.all("Philosophers around the world mourn the execution of Giordano Bruno. Philosophy no longer gives a bonus advance.") philosophy_possible = 0 + notify.event(nil, nil, E.BEGINNER_HELP, +_("[`events/giordano`]
[`fire`] Philosophers hide their books after Giordano Bruno is burned.
Philosophy no longer gives a bonus advance.")) end return false @@ -80,12 +84,20 @@ function tech_researched_handler(tech, player, how) if id == find.tech_type("Horseback Riding").id and how == "researched" then if game_turn < 15 then for c in player:cities_iterate() do - if c:has_building(find.building_type("Palace")) then + if c:has_building(find.building_type("Palace")) and first_horse_warning > 0 then notify.event(NIL, c.tile, E.TECH_GAIN, - _("Travellers tell stories of the amazing skills of the %s, who ride wild beasts near %s! (%i,%i)"), + _("[`horsemen`] Travellers say the %s now ride horses, near %s. (%i,%i)"), player.nation:plural_translation(), c.name, c.tile.x, c.tile.y ) - - notify.all( _("Tribesmen have learned to ride wild beasts near %s (%i,%i)"), c.name, c.tile.x, c.tile.y) + notify.all( _(" A tribe has learned to ride horses near %s (%i,%i)"), + c.name, c.tile.x, c.tile.y) + end + if c:has_building(find.building_type("Palace")) and first_horse_warning == 0 then + first_horse_warning = 1 + notify.event(NIL, c.tile, E.TECH_GAIN, + _("[`events/wildbeasts`]
[`horsemen`] Travellers tell of the %s, who ride horses near %s! (%i,%i)"), + player.nation:plural_translation(), c.name, c.tile.x, c.tile.y ) + notify.all( _(" A tribe has learned to ride wild beasts near %s (%i,%i)"), + c.name, c.tile.x, c.tile.y) end end end @@ -154,12 +166,12 @@ function tech_researched_handler(tech, player, how) -- Notify the player. Include the tech names in a way that makes it -- look natural no matter if each tech is announced or not. notify.event(player, NIL, E.TECH_GAIN, - _("Great philosophers from all the world join your civilization: you get the immediate advance %s."), + _("[`events/philosophy`]
Great philosophers from all the world join your civilization: you get blueprints for %s."), gained:name_translation()) -- Notify research partners notify.research(player, false, E.TECH_GAIN, - _("Great philosophers from all the world join the %s: you get the immediate advance %s."), + _("[`events/philosophy`]
Great philosophers from all the world join the %s: you get blueprints for %s."), player.nation:plural_translation(), gained:name_translation()) @@ -167,7 +179,7 @@ function tech_researched_handler(tech, player, how) -- They should therefore be informed about the source here too. notify.research_embassies(player, E.TECH_EMBASSY, -- /* TRANS: first %s is leader or team name */ - _("Great philosophers from all the world join %s: they get %s as an immediate advance."), + _("[`events/philosophy2`]
Great philosophers from all the world give the %s %s."), player:research_name_translation(), gained:name_translation()) end @@ -176,11 +188,13 @@ end signal.connect("tech_researched", "tech_researched_handler") function turn_callback(turn, year) - if turn == 120 then + if turn == 99 then notify.event(nil, nil, E.SCRIPT, _("Prophets have Visions!\n\ Evangelists warn the End Times are near.\ ")) +notify.event(nil, nil, E.BEGINNER_HELP, +_("[`events/endtimes`]
Philosophers are concerned that weapons technology is becoming too advanced.")) end if turn == 2 then @@ -189,15 +203,100 @@ _("Hunt for Food!\n\ Meat from wild animals is an important part of the Stone Age diet. Use wandering Deer and Wild Boar for extra food.\ (TIP: Use Shift-W and Ctrl-Shift-Click to monitor and manage these resource opportunities.)\ ")) +notify.event(nil, nil, E.BEGINNER_HELP, +_("[`events/hunt`]
Wild animals are available to hunt for food.")) end - if turn == 17 then + if turn == 20 then notify.event(nil, nil, E.SCRIPT, _("Ecology Report\n\ Frequent hunting has reduced wild animal populations and frightened them from human settlements.\ ")) +notify.event(nil, nil, E.BEGINNER_HELP, +_("[`events/runningdeer`][`events/oldtribesmen`]
Animal populations no longer come near human settlements.
Next turn, Elder Tribesmen lose bonus for movement, work, vision, and recycle.
")) end end - signal.connect('turn_begin', 'turn_callback') + +function unit_lost_callback(unit, loser, reason) + num_owners = 0 + owner = "" + if reason == "killed" then + nation = loser.nation:name_translation() + if nation == "Animal Kingdom" then + for tile in unit.tile:square_iterate(1) do + for foe in tile:units_iterate() do + if unit.tile ~= tile then + foe_nation = foe.owner.nation:name_translation() + if owner ~= foe.owner and foe_nation ~= "Animal Kingdom" then + num_owners = num_owners + 1 + owner = foe.owner + end + end + end + end + end + + if num_owners == 1 then + gold = 3 + culture = 1 + edit.change_gold(owner, gold) + edit.add_player_history(owner, 1) + if owner:is_human() then + notify.player(owner, + "Wild animal killed, furs and meats are worth %d gold", gold) + end + end + end + + -- continue processing + return false +end + +signal.connect("unit_lost", "unit_lost_callback") + +function building_built_callback(building, city) + + if building:rule_name() == "Chand Baori" then + local owner = city.owner + local city_name = city.name + + notify.player(owner, "Chand Baori's deep well gives %s a free river.", city_name) + city.tile:create_extra("River", NIL) + -- continue processing + return false + end + + if building:rule_name() == "Women's Suffrage​" and first_womens_suffrage < 1 then + first_womens_suffrage = 1 + notify.event(nil, nil, E.SCRIPT, + _("Women in Republics and Democracies demand Women's Suffrage.\n\ + All cities under these governments now have one unhappy citizen demanding Women's Suffrage.\ + ")) + notify.event(nil, nil, E.BEGINNER_HELP, + _("[`events/womenssuffrage`]
Discontent reported in representative governments who lack Women's Suffrage.")) + end + + -- Grant Code of Laws when the wonder Code of Hammurabi is built. + if building:rule_name() == "Code of Hammurabi" then + local player = city.owner + local city_name = city.name + local gained = nil; + + if player:give_tech(find.tech_type("Code of Laws"), -1, false, "researched") then + notify.player(player, "The Code of Hammurabi provides blueprints for Code of Laws.") + elseif player:give_tech(find.tech_type("Writing"), -1, false, "researched") then + notify.player(player, "The Code of Hammurabi provides blueprints for Writing.") + end + + return false + end + -- continue processing + return false +end + +signal.connect("building_built", "building_built_callback") + + + diff --git a/freeciv/freeciv/data/.historic/mp2-preArctic/styles.ruleset b/freeciv/freeciv/data/mp2c-occ/styles.ruleset similarity index 100% rename from freeciv/freeciv/data/.historic/mp2-preArctic/styles.ruleset rename to freeciv/freeciv/data/mp2c-occ/styles.ruleset diff --git a/freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/techs.ruleset b/freeciv/freeciv/data/mp2c-occ/techs.ruleset similarity index 90% rename from freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/techs.ruleset rename to freeciv/freeciv/data/mp2c-occ/techs.ruleset index 86d8e127e..1ce62adf3 100644 --- a/freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/techs.ruleset +++ b/freeciv/freeciv/data/mp2c-occ/techs.ruleset @@ -1,5 +1,5 @@ -; Modifying this file: +; Modifying this file: ; You should not modify this file except to make bugfixes or ; for other "maintenance". If you want to make custom changes, ; you should create a new datadir subdirectory and copy this file @@ -8,7 +8,7 @@ ; use your new customized file. [datafile] -description="Avant-garde technology data for Freeciv" +description="Technology data for Freeciv" options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" format_version=20 @@ -24,7 +24,7 @@ format_version=20 ; /* <-- avoid gettext warnings ; -; Tech classes: +; Tech classes: ; ; First one is the default one. ; If there is none, tech classes feature is disabled @@ -46,14 +46,14 @@ format_version=20 ; /* <-- avoid gettext warnings ; -; Below: The individual advances, one per section. +; Below:The individual advances, one per section. ; The number can be variable, up to 250. ; ; The actual tag used (the * in [advance_*]) does not matter, except ; it must be unique within this file, and it may be used in debug ; output when reading this file. ; -; Notes: +; Notes: ; ; name = translatable name as seen by user ; rule_name = (optional) internal name for savegames, rulesets etc; if @@ -99,7 +99,7 @@ format_version=20 ; it should be listed as req1. ; ; As well as custom flags defined above, the following flag strings are -; possible: +; possible: ; ; "Bonus_Tech" = player gets extra tech if reached first ; "Bridge" = "Settler" unit types can build roads with @@ -185,7 +185,7 @@ req2 = "The Republic" flags = "" graphic = "a.banking" graphic_alt = "-" -helptext = _("Prevents Philosophy from awarding bonus tech.") +helptext = _("Infantry upkeep: 1 gold. Blocks Philosophy bonus. Globally expires capital trade route bonus.") cost = 364 [advance_bridge_building] @@ -231,7 +231,7 @@ req2 = "Horseback Riding" flags = "" graphic = "a.chivalry" graphic_alt = "-" -helptext = _("Obsoletes Horsemen, Chariots. Does not block Philosophy bonus.") +helptext = _("Obsoletes Horsemen, Chariots.") cost = 226 [advance_code_of_laws] @@ -258,7 +258,7 @@ req2 = "Explosives" flags = "" graphic = "a.combustion" graphic_alt = "-" -helptext = _("+1 move for Trains.") +helptext = _("Obsoletes Balloon. +1 move for Trains.") cost = 3810 [advance_communism] @@ -287,7 +287,7 @@ req2 = "Metallurgy" flags = "" graphic = "a.conscription" graphic_alt = "-" -helptext = _("Obsoletes Musketeers. Capable cities can make extra units per turn.") +helptext = _("Obsoletes Musketeers, Falconeers. Cities can build >1 unit. Old infantry convert to Musketeers.") cost = 1890 [advance_construction] @@ -306,7 +306,6 @@ req2 = "None" flags = "" graphic = "a.currency" graphic_alt = "-" -helptext = _("Boats can build Wonders.") [advance_democracy] name = _("Democracy") @@ -315,7 +314,7 @@ req2 = "Invention" flags = "" graphic = "a.democracy" graphic_alt = "-" -helptext = _("Allows government Democracy.") +helptext = _("Obsoletes Code of Hammurabi. Allows government Democracy.") cost = 875 [advance_economics] @@ -362,7 +361,7 @@ req2 = "Space Flight" flags = "" graphic = "a.environmentalism" graphic_alt = "-" -helptext = _("-50% Pollution in all cities.") +helptext = _("Reduces pollution from population by half.") cost = 8040 [advance_espionage] @@ -393,6 +392,8 @@ flags = "" graphic = "a.feudalism" graphic_alt = "-" cost = 146 +helptext = _("Allows Castles (with Construction).") + [advance_flight] name = _("Flight") @@ -404,15 +405,6 @@ graphic_alt = "-" helptext = _("Traderoutes give less first time revenue.") cost = 4680 -[advance_fundamentalism] -name = _("Fundamentalism") -req1 = "Theology" -req2 = "Conscription" -flags = "" -graphic = "a.fundamentalism" -graphic_alt = "-" -helptext = _("Allows government Fundamentalism.") - [advance_fusion_power] name = _("Fusion Power") req1 = "Superconductors" @@ -420,14 +412,15 @@ req2 = "None" flags = "" graphic = "a.fusion_power" graphic_alt = "-" +helptext = _("Obsoletes Medici Bank.") cost = 8040 -[advance_genetic_engineering] -name = _("Genetic Engineering") +[advance_microbiology] +name = _("Microbiology") req1 = "Medicine" req2 = "The Corporation" flags = "" -graphic = "a.genetic_engineering" +graphic = "a.microbiology" graphic_alt = "-" cost = 3150 @@ -449,7 +442,7 @@ flags = "" graphic = "a.gunpowder" graphic_alt = "-" cost = 800 -helptext = _("Obsoletes Agōgē of Sparta, Barracks, earlier foot soldiers.") +helptext = _("Obsoletes Castle, Agōgē of Sparta, Barracks, earlier foot soldiers.") [advance_horseback_riding] name = _("Horseback Riding") @@ -459,6 +452,7 @@ flags = "" graphic = "a.horseback_riding" graphic_alt = "-" cost = 24 +helptext = _("Travellers spread news to the world if discovered before Turn 15.") [advance_industrialization] name = _("Industrialization") @@ -476,7 +470,7 @@ req2 = "Literacy" flags = "" graphic = "a.invention" graphic_alt = "-" -helptext = _("Extra vision for Fortress and Naval Base. Prevents Philosophy bonus.") +helptext = _("Extra vision in Fortress, Naval Base, Castle. Blocks Philosophy bonus.") [advance_iron_working] name = _("Iron Working") @@ -494,7 +488,7 @@ flags = "" graphic = "a.labor_union" graphic_alt = "-" cost = 5430 -helptext = _("Upkeep paid is 1 gold for: Foot Soldiers, Mechanized Infantry.") +helptext = _("Musketeers can convert to Riflemen.") [advance_laser] name = _("Laser") @@ -543,7 +537,7 @@ flags = "" graphic = "a.magnetism" graphic_alt = "-" helptext = _("Obsoletes Caravel.") -cost = 950 +cost = 875 [advance_map_making] name = _("Map Making") @@ -570,7 +564,7 @@ req1 = "Automobile" req2 = "The Corporation" graphic = "a.mass_production" graphic_alt = "-" -helptext = _("+25% population pollution.") +helptext = _("Obsoletes Goods. +25% population pollution.") cost = 4680 [advance_mathematics] @@ -597,7 +591,7 @@ req2 = "University" flags = "" graphic = "a.metallurgy" graphic_alt = "-" -helptext = _("Obsoletes Catapult.") +helptext = _("Obsoletes Catapult, all Siege Rams. City Walls cost +10.") cost = 1340 [advance_miniaturization] @@ -627,7 +621,7 @@ req2 = "Code of Laws" flags = "" graphic = "a.monarchy" graphic_alt = "-" -helptext = _("Allows government Monarchy.") +helptext = _("Obsoletes Chand Baori, Ziggurat. Allows government Monarchy.") [advance_monotheism] name = _("Monotheism") @@ -637,7 +631,7 @@ flags = "" graphic = "a.monotheism" helptext = _("Obsoletes Elephants.") graphic_alt = "-" -cost = 415 +cost = 384 [advance_mysticism] name = _("Mysticism") @@ -684,7 +678,7 @@ req2 = "Literacy" flags = "" graphic = "a.philosophy" graphic_alt = "-" -helptext = _("Bonus tech before 1600AD if no next tier techs are possessed.") +helptext = _("Obsoletes Sphinx. Bonus tech before 1600AD if no next tier techs are possessed.") cost = 276 [advance_physics] @@ -750,7 +744,7 @@ req2 = "Bridge Building" flags = "" graphic = "a.railroad" graphic_alt = "-" -helptext = _("Obsoletes Hanging Gardens. Traderoutes less first time revenue. Allows Railroads.") +helptext = _("Allows Railroads. Obsoletes Appian Way. Traderoutes less first time revenue. ") cost = 1820 [advance_recycling] @@ -762,6 +756,7 @@ flags = "" graphic = "a.recycling" graphic_alt = "-" cost = 4460 +helptext = _("Unit upgrades cost 20% less.") [advance_refining] name = _("Refining") @@ -770,7 +765,7 @@ req2 = "Steel" flags = "" graphic = "a.refining" graphic_alt = "-" -helptext = _("Allows Oil Wells on Glaciers.") +helptext = _("Allows Arctic Oil Wells. Oil Wells on Oil get +1 shield.") cost = 3630 [advance_refrigeration] @@ -849,7 +844,7 @@ req2 = "University" flags = "" graphic = "a.steam_engine" graphic_alt = "-" -helptext = _("Obsoletes Frigate.") +helptext = _("Obsoletes Frigate, Hanging Gardens. Ends Colossus discount on Commerce units.") cost = 1240 [advance_steel] @@ -859,7 +854,7 @@ req2 = "Industrialization" flags = "" graphic = "a.steel" graphic_alt = "-" -helptext = _("Allows Sea Bridge.") +helptext = _("Allows Sea Bridge, Bunker.") cost = 3280 [advance_superconductors] @@ -889,7 +884,7 @@ req2 = "Industrialization" flags = "" graphic = "a.the_corporation" graphic_alt = "-" -helptext = _("Obsoletes Caravan.") +helptext = _("Obsoletes Caravan, Wagon. +25% Coinage for Stock Exchange") cost = 2900 [advance_the_republic] @@ -909,6 +904,16 @@ flags = "" graphic = "a.the_wheel" graphic_alt = "-" +[advance_theocracy] +name = _("Theocracy") +req1 = "Theology" +req2 = "None" +flags = "" +graphic = "a.theocracy" +graphic_alt = "-" +helptext = _("Obsoletes Pax Dei. Allows government Theocracy.") +cost = 725 + [advance_theology] name = _("Theology") req1 = "Feudalism" @@ -917,7 +922,7 @@ flags = "" graphic = "a.theology" graphic_alt = "-" helptext = _("Obsoletes Oracle. +1 Effect on Cathedral, Michelangelos Chapel.") -cost = 725 +cost = 600 [advance_theory_of_gravity] name = _("Theory of Gravity") @@ -935,7 +940,6 @@ req2 = "Code of Laws" flags = "" graphic = "a.trade" graphic_alt = "-" -helptext = _("Commerce may do Traderoutes, Enter Marketplace.") [advance_university] name = _("University") @@ -954,7 +958,7 @@ flags = "" graphic = "a.warrior_code" graphic_alt = "-" cost = 24 -helptext = _("Foot soldiers may make Hideouts, if enabled.") +helptext = _("Foot soldiers may make Hideouts.") [advance_writing] name = _("Writing") @@ -964,6 +968,25 @@ flags = "" graphic = "a.writing" graphic_alt = "-" +[advance_nationalism] +name = _("Nationalism") +req1 = "The Corporation" +req2 = "Communism" +flags = "" +graphic = "a.nationalism" +graphic_alt = "-" +helptext = _("Allows government Nationalism.") +cost = 2775 + +;[advance_agricultural] +;name = _("Agricultural") +;req1 = "None" +;req2 = "None" +;flags = "" +;graphic = "a.horseback_riding" +;graphic_alt = "-" + + ; A placeholder tech used to ensure that when ; a game is reloaded, a player can`t rebuild ; the "Darwin's Voyage" small wonder and get diff --git a/freeciv/freeciv/data/mp2-brava2/terrain.ruleset b/freeciv/freeciv/data/mp2c-occ/terrain.ruleset similarity index 71% rename from freeciv/freeciv/data/mp2-brava2/terrain.ruleset rename to freeciv/freeciv/data/mp2c-occ/terrain.ruleset index 5897f50f1..50b522bf3 100644 --- a/freeciv/freeciv/data/mp2-brava2/terrain.ruleset +++ b/freeciv/freeciv/data/mp2c-occ/terrain.ruleset @@ -11,7 +11,7 @@ ; than minor changes. [datafile] -description="Avant-garde terrain data for Freeciv" +description="Terrain data for Freeciv" options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" format_version=20 @@ -37,15 +37,17 @@ flags = extra_flags = { "name", "helptxt" _("Quayable"), _("Allows Quays to be built.") - _("IrrigationSource"), _("Allows Irrigation.") + _("IrrigationSource"), _("Is a water source for Irrigation.") + _("WaterwaySource"), _("Is a water source for inland Canals.") _("Railable"), _("Allows Railroads to be built.") + _("FortressHeal"), _("Damaged Land and Helicopter units +25% hp per turn resting.") } [parameters] ; Percentage of "land" tiles required to be adjacent to a water tile before ; it may be "reclaimed" into a land tile (0-101; 0=anywhere, default 101=nowhere) -ocean_reclaim_requirement = 30 +ocean_reclaim_requirement = 25 ; Percentage of "water" tiles required to be adjacent to a land tile before ; it may be "channeled" into a water tile (0-101; 0=anywhere, default 101=nowhere) @@ -229,47 +231,6 @@ ocean_resources = FALSE ; Desert: MG_DRY, MG_TROPICAL, MG_COLD ;Alt-desert: MG_DRY, MG_TROPICAL, MG_WET - -[terrain_inaccesible] -name = _("Inaccessible") -graphic = "inaccessible" -graphic_alt = "arctic" -identifier = "i" -class = "Land" -movement_cost = 0 -defense_bonus = 0 -food = 0 -shield = 0 -trade = 0 -road_food_incr_pct = 0 -road_shield_incr_pct = 0 -road_trade_incr_pct = 0 -base_time = 0 -road_time = 0 -irrigation_result = "no" -irrigation_food_incr = 0 -irrigation_time = 0 -mining_result = "no" -mining_shield_incr = 0 -mining_time = 0 -transform_result = "no" -transform_time = 0 -pillage_time = 0 -clean_pollution_time = 0 -clean_fallout_time = 0 -animal = "None" -warmer_wetter_result = "no" -warmer_drier_result = "no" -cooler_wetter_result = "no" -cooler_drier_result = "no" -flags = "NotGenerated", "NoPollution", "NoCities", "UnsafeCoast", "Frozen" -color.r = 25 -color.g = 25 -color.b = 25 -helptext = _("\ -No unit can enter this terrain, nor can any city work its tiles.\ -") - [terrain_lake] name = _("Lake") graphic = "lake" @@ -296,12 +257,12 @@ transform_time = 36 pillage_time = 1 clean_pollution_time = 3 clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "no" -warmer_drier_result = "Swamp" -cooler_wetter_result = "Glacier" -cooler_drier_result = "Tundra" -native_to = "Sea", "Air", "Balloon", "Missile", "Helicopter", "Trireme", "RiverShip", "Submarine", "AirProtect", "AirPillage", "Bomb" +animal = "[Hippo]" +warmer_wetter_result = "Ocean" +warmer_drier_result = "Ocean" +cooler_wetter_result = "Swamp" +cooler_drier_result = "Swamp" +native_to = "Sea", "Air", "Balloon", "Zeppelin", "Missile", "Helicopter", "Trireme", "RiverShip", "Submarine", "AirProtect", "Air_High_Altitude", "Bomb", "Space" flags = "NoCities", "NoBarbs", "NoPollution", "FreshWater", "NoZoc", "NoFortify" property_ocean_depth = 0 color.r = 80 @@ -309,6 +270,7 @@ color.g = 176 color.b = 247 helptext = _("\ Lakes are bodies of fresh water not connected to sea or ocean.\ + Transforming to Swamp requires two adjacent land tiles.\ ") [terrain_ocean] @@ -339,10 +301,10 @@ clean_pollution_time = 3 clean_fallout_time = 3 animal = "None" warmer_wetter_result = "no" -warmer_drier_result = "Swamp" -cooler_wetter_result = "Glacier" -cooler_drier_result = "Glacier" -native_to = "Sea", "Air", "Balloon", "Missile", "Helicopter", "Trireme", "RiverShip", "Submarine", "AirProtect", "AirPillage", "Bomb" +warmer_drier_result = "no" +cooler_wetter_result = "Swamp" +cooler_drier_result = "Swamp" +native_to = "Sea", "Air", "Balloon", "Zeppelin", "Missile", "Helicopter", "Trireme", "RiverShip", "Submarine", "AirProtect", "Air_High_Altitude", "Bomb", "Space" flags = "NoCities", "NoPollution", "UnsafeCoast", "NoZoc", "NoFortify" property_ocean_depth = 32 color.r = 70 @@ -350,7 +312,8 @@ color.g = 146 color.b = 227 helptext = _("\ Shallow oceans are mostly found near coastlines, and are often rich\ - sources of food and other resources.\ + sources of food and other resources. Transforming to Swamp requires\ + two adjacent land tiles.\ ") [terrain_deep_ocean] @@ -379,12 +342,12 @@ transform_time = 0 pillage_time = 1 clean_pollution_time = 3 clean_fallout_time = 3 -animal = "None" +animal = "[Giant Squid]" warmer_wetter_result = "no" warmer_drier_result = "no" cooler_wetter_result = "no" cooler_drier_result = "no" -native_to = "Trireme", "Sea", "Air", "Balloon", "Missile", "Helicopter", "RiverShip", "Submarine", "AirProtect", "AirPillage", "Bomb" +native_to = "Trireme", "Sea", "Air", "Balloon", "Zeppelin", "Missile", "Helicopter", "RiverShip", "Submarine", "AirProtect", "Air_High_Altitude", "Bomb", "Space" flags = "NoCities", "NoPollution", "UnsafeCoast", "NoZoc", "NoFortify" property_ocean_depth = 87 color.r = 55 @@ -395,93 +358,95 @@ Deep oceans cover much of the world away from coastlines, and only\ seaworthy units can travel on them.\ ") -[terrain_arctic] -name = _("Arctic") -rule_name = "Glacier" -graphic = "arctic" +[terrain_plains] +name = _("Plains") +graphic = "plains" graphic_alt = "-" -identifier = "a" +identifier = "p" class = "Land" -movement_cost = 2 +movement_cost = 1 defense_bonus = 0 -food = 0 -shield = 0 +food = 1 +shield = 1 trade = 0 -resources = "Ivory", "Oil" -road_trade_incr_pct = 0 +resources = "Buffalo", "Wheat" +road_trade_incr_pct = 100 base_time = 1 -road_time = 4 -irrigation_result = "Tundra" -irrigation_food_incr = 0 -irrigation_time = 15 -mining_result = "yes" -mining_shield_incr = 2 -mining_time = 10 -transform_result = "Desert" +road_time = 2 +irrigation_result = "yes" +irrigation_food_incr = 1 +irrigation_time = 5 +mining_result = "Forest" +mining_shield_incr = 0 +mining_time = 15 +transform_result = "Grassland" transform_time = 24 pillage_time = 1 clean_pollution_time = 3 clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Tundra" -warmer_drier_result = "Tundra" -cooler_wetter_result = "no" -cooler_drier_result = "no" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "NoBarbs", "NoCities", "CanHaveRiver", "Oil", "Frozen" -property_frozen = 23 -color.r = 238 -color.g = 238 -color.b = 238 +animal = "[Lion]" +warmer_wetter_result = "Desert" +warmer_drier_result = "Desert" +cooler_wetter_result = "Tundra" +cooler_drier_result = "Grassland" +native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Zeppelin", "Missile", "Helicopter", "AirProtect", "Air_High_Altitude", "Bomb", "Space" +flags = "CanHaveRiver", "Low Land" +property_green = 38 +property_temperate = 38 +property_frozen = 90 +property_dry = 23 +color.r = 161 +color.g = 198 +color.b = 80 helptext = _("\ -Arctic terrain is cold icy permafrost, found only in the far north or south.\ -"), _("\ - Oil wells can be built when Refining is known.\ +Plains are broad flat regions with decent potential for\ + agriculture, production, and trade.\ ") -[terrain_desert] -name = _("Desert") -graphic = "desert" +[terrain_grassland] +name = _("Grassland") +graphic = "grassland" graphic_alt = "-" -identifier = "d" +identifier = "g" class = "Land" movement_cost = 1 defense_bonus = 0 -food = 0 -shield = 1 +food = 2 +shield = 0 trade = 0 -resources = "Oasis", "Oil" +resources = "Resources" road_trade_incr_pct = 100 base_time = 1 road_time = 2 irrigation_result = "yes" irrigation_food_incr = 1 irrigation_time = 5 -mining_result = "yes" -mining_shield_incr = 1 -mining_time = 5 -transform_result = "Plains" -transform_time = 24 +mining_result = "Forest" +mining_shield_incr = 0 +mining_time = 10 +transform_result = "Hills" +transform_time = 30 pillage_time = 1 clean_pollution_time = 3 clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Grassland" -warmer_drier_result = "no" -cooler_wetter_result = "Plains" +animal = "[Wolf]" +warmer_wetter_result = "Swamp" +warmer_drier_result = "Swamp" +cooler_wetter_result = "Tundra" cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "CanHaveRiver", "Oil", "Low Land" -property_dry = 75 +native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Zeppelin", "Missile", "Helicopter", "AirProtect", "Air_High_Altitude", "Bomb", "Space" +flags = "Starter", "CanHaveRiver", "Low Land" +property_green = 69 +property_temperate = 69 +property_cold = 20 +property_dry = 23 +property_wet = 100 property_tropical = 40 -property_temperate = 26 -color.r = 247 -color.g = 222 -color.b = 187 +color.r = 100 +color.g = 178 +color.b = 105 helptext = _("\ -Deserts are very dry. Agriculture is difficult if not on a river or oasis. \ -"), _("\ -Oil wells can be built when Construction is known.\ +Grassland affords exceptional agricultural opportunities and decent trade.\ ") [terrain_forest] @@ -495,7 +460,8 @@ defense_bonus = 33 food = 1 shield = 2 trade = 0 -resources = "Pheasant", "Silk" +;Multiple entries stack the odds. We are doing this just to "register" Berries as a resource. We want control over how they appear usually. +resources = "Pheasant","Silk","Pheasant","Silk","Pheasant","Silk","Pheasant","Silk","Pheasant","Silk","Pheasant","Silk","Pheasant","Silk","Pheasant","Silk","Pheasant","Silk","Pheasant","Silk","Pheasant","Silk","Pheasant","Silk","Pheasant","Silk","Pheasant","Silk","Pheasant","Silk","Berries" road_trade_incr_pct = 0 base_time = 1 road_time = 4 @@ -510,116 +476,121 @@ transform_time = 24 pillage_time = 1 clean_pollution_time = 3 clean_fallout_time = 3 -animal = "None" +animal = "[Leopard]" warmer_wetter_result = "Jungle" -warmer_drier_result = "Plains" -cooler_wetter_result = "Swamp" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "Starter", "CanHaveRiver", "Low Land" -property_cold = 35 -property_frozen = 7 -property_mountainous = 15 -property_wet = 30 +warmer_drier_result = "Jungle" +cooler_wetter_result = "no" +cooler_drier_result = "no" +native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Zeppelin", "Missile", "Helicopter", + "AirProtect", "Air_High_Altitude", "Bomb", "Space" +flags = "CanHaveRiver", "Low Land" +property_cold = 21 +property_frozen = 17 +property_mountainous = 9 +property_wet = 34 property_foliage = 50 property_temperate = 50 +property_green = 18 color.r = 43 color.g = 157 color.b = 19 helptext = _("\ -Forests are densely wooded, providing lumber for production, but\ - making agriculture somewhat problematic.\ +Forests are densely wooded, providing lumber for production — but\ + making agriculture problematic.\ ") -[terrain_grassland] -name = _("Grassland") -graphic = "grassland" +[terrain_swamp] +name = _("Swamp") +graphic = "swamp" graphic_alt = "-" -identifier = "g" +identifier = "s" class = "Land" -movement_cost = 1 -defense_bonus = 0 -food = 2 +movement_cost = 2 +defense_bonus = 33 +food = 1 shield = 0 trade = 0 -resources = "Resources" -road_trade_incr_pct = 100 +resources = "Peat", "Spice" +road_trade_incr_pct = 0 base_time = 1 -road_time = 2 -irrigation_result = "yes" -irrigation_food_incr = 1 -irrigation_time = 5 +road_time = 4 +irrigation_result = "Grassland" +irrigation_food_incr = 0 +irrigation_time = 13 mining_result = "Forest" mining_shield_incr = 0 -mining_time = 10 -transform_result = "Hills" -transform_time = 30 +mining_time = 13 +transform_result = "Lake" +transform_time = 12 pillage_time = 1 clean_pollution_time = 3 clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Lake" -warmer_drier_result = "Desert" -cooler_wetter_result = "Glacier" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "Starter", "CanHaveRiver", "Low Land" -property_green = 50 -property_temperate = 50 -property_cold = 12 -property_dry = 10 -property_tropical = 20 -color.r = 100 -color.g = 178 -color.b = 105 +animal = "[Crocodile]" +warmer_wetter_result = "Ocean" +warmer_drier_result = "Lake" +cooler_wetter_result = "Grassland" +cooler_drier_result = "Grassland" +native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Zeppelin", "Missile", "Helicopter", + "AirProtect", "Air_High_Altitude", "Bomb", "Space" +flags = "CanHaveRiver", "Low Land" +property_wet = 60 +property_tropical = 10 +color.r = 129 +color.g = 179 +color.b = 146 helptext = _("\ -Grassland affords exceptional agricultural opportunities.\ +Swamps suffer from an over-abundance of water, making agriculture\ + and trade problematic.\ ") -[terrain_hills] -name = _("Hills") -graphic = "hills" +[terrain_desert] +name = _("Desert") +graphic = "desert" graphic_alt = "-" -identifier = "h" +identifier = "d" class = "Land" -movement_cost = 2 -defense_bonus = 100 -food = 1 -shield = 0 +movement_cost = 1 +defense_bonus = 0 +food = 0 +shield = 1 trade = 0 -resources = "Coal", "Wine" -road_trade_incr_pct = 0 +resources = "Oasis", "Oil" +road_trade_incr_pct = 100 base_time = 1 -road_time = 4 +road_time = 2 irrigation_result = "yes" irrigation_food_incr = 1 -irrigation_time = 10 +irrigation_time = 5 mining_result = "yes" -mining_shield_incr = 3 -mining_time = 10 +mining_shield_incr = 1 +mining_time = 5 transform_result = "Plains" transform_time = 24 pillage_time = 1 clean_pollution_time = 3 clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "no" +animal = "[Rhino]" +warmer_wetter_result = "Grassland" warmer_drier_result = "no" -cooler_wetter_result = "no" -cooler_drier_result = "no" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "Starter", "CanHaveRiver" -property_green = 50 -property_mountainous = 35 -property_cold = 35 -property_frozen = 20 -property_dry = 15 -color.r = 222 -color.g = 230 -color.b = 134 +cooler_wetter_result = "Plains" +cooler_drier_result = "Plains" +native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Zeppelin", "Missile", "Helicopter", "AirProtect", "Air_High_Altitude", "Bomb", "Space" +flags = "CanHaveRiver", "Oil", "Low Land" +property_dry = 60 +property_tropical = 35 +property_temperate = 3 +property_green = 3 +property_cold = 0 +property_mountainous = 2 +color.r = 247 +color.g = 222 +color.b = 187 helptext = _("\ -Hills are frequently rich in resources. Difficult access makes\ - them good for defense but poor for trade.\ +Deserts are very dry. Agriculture is difficult if not on a river or oasis. Cities on desert rivers\ + get +1 extra food. Irrigated desert rivers give an extra +1 food over the usual bonus, even on a\ + city center tile. \ +"), _("\ +Oil wells can be built when Construction is known. Refining gives +1 shield to Oil Wells built on Oil.\ ") [terrain_jungle] @@ -648,16 +619,17 @@ transform_time = 12 pillage_time = 1 clean_pollution_time = 3 clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Lake" -warmer_drier_result = "Desert" -cooler_wetter_result = "Swamp" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" +animal = "[Tiger]" +warmer_wetter_result = "no" +warmer_drier_result = "no" +cooler_wetter_result = "Forest" +cooler_drier_result = "Forest" +native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Zeppelin", "Missile", "Helicopter", + "AirProtect", "Air_High_Altitude", "Bomb", "Space" flags = "CanHaveRiver", "Low Land" -property_foliage = 45 -property_tropical = 50 -property_wet = 45 +property_foliage = 31 +property_tropical = 41 +property_wet = 20 color.r = 71 color.g = 227 color.b = 0 @@ -665,6 +637,54 @@ helptext = _("\ Jungles are densely overgrown but sometimes provide rich resources and good defense.\ ") +[terrain_hills] +name = _("Hills") +graphic = "hills" +graphic_alt = "-" +identifier = "h" +class = "Land" +movement_cost = 2 +defense_bonus = 100 +food = 1 +shield = 0 +trade = 0 +resources = "Coal", "Wine" +road_trade_incr_pct = 0 +base_time = 1 +road_time = 4 +irrigation_result = "yes" +irrigation_food_incr = 1 +irrigation_time = 10 +mining_result = "yes" +mining_shield_incr = 3 +mining_time = 10 +transform_result = "Plains" +transform_time = 24 +pillage_time = 1 +clean_pollution_time = 3 +clean_fallout_time = 3 +animal = "[Wolf]" +warmer_wetter_result = "no" +warmer_drier_result = "no" +cooler_wetter_result = "no" +cooler_drier_result = "no" +native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Zeppelin", "Missile", "Helicopter", + "AirProtect", "Air_High_Altitude", "Bomb", "Space" +flags = "CanHaveRiver" +property_mountainous = 55 +property_green = 1 +property_temperate = 1 +property_frozen = 100 +property_dry = 9 +property_cold = 11 +color.r = 222 +color.g = 230 +color.b = 134 +helptext = _("\ +Hills are frequently rich in resources. Difficult access makes\ + them good for defense but poor for trade.\ +") + [terrain_mountains] name = _("Mountains") graphic = "mountains" @@ -691,15 +711,18 @@ transform_time = 24 pillage_time = 1 clean_pollution_time = 3 clean_fallout_time = 3 -animal = "None" +animal = "[Bear]" warmer_wetter_result = "no" warmer_drier_result = "no" cooler_wetter_result = "no" cooler_drier_result = "no" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" +native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Zeppelin", "Missile", "Helicopter", + "AirProtect", "Air_High_Altitude", "Bomb", "Space" flags = "CanHaveRiver" -property_mountainous = 65 -property_cold = 50 +property_mountainous = 30 +property_green = 15 +property_temperate = 15 +property_frozen = 20 color.r = 160 color.g = 156 color.b = 170 @@ -708,140 +731,131 @@ Mountains are regions of extreme altitude, excellent for defense but inferior\ for trade and agriculture.\ ") -[terrain_plains] -name = _("Plains") -graphic = "plains" +[terrain_tundra] +name = _("Tundra") +graphic = "tundra" graphic_alt = "-" -identifier = "p" +identifier = "t" class = "Land" movement_cost = 1 defense_bonus = 0 food = 1 -shield = 1 +shield = 0 trade = 0 -resources = "Buffalo", "Wheat" +resources = "Elk", "Furs", "Elk", "Furs", "Gold" ; 40/40/20 instead of 33/33/33 road_trade_incr_pct = 100 base_time = 1 road_time = 2 irrigation_result = "yes" irrigation_food_incr = 1 irrigation_time = 5 -mining_result = "Forest" +mining_result = "Desert" mining_shield_incr = 0 mining_time = 15 -transform_result = "Grassland" +transform_result = "Plains" transform_time = 24 pillage_time = 1 clean_pollution_time = 3 clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Lake" -warmer_drier_result = "Desert" +animal = "[Polar Bear]" +warmer_wetter_result = "Grassland" +warmer_drier_result = "Plains" cooler_wetter_result = "Glacier" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "Starter", "CanHaveRiver", "Low Land" -property_green = 50 -property_frozen = 5 -property_dry = 16 -property_cold = 28 -property_tropical = 10 -property_temperate = 50 -property_mountainous = 15 -color.r = 161 -color.g = 198 -color.b = 80 +cooler_drier_result = "Glacier" +native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Zeppelin", "Missile", "Helicopter", "AirProtect", "Air_High_Altitude", "Bomb", "Space" +flags = "NoBarbs", "CanHaveRiver", "Low Land" +property_cold = 17 +property_frozen = 7 +color.r = 206 +color.g = 206 +color.b = 206 helptext = _("\ -Plains are broad flat regions with decent potential for\ - agriculture, production, and trade.\ +Tundra regions are cold and barren, only fit for mediocre agriculture and trade.\ ") -[terrain_swamp] -name = _("Swamp") -graphic = "swamp" +[terrain_arctic] +name = _("Arctic") +rule_name = "Glacier" +graphic = "arctic" graphic_alt = "-" -identifier = "s" +identifier = "a" class = "Land" movement_cost = 2 -defense_bonus = 33 -food = 1 +defense_bonus = 0 +food = 0 shield = 0 trade = 0 -resources = "Peat", "Spice" +resources = "Furs", "Ivory", "Oil" road_trade_incr_pct = 0 base_time = 1 road_time = 4 -irrigation_result = "Grassland" +irrigation_result = "Tundra" irrigation_food_incr = 0 irrigation_time = 15 -mining_result = "Forest" -mining_shield_incr = 0 -mining_time = 15 -transform_result = "Lake" -transform_time = 12 +mining_result = "yes" +mining_shield_incr = 2 +mining_time = 10 +transform_result = "Desert" +transform_time = 24 pillage_time = 1 clean_pollution_time = 3 clean_fallout_time = 3 -animal = "None" -warmer_wetter_result = "Lake" -warmer_drier_result = "Desert" -cooler_wetter_result = "Glacier" -cooler_drier_result = "Tundra" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "CanHaveRiver", "Low Land" -property_wet = 100 -property_frozen = 3 -property_tropical = 10 -property_temperate = 10 -property_cold = 17 -color.r = 129 -color.g = 179 -color.b = 146 +animal = "[Polar Bear]" +warmer_wetter_result = "Tundra" +warmer_drier_result = "Tundra" +cooler_wetter_result = "no" +cooler_drier_result = "no" +native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Zeppelin", "Missile", "Helicopter", "AirProtect", "Air_High_Altitude", "Bomb", "Space" +flags = "NoBarbs", "NoCities", "CanHaveRiver", "Oil", "Frozen" +property_frozen = 30 +property_cold = 2 +color.r = 238 +color.g = 238 +color.b = 238 helptext = _("\ -Swamps suffer from an over-abundance of water, making agriculture\ - and trade problematic.\ +Arctic terrain is cold icy permafrost, found only in the far north or south.\ +"), _("\ + Oil wells can be built when Refining is known.\ ") -[terrain_tundra] -name = _("Tundra") -graphic = "tundra" -graphic_alt = "-" -identifier = "t" +[terrain_inaccesible] +name = _("Inaccessible") +graphic = "inaccessible" +graphic_alt = "arctic" +identifier = "i" class = "Land" -movement_cost = 1 +movement_cost = 0 defense_bonus = 0 -food = 1 +food = 0 shield = 0 trade = 0 -resources = "Game", "Furs", "Game", "Furs", "Gold" ; 40/40/20 instead of 33/33/33 -road_trade_incr_pct = 100 -base_time = 1 -road_time = 2 -irrigation_result = "yes" -irrigation_food_incr = 1 -irrigation_time = 5 -mining_result = "Desert" +road_food_incr_pct = 0 +road_shield_incr_pct = 0 +road_trade_incr_pct = 0 +base_time = 0 +road_time = 0 +irrigation_result = "no" +irrigation_food_incr = 0 +irrigation_time = 0 +mining_result = "no" mining_shield_incr = 0 -mining_time = 15 -transform_result = "Plains" -transform_time = 24 -pillage_time = 1 -clean_pollution_time = 3 -clean_fallout_time = 3 +mining_time = 0 +transform_result = "no" +transform_time = 0 +pillage_time = 0 +clean_pollution_time = 0 +clean_fallout_time = 0 animal = "None" -warmer_wetter_result = "Lake" -warmer_drier_result = "Desert" -cooler_wetter_result = "Glacier" +warmer_wetter_result = "no" +warmer_drier_result = "no" +cooler_wetter_result = "no" cooler_drier_result = "no" -native_to = "Land", "LandNoKill", "LandAirSea", "Air", "Balloon", "Missile", "Helicopter", "AirProtect", "AirPillage", "Bomb" -flags = "Starter", "NoBarbs", "CanHaveRiver", "Low Land" -property_cold = 38 -property_frozen = 45 -color.r = 206 -color.g = 206 -color.b = 206 +flags = "NotGenerated", "NoPollution", "NoCities", "UnsafeCoast", "Frozen" +color.r = 25 +color.g = 25 +color.b = 25 helptext = _("\ -Tundra regions are cold and barren, only fit for mediocre agriculture and trade.\ +No unit can enter this terrain, nor can any city work its tiles.\ ") ; /* <-- avoid gettext warnings @@ -873,22 +887,22 @@ trade = 8 [resource_iron] extra = "Iron" identifier = "/" -shield = 3 +;shield = 3 ;added in effects because only generated resources tied to a terrain type can access this var # mountains. -[resource_game] -extra = "Game" +[resource_elk] +extra = "Elk" identifier = "e" -food = 2 -shield = 2 +;food = 2 +;shield = 2 ;added in effects because only generated resources tied to a terrain type can access this var # tundra. [resource_furs] extra = "Furs" identifier = "u" -food = 1 -shield = 1 -trade = 3 +;food = 1 +;shield = 1 +;trade = 3 ;added in effects because only generated resources tied to a terrain type can access this var # tundra [resource_coal] @@ -913,14 +927,14 @@ trade = 2 [resource_gems] extra = "Gems" identifier = "g" -trade = 5 +;trade = 5 ;added in effects because only generated resources tied to a terrain type can access this var # jungle. [resource_rubber] extra = "Rubber" identifier = "^" -shield = 2 -trade = 2 +;shield = 2 +;trade = 2 ;added in effects because only generated resources tied to a terrain type can access this var # jungle. ; "h" reserved for strategic horses @@ -931,17 +945,6 @@ identifier = "b" shield = 2 # plains (horses => buffalo => cattle). -[resource_forest_game] -extra = "Deer" -identifier = "d" -;food = 3 ;food added in effects because only generated resources tied to a terrain type can access this var - -[resource_wild_boar] -extra = "Wild Boar" -identifier = "q" -;food = 3 ;food added in effects because only generated resources tied to a terrain type can access this var - - [resource_wheat] extra = "Wheat" identifier = "j" @@ -957,13 +960,13 @@ food = 2 [resource_oasis] extra = "Oasis" identifier = "o" -food = 3 +;food = 3 ;added in effects because only generated resources tied to a terrain type can access this var # desert. [resource_peat] extra = "Peat" identifier = "a" -shield = 4 +;shield = 4 ;added in effects because only generated resources tied to a terrain type can access this var # swamp (petroleum => peat => petroleum). [resource_pheasant] @@ -972,8 +975,6 @@ identifier = "p" food = 2 # forest, forested. -; "r" reserved for rubber - [resource_bonus] extra = "Resources" identifier = "r" @@ -983,9 +984,9 @@ shield = 1 [resource_icy_ivory] extra = "Ivory" identifier = "i" -food = 1 -shield = 1 -trade = 4 +;food = 1 ;added in effects because only generated resources tied to a terrain type can access this var +;shield = 1 +;trade = 4 # arctic [resource_silk] @@ -997,8 +998,8 @@ trade = 3 [resource_spice] extra = "Spice" identifier = "t" -food = 2 -trade = 4 +;food = 2 +;trade = 4 ;added in effects because only generated resources tied to a terrain type can access this var # swamp-only. ; "u" reserved for uranium @@ -1019,15 +1020,40 @@ trade = 4 [resource_oil] extra = "Oil" identifier = "x" +;was added in effects so it could be appearing resource; too many layer permutations to work out. shield = 3 ; arctic used to have 4, now it's 3+2 allowing an 0 2 0 tile. # arctic, desert +[resource_berries] +extra = "Berries" +identifier = "@" +;food = 1 +;trade = 2 ;added in effects because only generated resources tied to a terrain type can access this var +# forest, forested. + +[resource_forest_game] +extra = "Deer" +identifier = "d" +;food = 3 ;food added in effects because only generated resources tied to a terrain type can access this var + +[resource_wild_boar] +extra = "Wild Boar" +identifier = "q" +;food = 3 ;food added in effects because only generated resources tied to a terrain type can access this var + [extraui] ; Player visible names of the base gui types. + +; ui_name_base_fortress refers to all bases that have gui_type "Fortress" ui_name_base_fortress = _("?gui_type:Build Fort/Buoy") + +; ui_name_base_airbase refers to all bases that have gui_type "Airbase" ui_name_base_airbase = _("?gui_type:Build Airbase") +; ui_name_base_other refers to all bases that have gui_type "Other" +ui_name_base_other = _("?gui_type:Make Tile Claim/Hideout") + ; /* <-- avoid gettext warnings ; ; Each extra, including bases, roads, and resource, must have a section here. @@ -1054,6 +1080,8 @@ ui_name_base_airbase = _("?gui_type:Build Airbase") ; rmcauses = events that can remove extra type. ; "CleanPollution", "CleanFallout", "Pillage", ; "Disappear", or "Enter" +; infracost = Number of infrapoints it costs to place this +; extra. 0 means extra cannot be placed. Default is 1 ; graphic = tag specifying preferred graphic ; graphic_alt = tag for alternate graphic if preferred graphic is ; not present. Can use eg "-" for no alternate @@ -1074,10 +1102,13 @@ ui_name_base_airbase = _("?gui_type:Build Airbase") ; disappearance_reqs = spontaneous disappearance requirements ; visibility_req = Tech a player needs to have to see the extra ; This affects visibility only, for all the rules -; extra is still there even if player can't see it. +; extra is still there even if player can’t see it. ; buildable = Can extra be built? Defaults to TRUE if extra has ; any causes indicating it can result from worker -; activity. +; activity. If extra is not buildable, it can appear +; in-game only if placed in the editor, it's placed by +; map generator, or on city tile if the extra +; also has "AlwaysOnCityCenter" flag set. ; generated = Can map generator place the extra? Applicable ; for Hut, Resource, and River extras. ; build_time = how long it takes a unit to build this extra. @@ -1113,7 +1144,7 @@ ui_name_base_airbase = _("?gui_type:Build Airbase") ; hidden_by = List of extra types that will make this extra ; type not to show on UI if both present. ; bridged_over = List of extra types that, if present in tile, will prevent -; building this extra if can't be bridged over +; building this extra if can’t be bridged over ; flags ; - "NativeTile" = Native units consider tile native regardless of ; terrain @@ -1161,12 +1192,13 @@ build_time = 0 removal_time = 0 conflicts = "Mine", "Oil Well" hidden_by = "Farmland" +flags = "IrrigationSource" helptext = _("\ Irrigating a suitable tile causes it to produce extra food each turn. Most\ tiles yield +1 extra food. A desert river that does not already benefit\ - from an oasis will yield +2, or +3 if it is a city on a desert river.\ + from an oasis will yield +2, or +3 if it is a city on a desert river. \n\ "), _("\ -Irrigating a tile with a mine or oil well will destroy it.\ +Irrigating a tile with a mine or oil well will destroy it. \n\ "), _("\ City center tiles get their terrain irrigation bonus automatically, \ if there is no conflicting mine or oil well on the tile; however, \ @@ -1199,7 +1231,7 @@ helptext = _("\ Mines can be built on some types of terrain, which increases the \ number of production points produced by that tile. Hills get an extra \ 3 production points per tile; other terrains get 1 extra production \ -point.\ +point. \n\ "), _("\ Building a mine on an irrigated tile will destroy the irrigation.\ ") @@ -1226,7 +1258,7 @@ conflicts = "Irrigation", "Farmland" helptext = _("\ Oil wells behave like mines (giving an extra production point), but \ require more technology. Oil wells can be built on Desert with knowledge \ -of Construction, and on Arctic terrain with knowledge of Refining.\ +of Construction, and on Arctic terrain with knowledge of Refining. \n\ "), _("\ Building an oil well on an irrigated tile will destroy the irrigation.\ ") @@ -1260,20 +1292,20 @@ Settlers, or Engineers with the \"clean pollution\" order.\ "), _("\ Pollution from production is likely to start becoming important as \ your civilization becomes more industrialized, giving you buildings \ -such as Factory and Power Plant which boost production. Replacing a \ -Power Plant with cleaner forms of energy -- a Hydro Plant / Hoover \ +such as Factory and Coal Plant which boost production. Replacing a \ +Coal Plant with cleaner forms of energy -- a Hydro Plant / Hoover \ Dam, Nuclear Plant, or Solar Plant -- will reduce pollution from \ production, as will a Recycling Center or knowledge of \ -Environmentalism.\ +Environmentalism. \n\ "), _("\ The city population starts adding to pollution with the discovery of \ Industrialization, and Automobile, Mass Production, and Plastics make \ this worse. Building a Mass Transit in a city eliminates the \ -populational contribution to pollution.\ +populational contribution to pollution. \n\ "), _("\ The contribution of these factors can be seen in the city dialog; once \ it exceeds a threshold, the excess is the percent chance of pollution \ -appearing each turn.\ +appearing each turn. \n\ "), _("\ When an unused tile becomes polluted, there is the temptation to avoid \ the effort of cleaning it; but the spread of pollution has far more \ @@ -1281,7 +1313,7 @@ terrible results than the immediate economic impact -- every polluted \ tile increases the chance of global warming. Each time global warming \ advances, the entire world loses coastal land to the sea and to jungles \ and swamps, and inland tiles are lost to desert. This tends to \ -devastate cities and leads to global impoverishment.\ +devastate cities and leads to global impoverishment. \n\ "), _("\ The risk of global warming is cumulative; the longer polluted tiles \ are left uncleaned, the higher the risk becomes, and the risk can \ @@ -1311,11 +1343,9 @@ helptext = _("\ Villages (also called \"huts\") are primitive communities spread \ across the world at the beginning of the game. Any land unit can enter \ a village, making the village disappear and deliver a random response. \ -If the village proves hostile, it could produce barbarians or the unit \ -entering may simply be destroyed. If they are friendly, the player \ -could receive gold, a new technology, a military unit (occasionally a \ -settler; and sometimes a unit that the player cannot yet create), or \ -even a new city.\ +If the village is friendly, the player \ +could receive artifacts worth some gold, or a mercenary military unit \ +with no upkeep. \n\ "), _("\ Later in the game, helicopters may also enter villages, but overflight \ by other aircraft will cause the villagers to take fright and disband.\ @@ -1341,12 +1371,13 @@ reqs = build_time = 0 removal_time = 0 conflicts = "Mine", "Oil Well" +flags = "IrrigationSource" helptext = _("\ Once Refrigeration is known, irrigation systems can be upgraded to \ -farmland by irrigating them a second time; if the city working the tile \ -has a Supermarket, a farmland tile provides twice as much food.\ +Farmland by irrigating them a second time; if the city working the tile \ +has a Supermarket, a Farmland tile provides twice as much food. \n\ "), _("\ -Like irrigation, farmland is incompatible with mines and oil wells.\ +Like irrigation, Farmland is incompatible with mines and oil wells.\ ") [extra_fallout] @@ -1366,22 +1397,22 @@ reqs = "TerrainFlag", "NoPollution", "Local", FALSE, TRUE } removal_time = 0 -disappearance_chance = 2000 +disappearance_chance = 1500 disappearance_reqs = { "type", "name", "range" } flags = "NuclearWinter" helptext = _("\ -Nuclear fallout can appear on land tiles when a Nuclear unit is \ -detonated. It halves all output from its tile.\ +Nuclear Fallout can appear on land tiles when a Nuclear unit is \ +detonated. It halves all output from its tile. \n\ "), _("\ -Every tile with nuclear fallout also increases the risk of global \ +Every tile with Fallout also increases the risk of global \ nuclear winter. If nuclear winter occurs, land across the globe \ -changes into desert, tundra, and ice, and lakes and oceans freeze.\ +changes to colder terrain. \n\ "), _("\ -Settlers, Workers, and Engineers can clean up nuclear fallout.\ - Nuclear fallout disperses and disappears randomly over time.\ - On average, it lasts for 5 turns.\ +Worker types can clean Fallout.\ + Fallout disperses and disappears randomly over time.\ + On average, it lasts for about 6 turns. \n\ ") ; ***************************** BASES **************************************** @@ -1400,22 +1431,25 @@ rmact_gfx = "None" rmact_gfx_alt = "-" reqs = { "type", "name", "range","present","quiet" + "ServerSetting","hideouts","World",TRUE, FALSE + "UnitFlag", "CanHide", "Local", TRUE, FALSE + "UnitFlag", "CanClaim", "Local", FALSE, FALSE "CityTile","Center", "Local", FALSE, TRUE + "Tech", "Warrior Code", "Player",TRUE, FALSE + "TerrainClass","Land", "Local", TRUE, FALSE "Terrain", "Hills", "Local", FALSE, FALSE "Terrain", "Plains", "Local", FALSE, FALSE "Terrain", "Grassland", "Local", FALSE, FALSE "Terrain", "Tundra", "Local", FALSE, FALSE "Terrain", "Desert", "Local", FALSE, FALSE - "Terrain", "Glacier", "Local", FALSE, FALSE - "Tech", "Warrior Code", "Player",TRUE, FALSE - "TerrainClass","Land", "Local", TRUE, FALSE - "UnitFlag","CanHide", "Local", TRUE, FALSE + "Terrain", "Glacier", "Local", FALSE, FALSE "Extra", "Naval Base","Local", FALSE, FALSE "Extra", "Fortress", "Local", FALSE, FALSE + "Extra", "Castle", "Local", FALSE, FALSE + "Extra", "Bunker", "Local", FALSE, FALSE "Extra", "Airbase", "Local", FALSE, FALSE "Extra", "Fort", "Local", FALSE, FALSE "Extra", "Quay", "Local", FALSE, FALSE - "ServerSetting","hideouts","World",TRUE, FALSE } disappearance_reqs = { "type", "name", "range", "present" @@ -1433,18 +1467,63 @@ Since the dawn of time, camouflaged and concealed terrain has been\ enhanced to make Hideouts. Usually the intent is to evade an\ aggressor or to set an ambush. Hideouts can only be put in Forests,\ Swamps, Mountains, and Jungle. Warrior Code must be known. Tile must\ - be Friendly or Unclaimed. Only Foot soldiers can make Hideouts. Only\ - Land units and Helicopters can hide in them. Other types will be seen.\ - Invisibility is the only bonus of a Hideout. Hideouts can't stack with\ + be Friendly or Unclaimed. Only a Foot soldier alone on a tile can make a Hideout.\ + Only Land units and Helicopters can hide in them. Other types will be seen.\ + Invisibility is the only bonus of a Hideout. Hideouts can’t stack with\ other bases. Hideouts are invisible to anyone not occupying the tile with\ a Land unit. For each turn it is unoccupied, a Hideout has a 15% chance\ of being lost to the elements of nature. The only way to know if there is\ - a Hideout on a tile is to move a Land unit onto it.\ + a Hideout on a tile is to move a Land unit onto it. \n\ "), _(" TIP: Hideouts are good for guarding a border or setting a trap for\ intruders. Be careful! An abandoned Hideout can be used against you!\ ") +[extra_tileclaim] +name = _("Tile Claim") +category = "Infra" +causes = "Base" +rmcauses = "Pillage" +graphic = "base.tileclaim" +graphic_alt = "-" +activity_gfx = "unit.tileclaim" +act_gfx_alt = "-" +act_gfx_alt2 = "-" +rmact_gfx = "None" +rmact_gfx_alt = "-" +reqs = + { "type", "name", "range","present", "quiet" + "TerrainClass", "Land", "Local", TRUE, FALSE +; Hard contradiction between Tile Claim and Hideout is necessary so that +; the actionenabler for one never allows the other to be made. Currently, +; "CanClaim" and "CanHide" never exist in the same unit. +; "MaxUnitsOnTile", "1", "Local", FALSE, FALSE +; "Extra", "Naval Base", "Local", FALSE, FALSE ; we now allow claiming a tile so you'd keep it after +; "Extra", "Fortress", "Local", FALSE, FALSE ; removing a base. no conflicts seen yet but we can +; "Extra", "Castle", "Local", FALSE, FALSE ; bring it back if any found. +; "Extra", "Bunker", "Local", FALSE, FALSE +;------------------- + "UnitFlag", "CanClaim", "Local", TRUE, FALSE + "UnitFlag", "CanHide", "Local", FALSE, FALSE + "TerrainClass", "Land", "Local", TRUE, FALSE ; Can't claim sea tiles on a boat. + "CityTile", "Center", "Local", FALSE, TRUE + } +build_time = 1 +removal_time = 0 +;conflicts = "Fortress", "Naval Base", "Castle", "Bunker" +defense_bonus = 0 +native_to = "Land", "LandAirSea", "LandNoKill" +;hidden_by = "Fortress", "Naval Base", "Castle", "Bunker" +flags = "ShowFlag", "NativeTile" +helptext = _("\ +A Tile Claim asserts sovereignty over a tile. Tile Claims can be made in\ + domestic territory with a single diplomatic unit. Non-domestic territory\ + requires adjacency to an existing Tile Claim, and the Diplomat must be\ + supported by another unit when making the claim. NOTE: if a claimed\ + tile is unoccupied, foreign units entering the tile will take\ + possession of it for their own nation.\ +") + [extra_fort] name = _("Fort") category = "Infra" @@ -1467,8 +1546,8 @@ reqs = } build_time = 3 removal_time = 0 -native_to = "Land", "LandAirSea", "LandNoKill", "Helicopter", "Balloon", "AirProtect" -hidden_by = "Fortress", "Naval Base" +native_to = "Land", "LandAirSea", "LandNoKill", "LandRoad", "Helicopter", "Balloon", "AirProtect" +hidden_by = "Fortress", "Naval Base", "Castle", "Bunker" flags = "NativeTile", "NoStackDeath" ;, "Refuel" ;NOTE: effect_fortress_regen should give 25% of 20HP to helicopter, +1hp for being stationary ;thus a fortress should give +6hp -2hp for not being in refuel spot or +4hp/turn. Healing 67% @@ -1479,7 +1558,7 @@ flags = "NativeTile", "NoStackDeath" ;, "Refuel" helptext = _("\ Forts are rapidly built fortifications which give Land units +33% defense\ against Land and Sea units. Defending units are lost one at a time instead\ - of the entire stack dying. A fort is necessary to start building a fortress.\ + of the entire stack dying. A fort is necessary to start building a Fortress. \n\ "), _(" TIP: Forts make great outposts for keeping watch on your borders. Be careful--\ an unmanned Fort can be claimed by a foreign unit.\ @@ -1498,28 +1577,31 @@ act_gfx_alt2 = "-" rmact_gfx = "None" rmact_gfx_alt = "-" reqs = - { "type", "name", "range", "present", "quiet" - "Extra", "Fort", "Local", TRUE, FALSE - "Extra", "Hideout", "Local", FALSE, FALSE - "Tech", "Construction", "Player", TRUE, FALSE - "TerrainClass", "Land", "Local", TRUE, FALSE - "UnitFlag", "CanFortress", "Local", TRUE, FALSE - "CityTile", "Center", "Local", FALSE, TRUE + { "type", "name", "range","present", "quiet" + "Extra", "Fort", "Local", TRUE, FALSE + "Extra", "Naval Base", "Local", FALSE, TRUE + "Extra", "Hideout", "Local", FALSE, FALSE + "Tech", "Construction", "Player", TRUE, FALSE + "TerrainClass", "Land", "Local", TRUE, FALSE + "UnitFlag", "CanFortress", "Local", TRUE, FALSE + "CityTile", "Center", "Local", FALSE, TRUE } build_time = 5 removal_time = 0 +conflicts = "Naval Base" defense_bonus = 67 -native_to = "Land", "LandAirSea", "LandNoKill", "Helicopter", "Balloon" -hidden_by = "Naval Base" -flags = "NativeTile", "Refuel", "NoStackDeath" +native_to = "Land", "LandAirSea", "LandNoKill", "LandRoad", "Cargo", "Helicopter", "Balloon", "Zeppelin" +hidden_by = "Castle", "Bunker" +flags = "NativeTile", "Refuel", "NoStackDeath", "FortressHeal" helptext = _("\ -Fortresses are improvements built on top of Forts which greatly improve defense.\ - A Land unit remaining in a fortress for a whole turn without moving recovers a\ - quarter of its hit points. With Invention, fortresses gain watchtowers from which\ - land units can see farther.\ +Fortresses are improvements built on top of Forts which greatly improve defense:\ + the general bonus against most land unit attacks is 2x. \n\ +A Land unit remaining in a Fortress for a whole turn without moving recovers a\ + quarter of its hit points. With Invention, Fortresses gain watchtowers from which\ + land units can see farther. \n\ "), _("\ Units in a Fortress die one at a time instead of the entire stack being lost.\ -Diplomatic units get a 25% defense bonus in diplomatic fights.\ + Diplomatic units get a 25% defense bonus in diplomatic fights.\ ") [extra_navalbase] @@ -1537,6 +1619,7 @@ rmact_gfx_alt = "-" reqs = { "type", "name", "range", "present", "quiet" "Extra", "Fort", "Local", TRUE, FALSE + "Extra", "Fortress", "Local", FALSE, TRUE "Extra", "Hideout", "Local", FALSE, FALSE "Tech", "Engineering", "Player", TRUE, FALSE "TerrainFlag", "Low Land", "Local", TRUE, FALSE @@ -1546,20 +1629,94 @@ reqs = } build_time = 8 removal_time = 0 -conflicts = "Airbase", "Fortress" +conflicts = "Fortress", "Castle", "Bunker" defense_bonus = 67 -native_to = "Trireme", "RiverShip", "Sea", "Submarine", "Balloon", - "Land", "LandAirSea", "LandNoKill", "Helicopter" -flags = "NativeTile", "NoStackDeath", "Refuel" +native_to = "Trireme", "RiverShip", "Sea", "Submarine", "Balloon", "Zeppelin", + "Land", "LandRoad", "Cargo", "LandAirSea", "LandNoKill", "Helicopter" +flags = "NativeTile", "NoStackDeath", "Refuel", "FortressHeal" helptext = _("\ Naval bases are coastal Fortresses with ocean access. They allow ships to enter and\ - receive a 1.33x bonus from superior fortifications and defensive position. Naval\ - Bases are built into Fortresses--all other units get the benefits of a Fortress.\ + receive a 2x bonus from superior fortifications. Naval\ + Bases are built on top of Forts. All other units get the benefits of a Fortress. \n\ "), _(" NOTE: Naval bases are the only location where ships can be sure to avoid stack death without\ suffering a defense disadvantage.\ ") +[extra_castle] +name = _("Castle") +category = "Infra" +causes = "Base" +rmcauses = "Pillage" +graphic = "base.castle" +graphic_alt = "base.fortress" +activity_gfx = "unit.castle" +act_gfx_alt = "unit.fortress" +act_gfx_alt2 = "-" +rmact_gfx = "None" +rmact_gfx_alt = "-" +reqs = + { "type", "name", "range", "present", "quiet" + "Extra", "Fortress", "Local", TRUE, FALSE + "Tech", "Construction", "Player", TRUE, FALSE + "Tech", "Feudalism", "Player", TRUE, FALSE + "Tech", "Gunpowder", "Player", FALSE, FALSE + "TerrainClass", "Land", "Local", TRUE, FALSE + "UnitFlag", "CanFortress", "Local", TRUE, FALSE + "CityTile", "Center", "Local", FALSE, TRUE +; "Extra", "River", "Local", FALSE, FALSE + } +build_time = 11 +removal_time = 0 +unit_seen = "Hidden" +native_to = "Land", "LandAirSea", "LandNoKill", "LandRoad", "Cargo", "Helicopter", "Balloon", "Zeppelin" +conflicts = "Airbase", "Naval Base", "Bunker" +flags = "NativeTile", "Refuel", "NoStackDeath", "FortressHeal" +helptext = _("\ +Before the age of Gunpowder, Castles were built as fortresses with an \ +administration center. Construction on them can only begin once the \ +underlying Fortress is complete. \n\ +"), _("\ +The Castle and its surrounding area is ruled by a vassal with a high \ +degree of autonomy. This makes a Castle able to control terrain far from \ +the borders of its nation’s cities.\ +") + +[extra_bunker] +name = _("Bunker") +category = "Infra" +causes = "Base" +;rmcauses = "None" +graphic = "base.bunker" +graphic_alt = "base.fortress" +activity_gfx = "unit.fortress" +act_gfx_alt = "unit.castle" +act_gfx_alt2 = "-" +rmact_gfx = "None" +rmact_gfx_alt = "-" +reqs = + { "type", "name", "range", "present", "quiet" + "Extra", "Fortress", "Local", TRUE, FALSE + "Extra", "Castle", "Local", FALSE, FALSE + "Tech", "Gunpowder", "Player", TRUE, FALSE + "Tech", "Steel", "Player", TRUE, FALSE + "TerrainClass", "Land", "Local", TRUE, FALSE + "UnitFlag", "CanFortress", "Local", TRUE, FALSE + "CityTile", "Center", "Local", FALSE, TRUE +; "Extra", "River", "Local", FALSE, FALSE + } +build_time = 36 +removal_time = 0 +unit_seen = "Hidden" +native_to = "Land", "LandAirSea", "LandNoKill", "LandRoad", "Cargo", "Helicopter", "Balloon", "Zeppelin" +conflicts = "Airbase", "Naval Base", "Castle" +flags = "NativeTile", "Refuel", "NoStackDeath", "FortressHeal" +helptext = _("\ +Bunkers are underground Fortresses made of concrete and steel, \ +immune to air and missile attacks. In some respects they are the \ +modern equivalent of a Castle.\ +") + [extra_airbase] name = _("Airbase") category = "Infra" @@ -1582,11 +1739,12 @@ reqs = } build_time = 3 removal_time = 0 -native_to = "Air", "Balloon", "Helicopter", "Missile", "Bomb", "AirProtect", "AirPillage" +native_to = "Air", "Balloon", "Zeppelin", "Helicopter", "Missile", "Bomb", "AirProtect", "Air_High_Altitude", "Cargo" +conflicts = "Castle", "Bunker" flags = "Refuel", "NoStackDeath" helptext = _("\ Airbases allow your air units to land and refuel outside cities. \ -Air units in an airbase may be attacked by land units.\ +Air units in an airbase may be attacked by land units. \n\ "), _("\ Units can paradrop from this tile.\ ") @@ -1610,11 +1768,12 @@ reqs = "Extra", "Airbase", "Local", TRUE, FALSE "TerrainClass", "Land", "Local", TRUE, FALSE "UnitFlag", "Airbase", "Local", TRUE, FALSE + "UnitType", "Marines", "Local", FALSE, TRUE "CityTile", "Center", "Local", FALSE, TRUE } build_time = 5 removal_time = 0 -native_to = "Air", "Balloon", "Helicopter", "Missile", "Bomb", "AirProtect", "AirPillage" +native_to = "Air", "Balloon", "Zeppelin", "Helicopter", "Missile", "Bomb", "AirProtect", "Air_High_Altitude" flags = "Refuel", "NoStackDeath" helptext = _("\ With the available tech, Radar can be added to an Airbase, which significantly increases its vision.\ @@ -1685,7 +1844,6 @@ rmact_gfx = "None" rmact_gfx_alt = "-" reqs = { "type", "name", "range", "present", "quiet" -; "Extra", "River", "Local", TRUE, FALSE "ExtraFlag", "Quayable", "Local", TRUE, FALSE "Tech", "Pottery", "Player", TRUE, FALSE "TerrainClass","Land", "Local", TRUE, FALSE @@ -1694,22 +1852,23 @@ reqs = } build_time = 3 removal_time = 0 -native_to = "Land", "LandAirSea", "LandNoKill", "Trireme", "Balloon", "RiverShip" +native_to = "Land", "LandRoad", "LandAirSea", "LandNoKill", "Trireme", "Cargo", "Balloon", "Zeppelin", "RiverShip" ;hidden_by = "" flags = "NativeTile", "AutoOnCityCenter" helptext = _("\ -Quays are structures on both sides of rivers, where boats dock parallel to the\ - river bank for quick loading and unloading. River traffic can directly offload\ - onto nearby roads and be underway. Quays also have built-in infrastructure to ferry\ - units across a river——the ancient way to cross rivers before the advent of Bridge\ - Building. Stepping from a road onto a Quay uses a full move point: the time needed\ - to load up and use its infrastructure. Any unit already on a Quay can immediately\ - step onto connecting roads at no penalty. (Cargo units must first be unloaded by\ - the transport carrying them.)\ +Quays are structures on both sides of rivers, where boats dock parallel to the river\ + bank for quick loading and unloading. River and Canal traffic can directly offload\ + onto a quay. Quays have built-in infrastructure to ferry units across a\ + river——the ancient way to cross rivers before the advent of Bridge Building.\ + Passing from a road to a quay uses a full move point: the time needed\ + to load up and use its infrastructure. Any unit already on a quay can immediately\ + step onto connecting roads at no penalty. (Cargo units must first deboard\ + the transport carrying them.) A quay can equally be placed on a canal and will\ + behave the same as on a river. \n\ "), _(" -TIP: Quays can boost transportational logistics for ancient civilisations who have\ - built on rivers. Don't be tempted to make too many Quays. The unloading and movement\ - bonus is often the extra edge an enemy needs for an effective surprise attack.\ +TIP: Quays can boost transportational logistics for ancient civilizations who build\ + on rivers. Don’t be tempted to make too many Quays. The ability to unload on a\ + river may help an enemy do a surprise attack.\ "), _("Moves needed to cross a river to a tile on the other side:\n ⁶⁄₃ moves: No infrastructure.\n\ ⁴⁄₃ moves: Quay connected to roads.\n\ @@ -1741,7 +1900,7 @@ flags = "AutoOnCityCenter", "NativeTile", "Railable" bridged_over = "River" helptext = _("\ Roads allow your land units to move more quickly, and on some terrain,\ - also provide a trade bonus.\ + also provide a trade bonus. \n\ "), _("\ Building roads on river tiles requires knowledge of Bridge Building.\ City center tiles automatically get roads (unless they are on a river\ @@ -1776,11 +1935,11 @@ bridged_over = "River" helptext = _("\ Once you learn Railroad technology, you may upgrade your roads to\ railroads. Units travel three times faster along railroads than\ - along roads.\ + along roads. \n\ "), _("\ A railroad also increases any shield resources produced by a tile.\ A tile whose road is upgraded to a railroad retains any trade bonus\ - from the road as well.\ + from the road as well. \n\ "), _("\ City center tiles with roads are automatically upgraded to railroads\ when you learn the Railroad technology.\ @@ -1790,7 +1949,7 @@ City center tiles with roads are automatically upgraded to railroads\ name = _("Maglev") category = "Infra" causes = "Road" -rmcauses = "Pillage" +rmcauses = "Pillage", "Disappear" graphic = "road.maglev" graphic_alt = "road.rail" activity_gfx = "unit.maglev" @@ -1798,13 +1957,17 @@ act_gfx_alt = "unit.road" act_gfx_alt2 = "-" rmact_gfx = "None" rmact_gfx_alt = "-" +;For now this is how we disallow MagLev on ocean: it disappears if you make it. +disappearance_chance = 10000 +disappearance_reqs = + { "type", "name", "range", "present" + "TerrainClass", "Oceanic", "Local", TRUE + "Extra", "Sea Bridge","Local", FALSE + } reqs = { "type", "name", "range", "present", "quiet" "Tech", "Superconductors", "Player", TRUE, FALSE -; "Extra", "Railroad", "Local", TRUE, FALSE "UnitFlag", "CanRoad", "Local", TRUE, FALSE -; "UnitClass", "Sea", "Local", FALSE, TRUE -; "TerrainClass", "Land", "Local", TRUE, FALSE } build_time = 3 removal_time = 0 @@ -1814,7 +1977,7 @@ flags = "NativeTile", "AutoOnCityCenter" helptext = _("\ With Superconductors, you may build MAGnetic LEVitation tracks\ on tiles. Land units expend no movement points\ - when riding a MagLev; you may ride indefinitely.\ + when riding a MagLev; you may ride indefinitely. \n\ "), _("\ City center tiles with railroads are automatically upgraded to MagLev\ when you learn about Superconductors.\ @@ -1834,7 +1997,7 @@ rmact_gfx = "None" rmact_gfx_alt = "-" buildable = TRUE generated = TRUE -defense_bonus = 33 +;defense_bonus = 33 now a +0.50 flat bonus. reqs = { "type", "name", "range", "present" "TerrainClass", "Land", "Local", TRUE @@ -1846,13 +2009,13 @@ reqs = } build_time = 2 removal_time = 0 -flags = "NativeTile", "Quayable", "IrrigationSource" +flags = "NativeTile", "Quayable", "IrrigationSource", "WaterwaySource" native_to = "Land", "LandNoKill", "LandAirSea", "Trireme", "RiverShip" helptext = _("\ Any land terrain type may have a River on it. A River adds 1\ - trade to the resources produced by that tile. It also increases the tile\ - defense factor by 50%. Finally, land units may move along a River (but\ - not diagonally) for fast travel.\ + trade to the resources produced by that tile. It also adds +0.50 to\ + the tile defense bonus. Finally, land units may move cardinally along\ + a River and use 1/3 move point. \n\ "), _("\ Roads, railroads and MagLev can only be built on River tiles if your\ civilization has learned Bridge Building technology.\ @@ -1880,7 +2043,7 @@ reqs = } build_time = 12 removal_time = 0 -native_to = "Land", "LandNoKill", "LandAirSea", "LandRoad", "LandRail" +native_to = "Land", "LandNoKill", "LandAirSea", "LandRoad" flags = "NativeTile", "Railable" helptext = _("\ Sea Bridges are engineering marvels which span lakes and seas to connect them for \ @@ -1903,14 +2066,14 @@ generated = FALSE reqs = { "type", "name", "range", "present" "TerrainFlag", "Low Land", "Local", TRUE - "TerrainClass", "Oceanic", "Adjacent", TRUE + "TerrainClass", "Oceanic", "CAdjacent", TRUE "Tech", "Engineering", "Player", TRUE "UnitFlag", "CanRoad", "Local", TRUE } build_time = 10 removal_time = 0 native_to = "Trireme", "Sea", "RiverShip", "Land", "LandAirSea", "LandNoKill", "Helicopter", "Submarine" -flags = "NativeTile", "Quayable" +flags = "NativeTile", "Quayable", "IrrigationSource", "WaterwaySource" helptext = _("\ Canals allow ships to travel through land tiles. Canals can be built on \ low land tiles only, and not far inland.\ @@ -1931,14 +2094,14 @@ generated = FALSE reqs = { "type", "name", "range", "present" "TerrainFlag", "Low Land", "Local", TRUE - "Extra", "River", "Adjacent", TRUE + "ExtraFlag", "WaterwaySource", "CAdjacent", TRUE "Tech", "Engineering", "Player", TRUE "UnitFlag", "CanRoad", "Local", TRUE } build_time = 10 removal_time = 0 native_to = "Trireme", "Sea", "RiverShip", "Land", "LandAirSea", "LandNoKill", "Helicopter", "Submarine" -flags = "NativeTile", "Quayable" +flags = "NativeTile", "Quayable", "IrrigationSource" helptext = _("\ Waterways are navigational channels that connect canals with rivers. Essentially, they're the same as canals.\ ") @@ -1959,7 +2122,7 @@ rmact_gfx_alt = "-" [extra_iron] name = _("Iron") category = "Resource" -causes = "Resource" +causes = "Resource", "Appear" ;rmcauses = "" graphic = "ts.iron" graphic_alt = "-" @@ -1968,11 +2131,26 @@ act_gfx_alt = "-" act_gfx_alt2 = "-" rmact_gfx = "None" rmact_gfx_alt = "-" +;Resource distribution scripting to add more resources in leaner +;regions. Adds about +40 to specials, so adjust settings accordingly +appearance_chance = 1000 ; +10% if no adjacent resource +appearance_reqs = + { "type", "name", "range", "present" + "Terrain", "Mountains","Local", TRUE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE + "MinYear", "-4000", "World", TRUE + "MinYear", "-3900", "World", FALSE + "Extra", "Gold", "Adjacent", FALSE + "Extra", "Iron", "Adjacent", FALSE + "Extra", "Coal", "Adjacent", FALSE + "Extra", "Wine", "Adjacent", FALSE + } -[extra_game] -name = _("?animals:Game") +[extra_elk] +name = _("Elk") category = "Resource" -causes = "Resource" +causes = "Resource", "Appear" ;rmcauses = "" graphic = "ts.tundra_game" graphic_alt = "-" @@ -1981,11 +2159,27 @@ act_gfx_alt = "-" act_gfx_alt2 = "-" rmact_gfx = "None" rmact_gfx_alt = "-" +;Resource distribution scripting to add more resources in leaner +;regions. Adds about +40 to specials, so adjust settings accordingly +appearance_chance = 1100 ; +11% if no adjacent resource +appearance_reqs = + { "type", "name", "range", "present" + "Terrain", "Tundra", "Local", TRUE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE + "MinYear", "-4000", "World", TRUE + "MinYear", "-3900", "World", FALSE + "Extra", "Elk", "Adjacent", FALSE + "Extra", "Furs", "Adjacent", FALSE + "Extra", "Buffalo", "Adjacent", FALSE + "Extra", "Wheat", "Adjacent", FALSE + "Extra", "Pheasant", "Adjacent", FALSE + } [extra_furs] name = _("Furs") category = "Resource" -causes = "Resource" +causes = "Resource", "Appear" ;rmcauses = "" graphic = "ts.furs" graphic_alt = "-" @@ -1994,6 +2188,30 @@ act_gfx_alt = "-" act_gfx_alt2 = "-" rmact_gfx = "None" rmact_gfx_alt = "-" +;Resource distribution scripting to add more resources in leaner +;regions. Adds about +40 to specials, so adjust settings accordingly +appearance_chance = 900 ; +9% if no adjacent resource +appearance_reqs = + { "type", "name", "range", "present" + ;"Terrain", "Tundra", "Local", TRUE + "Terrain", "Grassland","Local", FALSE + "Terrain", "Desert", "Local", FALSE + "Terrain", "Mountains","Local", FALSE + "Terrain", "Hills", "Local", FALSE + "Terrain", "Forest", "Local", FALSE + "Terrain", "Jungle", "Local", FALSE + "Terrain", "Swamp", "Local", FALSE + "Terrain", "Plains", "Local", FALSE + "TerrainClass","Oceanic","Local", FALSE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE + "MinYear", "-4000", "World", TRUE + "MinYear", "-3900", "World", FALSE + "Extra", "Elk", "Adjacent", FALSE + "Extra", "Furs", "Adjacent", FALSE + "Extra", "Silk", "Adjacent", FALSE + "Extra", "Pheasant", "Adjacent", FALSE + } [extra_coal] name = _("Coal") @@ -2037,7 +2255,7 @@ rmact_gfx_alt = "-" [extra_gems] name = _("Gems") category = "Resource" -causes = "Resource" +causes = "Resource", "Appear" ;rmcauses = "" graphic = "ts.gems" graphic_alt = "-" @@ -2046,11 +2264,27 @@ act_gfx_alt = "-" act_gfx_alt2 = "-" rmact_gfx = "None" rmact_gfx_alt = "-" +;Resource distribution scripting to add more resources in leaner +;regions. Adds about +40 to specials, so adjust settings accordingly +appearance_chance = 200 ; +2% if no adjacent resource +appearance_reqs = + { "type", "name", "range", "present" + "Terrain", "Jungle", "Local", TRUE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE + "MinYear", "-4000", "World", TRUE + "MinYear", "-3900", "World", FALSE + "Extra", "Rubber", "Adjacent", FALSE + "Extra", "Fruit", "Adjacent", FALSE + "Extra", "Gems", "Adjacent", FALSE + "Extra", "Wine", "Adjacent", FALSE + "Extra", "Silk", "Adjacent", FALSE + } [extra_rubber] name = _("Rubber") category = "Resource" -causes = "Resource" +causes = "Resource", "Appear" ;rmcauses = "" graphic = "ts.rubber" graphic_alt = "ts.peat" @@ -2059,6 +2293,21 @@ act_gfx_alt = "-" act_gfx_alt2 = "-" rmact_gfx = "None" rmact_gfx_alt = "-" +;Resource distribution scripting to add more resources in leaner +;regions. Adds about +40 to specials, so adjust settings accordingly +appearance_chance = 300 ; +3% if no adjacent resource +appearance_reqs = + { "type", "name", "range", "present" + "Terrain", "Jungle", "Local", TRUE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE + "MinYear", "-4000", "World", TRUE + "MinYear", "-3900", "World", FALSE + "Extra", "Rubber", "Adjacent", FALSE + "Extra", "Fruit", "Adjacent", FALSE + "Extra", "Gems", "Adjacent", FALSE + "Extra", "Resources","Adjacent", FALSE + } [extra_buffalo] name = _("Buffalo") @@ -2073,54 +2322,6 @@ act_gfx_alt2 = "-" rmact_gfx = "None" rmact_gfx_alt = "-" -[extra_deer] -name = _("Deer") -category = "Resource" -causes = "Appear", "Resource" -rmcauses = "Disappear" -graphic = "ts.forest_game" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -disappearance_chance = 10000 -disappearance_reqs = - { "type", "name", "range" - } -appearance_chance = 400 -appearance_reqs = - { "type", "name", "range", "present" - "Terrain", "Grassland","Local", TRUE - "MinYear", "-2500", "World", FALSE - "Extra", "Deer", "Adjacent", FALSE - } - -[extra_wild_boar] -name = _("Wild Boar") -category = "Resource" -causes = "Appear", "Resource" -rmcauses = "Disappear" -graphic = "ts.boar" -graphic_alt = "-" -activity_gfx = "None" -act_gfx_alt = "-" -act_gfx_alt2 = "-" -rmact_gfx = "None" -rmact_gfx_alt = "-" -disappearance_chance = 10000 -disappearance_reqs = - { "type", "name", "range" - } -appearance_chance = 400 -appearance_reqs = - { "type", "name", "range", "present" - "Terrain", "Forest","Local", TRUE - "MinYear", "-2500", "World", FALSE - "Extra", "Wild Boar", "Adjacent", FALSE - } - [extra_wheat] name = _("Wheat") category = "Resource" @@ -2137,7 +2338,7 @@ rmact_gfx_alt = "-" [extra_oasis] name = _("Oasis") category = "Resource" -causes = "Resource" +causes = "Resource", "Appear" ;rmcauses = "" graphic = "ts.oasis" graphic_alt = "-" @@ -2146,11 +2347,27 @@ act_gfx_alt = "-" act_gfx_alt2 = "-" rmact_gfx = "None" rmact_gfx_alt = "-" +flags = "IrrigationSource" +;Resource distribution scripting to add more resources in leaner +;regions. Adds about +40 to specials, so adjust settings accordingly +appearance_chance = 400 ; +4% if no adjacent resource +appearance_reqs = + { "type", "name", "range", "present" + "Terrain", "Desert", "Local", TRUE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE + "MinYear", "-4000", "World", TRUE + "MinYear", "-3900", "World", FALSE + "Extra", "Oasis", "Adjacent", FALSE + "Extra", "Oil", "Adjacent", FALSE + "Extra", "Wheat", "Adjacent", FALSE + "Extra", "Fruit", "Adjacent", FALSE + } [extra_peat] name = _("Peat") category = "Resource" -causes = "Resource" +causes = "Resource", "Appear" ;rmcauses = "" graphic = "ts.peat" graphic_alt = "-" @@ -2159,6 +2376,20 @@ act_gfx_alt = "-" act_gfx_alt2 = "-" rmact_gfx = "None" rmact_gfx_alt = "-" +;Resource distribution scripting to add more resources in leaner +;regions. Adds about +40 to specials, so adjust settings accordingly +appearance_chance = 2280 ; +22.8% if no adjacent resource +appearance_reqs = + { "type", "name", "range", "present" + "Terrain", "Swamp", "Local", TRUE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE + "MinYear", "-4000", "World", TRUE + "MinYear", "-3900", "World", FALSE + "Extra", "Spice", "Adjacent", FALSE + "Extra", "Peat", "Adjacent", FALSE + "Extra", "Resources","Adjacent", FALSE + } [extra_pheasant] name = _("Pheasant") @@ -2189,7 +2420,7 @@ rmact_gfx_alt = "-" [extra_ivory] name = _("Ivory") category = "Resource" -causes = "Resource" +causes = "Resource", "Appear" ;rmcauses = "" graphic = "ts.arctic_ivory" graphic_alt = "-" @@ -2198,6 +2429,19 @@ act_gfx_alt = "-" act_gfx_alt2 = "-" rmact_gfx = "None" rmact_gfx_alt = "-" +;Resource distribution scripting to add more resources in leaner +;regions. Adds about +40 to specials, so adjust settings accordingly +appearance_chance = 4500 ;+45% +appearance_reqs = + { "type", "name", "range", "present" + "Terrain", "Glacier", "Local", TRUE + "TerrainClass","Oceanic","Adjacent",TRUE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE + "MinYear", "-4000", "World", TRUE + "MinYear", "-3900", "World", FALSE + "Extra", "Ivory", "CAdjacent",FALSE + } [extra_silk] name = _("Silk") @@ -2215,7 +2459,7 @@ rmact_gfx_alt = "-" [extra_spice] name = _("Spice") category = "Resource" -causes = "Resource" +causes = "Resource", "Appear" ;rmcauses = "" graphic = "ts.spice" graphic_alt = "-" @@ -2224,6 +2468,20 @@ act_gfx_alt = "-" act_gfx_alt2 = "-" rmact_gfx = "None" rmact_gfx_alt = "-" +;Resource distribution scripting to add more resources in leaner +;regions. Adds about +40 to specials, so adjust settings accordingly +appearance_chance = 2420 ;+24.2% extra chance if non-adjacent extra +appearance_reqs = + { "type", "name", "range", "present" + "Terrain", "Swamp", "Local", TRUE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE + "MinYear", "-4000", "World", TRUE + "MinYear", "-3900", "World", FALSE + "Extra", "Spice", "Adjacent", FALSE + "Extra", "Peat", "Adjacent", FALSE + "Extra", "Resources","Adjacent", FALSE + } [extra_whales] name = _("Whales") @@ -2254,7 +2512,7 @@ rmact_gfx_alt = "-" [extra_oil] name = _("Oil") category = "Resource" -causes = "Resource" +causes = "Resource";, "Appear" ;rmcauses = "" graphic = "ts.oil" graphic_alt = "-" @@ -2263,6 +2521,99 @@ activity_gfx = "None" act_gfx_alt = "-" rmact_gfx = "None" rmact_gfx_alt = "-" +;Resource distribution scripting to add more resources in leaner +;regions. Adds about +40 to specials, so adjust settings accordingly +;appearance_chance = 0 ;55% no longer appears because too many permutations for layered bonuses not working. +;appearance_reqs = +; { "type", "name", "range", "present" +; "Terrain", "Glacier", "Local", TRUE +; "TerrainClass","Oceanic","Adjacent",FALSE +; "MinYear", "-4000", "World", TRUE +; "MinYear", "-3900", "World", FALSE +; "Extra", "Oil", "CAdjacent",FALSE +; } + +[extra_berries] +name = _("Berries") +category = "Resource" +causes = "Resource", "Appear" +;rmcauses = "" +graphic = "ts.berries" +graphic_alt = "ts.gold" +activity_gfx = "None" +act_gfx_alt = "-" +act_gfx_alt2 = "-" +rmact_gfx = "None" +rmact_gfx_alt = "-" +;Resource distribution scripting to add more resources in leaner +;regions. Adds about +40 to specials, so adjust settings accordingly +appearance_chance = 700 ; +7% iff no adjacent rivers or resources i.e., far less than 4% +appearance_reqs = + { "type", "name", "range", "present" + "Terrain", "Forest", "Local", TRUE +;if server places resources on T1 then the one line below replaces the two lines below it: +; "MinYear", "-4000", "World", FALSE + "MinYear", "-4000", "World", TRUE + "MinYear", "-3900", "World", FALSE + "Extra", "Berries", "Adjacent", FALSE + "Extra", "Pheasant", "Adjacent", FALSE + "Extra", "Wheat", "Adjacent", FALSE + "Extra", "Buffalo", "Adjacent", FALSE + "Extra", "Resources","Adjacent", FALSE + "Extra", "Fruit", "Adjacent", FALSE + "Extra", "Silk", "Adjacent", FALSE + "Extra", "River", "Local", FALSE ;Forests need help to have less non-trade tiles + } + +; ************ WANDERING WILD ANIMAL RESOURCES ************************ +[extra_deer] +name = _("Deer") +category = "Resource" +causes = "Appear", "Resource" +rmcauses = "Disappear" +graphic = "ts.forest_game" +graphic_alt = "-" +activity_gfx = "None" +act_gfx_alt = "-" +act_gfx_alt2 = "-" +rmact_gfx = "None" +rmact_gfx_alt = "-" +disappearance_chance = 10000 +disappearance_reqs = + { "type", "name", "range" + } +appearance_chance = 360 +appearance_reqs = + { "type", "name", "range", "present" + "Terrain", "Grassland","Local", TRUE + "MinYear", "-2200", "World", FALSE + "Extra", "Deer", "Adjacent", FALSE + } + +[extra_wild_boar] +name = _("Wild Boar") +category = "Resource" +causes = "Appear", "Resource" +rmcauses = "Disappear" +graphic = "ts.boar" +graphic_alt = "-" +activity_gfx = "None" +act_gfx_alt = "-" +act_gfx_alt2 = "-" +rmact_gfx = "None" +rmact_gfx_alt = "-" +disappearance_chance = 10000 +disappearance_reqs = + { "type", "name", "range" + } +appearance_chance = 360 +appearance_reqs = + { "type", "name", "range", "present" + "Terrain", "Forest","Local", TRUE + "MinYear", "-2200", "World", FALSE + "Extra", "Wild Boar", "Adjacent", FALSE + } + ; /* <-- avoid gettext warnings ; @@ -2272,6 +2623,7 @@ rmact_gfx_alt = "-" ; (must have "Base" in its causes) ; gui_type = How gui should handle this base. ; Value can be "Fortress", "Airbase", or "Other" +; See also [extraui] section ; border_sq = Base will claim land ownership up to this radius, ; -1 to disable. If enabled, base cannot exist in city tile. ; vision_main_sq = Base will have main layer vision to this radius @@ -2289,6 +2641,11 @@ gui_type = "Other" border_sq = -1 vision_main_sq = 2 +[base_tileclaim] +extra = "Tile Claim" +gui_type = "Other" +border_sq = 0 + [base_fort] extra = "Fort" gui_type = "Fortress" @@ -2302,6 +2659,20 @@ border_sq = 4 vision_main_sq = 4 flags = "NoAggressive" +[base_castle] +extra = "Castle" +gui_type = "Fortress" +border_sq = 5 +vision_main_sq = 15 +flags = "NoAggressive" + +[base_bunker] +extra = "Bunker" +gui_type = "Fortress" +border_sq = 4 +vision_main_sq = 4 +flags = "NoAggressive" + [base_airbase] extra = "Airbase" gui_type = "Airbase" @@ -2370,11 +2741,29 @@ flags = "NoAggressive" ; flowing from land tiles to ocean ; - "UnrestrictedInfra" = Use of the enemy owned road is not restricted ; even if server setting 'restrictinfra' is set -; - "JumpFrom" = Move to a tile nativity providing "JumpTo" -; road is considered native -; - "JumpTo" = Move from a tile nativity providing "JumpFrom" -; road is considered native -; +; - "JumpFrom" = Allows movement to a dest tile natively, provided it +; has a "JumpTo" road which is considered native +; - "JumpTo" = Allow movement to this tile natively, provided the +; source tile has a road with "JumpFrom" and the road +; is considered native +; - "IntegrateCostUp" = If this road (type A) integrates with type B, then +; the move cost when going from A to B will be the +; greater of move_cost(A) and move_cost(B). +; This gives the ruleset several possibilities: +; if this flag is given to higher move cost road (A): +; the move cost from A to B will be the same as +; B to A: the higher of the two; i.e., symmetric +; higher move cost. In other words, the same as +; how roads work with railroads. +; if this flag is given to lower move cost road (B): +; the move cost from A to B and B to A will be the +; destination cost -- that is, asymmetric; BUT +; type B will have symmetric move costs integrating +; with roads of lower move cost than itself. +; if this flag is not used: +; move_cost will be that of the destination road: +; i.e., asymmetric move_cost for A-to-B and B-to-A + ; */ <-- avoid gettext warnings [road_road] @@ -2386,7 +2775,7 @@ trade_incr = 1 food_bonus = 0 shield_bonus = 0 trade_bonus = 0 -integrates = "Quay", "Sea Bridge" +integrates = "Quay", "Sea Bridge", "Maglev" compat_special = "Road" flags = "UnrestrictedInfra" @@ -2399,7 +2788,7 @@ trade_incr = 0 food_bonus = 0 shield_bonus = 0 trade_bonus = 0 -integrates = "Road" +integrates = "Road", "Quay" flags = "UnrestrictedInfra" [road_railroad] @@ -2411,7 +2800,7 @@ trade_incr = 0 food_bonus = 0 shield_bonus = 50 trade_bonus = 0 -integrates = "Sea Bridge" +integrates = "Sea Bridge", "Maglev" compat_special = "Railroad" [road_maglev] @@ -2423,6 +2812,7 @@ trade_incr = 0 food_bonus = 0 shield_bonus = 0 trade_bonus = 0 +integrates = "Sea Bridge", "Road", "Railroad" [road_river] extra = "River" @@ -2441,7 +2831,7 @@ trade_incr = 0 food_bonus = 0 shield_bonus = 0 trade_bonus = 0 -integrates = "Road", "Railroad" +integrates = "Road", "Railroad", "Maglev" flags = "UnrestrictedInfra" [road_canal] diff --git a/freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/units.ruleset b/freeciv/freeciv/data/mp2c-occ/units.ruleset similarity index 61% rename from freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/units.ruleset rename to freeciv/freeciv/data/mp2c-occ/units.ruleset index 136a5808b..3f34c20b6 100644 --- a/freeciv/freeciv/data/.historic/mp2b-valhalla-pre-compat/units.ruleset +++ b/freeciv/freeciv/data/mp2c-occ/units.ruleset @@ -1,3 +1,4 @@ +;:::::::::::::::::::::::::::::::::::::::::’ × ; Modifying this file: ; You should not modify this file except to make bugfixes or ; for other "maintenance". If you want to make custom changes, @@ -11,11 +12,12 @@ ; the first available (not obsolete) such unit, or by picking the last ; such unit directly. When determining starting units, the first ; unit with the relevant role that the player can build will be chosen. -; If no such unit can be found (eg Explorers that require Seafaring), +; If no such unit can be found (eg Explorers that require Map Making), ; then the first unit with this role will be chosen. +;:::::::::::::::::::::::::::::::::::::::::’ × [datafile] -description="Unit definitions for the Avant-garde ruleset." +description="Unit definitions for the MP2 ruleset." options="+Freeciv-ruleset-Devel-2017.Jan.02 web-compatible" format_version=20 @@ -29,6 +31,7 @@ format_version=20 ; ************** MADE COMPATIBLE BETWEEN MP+ AND MP2 RULESETS AND POSSIBLY CLASSIC AND CIV2CIV3 SO THAT ; ************** THERE IS UNIFORMITY IN FCW CLIENT which checks these flags based on index #. Not keeping ; ************** uniformity results in loss of features as ability to check these flags would be lost. +; *** if you remove one, make it "unused" and add to it later, so the index of the others does not mess up flags = { "name", "helptxt" _("Airbase") @@ -52,7 +55,7 @@ flags = _("AddToCity"), _("Can add itself to the population of a city.") _("Nuclear"), _("Can perform a Nuclear Detonation obliterating all adjacent tiles.") _("Missile"), _("AEGIS and Armor II have a defense bonus against this unit.") - _("Well-Digger"), _("Can dig a well and irrigate tiles with no water.") + _("Well-Digger"), _("Can dig a well.") _("Infra"), _("Can build infrastructure.") _("Proletarian"), _("Controllable only by Communist governments.") _("Paratroopers"), _("Can be paradropped from a friendly city or suitable base.") @@ -63,18 +66,17 @@ flags = _("FortBuster"), _("Defending Forts get no bonus. +33% attack bonus vs. the 2× defense of a Fortress.") _("FortressBuster"), _("Defending Fortresses get no bonus.") _("AntiAir"), _("Anti-Air bonus of this unit is less effective against Stealth, which has a 25% bonus against this unit.") -;;; _("NeverProtects"), _("Does not protect other units on its tile.") ; UNCOMMENT THIS IF NOT USING SCL'S PATCH FOR THIS FLAG ;;; _("NeverBlocked"), _("Bypasses unreachable units when attacking a tile.") ; UNCOMMENT THIS IF NOT USING LEXXIE'S PATCH FOR THIS FLAG - _("MultiSlot"), _("Cities with proper requirements can produce more than one of these per turn.") ;uncomment if you don't have slot_control patch +;;; _("MultiSlot"), _("Cities with proper requirements can produce more than one of these per turn.") ;uncomment if you don't have slot_control patch _("CanHide"), _("In appropriate terrain, this unit can make a Hideout, which will conceal all land units on the tile.") _("WillNever") -;;; The following flag MUST be #34 position to work with hack in movement.c which allows transported AAA to defend on non-native: -;;; this comment can be removed when we have some smarter way for unit_can_defend_here(..) to get ruleset control. - _("TransportDefender"), _("Can defend while transported on non-native tiles.") +;;; _("TransportDefender"), _("Can defend while transported on non-native tiles.") ;uncomment if you don't have TransportDefender patch _("NonMilAttack"), _("Has military capacity but for peaceful purposes, can enter territories with whom you are at Peace") + _("Cant_Pillage"), _("Unable to pillage tiles.") + _("CanClaim"), _("Is able to claim sovereignty of foreign tiles bordering domestic territory.") } -; Names for custom unit class flags. There can be up to 8 of these. +; Names for custom unit class flags. There can be up to 12 of these. ; name = rule name; In some circumstances user may see this ; as part of some sentences, so try to make it descriptive ; and sensible. @@ -82,9 +84,11 @@ flags = ; with this flag (optional) class_flags = { "name", "helptxt" + _("AttFromNonNative"), _("Can launch attack from non-native tiles.") + _("Missile") + _("CanPillage") _("Airliftable"), _("Can be airlifted if it has remaining moves.") _("BorderPolice"), _("Military units from this class can peacefully expel certain foreign units.") - _("AttFromNonNative"), _("Can launch attack from non-native tiles.") _("CargoRestrained"), _("Can't attack as Cargo. Must first unload.") } @@ -147,7 +151,6 @@ veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 ; "TerrainDefense" = Unit Class gains defense bonus from terrain ; "DamageSlows" = Damaged units are slowed down ; "CanOccupyCity" = Military units of this class can occupy enemy cities -; "Missile" = Unit Class is destroyed when it attacks ; "BuildAnywhere" = Unit Class can be built even in the middle of non-native terrain ; "Unreachable" = Unit Class can be attacked only by units explicitly listing this ; class in its 'targets', unless on a city or native base. @@ -159,7 +162,6 @@ veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 ; override this ; "CanFortify" = Unit can fortify at land tiles. Unit type flag ; "Cant_Fortify" can override this -; "CanPillage" = Unit Class can pillage tile infrastructure ; "DoesntOccupyTile" = Even if this class of enemy unit is on tile, cities can ; still work that tile ; "AttackNonNative" = Unit Class can attack units on non-native tiles. Unit type @@ -172,19 +174,17 @@ veteran_move_bonus = 0, 0, 0, 0, 1, 1, 1 ; "KillCitizen" = Upon successful attack against a city, unit kills one ; citizen. The effect "Unit_No_Lose_Pop" and the server ; setting 'killcitizen' can disable this. - -; "Airliftable" = This Unit Class may be airlifted +; ; */ <-- avoid gettext warnings ; ********************************************************************************** ; ********************************************************************************** -; WARNING: ANY CHANGES TO WHAT TYPES OR CLASSES CAN LOAD ONTO WHICH TRANSPORTS MAY +; WARNING:ANY CHANGES TO WHAT TYPES OR CLASSES CAN LOAD ONTO WHICH TRANSPORTS MAY ; REQUIRE CHANGES TO FCW function unit_could_possibly_load() in unit.js ; ********************************************************************************** ; ********************************************************************************** [unitclass_missile] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Missile") min_speed = 1 hp_loss_pct = 0 @@ -206,7 +206,7 @@ helptext = _("\ name = _("?unitclass:LandRail") min_speed = 4 hp_loss_pct = 0 -flags = "Unreachable", "BuildAnywhere", "ZOC", "TerrainDefense", "TerrainSpeed" +flags = "Unreachable", "BuildAnywhere", "ZOC", "TerrainDefense", "TerrainSpeed", "DamageSlows" helptext = _("\ • Only able to move on railroad tiles.\ ") @@ -215,13 +215,18 @@ helptext = _("\ name = _("?unitclass:LandRoad") min_speed = 3 hp_loss_pct = 0 -flags = "BuildAnywhere", "ZOC", "TerrainDefense", "TerrainSpeed" +flags = "BuildAnywhere", "ZOC", "TerrainDefense", "DamageSlows", "TerrainSpeed", "CanFortify" helptext = _("\ • Only able to move on road tiles.\ ") +[unitclass_cargo] +name = _("?unitclass:Cargo") +min_speed = 1 +hp_loss_pct = 0 +flags = "BuildAnywhere", "ZOC", "TerrainSpeed" + [unitclass_land] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Land") min_speed = 1 hp_loss_pct = 0 @@ -260,31 +265,28 @@ helptext = _("\ ") [unitclass_sea] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Sea") min_speed = 3 hp_loss_pct = 0 flags = "DamageSlows", "AttackNonNative", "AttFromNonNative", "CanPillage" helptext = _("\ - • Crew Repair: each turn, regardless of movement, recovers 8% of its hit points (rounded down).\ + • Crew Repair:each turn, regardless of movement, recovers 8% of its hit points (rounded down).\ ") ; Separating the Submarine class finally allows it to be unreachable by Air. The old Submarine was ; far too offensively overpowered while simultaneously almost useless from ultra-vulnerability to Air units. ; Because it is now Unreachable, any unit able to attack it needs this class in its targets. [unitclass_submarine] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Submarine") -min_speed = 3 +min_speed = 4 hp_loss_pct = 0 flags = "DamageSlows", "AttackNonNative", "AttFromNonNative", "CanPillage", "Unreachable" helptext = _("\ - • Visibility bonus: not visible to other players unless they have a unit or city adjacent to it.\n\ - • Crew Repair: each turn, regardless of movement, recovers 2 hit points.\ + • Visibility bonus:not visible to other players unless they have a unit or city adjacent to it.\n\ + • Crew Repair:each turn, regardless of movement, recovers 2 hit points.\ ") [unitclass_trireme] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Trireme") min_speed = 2 hp_loss_pct = 0 @@ -298,7 +300,6 @@ hp_loss_pct = 0 flags = "DamageSlows", "AttackNonNative", "AttFromNonNative" [unitclass_heli] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Helicopter") min_speed = 1 hp_loss_pct = 5 @@ -306,7 +307,6 @@ flags = "Unreachable", "CanOccupyCity", "CollectRansom", "Airliftable" ; This class is for air units that are unreachable but do not protect a stack. [unitclass_air] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Air") min_speed = 1 hp_loss_pct = 0 @@ -314,47 +314,66 @@ hut_behavior = "Frighten" flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; This class is for air units that can pillage terrain (i.e. Jet Bomber) -[unitclass_airpillage] -; /* TRANS: Unit class: used adjectivally */ -name = _("?unitclass:AirPillage") +[unitclass_air_high_altitude] +name = _("?unitclass:Air_High_Altitude") min_speed = 1 hp_loss_pct = 0 hut_behavior = "Frighten" -flags = "Unreachable", "DoesntOccupyTile", "Airliftable", "CanPillage" +flags = "Unreachable", "DoesntOccupyTile", "Airliftable" + +[unitclass_space] +name = _("?unitclass:Space") +min_speed = 60 +hp_loss_pct = 0 +hut_behavior = "Nothing" +flags = "Unreachable", "DoesntOccupyTile" + +;[unitclass_virtual] +;name = _("?unitclass:Virtual") +;min_speed = 5 +;hp_loss_pct = 0 +;flags = "DoesntOccupyTile", "Airliftable" +;helptext = _("\ +; • Must end each turn on Destroyer class or AEGIS Cruiser.\ +;") ; This class is for air units that can also protect a stack. -; (Fighters) -- technically a separate AirProtect class is not needed, but +; (Fighters) — technically a separate AirProtect class is not needed, but ; Fighters also have Border Police abilities, and a separate class ; facilitates future adjustments and balancing in an isolated class. [unitclass_air_protect] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:AirProtect") min_speed = 1 hp_loss_pct = 0 hut_behavior = "Frighten" flags = "Unreachable", "DoesntOccupyTile", "Airliftable", "BorderPolice" helptext = _("\ - • INTERCEPTOR: can be given the Vigil order to auto-attack adjacent Air units.\n\ - • AIR COVER: Most units who cannot attack this unit also cannot attack other units on the tile.\ + • INTERCEPTOR:can be given the Vigil order to auto-attack adjacent Air units.\n\ + • AIR COVER:Most units who cannot attack this unit also cannot attack other units on the tile.\ ") [unitclass_balloon] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Balloon") min_speed = 1 hp_loss_pct = 0 hut_behavior = "Frighten" flags = "Unreachable", "DoesntOccupyTile", "Airliftable" +[unitclass_zeppelin] +name = _("?unitclass:Zeppelin") +min_speed = 1 +hp_loss_pct = 0 +hut_behavior = "Frighten" +flags = "Unreachable", "DoesntOccupyTile" ; /* <-- avoid gettext warnings ; -; Below: The individual unit types, one per section. +; Below:The individual unit types, one per section. ; ; The number can be variable, up to 200. ; However for the "official" rulesets, units should not be removed ; because that would break backward compatability with savegames. ; -; The order here matters: later units are considered "better" for +; The order here matters:later units are considered "better" for ; a given flag or role. ; ; The actual tag used (the * in [unit_*]) does not matter, except @@ -387,7 +406,7 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; hitpoints = how much damage unit can withstand ; firepower = number of hitpoints removed per round of combat; at least 1 ; move_rate = base move rate (whole movement points) -; vision_radius_sq = base vision of unit: unit can see tile up to the square +; vision_radius_sq = base vision of unit:unit can see tile up to the square ; root of this value away ; convert_to = can be converted to another type of unit by name ; convert_time = number of movement points it takes to convert to @@ -402,7 +421,16 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; uk_* = upkeep costs, these are used as base values in the game ; cargo = Unit classes this unit can transport ; city_slots = How many of homecity's unit maintenance slots unit takes -; city_size = Initial size of the cities built by 'Found City' type units +; city_size = UNUSED in MP rulesets in its original form, so now it is used +; for bit-field for additional flags that won't break save game +; compatibility. +; BIT 0 = RESERVED for +1 bombard range. +; BIT 1 = bombard_stay_fortified, attacks do not lose fortified status. +; BITS 2-7 = move frags used (up to 63, 0=turn loss/oneattack) +; BITS 8-10 = bombard_primary_targets. 0=all, or 1-7. +; BITS 11-13 = bombard_primary_kills, max kills allowed. 0-7. +; ———————————————————————————————— +; FORMERLY:Initial size of the cities built by 'Found City' type units ; (but 'Join City' uses pop_cost) ; targets = list of unit classes this unit can attack against even ; if they have Unreachable unit class flag @@ -460,7 +488,8 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; "DefenseDividerPct" = Divide defense value by 1 + (value / 100). ; Value of 100 means division by 2, (2× for attacker) ; value of 50 means division by 1.5, (1.5× for attacker) -; i.e.: Effectively increases *attack* by value percent. +; i.e.:Effectively increases *attack* by value percent. +; Bonus is defined in attackers entry. ; "FirePower1" = Defender firepower is reduced to value 1 when ; ever this has non-zero value. ; Bonus is defined in attackers entry. @@ -469,20 +498,20 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; ; "IgZOC" = ignore Zones of Control (ZOC) even if unit class has ; "ZOC" flag -; "HasNoZOC" = unit has no Zone of Control (ZOC), thus any unit can move -; around it freely -; "NonMil" = a non-military unit: no martial law; can enter +; "HasNoZOC" = unit has no Zone of Control (ZOC), thus any unit can move +; around it freely +; "NonMil" = a non-military unit:no martial law; can enter ; peaceful borders; DoesntOccupyTile ; "IgTer" = use constant move cost defined in igter_cost (terrain.ruleset) ; rather than terrain/road etc cost, unless terrain cost is ; less -; "OneAttack" = can only make a single attack, regardless of movement points -; "FieldUnit" = cause unhappiness even when not being aggressive +; "OneAttack" = can only make a single attack, regardless of movement points +; "FieldUnit" = cause unhappiness even when not being aggressive ; "BeachLander" = won't lose all its movement when moving from non-native ; terrain to native terrain even if slow_invasions is on. -; "Settlers" = "can irrigate and build roads" but really seems to be a required flag for -; any tile improvement at all. -; "Diplomat" = can defend against diplomat actions (see diplchance +; "Settlers" = "can irrigate and build roads" but really seems to be a required flag for +; any tile improvement at all. +; "Diplomat" = can defend against diplomat actions (see diplchance ; server option) ; "Spy" = strong in diplomatic battles. _Must_ be "Diplomat" also ; "CoastStrict" = (sea only) cannot leave coast @@ -490,38 +519,36 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; to regularly end turn on coast ; "Only_Native_Attack" = cannot attack targets on non-native tiles even if ; unit class can -; "Cant_Fortify" = cannot fortify even if unit class has "CanFortify" flag -; "Fanatic" = can only be built by governments that allow them -; (see civ2/governments.ruleset, Fundamentalism government) -; "Unique" = a player can only have one of these units in the game at -; the same time; barbarians cannot use this at present -; "GameLoss" = losing one of these units means you lose the game, but it -; is produced without homecity and upkeep -; "EvacuateFirst" = the game will try to rescue units with this flag before +; "Cant_Fortify"= cannot fortify even if unit class has "CanFortify" flag +; "Fanatic" = can only be built by governments that allow them +; (see civ2/governments.ruleset, Fvndamentalist government) +; "Unique" = a player can only have one of these units in the game at +; the same time; barbarians cannot use this at present +; "GameLoss" = losing one of these units means you lose the game, but it +; is produced without homecity and upkeep +; "EvacuateFirst"=the game will try to rescue units with this flag before ; it tries to rescue units without it when their transport ; is destroyed. Think of the Birkenhead drill ("women and ; children first"). Replace "women and children" with ; "units with the EvacuateFirst unit type flag". -; "SuperSpy" = this unit always wins diplomatic contests, that is, unless -; it encounters another SuperSpy, in which case defender wins; -; can also be used on non-diplomat units, in which case it can -; protect cities from diplomats; also 100% spy survival chance -; "NoHome" = this unit has no homecity and will be free of all upkeep, and -; therefore will not revolt along with its city of origin should -; it be incited +; "SuperSpy" = this unit always wins diplomatic contests, that is, unless +; it encounters another SuperSpy, in which case defender wins; +; can also be used on non-diplomat units, in which case it can +; protect cities from diplomats; also 100% spy survival chance +; "NoHome" = this unit has no homecity and will be free of all upkeep, and +; therefore will not revolt along with its city of origin should +; it be incited ; "NoVeteran" = this unit cannot gain veteran levels through experience ; (as if both raise_chance and work_raise_chance were zero); ; it can still gain veterancy through Veteran_Build, etc ; "CityBuster" = this unit has double firepower against cities ; "NoBuild" = this unit cannot be built -; "BadWallAttacker" = the firepower of this unit is set to 1 if -; attacking a city -; defended by a city wall (or other city building defense) -; "BadCityDefender" = if attacked while in a city, firepower is set to 1 -; and firepower of attacker is doubled (the Pearl Harbour -; rule) +; "BadWallAttacker"=the firepower of this unit is set to 1 if attacking a city +; defended by a city wall (or other city building defense) +; "BadCityDefender"=if attacked while in a city, firepower is set to 1 +; and firepower of attacker is doubled (the Pearl Harbour rule) ; "BarbarianOnly" = only barbarians can build this unit -; "Shield2Gold" = Switch from shield upkeep to gold upkeep possible +; "Shield2Gold" = Switch from shield upkeep to gold upkeep possible. ; "NewCityGamesOnly" = unit can't be built on scenarios where founding new cities ; is not allowed. Give this flag to units that would make no sense ; to have in a game with such a scenario @@ -549,14 +576,22 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; is enabled and the unit class is unreachable ; "MultiSlot" = if server setting slot_control is ON, only unit types with this ; flag can use extra city_build_slots -; TO DO: make this a server UTYF flag that's used instead of Shield2Gold +; "TransportDefender" = Unit can always defend while transported, even on non-native +; terrain. +; "SentryAlways" = This unit always reports sentry-type information; give this flag to +; reconnaissance/scouting type units who can't sentry because they are +; fuel-type units (which can only sentry on refueling tiles.) +; "Reserved1" +; "Reserved2" +; "Reserved3" = reserved for future use. +; ------------------------------------------- ; Following actions require extra fields: -; "Attack" +; "Attack" and "Suicide Attack" ; attack = base attack strength ; "Bombard" ; attack = base attack strength ; bombard_rate = the number of shots fired at enemy units when attacking -; FOR NUKES: the amount to add to the default radius of 1 tile +; FOR NUKES:the amount to add to the default radius of 1 tile ; "Join City" ; pop_cost = the number of population added to the target city ; "Paradrop Unit" @@ -564,8 +599,10 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; Max range is 65534. ; paratroopers_mr_req = the move rate which is required at least for ; paradropping (whole movement points) -; paratroopers_mr_sub = the move rate which is subtracted after paradropping -; (whole movement points) +; paratroopers_mr_sub = +; This field, unused by any MP2 unit, is temporarily +; a bitfield for extra_unit_stats, to support added features +; without breaking savegame compatibility. ; "Upgrade Unit" ; obsolete_by = the unit type upgraded to. ; "Convert Unit" @@ -579,9 +616,9 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; "HutTech" = can be found in a hut, but its techs required ; "Partisan" = can be created as a partisan (only one unit can have this ; flag), see end of this file for its tech requirements option -; "DefendOk" = AI hint: ok for defending with -; "DefendGood" = AI hint: good for defending with -; "Ferryboat" = AI hint: useful for ferrying +; "DefendOk" = AI hint:ok for defending with +; "DefendGood" = AI hint:good for defending with +; "Ferryboat" = AI hint:useful for ferrying ; "Barbarian" = can be created as land barbarian ; "BarbarianTech" = can be created as land barbarian, if someone has ; researched its tech requirements @@ -594,7 +631,7 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; "BarbarianSeaTech" = can be created as a barbarian that disembarks from a barbarian boat ; if someone has researched its tech requirements ; "Settlers" = can irrigate and build roads -; "Hunter" = AI hint: good for hunting other units +; "Hunter" = AI hint:good for hunting other units ; "CitiesStartUnit" = Gets granted as 'c' startunit ; "WorkerStartUnit" = Gets granted as 'w' startunit ; "ExplorerStartUnit" = Gets granted as 'x' startunit @@ -605,8 +642,54 @@ flags = "Unreachable", "DoesntOccupyTile", "Airliftable" ; "DefendGoodStartUnit" = Gets granted as 'D' startunit ; "AttackFastStartUnit" = Gets granted as 'a' startunit ; "AttackStrongStartUnit" = Gets granted as 'A' startunit -; -; */ <-- avoid gettext warnings + +; "UserType1Startunit" = Gets granted as 'u' startunit +; "UserType2Startunit" = Gets granted as 'U' startunit +; "UserType3Startunit" = Gets granted as 'z' startunit +; "TradeStartUnit" = Gets granted as 't' startunit + +[unit_founders] +name = _("Founders") +class = "Land" +tech_req = "None" +obsolete_by = "None" +graphic = "u.founder_o" +graphic_alt = "-" +sound_move = "m_settlers" +sound_move_alt = "m_generic" +sound_fight = "f_settlers" +sound_fight_alt = "f_generic" +build_cost = 50 +pop_cost = 2 +attack = 0 +defense = 1 +hitpoints = 25 +firepower = 1 +move_rate = 2 +vision_radius_sq = 5 +transport_cap = 0 +fuel = 0 +city_size = 2 +uk_happy = 0 +uk_shield = 1 +uk_food = 1 +uk_gold = 0 +flags = "Settlers", "NoBuild", "Infra", "CanRoad", "CanFortress", "NonMil", "HasNoZOC", "AddToCity", "Cities", "Cant_Fortify", + "Expellable", "Unbribable" +; No veteran levels (level name is never displayed) +veteran_names = _("green") +veteran_base_raise_chance = 0 +veteran_work_raise_chance = 0 +veteran_power_fact = 100 +veteran_move_bonus = 0 +roles = "UserType1Startunit" +helptext = _("\ +At game start, Founders are a more populous portion of your nomadic tribe. \n\ +"), _("\ +Founders are Settlers who found a city of size 2—usually the first city and\ + capital of a tribe. They are a start unit that cannot be built. In all other\ + respects they are exactly like Settlers, except they cannot be bribed.\ +") [unit_settlers] name = _("Settlers") @@ -618,7 +701,7 @@ graphic_alt = "-" sound_move = "m_settlers" sound_move_alt = "m_generic" sound_fight = "f_settlers" -sound_fight_alt = "f_generic" +sound_fight_alt = "Pillage" build_cost = 40 pop_cost = 1 attack = 0 @@ -642,14 +725,15 @@ veteran_power_fact = 100 veteran_move_bonus = 0 roles = "CitiesStartUnit" helptext = _("\ -Settlers are your only means of founding new cities.\ +Population Cost: 1. Adds Population: 1.\n\n\ +Settlers are your only means of founding new cities. \ "), _("\ Settlers can perform most of the terrain alterations as\ - Workers (but cannot build Airbases or Buoys).\ + Workers (but can’t build Airbases or Buoys). \ "), _("\ Upkeep for Settlers costs food as well as production. A Settler\ can die if its supporting city runs out of food. Settlers in a\ - Republic, Democracy, or Fundamentalist nation require twice as\ + Republic, Democracy, or Theocratic nation require twice as\ much food per turn.\ ") @@ -659,50 +743,78 @@ class = "Land" tech_req = "None" obsolete_by = "None" graphic = "u.tribesmen" -graphic_alt = "u.engineers" ; for compatibility -sound_move = "m_worker" -sound_move_alt = "m_generic" -sound_fight = "f_worker" +graphic_alt = "-" +sound_move = "m_tribesmen" +sound_move_alt = "m_worker" +sound_fight = "f_warriors" sound_fight_alt = "f_generic" -build_cost = 20 +build_cost = 10 pop_cost = 0 -attack = 0 +attack = 1 defense = 1 -hitpoints = 5 +hitpoints = 8 firepower = 1 -move_rate = 2 -vision_radius_sq = 4 -transport_cap = 0 +move_rate = 1 +vision_radius_sq = 5 +transport_cap = 1 fuel = 0 uk_happy = 0 uk_shield = 0 uk_food = 0 uk_gold = 0 -flags = "NoBuild", "NonMil", "HasNoZOC", "Cant_Fortify", "Capturable", "Expellable" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_base_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 +cargo = "Cargo" +embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only +disembarks = "LandRoad", "LandRail", "Helicopter" +bonuses = + { "flag", "type", "value" + "NoBuild", "DefenseMultiplier", 1 ; all animals are "NoBuild" flag. technically this also means + "NoBuild", "DefenseDivider", 2 ; Barbarian Leader (which is 0D anyway), and Leader, which is hardly used. + } +flags = "NoBuild", "Settlers", "Infra", "CanRoad", "Capturable", "Expellable", + "HasNoZOC", "IgTer", "IgZOC", "NonMil", "NonMilAttack" roles = "DefendGoodStartUnit" ; re-purposed from Phalanx +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:spirit walker"), + _("?vet_rank:chief"), + _("?vet_rank:chief of all chiefs") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 250, 300, 350, 400 +veteran_move_bonus = 3, 4, 5, 6, 7, 8, 9 helptext = _("\ -Tribesmen are ancestors whose contributions are forgotten\ - in the sands of time. Tribesmen help new nations by disbanding,\ - dedicating their life work to 10 shields of the first output in\ - a city. They also explore the area around your new nation,\ - and watch for nearby tribes. They cannot do tile improvements.\ +Tribesmen came before cities and specialized division of labor. During\ + ancient times, they get primitive versatility bonuses: \n\ +Tribesmen can explore, moving over terrain with no penalty. They don’t obey\ + or exert ZOC. They can build roads, irrigate, or mine at half the rate of\ + Workers. \n\ +Tribesmen can make basic diplomatic contact and freely Investigate\ + cities. They can carry Goods and enter nations with whom you are at Peace.\ + They can do primitive combat—they can’t conquer cities and only attack for\ + 10 combat rounds. \n\ +Tribesmen help build nations by recycling into city production with\ + a 2× bonus, donating their life-work of 20 shields into any output EXCEPT\ + units. ** Changing production targets loses their work! ** \n\ +Tribesmen lose many versatility bonuses as you become more civilized. For\ + 3 turns they gain +⅓ move. After 20 turns, they lose another ⅓ move and\ + lose their vision, tile-work, and recycle bonuses. At such point, recycling\ + into a building or wonder yields 10 shields. \n\ +(In games with animals set to on, Tribesmen attack at 3× and defend at 2× against\ + wild animals.)\ ") ;A unique patch unit to provide fair starts regardless of lack of nearby water. -;to make as a start unit, use the letter "a": for example, cccwwwxxa +;to make as a start unit, use the letter "a":for example, cccwwwxxa [unit_welldigger] name = _("Well-Digger") class = "Land" tech_req = "None" obsolete_by = "Workers" graphic = "u.well_digger" -graphic_alt = "u.migrants" +graphic_alt = "-" sound_move = "m_worker" sound_move_alt = "m_generic" sound_fight = "f_worker" @@ -711,7 +823,7 @@ build_cost = 5 pop_cost = 0 attack = 0 defense = 1 -hitpoints = 10 +hitpoints = 8 firepower = 1 move_rate = 3 vision_radius_sq = 4 @@ -734,11 +846,12 @@ roles = "AttackFastStartUnit" ;this role taken over for well-digger helptext = _("\ This unit can fix unlucky starts, but has very high upkeep.\ If you have no water, make a Well-Digger in a city that can\ - support it, create a water source, then disband the unit.\n\ - This unit can dig wells; or irrigate any lowland tile. It will cost its home city\ - -2 Food -2 Prod. This unit WILL NOT WORK: • Outside your borders,\ - • After Alphabet or Pottery, • After any player discovers Writing, • After 10 turns.\ - >> Don't fool around: high upkeep will permanently hinder you. Only make this unit if you\ + support it, create a water source, then disband the unit. \n\ + This unit can dig wells to create irrigation sources. It will cost its home city\ + -2 Food -2 Prod. This unit WILL NOT WORK:• Outside your borders,\ + • After Alphabet or Pottery, • After any player discovers Writing,\ + • After it reaches an age of 10 turns.\ + >> Don't fool around:high upkeep will permanently hinder you. Only make this unit if you\ lack water when the game starts!\ ") @@ -749,21 +862,22 @@ tech_req = "Communism" gov_req = "Communism" obsolete_by = "None" graphic = "u.proletarian" -graphic_alt = "u.migrants" +graphic_alt = "-" sound_move = "m_worker" sound_move_alt = "m_generic" sound_fight = "f_worker" -sound_fight_alt = "f_generic" +sound_fight_alt = "Pillage" build_cost = 10 pop_cost = 1 attack = 0 defense = 1 -hitpoints = 10 +hitpoints = 8 firepower = 1 move_rate = 2 vision_radius_sq = 4 transport_cap = 0 fuel = 0 +city_size = 2 uk_happy = 0 uk_shield = 0 uk_food = 1 @@ -780,10 +894,14 @@ veteran_power_fact = 100 veteran_move_bonus = 1 roles = "Settlers" helptext = _("\ -Proletarians can only be controlled by Communist governments.\ +Population Cost: 1. Adds Population: 2.\n\n\ +Proletarians can only be controlled by Communist governments. \ "), _("\ Communist States can assign Proletarians from one city to another, which transfers population\ - from one to the other. They can also be ordered to the same tasks as Workers.\ + from one to the other. They can also be ordered to the same tasks as Workers. Proletarians\ + are extremely valuable as Workers for a third of the price. The disadvantage is that they\ + cost one population to make. However, this is more than compensated by the fact that when\ + they join a city, they add two to the population! \ "), _("\ Large numbers of Proletarians can be used to rapidly complete important State projects,\ which you may organize into Five-turn Plans.\ @@ -792,32 +910,33 @@ Large numbers of Proletarians can be used to rapidly complete important State pr [unit_pilgrims] name = _("Pilgrims") class = "Land" -tech_req = "Fundamentalism" -gov_req = "Fundamentalism" +tech_req = "Theocracy" +gov_req = "Theocracy" obsolete_by = "None" graphic = "u.pilgrims" -graphic_alt = "u.migrants" +graphic_alt = "-" sound_move = "m_worker" sound_move_alt = "m_generic" sound_fight = "f_worker" sound_fight_alt = "f_generic" build_cost = 10 -pop_cost = 1 +pop_cost = 0 attack = 0 defense = 1 -hitpoints = 10 +hitpoints = 8 firepower = 1 move_rate = 2 vision_radius_sq = 4 transport_cap = 0 fuel = 0 +city_size = 1 uk_happy = 0 uk_shield = 0 uk_food = 2 uk_gold = 0 embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only disembarks = "LandRoad", "LandRail", "Helicopter" -flags = "Fanatic", "Cant_Fortify", "NonMil", "HasNoZOC", "AddToCity", "Capturable", "Expellable" +flags = "Fanatic", "Cant_Fortify", "NonMil", "HasNoZOC", "AddToCity", "Capturable", "Expellable", "Cant_Pillage" ; No veteran levels (level name is never displayed) veteran_names = _("green") veteran_base_raise_chance = 0 @@ -825,12 +944,57 @@ veteran_work_raise_chance = 0 veteran_power_fact = 100 veteran_move_bonus = 0 helptext = _("\ -Pilgrims are wayfaring migrants from Fundamentalist nations. Like Fanatics,\ - they have no upkeep if under a Fundamentalist government. Heeding the call\ +Population Cost: 0. Adds Population: 1.\n\n\ +Pilgrims are wayfaring migrants from Theocratic nations. Like Zealots,\ + they have no upkeep if under a Theocratic government. Heeding the call\ of ecclesiastic authority, Pilgrims can be guided from one city to another in\ - order to transfer population from city to city.\ + order to transfer population from city to city. Pilgrims have no population\ + cost, so can be thought of as rapture for the price of 10 shields.\ ") +[unit_migrants] +name = _("Migrants") +class = "Land" +tech_req = "Nationalism" +gov_req = "Nationalism" +obsolete_by = "None" +graphic = "u.migrants" +graphic_alt = "-" +sound_move = "m_worker" +sound_move_alt = "m_generic" +sound_fight = "f_worker" +sound_fight_alt = "f_generic" +build_cost = 10 +pop_cost = 1 +attack = 0 +defense = 1 +hitpoints = 8 +firepower = 1 +move_rate = 2 +vision_radius_sq = 4 +transport_cap = 0 +fuel = 0 +city_size = 1 +uk_happy = 0 +uk_shield = 0 +uk_food = 2 +uk_gold = 0 +embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only +disembarks = "LandRoad", "LandRail", "Helicopter" +flags = "Cant_Fortify", "NonMil", "HasNoZOC", "AddToCity", "Capturable", "Expellable", "Cant_Pillage" +; No veteran levels (level name is never displayed) +veteran_names = _("green") +veteran_base_raise_chance = 0 +veteran_work_raise_chance = 0 +veteran_power_fact = 100 +veteran_move_bonus = 0 +helptext = _("\ +Population Cost: 1. Adds Population: 1.\n\n\ +Migrants are citizens under Nationalist governments who are encouraged to\ + settle in new cities, usually in conquered or colonized areas.\ + They can be guided to transfer population from city to city. This may\ + be used to increase national population growth.\ +") [unit_worker] name = _("?unit:Workers") @@ -838,16 +1002,16 @@ class = "Land" tech_req = "Pottery" obsolete_by = "Engineers" graphic = "u.worker" -graphic_alt = "u.engineers" ; for compatibility +graphic_alt = "-" sound_move = "m_worker" sound_move_alt = "m_generic" sound_fight = "f_worker" -sound_fight_alt = "f_generic" +sound_fight_alt = "Pillage" build_cost = 30 pop_cost = 0 attack = 0 defense = 1 -hitpoints = 10 +hitpoints = 8 firepower = 1 move_rate = 2 vision_radius_sq = 4 @@ -874,11 +1038,13 @@ veteran_power_fact = 100, 100, 100, 100 veteran_move_bonus = 0, 1, 1, 1 roles = "Settlers", "WorkerStartUnit" helptext = _("\ -Workers can improve terrain tiles. See the manual on Terrain for details.\ +Workers can improve terrain tiles. See the manual on Terrain for details. \ "), _("\ Masonry lets Workers build Forts. Construction lets them build Fortresses and\ - Oil Wells. Engineering lets them build Canals and Naval Bases. Radio lets them\ - build Airbases and Buoys, which Settlers cannot. Workers must be on a ship to build Buoys.\ + Oil Wells. Engineering lets them build Canals and Naval Bases. Feudalism with\ + Construction lets them build Castles. Steel lets them build Bunkers and Sea\ + Bridges. Radio lets them build Airbases and Buoys, which Settlers cannot. Workers\ + must be on a ship to build Buoys. \ "), _("\ Communism tech allows Communist governments to conscript Workers into Riflemen via the\ Convert order. And vice versa.\ @@ -890,11 +1056,11 @@ class = "Land" tech_req = "Explosives" obsolete_by = "None" graphic = "u.engineers" -graphic_alt = "u.worker" +graphic_alt = "-" sound_move = "m_engineers" sound_move_alt = "m_generic" sound_fight = "f_engineers" -sound_fight_alt = "f_generic" +sound_fight_alt = "Pillage" build_cost = 40 pop_cost = 0 attack = 0 @@ -923,7 +1089,7 @@ helptext = _("\ Engineers can do everything Workers can do, at twice the speed.\ Unlike Workers, Engineers can Transform, such as converting\ Desert to Plains. Converting Ocean to Swamp requires being on a ship\ - on a tile bordering 3 land tiles. Constructing a Sea Bridge requires\ + on a tile bordering 2 land tiles. Constructing a Sea Bridge requires\ being on a ship on a tile cardinally adjacent to land.\ ") @@ -938,7 +1104,7 @@ sound_move = "m_warriors" sound_move_alt = "m_generic" sound_fight = "f_warriors" sound_fight_alt = "f_generic" -build_cost = 10 +build_cost = 8 pop_cost = 0 attack = 1 defense = 1 @@ -946,6 +1112,8 @@ hitpoints = 10 firepower = 1 move_rate = 2 vision_radius_sq = 4 +convert_to = "Musketeers" +convert_time = 4 transport_cap = 0 fuel = 0 uk_happy = 1 @@ -957,7 +1125,10 @@ disembarks = "LandRoad", "LandRail", "Helicopter" flags = "FootSoldier", "CantReachAir", "Settlers", "CanHide", "MultiSlot", "Shield2Gold", "WillNever" roles = "DefendOk", "DefendOkStartUnit", "FirstBuild", "Hut" helptext = _("\ -The Warrior is the weakest military unit, but can also be very cost effective.\ +The Warrior is the weakest military unit, but can also be very cost effective. \n\ +With the discovery of Conscription, Warriors can convert to Musketeers in any domestic city. \ +"), _("\ +\nThe discovery of Banking changes upkeep from shields to gold.\ ") [unit_phalanx] @@ -965,13 +1136,13 @@ name = _("Phalanx") class = "Land" tech_req = "Bronze Working" obsolete_by = "Pikemen" -graphic = "u.phalanx" +graphic = "u.phalanx_o" graphic_alt = "-" sound_move = "m_phalanx" sound_move_alt = "m_generic" sound_fight = "f_phalanx" sound_fight_alt = "f_generic" -build_cost = 20 +build_cost = 16 pop_cost = 0 attack = 1 defense = 2 @@ -979,20 +1150,38 @@ hitpoints = 10 firepower = 1 move_rate = 2 vision_radius_sq = 4 +convert_to = "Musketeers" +convert_time = 4 transport_cap = 0 fuel = 0 +city_size = 278 ;000000,000,001,000101,1,0 atk_bonus=0, max_kiils=0, targets=1, move_cost=5 frags, stay_frtfy=1, reserverd=0 +paratroopers_mr_sub = 1 ;00,0000,000,0,1 iPill_rand_tgts=0, iPill_odds=-0 pentads, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=1 +;NOTE:iPillage changes in rules require client_rules_flag and get_what_can_unit_pillage_from() changes. uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only disembarks = "LandRoad", "LandRail", "Helicopter" -flags = "FootSoldier", "CantReachAir", "Settlers", "CanHide", "MultiSlot", "Shield2Gold", "WillNever" +flags = "FootSoldier", "CantReachAir", "Settlers", "CanHide", "MultiSlot", "Shield2Gold", "WillNever", "Bombarder" roles = "DefendGood", "FirstBuild", "HutTech" helptext = _("\ -The Phalanx is armored infantry, suitable for defending your cities. It offers good value\ - for defending.\ +The Phalanx is armored infantry, excellent for city defense and holding\ + tactical positions. Phalanxes can do standard attacks and Rumble attacks\ + while remaining fortified. \n\ + "), _("\ +If a Phalanx hasn’t moved, it can Rumble Attack adjacent enemies. Rumbles are\ + disciplined skirmish—not mortal combat. The formation gives the Phalanx little\ + or no vulnerability. The trade-off is that the Phalanx can only thrust at a\ + single target for 3 combat rounds. Rumble attacks are used to unsettle enemies:\ + they can discourage fortifying into tactical positions, or weaken them prior to\ + attacks from other units. The action uses ⁵⁄₉ of a move point and doesn’t alter\ + the fortified status of the Phalanx. \n\ +"), _("\ +With the discovery of Conscription, Phalanxes can convert to Musketeers in any\ + domestic city. The discovery of Banking changes upkeep from shields to gold.\ ") +bombard_rate = 3 [unit_archers] name = _("Archers") @@ -1005,7 +1194,7 @@ sound_move = "m_archers" sound_move_alt = "m_generic" sound_fight = "f_archers" sound_fight_alt = "f_generic" -build_cost = 30 +build_cost = 24 pop_cost = 0 attack = 3 defense = 2 @@ -1013,25 +1202,36 @@ hitpoints = 10 firepower = 1 move_rate = 2 vision_radius_sq = 4 +convert_to = "Musketeers" +convert_time = 2 transport_cap = 0 fuel = 0 +city_size = 1850 ; 000000,000,111,001110,1,0 = atk_bonus=0, max_kills=0, targets=7, move_cost=14 frags, stay_fortfy=1, reserved = 0 +paratroopers_mr_sub = 4096 ; 00010,00,0000,000,0,0 - bbd_retal_rate=2, iPill_rand_tgts=0, iPill_odds=0, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 +;NOTE:iPillage changes in rules require client_rules_flag and get_what_can_unit_pillage_from() changes. uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only disembarks = "LandRoad", "LandRail", "Helicopter" -flags = "FootSoldier", "Capturer", "CantReachAir", "Bombarder", "Settlers", "CanHide", "MultiSlot", "Shield2Gold", "WillNever" +flags = "FootSoldier", "Capturer", "CantReachAir", "Bombarder", "Settlers", "CanHide", + "MultiSlot", "Shield2Gold", "WillNever" roles = "DefendOk", "DefendOkStartUnit" helptext = _("\ Archers fight with bows and arrows. They have good offense and decent defense.\ - Rather than fight to the death, Archers can also do a Ranged Attack with no risk\ - of retaliatory damage: a single volley of arrows is fired over all enemy units on the tile,\ - causing 1hp of damage to any units who are hit. This is useful for softening\ - enemies prior to battle, or for deterring an approach to a strategic location.\ - (Ranged Attack is not possible on Cities or Fortresses.)\ + Rather than fight to the death, Archers can also do a ranged Volley Attack which\ + avoids hand-to-hand retaliation:two volleys of arrows are fired on up to 7 enemy units on the tile,\ + causing 1-2hp of damage to any units who are hit. This includes Oceanic tiles if not\ + transported. This is useful for softening enemies prior to battle, or for deterring an\ + approach to a strategic location. (Volley Attack is not possible on Cities or Fortresses.)\ + Archers can do a retaliatory Volley attack against any unit which does a Special Unit Attack\ + on them. \n\ + With the discovery of Conscription, Archers can convert to Musketeers in any domestic city. \ +"), _("\ +\nThe discovery of Banking changes upkeep from shields to gold.\ ") -bombard_rate = 1 +bombard_rate = 2 [unit_legion] @@ -1045,7 +1245,7 @@ sound_move = "m_legion" sound_move_alt = "m_generic" sound_fight = "f_legion" sound_fight_alt = "f_generic" -build_cost = 40 +build_cost = 32 pop_cost = 0 attack = 4 defense = 2 @@ -1053,8 +1253,11 @@ hitpoints = 10 firepower = 1 move_rate = 2 vision_radius_sq = 4 +convert_to = "Musketeers" +convert_time = 2 transport_cap = 0 fuel = 0 +city_size = 70180 ; 000100,010,010,001001,00 = atk +4*25=+100% (2×), max_kills=2, targets=2, move_cost=9 frags, stay_fortfy=0, reserved = 0 uk_happy = 1 uk_shield = 1 uk_food = 0 @@ -1062,27 +1265,35 @@ uk_gold = 0 embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only disembarks = "LandRoad", "LandRail", "Helicopter" flags = "FootSoldier", "Settlers", "CanHide", "Infra", "CanRoad", "CanFortress", "Capturer", - "CantReachAir", "MultiSlot", "Shield2Gold", "WillNever" + "CantReachAir", "MultiSlot", "Shield2Gold", "WillNever", "Bombarder" roles = "DefendOk", "DefendOkStartUnit", "BarbarianBuild", "BarbarianSea" helptext = _("\ Legions are heavily armed well disciplined soldiers with excellent offensive strength.\ - They are famous and feared for their engineering abilities: with the required\ + They are famous for their engineering abilities:with the required\ technology they can build Forts and Fortresses. They can build Roads outside domestic\ - national territory and inside Forts and Fortresses.\ + national territory and inside Forts and Fortresses. \n\ +Legions are feared for how they start battle:a Pilum Assault targets the\ + shields of the enemy. A pilum stuck in a shield renders it useless, leaving\ + the front line vulnerable to a full-on charge. The Pilum Assault does 1 round\ + of combat at 2× attack bonus on up to 2 units on the tile. \n\ + With the discovery of Conscription, Legions can convert to Musketeers in any domestic city. \ +"), _("\ +\nThe discovery of Banking changes upkeep from shields to gold.\ ") +bombard_rate = 1; [unit_pikemen] name = _("Pikemen") class = "Land" tech_req = "Feudalism" obsolete_by = "Musketeers" -graphic = "u.pikemen" +graphic = "u.pikemen_o" graphic_alt = "-" sound_move = "m_pikemen" sound_move_alt = "m_generic" sound_fight = "f_pikemen" sound_fight_alt = "f_generic" -build_cost = 20 +build_cost = 18 pop_cost = 0 attack = 1 defense = 2 @@ -1090,6 +1301,8 @@ hitpoints = 10 firepower = 1 move_rate = 2 vision_radius_sq = 4 +convert_to = "Musketeers" +convert_time = 2 transport_cap = 0 fuel = 0 uk_happy = 1 @@ -1105,9 +1318,12 @@ bonuses = flags = "FootSoldier", "CantReachAir", "Settlers", "CanHide", "MultiSlot", "Shield2Gold", "WillNever" roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild" helptext = _("\ -Equipped with long pikes and a 2× defence bonus against\ - mounted units, Pikemen replace the Phalanx as the\ - preferred city defender.\ +Long sharp pikes give Pikemen a counter to the height and mobility of mounted\ + units. They enjoy a 2× defense bonus against mounted units. Pikemen replace\ + the Phalanx as the preferred city defender. \n\ + With the discovery of Conscription, Pikemen can convert to Musketeers in any domestic city. \ +"), _("\ +\nThe discovery of Banking changes upkeep from shields to gold.\ ") [unit_musketeers] @@ -1129,6 +1345,7 @@ hitpoints = 20 firepower = 1 move_rate = 2 vision_radius_sq = 4 +convert_to = "Riflemen" transport_cap = 0 fuel = 0 uk_happy = 1 @@ -1142,24 +1359,92 @@ flags = "FootSoldier", "Capturer", "CantReachAir", "Settlers", "CanHide" roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild", "BarbarianTech", "BarbarianBuildTech", "BarbarianSeaTech" helptext = _("\ -Musketeers are infantry equipped with early\ - firearms and replace Pikemen as the preferred\ - city defender, and replace Archers and Legions\ - for offensive foot soldiers.\ +Musketeers are infantry equipped with early firearms. They replace Pikemen as the preferred\ + city defender, and replace Archers and Legions for offensive foot soldiers.\ + The discovery of Labor Union allows upgrading Musketeers to Riflemen for free\ + in any domestic city. \ +"), _("\ +\nThe discovery of Banking changes upkeep from shields to gold.\ +") + +[unit_falconeers] +name = _("Falconeers") +class = "Land" +tech_req = "Theocracy" +gov_req = "Theocracy" +obsolete_by = "Zealots" +graphic = "u.falconeers" +sound_move = "m_musketeers" +sound_move_alt = "m_generic" +sound_fight = "f_falconeers" +sound_fight_alt = "f_musketeers" +build_cost = 20 +pop_cost = 0 +attack = 1 +defense = 1 +hitpoints = 20 +firepower = 20 +move_rate = 2 +vision_radius_sq = 4 +transport_cap = 0 +fuel = 0 +uk_happy = 2 +uk_shield = 1 +uk_food = 0 +uk_gold = 0 +embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only +disembarks = "LandRoad", "LandRail", "Helicopter" +targets = "LandRail" +bonuses = + { "flag", "type", "value" + ;The values below would be what we use if we went with normal veterancy levels. + ;"WillNever", "DefenseDividerPct", -90 ;The way to change general attack score on everyone without using integer attack score. + ;"WillNever", "DefenseMultiplierPct", -98 ;The way to change general defense score on everyone without using integer defense score. + ;However, the value below is with using the custom veterancy level. For 20FP unit, a D 20% of A emulates emulates a D 2/3 of A. + ;********* requires hard-coding fix to packhand.js:handle_non_integer_combat_scores() if changed:****************************** + "WillNever", "DefenseMultiplierPct", -50 ;The way to change general defense score on everyone without using integer defense score. + } +flags = "FootSoldier", "Capturer", "CantReachAir", "Settlers", "CanHide", "MultiSlot", "WillNever", "Shield2Gold" +roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:Hand of God") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 10, 15, 18, 20, 21, 22, 23 +veteran_move_bonus = 0, 0, 0, 0, 1, 2, 3 +helptext = _("\ +Falconeers are Theocratic holy warriors armed with Falconets—the\ + largest hand cannons humans can carry, it proves whose side God is\ + on. Ottoman Janissaries, Reconquistadores, Persian Safavid, and Indian\ + Mughal used them in holy wars. \n\ +Falconets are huge and heavy. They have woeful accuracy but lethal\ + firepower:they either kill or totally miss. On paper, attack odds\ + are closest to a Musketeer (A3). Yet there is a high chance of losing\ + when you expect to win, or winning when you expect to lose. The outcome\ + is in God's hands! Falconeers defend a bit worse than they attack. \n\ +Righteous faith is needed to fight with slow heavy inaccurate weaponry:\ + only Theocracies can train Falconeers. Other governments will incur\ + high upkeep or see them retire.\ ") -[unit_fanatics] -name = _("Fanatics") +[unit_zealots] +name = _("Zealots") class = "Land" -tech_req = "Fundamentalism" -gov_req = "Fundamentalism" +tech_req = "Conscription" +gov_req = "Theocracy" obsolete_by = "None" -graphic = "u.fanatics" -graphic_alt = "-" +graphic = "u.zealots" +graphic_alt = "u.fanatics" sound_move = "m_fanatics" sound_move_alt = "m_generic" -sound_fight = "f_fanatics" -sound_fight_alt = "f_generic" +sound_fight = "f_zealots" +sound_fight_alt = "f_riflemen" build_cost = 20 pop_cost = 0 attack = 4 @@ -1170,31 +1455,33 @@ move_rate = 2 vision_radius_sq = 4 transport_cap = 0 fuel = 0 +city_size = 1080; 000000,0,100,001110,0,0 = atk_bonus=0, max_kills=0, targets=4, move_cost=14 frags, sty_frtfy=0, reserved = 0 uk_happy = 2 -uk_shield = 2 +uk_shield = 1 uk_food = 0 uk_gold = 0 embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only disembarks = "LandRoad", "LandRail", "Helicopter" targets = "Balloon", "Helicopter", "LandRail" -flags = "Fanatic", "FootSoldier", "Capturer", "CantReachAir", "Unbribable", "Bombarder", - "Settlers", "CanHide", "MultiSlot", "Shield2Gold", "WillNever" -roles = "DefendGood", "DefendGoodStartUnit" +flags = "MultiSlot", "Shield2Gold", "Fanatic", "FootSoldier", "Capturer", + "CantReachAir", "Unbribable", "Bombarder", + "Settlers", "CanHide", "WillNever" +roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild" helptext = _("\ -Fanatics are warriors devoted to a higher cause. Their faith\ - is strong and they cannot be bribed.\ +Zealots are warriors devoted to a higher cause. Their faith\ + is strong and they cannot be bribed. \ "), _("\ -Fundamentalist nations can maintain Fanatics without paying\ - their steep upkeep. (Fanatics are unhappy if not under Fundamentalism,\ - requiring high upkeep to stay content.) Fanatics\ +Theocratic nations can maintain Zealots without paying\ + their steep upkeep. (Zealots are unhappy if not under Theocracy,\ + requiring high upkeep to stay content.) Zealots\ produced in a city with Ecclesiastical Palace are inspired by\ - fervorous faith to +1 higher veteran level.\ + fervorous faith to +1 higher veteran level. \ "), _("\ -Fanatics zealously defend their homeland, and can do surprise skirmish\ - assaults to snipe and injure foreign occupants: Each invader\ - on the tile will endure three combat rounds without defense.\ -"), _("\ -\nThe discovery of Labor Union changes upkeep from shields to gold.\ +Zealots fervently defend their homeland, and can do surprise skirmish\ + assaults to snipe and injure foreign occupants:Up to 4 invaders\ + on the tile will endure three combat rounds without defense. Skirmish\ + assaults can also be done to foreign occupied cities if they have\ + a remaining Foreign National population.\ ") bombard_rate = 3 @@ -1207,9 +1494,9 @@ graphic = "u.partisan" graphic_alt = "-" sound_move = "m_partisan" sound_move_alt = "m_generic" -sound_fight = "f_partisan" +sound_fight = "f_riflemen" sound_fight_alt = "f_generic" -build_cost = 50 +build_cost = 45 pop_cost = 0 attack = 4 defense = 4 @@ -1226,44 +1513,48 @@ uk_gold = 0 embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only disembarks = "LandRoad", "LandRail", "Helicopter" targets = "Balloon", "Helicopter", "LandRail" -flags = "MultiSlot", "IgTer", "IgZOC", "NoHome", "FootSoldier", "Capturer", "CantReachAir", - "Shield2Gold", "Settlers", "CanHide", "WillNever" -;yes Partisan has 0 upkeep so Shield2Gold is meaningless, but currently used to substitute MultiSlot inaccessible in c-server +flags = "MultiSlot", "Shield2Gold", "IgTer", "IgZOC", "NoHome", "FootSoldier", "Capturer", "CantReachAir", + "Settlers", "CanHide", "WillNever" roles = "DefendGood", "DefendGoodStartUnit", "Partisan", "BarbarianTech" helptext = _("\ -Partisans are guerilla fighters who can use the terrain to their advantage. Like the Explorer\ - that they upgrade, they can slip through ZOC and live off the land with no upkeep.\ +Partisans are guerilla fighters who can use the terrain to their advantage. Like the Explorer\ + that they upgrade, they can slip through ZOC and live off the land with no upkeep. \ "), _("\ Proportional to city size, up to 8 Partisans appear when an enemy conquers your city. They\ randomly fortify on any tile inside the circle defined by its workable radius. Partisans\ prefer defensive tiles, and ignore tile nationality. They spawn only when:\n\ - ➣ Guerilla Warfare is known by any player.\n\ - ➣ The city was originally built by you.\n\ - ➣ You know Communism and Gunpowder.\n\ - ➣ You must be Democracy or Communist.\ + ➣ Guerilla Warfare is known by any player. \n\ + ➣ The city was originally built by you. \n\ + ➣ You must be Theocracy, OR,\n\ + ➣ You must be Democracy or Communist, AND know Communism AND Gunpowder.\ ") -[unit_alpine_troops] -name = _("Alpine Troops") +[unit_riflemen] +name = _("Riflemen") class = "Land" -tech_req = "Tactics" +tech_req = "Conscription" obsolete_by = "None" -graphic = "u.alpine_troops" +graphic = "u.riflemen" graphic_alt = "-" -sound_move = "m_alpine_troops" +sound_move = "m_riflemen" sound_move_alt = "m_generic" -sound_fight = "f_alpine_troops" +sound_fight = "f_riflemen" sound_fight_alt = "f_generic" -build_cost = 50 +build_cost = 40 pop_cost = 0 attack = 5 -defense = 5 +defense = 4 hitpoints = 20 firepower = 1 move_rate = 2 vision_radius_sq = 4 +convert_to = "Workers" +convert_time = 2 transport_cap = 0 fuel = 0 +city_size = 2; ...xxxxx..., 1, 0 use bombard_stay_fortified on a non-bombard unit to specify can remain fortified when attacking. +paratroopers_mr_sub = 0 ;00,0000,000,0,0 iPill_rand_tgts=0, iPill_odds=-0 pentads, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 +;NOTE:iPillage changes in rules require client_rules_flag and get_what_can_unit_pillage_from() changes. uk_happy = 1 uk_shield = 1 uk_food = 0 @@ -1271,37 +1562,37 @@ uk_gold = 0 embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only disembarks = "LandRoad", "LandRail", "Helicopter" targets = "Balloon", "Helicopter", "LandRail" -flags = "MultiSlot", "IgTer", "FootSoldier", "Capturer", "CantReachAir", "Shield2Gold", "Settlers", "CanHide", "WillNever" -roles = "DefendGood", "DefendGoodStartUnit" +flags = "MultiSlot", "Shield2Gold", "FootSoldier", "Capturer", "CantReachAir", "Settlers", "CanHide", "WillNever" +roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild" helptext = _("\ -Alpine Troops are highly mobile units and\ - excellent defenders. Similar to an Explorer, they\ - treat every land tile like a road were on it.\ +Riflemen are World War-era infantry. They are good at defending cities and\ + strategic Fortresses. They also have good attack capability. \ +"), _("\ +Under Communism this unit costs 5 less. Also, Communism tech allows Communist\ + governments to de-commission Riflemen into Workers via the Convert order. And vice versa. \ "), _("\ -\nThe discovery of Labor Union changes upkeep from shields to gold.\ +\nThe discovery of Banking changes upkeep from shields to gold.\ ") -[unit_riflemen] -name = _("Riflemen") +[unit_alpine_troops] +name = _("Alpine Troops") class = "Land" -tech_req = "Conscription" +tech_req = "Tactics" obsolete_by = "None" -graphic = "u.riflemen" +graphic = "u.alpine_troops" graphic_alt = "-" -sound_move = "m_riflemen" +sound_move = "m_alpine_troops" sound_move_alt = "m_generic" -sound_fight = "f_riflemen" +sound_fight = "f_alpine_troops" sound_fight_alt = "f_generic" -build_cost = 40 +build_cost = 50 pop_cost = 0 attack = 5 -defense = 4 +defense = 5 hitpoints = 20 firepower = 1 move_rate = 2 vision_radius_sq = 4 -convert_to = "Workers" -convert_time = 2 transport_cap = 0 fuel = 0 uk_happy = 1 @@ -1311,16 +1602,15 @@ uk_gold = 0 embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only disembarks = "LandRoad", "LandRail", "Helicopter" targets = "Balloon", "Helicopter", "LandRail" -flags = "MultiSlot", "FootSoldier", "Capturer", "CantReachAir", "Shield2Gold", "Settlers", "CanHide", "WillNever" -roles = "DefendGood", "DefendGoodStartUnit", "FirstBuild" +flags = "MultiSlot", "Shield2Gold", "IgTer", "FootSoldier", "Capturer", + "CantReachAir", "Settlers", "CanHide", "WillNever" +roles = "DefendGood", "DefendGoodStartUnit" helptext = _("\ -Riflemen are World War-era infantry. They are good at defending cities and\ - strategic Fortresses. They also have good attack capability.\ -"), _("\ -Under Communism this unit costs 5 less. Also, Communism tech allows Communist\ - governments to de-commission Riflemen into Workers via the Convert order. And vice versa.\ +Alpine Troops are highly mobile units and\ + excellent defenders. Similar to an Explorer, they\ + treat every land tile like a road were on it. \ "), _("\ -\nThe discovery of Labor Union changes upkeep from shields to gold.\ +\nThe discovery of Banking changes upkeep from shields to gold.\ ") [unit_marines] @@ -1334,7 +1624,7 @@ sound_move = "m_marines" sound_move_alt = "m_generic" sound_fight = "f_marines" sound_fight_alt = "f_generic" -build_cost = 60 +build_cost = 55 pop_cost = 0 attack = 8 defense = 5 @@ -1344,15 +1634,19 @@ move_rate = 2 vision_radius_sq = 8 ; hard-coded the +4 extra for effect_physics_vision since it is a pre-req anyway transport_cap = 0 fuel = 0 +city_size = 2618 ; 000000,001,010,001110,1,0 = atk_bonus=0, max_kills=1, targets=2, move_cost=14 frags, stay_frtfy=1, reserved = 0 +paratroopers_mr_sub = 1 ;00,0000,000,0,1 iPill_rand_tgts=0, iPill_odds=-0 pentads, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=1 +;NOTE:iPillage changes in rules require client_rules_flag and get_what_can_unit_pillage_from() changes. uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 embarks = "Helicopter", "Land", "Sea", "LandRoad", "LandRail" disembarks = "Helicopter", "Land", "Sea", "LandRoad", "LandRail" -targets = "Sea", "Balloon", "Helicopter", "LandRail" -flags = "MultiSlot", "Marines", "FootSoldier", "BeachLander", "Capturer", - "NeverBlocked", "Shield2Gold", "Settlers", "CanHide", "WillNever" +targets = "Sea", "Balloon", "Helicopter", "LandRail", "Zeppelin" +flags = "MultiSlot", "Shield2Gold", "Marines", "FootSoldier", "BeachLander", "Capturer", + "NeverBlocked", "Settlers", "CanHide", "WillNever", + "Airbase", "CanFortress", "Bombarder"; can Fort only, actually. veteran_names = _("?vet_rank:green"), _("?vet_rank:veteran"), @@ -1364,21 +1658,27 @@ veteran_names = veteran_base_raise_chance = 60, 50, 40, 30, 20, 15, 0 veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 veteran_power_fact = 100, 150, 175, 250, 300, 350, 400 -veteran_move_bonus = 0, 0, 0, 1, 1, 1, 1 +veteran_move_bonus = 0, 2, 4, 6, 8, 10, 12 roles = "DefendOk", "DefendOkStartUnit", "BarbarianSeaTech" helptext = _("\ Marines are experts at all-terrain warfare. They are the strongest\ - foot unit in the game, and are armed with diverse weaponry.\n\ + foot unit in the game, and are armed with diverse weaponry. \n\ Unlike other units, Marines can attack Sea units (at a 50% penalty).\ Air units do not stop them from attacking reachable targets.\ + They can attack while fortified and maintain fortified status.\ They can attack from a Transport or Helicopter, and can offload\ - without losing a turn of movement. Marines promoted to three\ - veteran levels become commandos suitable for special ops.\n\ + without losing a turn of movement. Marines can also makes Forts\ + and Airbases. Marines get an extra 2/9 movement points for each\ + veteran level they possess. Starting at v2, they gain the ability\ + to do Bazooka ranged attacks for 3 combat rounds, hitting up to 2\ + units on the tile and killing a maximum of 1. Bazooka attacks can\ + be done to Oceanic tiles if the Marines are not transported. \n\ Marines built in a city with an Airport, Port Facility, and Barracks III\ - receive the second veteran level (hardened.)\ + receive an extra veteran level. \ "), _("\ -\nThe discovery of Labor Union changes upkeep from shields to gold.\ +\nThe discovery of Banking changes upkeep from shields to gold.\ ") +bombard_rate = 3 [unit_paratroopers] name = _("Paratroopers") @@ -1391,10 +1691,10 @@ sound_move = "m_paratroopers" sound_move_alt = "m_generic" sound_fight = "f_paratroopers" sound_fight_alt = "f_generic" -build_cost = 60 +build_cost = 55 pop_cost = 0 -attack = 6 -defense = 4 +attack = 7 +defense = 5 hitpoints = 20 firepower = 1 move_rate = 2 @@ -1407,20 +1707,20 @@ uk_food = 0 uk_gold = 0 embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only disembarks = "LandRoad", "LandRail", "Helicopter" -targets = "Balloon", "Helicopter", "LandRail" +targets = "Balloon", "Helicopter", "LandRail", "Zeppelin" flags = "Paratroopers", "FootSoldier", "Capturer", "CantReachAir", "Provoking", - "Shield2Gold", "MultiSlot", "Settlers", "CanHide", "WillNever" + "MultiSlot", "Shield2Gold", "Settlers", "CanHide", "WillNever" roles = "DefendOk", "DefendOkStartUnit" helptext = _("\ Paratroopers are experts at airborne attacks.\ - From a friendly city or airbase, Paratroopers who have not used any\ - move points can paradrop directly to any tile in range, and be\ - immediately ready to act there. Beware dropping into unseen territory,\ + From a friendly city or airbase, Paratroopers who have moves left and\ + have not already paradropped in the current turn, can paradrop directly\ + to any tile in range, and be immediately ready to act there. Beware dropping into unseen territory,\ as Paratroopers landing on a tile occupied by enemy units will be lost.\ - Also note: Paradropping is assumed to be done from aircraft. Therefore,\ - Fighters on Vigil may auto-attack the tile you land on, if adjacent.\ + Also note:Paradropping is assumed to be done from aircraft. Therefore,\ + Fighters on Vigil may auto-attack the tile you land on, if adjacent. \ "), _("\ -\nThe discovery of Labor Union changes upkeep from shields to gold.\ +\nThe discovery of Banking changes upkeep from shields to gold.\ ") paratroopers_range = 14 paratroopers_mr_req = 1 @@ -1449,17 +1749,17 @@ vision_radius_sq = 4 transport_cap = 0 fuel = 0 uk_happy = 1 -uk_shield = 0 +uk_shield = 1 uk_food = 0 -uk_gold = 1 +uk_gold = 0 embarks = "Helicopter" ; transport helicopter only ;disembarks = "Helicopter" -targets = "Balloon", "Helicopter", "LandRail" -flags = "CantReachAir", "Shield2Gold", "MultiSlot", "WillNever" +targets = "Balloon", "Helicopter", "LandRail", "Zeppelin" +flags = "CantReachAir", "MultiSlot", "Shield2Gold", "WillNever" roles = "DefendGood", "DefendGoodStartUnit" helptext = _("\ Mechanized Infantry have the strongest general defense strength of any land unit.\ - They have decent attack strength in open field engagements, and excellent mobility.\ + They have decent attack strength in open field engagements, and excellent mobility. \ "), _("\ \nUpkeep for Mechanized infantry is paid in gold instead of shields.\ ") @@ -1475,7 +1775,7 @@ sound_move = "m_horsemen" sound_move_alt = "m_generic" sound_fight = "f_horsemen" sound_fight_alt = "f_generic" -build_cost = 20 +build_cost = 18 pop_cost = 0 attack = 2 defense = 1 @@ -1507,7 +1807,7 @@ sound_move = "m_chariot" sound_move_alt = "m_generic" sound_fight = "f_chariot" sound_fight_alt = "f_generic" -build_cost = 30 +build_cost = 27 pop_cost = 0 attack = 3 defense = 1 @@ -1538,7 +1838,7 @@ sound_move = "m_elephants" sound_move_alt = "m_generic" sound_fight = "f_elephants" sound_fight_alt = "f_generic" -build_cost = 40 +build_cost = 36 pop_cost = 0 attack = 4 defense = 1 @@ -1571,7 +1871,7 @@ sound_move = "m_crusaders" sound_move_alt = "m_generic" sound_fight = "f_crusaders" sound_fight_alt = "f_generic" -build_cost = 40 +build_cost = 38 pop_cost = 0 attack = 5 defense = 1 @@ -1604,7 +1904,7 @@ sound_move = "m_knights" sound_move_alt = "m_generic" sound_fight = "f_knights" sound_fight_alt = "f_generic" -build_cost = 40 +build_cost = 38 pop_cost = 0 attack = 4 defense = 1 @@ -1629,7 +1929,8 @@ roles = "AttackFastStartUnit", "BarbarianTech", helptext = _("\ Knights are heavily armored mounted warriors. They defend at D:3 against mounted units.\ They defend at D:2 against foot units. They defend at D:1 against everything else.\ - Their noble status allows them to attack cities without population reduction.\ + Their noble status allows them to attack cities without population reduction, and\ + conquer a size 1 city without destroying it.\ ") [unit_dragoons] @@ -1714,7 +2015,7 @@ graphic_alt = "-" sound_move = "m_armor" sound_move_alt = "m_generic" sound_fight = "f_armor" -sound_fight_alt = "f_generic" +sound_fight_alt = "Blitz Sack" build_cost = 80 pop_cost = 0 attack = 10 @@ -1725,19 +2026,21 @@ move_rate = 6 vision_radius_sq = 4 transport_cap = 0 fuel = 0 +paratroopers_mr_sub = 170 ;00,0101,010,1,0 iPill_rand_tgts=0, iPill_odds=-5 pentads=75%, iPill_moves=2, iPillage=1, ATK_Stay_Fortified=0 +;NOTE:iPillage changes in rules require client_rules_flag and get_what_can_unit_pillage_from() changes. uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 embarks = "Helicopter" ; transport helicopter only ;disembarks = "Helicopter" -targets = "Balloon", "Helicopter", "LandRail" +targets = "Balloon", "Helicopter", "LandRail", "Zeppelin" flags = "CantReachAir", "FortBuster", "WillNever" roles = "AttackFastStartUnit", "Hunter" helptext = _("\ Armor is the mechanized equivalent of a Cavalry unit. They have high attack strength,\ superb mobility, and the highest defense of any offensive unit. They are massive all-terrain\ - vehicles, well-suited for penetrating defensive fortifications: Units inside Forts get no defense\ + vehicles, well-suited for penetrating defensive fortifications:Units inside Forts get no defense\ bonus against Armor. Units inside Fortresses get a reduced bonus of 1.67× instead of 2×.\ ") @@ -1747,12 +2050,12 @@ class = "Land" tech_req = "Plastics" obsolete_by = "None" graphic = "u.armor_ii" -graphic_alt = "u.armor" +graphic_alt = "-" sound_move = "m_armor_ii" sound_move_alt = "m_armor" sound_fight = "f_armor_ii" -sound_fight_alt = "f_armor" -build_cost = 80 +sound_fight_alt = "Blitz Sack" +build_cost = 85 pop_cost = 0 attack = 16 defense = 6 @@ -1762,13 +2065,15 @@ move_rate = 6 vision_radius_sq = 4 transport_cap = 0 fuel = 0 +paratroopers_mr_sub = 170 ;00,0101,010,1,0 iPill_rand_tgts=0, iPill_odds=-5 pentads=80%, iPill_moves=2, iPillage=1, ATK_Stay_Fortified=0 +;NOTE:iPillage changes in rules require client_rules_flag and get_what_can_unit_pillage_from() changes. uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 embarks = "Helicopter" ; transport helicopter only ;disembarks = "Helicopter" -targets = "Balloon", "Helicopter", "LandRail" +targets = "Balloon", "Helicopter", "LandRail", "Zeppelin" bonuses = { "flag", "type", "value" "Missile", "DefenseMultiplier", 1 @@ -1794,7 +2099,7 @@ sound_move = "m_catapult" sound_move_alt = "m_generic" sound_fight = "f_catapult" sound_fight_alt = "f_generic" -build_cost = 40 +build_cost = 34 pop_cost = 0 attack = 6 defense = 1 @@ -1804,6 +2109,8 @@ move_rate = 2 vision_radius_sq = 4 transport_cap = 0 fuel = 0 +city_size = 2304 ; 000000,001,001,000000,00 = atk_bonus=0, max_kills=1, targets=1, move_cost=0 frags, stay_fortfy=0, reserved = 0 +paratroopers_mr_sub = 8192 ; 00100,00,0000,000,0,0 - bbd_retal_rate=4, iPill_rand_tgts=0, iPill_odds=0, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 uk_happy = 1 uk_shield = 1 uk_food = 0 @@ -1811,10 +2118,64 @@ uk_gold = 0 flags = "CantReachAir", "WillNever" roles = "" helptext = _("\ -Catapults are war machines that hurl massive rocks to crush\ - and break their targets. They are strong attackers but equally\ - weak defenders, and will need an escort to be effective.\ +Catapults are large rock-throwing war machines.\ + The ballistic delivery of massive\ + stones diminishes the defense bonus vs. land attacks by Fortifications and\ + City Walls by -25%, yielding a 1.25× and 2.75× bonus, respectively. \n\ +"), _(" +Catapults are weak defenders, and will need an escort to be effective.\ + Even so, it is better to rush attack them than do special unit attacks\ + from range: when attacked from range or rammed in a Fortress, Catapults\ + can retaliate for 4 rounds of combat.\ +") + +[unit_siege_ram] +name = _("Siege Ram") +class = "LandRoad" +tech_req = "Construction" +obsolete_by = "Cannon" +graphic = "u.siege_ram" +graphic_alt = "-" +sound_move = "m_catapult" +sound_move_alt = "m_generic" +sound_fight = "f_catapult" +sound_fight_alt = "f_generic" +build_cost = 45 +pop_cost = 0 +attack = 2 +defense = 1 +hitpoints = 10 +firepower = 1 +move_rate = 2 +vision_radius_sq = 4 +transport_cap = 1 +fuel = 0 +city_size = 507960 ; 011111,000,000,001110,00 = atk_bonus=8.75x, max_kills=0, targets=all, move_cost=14 frags, stay_fortfy=0, reserved = 0 +uk_happy = 1 +uk_shield = 1 +uk_food = 0 +uk_gold = 0 +cargo = "Land" +flags = "CantReachAir", "WillNever", "Diplomat", "Spy", "Bombarder" +roles = "" +helptext = _("\ +Siege Rams launch a tremendous thrusting force through\ + iron-capped timber shafts. They can break through City\ + Walls if they are not killed first. City Walls have counter\ + defenses, giving Siege Rams even odds of success. Wall\ + defense in capitals is twice as stiff—cutting odds to 25%. \n\ +Siege Rams may also ram Fortresses, doing up to 4hp of damage\ + on each occupant. This emulates damage to the Fortress defense\ + bonus, which is partly or fully repaired/recovered next turn. \n\ +Siege Rams can only travel by road. They can carry 1 Land\ + unit as cargo:their slow pace means this serves more for\ + disguise or defense. \n\ +Siege Rams need an escort for protection. They need a minimum of\ + 1 move point to attack a Fortress or City Walls.\ + Cities protected by the Great Wall are immune to Siege Rams. \n\ + The discovery of Metallurgy by any nation incapacitates Siege Rams.\ ") +bombard_rate = 4 [unit_cannon] name = _("Cannon") @@ -1837,6 +2198,8 @@ move_rate = 2 vision_radius_sq = 4 transport_cap = 0 fuel = 0 +city_size = 2560 ; 000000,001,010,000000,00 = atk_bonus=0, max_kills=1, targets=2, move_cost=0 frags, stay_fortfy=0, reserved = 0 +paratroopers_mr_sub = 10240 ; 00101,00,0000,000,0,0 - bbd_retal_rate=5, iPill_rand_tgts=0, iPill_odds=0, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 uk_happy = 1 uk_shield = 1 uk_food = 0 @@ -1847,8 +2210,16 @@ targets = "LandRail" flags = "CantReachAir", "WillNever" roles = "BarbarianTech", "BarbarianBuildTech" helptext = _("\ -Cannons are huge guns that fire heavy metallic projectiles. They are strong\ - attackers but weak defenders, so they need an escort to be effective.\ +Cannons are huge guns that use gunpowder to fire massive metallic projectiles\ + much faster and more accurately than earlier ballistic weapons. The\ + aerial delivery of high speed massive metal gives an edge against\ + Fortifications and City Walls. The defense bonuses vs. land attacks from those\ + are reduced by -50%. This leaves Fortifications only with their terrain bonus,\ + and reduces City walls to 2.5x. \n\ +"), _(" +While Cannons are strong attackers, they are also weak defenders. Yet\ + they are not without defensive purpose. They can retaliate 5 rounds\ + of bombardment against special unit attacks from other units.\ ") [unit_artillery] @@ -1872,18 +2243,27 @@ move_rate = 2 vision_radius_sq = 4 transport_cap = 0 fuel = 0 +city_size = 2816 ; 000000,001,011,000000,00 = atk_bonus=0, max_kills=1, targets=3, move_cost=0 frags, stay_fortfy=0, reserved = 0 +paratroopers_mr_sub = 12288 ; 00110,00,0000,000,0,0 - bbd_retal_rate=6, iPill_rand_tgts=0, iPill_odds=0, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 embarks = "Helicopter" ; transport helicopter only disembarks = "Helicopter" -targets = "Balloon", "LandRail" +targets = "Balloon", "LandRail", "Zeppelin" flags = "CantReachAir", "WillNever" roles = "" helptext = _("\ -Artillery are a major upgrade to Cannons, with doubled firepower. They are\ - superb attackers but poor at defense. They need an escort to be effective.\ +Artillery are a major upgrade to Cannons, with doubled firepower. Accuracy\ + and projectile speed go to a whole new level. Thus, they have an\ + even greater bonus than their predecessors against Fortifications\ + and City Walls. Such bonuses are reduced -75%. This leaves Fortifications\ + only with their terrain bonus, and reduces the bonus from Walls down to 2.25x. \n\ +"), _(" +Like their predecessors, Artillery are poor at defense, and need an\ + escort to be effective. However, they can retaliate 6 rounds of bombardment\ + against special unit attacks from other units.\ ") [unit_anti_aircraft] @@ -1892,7 +2272,7 @@ class = "LandAirSea" tech_req = "Flight" obsolete_by = "None" graphic = "u.anti_aircraft" -graphic_alt = "u.howitzer" +graphic_alt = "-" sound_move = "m_anti_aircraft" sound_move_alt = "m_generic" sound_fight = "f_anti_aircraft" @@ -1915,7 +2295,7 @@ uk_food = 0 uk_gold = 0 embarks = "LandRoad", "Helicopter" disembarks = "LandRoad", "Helicopter" -targets = "Air", "AirProtect", "Sea", "Balloon", "Helicopter", "LandRail" +targets = "Air", "AirProtect", "Sea", "Balloon", "Helicopter", "LandRail", "Zeppelin" bonuses = { "flag", "type", "value" "AirAttacker", "DefenseDivider", 1 @@ -1926,13 +2306,13 @@ roles = "" helptext = _("\ Anti-Aircraft Artillery (AAA) can attack almost anything from anywhere. AAA get a\ 2× bonus against Air units. AAA qualify as weaponry for Marines and have the same\ - abilities: they can be transported on any unit that carries Marines, can attack from\ + abilities:they can be transported on any unit that carries Marines, can attack from\ or to non-native tiles, and do not lose a turn when unloading. Transported AAA can\ - defend their tile on both Land and Sea. (AAA cannot attack Submarines, Missiles,\ + defend their tile on both Land and Sea. (AAA can’t attack Submarines, Missiles,\ or Jet Bombers.)\ "), _(" After Space Flight and 10 turns of service, AAA can be retrofitted to\ - Mobile SAM. The Convert order must be done in your capital, and takes 4 turns.\ + Mobile SAM. The Convert order must be done in a capital, and takes 4 turns.\ ") [unit_mobile_sam] @@ -1941,7 +2321,7 @@ class = "Land" tech_req = "Space Flight" obsolete_by = "None" graphic = "u.mobile_sam" -graphic_alt = "u.howitzer" +graphic_alt = "-" sound_move = "m_howitzer" sound_move_alt = "m_generic" sound_fight = "f_mobile_sam" @@ -1962,7 +2342,7 @@ uk_food = 0 uk_gold = 0 embarks = "Helicopter" ; transport helicopter only disembarks = "Helicopter" -targets = "Air", "AirProtect", "AirPillage", "Balloon", "Helicopter", "LandRail" +targets = "Air", "AirProtect", "Air_High_Altitude", "Balloon", "Helicopter", "LandRail", "Zeppelin" cargo = "Missile" bonuses = { "flag", "type", "value" @@ -1975,7 +2355,7 @@ helptext = _("\ The Mobile SAM is the strongest Anti-Air unit on the ground. It can\ attack nearby aircraft. It has a 2× bonus against all Air units. The\ Mobile SAM can also carry one Missile of any type. Unlike the AAA, it\ - cannot attack non-native tiles or attack while transported.\ + can’t attack non-native tiles or attack while transported.\ "), _(" AAA can upgrade to Mobile SAM for free on its 10th turn of service.\ The Convert order must be done in the capital city and takes 4 turns.\ @@ -1987,7 +2367,7 @@ class = "Land" tech_req = "Robotics" obsolete_by = "None" graphic = "u.howitzer_o" -graphic_alt = "u.howitzer" +graphic_alt = "-" sound_move = "m_howitzer" sound_move_alt = "m_generic" sound_fight = "f_howitzer" @@ -2002,26 +2382,33 @@ move_rate = 4 vision_radius_sq = 4 transport_cap = 0 fuel = 0 +city_size = 3072 ; 000000,001,100,000000,00 = atk_bonus=0, max_kills=1, targets=4, move_cost=0 frags, stay_fortfy=0, reserved = 0 +paratroopers_mr_sub = 14336 ; 00111,00,0000,000,0,0 - bbd_retal_rate=7, iPill_rand_tgts=0, iPill_odds=0, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 embarks = "Helicopter" ; transport helicopter only disembarks = "Helicopter" -targets = "Balloon", "LandRail" +targets = "Balloon", "LandRail", "Zeppelin" flags = "CantReachAir", "WillNever" roles = "" helptext = _("\ -Howitzers are upgraded Artillery with significant increase in mobility and attack strength. They can fire over city walls, ignoring their effect.\ +Howitzers are upgraded Artillery with a terrifying increase to mobility and attack strength.\ + Fortifications get no bonus except their terrain bonus, and City Walls\ + are completely ineffective against Howitzers. \n\ +"), _(" +While Howitzers are vulnerable when not escorted, they can retaliate 7 rounds of bombardment\ + against special unit attacks from other units. This is a strong deterrent.\ ") [unit_balloon] name = _("Balloon") class = "Balloon" tech_req = "Chemistry" -obsolete_by = "None" +obsolete_by = "Zeppelin" graphic = "u.balloon" -graphic_alt = "u.trireme" +graphic_alt = "-" sound_move = "m_balloon" sound_move_alt = "m_trireme" sound_fight = "f_warrior" @@ -2040,7 +2427,7 @@ uk_happy = 0 uk_shield = 0 uk_food = 0 uk_gold = 0 -flags = "Unbribable", "HasNoZOC", "NeverProtects", "NonMil", "NoVeteran" +flags = "Unbribable", "HasNoZOC", "NeverProtects", "NonMil", "NoVeteran", "SentryAlways" ; No veteran levels (level name is never displayed) veteran_names = _("green") veteran_base_raise_chance = 0 @@ -2051,13 +2438,73 @@ roles = "" helptext = _("\ Balloons gather intel on potential battle areas. They have great vision and\ are unreachable by units prior to Riflemen and Ironclads. They can stay in\ - the air for one Turn Change before landing in a City, Fortress, Naval Base,\ - Airbase, or transport unit with cargo capacity of 4+. Balloons do not block units under\ - them from being attacked, and cannot fly over mountains.\ + the air for one Turn Change before landing in a City, Base, Quay, or transport\ + unit with cargo capacity of 4+. Balloons give sentry reports of nearby unit\ + movements even when not on sentry. Balloons do not block units under them\ + from being attacked, and can’t fly over mountains.\ +"), _(" +NOTE:GOTO disallows unit loss from lack of fuel. You\ + can override this by ordering moves to adjacent tiles.\ +") + +[unit_zeppelin] +name = _("Zeppelin") +class = "Zeppelin" +tech_req = "Combustion" +obsolete_by = "None" +graphic = "u.zeppelin" +graphic_alt = "-" +sound_move = "m_balloon" +sound_move_alt = "m_trireme" +sound_fight = "f_musketeers" +sound_fight_alt = "f_riflemen" +build_cost = 45 +pop_cost = 0 +attack = 2 +defense = 1 +hitpoints = 20 +firepower = 2 +move_rate = 6 +vision_radius_sq = 24 +transport_cap = 0 +fuel = 3 +city_size = 2632 ;000000,001,010,010010,0,0 = atk_bonus=0, max_kills=1, targets=2, move_cost=18 frags, stay_frtfy=0, reserved = 0 +paratroopers_mr_sub = 0 ;00000,00,0000,000,0,0 = bbd_retal_rate=0, iPill_rand_tgts=0, iPill_odds=-0 pentads, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +flags = "Unbribable", "AirAttacker", "HasNoZOC", "NeverProtects", "Bombarder", + "Provoking", "SentryAlways" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:ace"), + _("?vet_rank:top gun") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 +roles = "" +helptext = _("\ +As new technology inspires the upgrade of Balloons, the Zeppelin appears.\ + In theory, it can be used for tactical advantage in combat. However,\ + vulnerability and cost make it better for intel. It can do limited attack\ + with bombs, or 20 combat rounds with medium caliber ordnance. It can stay out\ + for two Turn Changes before landing in a City, Quay, Fortress, Naval Base,\ + Airbase, or transport with 6+ capacity. \n\ +Zeppelins have great vision and are unreachable by units prior to Marines and\ + Destroyers. Zeppelins do not block units under them from being attacked. Zeppelins\ + give sentry reports of nearby unit movements even when not on sentry. Unlike\ + Balloons, they can fly over Mountains.\ "), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ +NOTE:GOTO disallows unit loss from lack of fuel. You\ can override this by ordering moves to adjacent tiles.\ ") +bombard_rate = 4 [unit_airplane] name = _("Airplane") @@ -2065,7 +2512,7 @@ class = "Air" tech_req = "Flight" obsolete_by = "None" graphic = "u.airplane" -graphic_alt = "u.awacs" +graphic_alt = "-" sound_move = "pm_prop_fighters" sound_move_alt = "m_generic" sound_fight = "f_fighter" @@ -2084,7 +2531,7 @@ uk_happy = 0 uk_shield = 1 uk_food = 0 uk_gold = 0 -flags = "HasNoZOC", "NoVeteran", "Unbribable", "Expellable", "NeverProtects", "CanEscape", "Provoking" +flags = "HasNoZOC", "NoVeteran", "Unbribable", "Expellable", "NeverProtects", "CanEscape", "Provoking", "NonMil" ; No veteran levels (level name is never displayed) veteran_names = _("green") veteran_base_raise_chance = 0 @@ -2092,13 +2539,14 @@ veteran_work_raise_chance = 0 veteran_power_fact = 100 veteran_move_bonus = 0 roles = "" -cargo = "Land" +cargo = "Land", "Cargo" helptext = _("\ -Airplanes can carry a single diplomatic unit. They can land in any domestic or allied\ - city. For missions to non-allied nations, an empty Airbase must be available for landing.\ - Airplanes have two turns of fuel. Each new aviation tech upgrades range by +2 moves per turn.\ +Airplanes can carry a diplomatic unit or a Freight unit. They can land in any domestic\ + or allied city. For diplomatic missions to non-allied nations, an empty Airbase must be available for landing.\ + Airplanes have two turns of fuel. Each new aviation tech upgrades range by +2 moves per turn. \n\ "), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ +Airplanes can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker.\ + NOTE:GOTO disallows unit loss from lack of fuel. You\ can override this by ordering moves to adjacent tiles.\ ") @@ -2127,9 +2575,10 @@ uk_happy = 0 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Air", "AirProtect", "Missile", "Balloon", "Helicopter", "LandRail" +targets = "Air", "AirProtect", "Missile", "Balloon", "Helicopter", "LandRail", "Zeppelin" bonuses = { "flag", "type", "value" + "AirAttacker", "DefenseMultiplierPct", 17 ; defends at 3.5 (3*1.17=3.51) vs air attackers } flags = "AirAttacker", "Unbribable", "HasNoZOC", "CanEscape", "AirProtector", "Provoking" @@ -2151,10 +2600,11 @@ Fighters are the first offensive Air units. Their superior mobility and firepowe the very nature of warfare. They can move anywhere and attack any unit (except Submarines\ and Jet Bombers.)\n\ "), _(" -INTERCEPTOR: the Vigil order lets Fighters auto-attack adjacent Air units if they\ - have better attack odds. A Fighter can Vigil if it uses 2 move points or less.\n\ +INTERCEPTOR:the Vigil order lets Fighters auto-attack adjacent Air units if they\ + have better attack odds. A Fighter can Vigil if it uses 2 move points or less. \n\ "), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ +Fighters can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker.\ + NOTE:GOTO disallows unit loss from lack of fuel. You\ can override this by ordering moves to adjacent tiles.\ ") @@ -2164,7 +2614,7 @@ class = "AirProtect" tech_req = "Radio" obsolete_by = "Jet Fighter" graphic = "u.escort_fighter" -graphic_alt = "u.fighter" +graphic_alt = "-" sound_move = "m_escort_fighter" sound_move_alt = "m_generic" sound_fight = "f_fighter" @@ -2183,9 +2633,15 @@ uk_happy = 0 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Air", "AirProtect", "Missile", "Balloon", "Helicopter", "LandRail" +targets = "Air", "AirProtect", "Missile", "Balloon", "Helicopter", "LandRail", "Zeppelin" bonuses = { "flag", "type", "value" +; Crease Base Attack of 3.5. Use flags to include all unit_types with no overlap: + "CantReachAir", "DefenseDividerPct", 17 ; all military Land, Sea, Bombers, EXCEPT AAA, Mobile SAM, AEGIS + "AntiAir", "DefenseDividerPct", 17 ; AAA, Mobile SAM, AEGIS + "NonMil", "DefenseDividerPct", 17 ; all NonMil units + "AirAttacker", "DefenseDividerPct", 17 ; Aircraft (including Bombers) + "FieldUnit", "DefenseDividerPct", -17 ; Cancel overlapped doubled bonus on Bombers. } flags = "AirAttacker", "Unbribable", "HasNoZOC", "CanEscape", "AirProtector", "Provoking" veteran_names = @@ -2207,10 +2663,11 @@ Escort Fighters are large fighters with high fuel capacity. Higher mass and\ as well as standard Fighters, but can return home on the next turn. They are\ good for long-range missions, defensive air support, and escorting bombers.\ "), _(" -INTERCEPTOR: the Vigil order lets Escort Fighters auto-attack adjacent Air units if they\ - have better attack odds. This unit can Vigil if it uses 3 move points or less.\n\ +INTERCEPTOR:the Vigil order lets Escort Fighters auto-attack adjacent Air units if they\ + have better attack odds. This unit can Vigil if it uses 3 move points or less. \n\ "), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ +This aircraft can Stack-Escape:a 60% chance to escape a killed stack if it has more remaining moves than the attacker.\ + NOTE:GOTO disallows unit loss from lack of fuel. You\ can override this by ordering moves to adjacent tiles.\ ") @@ -2223,8 +2680,8 @@ graphic = "u.dive_bomber" graphic_alt = "-" sound_move = "m_dive_bomber" sound_move_alt = "m_escort_fighter" -sound_fight = "f_medium_bomber" -sound_fight_alt = "f_artillery" +sound_fight = "f_dive_bomber" +sound_fight_alt = "Dive Bomb" build_cost = 60 pop_cost = 0 attack = 3 @@ -2235,25 +2692,26 @@ move_rate = 18 vision_radius_sq = 12 transport_cap = 0 fuel = 1 +paratroopers_mr_sub = 346 ;00,1010,110,1,0 - iPill_rand_tgts=0, iPill_odds=-10 pentads=50%, iPill_moves=6, iPillage=1, attack_stay_fortified=0 +;NOTE:iPillage changes in rules require client_rules_flag and get_what_can_unit_pillage_from() changes. uk_happy = 0 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Air", "AirProtect", "Balloon", "Helicopter", "LandRail" +targets = "Air", "AirProtect", "Balloon", "Helicopter", "LandRail", "Zeppelin" bonuses = { "flag", "type", "value" ; A4.5 vs all Surface Units "CantReachAir", "DefenseDividerPct", 50 - "NonMil", "DefenseDividerPct", 50 ; NonMil don't have CantReachAir flag - "AntiAir", "DefenseDividerPct", 50 ; AntiAir don't hav CantReachAir flag + "NonMil", "DefenseDividerPct", 50 ; NonMil do not have CantReachAir flag + "AntiAir", "DefenseDividerPct", 50 ; AntiAir do not have CantReachAir flag ; Cancel CantReachAir bonus on Bombers "FieldUnit", "DefenseDividerPct", -50 ; D4 vs Anti-Air "AntiAir", "DefenseMultiplierPct", 33 } -flags = "AirAttacker", "Unbribable", "CanEscape", - "NeverProtects", "Provoking", "WillNever" +flags = "AirAttacker", "Unbribable", "CanEscape", "NeverProtects", "Provoking", "WillNever" veteran_names = _("?vet_rank:green"), _("?vet_rank:veteran"), @@ -2268,22 +2726,24 @@ veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "" helptext = _("\ -Dive Bombers are like Fighters but fitted for Ground Attack and Sea combat. Range\ - is reduced by heavy armor and armaments which help in attacking surface targets\ - and in defending against Anti-Air, but hurt in Air-to-Air combat. Though unreachable\ - to Land units, they lack agility to block attacks on their same tile. But over a wider\ - radius, they exert ZoC on adjacent land tiles. The Dive Bomber is not an interceptor.\ - Role specialization yields the following gains and losses over a Fighter:\n\n\ - GAINS:\n\ - • A:4½ vs Surface units (Land or Sea)\n\ - • D:4 vs Anti-Air\n\ - • ZoC\n\ -LOSSES:\n\ - • A3 instead of A4 in Air-to-Air\n\ - • Can't block its tile\n\ - • Can't intercept\ +Dive Bombers are fitted with armor and armaments for ground attack and sea combat.\ + They do better attacking surface targets and defending vs Anti-Air, but have reduced\ + range and Air-to-Air ability. They do not block attacks on their same tile, but exert\ + ZoC on adjacent land tiles and can iPillage. The Dive Bomber is not an interceptor.\ + Role specialization yields the following gains and losses over a Fighter: \n\n\ + GAINS: \n\ + • A:4½ vs Surface units (Land or Sea) \n\ + • D:4 vs Anti-Air \n\ + • iPillage \n\ + • ZoC \n\ +LOSSES: \n\ + • A3/D3 in Air-to-Air \n\ + • Can’t block its tile \n\ + • Can’t intercept \n\ "), _(" -Communists pay 10 less for this unit. GOTO prevents unit loss from lack of fuel.\ +Communists pay 10 less for this unit. Can Stack-Escape:a 60% chance to escape a\ + killed stack if it has more remaining moves than the attacker.\ + GOTO prevents unit loss from lack of fuel.\ Override this by ordering adjacent moves.\ ") @@ -2293,7 +2753,7 @@ class = "Air" tech_req = "Advanced Flight" obsolete_by = "Jet Bomber" graphic = "u.medium_bomber" -graphic_alt = "u.bomber" +graphic_alt = "-" sound_move = "m_medium_bomber" sound_move_alt = "m_generic" sound_fight = "f_medium_bomber" @@ -2312,7 +2772,7 @@ uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Balloon", "LandRail" +targets = "Balloon", "LandRail", "Zeppelin" bonuses = { "flag", "type", "value" } @@ -2333,13 +2793,14 @@ veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "" helptext = _("\ The Medium Bomber is well suited for moderately strong targets or multiple weak targets.\ - It may not attack other Air units. It is a Soft Field Unit and can't carry Bomb\ - units, causing less discontent than other types of Bombers.\n\ -➤ Unhappy effect for Soft Field units:\n\ -Republic:0 Democracy:1 (non-aggressive)\n\ -Republic:1 Democracy:2 (aggressive)\ + It may not attack other Air units. It is a Soft Field Unit and can’t carry Bomb\ + units, causing less discontent than other types of Bombers. \n\ +➤ Unhappy effect for Soft Field units: \n\ +Republic:0 Democracy:1 (non-aggressive) \n\ +Republic:1 Democracy:2 (aggressive) \n\ "), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ +This aircraft can Stack-Escape:a 60% chance to escape a killed stack if it has more remaining moves than the attacker.\ + NOTE:GOTO disallows unit loss from lack of fuel. You\ can override this by ordering moves to adjacent tiles.\ ") @@ -2349,7 +2810,7 @@ class = "Air" tech_req = "Radar" obsolete_by = "Jet Bomber" graphic = "u.heavy_bomber_o" -graphic_alt = "u.bomber" +graphic_alt = "-" sound_move = "m_bomber" sound_move_alt = "m_generic" sound_fight = "f_heavy_bomber" @@ -2368,7 +2829,7 @@ uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Balloon", "LandRail" +targets = "Balloon", "LandRail", "Zeppelin" cargo = "Bomb" bonuses = { "flag", "type", "value" @@ -2391,12 +2852,13 @@ roles = "" helptext = _("\ Heavy Bombers are large and sturdy Bombers with larger payload and numerous gunner defense stations.\ They are excellent for hitting strong well-defended ground targets.\ - They cannot attack Air units. They can carry one Bomb. Like most Bombers, the Heavy Bomber is a Field Unit.\ - Field Units cause the same unhappiness no matter if aggressively or peacefully deployed.\n\ -➤ Unhappy effect for Field units:\n\ -Republic:1 Democracy:2\ + They can’t attack Air units. They can carry one Bomb. Like most Bombers, the Heavy Bomber is a Field Unit.\ + Field Units cause the same unhappiness no matter if aggressively or peacefully deployed. \n\ +➤ Unhappy effect for Field units: \n\ +Republic:1 Democracy:2 \n\ "), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ +This aircraft can Stack-Escape:a 60% chance to escape a killed stack if it has more remaining moves than the attacker.\ + NOTE:GOTO disallows unit loss from lack of fuel. You\ can override this by ordering moves to adjacent tiles.\ ") @@ -2406,11 +2868,11 @@ class = "Air" tech_req = "Rocketry" obsolete_by = "Jet Bomber" graphic = "u.ultra_heavy_bomber_o" -graphic_alt = "u.bomber" +graphic_alt = "-" sound_move = "m_strategic_bomber" sound_move_alt = "m_bomber" sound_fight = "f_strategic_bomber" -sound_fight_alt = "f_bomber" +sound_fight_alt = "Bomb" build_cost = 135 pop_cost = 0 attack = 13 @@ -2421,11 +2883,13 @@ move_rate = 16 vision_radius_sq = 12 transport_cap = 2 fuel = 3 +paratroopers_mr_sub = 782 ;01,1000,011,1,0 - iPill_rand_tgts=1, iPill_odds=-8 pentads=60%, iPill_moves=3, iPillage=1, ATK_Stay_Fortified=0 +;NOTE:iPillage changes in rules require client_rules_flag and get_what_can_unit_pillage_from() changes. uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Balloon", "LandRail" +targets = "Balloon", "LandRail", "Zeppelin" cargo = "Bomb" bonuses = { "flag", "type", "value" @@ -2447,9 +2911,11 @@ veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "" helptext = _("\ The Strategic Bomber offers a small improvement in attack. Higher altitude offers a good upgrade in\ - defense. It has considerably longer range, with one more turn of fuel. May carry two Bombs.\ + defense. It has considerably longer range, with one more turn of fuel. Upgraded payload enables\ + instant-Pillage bombing. May carry two Bombs. \n\ "), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ +This aircraft can Stack-Escape:a 60% chance to escape a killed stack if it has more remaining moves than the attacker.\ + NOTE:GOTO disallows unit loss from lack of fuel. You\ can override this by ordering moves to adjacent tiles.\ ") @@ -2459,7 +2925,7 @@ class = "Air" tech_req = "Radar" obsolete_by = "Spy Plane" graphic = "u.awacs_o" -graphic_alt = "u.awacs" +graphic_alt = "-" sound_move = "m_awacs" sound_move_alt = "m_generic" sound_fight = "f_awacs" @@ -2488,19 +2954,20 @@ veteran_move_bonus = 0 roles = "" helptext = _("\ The AWACS has great fuel capacity for long range flights, and advanced radar that can determine\ - the location of enemy units over a wide area. The AWACS has 2 turns of fuel.\ + the location of enemy units over a wide area. The AWACS has 2 turns of fuel. \n\ "), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ +AWACS can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker.\ + NOTE:GOTO disallows unit loss from lack of fuel. You\ can override this by ordering moves to adjacent tiles.\ ") [unit_spy_plane] name = _("Spy Plane") -class = "Air" +class = "Air_High_Altitude" tech_req = "Stealth" obsolete_by = "None" graphic = "u.spy_plane_o" -graphic_alt = "u.awacs" +graphic_alt = "-" sound_move = "m_awacs" sound_move_alt = "m_generic" sound_fight = "f_awacs" @@ -2520,7 +2987,7 @@ uk_shield = 1 uk_food = 0 uk_gold = 0 vision_layer = "Stealth" -flags = "HasNoZOC", "NoVeteran", "Unbribable", "NeverProtects", "CanEscape", "Provoking" +flags = "HasNoZOC", "NoVeteran", "Unbribable", "NeverProtects", "CanEscape", "Provoking", "WillNever" ; No veteran levels (level name is never displayed) veteran_names = _("green") veteran_base_raise_chance = 0 @@ -2531,20 +2998,71 @@ roles = "" helptext = _("\ The Spy Plane is an ultrasonic high altitude aircraft with long range. It gathers\ intel over a wide area. Stealth technology makes it invisible, except to enemies on\ - adjacent tiles. Spy Planes have 2 turns of fuel.\ + adjacent tiles. Spy Planes have 2 turns of fuel. They are unreachable to primitive\ + propeller-based aircraft.\ "), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ +Spy Planes can Stack-Escape:a 67% chance to escape a killed stack if they have more remaining moves than the attacker.\ + NOTE:GOTO disallows unit loss from lack of fuel. You\ can override this by ordering moves to adjacent tiles.\ ") +[unit_satellite] +name = _("Satellite") +class = "Space" +tech_req = "Laser" +impr_req = "Apollo Program" +obsolete_by = "None" +graphic = "u.satellite" +graphic_alt = "-" +sound_move = "" +sound_move_alt = "m_generic" +sound_fight = "f_awacs" +sound_fight_alt = "f_generic" +build_cost = 140 +pop_cost = 0 +attack = 0 +defense = 1 +hitpoints = 20 +firepower = 1 +move_rate = 65 +vision_radius_sq = 80 +transport_cap = 0 +fuel = 0 +uk_happy = 0 +uk_shield = 1 +uk_food = 0 +uk_gold = 0 +vision_layer = "Stealth" +flags = "Unique", "HasNoZOC", "NonMil", "NoVeteran", "Unbribable", "NeverProtects", "CanEscape", "WillNever" +; No veteran levels (level name is never displayed) +veteran_names = _("green") +veteran_base_raise_chance = 0 +veteran_work_raise_chance = 0 +veteran_power_fact = 100 +veteran_move_bonus = 0 +roles = "" +helptext = _("\ +Satellites orbit the Earth above the atmosphere. They are unreachable to anything\ + but missiles. Their orbital velocity allows them to circumnavigate the planet\ + in a couple turns. Telescopic cameras allow them to Investigate City, even if the\ + city has a Police Station. Satellites can’t be seen by others unless adjacent.\ + Satellites require Laser tech and can only be built in the city with the Apollo Program.\ +"), _(" +Satellites can Stack-Escape:a 100% chance to escape a killed stack if they have more remaining move points than the attacker.\ +"), _(" +NOTE: Due to game mechanics, a Satellite blocks terrestrial movement\ + over a tile. This is solved by killing it with any Missile. To avoid\ + being killed, end your turn in a friendly stack of units, or far away from\ + developed or trafficked areas.\ +") [unit_transport_helicopter] -; /* TRANS: unit type */ +; /* TRANS:unit type */ name = _("Transport Helicopter") class = "Helicopter" tech_req = "Combined Arms" obsolete_by = "None" graphic = "u.t_helicopter" -graphic_alt = "u.helicopter" +graphic_alt = "-" sound_move = "m_helicopter" sound_move_alt = "m_generic" sound_fight = "f_helicopter" @@ -2571,8 +3089,8 @@ bonuses = } cargo = "Land", "LandAirSea", "LandNoKill" flags = "Helicopter", "AirAttacker", "Unbribable", "Provoking", - "CanEscape", "WillNever", "HasNoZOC" - ; Tranport Heli is provoking; Fighters don't like them. + "CanEscape", "WillNever", "HasNoZOC", "NeverProtects" + ; Tranport Heli is provoking; Fighters do not like them. veteran_names = _("?vet_rank:green"), _("?vet_rank:veteran"), @@ -2587,21 +3105,22 @@ veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "" helptext = _("\ -Transport Helicopters can carry three land units.\ +Transport Helicopters can carry three land units, which they can pick up from anywhere.\ "), _("\ - Foot and artillery types can unload on any tile, but will lose moves (except Marines).\ - Other types need a city or base to unload.\n\ + Foot and artillery types can unload by stepping off to any adjacent tile, but will\ + lose all moves (except Marine types). Other types need a City, Airbase, or Naval Base to unload. \n\ "), _("\ Helicopters lose 1 hp for each turn not ended in a City, Base, or Carrier. +1 move\ - is awarded if starting a turn in a City or Airbase.\n\ + is awarded if starting a turn in a City or Airbase. \n\ "), _("\ All Helicopters can be attacked by land from Riflemen onward; by sea from Ironclad\ onward; get +50% defence vs. foot units; and are unreachable to artillery types.\ Unlike attack Helicopters, Transport Helicopters are intercepted by Fighters on vigil.\ + Transport Helicopters can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker.\ ") [unit_helicopter] -; /* TRANS: unit type */ +; /* TRANS:unit type */ name = _("Helicopter") class = "Helicopter" tech_req = "Combined Arms" @@ -2622,11 +3141,13 @@ move_rate = 12 vision_radius_sq = 12 transport_cap = 1 fuel = 0 +city_size = 2816 ; 000000,001,011,000000,00 = atk_bonus=0, max_kills=1, targets=3, move_cost=0 frags, stay_fortfy=0, reserved = 0 +paratroopers_mr_sub = 6144 ; 00011,00,0000,000,0,0 - bbd_retal_rate=3, iPill_rand_tgts=0, iPill_odds=0, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Balloon", "Helicopter", "LandRail" +targets = "Balloon", "Helicopter", "LandRail", "Zeppelin" bonuses = { "flag", "type", "value" "FootSoldier", "DefenseMultiplierPct", 50 ; all Infantry (Foot and Mech.) @@ -2635,8 +3156,8 @@ bonuses = } cargo = "LandAirSea" flags = "Helicopter", "AirAttacker", "Unbribable", - "CanEscape", "WillNever" - ; Heli is low-altitude and non-provoking: if it's ever thought to be OP, + "CanEscape", "WillNever", "NeverProtects" + ; Heli is low-altitude and non-provoking:if it is ever thought to be OP, ; changing this flag fixes that right away. But currently it MIGHT be UnP ; because hp_loss, range, city walls, and Ground Strike Fighter veteran_names = @@ -2655,17 +3176,18 @@ roles = "" helptext = _("\ Helicopters are the Air Cavalry of modern armies. They can attack multiple targets\ and conquer cities. Unaffected by terrain, they are good for Partisan suppression.\ - They can transport Marines and AAA and are thus well-suited for commando ops.\n\ + They can transport Marines and AAA and are thus well-suited for commando ops. \n\ "), _("\ For each turn not ended in a City, Base, or Carrier, 1hp is lost. +1 move\ - is awarded if starting a turn in a City or Airbase.\n\ + is awarded if starting a turn in a City or Airbase. \n\ "), _("\ Helicopters fly low to avoid Interception. This invites attacks by ground units from\ Riflemen onward. They are unreachable to Artillery types and get +50% defense\ - vs. foot units. City Walls get a defense bonus against them;\ - SAM Batteries do not. Helicopters can be attacked by Sea from Ironclad onward.\n\ + vs. foot units. Helicopters can be attacked by Sea from Ironclad onward. +Helicopters can retaliate 3 rounds against Special Unit Attacks. \n\ "), _("\ -Helicopters can transport one Marines or AAA unit.\ +Helicopters can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker.\ + Helicopters can transport one Marines or AAA unit.\ ") [unit_jet_fighter] @@ -2674,7 +3196,7 @@ class = "AirProtect" tech_req = "Avionics" obsolete_by = "None" graphic = "u.jet_fighter" -graphic_alt = "u.stealth_fighter" +graphic_alt = "-" sound_move = "m_jet_fighter" sound_move_alt = "m_stealth_fighter" sound_fight = "f_jet_fighter" @@ -2693,7 +3215,7 @@ uk_happy = 0 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Air", "AirProtect", "AirPillage", "Missile", "Balloon", "Helicopter", "LandRail" +targets = "Air", "AirProtect", "Air_High_Altitude", "Missile", "Balloon", "Helicopter", "LandRail", "Zeppelin" bonuses = { "flag", "type", "value" } @@ -2714,11 +3236,11 @@ roles = "" helptext = _("\ Jet Fighters upgrade the Fighter with improved attack, defense, and range.\ "), _(" -INTERCEPTOR: the Vigil order Jets Fighters auto-attack adjacent Air units if they\ - have better attack odds. This unit can Vigil if it uses 3 move points or less.\n\ +INTERCEPTOR:the Vigil order lets Jet Fighters auto-attack adjacent Air units if they\ + have better attack odds. This unit can Vigil if it uses 3 move points or less. \n\ "), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ - can override this by ordering moves to adjacent tiles.\ +Jet Fighters can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker.\ + NOTE:GOTO disallows unit loss from lack of fuel. You can override this by ordering moves to adjacent tiles.\ ") [unit_ground_strike_fighter] @@ -2730,8 +3252,8 @@ graphic = "u.strike_fighter" graphic_alt = "-" sound_move = "m_strike_fighter" sound_move_alt = "m_jet_fighter" -sound_fight = "f_medium_bomber" -sound_fight_alt = "f_artillery" +sound_fight = "f_fighter" +sound_fight_alt = "Ground Strike" build_cost = 80 pop_cost = 0 attack = 7 @@ -2742,11 +3264,13 @@ move_rate = 21 vision_radius_sq = 12 transport_cap = 0 fuel = 2 +paratroopers_mr_sub = 178 ;00,0101,100,1,0 - iPill_rand_tgts=0, iPill_odds=-5 pentads=75%, iPill_moves=4, iPillage=1, ATK_Stay_Fortified=0 +;NOTE:iPillage changes in rules require client_rules_flag and get_what_can_unit_pillage_from() changes. uk_happy = 0 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Air", "AirPillage", "Balloon", "Helicopter", "LandRail" +targets = "Air", "Air_High_Altitude", "Balloon", "Helicopter", "LandRail", "Zeppelin" bonuses = { "flag", "type", "value" "AntiAir", "DefenseMultiplierPct", 33 ; D5.33 vs Anti-Air @@ -2767,27 +3291,28 @@ veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "" helptext = _("\ -Ground Strike Fighters upgrade the Dive Bomber. They cannot block attacks on other\ +Ground Strike Fighters upgrade the Dive Bomber. They can’t block attacks on other\ units on their tile, nor engage against Fighters. However, like the Dive Bomber,\ they can interdict ZoC over land tiles. High fuel capacity allows two turns in the\ air. No unit can stop this unit from attacking surface units on a tile. This unit\ can also do pinpointed surgical strikes to pillage tiles. This aircraft is a\ - specialized niche unit. It is not an interceptor.\n\ -NOTE: GOTO prevents unit loss from lack of fuel. You\ + specialized niche unit. It is not an interceptor. \n\ +This aircraft can Stack-Escape:a 60% chance to escape a killed stack if it has more remaining moves than the attacker.\ + NOTE:GOTO prevents unit loss from lack of fuel. You\ can override this by ordering moves to adjacent tiles.\ ") [unit_jet_bomber] name = _("Jet Bomber") -class = "AirPillage" +class = "Air_High_Altitude" tech_req = "Space Flight" obsolete_by = "None" graphic = "u.jet_bomber_o" -graphic_alt = "u.bomber" +graphic_alt = "-" sound_move = "m_jet_bomber" sound_move_alt = "m_bomber" sound_fight = "f_jet_bomber" -sound_fight_alt = "f_bomber" +sound_fight_alt = "Carpet Bomb" build_cost = 145 pop_cost = 0 attack = 15 @@ -2798,6 +3323,8 @@ move_rate = 19 vision_radius_sq = 12 transport_cap = 3 fuel = 3 +paratroopers_mr_sub = 1198 ;10,0101,011,1,0 - iPill_rand_tgts=2, iPill_odds=-5 pentads=75%, iPill_moves=3, iPillage=1, ATK_Stay_Fortified=0 +;NOTE:iPillage changes in rules require client_rules_flag and get_what_can_unit_pillage_from() changes. uk_happy = 1 uk_shield = 1 uk_food = 0 @@ -2820,12 +3347,13 @@ veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "" helptext = _("\ -Jet Bombers are stratospheric long-range bombers with 3 turns of fuel: they can be airborne for two\ +Jet Bombers are stratospheric long-range bombers with 3 turns of fuel:they can be airborne for two\ turn-changes. Their range makes them useful even after Stealth Bombers are available. Stratospheric\ - altitude is unreachable to propeller-based Fighters and AAA. Jet Bombers can carpet-bomb,\ - pillaging tiles from the air. May carry three Bombs.\ + altitude is unreachable to propeller-based Fighters and AAA. Jet Bombers can Carpet Bomb, an\ + instant-Pillage of tiles from the air. May carry three Bombs. \n\ "), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ +Jet Bombers can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker.\ + NOTE:GOTO disallows unit loss from lack of fuel. You\ can override this by ordering moves to adjacent tiles.\ ") @@ -2854,7 +3382,7 @@ uk_happy = 0 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Air", "AirProtect", "AirPillage", "Missile", "Balloon", "Helicopter", "LandRail" +targets = "Air", "AirProtect", "Air_High_Altitude", "Missile", "Balloon", "Helicopter", "LandRail", "Zeppelin" bonuses = { "flag", "type", "value" "AntiAir", "DefenseDividerPct", 25 @@ -2876,14 +3404,16 @@ veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "" helptext = _("\ -The most advanced Fighter, with improved attack and longer range. Stealth Fighters cannot be seen unless adjacent\ +The most advanced Fighter, with improved attack and longer range. Stealth Fighters can’t be seen unless adjacent\ to an enemy. Stealth evasion gives a 25% bonus against all Anti-Air units, and reduces\ SAM Batteries down to a smaller 25% bonus.\ "), _(" -INTERCEPTOR: the Vigil order lets Stealth Fighters auto-attack adjacent Air units if they\ - have better attack odds. This unit can Vigil if it uses 4 move points or less.\n\ +INTERCEPTOR:the Vigil order lets Stealth Fighters auto-attack adjacent Air units if they\ + have better attack odds. This unit can Vigil if it uses 4 move points or less. \n\ +"), _(" +Stealth Fighters can Stack-Escape:a 67% chance to escape a killed stack if they have more remaining moves than the attacker.\ "), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ +NOTE:GOTO disallows unit loss from lack of fuel. You\ can override this by ordering moves to adjacent tiles.\ ") @@ -2893,7 +3423,7 @@ class = "Air" tech_req = "Stealth" obsolete_by = "None" graphic = "u.stealth_bomber_o" -graphic_alt = "u.stealth_bomber" +graphic_alt = "-" sound_move = "m_stealth_bomber" sound_move_alt = "m_generic" sound_fight = "f_stealth_bomber" @@ -2912,7 +3442,7 @@ uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Balloon", "LandRail" +targets = "Balloon", "LandRail", "Zeppelin" bonuses = { "flag", "type", "value" "AntiAir", "DefenseDividerPct", 25 @@ -2936,11 +3466,12 @@ veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "" helptext = _("\ -The deadliest Bomber, with improved attack and speed. Stealth Bombers cannot be seen\ +The deadliest Bomber, with improved attack and speed. Stealth Bombers can’t be seen\ unless adjacent to an enemy. Stealth evasion gives a 25% bonus against all Anti-Air\ - units, and reduces SAM Batteries down to only a 25% bonus. May carry two Bombs.\ + units, and reduces SAM Batteries down to only a 25% bonus. May carry two Bombs. \n\ "), _(" -NOTE: GOTO disallows unit loss from lack of fuel. You\ +Stealth Bombers can Stack-Escape:a 67% chance to escape a killed stack if they have more remaining moves than the attacker.\ + NOTE:GOTO disallows unit loss from lack of fuel. You\ can override this by ordering moves to adjacent tiles.\ ") @@ -2969,18 +3500,29 @@ uk_happy = 0 uk_shield = 0 uk_food = 0 uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea", "LandRoad" +cargo = "Land", "LandNoKill", "LandAirSea", "Cargo" flags = "BadCityDefender", "HelpWonder", "TradeRoute", "CoastStrict", "NonMil", "HasNoZOC" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "Ferryboat", "FerryStartUnit" helptext = _("\ Boats were used pre-historically for exploration,\ transport, and interaction with other tribes. They\ can travel rivers and oceans, but must always stay\ near shore. Boats can carry one unit and do ancient\ - commerce: building Wonders or setting up Traderoutes\ - without Trade tech. Primitive bartering generates little\ - or no extra trade, but may help you advance faster or\ - create relations with ancient neighbors.\ + commerce:building Wonders or setting up Trade Routes.\ + Early bartering may help you advance faster or create\ + relations with ancient neighbors.\ ") [unit_trireme] @@ -3008,17 +3550,29 @@ uk_happy = 0 uk_shield = 1 uk_food = 0 uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea", "LandRoad" +cargo = "Land", "LandNoKill", "LandAirSea", "LandRoad", "Cargo" flags = "BadCityDefender", "CantReachAir", "HelpWonder", "TradeRoute", "Coast", "WillNever", "NonMil", "NonMilAttack" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "Ferryboat", "FerryStartUnit" helptext = _("\ Triremes are used for exploration, transport, and Commerce.\ The entry on Caravan explains what Commerce units may do.\ "), _(" -Triremes can enter Deep Ocean, but there is risk: they must end every second\ - turn on river, coastline, or a city—or else be lost at sea. They can travel\ - and attack on rivers, but cannot attack the shore.\ +Triremes can enter Deep Ocean, but there is risk:they must end every second\ + turn on river, coastline, or a city—or else be lost at sea. They can attack\ + and travel on rivers, but can’t attack the shore.\ "), _(" Like most ancient sea units, when it initiates combat there will be 15 rounds\ of combat and 15 total hp lost between both units. This may or may not\ @@ -3031,7 +3585,7 @@ class = "RiverShip" tech_req = "Map Making" obsolete_by = "Caravel" graphic = "u.longboat" -graphic_alt = "u.trireme" +graphic_alt = "-" sound_move = "m_longboat" sound_move_alt = "m_trireme" sound_fight = "f_trireme" @@ -3052,6 +3606,18 @@ uk_food = 0 uk_gold = 0 cargo = "Land", "LandNoKill", "LandAirSea", "LandRoad" flags = "BadCityDefender", "CantReachAir", "WillNever" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "Ferryboat", "Hunter" helptext = _("\ The Longboat is a warship. It can attack at sea, attack the shore, and carry one land\ @@ -3068,7 +3634,7 @@ class = "RiverShip" tech_req = "Seafaring" obsolete_by = "Caravel" graphic = "u.galley" -graphic_alt = "u.trireme" +graphic_alt = "-" sound_move = "m_galley" sound_move_alt = "m_trireme" sound_fight = "f_trireme" @@ -3087,15 +3653,27 @@ uk_happy = 0 uk_shield = 1 uk_food = 0 uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea", "LandRoad" +cargo = "Land", "LandNoKill", "LandAirSea", "LandRoad", "Cargo" flags = "BadCityDefender", "CantReachAir", "HelpWonder", "Traderoute", "Only_Native_Attack", "WillNever", "NonMil", "NonMilAttack" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "Ferryboat", "FerryStartUnit", "BarbarianBoat" helptext = _("\ The Galley is an all-purpose sea unit and upgrades the Trireme. It has decent\ combat strength, can transport, and is a Commerce unit. The entry on Caravan\ - explains what Commerce units may do. Galleys can travel and attack on rivers,\ - but cannot attack the shore. Galleys do not cause unhappiness.\ + explains what Commerce units may do. Galleys can attack and travel on rivers,\ + but can’t attack the shore. Galleys do not cause unhappiness.\ "), _(" Like most early sea units, when it initiates an attack, there will be 15 rounds\ of combat and 15 total hp lost between both units. This may or may not\ @@ -3108,7 +3686,7 @@ class = "RiverShip" tech_req = "Astronomy" obsolete_by = "Caravel" graphic = "u.war_galley" -graphic_alt = "u.trireme" +graphic_alt = "-" sound_move = "m_war_galley" sound_move_alt = "m_trireme" sound_fight = "f_trireme" @@ -3129,10 +3707,22 @@ uk_food = 0 uk_gold = 0 cargo = "Land", "LandNoKill", "LandAirSea", "LandRoad" flags = "BadCityDefender", "CantReachAir", "WillNever" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "Ferryboat", "FerryStartUnit", "BarbarianBoat", "Hunter" helptext = _("\ The War Galley has improved offense, defense, and cargo capacity, but lacks commerce\ - ability. War Galleys can travel and attack on rivers, and do shore attacks from the sea.\ + ability. War Galleys can attack and travel on rivers, and do shore attacks from the sea.\ "), _(" Like most ancient sea units, when it initiates combat there will be 15 rounds\ of combat and 15 total hitpoints lost between both units. This may or may not\ @@ -3141,11 +3731,11 @@ Like most ancient sea units, when it initiates combat there will be 15 rounds\ [unit_ram_ship] name = _("Ram Ship") -class = "Sea" +class = "RiverShip" tech_req = "Engineering" obsolete_by = "Caravel" graphic = "u.ram_ship" -graphic_alt = "u.trireme" +graphic_alt = "-" sound_move = "m_ram_ship" sound_move_alt = "m_trireme" sound_fight = "f_ram_ship" @@ -3158,20 +3748,32 @@ hitpoints = 10 firepower = 1 move_rate = 6 vision_radius_sq = 2 -transport_cap = 0 +transport_cap = 1 fuel = 0 uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea" +cargo = "Land", "LandNoKill", "LandAirSea", "LandRoad", "Cargo" flags = "BadCityDefender", "CantReachAir", "Only_Native_Attack", "WillNever" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "Hunter" helptext = _("\ -The Ram Ship has one purpose: to destroy other ships. It has poor vision, no transport or\ - commerce ability, and cannot travel rivers. Unlike other early ships, there will always be\ +The Ram Ship has one purpose:to destroy other ships. It has poor vision, and no transport or\ + commerce ability. Unlike other early ships, there will always be\ a winner and a loser when Ram Ships attack. They are good for first-strike, and are good\ - counter units for nations not invested into sea tech. Ram Ships cannot do shore attacks.\ + counter units for nations not invested into sea tech. Ram Ships can’t do shore attacks.\ ") [unit_caravel] @@ -3180,7 +3782,7 @@ class = "RiverShip" tech_req = "Navigation" obsolete_by = "Galleon" graphic = "u.caravel" -graphic_alt = "u.trireme" +graphic_alt = "-" sound_move = "m_caravel" sound_move_alt = "m_generic" sound_fight = "f_caravel" @@ -3195,16 +3797,30 @@ move_rate = 7 vision_radius_sq = 4 transport_cap = 3 fuel = 0 -uk_happy = 1 +uk_happy = 0 uk_shield = 1 uk_food = 0 uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea", "LandRoad" +cargo = "Land", "LandNoKill", "LandAirSea", "LandRoad", "Cargo" flags = "BadCityDefender", "CantReachAir", "Traderoute", "WillNever", "NonMil", "NonMilAttack" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "Ferryboat", "FerryStartUnit", "BarbarianBoat", "Hunter" helptext = _("\ -Caravels upgrade older sea units, and are a big advance in combat, speed, range, and transport capacity. They have\ - the commerce ability of the Galley, but cannot build Wonders. Caravels can travel and attack on rivers and do shore attacks.\ +Caravels upgrade older sea units, and are a big advance in combat, speed,\ + range, and transport capacity. They have the commerce ability of the Galley,\ + but cannot build Wonders. Caravels can attack and travel on rivers and do\ + shore attacks. As a Commerce unit, the Caravel does not cause unhappiness.\ "), _(" Like most early sea units, when it initiates an attack, there will be 15 rounds\ of combat and 15 total hitpoints lost between both units. This may or may not\ @@ -3232,23 +3848,38 @@ move_rate = 8 vision_radius_sq = 4 transport_cap = 4 fuel = 0 -uk_happy = 1 +uk_happy = 0 uk_shield = 1 uk_food = 0 uk_gold = 0 targets = "Submarine", "LandRail" -cargo = "Land", "LandNoKill", "LandAirSea", "Balloon", "LandRoad" -flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever" +cargo = "Land", "LandNoKill", "LandAirSea", "Balloon", "LandRoad", "Cargo" +flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever", + "NonMil", "NonMilAttack" ; maritime trade can continue after Caravel expires. +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "Ferryboat", "FerryStartUnit", "BarbarianBoat" helptext = _("\ -The Galleon is a heavily armed transport ship that can carry up to 4 units. Galleons can travel and attack on rivers,\ +The Galleon is a heavily armed transport ship that can carry up to 4 units. Galleons can attack and travel on rivers,\ and also do shore attacks. Galleon crews repair their ship an extra +1hp per turn, regardless of whether it has moved.\ "), _(" Like most early sea units, when it initiates combat there will be 15 rounds\ of combat and 15 total hitpoints lost between both units. This may or may not\ - result in the loss of one of the units.\ + result in the loss of one of the units. Although the Galleon is not a Commerce\ + unit, it retains one vestige of the commercial abilities for the ships it upgrades.\ + It can enter Peace waters to deliver commercial cargo, and does not cause unhappiness.\ "), _(" -Galleons can Stack-Escape: a 50% chance to escape a killed stack if they have more remaining moves than the attacker.\ +Galleons can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining moves than the attacker.\ ") [unit_frigate] @@ -3282,26 +3913,131 @@ bonuses = { "flag", "type", "value" "Marines", "DefenseMultiplier", 1 } +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever" roles = "Hunter" helptext = _("\ -The Frigate is versatile — it's a superior offensive unit and also a decent transport ship. Frigates\ - can travel and attack on rivers, or make shore attacks from sea. Frigate crews repair their ship an\ +The Frigate is versatile — it is a superior offensive unit and also a decent transport ship. Frigates\ + can attack and travel on rivers, or make shore attacks from sea. Frigate crews repair their ship an\ extra +1hp per turn, regardless of whether it has moved.\ "), _(" From Frigates onward, all sea attacks end with a single victor.\ - Frigates can Stack-Escape: a 50% chance to escape a killed stack if they have more remaining move points than the attacker.\ + Frigates can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining move points than the attacker.\ ") -[unit_ironclad] -name = _("Ironclad") -class = "Sea" -tech_req = "Steam Engine" -obsolete_by = "Destroyer" -graphic = "u.ironclad" +[unit_cargo_ship] +name = _("Cargo Ship") +class = "RiverShip" +tech_req = "Industrialization" +obsolete_by = "None" +graphic = "u.cargo_ship" graphic_alt = "-" -sound_move = "m_ironclad" -sound_move_alt = "m_generic" +sound_move = "m_transport" +sound_move_alt = "m_transport" +sound_fight = "f_trireme" +sound_fight_alt = "f_generic" +build_cost = 45 +pop_cost = 0 +attack = 0 +defense = 1 +hitpoints = 30 +firepower = 1 +move_rate = 7 +vision_radius_sq = 4 +transport_cap = 4 +fuel = 0 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +cargo = "Land", "LandNoKill", "LandAirSea", "Balloon", "LandRoad", "Cargo" +flags = "BadCityDefender", "HelpWonder", "Traderoute", "NonMil", "HasNoZOC", "NoVeteran" +; No veteran levels (level name is never displayed) +veteran_names = _("green") +veteran_base_raise_chance = 0 +veteran_work_raise_chance = 0 +veteran_power_fact = 100 +veteran_move_bonus = 0 +roles = "" +helptext = _("\ +Cargo ships are Commerce units:they can establish Trade Routes and help\ + build Wonders. They can travel rivers and oceans. Cargo ships can also carry\ + four land units:thus, they are useful for transporting units by river or sea.\ +") + +[unit_transport] +name = _("Transport") +class = "Sea" +tech_req = "Industrialization" +obsolete_by = "None" +graphic = "u.transport" +graphic_alt = "-" +sound_move = "m_transport" +sound_move_alt = "m_generic" +sound_fight = "f_transport" +sound_fight_alt = "f_generic" +build_cost = 50 +pop_cost = 0 +attack = 0 +defense = 3 +hitpoints = 30 +firepower = 1 +move_rate = 10 +vision_radius_sq = 12 +transport_cap = 8 +fuel = 0 +uk_happy = 0 +uk_shield = 1 +uk_food = 0 +uk_gold = 0 +cargo = "Land", "LandNoKill", "LandAirSea", "Balloon", "LandRoad", "Cargo", "Zeppelin" +bonuses = + { "flag", "type", "value" + "Marines", "DefenseMultiplier", 1 + } +flags = "BadCityDefender", "CanEscape" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 +roles = "Ferryboat", "FerryStartUnit" +helptext = _("\ +The Transport can’t attack but can defend itself when under attack.\ + Marines and Anti-Aircraft Artillery can directly attack from a Transport. Its\ + large cargo capacity makes it a significant logistical upgrade for sea\ + transportation. The Transport is considered a military vessel:unwelcome in\ + the waters of nations with whom you are at Peace. Transports do not cause\ + unhappiness.\ +") + +[unit_ironclad] +name = _("Ironclad") +class = "Sea" +tech_req = "Steam Engine" +obsolete_by = "Destroyer" +graphic = "u.ironclad" +graphic_alt = "-" +sound_move = "m_ironclad" +sound_move_alt = "m_generic" sound_fight = "f_ironclad" sound_fight_alt = "f_generic" build_cost = 60 @@ -3324,6 +4060,18 @@ bonuses = "Marines", "DefenseMultiplier", 1 } flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "Hunter" helptext = _("\ The Ironclad is an armored ship that is much more sturdy than the Frigate but\ @@ -3331,7 +4079,7 @@ The Ironclad is an armored ship that is much more sturdy than the Frigate but\ onward, warships are excellent at attacking shore targets, and can also pillage\ buoys.\ "), _(" -Ironclads and all modern ships can Stack-Escape: a 50% chance to escape a killed stack if they have more remaining move points than the attacker.\ +Ironclads and all modern ships can Stack-Escape:a 60% chance to escape a killed stack if they have more remaining move points than the attacker.\ ") [unit_destroyer] @@ -3359,13 +4107,26 @@ uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter", "LandRail" +targets = "Balloon", "Submarine", "Helicopter", "LandRail", "Zeppelin" +;cargo = "Virtual" bonuses = { "flag", "type", "value" "Submarine", "DefenseMultiplier", 3 "Marines", "DefenseMultiplier", 1 } flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "Hunter" helptext = _("\ Destroyers are the first of the modern ships to start your modern\ @@ -3373,6 +4134,8 @@ Destroyers are the first of the modern ships to start your modern\ anti-submarine warfare, shore bombardment of lighter targets,\ and supporting the needs of larger fleets. 4× ASW defence gives a\ 35% chance defending vs Submarines.\ +"), _(" +Destroyers can Stack-Escape:a 67% chance to escape a killed stack if they have more remaining move points than the attacker.\ ") [unit_cruiser] @@ -3400,17 +4163,29 @@ uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter", "LandRail" +targets = "Balloon", "Submarine", "Helicopter", "LandRail", "Zeppelin" bonuses = { "flag", "type", "value" "Submarine", "DefenseMultiplier", 1 "Marines", "DefenseMultiplier", 1 } flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "Hunter" helptext = _("\ The Cruiser is a large and fast surface warship with equally strong offensive and defensive strength. More often than not, its\ - 2× ASW defence allows it to survive a Submarine attack.\ + 2× ASW defence allows it to survive a Submarine attack. \ "), _("\ The main duties of the Cruiser are offensive strikes against lesser ships, and escorting weaker ships.\ ") @@ -3421,7 +4196,7 @@ class = "Sea" tech_req = "Rocketry" obsolete_by = "None" graphic = "u.missile_destroyer" -graphic_alt = "u.destroyer" +graphic_alt = "-" sound_move = "m_destroyer" sound_move_alt = "m_generic" sound_fight = "f_destroyer" @@ -3440,8 +4215,8 @@ uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter", "LandRail" -cargo = "Missile" +targets = "Balloon", "Submarine", "Helicopter", "LandRail", "Zeppelin" +cargo = "Missile"; , "Virtual" bonuses = { "flag", "type", "value" "Submarine", "DefenseMultiplier", 1 @@ -3450,11 +4225,25 @@ bonuses = "Missile", "DefenseMultiplier", 1 } flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "Hunter" helptext = _("\ The Missile Destroyer has double the firepower of a Destroyer, and shares the same roles\ as its ancestor. It gains 2× defense against Air and Missile units. It has a 2× ASW bonus\ and can can carry one Missile.\ +"), _(" +Missile Destroyers can Stack-Escape:a 67% chance to escape a killed stack if they have more remaining move points than the attacker.\ ") [unit_aegis_cruiser] @@ -3482,8 +4271,8 @@ uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Air", "AirProtect", "AirPillage", "Missile", "Helicopter", "Balloon", "Submarine", "LandRail" -cargo = "Missile" +targets = "Air", "AirProtect", "Air_High_Altitude", "Missile", "Helicopter", "Balloon", "Submarine", "LandRail", "Zeppelin" +cargo = "Missile";, "Virtual" bonuses = { "flag", "type", "value" "AirAttacker", "DefenseMultiplier", 2 @@ -3492,12 +4281,24 @@ bonuses = "Marines", "DefenseMultiplier", 1 } flags = "BadCityDefender", "CanEscape", "AntiAir", "WillNever" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "Hunter" helptext = _("\ The AEGIS Cruiser has an Anti-Air missile system. Radar and sonar\ give superior vision and 2× defense bonus against Submarines.\ The AEGIS can carry two Missiles, and is the only ship that can attack\ - Air and Missile units.\ + Air and Missile units. \ "), _("\ Excellent vision and 3× Anti-Air bonus are ideal for scouting and escorting.\ ") @@ -3508,7 +4309,7 @@ class = "Sea" tech_req = "Refining" obsolete_by = "None" graphic = "u.battleship" -graphic_alt = "u.battleship" +graphic_alt = "-" sound_move = "m_battleship" sound_move_alt = "m_generic" sound_fight = "f_battleship" @@ -3523,21 +4324,38 @@ move_rate = 10 vision_radius_sq = 12 transport_cap = 0 fuel = 0 +city_size = 3252 ; 000000,001,100,101101,00 = atk_bonus=0, max_kills=1, targets=4, move_cost=45 frags, stay_fortfy=0, reserved = 0 +paratroopers_mr_sub = 6144 ; 00011,00,0000,000,0,0 - bbd_retal_rate=3, iPill_rand_tgts=0, iPill_odds=0, iPill_moves=0, iPillage=0, ATK_Stay_Fortified=0 uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter", "LandRail" +targets = "Balloon", "Submarine", "Helicopter", "LandRail", "Zeppelin" bonuses = { "flag", "type", "value" "Submarine", "DefenseMultiplier", 1 "Marines", "DefenseMultiplier", 1 } -flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever" +flags = "BadCityDefender", "CanEscape", "CantReachAir", "WillNever", "Bombarder" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "" helptext = _("\ -The Battleship is the supreme naval unit with excellent offensive and defensive strength. It has a 2× defense bonus vs Submarines.\ +The Battleship is the supreme naval unit, with excellent offensive and defensive strength. It has a 2× defense bonus vs Submarines.\ + Battleships may expend 5 move points to do a 3 round bombardment which hits up to 4 units within a stack, of which only a maximum\ + of one can be killed. Defending Battleships get a free bombardment against Special Unit Attacks.\ ") +bombard_rate = 3 [unit_submarine] name = _("Submarine") @@ -3573,15 +4391,29 @@ bonuses = } flags = "NeverProtects", "BadCityDefender", "Only_Native_Attack", "Submarine", "CanEscape", "CantReachAir", "WillNever" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "Hunter" helptext = _("\ Submarines are strong attackers but weak defenders. They can carry 8 Missiles.\ They are unreachable by Air units, but do not block air attacks on surface ships.\ - Submarines cannot attack units on shore. Submarines cannot be seen by other players\ - unless they have a unit or city adjacent to it.\ + Submarines can’t attack units on shore. Submarines can’t be seen by other players\ + unless they have a unit or city adjacent to it. \ "), _("\ Submarines have superior attrition rates when attacking in numbers. They excel\ at hit-and-run against weaker ships.\ +"), _(" +Submarines can Stack-Escape:a 75% chance to escape a killed stack if they have more remaining move points than the attacker.\ ") [unit_carrier] @@ -3603,108 +4435,41 @@ hitpoints = 40 firepower = 2 move_rate = 10 vision_radius_sq = 12 -transport_cap = 9 +transport_cap = 10 fuel = 0 uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Balloon", "Submarine", "Helicopter" -cargo = "Air", "AirProtect", "AirPillage", "Missile", "Helicopter", "Balloon", "LandAirSea" +targets = "Balloon", "Submarine", "Helicopter", "Zeppelin" +cargo = "Air", "AirProtect", "Air_High_Altitude", "Missile", "Helicopter", "Balloon", "LandAirSea", "Zeppelin" bonuses = { "flag", "type", "value" "Marines", "DefenseMultiplier", 1 } flags = "BadCityDefender", "Only_Native_Attack", "CanEscape", "CantReachAir", "WillNever" +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite"), + _("?vet_rank:crack"), + _("?vet_rank:master"), + _("?vet_rank:sea wolf") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 200, 210, 220, 230 +veteran_move_bonus = 0, 0, 0, 0, 9, 9, 9 roles = "" helptext = _("\ The Carrier is a mobile airport that can carry Air units, Helicopters, AAA, Marines, and Missiles.\ Fighters can Vigil on a Carrier if they have enough moves and the Carrier has not moved since the\ - Vigil order was given.\ + Vigil order was given. \ "), _("\ Carriers are very expensive and thus, usually protected by a fleet of scouts and escorts.\ ") -[unit_cargo_ship] -name = _("Cargo Ship") -class = "RiverShip" -tech_req = "Industrialization" -obsolete_by = "None" -graphic = "u.cargo_ship" -graphic_alt = "u.transport" -sound_move = "m_transport" -sound_move_alt = "m_transport" -sound_fight = "f_trireme" -sound_fight_alt = "f_generic" -build_cost = 45 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 30 -firepower = 1 -move_rate = 7 -vision_radius_sq = 4 -transport_cap = 4 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea", "Balloon", "LandRoad" -flags = "BadCityDefender", "HelpWonder", "Traderoute", "NonMil", "HasNoZOC", "NoVeteran" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_base_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "" -helptext = _("\ -Cargo ships are Commerce units: they can establish Trade Routes and help\ - build Wonders. They can travel rivers and oceans. Cargo ships can also carry\ - four land units: thus, they are useful for transporting units by river or sea.\ -") - -[unit_transport] -name = _("Transport") -class = "Sea" -tech_req = "Industrialization" -obsolete_by = "None" -graphic = "u.transport" -graphic_alt = "-" -sound_move = "m_transport" -sound_move_alt = "m_generic" -sound_fight = "f_transport" -sound_fight_alt = "f_generic" -build_cost = 50 -pop_cost = 0 -attack = 0 -defense = 3 -hitpoints = 30 -firepower = 1 -move_rate = 10 -vision_radius_sq = 12 -transport_cap = 8 -fuel = 0 -uk_happy = 1 -uk_shield = 1 -uk_food = 0 -uk_gold = 0 -cargo = "Land", "LandNoKill", "LandAirSea", "Balloon", "LandRoad" -bonuses = - { "flag", "type", "value" - "Marines", "DefenseMultiplier", 1 - } -flags = "BadCityDefender", "CanEscape" -roles = "Ferryboat", "FerryStartUnit" -helptext = _("\ -The Transport cannot attack but can defend itself when under attack.\ - Marines and Anti-Aircraft Artillery can directly attack from a Transport. Its\ - large cargo capacity makes it a significant logistical upgrade in\ - sea transportation.\ -") - [unit_cruise_missile] name = _("Cruise Missile") class = "Missile" @@ -3732,17 +4497,17 @@ uk_food = 0 uk_gold = 0 embarks = "Submarine" disembarks = "Submarine" -targets = "LandRail" +targets = "LandRail", "Space" flags = "NeverProtects", "FieldUnit", "OneAttack", "HasNoZOC", "Unbribable", "CantReachAir", "Missile", "NeverBlocked", "WillNever" roles = "" helptext = _("\ A Cruise Missile can strike distant targets. It\ - cannot attack Air units, but Air units never block\ + can’t attack Air units, but Air units never block\ a strike on reachable surface units. Cruise Missiles\ can be relocated by ending their turn on a city,\ airbase, Submarine, Missile Destroyer, AEGIS Cruiser,\ - Carrier, or Mobile SAM. A Cruise Missile cannot\ + Carrier, or Mobile SAM. A Cruise Missile can’t\ block attacks on other units on its tile.\ ") @@ -3752,7 +4517,7 @@ class = "Bomb" tech_req = "Nuclear Fission" obsolete_by = "None" graphic = "u.atom_bomb" -graphic_alt = "u.nuclear" +graphic_alt = "-" sound_move = "m_atom_bomb" sound_move_alt = "m_generic" sound_fight = "f_atom_bomb" @@ -3771,8 +4536,8 @@ uk_happy = 1 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Balloon", "Helicopter", "Air", "AirProtect", "AirPillage", "Missile", "Submarine", "LandRail","LandRoad" -disembarks = "Air", "AirPillage" +targets = "Balloon", "Helicopter", "Air", "AirProtect", "Air_High_Altitude", "Missile", "Submarine", "LandRail", "LandRoad", "Space", "Zeppelin" +disembarks = "Air", "Air_High_Altitude" flags = "NeverProtects", "FieldUnit", "OneAttack", "Nuclear", "HasNoZOC", "Unbribable", "NeverBlocked", "WillNever", "NoVeteran" ; No veteran levels (level name is never displayed) @@ -3786,7 +4551,7 @@ helptext = _("\ If you have Nuclear Fission and the Manhattan Project has been built by any player, you can make Atom Bombs.\ A Bomber can drop it within two tiles of its location. Unload the bomb and fly the Bomber out of range, then\ attack the target (or detonate by pressing D twice.) The blast destroys ALL cardinally adjacent tiles. City population\ - is reduced by half. Land tiles may get nuclear fallout.\ + is reduced by half. Land tiles may get nuclear fallout. \ "), _("\ Fallout reduces tile output and increases risk of nuclear winter.\ ") @@ -3799,7 +4564,7 @@ tech_req = "Fusion Power" impr_req = "Enrichment Facility" obsolete_by = "None" graphic = "u.hbomb" -graphic_alt = "u.nuclear" +graphic_alt = "-" sound_move = "m_atom_bomb" sound_move_alt = "m_generic" sound_fight = "f_atom_bomb" @@ -3818,8 +4583,8 @@ uk_happy = 2 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Balloon", "Helicopter", "Air", "AirProtect", "AirPillage", "Missile", "Submarine", "LandRail", "LandRoad" -disembarks = "Air", "AirPillage" +targets = "Balloon", "Helicopter", "Air", "AirProtect", "Air_High_Altitude", "Missile", "Submarine", "LandRail", "LandRoad", "Space", "Zeppelin" +disembarks = "Air", "Air_High_Altitude" flags = "NeverProtects", "FieldUnit", "OneAttack", "Nuclear", "HasNoZOC", "Unbribable", "NeverBlocked", "WillNever", "NoVeteran" ; No veteran levels (level name is never displayed) @@ -3832,9 +4597,9 @@ roles = "" helptext = _("\ Hydrogen Bombs make Atom Bombs seem tame. Any unprotected city at Ground Zero will be absolutely annihilated.\ In other cities in the blast radius, population is reduced by about 75%. Blast area is 21 tiles:\ - the same area as an entire city (5×5 minus the corners.) All units within the blast are destroyed.\n\ + the same area as an entire city (5×5 minus the corners.) All units within the blast are destroyed. \n\ A Bomber can drop a Hydrogen Bomb within two tiles of its location. Unload the bomb, fly the Bomber out of\ - range, then detonate by pressing D twice.\n\ + range, then detonate by pressing D twice. \n\ If you have Fusion Power and the Manhattan Project was built, a Hydrogen Bomb\ can be made in a city with an Enrichment Facility. \ "), _("\ @@ -3849,7 +4614,7 @@ tech_req = "Fusion Power" impr_req = "Enrichment Facility" obsolete_by = "None" graphic = "u.ddomb" -graphic_alt = "u.atom_bomb" +graphic_alt = "-" sound_move = "m_atom_bomb" sound_move_alt = "m_generic" sound_fight = "f_atom_bomb" @@ -3868,8 +4633,8 @@ uk_happy = 4 uk_shield = 1 uk_food = 0 uk_gold = 0 -targets = "Balloon", "Helicopter", "Air", "AirProtect", "AirPillage", "Missile", "Submarine", "LandRail", "LandRoad" -disembarks = "Air", "AirPillage" +targets = "Balloon", "Helicopter", "Air", "AirProtect", "Air_High_Altitude", "Missile", "Submarine", "LandRail", "LandRoad", "Space", "Zeppelin" +disembarks = "Air", "Air_High_Altitude" flags = "NeverProtects", "FieldUnit", "OneAttack", "Nuclear", "HasNoZOC", "Unbribable", "NeverBlocked", "WillNever", "Unique", "NoVeteran" ; No veteran levels (level name is never displayed) @@ -3883,15 +4648,15 @@ helptext = _("\ The Doomsday Bomb is the mother of all bombs. Blast area is about 100 tiles.\ Only one can be made at a time. A city at Ground Zero will be\ annihilated. Other cities in the blast area lose about 75% of their population.\ - All units within the blast are completely destroyed.\n\ + All units within the blast are completely destroyed. \n\ A Bomber can drop the Bomb within two tiles of its location. Unload the Bomb and\ - pray that you can fly the Bomber out of range. Detonate by pressing D twice.\n\ + pray that you can fly the Bomber out of range. Detonate by pressing D twice. \n\ If you have Fusion Power and the Manhattan Project was built, a Doomsday Bomb\ can be made in a city with an Enrichment Facility. \ "), _("\ The Fallout from a Doomsday Bomb is a sure ticket to Nuclear Winter.\ ") -bombard_rate = 25 ; radius = sqrt(27) = 5.19 +bombard_rate = 27 ; radius = sqrt(25) = 5.19 [unit_nuclear_missile] name = _("Nuclear Missile") @@ -3920,7 +4685,7 @@ uk_food = 0 uk_gold = 0 embarks = "Submarine" disembarks = "Submarine" -targets = "Balloon", "Helicopter", "Air", "AirProtect", "AirPillage", "Missile", "Submarine", "LandRail", "LandRoad" +targets = "Balloon", "Helicopter", "Air", "AirProtect", "Air_High_Altitude", "Missile", "Submarine", "LandRail", "LandRoad", "Space", "Zeppelin" flags = "NeverProtects", "FieldUnit", "OneAttack", "Nuclear", "HasNoZOC", "Unbribable", "NeverBlocked", "WillNever", "NoVeteran" ; No veteran levels (level name is never displayed) @@ -3933,11 +4698,11 @@ roles = "" helptext = _("\ If you have Space Flight and the Manhattan Project has been built by any player, you can make Nuclear Missiles.\ Nuclear blasts destroy ALL units in a 3×3 area. City population is reduced by half. Land tiles may get nuclear fallout.\ - Fallout reduces tile output and increases risk of nuclear winter.\ + Fallout reduces tile output and increases risk of nuclear winter. \ "), _("\ If Fallout is cleaned on the turn it appears, the chance of nuclear winter is reduced.\ ") -bombard_rate = 0 ; default sq_radius of 2: every adjacent tile. +bombard_rate = 0 ; default sq_radius of 2:every adjacent tile. [unit_tactical_nuke] name = _("Tactical Nuke") @@ -3951,7 +4716,7 @@ sound_move = "m_nuclear" sound_move_alt = "m_generic" sound_fight = "f_nuclear" sound_fight_alt = "f_generic" -build_cost = 140 +build_cost = 130 pop_cost = 0 attack = 100 defense = 0 @@ -3967,7 +4732,7 @@ uk_food = 0 uk_gold = 0 embarks = "Submarine" disembarks = "Submarine" -targets = "Balloon", "Helicopter", "Air", "AirProtect", "AirPillage", "Missile", "Submarine", "LandRail", "LandRoad" +targets = "Balloon", "Helicopter", "Air", "AirProtect", "Air_High_Altitude", "Missile", "Submarine", "LandRail", "LandRoad", "Space", "Zeppelin" flags = "NeverProtects", "FieldUnit", "OneAttack", "Nuclear", "HasNoZOC", "Unbribable", "NeverBlocked", "WillNever", "NoVeteran" ; No veteran levels (level name is never displayed) @@ -3981,11 +4746,11 @@ helptext = _("\ Tactical Nukes are very small warheads attached to missiles. A Tactical Nuke destroys all units on\ a single tile. City population is reduced by half. The target tile may get Fallout. In theory,\ Tactical Nukes are small enough to get the advantages of nuclear armaments without the severity of\ - consequences. In reality, they might be a gateway that escalates toward mutual assured destruction.\n\ + consequences. In reality, they might be a gateway that escalates toward mutual assured destruction. \n\ If you have Fusion Power and the Manhattan Project was built, a Tactical Nuke\ can be made in a city with an Enrichment Facility. \ ") -bombard_rate = -2 ; 2 - 2 = 0: only nukes target tile. +bombard_rate = -2 ; 2 - 2 = 0:only nukes target tile. [unit_diplomat] name = _("Diplomat") @@ -3998,11 +4763,11 @@ sound_move = "m_diplomat" sound_move_alt = "m_generic" sound_fight = "f_diplomat" sound_fight_alt = "f_generic" -build_cost = 30 +build_cost = 26 pop_cost = 0 attack = 0 defense = 0 -hitpoints = 10 +hitpoints = 8 firepower = 1 move_rate = 4 vision_radius_sq = 4 @@ -4014,7 +4779,7 @@ uk_food = 0 uk_gold = 0 embarks = "LandRail", "Helicopter" ; transport helicopter only disembarks = "LandRail", "Helicopter" -flags = "Diplomat", "IgZOC", "NonMil", "HasNoZOC", "Expellable" +flags = "Diplomat", "IgZOC", "NonMil", "HasNoZOC", "Expellable", "Cant_Pillage", "CanClaim", "Settlers" veteran_names = _("?diplomatic_rank:attaché"), _("?diplomatic_rank:secretary"), @@ -4024,16 +4789,20 @@ veteran_names = _("?diplomatic_rank:statesman"), _("?diplomatic_rank:plenipotentiary") -veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_base_raise_chance = 60, 50, 40, 30, 20, 15, 0 veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 veteran_power_fact = 100, 110, 115, 120, 125, 130, 135 -veteran_move_bonus = 0, 0, 0, 0, 0, 0, 0 +veteran_move_bonus = 0, 0, 0, 0, 3, 3, 3 roles = "DiplomatStartUnit" helptext = _("\ -A Diplomat performs official or covert actions. Covert acts make incidents\ - which let Senates break treaties. Diplomats in cities defend such acts with\ - combat. Diplomats can • Bribe a lone unit • Establish embassy • Investigate City\ - • Sabotage production/buildings • Steal tech • Steal maps • Incite city revolt.\n\ +A Diplomat performs official or covert actions. Covert actions make incidents\ + which let Senates break treaties. Diplomats in cities may defend such acts with\ + diplomatic combat. Diplomats can • Bribe a lone unit • Establish embassy • Investigate City\ + • Sabotage random production or buildings • Steal tech • Steal maps • Incite city revolt. \n\ +Except for Bribing and Investigate City, diplomatic actions will spend the Diplomat,\ + making it unavailable for further use. Diplomats may claim a tile for your nation\ + if adjacent to a tile claim made inside your own national border. Foreign tile claims require\ + the Diplomat be accompanied by another unit.\ "), _("\ Full rules for Diplomats are in the Manual.\ ") @@ -4053,7 +4822,7 @@ build_cost = 35 pop_cost = 0 attack = 0 defense = 0 -hitpoints = 10 +hitpoints = 8 firepower = 1 move_rate = 6 vision_radius_sq = 8 @@ -4065,7 +4834,7 @@ uk_food = 0 uk_gold = 0 embarks = "LandRail", "Helicopter" ; transport helicopter only disembarks = "LandRail", "Helicopter" -flags = "Diplomat", "IgZOC", "NonMil", "HasNoZOC", "Spy", "Expellable" +flags = "Diplomat", "IgZOC", "NonMil", "HasNoZOC", "Spy", "Expellable", "CanClaim", "Settlers" veteran_names = _("?spy_level:informant"), _("?spy_level:handler"), @@ -4074,19 +4843,22 @@ veteran_names = _("?spy_level:secret agent"), _("?spy_level:neutralizer"), _("?spy_level:spymaster") - -veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 + +veteran_base_raise_chance = 60, 50, 40, 30, 20, 15, 0 veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 veteran_power_fact = 100, 110, 115, 120, 125, 130, 135 -veteran_move_bonus = 0, 0, 0, 0, 0, 0, 0 +veteran_move_bonus = 0, 0, 0, 0, 3, 3, 3 roles = "DiplomatStartUnit" helptext = _("\ -Spies can do what a Diplomat can, and also: • Survive ops\ +Spies can do what a Diplomat can, and also:• Survive ops\ • Sabotage lone units • Poison city water • Steal specific tech\ - • Steal tech from cities more than once • Sabotage specific targets in cities.\ + • Steal tech from cities more than once • Sabotage specific targets in cities. \ "), _("\ Spies who survive ops escape to the nearest friendly city. Spies have\ - a 25% advantage over Diplomats in combat: a base 75% chance to win.\ + a 25% advantage over Diplomats in combat:a base 75% chance to win.\ + Spies may claim a tile for your nation if adjacent to a tile claim made\ + inside your own national border. Tile claims require the Spy to be accompanied\ + by another unit.\ Full rules are in the Manual.\ ") @@ -4094,7 +4866,7 @@ Spies who survive ops escape to the nearest friendly city. Spies have\ name = _("Caravan") class = "Land" tech_req = "Trade" -obsolete_by = "Freight" +obsolete_by = "Truck" graphic = "u.caravan" graphic_alt = "-" sound_move = "m_caravan" @@ -4109,35 +4881,140 @@ hitpoints = 10 firepower = 1 move_rate = 2 vision_radius_sq = 4 -transport_cap = 0 fuel = 0 uk_happy = 0 uk_shield = 0 uk_food = 0 uk_gold = 0 +transport_cap = 2 +cargo = "Cargo" embarks = "LandRoad", "Helicopter" ; transport helicopter only disembarks = "LandRoad", "Helicopter" -flags = "HelpWonder", "TradeRoute", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Expellable", "Shield2Gold" -roles = "AttackStrongStartUnit" ;note: MP2 doesn't start games with ASSU's so has co-opted this for caravan start unit. +flags = "HelpWonder", "TradeRoute", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Expellable", "Cant_Pillage" +roles = "AttackStrongStartUnit" ;note:MP2 does not start games with ASSUs so has co-opted this for caravan start unit. +veteran_names = + _("?vet_rank:green"), + _("?vet_rank:veteran"), + _("?vet_rank:hardened"), + _("?vet_rank:elite runner"), + _("?vet_rank:caravaneer"), + _("?vet_rank:master runner"), + _("?vet_rank:zaeim alqafila") +veteran_base_raise_chance = 50, 33, 20, 15, 15, 15, 0 +veteran_work_raise_chance = 0, 0, 0, 0, 0, 0, 0 +veteran_power_fact = 100, 150, 175, 250, 300, 350, 400 +veteran_move_bonus = 7, 7, 7, 7, 8, 9, 10 helptext = _("\ -Caravans are Commerce units. Commerce units can help build Wonders in any city with whom\ - you are not at war. In foreign cities 12+ tiles distant, they can create Trade Routes,\ +Compared to other early Commerce units, the Caravan is the only one who can\ + travel by land off roads and rails, and cause no military threat to\ + trade partners. It can defend itself and also fortify. They have 2 7/9 moves.\n\ +Commerce units can help build Wonders in any city with whom\ + you are not at war. In foreign cities 15+ tiles distant, they can create Trade Routes,\ increasing net trade in both cities relative to their combined trade. Routes are inactive\ - during war and (re)activate during peace.\n\ -Commerce units can enter the Marketplace of non-hostile foreign cities to sell goods: revenue derives\ - from total trade in both cities. This is only profitable between cities with very high trade.\n\ + during war and (re)activate during peace. \n\ Commerce units can build any Wonders for which you have the tech requirement. To use them\ - for a Trade Route, the Trade tech is needed, and they need to have an assigned Home City.\n\ -➤ Caravans are the only Commerce unit that can be produced more than once per turn, if the city\ - has appropriate output bonuses.\ + for a Trade Route, they need to have given a Home City. \n\ +All Commerce units can carry Goods as cargo.\ ") -[unit_freight] -name = _("Freight") +[unit_wagon] +name = _("Wagon") +class = "LandRoad" +tech_req = "The Wheel" +obsolete_by = "Truck" +graphic = "u.wagon" +graphic_alt = "-" +sound_move = "m_wagon" +sound_move_alt = "m_explorer" +sound_fight = "f_caravan" +sound_fight_alt = "f_generic" +build_cost = 25 +pop_cost = 0 +attack = 0 +defense = 0 +hitpoints = 10 +firepower = 1 +move_rate = 3 +vision_radius_sq = 4 +transport_cap = 2 +fuel = 0 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +cargo = "Land", "Cargo", "LandAirSea" +flags = "HelpWonder", "TradeRoute", "Cant_Fortify", "NonMil", "HasNoZOC", "Capturable", "Expellable", "NoVeteran" +roles = "" +; No veteran levels (level name is never displayed) +veteran_names = _("green") +veteran_base_raise_chance = 0 +veteran_work_raise_chance = 0 +veteran_power_fact = 100 +veteran_move_bonus = 3 +helptext = _("\ +Wagons are the first Commerce unit that can travel by land. Compared to a Caravan, they are defenseless.\ + They must stay on roads and quays. Wagons are useful for\ + transporting slower units. Wagons have 3⅓ move points, giving a range of 10 tiles on roads. \n\ +"), _("\ +Wagons allow units with less than 3 move points to travel your roads faster.\ + Any cargo can board a Wagon anywhere; but needs a city, quay, or base to deboard.\ + Cargo can disembark anywhere, but it uses up all move points. \n\ +Read the help on Caravans to see what Commerce units can do.\ +") + +[unit_train] +name = _("Train") +class = "LandRail" +tech_req = "Railroad" +obsolete_by = "None" +graphic = "u.train" +graphic_alt = "-" +sound_move = "m_train" +sound_move_alt = "m_generic" +sound_fight = "f_generic" +sound_fight_alt = "f_generic" +build_cost = 35 +pop_cost = 0 +attack = 0 +defense = 1 +hitpoints = 30 +firepower = 1 +move_rate = 4 +vision_radius_sq = 4 +transport_cap = 6 +fuel = 0 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +cargo = "Land", "LandAirSea", "Balloon", "Bomb", "Cargo", "Zeppelin" +flags = "HelpWonder", "TradeRoute", "NonMil", "HasNoZOC", "Cant_Fortify", "NoVeteran", "Capturable" +; No veteran levels (level name is never displayed) +veteran_names = _("green") +veteran_base_raise_chance = 0 +veteran_work_raise_chance = 0 +veteran_power_fact = 100 +veteran_move_bonus = 0 +roles = "" +helptext = _("\ +Trains are Commerce units with a bonus:they allow units with less than 3 move points\ + to travel your rails at distances comparable to other units. Transport logistics for\ + Trains are more restricted than for Wagons and Trucks. Except for Foot soldiers,\ + all units need to be in a city to get on or off a Train. \n\ +Foot Soldiers use Trains the same as Wagons and Trucks, and can: \n\ + 1. Board anywhere; \n 2. Deboard in a Base or Quay.; \n\ + 3. Disembark outside a City (loses all moves.) \n\n\ +On non-allied foreign rails, Trains incur full terrain movement cost.\ + Pre-gunpowder units can’t attack Trains. \n\n\ +Electricity and Combustion each give Trains an additional +1 move.\ +") + +[unit_truck] +name = _("Truck") class = "LandRoad" tech_req = "The Corporation" obsolete_by = "None" -graphic = "u.freight" +graphic = "u.truck" graphic_alt = "-" sound_move = "m_freight" sound_move_alt = "m_generic" @@ -4147,22 +5024,112 @@ build_cost = 50 pop_cost = 0 attack = 0 defense = 1 -hitpoints = 10 +hitpoints = 20 firepower = 1 -move_rate = 4 +move_rate = 6 vision_radius_sq = 4 +transport_cap = 3 +fuel = 0 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +cargo = "Land", "LandAirSea", "Bomb", "Cargo" +flags = "HelpWonder", "TradeRoute", "NonMil", "HasNoZOC", "Capturable", "Expellable", "NoVeteran", "Cant_Pillage" +roles = "" +helptext = _("\ +The Truck replaces the Caravan as the basic Commerce unit on Land. It moves at\ + more than twice the speed; but is restricted to the same roads and quays\ + as Wagons, and can't use rails. Each Truck used to build a Wonder\ + will add 50 shields. See the entry on Caravan to read what Commerce units may do. \n\ +"), _("\ +Trucks allow units with less than 3 move points to travel your roads faster: Like\ + the Wagon, any cargo can board a Truck anywhere, but a city, quay, or base is\ + needed to deboard. Disembarking is legal for all cargo types, but uses up all\ + moves (except Marines.)\ +") + +[unit_goods] +name = _("Goods") +class = "Cargo" +tech_req = "Currency" +obsolete_by = "Freight" +graphic = "u.amphorae" +graphic_alt = "-" +sound_move = "m_generic" +sound_move_alt = "m_generic" +sound_fight = "f_generic" +sound_fight_alt = "f_generic" +build_cost = 25 +pop_cost = 0 +attack = 0 +defense = 0 +hitpoints = 1 +firepower = 1 +move_rate = 1 +vision_radius_sq = 2 transport_cap = 0 fuel = 0 uk_happy = 0 uk_shield = 0 uk_food = 0 uk_gold = 0 -flags = "HelpWonder", "TradeRoute", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Expellable" +flags = "TradeRoute", "NonMil", "HasNoZOC", "Capturable", "Cant_Fortify", "NoVeteran", "Cant_Pillage" roles = "" helptext = _("\ -The Freight unit replaces the Caravan as the basic Commerce unit on Land. It moves at\ - twice the speed, but must stay on roads. Each Freight used to build a wonder will add\ - 50 shields. See the entry on Caravan to read what Commerce units may do.\ +Goods are commodities.\ + The cargo containers of the ancient world were amphorae, which carried\ + trade goods. \n\ +Goods can be used to establish Trade Routes. They can\ + be carried by Commerce units, allowing you to establish multiple\ + trade routes in one voyage. Also, Goods can Recycle Production with only\ + a 25% penalty, rendering 19 shields into a city production target. \n\ +"), _("\ +By themselves, Goods can only move onto tiles with a City, Quay, Fortress,\ + Airbase, or Naval Base. Commerce units, Tribesmen, and Galleons must carry them as cargo.\ + If adjacent to a foreign city, use the Do command (D) for Commerce functions.\ +") + +[unit_freight] +name = _("Freight") +class = "Cargo" +tech_req = "Mass Production" +obsolete_by = "None" +graphic = "u.container" +graphic_alt = "u.freight" +sound_move = "m_generic" +sound_move_alt = "m_generic" +sound_fight = "f_generic" +sound_fight_alt = "f_generic" +build_cost = 25 +pop_cost = 0 +attack = 0 +defense = 0 +hitpoints = 1 +firepower = 1 +move_rate = 1 +vision_radius_sq = 2 +transport_cap = 0 +fuel = 0 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +disembarks = "Air", "LandRoad", "LandRail", "Sea", "RiverShip" +flags = "HelpWonder", "TradeRoute", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Cant_Fortify", "NoVeteran", "Cant_Pillage" +roles = "" +helptext = _("\ +The methodical logistics of modern shipping render the Freight unit:a cargo\ + container separate from the transport vehicle. Freight brings benefits of\ + organized efficiency. Like all Commerce units, it can Help Build\ + Wonders, and Establish Trade Route.\ + Unlike other Commerce units, it can Disband to Recycle Production with\ + no net loss in shields. This gives Freight a variety of creative industrial uses. \n\ +"), _("\ +By itself, Freight is only able to move to tiles with loading infrastructure:\ + Cities, Quays, Fortresses, Airbases, and Naval Bases. To be transported, it must be carried\ + by Train, Truck, Airplane, or ship. If adjacent to a foreign city, use the D key to\ + do Commerce functions.\ ") [unit_explorer] @@ -4176,7 +5143,7 @@ sound_move = "m_explorer" sound_move_alt = "m_generic" sound_fight = "f_explorer" sound_fight_alt = "f_generic" -build_cost = 25 +build_cost = 20 pop_cost = 0 attack = 0 defense = 1 @@ -4192,55 +5159,17 @@ uk_food = 0 uk_gold = 0 embarks = "LandRoad", "Helicopter" ; transport helicopter only disembarks = "LandRoad", "Helicopter" -flags = "IgTer", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Expellable" +flags = "IgTer", "IgZOC", "NonMil", "HasNoZOC", "Capturable", "Expellable", "Cant_Pillage", "NoHome" roles = "Explorer", "ExplorerStartUnit" helptext = _("\ Explorers are brave individuals who map unknown territory. They can slip through enemy\ - ZOC, and have no unit upkeep.\ -") - -[unit_train] -name = _("Train") -class = "LandRail" -tech_req = "Railroad" -obsolete_by = "None" -graphic = "u.train" -graphic_alt = "u.transport" -sound_move = "m_train" -sound_move_alt = "m_generic" -sound_fight = "f_generic" -sound_fight_alt = "f_generic" -build_cost = 35 -pop_cost = 0 -attack = 0 -defense = 1 -hitpoints = 30 -firepower = 1 -move_rate = 4 -vision_radius_sq = 4 -transport_cap = 6 -fuel = 0 -uk_happy = 0 -uk_shield = 0 -uk_food = 0 -uk_gold = 1 -cargo = "Land", "LandAirSea", "Balloon", "Bomb", "LandRoad" -flags = "HelpWonder", "TradeRoute", "NonMil", "HasNoZOC", "NoVeteran", "Capturable" -; No veteran levels (level name is never displayed) -veteran_names = _("green") -veteran_base_raise_chance = 0 -veteran_work_raise_chance = 0 -veteran_power_fact = 100 -veteran_move_bonus = 0 -roles = "" -helptext = _("\ -Trains are Commerce units with a bonus: they allow units with 2 or less\ - move points to travel your rails at distances comparable to other units. Only Foot Soldiers\ - can:\n1. load outside a city or base;\n2. unload (T) in a base;\n3.step off the Train outside a city\ - (loses all moves.)\nAll other units must load/unload inside a city.\n\n\ -On non-allied foreign rails, Trains incur full terrain movement cost.\ - Pre-gunpowder units can't attack Trains.\n\n\ -Electricity and Combustion each give Trains an additional +1 move.\ + ZOC, and, like Tribesmen, ignore all terrain penalties; basically, treating every tile\ + as if it had a road, they can move 6 tiles per turn. As a non-military traveler, they\ + can also visit far off cities to Investigate City and gather intel. Sometimes generals\ + will use their scouting information for strategic advantage. Explorers can make contact\ + with far-off lands to arrange cease-fire or peace. Best of all, Explorers live off the\ + land and have no unit upkeep. In later times, Explorers upgrade to Partisans. For\ + all these reasons, the Explorer is perhaps one of the most undervalued of all units.\ ") [unit_leader] @@ -4249,7 +5178,7 @@ class = "Land" tech_req = "None" obsolete_by = "None" graphic = "u.leader" -graphic_alt = "u.explorer" +graphic_alt = "-" sound_move = "m_leader" sound_move_alt = "m_generic" sound_fight = "f_leader" @@ -4281,9 +5210,9 @@ veteran_power_fact = 100 veteran_move_bonus = 0 roles = "KingStartUnit" helptext = _("\ -This is you. If you lose this unit, you lose the game.\ +This is you. If you lose this unit, you lose the game. \ "), _("\ -Will not unleash barbarians from huts.\ +Will not unleash barbarians from huts. \ "), _("\ You can use the DO command to change the gender of the Leader.\ ") @@ -4327,14 +5256,13 @@ veteran_move_bonus = 0 roles = "KingStartUnit" helptext = _("\ (Alternate form of Leader. Behaves identically in-game.)\ - This is you. If you lose this unit, you lose the game.\ + This is you. If you lose this unit, you lose the game. \ "), _("\ -Will not unleash barbarians from huts.\ +Will not unleash barbarians from huts. \ "), _("\ You can use the DO command to change the gender of the Leader.\ ") - [unit_barbarian_leader] name = _("Barbarian Leader") class = "Land" @@ -4371,8 +5299,426 @@ veteran_move_bonus = 0 roles = "BarbarianLeader" helptext = _("\ One Barbarian Leader appears every time there is a barbarian uprising\ - somewhere in the world.\ + somewhere in the world. \ "), _("\ When a Barbarian Leader is killed on a tile without any defending units,\ the 100 gold ransom is paid, but only to land units and helicopters.\ ") + +[unit_peasants] +name = _("Peasants") +class = "Land" +tech_req = "Monarchy" +gov_req = "Monarchy" +impr_req = "Magna Carta" +obsolete_by = "None" +graphic = "u.peasants" +graphic_alt = "u.migrants" +sound_move = "m_worker" +sound_move_alt = "m_generic" +sound_fight = "f_worker" +sound_fight_alt = "f_generic" +build_cost = 10 +pop_cost = 1 +attack = 0 +defense = 1 +hitpoints = 8 +firepower = 1 +move_rate = 2 +vision_radius_sq = 4 +transport_cap = 0 +fuel = 0 +city_size = 1 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +embarks = "LandRoad", "LandRail", "Helicopter" ; transport helicopter only +disembarks = "LandRoad", "LandRail", "Helicopter" +flags = "Cant_Fortify", "NonMil", "HasNoZOC", "AddToCity", "Capturable", "Expellable", "Cant_Pillage", "MultiSlot" +; No veteran levels (level name is never displayed) +veteran_names = _("green") +veteran_base_raise_chance = 0 +veteran_work_raise_chance = 0 +veteran_power_fact = 100 +veteran_move_bonus = 0 +helptext = _("\ +Population Cost: 1. Adds Population: 1.\n\n\ +Peasants are the common people of Monarchies. You can encourage them\ + by royal edict to migrate to other cities and help colonize new\ + areas. But to have such access, you must be a Constitutional Monarchy\ + with the Magna Carta wonder: Peasants can only be made in\ + the city with Magna Carta, so choose that city carefully. \n\ +If managed correctly, Peasants can increase your national population\ + growth. They give a tremendous advantage for growing new colonies\ + and settlements faster. \n\ +Peasants can only be made in one city, but you can make more than one per\ + turn under the right conditions. When a city completes a unit, it will try\ + to make more of them if it doesn’t have a worklist. So be careful!\ +") + +;*** This unit can be turned on by uncommenting this, the Virtual class above, and adding "Virtual" as native to oceanic tiles +;*** in terrain.ruleset. +;[unit_sonar] +;name = _("Sonar Ping") +;class = "Virtual" +;tech_req = "Radar" +;obsolete_by = "None" +;graphic = "u.sonar" +;graphic_alt = "-" +;sound_move = "m_sonar" +;sound_move_alt = "m_generic" +;sound_fight = "f_generic" +;sound_fight_alt = "f_generic" +;build_cost = 1 +;pop_cost = 0 +;attack = 0 +;defense = 0 +;hitpoints = 1 +;firepower = 1 +;move_rate = 6 +;vision_radius_sq = 2 +;transport_cap = 0 +;fuel = 1 +;uk_happy = 0 +;uk_shield = 0 +;uk_food = 0 +;uk_gold = 0 +;vision_layer = "Subsurface" +;embarks = "Sea" +;disembarks = "Sea" +;flags = "IgZOC", "IgTer", "NonMil", "HasNoZOC", "Unbribable", "WillNever", "NoHome", "NoVeteran", "MultiSlot" +;helptext = _("\ +;A Sonar Ping represents active focusing of ship sonar on a\ +; specific area. Destroyer class and AEGIS Cruisers may take\ +; this virtual unit as cargo. Then the ship can send the\ +; Sonar Ping virtual unit out to sea, manually directing the\ +; focus of the sonar investigation. The virtual unit must end\ +; its turn back on the ship, or sonar capability is lost. \ +;"), _("\ +;This unit can be made with other units in the same turn, and can be\ +; made multiple times in a turn.\ +;") + +[unit_animal_wolf] +name = _("[Wolf]") +class = "Land" +tech_req = "None" +obsolete_by = "None" +graphic = "u.wolf" +graphic_alt = "-" +sound_move = "m_generic" +sound_move_alt = "m_generic" +sound_fight = "f_generic" +sound_fight_alt = "f_generic" +build_cost = 10 +pop_cost = 0 +attack = 2 +defense = 1 +hitpoints = 5 +firepower = 1 +move_rate = 2 +vision_radius_sq = 2 +transport_cap = 0 +fuel = 0 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +flags = "NoBuild", "Cant_Fortify", "Unbribable", "IgZOC", "HasNoZOC", "SuperSpy", "NoVeteran", "Cant_Pillage" +roles = "Barbarian" +helptext = _("\ +Watch out for wild animals. \ +"), _("\ +Wolves are mean wild ancestors of dogs, who hunt grasslands and hills.\ +") +[unit_animal_leopard] +name = _("[Leopard]") +class = "Land" +tech_req = "None" +obsolete_by = "None" +graphic = "u.leopard" +graphic_alt = "-" +sound_move = "m_generic" +sound_move_alt = "m_generic" +sound_fight = "f_generic" +sound_fight_alt = "f_generic" +build_cost = 10 +pop_cost = 0 +attack = 2 +defense = 1 +hitpoints = 4 +firepower = 1 +move_rate = 2 +vision_radius_sq = 2 +transport_cap = 0 +fuel = 0 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +flags = "NoBuild", "Cant_Fortify", "Unbribable", "IgZOC", "HasNoZOC", "SuperSpy", "NoVeteran", "Cant_Pillage" +roles = "Barbarian" +helptext = _("\ +Watch out for wild animals. \ +"), _("\ +Leopards are mean wild cats, who hunt in the forests.\ +") +[unit_animal_tiger] +name = _("[Tiger]") +class = "Land" +tech_req = "None" +obsolete_by = "None" +graphic = "u.tiger" +graphic_alt = "-" +sound_move = "m_generic" +sound_move_alt = "m_generic" +sound_fight = "f_generic" +sound_fight_alt = "f_generic" +build_cost = 10 +pop_cost = 0 +attack = 2 +defense = 1 +hitpoints = 5 +firepower = 1 +move_rate = 2 +vision_radius_sq = 2 +transport_cap = 0 +fuel = 0 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +flags = "NoBuild", "Cant_Fortify", "Unbribable", "IgZOC", "HasNoZOC", "SuperSpy", "NoVeteran", "Cant_Pillage" +roles = "Barbarian" +helptext = _("\ +Watch out for wild animals. \ +"), _("\ +Tigers are mean wild cats, who hunt in the jungles.\ +") +[unit_animal_lion] +name = _("[Lion]") +class = "Land" +tech_req = "None" +obsolete_by = "None" +graphic = "u.lion" +graphic_alt = "-" +sound_move = "m_generic" +sound_move_alt = "m_generic" +sound_fight = "f_generic" +sound_fight_alt = "f_generic" +build_cost = 10 +pop_cost = 0 +attack = 2 +defense = 1 +hitpoints = 5 +firepower = 1 +move_rate = 2 +vision_radius_sq = 2 +transport_cap = 0 +fuel = 0 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +flags = "NoBuild", "Cant_Fortify", "Unbribable", "IgZOC", "HasNoZOC", "SuperSpy", "NoVeteran", "Cant_Pillage" +roles = "Barbarian" +helptext = _("\ +Watch out for wild animals. \ +"), _("\ +Lions hunt the savannahs and plains.\ +") +[unit_animal_bear] +name = _("[Bear]") +class = "Land" +tech_req = "None" +obsolete_by = "None" +graphic = "u.bear" +graphic_alt = "-" +sound_move = "m_generic" +sound_move_alt = "m_generic" +sound_fight = "f_generic" +sound_fight_alt = "f_generic" +build_cost = 10 +pop_cost = 0 +attack = 2 +defense = 2 +hitpoints = 6 +firepower = 1 +move_rate = 2 +vision_radius_sq = 2 +transport_cap = 0 +fuel = 0 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +flags = "NoBuild", "Cant_Fortify", "Unbribable", "IgZOC", "HasNoZOC", "SuperSpy", "NoVeteran", "Cant_Pillage" +roles = "Barbarian" +helptext = _("\ +Watch out for wild animals. \ +"), _("\ +Bears live in the mountains.\ +") +[unit_animal_crocodile] +name = _("[Crocodile]") +class = "Land" +tech_req = "None" +obsolete_by = "None" +graphic = "u.crocodile" +graphic_alt = "-" +sound_move = "m_generic" +sound_move_alt = "m_generic" +sound_fight = "f_generic" +sound_fight_alt = "f_generic" +build_cost = 10 +pop_cost = 0 +attack = 2 +defense = 1 +hitpoints = 6 +firepower = 1 +move_rate = 1 +vision_radius_sq = 2 +transport_cap = 0 +fuel = 0 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +flags = "NoBuild", "Cant_Fortify", "Unbribable", "IgZOC", "HasNoZOC", "SuperSpy", "NoVeteran", "Cant_Pillage" +roles = "Barbarian" +helptext = _("\ +Watch out for wild animals. \ +"), _("\ +Crocodiles live in the swamps, where they wait to catch and eat prey.\ +") +[unit_animal_hippo] +name = _("[Hippo]") +class = "Sea" +tech_req = "None" +obsolete_by = "None" +graphic = "u.hippo" +graphic_alt = "-" +sound_move = "m_generic" +sound_move_alt = "m_generic" +sound_fight = "f_generic" +sound_fight_alt = "f_generic" +build_cost = 10 +pop_cost = 0 +attack = 1 +defense = 1 +hitpoints = 9 +firepower = 1 +move_rate = 1 +vision_radius_sq = 2 +transport_cap = 0 +fuel = 0 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +flags = "NoBuild", "Cant_Fortify", "Unbribable", "IgZOC", "HasNoZOC", "SuperSpy", "NoVeteran", "Cant_Pillage" +roles = "Barbarian" +helptext = _("\ +Watch out for wild animals. \ +"), _("\ +Hippos live in shallow smaller lakes.\ +") +[unit_animal_rhino] +name = _("[Rhino]") +class = "Land" +tech_req = "None" +obsolete_by = "None" +graphic = "u.rhino" +graphic_alt = "-" +sound_move = "m_generic" +sound_move_alt = "m_generic" +sound_fight = "f_generic" +sound_fight_alt = "f_generic" +build_cost = 10 +pop_cost = 0 +attack = 1 +defense = 2 +hitpoints = 6 +firepower = 1 +move_rate = 2 +vision_radius_sq = 2 +transport_cap = 0 +fuel = 0 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +flags = "NoBuild", "Cant_Fortify", "Unbribable", "IgZOC", "HasNoZOC", "SuperSpy", "NoVeteran", "Cant_Pillage" +roles = "Barbarian" +helptext = _("\ +Watch out for wild animals. \ +"), _("\ +Rhinos roam the edge of the deserts.\ +") +[unit_animal_polarbear] +name = _("[Polar Bear]") +class = "Land" +tech_req = "None" +obsolete_by = "None" +graphic = "u.polar_bear" +graphic_alt = "-" +sound_move = "m_generic" +sound_move_alt = "m_generic" +sound_fight = "f_generic" +sound_fight_alt = "f_generic" +build_cost = 10 +pop_cost = 0 +attack = 2 +defense = 1 +hitpoints = 6 +firepower = 1 +move_rate = 1 +vision_radius_sq = 2 +transport_cap = 0 +fuel = 0 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +flags = "NoBuild", "Cant_Fortify", "Unbribable", "IgZOC", "HasNoZOC", "SuperSpy", "NoVeteran", "Cant_Pillage" +roles = "Barbarian" +helptext = _("\ +Watch out for wild animals. \ +"), _("\ +Polar Bears live in the tundra and frozen arctic. They think of people as food.\ +") +[unit_animal_giantsquid] +name = _("[Giant Squid]") +class = "Sea" +tech_req = "None" +obsolete_by = "None" +graphic = "u.squid" +graphic_alt = "-" +sound_move = "m_generic" +sound_move_alt = "m_generic" +sound_fight = "f_generic" +sound_fight_alt = "f_generic" +build_cost = 10 +pop_cost = 0 +attack = 1 +defense = 1 +hitpoints = 9 +firepower = 1 +move_rate = 2 +vision_radius_sq = 2 +transport_cap = 0 +fuel = 0 +uk_happy = 0 +uk_shield = 0 +uk_food = 0 +uk_gold = 0 +flags = "NoBuild", "Cant_Fortify", "Unbribable", "IgZOC", "HasNoZOC", "SuperSpy", "NoVeteran", "Cant_Pillage" +roles = "Barbarian" +helptext = _("\ +Watch out for wild animals. \ +"), _("\ +Giant Squids live out at sea; they do not come near shore or shallow waters. Avoid them at all costs.\ +") + +;THIS LINE RESERVED FOR NECESSARY BLANK END OF LINE: diff --git a/freeciv/freeciv/data/mp2sandbox.serv b/freeciv/freeciv/data/mp2sandbox.serv deleted file mode 100644 index 2a9298474..000000000 --- a/freeciv/freeciv/data/mp2sandbox.serv +++ /dev/null @@ -1,6 +0,0 @@ -# Server commands to make multiplayer-evo Freeciv rules -# - -rulesetdir mp2sandbox - -# changed game settings are defined in game.ruleset diff --git a/freeciv/freeciv/data/mpplus/README.mpplus b/freeciv/freeciv/data/mpplus/README.mpplus index f47d5a039..19677338d 100644 --- a/freeciv/freeciv/data/mpplus/README.mpplus +++ b/freeciv/freeciv/data/mpplus/README.mpplus @@ -1,30 +1,22 @@ -The Multiplayer ruleset aimed to fix Classic ruleset balance for multi-player games. Multiplayer+ rectifies more issues that -were discovered from years of playing massive multi-player games. +The Multiplayer ruleset aimed to fix Classic ruleset balance for multi-player games. Multiplayer+ rectifies issues that were discovered from years of playing massive multi-player games. This is now the best example for Multiplayer I rules. -LINKS -MP+ Overview +Multiplayer Game Manual +MP+ Overview (has small list of MP+ changes) Detailed Changelog Click link for: Multiplayer Strategy Guide
- Terrain Combat Governments Economy Diplomacy - Hotkeys and Mouse Control -The link below is a 100% accurate Game Manual EXCEPT for the changes listed immediately below it. -Multiplayer Game Manual - -Changes from original Multiplayer rules: - -TECH +Changes from original Multiplayer rules: +TECH: 1. Tech costs equalize pace of discovery for all game stages. 2. No Philosophy bonus after Conscription, Industrialization, Electricity, or T85. 3. Darwin's Voyage is now similar to Colossus. - -UNITS +UNITS: 1. Land units on Mountains get +1 vision. 2. Illegal Action movement penalty removed. 3. No bribe/sabotage on Air and Missile units. @@ -34,20 +26,16 @@ UNITS ... b. OneAttack Flag deprecated in Bomber types and Helicopters. 6. Restrictinfra=ON makes enemy rails act only like roads. 7. Non-military Bribe cost fixed to work on all non-military units. -8. Submarine attack was incorrectly set as a Battleship. Restored to classic - ... Civ I/II strength. (A9 - was A12). +8. Submarine attack was incorrectly set as a Battleship. Restored to classic Civ I/II strength. (A9 - was A12). 9. Battleship:Cruisers:Destroyer movement set to 10:11:12. - -WONDERS +WONDERS: 1. Lighthouse: +2 moves, +1 vision, obsolete by Miniaturization. Cost: 170 (was 200) 2. Pyramid restored to Classic effect. +25% grain store in all cities when population changes. Cost: 160 (was 200) 3. Copernicus' Observatory now costs 100 shields (was 200.) - -BUILDINGS +BUILDINGS: 1. Mass Transit: Cost:60 +2 Trade. Upkeep:0 (was 4) 2. Recycling Center: Cost:70 +2 Porduction. Upkeep:1 (was 4) +TERRAIN: +1. Swamp Transform reduced to 12 worker-turns. (Was 36): Promotes fairness for naval participation in continental games. -TERRAIN -1. Swamp Transform reduced to 12 worker-turns. (Was 36): Promotes fairness for naval participation - ... in continental games. - + \ No newline at end of file diff --git a/freeciv/freeciv/data/mpplus/game.ruleset b/freeciv/freeciv/data/mpplus/game.ruleset index e62050e1e..c1b174813 100644 --- a/freeciv/freeciv/data/mpplus/game.ruleset +++ b/freeciv/freeciv/data/mpplus/game.ruleset @@ -916,7 +916,8 @@ actor_reqs = action = "Upgrade Unit" actor_reqs = { "type", "name", "range", "present" - "DiplRel", "Foreign", "Local", FALSE + "DiplRel", "Foreign", "Local", FALSE + "CityTile", "Center", "Local", TRUE } [actionenabler_airlift_unit] diff --git a/freeciv/freeciv/data/mpplus/units.ruleset b/freeciv/freeciv/data/mpplus/units.ruleset index 8924ce4cf..9acbadb9e 100644 --- a/freeciv/freeciv/data/mpplus/units.ruleset +++ b/freeciv/freeciv/data/mpplus/units.ruleset @@ -1,3 +1,4 @@ +;:::::::::::::::::::::::::::::::::::::::::’ × ; Modifying this file: ; You should not modify this file except to make bugfixes or ; for other "maintenance". If you want to make custom changes, @@ -13,6 +14,7 @@ ; unit with the relevant role that the player can build will be chosen. ; If no such unit can be found (eg Explorers that require Seafaring), ; then the first unit with this role will be chosen. +;:::::::::::::::::::::::::::::::::::::::::’ × [datafile] description="Unit definitions for the Multiplayer+ ruleset." @@ -63,14 +65,11 @@ flags = _("FortBuster"), _("Defending Forts get no bonus. +33% attack bonus vs. the 2× defense of a Fortress.") _("FortressBuster"), _("Defending Fortresses get no bonus.") _("AntiAir"), _("Anti-Air bonus of this unit is less effective against Stealth, which has a 25% bonus against this unit.") -;;; _("NeverProtects"), _("Does not protect other units on its tile.") ; UNCOMMENT THIS IF NOT USING SCL'S PATCH FOR THIS FLAG ;;; _("NeverBlocked"), _("Bypasses unreachable units when attacking a tile.") ; UNCOMMENT THIS IF NOT USING LEXXIE'S PATCH FOR THIS FLAG - _("MultiSlot"), _("Cities with proper requirements can produce more than one of these per turn.") ;uncomment if you don't have slot_control patch +;;; _("MultiSlot"), _("Cities with proper requirements can produce more than one of these per turn.") ;uncomment if you don't have slot_control patch _("CanHide"), _("In appropriate terrain, this unit can make a Hideout, which will conceal all land units on the tile.") _("WillNever") -;;; The following flag MUST be #34 position to work with hack in movement.c which allows transported AAA to defend on non-native: -;;; this comment can be removed when we have some smarter way for unit_can_defend_here(..) to get ruleset control. - _("TransportDefender"), _("Can defend while transported on non-native tiles.") +;;; _("TransportDefender"), _("Can defend while transported on non-native tiles.") ;uncomment if you don't have TransportDefender patch _("NonMilAttack"), _("Has military capacity but for peaceful purposes, can enter territories with whom you are at Peace") _("Cant_Pillage"), _("Unable to pillage tiles.") } @@ -147,35 +146,44 @@ veteran_move_bonus = 0, 0, 0, 0 ; ; ** Unit class Flags ** ; -; "TerrainSpeed" = Units use terrain specific speed -; "TerrainDefense" = Units gain defense bonus from terrain +; "TerrainSpeed" = Unit Class uses terrain specific speed +; "TerrainDefense" = Unit Class gains defense bonus from terrain ; "DamageSlows" = Damaged units are slowed down ; "CanOccupyCity" = Military units of this class can occupy enemy cities -; "Missile" = Unit is destroyed when it attacks -; "BuildAnywhere" = Unit can be built even in the middle of non-native terrain -; "Unreachable" = Unit can be attacked only by units explicitly listing this +; "BuildAnywhere" = Unit Class can be built even in the middle of non-native terrain +; "Unreachable" = Unit Class can be attacked only by units explicitly listing this ; class in its 'targets', unless on a city or native base. ; For class members which are transports, cargo cannot load/ ; unload except in a city or native base, unless that unit ; explicitly lists this class in its 'embarks'/'disembarks'. -; "CollectRansom" = Unit can collect ransom when killing lone barbarian leader -; "ZOC" = Unit is subject to ZOC rules. Unit type flag "IgZOC" can +; "CollectRansom" = Unit Class can collect ransom when killing lone barbarian leader +; "ZOC" = Unit Class is subject to ZOC rules. Unit type flag "IgZOC" can ; override this ; "CanFortify" = Unit can fortify at land tiles. Unit type flag ; "Cant_Fortify" can override this -; "CanPillage" = Unit can pillage tile infrastructure -; "DoesntOccupyTile" = Even if this kind of enemy unit is on tile, cities can +; "DoesntOccupyTile" = Even if this class of enemy unit is on tile, cities can ; still work that tile -; "AttackNonNative" = Unit can attack units on non-native tiles. Unit type +; "AttackNonNative" = Unit Class can attack units on non-native tiles. Unit type ; flag "Only_Native_Attack" can override this +; "AttFromNonNative" = Unit Class can launch attack from non-native tile (against +; native one) +; This applies for both attacking from transport or +; cities. If only some unit types of the class should +; get this property, use type flag "Marines" ; "KillCitizen" = Upon successful attack against a city, unit kills one ; citizen. The effect "Unit_No_Lose_Pop" and the server ; setting 'killcitizen' can disable this. ; ; */ <-- avoid gettext warnings + +; ********************************************************************************** +; ********************************************************************************** +; WARNING:ANY CHANGES TO WHAT TYPES OR CLASSES CAN LOAD ONTO WHICH TRANSPORTS MAY +; REQUIRE CHANGES TO FCW function unit_could_possibly_load() in unit.js +; ********************************************************************************** +; ********************************************************************************** [unitclass_missile] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Missile") min_speed = 1 hp_loss_pct = 0 @@ -195,28 +203,24 @@ helptext = _("\ ") [unitclass_sea] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Sea") min_speed = 2 hp_loss_pct = 0 flags = "DamageSlows", "AttackNonNative", "AttFromNonNative", "CanPillage" [unitclass_trireme] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Trireme") min_speed = 2 hp_loss_pct = 0 flags = "DamageSlows", "AttFromNonNative" [unitclass_heli] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Helicopter") min_speed = 1 hp_loss_pct = 10 flags = "CanOccupyCity", "CollectRansom" [unitclass_air] -; /* TRANS: Unit class: used adjectivally */ name = _("?unitclass:Air") min_speed = 1 hp_loss_pct = 0 @@ -225,13 +229,13 @@ flags = "Unreachable", "DoesntOccupyTile" ; /* <-- avoid gettext warnings ; -; Below: The individual unit types, one per section. +; Below:The individual unit types, one per section. ; ; The number can be variable, up to 200. ; However for the "official" rulesets, units should not be removed ; because that would break backward compatability with savegames. ; -; The order here matters: later units are considered "better" for +; The order here matters:later units are considered "better" for ; a given flag or role. ; ; The actual tag used (the * in [unit_*]) does not matter, except @@ -264,7 +268,7 @@ flags = "Unreachable", "DoesntOccupyTile" ; hitpoints = how much damage unit can withstand ; firepower = number of hitpoints removed per round of combat; at least 1 ; move_rate = base move rate (whole movement points) -; vision_radius_sq = base vision of unit: unit can see tile up to the square +; vision_radius_sq = base vision of unit:unit can see tile up to the square ; root of this value away ; convert_to = can be converted to another type of unit by name ; convert_time = number of movement points it takes to convert to @@ -327,30 +331,39 @@ flags = "Unreachable", "DoesntOccupyTile" ; "DefenseMultiplier" = Multiply defense value (1 + 'value') times. ; Value of 1 means multiplication by 2, value 2 by 3... ; Bonus is defined in defenders entry. +; "DefenseMultiplierPct" = Multiply defense by 1 + (value / 100). +; Value of 100 means multiplication by 2, +; value of 50 means multiplication by 1.5, etc. +; Effectively increases defense by value percent. +; Bonus is defined in defenders entry. ; "DefenseDivider" = Divide defense value with (1 + 'value'). ; Bonus is defined in attackers entry. +; "DefenseDividerPct" = Divide defense value by 1 + (value / 100). +; Value of 100 means division by 2, (2× for attacker) +; value of 50 means division by 1.5, (1.5× for attacker) +; i.e.:Effectively increases *attack* by value percent. ; "FirePower1" = Defender firepower is reduced to value 1 when ; ever this has non-zero value. -; Bonus is defined in attackers entry. -; -; +; Bonus is defined in attackers entry. +; ; ** Flags ** ; ; "IgZOC" = ignore Zones of Control (ZOC) even if unit class has ; "ZOC" flag -; "HasNoZOC" = unit has no Zone of Control (ZOC), thus any unit can move -; around it freely -; "NonMil" = a non-military unit: no attacks; no martial law; can enter +; "HasNoZOC" = unit has no Zone of Control (ZOC), thus any unit can move +; around it freely +; "NonMil" = a non-military unit:no martial law; can enter ; peaceful borders; DoesntOccupyTile ; "IgTer" = use constant move cost defined in igter_cost (terrain.ruleset) ; rather than terrain/road etc cost, unless terrain cost is ; less -; "OneAttack" = can only make a single attack, regardless of movement points -; "FieldUnit" = cause unhappiness even when not being aggressive +; "OneAttack" = can only make a single attack, regardless of movement points +; "FieldUnit" = cause unhappiness even when not being aggressive ; "BeachLander" = won't lose all its movement when moving from non-native ; terrain to native terrain even if slow_invasions is on. -; "Settlers" = can irrigate and build roads -; "Diplomat" = can defend against diplomat actions (see diplchance +; "Settlers" = "can irrigate and build roads" but really seems to be a required flag for +; any tile improvement at all. +; "Diplomat" = can defend against diplomat actions (see diplchance ; server option) ; "Spy" = strong in diplomatic battles. _Must_ be "Diplomat" also ; "CoastStrict" = (sea only) cannot leave coast @@ -358,38 +371,36 @@ flags = "Unreachable", "DoesntOccupyTile" ; to regularly end turn on coast ; "Only_Native_Attack" = cannot attack targets on non-native tiles even if ; unit class can -; "Cant_Fortify" = cannot fortify even if unit class has "CanFortify" flag -; "Fanatic" = can only be built by governments that allow them -; (see civ2/governments.ruleset, Fundamentalism government) -; "Unique" = a player can only have one of these units in the game at -; the same time; barbarians cannot use this at present -; "GameLoss" = losing one of these units means you lose the game, but it -; is produced without homecity and upkeep -; "EvacuateFirst" = the game will try to rescue units with this flag before +; "Cant_Fortify"= cannot fortify even if unit class has "CanFortify" flag +; "Fanatic" = can only be built by governments that allow them +; (see civ2/governments.ruleset, Fvndamentalist government) +; "Unique" = a player can only have one of these units in the game at +; the same time; barbarians cannot use this at present +; "GameLoss" = losing one of these units means you lose the game, but it +; is produced without homecity and upkeep +; "EvacuateFirst"=the game will try to rescue units with this flag before ; it tries to rescue units without it when their transport ; is destroyed. Think of the Birkenhead drill ("women and ; children first"). Replace "women and children" with ; "units with the EvacuateFirst unit type flag". -; "SuperSpy" = this unit always wins diplomatic contests, that is, unless -; it encounters another SuperSpy, in which case defender wins; -; can also be used on non-diplomat units, in which case it can -; protect cities from diplomats; also 100% spy survival chance -; "NoHome" = this unit has no homecity and will be free of all upkeep, and -; therefore will not revolt along with its city of origin should -; it be incited +; "SuperSpy" = this unit always wins diplomatic contests, that is, unless +; it encounters another SuperSpy, in which case defender wins; +; can also be used on non-diplomat units, in which case it can +; protect cities from diplomats; also 100% spy survival chance +; "NoHome" = this unit has no homecity and will be free of all upkeep, and +; therefore will not revolt along with its city of origin should +; it be incited ; "NoVeteran" = this unit cannot gain veteran levels through experience ; (as if both raise_chance and work_raise_chance were zero); ; it can still gain veterancy through Veteran_Build, etc ; "CityBuster" = this unit has double firepower against cities ; "NoBuild" = this unit cannot be built -; "BadWallAttacker" = the firepower of this unit is set to 1 if -; attacking a city -; defended by a city wall (or other city building defense) -; "BadCityDefender" = if attacked while in a city, firepower is set to 1 -; and firepower of attacker is doubled (the Pearl Harbour -; rule) +; "BadWallAttacker"=the firepower of this unit is set to 1 if attacking a city +; defended by a city wall (or other city building defense) +; "BadCityDefender"=if attacked while in a city, firepower is set to 1 +; and firepower of attacker is doubled (the Pearl Harbour rule) ; "BarbarianOnly" = only barbarians can build this unit -; "Shield2Gold" = Switch from shield upkeep to gold upkeep possible +; "Shield2Gold" = Switch from shield upkeep to gold upkeep possible. ; "NewCityGamesOnly" = unit can't be built on scenarios where founding new cities ; is not allowed. Give this flag to units that would make no sense ; to have in a game with such a scenario @@ -402,7 +413,10 @@ flags = "Unreachable", "DoesntOccupyTile" ; the "CanKillEscaping" unit type flag. ; "CanKillEscaping" = an attack from this unit ignores the "CanEscape" unit ; type flag. -; "Provoking" = a unit considering to auto attack this unit will choose to +; "Provoking" = Under autoattack_style=1 which this ruleset uses, only +; Fighter types will autoattack and will ONLY attack units +; marked with the Provoking flag. If overridden to autoattack_style=0, +; a unit considering to auto attack this unit will choose to ; do so even if has better odds when defending against it ; then when attacking it. Applies when the autoattack server ; setting is enabled. @@ -411,14 +425,25 @@ flags = "Unreachable", "DoesntOccupyTile" ; is enabled and the unit class is unreachable ; "NeverBlocked" = isn't blocked by unreachable units on targeted tile, ; even if the unreachableprotects server setting -; is enabled and the unit class is unreachable -; +; is enabled and the unit class is unreachable +; "MultiSlot" = if server setting slot_control is ON, only unit types with this +; flag can use extra city_build_slots +; "TransportDefender" = Unit can always defend while transported, even on non-native +; terrain. +; "SentryAlways" = This unit always reports sentry-type information; give this flag to +; reconnaissance/scouting type units who can't sentry because they are +; fuel-type units (which can only sentry on refueling tiles.) +; "Reserved1" +; "Reserved2" +; "Reserved3" = reserved for future use. +; ------------------------------------------- ; Following actions require extra fields: -; "Attack" +; "Attack" and "Suicide Attack" ; attack = base attack strength ; "Bombard" ; attack = base attack strength ; bombard_rate = the number of shots fired at enemy units when attacking +; FOR NUKES:the amount to add to the default radius of 1 tile ; "Join City" ; pop_cost = the number of population added to the target city ; "Paradrop Unit" @@ -441,9 +466,9 @@ flags = "Unreachable", "DoesntOccupyTile" ; "HutTech" = can be found in a hut, but its techs required ; "Partisan" = can be created as a partisan (only one unit can have this ; flag), see end of this file for its tech requirements option -; "DefendOk" = AI hint: ok for defending with -; "DefendGood" = AI hint: good for defending with -; "Ferryboat" = AI hint: useful for ferrying +; "DefendOk" = AI hint:ok for defending with +; "DefendGood" = AI hint:good for defending with +; "Ferryboat" = AI hint:useful for ferrying ; "Barbarian" = can be created as land barbarian ; "BarbarianTech" = can be created as land barbarian, if someone has ; researched its tech requirements @@ -456,7 +481,7 @@ flags = "Unreachable", "DoesntOccupyTile" ; "BarbarianSeaTech" = can be created as a barbarian that disembarks from a barbarian boat ; if someone has researched its tech requirements ; "Settlers" = can irrigate and build roads -; "Hunter" = AI hint: good for hunting other units +; "Hunter" = AI hint:good for hunting other units ; "CitiesStartUnit" = Gets granted as 'c' startunit ; "WorkerStartUnit" = Gets granted as 'w' startunit ; "ExplorerStartUnit" = Gets granted as 'x' startunit @@ -467,8 +492,11 @@ flags = "Unreachable", "DoesntOccupyTile" ; "DefendGoodStartUnit" = Gets granted as 'D' startunit ; "AttackFastStartUnit" = Gets granted as 'a' startunit ; "AttackStrongStartUnit" = Gets granted as 'A' startunit -; -; */ <-- avoid gettext warnings + +; "UserType1Startunit" = Gets granted as 'u' startunit +; "UserType2Startunit" = Gets granted as 'U' startunit +; "UserType3Startunit" = Gets granted as 'z' startunit +; "TradeStartUnit" = Gets granted as 't' startunit [unit_settlers] name = _("Settlers") diff --git a/freeciv/freeciv/data/multiplayer/README.multiplayer b/freeciv/freeciv/data/multiplayer/README.multiplayer index 4148dd735..5a60e5d60 100644 --- a/freeciv/freeciv/data/multiplayer/README.multiplayer +++ b/freeciv/freeciv/data/multiplayer/README.multiplayer @@ -1,111 +1,84 @@ -The 'Multiplayer' ruleset was intended to rectify some game balance issues encountered on multiplayer servers with the classic ruleset. -It is based on the 'Rewonder' ruleset designed by Madeline Book for Freeciv 2.1. It's provided here for those who are nostalgic or prefer -it. But this ruleset branch has been greatly improved and evolved to the newer versions Multiplayer+ and Multiplayer-Evolution (MP2). +The 'Multiplayer' ruleset was intended to rectify some game balance issues encountered on multiplayer servers with the classic ruleset. It is based on the 'Rewonder' ruleset designed by Madeline Book for Freeciv 2.1. It's provided here for those who are nostalgic or prefer it. But this ruleset branch has been greatly improved and evolved to the newer versions Multiplayer+ and Multiplayer-Evolution (MP2). -Multiplayer Game Manual -... +Multiplayer Game Manual Terrain Combat Governments Economy Diplomacy -... Hotkeys and Mouse Control This ruleset is also suited for LongTurn and Play-By-Email games. -Changes compared to the Classic ruleset: ---------------------------------------- -Gameplay --------- -Unit movement rates are twice that of the classic ruleset, to make this ruleset usable for LongTurn games. Some say 2x also -enhances singleplayer and short-turn games. +Gameplay compared to Classic ruleset: +Unit movement rates are twice that of the classic ruleset, to make this ruleset usable for LongTurn games. Some say 2x also enhances singleplayer and short-turn games. Trade routes are disabled. (The Marco Polo's Embassy wonder provides an alternative way to increase trade; see below.) The cost of inciting a city to change hands has been made impossibly high. -Units attacking with less than a full movement point get penalized because of their tiredness. Only the fragment of their normal attack strength -equivalent to their movement point fragment is considered. If they have 2/3 movement points, they will attack with 2/3 strength. If they have 1/3 movement -points, they will attack with 1/3 strength. - -Wonder changes --------------- -Almost all great wonders have been changed into small wonders; that is, they are player-unique rather than world-unique. Each player may -build their own "Oracle", for example, or even move such small wonders around by rebuilding them in other cities. For small wonders that -become obsolete, this happens only when the relevant technology is discovered by the owning player (rather than by any player). - -Unless otherwise noted, for these small wonders, all wonder effects that affect all of a player's cities have been changed to affect only -cities on the same continent as the city with the small wonder. - -The Palace is still the only Small Wonder that can be moved around by rebuilding it to a new city. Other Small Wonders can be rebuilt -only if you have lost them with the city where they were. - -For the Colossus, Copernicus' Observatory, Great Wall, Hoover Dam, King Richard's Crusade, Oracle, Shakespeare's Theater, Statue of -Liberty, and Sun Tzu's War Academy, these are the only changes. Other now-small wonders have been adjusted or completely changed: - -- Apollo Program: Does not reveal the map. -- A.Smith's Trading Co.: Costs 300 (was 400). -- Darwin's Voyage: Costs 400 (was 300). Gives only one advance. -- Eiffel Tower: You get one unit free of shield upkeep per city, instead of "AI love". -- Great Library: Reduces city corruption by 50%, instead of the tech-parasite effect. Costs 200 (was 300) and never obsoletes (used - ... to be "Electricity"). -- Hanging Gardens: Just makes two citizens happy in each city on the same continent. Costs 150 (was 200). -- Isaac Newton's College: Costs 400 (was 300). -- J.S. Bach's Cathedral: Costs 300 (was 400). -- Leonardo's Workshop: Costs 300 (was 400). Upgrades two units per turn (was one). -- Lighthouse: No longer makes sea units veteran (justs add +1 movement). -- Magellan's Expedition: Instead of the +2 move rate, it just makes new sea units built on the same continent veteran. -- Marco Polo's Embassy: Costs 400 (was 200). Instead of giving embassies, it increases trade output by 40% on the continent. -- Michelangelo's Chapel: Costs 300 (was 400). -- Pyramids: Instead of giving the granary effect, it allows the city where it is built to rapture grow. -- SETI Program: Renamed to "The Internet". -- Women's Suffrage: Costs 300 (was 600). Affects 2 and 4 citizens under Republic and Democracy respectively (was 1 and 2). - -As for the remaining great wonders: - -- Cure For Cancer: Costs 400 (was 600), and makes two citizens happy in every city owned by _any_ player who knows "Genetic Engineering". -- Manhattan Project: No change. -- United Nations: Instead of unit healing, gives the senate and anarchy-from-disorder effects of Democracy to all nations, - ... regardless of government. - -Building changes ----------------- - -- Colosseum: Renamed to "Amphitheater", and cost decreased to 60 (was 70). -- Supermarket: Increases farmland tile food output by 100% (was 50%). -- Police Station: Affects 2 and 4 unhappy citizens under Republic and Democracy respectively (was 1 and 2). - -Government changes ------------------- +Units attacking with less than a full movement point get penalized because of their tiredness. Only the fragment of their normal attack strength equivalent to their movement point fragment is considered. If they have 2/3 movement points, they will attack with 2/3 strength. If they have 1/3 movement points, they will attack with 1/3 strength. + +Wonder changes +Almost all great wonders have been changed into small wonders; that is, they are player-unique rather than world-unique. Each player may build their own "Oracle", for example, or even move such small wonders around by rebuilding them in other cities. For small wonders that become obsolete, this happens only when the relevant technology is discovered by the owning player (rather than by any player). + +Unless otherwise noted, for these small wonders, all wonder effects that affect all of a player's cities have been changed to affect only cities on the same continent as the city with the small wonder. + +The Palace is still the only Small Wonder that can be moved around by rebuilding it to a new city. Other Small Wonders can be rebuilt only if you have lost them with the city where they were. + +For the Colossus, Copernicus' Observatory, Great Wall, Hoover Dam, King Richard's Crusade, Oracle, Shakespeare's Theater, Statue of Liberty, and Sun Tzu's War Academy, these are the only changes. Other now-small wonders have been adjusted or completely changed: +• Apollo Program: Does not reveal the map. +• A.Smith's Trading Co.: Costs 300 (was 400). +• Darwin's Voyage: Costs 400 (was 300). Gives only one advance. +• Eiffel Tower: You get one unit free of shield upkeep per city, instead of "AI love". +• Great Library: Reduces city corruption by 50%, instead of the tech-parasite effect. Costs 200 (was 300) and never obsoletes. +• Hanging Gardens: Just makes two citizens happy in each city on the same continent. Costs 150 (was 200). +• Isaac Newton's College: Costs 400 (was 300). +• J.S. Bach's Cathedral: Costs 300 (was 400). +• Leonardo's Workshop: Costs 300 (was 400). Upgrades two units per turn (was one). +• Lighthouse: No longer makes sea units veteran (justs add +1 movement). +• Magellan's Expedition: Instead of the +2 move rate, it just makes new sea units built on the same continent veteran. +• Marco Polo's Embassy: Costs 400 (was 200). Instead of giving embassies, it increases trade output by 40% on the continent. +• Michelangelo's Chapel: Costs 300 (was 400). +• Pyramids: Instead of giving the granary effect, it allows the city where it is built to rapture grow. +• SETI Program: Renamed to "The Internet". +• Women's Suffrage: Costs 300 (was 600). Affects 2 and 4 citizens under Republic and Democracy respectively (was 1 and 2). + +The remaining great wonders: +• Cure For Cancer: Costs 400 (was 600), makes 2 citizens happy in all cities owned by players with "Genetic Engineering". +• Manhattan Project: No change. +• United Nations: Gives a Senate and anarchy-from-disorder effects of Democracy to all governments in the world. + +Building changes +• Colosseum: Renamed to "Amphitheater", and cost decreased to 60 (was 70). +• Supermarket: Increases farmland tile food output by 100% (was 50%). +• Police Station: Affects 2 and 4 unhappy citizens under Republic and Democracy respectively (was 1 and 2). + +Government changes The Fundamentalism government is added. This is similar to the one in the civ2 ruleset, with following exceptions: -- Food upkeep for Settlers is 3 -- Free unit upkeep is worth 10 shields in each city - -Technology changes ------------------- -- Philosophy gives a free tech to each player when they research it (not just the first player). -- Discovery of Environmentalism additionally knocks 50% off cities' pollution from production. -- Added Fundamentalism from the civ2 ruleset. - -Unit changes ------------- -- Unit movement rates are twice the values in the classic ruleset. -- Caravans and Freight cannot create trade routes. -- Caravans cost 30 production (was 50); Freight remain at 50. -- Elephants, Crusaders, and Fanatics added from the civ2 ruleset. - -Default settings ----------------- -The ruleset suggests some server setting changes, although these can be overridden. Notably, huts, barbarians, national borders, and -diplomacy are all disabled, more initial units are given, and "fairer" map settings are used. - -2. Use the ruleset ------------------- +• Food upkeep for Settlers is 3 +• Free unit upkeep is worth 10 shields in each city + +Technology changes +• Philosophy gives a free tech to each player when they research it (not just the first player). +• Discovery of Environmentalism additionally knocks 50% off cities' pollution from production. +• Added Fundamentalism from the civ2 ruleset. + +Unit changes +• Unit movement rates are twice the values in the classic ruleset. +• Caravans and Freight cannot create trade routes. +• Caravans cost 30 production (was 50); Freight remain at 50. +• Elephants, Crusaders, and Fanatics added from the civ2 ruleset. + +Default settings +The ruleset suggests some server setting changes, although these can be overridden. Notably, huts, barbarians, national borders, and diplomacy are all disabled, more initial units are given, and "fairer" map settings are used. + +Use the ruleset: /rules multiplayer -To play in singleplayer: +To play in singleplayer: /set minplayers 1 /set AIFILL # where # = the number of AI players to go against. /start + \ No newline at end of file diff --git a/freeciv/freeciv/data/multiplayer/game.ruleset b/freeciv/freeciv/data/multiplayer/game.ruleset index c75212778..c11ea36b2 100644 --- a/freeciv/freeciv/data/multiplayer/game.ruleset +++ b/freeciv/freeciv/data/multiplayer/game.ruleset @@ -948,7 +948,8 @@ actor_reqs = action = "Upgrade Unit" actor_reqs = { "type", "name", "range", "present" - "DiplRel", "Foreign", "Local", FALSE + "DiplRel", "Foreign", "Local", FALSE + "CityTile", "Center", "Local", TRUE } [actionenabler_airlift_unit] diff --git a/freeciv/freeciv/data/nation/chumash.ruleset b/freeciv/freeciv/data/nation/chumash.ruleset index 586298380..9b9f17446 100644 --- a/freeciv/freeciv/data/nation/chumash.ruleset +++ b/freeciv/freeciv/data/nation/chumash.ruleset @@ -47,7 +47,7 @@ cities = "Kashtiq", "Stuk", "Texax", -"‘Ataxis", +"Ataxis", "Chimimu’", "Chihlkukunach", "Wasna", diff --git a/freeciv/freeciv/data/sandbox/game.ruleset b/freeciv/freeciv/data/sandbox/game.ruleset index 5ac90f627..2aafc6019 100644 --- a/freeciv/freeciv/data/sandbox/game.ruleset +++ b/freeciv/freeciv/data/sandbox/game.ruleset @@ -1226,7 +1226,8 @@ actor_reqs = action = "Upgrade Unit" actor_reqs = { "type", "name", "range", "present" - "DiplRel", "Foreign", "Local", FALSE + "DiplRel", "Foreign", "Local", FALSE + "CityTile", "Center", "Local", TRUE } [actionenabler_airlift_light_unit] @@ -2064,7 +2065,7 @@ set = { "name", "value" "aifill", 12 "generator", "FRACTAL" - "topology", "WRAPX|WRAPY|ISO" + "topology", "WRAPX" "mapsize", "PLAYER" "tilesperplayer", 100 "tinyisles", "ENABLED" diff --git a/freeciv/freeciv/data/scenarios/riverland.sav b/freeciv/freeciv/data/scenarios/riverland.sav new file mode 100644 index 000000000..218c0e150 --- /dev/null +++ b/freeciv/freeciv/data/scenarios/riverland.sav @@ -0,0 +1,799 @@ + +[scenario] +game_version=2939900 +is_scenario=TRUE +name=_("Riverlands LT for 20 players") +description=_("Large continents divided by large navigable rivers") +authors=_("FREECIV-WEB\nRANDOM START POSITIONS\nMust load ruleset before scenario.\nNOTE: when repo and server are same version, /scensave then diff to make this scenario default to MP2 rules.") +save_random=FALSE +players=FALSE +startpos_nations=FALSE +lake_flooding=TRUE +handmade=TRUE +ruleset_locked=FALSE +ruleset_caps="+std-terrains" + +[savefile] +options=" +version3" +version=40 +reason="Scenario" +revision="2.93.99-alpha" +rulesetdir="mp2-caravel" +improvement_size=68 +improvement_vector="Airport","Aqueduct","Bank","Barracks","Barracks II","Barracks III","Cathedral","City Walls","Coastal Defense","Colosseum","Courthouse","Factory","Granary","Harbour","Hydro Plant","Library","Marketplace","Mass Transit","Mfg. Plant","Nuclear Plant","Offshore Platform","Palace","Police Station","Port Facility","Power Plant","Recycling Center","Research Lab","SAM Battery","SDI Defense","Sewer System","Solar Plant","Space Component","Space Module","Space Structural","Stock Exchange","Super Highways","Supermarket","Temple","University","Apollo Program","A.Smith's Trading Co.","Colossus","Copernicus' Observatory","Cure For Cancer","Darwin's Voyage","Eiffel Tower","Great Library","Great Wall","Hanging Gardens","Hoover Dam","Isaac Newton's College","J.S. Bach's Cathedral","King Richard's Crusade","Leonardo's Workshop","Lighthouse","Magellan's Expedition","Manhattan Project","Marco Polo's Embassy","Michelangelo's Chapel","Oracle","Pyramids","SETI Program","Shakespeare's Theatre","Statue of Liberty","Sun Tzu's War Academy","United Nations","Women's Suffrage","Coinage" +technology_size=88 +technology_vector="A_NONE","Advanced Flight","Alphabet","Amphibious Warfare","Astronomy","Atomic Theory","Automobile","Banking","Bridge Building","Bronze Working","Ceremonial Burial","Chemistry","Chivalry","Code of Laws","Combined Arms","Combustion","Communism","Computers","Conscription","Construction","Currency","Democracy","Economics","Electricity","Electronics","Engineering","Environmentalism","Espionage","Explosives","Feudalism","Flight","Fusion Power","Genetic Engineering","Guerilla Warfare","Gunpowder","Horseback Riding","Industrialization","Invention","Iron Working","Labor Union","Laser","Leadership","Literacy","Machine Tools","Magnetism","Map Making","Masonry","Mass Production","Mathematics","Medicine","Metallurgy","Miniaturization","Mobile Warfare","Monarchy","Monotheism","Mysticism","Navigation","Nuclear Fission","Nuclear Power","Philosophy","Physics","Plastics","Polytheism","Pottery","Radio","Railroad","Recycling","Refining","Refrigeration","Robotics","Rocketry","Sanitation","Seafaring","Space Flight","Stealth","Steam Engine","Steel","Superconductors","Tactics","The Corporation","The Republic","The Wheel","Theology","Theory of Gravity","Trade","University","Warrior Code","Writing" +activities_size=21 +activities_vector="Idle","Pollution","Unused Road","Mine","Irrigate","Fortified","Fortress","Sentry","Unused Railroad","Pillage","Goto","Explore","Transform","Unused","Unused Airbase","Fortifying","Fallout","Unused Patrol","Base","Road","Convert" +specialists_size=3 +specialists_vector="elvis","scientist","taxman" +trait_size=3 +trait_vector="Expansionist","Trader","Aggressive" +extras_size=34 +extras_vector="Irrigation","Mine","Oil Well","Pollution","Hut","Farmland","Fallout","Fortress","Airbase","Buoy","Ruins","Road","Railroad","River","Gold","Iron","Game","Furs","Coal","Fish","Fruit","Gems","Buffalo","Wheat","Oasis","Peat","Pheasant","Resources","Ivory","Silk","Spice","Whales","Wine","Oil" +multipliers_size=0 +diplstate_type_size=7 +diplstate_type_vector="Armistice","War","Cease-fire","Peace","Alliance","Never met","Team" +city_options_size=3 +city_options_vector="Disband","Sci_Specialists","Tax_Specialists" +action_size=38 +action_vector="Establish Embassy","Establish Embassy Stay","Investigate City","Investigate City Spend Unit","Poison City","Steal Gold","Steal Gold Escape","Sabotage City","Targeted Sabotage City","Steal Tech","Targeted Steal Tech","Incite City","Incite City Escape","Establish Trade Route","Enter Marketplace","Help Wonder","Bribe Unit","Sabotage Unit","Capture Units","Found City","Join City","Steal Maps","Steal Maps Escape","Bombard","Suitcase Nuke","Suitcase Nuke Escape","Explode Nuclear","Destroy City","Expel Unit","Recycle Unit","Disband Unit","Home City","Upgrade Unit","Paradrop Unit","Airlift Unit","Attack","Conquer City","Heal Unit" +action_decision_size=3 +action_decision_vector="nothing","passive","active" +terrident={"name","identifier" +"Inaccessible","i" +"Lake","+" +"Ocean"," " +"Deep Ocean",":" +"Glacier","a" +"Desert","d" +"Forest","f" +"Grassland","g" +"Hills","h" +"Jungle","j" +"Mountains","m" +"Plains","p" +"Swamp","s" +"Tundra","t" +} + +[game] +server_state="S_S_INITIAL" +meta_patches="none" +meta_server="http://meta.freeciv.org/metaserver.php" +id="" +serverid="" +level="Normal" +phase_mode="Concurrent" +phase_mode_stored="Concurrent" +phase=0 +scoreturn=20 +;timeoutint=0 +;timeoutintinc=0 +;timeoutinc=0 +;timeoutincmult=1 +;timeoutcounter=1 +turn=0 +year=-4000 +year_0_hack=FALSE +;globalwarming=0 +;heating=0 +;warminglevel=8 +;nuclearwinter=0 +;cooling=0 +;coolinglevel=8 +;random_seed=1499292452 +global_advances="1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +save_players=FALSE +save_known=FALSE + +[random] +saved=FALSE + +[script] +code=$$ +vars=$$ + +[settings] +set={"name","value","gamestart" +;LONGTURN SERVER SETTINGS: prevents overriding .serv file +;######################################################## +"compresstype", "xs", "xs" +;"allowtake", "", "" +"autotoggle",FALSE,FALSE +"netwait",150,150 +"pingtime",30,30 +"pingtimeout",240,240 +"maxconnectionsperhost",500,500 +"threaded_save","ENABLED","ENABLED" +"scorelog","DISABLED","DISABLED" +"saveturns",1,1 +"autosaves","TURN|TIMER","TURN|TIMER" +"savefrequency",60,60 +"metaconnection","persistent","persistent" +"fixedlength","ENABLED","ENABLED" +"ec_chat","ENABLED","ENABLED" +"ec_info","ENABLED","ENABLED" +"ec_max_size",5000,5000 +"ec_turns",7,7 +;LONGTURN TIME CONTROL OVERRIDES +;################################ +"timeout",82800,82800 +"first_timeout",164400,164400 +;COMMENT OUT MOST SETTINGS, TO LET RULESET and SERV file keep their defaults: +;########################################################################################## +"aifill",20,20 +;"alltemperate",FALSE,FALSE +"flatpoles",100,100 +"generator","SCENARIO","RANDOM" +"landmass",45,30 +"mapseed",0,0 +"mapsize","FULLSIZE","FULLSIZE" +"maxplayers",180,180 +"nationset","all","all" +"naturalcitynames",FALSE,FALSE +;"metamessage","Scenario: Europe","" +;"revolentype","RANDOM","RANDOM" +"separatepoles",TRUE,TRUE +"singlepole",FALSE,FALSE +"size",18,4 +;"startpos","DEFAULT","DEFAULT" +;"startunits","DDDwwwAccca","DDDwwwAccca" +;"steepness",30,30 +"teamplacement","CLOSEST","CLOSEST" +;"techlevel",0,0 +;"temperature",50,50 +"tilesperplayer",250,250 +"tinyisles",FALSE,FALSE +"topology","","" +;"victories","SPACERACE|ALLIED","SPACERACE|ALLIED" +"wetness",100,100 +"xsize",90,90 +"ysize",60,60 +} +set_count=72 +gamestart_valid=FALSE + +[ruledata] +government={"name","changes" +"Anarchy",0 +"Despotism",0 +"Monarchy",0 +"Communism",0 +"Republic",0 +"Democracy",0 +} + +[map] +have_huts=TRUE +have_resources=FALSE +t0000="+pmggh gpmphpgh ppppggddgh+hfgddfhdggpdgghpphhgdhfhfffph" +t0001="mhpg pgpgpggpggpffggdgffffffgfpg sppmdghm hpgpmghfmgphfmdmfpgmmpggggppgmddmffffhgh" +t0002=" pgpghhhmhhhfpfgppgffpmphdgmgff sps sspsg p fdgpmmhgpgggggpffp " +t0003=" gs gggfpghmgpfhhhghggpffphpggpgfdgf f ffff p gfpdphhhfppppdppss " +t0004="ggggpgffpghgpgfhpmhhgfppppgpgppgfgpp j ssfsfp shf ggsfpgpmfffgs g" +t0005="sgffgpfhfhghphppghmhmhffppffggsspgspgp ggfp shfgmhpg p fpdmhpm sg gpgsssg" +t0006="gpggpgfghhdhfhppgddpmffffgpgpphddfgsg gggfp+ppp g pfpfffs gmppghhf ggg s+ssspg" +t0007="ghgdpggmhppgdghhmhdfgpgppppspgpfpdddffffpgffpsgpgp gg g ppfddd p dpdggpg" +t0008="fhpddfhhghpgfmgmdpdfpgpgpppfpphfgdddggpfddgdgpffh dfdpp g ffspggfpp ffghmmpfppgp" +t0009="fmhhgfmhpgphhgdmdgpppsdhggpgddpgppmpppddgfhppgfg phdgggss s f p ffsppgsp pfffgmhmgpgg" +t0010="gmhphhmdphpgphhhfpssgpppssspggmfssssffpffgppphfff ggfgfgp f pff ggfssssss gfgpmhmhfpgpg" +t0011="+ggffgmphpghmhhhffddsgghpphdppgdfsgsssfpddpgpgff fgpfghfdfffphgf ss hfffg gpgppgphgpfgh" +t0012="+gpfphhmgggmhfgggppppgpgggdggfpdpff+phgssgsspsgs fsggfpggppsfpp f gpf gpgspfgffpp" +t0013="gggghhffhghhdgggmppffggpppfs gppffs+ffpssg s fppppdgggpgpsp fffgpgp" +t0014="fpghhffghpgg+pfphfhfpgpppp g ggspfsffpg fpggpppgfpppss sh ffgpdpp" +t0015="fgfhhhhmhhhggphhhhggffppgpppg gfssp gp pfgpghfffpgggff jf gs sgpsdds" +t0016="gsfpggmhpggmhdhghmhggggppfghfg p p pfgggfhgddgfppf jjh g gssggs" +t0017="pffggpphhphhghhghphhpggsfsff jh sf ggpgfssgfhfggfgfphfggfpfp p gsssfgs" +t0018="hpppdhhmfhpmffpghhphgppgf sp s pppghpspggfdgfgpdppfppsfhss s sffgf" +t0019="pgsggmmhhhhmfmmhghgghmgpsp fgpgghpgppggpdpgpppgggppf+ppppp p" +t0020="gggfpsppdfdphhhmghhhhhmgsg sff sss pspgggpggpfdggfpghggpfs+pgphs pfspspffd " +t0021=" ggffsppgpdfphggghmhhhhdgg pf pgpgpgspghggppfsgfsdghhmgmppgggfpggsp+sgmpp pppfffssmpps " +t0022=" sspgpdpghphhgghhfpgpp fgggppggggffgppgsspfggdgmhghfdgmgfpss+gggf p pfpsspphpgsgggpps" +t0023="m ppfggpdhgghffhmhggg phddmppghppfffffffppghpmhmhggppggfpggggpgp sffphpppmsfpfgfp+" +t0024="p p gpghhpghhhhhmmpd phghmgmhmfddfdpfddpgpppmpfhhmgfgggfgddfppgffgp gsggffppgpfhpf+++p" +t0025="pf pp ggggfppfmpggpppd pmmfhhfhfgffdpppmhgphhmfffpghhhhmhhggggspff ffsdgsfhpdsssgpgp+s" +t0026="pffmp pg sgfgffpgffgg ffgpmfphmhhfhmhhfmghhgggfghggpghgmgghdfpgf ppdddfsgppdfpppphpgh" +t0027="gffgp ddpggsfgg ffphhgpgphhffpgpfpfhmggmmmmhhhghmdmhhhhgdgffpgpgffppgpppsppfsss" +t0028="+fffg gdgmsgffh dhfmmpmdmhghfhhhhhphhmgffffpppggpmhgggfhgggfhggggffgpgppgpsggpfs" +t0029="ff fggspgff gdfpmmhdphppgphhgpmghgfffghmhgfhhhhpghhpgdgffhhpggffhhggppsspgpm" +t0030="f g g p fhgfggfg gdhhgpppgfhghmdfmhpmhhhhmggggpfffhpmmphghmhmmggfhhgfddgffffsg++f" +t0031="fgm gssghgpg pfppff dhgpffmmghhfdhdffhmhhhhpghghhmpphgpphmphhmmgppggfmpgpgdfddgsg++p" +t0032=" hgppg sppg sssffp gphmdgghhmmfhgfhghphmpppddgdpghhhpgpppmhhdhpfgpffpppggppmdfpp+ppg" +t0033="pg gss ssgh p g fggphmphphpghgffpggdphpgppfgdppphgddpghmhgphdfgpfppphgpphfgfsg++pg" +t0034="p g pp+ppgf sffpgmgmmhmhphmhhhmpgdgsgpfpgpgfffpdddghphhgdgpdf hpmppffggp++ff" +t0035="ddfp sgghp ggpghmfmfhpdhpgpgpdpppgppgf+fsfpffgdpfhhhhhppgdd h mhgggfsspggfp" +t0036="ggppg f pp gff shg pdpggmhmfphhmhmmggdppfp sfhpfsssssfpgpfpgggpppdd s s hhpgdpfpgpg" +t0037="pgpsp sppggf ps hmfs dpf hhgh f ffgpsggppghhmhhhh ff hhfdpfgdfg" +t0038="hffpg g++php ghg g fh m pgpggp spgphpghmpgmh ggh mfddppdfp" +t0039="mdghg pgg+fss dgdppfhg h mgdpgfsss hhh p dp phhhgfpdmg" +t0040="hfggf dfff+sss ggffggdhmhm mpdgpggpss pppdffghhppp s hmhhddpdmh" +t0041="gdf+fg mpf++gssgdmfhffpffphhhhphddddgghpggggpf fggsspfppdfmfpphhpmgpd h mppgpggppf" +t0042="gs++fg ppfg+ggffppmsssdffhfffhmhhmffpmmgffggdgsgp s++pfdfdggfhhmhdhfdddm ggdgpg" +t0043="pgffgp hfpgphggspsspgfggmfhhpghppfhhgggffpgpgs s gsgppgggfdmhhhggfhhfffmff pgg pp" +t0044="gffgss gshpghgspfssspdddghfhpphfhmphpghmhmpgps ff fffggggppggdfphpfffffffghhpghphmpggpf f" +t0045=" pfpgg gsggpgppgpfghggpfghfhphhhpmhhmhgppggggpfppgpppphffgmgghgppghpddhfffhpgmppdhhhpfgg " +t0046=" pggg fffsm+gpfhpgpfdpdhmpphgghphghhhgmmhfgdphhhhpmhhhmhhhhhhghpmddgfphhhfhphdfmgdgpggp" +t0047=" ssp pffsssssggdfffggffpmgphhmghgpphhmphmhggmhmgpmhhmhmhphdddhhffhpmffmghhfpghdpmpggpfgg" +t0048=" ss sffpfssgppgffgpdppphhmppmfhfmghpmhfffghfhmfgdpdhggdmgghdmpmmhdppghghhpghhgdgghhgffg " +t0049=" g hgsffppppfgggfgpgpppgmhhhpdgmfgfffhmghpmmfmhfgmpffghdddhdddddhphhhgphgpmpffffhphpffssp" +t0050=" ppfpphpppmhpffpppgdppgphhhhpphggfhhggffdfghhpmphghpgghphpggggmdhfmphppfmfhffphhhpggg " +t0051=" gpp+gphmhdfpppdgfpppppgmddhhhmhhmmmmfpfdfhfhpdpgpghfpghhpppfgpgmmpgpfhffghpmhmggpp " +t0052=" ppgpgffpfgpphfggpphpgfgdphgpphhdggspffffhffhhhfhphffhmhddhfffgghhhpphfdhmghhgggss " +t0053=" m fffpgfdfphhpgppppdghggmpmghgphpffppspfgdpmddfhdpdhhffhgpfhgpphphmpgdhmphmhhhgfpp s " +t0054=" m ggppphdpppppfphhfgpghphpgdpdgsgppfgdpggddpdpgppgmhhpghfhffggpgmhhgpffhhpgfppg " +t0055=" ffgpgpfgsfgmggfpffpfsfppggpfffppppg+ggfhpppppgddgpfpgppppgmmmmhmhpmmpgpgpggdfffpd " +t0056=" fgppfffgppghmmhpgpp++++gff+ffgpddggs++gpfpsffghppffg+sgpgsppmmmppffppgffsphhhppfgg " +t0057=" gggggpgghfdhhhhmhhppgpgpgsf+fgphpphgggpggpppgsffppgpfg++++ssspgpmdffffgpsgfppfhhhgpsg " +t0058="pgghgghmggpffdfffgpgpfffgmhggpgpggpggggpmfdhggddhhpmhghpppddfmffgggpfffffpphghdddgggpddmhh" +t0059="+ddgpdghgmhfffghpppgpfpfphmphh+mhhdff++hffffffdmpghffhhfhghm+gmpggggffpfppfghffgppgddddpdp" +startpos_count=20 +startpos={"x","y","exclude","nations" +55,2,FALSE,"" +20,14,FALSE,"" +2,40,FALSE,"" +31,31,FALSE,"" +36,10,FALSE,"" +68,19,FALSE,"" +76,46,FALSE,"" +53,15,FALSE,"" +18,27,FALSE,"" +69,59,FALSE,"" +7,3,FALSE,"" +0,16,FALSE,"" +59,45,FALSE,"" +72,2,FALSE,"" +32,45,FALSE,"" +45,51,FALSE,"" +77,31,FALSE,"" +19,51,FALSE,"" +54,30,FALSE,"" +22,2,FALSE,"" +} +e00_0000="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0001="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0002="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0003="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0004="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0005="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0006="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0007="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0008="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0009="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0010="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0011="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0012="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0013="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0014="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0015="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0016="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0017="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0018="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0019="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0020="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0021="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0022="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0023="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0024="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0025="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0026="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0027="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0028="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0029="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0030="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0031="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0032="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0033="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0034="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0035="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0036="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0037="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0038="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0039="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0040="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0041="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0042="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0043="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0044="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0045="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0046="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0047="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0048="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0049="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0050="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0051="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0052="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0053="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0054="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0055="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0056="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0057="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0058="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e00_0059="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0000="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0001="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0002="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0003="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0004="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0005="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0006="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0007="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0008="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0009="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0010="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0011="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0012="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0013="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0014="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0015="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0016="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0017="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0018="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0019="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0020="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0021="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0022="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0023="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0024="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0025="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0026="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0027="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0028="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0029="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0030="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0031="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0032="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0033="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0034="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0035="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0036="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0037="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0038="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0039="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0040="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0041="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0042="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0043="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0044="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0045="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0046="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0047="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0048="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0049="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0050="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0051="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0052="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0053="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0054="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0055="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0056="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0057="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0058="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e01_0059="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0000="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0001="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0002="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0003="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0004="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0005="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0006="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0007="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0008="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0009="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0010="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0011="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0012="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0013="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0014="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0015="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0016="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0017="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0018="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0019="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0020="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0021="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0022="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0023="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0024="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0025="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0026="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0027="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0028="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0029="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0030="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0031="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0032="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0033="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0034="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0035="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0036="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0037="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0038="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0039="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0040="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0041="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0042="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0043="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0044="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0045="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0046="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0047="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0048="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0049="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0050="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0051="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0052="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0053="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0054="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0055="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0056="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0057="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0058="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e02_0059="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e03_0000="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e03_0001="000000020000200020220000200000002200000000000000000000000000000000000000000000000000000000" +e03_0002="000000020000200000022222200000000200000000000000000000000000000000000000000000000000000000" +e03_0003="000022220000220000000002000000020200000000000000000000000000000000000000000022220000000000" +e03_0004="000000022000022000000002000002222200000000000000000000000000000000000000000000022000000000" +e03_0005="000000002000002200000002000002002000000000000000000000000000000000000000000000000000000000" +e03_0006="000000002200000220000002000000002222200000000000000000000000000000000000002000000000000000" +e03_0007="000000000200000020000002000000000000000000000000000000000000000000000002222000000000000000" +e03_0008="000000002200000022000002000000000000000000000000000000000000000000000000000000000000000000" +e03_0009="000000002200000002200000000000000000000000000000000000000000000000000000000000000000000000" +e03_0010="000000022000000000220000000000000000000000000000000000000000000000000000000000000002000000" +e03_0011="022222000000000000022000000000000000000000000000000000000200000000000000000000000002000000" +e03_0012="000000000000000000002000000000000000000000000000000000002200000000000000000000000022000000" +e03_0013="000000000000000000002220000000000000000000000000000000002000222000000000000000000000000000" +e03_0014="000000000000000000002000000000000000000000000000000002002000000000000000000000000000000000" +e03_0015="000000000000000000222000000000000000000000000000000222202000000000000000000000000000000000" +e03_0016="000000000002200000000000000000000000000000000000000000200000000000000000000000000000000000" +e03_0017="000000000000200000000000000000000000000000000000000000220002000000000000000000000000000000" +e03_0018="000000000000200000000022200000000000000000000000000000022222000000000000000000000000000000" +e03_0019="000000000000220000000000000000000000000000000000020000000020000000000000000000000000000000" +e03_0020="000000000000200000000000000000000000000000002200020000000222020000000000000000000200000000" +e03_0021="000000000000200000000000000000000000000000000222220000002202002000000000000000200200000000" +e03_0022="000000000000200000000000000000000000000000000000000000002000002200000000000000200200000000" +e03_0023="000000000000200000000000000000000000000000000000000000022000000020000000000000200000000000" +e03_0024="000000000000200000000000000000000000000000000000000000220000000022000000000002200000000000" +e03_0025="000000000000200000000000000000000000000000000000022222200000000002200000000022000000000000" +e03_0026="000000000000000000000000000000000000000000000000020000000200000000222000000220000000000000" +e03_0027="000000000000000000000000000000000000000000022000020000000200000000200000000200000000000000" +e03_0028="000000000000000000000000000000000000000000002200020000002200000000200000022200000000000000" +e03_0029="000000000000000000000000000000000000020000000222220000022000000000220000020000000000000000" +e03_0030="000000000000000000000000000000022222220000000000000022220000000000020000020000000000000000" +e03_0031="000000000000000000000000000000220020022000000000000020000000020000000000220000000000000000" +e03_0032="000000000000000000000000000000200000002200020000000020000000220000000000200000000000000000" +e03_0033="000000000000000000000000000000200000000222220000000020000000200000000000222000000000000000" +e03_0034="000000000000000000000000222220200000000000022000000020000000200000000000000000000000000000" +e03_0035="000200000000000000000000002000000000000000002000000020000000200000000000000000000000000000" +e03_0036="000200000000000000000000002000000000000000002000000000000000200000000000000000000000000000" +e03_0037="000000000000000000000000002200000000000000000000000000000002200000000000002200000000000000" +e03_0038="000000000000000000000000000002000000000000000000000000000002000000000000000200000000000000" +e03_0039="000000000000000000000000000000000000022222220000000000000000000000000000000200000000000000" +e03_0040="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e03_0041="000000000000000000000200000000000000000000000000000000000000000000000000200000000000000000" +e03_0042="000000000000000000000222200000000000000000000000000000000000000000000002200000000000000000" +e03_0043="000000000000000000000000200002220000000000000000000000000000000000000002000000000000000020" +e03_0044="000000000000000000000002200022020000000000022200002200000000000000000002000000000000022000" +e03_0045="000000000000000000000002000020020000000002220000000220000000000000000222200000000000020000" +e03_0046="000000000000000000000222000000022000000022000000000000000000000000002200220000000002222000" +e03_0047="000000000000000000002200000000002200000020000000000000000000000000000000020022200000000000" +e03_0048="000000000000000002222000000000000200000000000000000000000022200000000000022220002200000000" +e03_0049="000000000000000002000000000000000222200000000000000222000220222000000000020000222000000000" +e03_0050="000000000000000002022220000000002200000000000000000002022200002220000000022000020000000000" +e03_0051="000000000000000002220022222220022000000000000222000002220020000020000000002022220000000000" +e03_0052="000000000000000000000002000022220000000000002202000000200022000000222200002220200000000000" +e03_0053="000000000000000000000002220000000000000000000022000000200002222002200200000000200000000000" +e03_0054="000000000002000000000002000200000000000000022220000000200000002222000200000000200000000000" +e03_0055="000000000002222220000022000200200000000000020022020000220000002000000000000000200000000000" +e03_0056="000000000000000000000020000000200000000000000002220000022200002000000000000222200000022200" +e03_0057="000000000000000000000020020000000000000000000000000000000000022220000022222200000000020000" +e03_0058="000000000000000000000022020000000000000000000000000000000000000020000220200000000000020000" +e03_0059="000000000000000000000002220000000000000000000000000000000000000022222200200000000022220000" +e04_0000="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0001="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0002="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0003="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0004="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0005="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0006="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0007="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0008="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0009="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0010="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0011="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0012="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0013="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0014="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0015="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0016="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0017="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0018="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0019="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0020="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0021="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0022="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0023="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0024="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0025="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0026="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0027="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0028="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0029="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0030="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0031="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0032="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0033="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0034="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0035="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0036="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0037="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0038="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0039="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0040="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0041="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0042="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0043="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0044="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0045="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0046="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0047="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0048="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0049="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0050="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0051="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0052="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0053="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0054="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0055="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0056="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0057="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0058="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e04_0059="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0000="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0001="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0002="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0003="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0004="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0005="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0006="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0007="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0008="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0009="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0010="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0011="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0012="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0013="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0014="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0015="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0016="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0017="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0018="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0019="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0020="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0021="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0022="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0023="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0024="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0025="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0026="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0027="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0028="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0029="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0030="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0031="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0032="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0033="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0034="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0035="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0036="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0037="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0038="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0039="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0040="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0041="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0042="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0043="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0044="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0045="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0046="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0047="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0048="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0049="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0050="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0051="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0052="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0053="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0054="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0055="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0056="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0057="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0058="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e05_0059="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0000="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0001="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0002="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0003="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0004="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0005="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0006="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0007="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0008="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0009="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0010="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0011="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0012="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0013="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0014="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0015="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0016="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0017="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0018="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0019="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0020="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0021="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0022="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0023="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0024="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0025="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0026="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0027="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0028="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0029="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0030="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0031="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0032="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0033="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0034="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0035="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0036="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0037="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0038="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0039="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0040="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0041="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0042="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0043="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0044="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0045="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0046="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0047="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0048="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0049="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0050="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0051="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0052="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0053="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0054="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0055="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0056="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0057="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0058="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e06_0059="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0000="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0001="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0002="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0003="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0004="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0005="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0006="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0007="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0008="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0009="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0010="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0011="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0012="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0013="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0014="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0015="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0016="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0017="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0018="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0019="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0020="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0021="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0022="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0023="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0024="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0025="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0026="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0027="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0028="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0029="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0030="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0031="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0032="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0033="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0034="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0035="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0036="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0037="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0038="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0039="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0040="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0041="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0042="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0043="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0044="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0045="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0046="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0047="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0048="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0049="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0050="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0051="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0052="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0053="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0054="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0055="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0056="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0057="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0058="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e07_0059="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0000="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0001="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0002="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0003="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0004="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0005="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0006="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0007="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0008="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0009="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0010="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0011="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0012="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0013="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0014="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0015="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0016="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0017="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0018="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0019="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0020="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0021="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0022="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0023="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0024="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0025="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0026="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0027="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0028="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0029="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0030="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0031="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0032="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0033="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0034="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0035="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0036="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0037="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0038="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0039="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0040="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0041="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0042="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0043="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0044="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0045="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0046="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0047="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0048="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0049="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0050="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0051="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0052="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0053="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0054="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0055="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0056="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0057="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0058="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +e08_0059="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + + +[history] +turn=-2 + +[mapimg] +count=0 diff --git a/freeciv/freeciv/data/stdsounds.soundspec b/freeciv/freeciv/data/stdsounds.soundspec index 3b504adf6..03cbffba1 100644 --- a/freeciv/freeciv/data/stdsounds.soundspec +++ b/freeciv/freeciv/data/stdsounds.soundspec @@ -9,6 +9,7 @@ artists = "\ OpenQuartz - Frank Condello (pox@planetquake.com) [pox]\ Warzone - Eidos Entertainment (GPL release) [warzone]\ Eskapada - eskapada@o2.pl (Public Domain) [jt]" + Lexxie - Public domain sound files obtained by { Lexxie } ; For a list of tags used see README.sound, buildings.ruleset and ; units.ruleset. @@ -290,6 +291,7 @@ e_bad_command = "stdsounds/illegal.ogg" ; [fcol] ;e_hut_merc = "" ;e_hut_settler = "" ;e_hut_tech = "" +;e_hut_map = "" ;e_imp_auctioned = "" ;e_imp_auto = "" ;e_imp_build = "" diff --git a/freeciv/freeciv/data/webperimental/game.ruleset b/freeciv/freeciv/data/webperimental/game.ruleset index e3233ddcf..37c571787 100644 --- a/freeciv/freeciv/data/webperimental/game.ruleset +++ b/freeciv/freeciv/data/webperimental/game.ruleset @@ -1259,7 +1259,8 @@ actor_reqs = action = "Upgrade Unit" actor_reqs = { "type", "name", "range", "present" - "DiplRel", "Foreign", "Local", FALSE + "DiplRel", "Foreign", "Local", FALSE + "CityTile", "Center", "Local", TRUE } [actionenabler_airlift_light_unit] diff --git a/freeciv/freeciv/data/wonders/commissariat.png b/freeciv/freeciv/data/wonders/commissariat.png new file mode 100644 index 000000000..d83fd559d Binary files /dev/null and b/freeciv/freeciv/data/wonders/commissariat.png differ diff --git a/freeciv/freeciv/data/wonders/leibniz_university.png b/freeciv/freeciv/data/wonders/leibniz_university.png new file mode 100644 index 000000000..ba9acc667 Binary files /dev/null and b/freeciv/freeciv/data/wonders/leibniz_university.png differ diff --git a/freeciv/freeciv/data/wonders/propagandaministry.png b/freeciv/freeciv/data/wonders/propagandaministry.png new file mode 100644 index 000000000..7f200f919 Binary files /dev/null and b/freeciv/freeciv/data/wonders/propagandaministry.png differ diff --git a/freeciv/freeciv/doc/README.effects b/freeciv/freeciv/doc/README.effects index 2ffb813b7..2012b866e 100644 --- a/freeciv/freeciv/doc/README.effects +++ b/freeciv/freeciv/doc/README.effects @@ -107,7 +107,7 @@ UnitClass: Local UnitClassFlag: Local UnitFlag: Local UnitState: Local "Transported", "OnLivableTile", "Transporting", "OnDomesticTile", "HasHomeCity", - "OnNativeTile", New in 3.1: "InNativeExtra", "MovedThisTurn"; FCW: "Fortified" + "OnNativeTile", New in 3.1: "InNativeExtra", "MovedThisTurn"; FCW: "Fortified" (deprecated, use "Activity") UnitType: Local @@ -152,6 +152,22 @@ Action_Resist_Pct instead of the actor, and the value is subtracted rather than added. NOTE: unit ranges still pertain to actor, not target. +Actor_Bribe_Cost_Pct + Increases the actor player's cost of bribing units by this amount percent. + Use negative numbers to decrease the bribe cost. Note: "Unit_Bribe_Cost_Pct" + is the cost modifier based on the victim unit and the victim player. + With "Actor_Bribe_Cost_Pct", the Player and Unit reqs refer to + the actor player and unit. The city req refers to the home city of the + actor unit. + +Actor_Incite_Cost_Pct + Increases the actor player's cost of inciting cities by this amount percent. + Use negative numbers to decrease the incite cost. Note: "Incite_Cost_Pct" + is the cost modifier based on the player and city who are the victim of + the incite action. With "Actor_Incite_Cost_Pct", the Player and Unit reqs + refer to the actor player and unit. The city req refers to the home city + of the actor unit. + Airlift Allow airlift to/from a city. @@ -160,7 +176,8 @@ Any_Government Attack_Bonus Increases offensive bonuses of units. Unit requirements on this effect are - the attacking unit itself. + the attacking unit itself. Evaluations of the tile (Terrain flag, etc.) + resolve to the tile where the battle happens (i.e. defender's tile.) Border_Vision Give vision on all tiles within the player's borders. Happens during @@ -197,16 +214,17 @@ Capital_City The city with this effect is the capital city. Action_Success_Actor_Move_Cost - The number of move fragments lost when a unit successfully performs an -action. Evaluated and done after the action is successfully completed. Added + The number of move fragments lost when an actor unit successfully performs +an action. Evaluated and done after the action is successfully completed. Added on top of any movement fragments the action itself subtracts. Action_Success_Target_Move_Cost The number of move fragments subtracted from a unit when someone -successfully performs an action on it. Evaluated and done after the action +successfully performs an action on it. Req scope is evaluated upon +the target (not the actor). Evaluated and done after the action is successfully completed. Added on top of any movement fragments the -action itself subtracts. Only supported for actions that targets an -individual unit. (See doc/README.actions) +action itself subtracts. Only supported for actions that target +individual units (e.g., "Transport Unload"). (See doc/README.actions) Casus_Belli_Caught Checked when a player is caught trying to do an action. Will cause an @@ -222,6 +240,12 @@ Casus_Belli_Success A value of 1000 or higher is international outrage. International outrage gives every other player a casus belli against the actor. +Celebrate_Size_Add + Add this value to the base size at which cities may celebrate. For example, + if cities.ruleset has celebrate_size_limit = 3, then a negative value will + lower the limit and a positive value will raise the limit, when this effect's + requirements are triggered. + City_Image The index for the city image of the given city style. @@ -255,6 +279,9 @@ Coinage_Bonus_Pm Combat_Rounds Maximum number of rounds combat lasts. Unit is the attacker. Zero and negative values mean that combat continues until either side dies. + Local tile reqs resolve to the tile the battle is fought on; that is, + the defender's tile. Thus a ruleset can reduce combat_rounds for + contexts like non-native attacks, attacking vs. mountains, etc. Conquest_Tech_Pct Percent chance that a player conquering a city learns a tech from the @@ -348,7 +375,8 @@ Improvement_Sale_Pct to gold when the building is sold. Incite_Cost_Pct - Increases revolt cost by amount percent. + Increases revolt cost by amount percent. Reqs refer to the scope of the + victim player and city. See also, "Actor_Incite_Cost_Pct". Inspire_Partisans Partisan units (defined in units.ruleset) may spring up when this player's @@ -434,7 +462,10 @@ Not_Tech_Source Tech cannot be received from this player by any means. Nuke_Proof - City is nuke proof. + The percentage chance the city will absolutely prevent nuclear explosions + from taking place on all tiles whose distance from the city center are 2 + or less: that is, within the 5x5 square whose center is the city tile. + (see also: Tile_Nuke_Proof) Output_Add_Bonus City production is increased by adding raw amount. This happens prior @@ -474,6 +505,15 @@ Output_Waste Output_Waste_Pct Reduce waste by amount percent. +Output_Waste_Min_Reduce + The raw minimum value by which to reduce Output Waste (if Output_Waste_Pct + doesn't reduce by more than this value, it will be reduced by this amount + instead.) + +Output_Waste_Reduce + A raw value by which to reduce Output Waste. It will stack with Output_Waste_Pct + but together will never reduce the waste to below 0. + Output_Waste_By_Distance For each tile in real distance that a city is from nearest Government Center, it gets amount / 100 of extra waste. @@ -509,6 +549,41 @@ Pollu_Prod_Pct Rapture_Grow Can rapture grow cities. +Rapture_Rate_Pm + The turn frequency rate at which a city raptures (under rapturedelay==1) + 1000: Every turn + 667: Two out of three turns. + 500: Half the turns, etc. + NOTE: for backward compat, a rate of 0 is treated as the formerly + hard-coded assumption that the rate is 1000pm. + +Raze_Building_Pct + Increases or decreases the chance of each building being lost when + a city is conquered. (Modifies 'razechance' by amount percent.) Req + scope only accesses the conquering player and the target city. Effect + is applied AFTER ownership of city is transferred: "OwnedByOriginal" + indicates liberation of a city originally built by the conqueror. + "Building", "Local" modifies the chance of the exact building itself + being razed. Razings occur in an iteration loop: if you check for the + presence of "Building", "City" and that indicated building is razed, all + buildings iterated afterward aren't affected by whatever bonus it had. + _Illegal scopes_: + Units and Victim Players. + +Rehome_Pct + Units who would disband after their homecity is conquered, have this + value's percent chance to rehome to the nearest legal domestic city, + instead of disbanding. Use 0 for never, 100 for always, and 1-99 to set + random odds. + _Req scopes_: + Player: the owner of the unit (victim player). (Can test govs, not wonders.) + _Local scopes_: + Unit: the unit who will be disbanded or re-homed. + Tile: the tile the unit is currently on. + _Illegal scopes_: + "City" - City scope is not tested due to the states of flux on unit + homecity, city survival, and city ownership. + Retire_Pct The chance that unit gets retired (removed) when turn changes. Retirement only happens if there are no enemy units or cities within @@ -598,6 +673,10 @@ Terrain_Defend_Add_Bonus NOTE: (For unit classes with "TerrainDefense" flag, this effect can be used to add other defense effects.) +Tile_Nuke_Proof + The percent chance that a tile and all its unit occupants will survive + a nuclear blast. (see also Nuke_Proof) + Tile_Workable If value > 0, city can work target tile. @@ -633,7 +712,8 @@ Unit_Buy_Cost_Pct Unit_Bribe_Cost_Pct Increases unit bribe cost by amount percent. Requirements are from the - point of view of the target unit, not the briber. + point of view of the target unit, not the briber. See also, + "Actor_Bribe_Cost_Pct". Unit_No_Lose_Pop No population lost when a city's defender is lost. diff --git a/freeciv/freeciv/server/actiontools.c b/freeciv/freeciv/server/actiontools.c index 747b7269c..69750e035 100644 --- a/freeciv/freeciv/server/actiontools.c +++ b/freeciv/freeciv/server/actiontools.c @@ -101,6 +101,45 @@ void action_success_actor_price(struct action *paction, action_success_pay_mp(paction, actor_id, actor); } +/**********************************************************************//** + Gives casus belli to a victim's allies also. Currently called based + on whether game.server.casusbelli_allies is set. +**************************************************************************/ +void action_give_casus_belli_to_allies(struct player *offender, + struct player *victim_player) +{ + int cb_now; + int cb_turns = game.server.casusbelliturns; + + /* Go through all players to find allies of the victim */ + players_iterate(ally) { + if (ally != offender && ally != victim_player) { + /* We found a "third party player" who is an ally of the victim: */ + if (pplayers_allied(ally, victim_player)) { + cb_now = player_diplstate_get(ally, offender)->has_reason_to_cancel; + /* A fresh new casus belli deserves a notification to the recipient*/ + if (player_diplstate_get(ally, offender)->has_reason_to_cancel==0) { + notify_player(ally, NULL, + E_DIPLOMATIC_INCIDENT, ftc_server, + _("[`warning`] The %s gave our %s allies casus belli. We now have " + " casus belli also."), + nation_plural_for_player(offender), + nation_adjective_for_player(victim_player)); + } + // At minimum, reset has_reason_to_cancel to game.server.casusbelliturns, + // since it is also a counter that decrements every turn until casus belli + // expires. If it is at or above that number, simply add +1 to it. + if (cb_now < cb_turns) { + player_diplstate_get(ally, offender)->has_reason_to_cancel = cb_turns; + } else if (cb_now >= cb_turns) { + player_diplstate_get(ally, offender)->has_reason_to_cancel++; + } + player_update_last_war_action(ally); + } + } + } players_iterate_end; +} + /**********************************************************************//** Give the victim a casus belli against the offender. **************************************************************************/ @@ -127,6 +166,19 @@ static void action_give_casus_belli(struct player *offender, } */ + /* Team Members can never be at war nor have casus belli (I think?) */ + if (victim_player && + player_diplstate_get(offender, victim_player)->type == DS_TEAM) { + return; + } + + /* Server setting game.server.casusbelli_allies gives casus belli to + the victim's allies also: */ + if (victim_player && offender != victim_player // pillage your own tile = no casus belli + && game.server.casusbelli_allies) { + action_give_casus_belli_to_allies(offender, victim_player); + } + if (int_outrage) { /* This action is seen as a reason for any other player, no matter who * the victim was, to declare war on the actor. It could be used to @@ -321,7 +373,7 @@ static void notify_actor_caught(struct player *receiver, notify_player(receiver, victim_tile, E_DIPLOMATIC_INCIDENT, ftc_server, /* TRANS: Suitcase Nuke ... Copenhagen */ - _("⚠️ You caused an incident " + _("[`warning`] You caused an incident " " trying to %s at %s"), action_name_translation(paction), victim_link); @@ -331,7 +383,7 @@ static void notify_actor_caught(struct player *receiver, notify_player(receiver, victim_tile, E_DIPLOMATIC_INCIDENT, ftc_server, /* TRANS: Bribe Enemy Unit ... Danish */ - _("⚠️ You caused an incident " + _("[`warning`] You caused an incident " " trying to %s against the %s."), action_name_translation(paction), victim_link); @@ -342,7 +394,7 @@ static void notify_actor_caught(struct player *receiver, notify_player(receiver, victim_tile, E_DIPLOMATIC_INCIDENT, ftc_server, /* TRANS: Explode Nuclear ... Danish */ - _("⚠️ You caused an incident " + _("[`warning`] You caused an incident " " trying to %s against the %s at" "" "{%d,%d}"), @@ -383,7 +435,7 @@ static void notify_victim_caught(struct player *receiver, notify_player(receiver, victim_tile, E_DIPLOMATIC_INCIDENT, ftc_server, /* TRANS: Europeans ... Suitcase Nuke ... San Francisco */ - _("⚠️ The %s caused an incident trying to" + _("[`warning`] The %s caused an incident trying to" " %s at %s."), nation_plural_for_player(offender), action_name_translation(paction), @@ -394,7 +446,7 @@ static void notify_victim_caught(struct player *receiver, notify_player(receiver, victim_tile, E_DIPLOMATIC_INCIDENT, ftc_server, /* TRANS: Europeans ... Bribe Enemy Unit ... Partisan */ - _("⚠️ The %s caused an incident trying to" + _("[`warning`] The %s caused an incident trying to" " %s to your %s."), nation_plural_for_player(offender), action_name_translation(paction), @@ -406,7 +458,7 @@ static void notify_victim_caught(struct player *receiver, notify_player(receiver, victim_tile, E_DIPLOMATIC_INCIDENT, ftc_server, /* TRANS: Europeans ... Explode Nuclear ... (54, 26) */ - _("⚠️ The %s caused an incident trying to " + _("[`warning`] The %s caused an incident trying to " " %s at " "" "{%d,%d}"), @@ -438,14 +490,14 @@ static void notify_global_caught(struct player *receiver, notify_player(receiver, victim_tile, E_DIPLOMATIC_INCIDENT, ftc_server, /* TRANS: Suitcase Nuke */ - _("⚠️ Getting caught trying to do %s gives " + _("[`warning`] Getting caught trying to do %s gives " "everyone casus belli against you."), action_name_translation(paction)); } else if (receiver == victim_player) { notify_player(receiver, victim_tile, E_DIPLOMATIC_INCIDENT, ftc_server, /* TRANS: Suitcase Nuke ... Europeans */ - _("👮‍♂️ Getting caught trying to do %s to you gives " + _("[`earth`] Getting caught trying to do %s to you gives " "everyone casus belli against the %s."), action_name_translation(paction), nation_plural_for_player(offender)); @@ -453,7 +505,7 @@ static void notify_global_caught(struct player *receiver, notify_player(receiver, victim_tile, E_DIPLOMATIC_INCIDENT, ftc_server, /* TRANS: Europeans ... Suitcase Nuke */ - _("👮‍♂️ You now have casus belli against the %s. " + _("[`earth`] You now have casus belli against the %s. " "They got caught trying to do %s."), nation_plural_for_player(offender), action_name_translation(paction)); @@ -461,7 +513,7 @@ static void notify_global_caught(struct player *receiver, notify_player(receiver, victim_tile, E_DIPLOMATIC_INCIDENT, ftc_server, /* TRANS: Europeans ... Suitcase Nuke ... Americans */ - _("👮‍♂️ You now have casus belli against the %s. " + _("[`earth`] You now have casus belli against the %s. " "They got caught trying to do %s to the %s."), nation_plural_for_player(offender), action_name_translation(paction), @@ -513,7 +565,7 @@ static void notify_actor_success(struct player *receiver, /* Ugly hack for the lack of "Unit Move" */ notify_player(receiver, victim_tile, E_DIPLOMATIC_INCIDENT, ftc_server, - _("⚠️ Invading %s territory has caused an incident."), + _("[`warning`] Invading %s territory has caused an incident."), nation_adjective_for_player(victim_player)); return; } @@ -524,7 +576,7 @@ static void notify_actor_success(struct player *receiver, notify_player(receiver, victim_tile, E_DIPLOMATIC_INCIDENT, ftc_server, /* TRANS: Suitcase Nuke ... San Francisco */ - _("⚠️ You caused an incident doing %s to the %s."), + _("[`warning`] You caused an incident doing %s to the %s."), action_name_translation(paction), nation_adjective_for_player(victim_player)); break; @@ -533,7 +585,7 @@ static void notify_actor_success(struct player *receiver, notify_player(receiver, victim_tile, E_DIPLOMATIC_INCIDENT, ftc_server, /* TRAND: Bribe Enemy Unit ... American ... Partisan */ - _("⚠️ You caused an incident doing %s to the %s."), + _("[`warning`] You caused an incident doing %s to the %s."), action_name_translation(paction), nation_adjective_for_player(victim_player)); break; @@ -543,7 +595,7 @@ static void notify_actor_success(struct player *receiver, notify_player(receiver, victim_tile, E_DIPLOMATIC_INCIDENT, ftc_server, /* TRANS: Explode Nuclear ... (54, 26) */ - _("⚠️ You caused an incident doing %s" + _("[`warning`] You caused an incident doing %s" " at " "{%d,%d}."), action_name_translation(paction), i_x, i_y); @@ -581,7 +633,7 @@ static void notify_victim_success(struct player *receiver, /* Ugly hack for the lack of "Unit Move" */ notify_player(receiver, victim_tile, E_DIPLOMATIC_INCIDENT, ftc_server, - _("⚠️ The %s invaded your territory, giving you casus belli."), + _("[`warning`] The %s invaded your territory, giving you casus belli."), nation_plural_for_player(offender)); return; } @@ -592,7 +644,7 @@ static void notify_victim_success(struct player *receiver, notify_player(receiver, victim_tile, E_DIPLOMATIC_INCIDENT, ftc_server, /* TRANS: Europeans ... Suitcase Nuke ... Copenhagen */ - _("⚠️ The %s caused an incident doing %s to %s!"), + _("[`warning`] The %s caused an incident doing %s to %s!"), nation_plural_for_player(offender), action_name_translation(paction), victim_link); @@ -602,7 +654,7 @@ static void notify_victim_success(struct player *receiver, notify_player(receiver, victim_tile, E_DIPLOMATIC_INCIDENT, ftc_server, /* TRANS: Europeans ... Bribe Enemy Unit ... Partisan */ - _("⚠️ The %s caused an incident doing " + _("[`warning`] The %s caused an incident doing " "%s to %s!"), nation_plural_for_player(offender), action_name_translation(paction), @@ -614,7 +666,7 @@ static void notify_victim_success(struct player *receiver, notify_player(receiver, victim_tile, E_DIPLOMATIC_INCIDENT, ftc_server, /* TRANS: Europeans ... Explode Nuclear ... (54, 26) */ - _("⚠️ The %s caused an incident doing %s" + _("[`warning`] The %s caused an incident doing %s" " at " "{%d,%d}"), nation_plural_for_player(offender), @@ -645,7 +697,7 @@ static void notify_global_success(struct player *receiver, /* Ugly hack for the lack of "Unit Move" */ notify_player(receiver, victim_tile, E_DIPLOMATIC_INCIDENT, ftc_server, - _("[`unitednations`]⚠️ Invading the %s gives the world casus belli against you!"), + _("[`unitednations`][`warning`] Invading the %s gives the world casus belli against you!"), nation_plural_for_player(victim_player)); return; } @@ -653,14 +705,14 @@ static void notify_global_success(struct player *receiver, notify_player(receiver, victim_tile, E_DIPLOMATIC_INCIDENT, ftc_server, /* TRANS: Suitcase Nuke */ - _("⚠️ Doing %s gives everyone casus belli against you."), + _("[`warning`] Doing %s gives everyone casus belli against you."), action_name_translation(paction)); } else if (receiver == victim_player) { if (paction == NULL) { /* Ugly hack for the lack of "Unit Move" */ notify_player(receiver, victim_tile, E_DIPLOMATIC_INCIDENT, ftc_server, - _("[`unitednations`]⚠️ The %s invasion of your territory gives the world casus belli against " + _("[`unitednations`][`warning`] The %s invasion of your territory gives the world casus belli against " "the %s!"), nation_adjective_for_player(offender), nation_plural_for_player(offender)); @@ -669,7 +721,7 @@ static void notify_global_success(struct player *receiver, notify_player(receiver, victim_tile, E_DIPLOMATIC_INCIDENT, ftc_server, /* TRANS: Suitcase Nuke ... Europeans */ - _("👮‍♂️ Doing %s to you gives everyone casus belli against " + _("[`earth`] Doing %s to you gives everyone casus belli against " "the %s."), action_name_translation(paction), nation_plural_for_player(offender)); @@ -678,7 +730,7 @@ static void notify_global_success(struct player *receiver, /* Ugly hack for the lack of "Unit Move" */ notify_player(receiver, victim_tile, E_DIPLOMATIC_INCIDENT, ftc_server, - _("[`unitednations`]⚠️ You now have casus belli against the %s. " + _("[`unitednations`][`warning`] You now have casus belli against the %s. " "They invaded."), nation_plural_for_player(offender)); return; @@ -686,7 +738,7 @@ static void notify_global_success(struct player *receiver, notify_player(receiver, victim_tile, E_DIPLOMATIC_INCIDENT, ftc_server, /* TRANS: Europeans ... Suitcase Nuke */ - _("👮‍♂️ You now have casus belli against the %s. " + _("[`earth`] You now have casus belli against the %s. " "They did %s."), nation_plural_for_player(offender), action_name_translation(paction)); @@ -695,7 +747,7 @@ static void notify_global_success(struct player *receiver, /* Ugly hack for the lack of "Unit Move" */ notify_player(receiver, victim_tile, E_DIPLOMATIC_INCIDENT, ftc_server, - _("[`unitednations`]⚠️ All nations have casus belli against the %s. " + _("[`unitednations`][`warning`] All nations have casus belli against the %s. " "Their invasion of the %s violated their treaty!"), nation_plural_for_player(offender), nation_plural_for_player(victim_player)); @@ -704,7 +756,7 @@ static void notify_global_success(struct player *receiver, notify_player(receiver, victim_tile, E_DIPLOMATIC_INCIDENT, ftc_server, /* TRANS: Europeans ... Suitcase Nuke ... Americans */ - _("👮‍♂️ You now have casus belli against the %s. " + _("[`earth`] You now have casus belli against the %s. " "They did %s to the %s."), nation_plural_for_player(offender), action_name_translation(paction), diff --git a/freeciv/freeciv/server/actiontools.h b/freeciv/freeciv/server/actiontools.h index 63891b541..8e57d81c8 100644 --- a/freeciv/freeciv/server/actiontools.h +++ b/freeciv/freeciv/server/actiontools.h @@ -34,6 +34,9 @@ void action_consequence_success(const struct action *paction, const struct tile *victim_tile, const char *victim_link); +void action_give_casus_belli_to_allies(struct player *offender, + struct player *victim_player); + void action_success_target_pay_mp(struct action *paction, int target_id, struct unit *target); diff --git a/freeciv/freeciv/server/auth.c b/freeciv/freeciv/server/auth.c index 618f74b0f..16c5bf7f1 100644 --- a/freeciv/freeciv/server/auth.c +++ b/freeciv/freeciv/server/auth.c @@ -178,7 +178,8 @@ bool auth_handle_reply(struct connection *pconn, char *password) // Change existing password: sz_strlcpy(srvarg.server_password, password); // Remove password if a null password is sent: - if (strlen(password)==0) { + if (strlen(password)==0 + || strncmp(password, "empty", MAX_LEN_PASSWORD) == 0) { srvarg.server_password_enabled = FALSE; notify_conn(NULL, NULL, E_SETTING, ftc_server, _("Server password removed.")); diff --git a/freeciv/freeciv/server/cityhand.c b/freeciv/freeciv/server/cityhand.c index 43e05e0dc..37310abdb 100644 --- a/freeciv/freeciv/server/cityhand.c +++ b/freeciv/freeciv/server/cityhand.c @@ -144,10 +144,15 @@ void handle_city_change_specialist(struct player *pplayer, int city_id, Handle request to change city worker in to specialist. **************************************************************************/ void handle_city_make_specialist(struct player *pplayer, - int city_id, int tile_id) + int city_id, int tile_id, + Specialist_type_id specialist_to) { - int specalist_to = DEFAULT_SPECIALIST; + if (specialist_to < 0) specialist_to = DEFAULT_SPECIALIST; +/* This was a former method of packing selected specialist in the unused + bits of the city_id (to keep protocol compat). However, in large games + city_id surpassed 8192. This block may be deleted several months after + 15Nov2021, assuming the new method works fine. #ifdef FREECIV_WEB // FCW uses top 3 bits to represent default specialist, thus city_id is really // a 12-bit number. Perhaps later we should just send a specalist_to param @@ -157,11 +162,11 @@ void handle_city_make_specialist(struct player *pplayer, if (city_id > 16384) {city_id -= 16384; specalist_to += 2;} if (city_id > 8192) {city_id -= 8192; specalist_to += 1;} #endif +*/ struct tile *ptile = index_to_tile(&(wld.map), tile_id); struct city *pcity = player_city_by_number(pplayer, city_id); - if (NULL == pcity) { /* Probably lost. */ log_verbose("handle_city_make_specialist() bad city number %d.", @@ -184,7 +189,7 @@ void handle_city_make_specialist(struct player *pplayer, auto_arrange_workers(pcity); } else if (tile_worked(ptile) == pcity) { city_map_update_empty(pcity, ptile); - pcity->specialists[specalist_to]++; + pcity->specialists[specialist_to]++; } else { log_verbose("handle_city_make_specialist() not working (%d, %d) " "\"%s\".", TILE_XY(ptile), city_name_get(pcity)); @@ -346,13 +351,13 @@ void really_handle_city_buy(struct player *pplayer, struct city *pcity) if (VUT_UTYPE == pcity->production.kind && pcity->anarchy != 0 && pcity->hangry != 0) { notify_player(pplayer, pcity->tile, E_BAD_COMMAND, ftc_server, - _("😡 Can't buy units when city is in disorder.")); + _("[`mad`] Can't buy units when city is in disorder.")); return; } if (game.server.fulldisorder && VUT_IMPROVEMENT == pcity->production.kind && pcity->anarchy != 0 && pcity->hangry != 0) { notify_player(pplayer, pcity->tile, E_BAD_COMMAND, ftc_server, - _("😡 Can't buy buildings when city is in disorder.")); + _("[`mad`] Can't buy buildings when city is in disorder.")); return; } @@ -599,7 +604,7 @@ void handle_city_manager(struct player *pplayer, int city_id, bool enabled, send_city_info(pplayer, pcity); notify_player(city_owner(pcity), city_tile(pcity), E_CITY_CMA_RELEASE, ftc_server, - _("🔹 Retired the Governor in %s."), + _(" Retired the Governor in %s."), city_link(pcity)); } return; @@ -615,7 +620,7 @@ void handle_city_manager(struct player *pplayer, int city_id, bool enabled, if (pcity->cm_parameter) { // notify only if successful. notify_player(city_owner(pcity), city_tile(pcity), E_CITY_CMA_RELEASE, ftc_server, - _("🔹 Governor successfully assigned to %s."), + _(" Governor successfully assigned to %s."), city_link(pcity)); } return; @@ -653,7 +658,7 @@ void handle_city_manager(struct player *pplayer, int city_id, bool enabled, send_city_info(pplayer, pcity); notify_player(city_owner(pcity), city_tile(pcity), E_CITY_CMA_RELEASE, ftc_server, - _("🔹 %s, which has no Governor, has accepted your interim orders."), + _(" %s, which has no Governor, has accepted your interim orders."), city_link(pcity)); return; } @@ -663,7 +668,7 @@ void handle_city_manager(struct player *pplayer, int city_id, bool enabled, send_city_info(pplayer, pcity); notify_player(city_owner(pcity), city_tile(pcity), E_CITY_CMA_RELEASE, ftc_server, - _("🔹 (Interim Orders for %s were not attainable.)"), + _(" (Interim Orders for %s were not attainable.)"), city_link(pcity)); return; } @@ -680,7 +685,7 @@ void handle_city_manager(struct player *pplayer, int city_id, bool enabled, send_city_info(pplayer, pcity); notify_player(city_owner(pcity), city_tile(pcity), E_CITY_CMA_RELEASE, ftc_server, - _("🔹 Interim orders accepted by the Governor of %s."), + _(" Interim orders accepted by the Governor of %s."), city_link(pcity)); return; } @@ -699,7 +704,7 @@ void handle_city_manager(struct player *pplayer, int city_id, bool enabled, send_city_info(pplayer, pcity); notify_player(city_owner(pcity), city_tile(pcity), E_CITY_CMA_RELEASE, ftc_server, - _("🔹 Failed interim orders means the old Governor of %s was re-hired."), + _(" Failed interim orders means the old Governor of %s was re-hired."), city_link(pcity)); return; } diff --git a/freeciv/freeciv/server/citytools.c b/freeciv/freeciv/server/citytools.c index 3a343fb53..c4b010b24 100644 --- a/freeciv/freeciv/server/citytools.c +++ b/freeciv/freeciv/server/citytools.c @@ -91,6 +91,8 @@ #include "citytools.h" +/* Var for counting accumulated loot from multiple sources used to generate it */ +static int total_loot = 0; /* Queue for pending auto_arrange_workers() */ static struct city_list *arrange_workers_queue = NULL; @@ -144,7 +146,8 @@ void city_thaw_workers(struct city *pcity) { pcity->server.workers_frozen--; fc_assert(pcity->server.workers_frozen >= 0); - if (pcity->server.workers_frozen == 0 && pcity->server.needs_arrange) { + if (pcity->server.workers_frozen == 0 + && pcity->server.needs_arrange != CNA_NOT) { city_refresh(pcity); /* Citizen count sanity */ auto_arrange_workers(pcity); } @@ -163,7 +166,9 @@ void city_freeze_workers_queue(struct city *pcity) city_list_prepend(arrange_workers_queue, pcity); city_freeze_workers(pcity); - pcity->server.needs_arrange = TRUE; + if (pcity->server.needs_arrange == CNA_NOT) { + pcity->server.needs_arrange = CNA_NORMAL; + } } /************************************************************************//** @@ -362,7 +367,7 @@ static const char *search_for_city_name(struct tile *ptile, bool is_allowed_city_name(struct player *pplayer, const char *cityname, char *error_buf, size_t bufsz) { - //struct connection *pconn = conn_by_user(pplayer->username); + struct connection *pconn = conn_by_user(pplayer->username); /* Mode 1: A city name has to be unique for each player. */ if (CNM_PLAYER_UNIQUE == game.server.allowed_city_names @@ -421,7 +426,7 @@ bool is_allowed_city_name(struct player *pplayer, const char *cityname, * * We can even reach here for an AI player, if all the cities of the * original nation are exhausted and the backup nations have non-ascii - * names in them. + * names in them. */ if (!is_ascii_name(cityname) && (!pconn || pconn->access_level != ALLOW_HACK)) { if (error_buf) { @@ -431,7 +436,7 @@ bool is_allowed_city_name(struct player *pplayer, const char *cityname, cityname); } return FALSE; - }*/ + } return TRUE; @@ -596,8 +601,9 @@ static void transfer_unit(struct unit *punit, struct city *tocity, if (verbose) { notify_player(from_player, unit_tile(punit), E_UNIT_RELOCATED, ftc_server, - _("Changed homecity of %s to %s."), - unit_link(punit), + _("[`home`]%s Changed homecity of %s to %s."), + UNIT_EMOJI(punit), + unit_link(punit), city_link(tocity)); } } else { @@ -644,7 +650,7 @@ static void transfer_unit(struct unit *punit, struct city *tocity, if (verbose) { notify_player(from_player, unit_tile(punit), E_UNIT_RELOCATED, ftc_server, - _("🎁 Transferred %s in %s from %s to %s."), + _("[`gift`] Transferred %s in %s from %s to %s."), unit_link(punit), city_link(in_city), nation_plural_for_player(from_player), @@ -658,7 +664,7 @@ static void transfer_unit(struct unit *punit, struct city *tocity, if (verbose) { notify_player(from_player, unit_tile(punit), E_UNIT_RELOCATED, ftc_server, - _("🎁 Transferred %s from %s to %s."), + _("[`gift`] Transferred %s from %s to %s."), unit_link(punit), nation_plural_for_player(from_player), nation_plural_for_player(to_player)); @@ -672,7 +678,7 @@ static void transfer_unit(struct unit *punit, struct city *tocity, notify_player(from_player, unit_tile(punit), E_UNIT_LOST_MISC, ftc_server, /* TRANS: Polish Destroyer ... German */ - _("⚠️ %s %s lost in transfer to %s %s"), + _("[`warning`] %s %s lost in transfer to %s %s"), nation_adjective_for_player(from_player), unit_tile_link(punit), nation_adjective_for_player(to_player), @@ -768,6 +774,7 @@ void transfer_city_units(struct player *pplayer, struct player *pvictim, cities or maybe destroyed */ unit_list_iterate_safe(units, vunit) { struct city *new_home_city = tile_city(unit_tile(vunit)); + struct city *relocate_city = NULL; if (vunit->server.dying) { /* Don't transfer or destroy a dying unit. It will soon be gone @@ -794,18 +801,30 @@ void transfer_city_units(struct player *pplayer, struct player *pvictim, bounce_unit(vunit, TRUE); } } else { - /* The unit is lost. Call notify_player (in all other cases it is - * called automatically). */ - log_verbose("Lost %s %s at (%d,%d) when %s was lost.", - nation_rule_name(nation_of_unit(vunit)), - unit_rule_name(vunit), TILE_XY(unit_tile(vunit)), name); - if (verbose) { - notify_player(unit_owner(vunit), unit_tile(vunit), - E_UNIT_LOST_MISC, ftc_server, - _("⚠️ %s lost along with control of %s."), - unit_tile_link(vunit), name); + int rehome_pct = get_target_bonus_effects(NULL,unit_owner(vunit),pplayer,NULL,NULL, + unit_tile(vunit),vunit,unit_type_get(vunit),NULL,NULL,NULL,EFT_REHOME_PCT); +/* notify_player(unit_owner(vunit), unit_tile(vunit),E_UNIT_LOST_MISC,ftc_server, + _("[`dice`] Rehome probability = %d%%"),rehome_pct);*/ + if (rehome_pct>0 && fc_rand(100) < rehome_pct) { + relocate_city = find_closest_city(unit_tile(vunit),NULL,unit_owner(vunit), + false,false,true,true,false, unit_class_get(vunit)); + } + if (relocate_city) { + transfer_unit(vunit, relocate_city, TRUE, verbose); + } else { + /* The unit is lost. Call notify_player (in all other cases it is + * called automatically). */ + log_verbose("Lost %s %s at (%d,%d) when %s was lost.", + nation_rule_name(nation_of_unit(vunit)), + unit_rule_name(vunit), TILE_XY(unit_tile(vunit)), name); + if (verbose) { + notify_player(unit_owner(vunit), unit_tile(vunit), + E_UNIT_LOST_MISC, ftc_server, + _("[`warning`]%s %s lost along with control of %s."), + UNIT_EMOJI(vunit), unit_tile_link(vunit), name); + } + wipe_unit(vunit, ULR_CITY_LOST, NULL); } - wipe_unit(vunit, ULR_CITY_LOST, NULL); } } unit_list_iterate_safe_end; @@ -853,9 +872,13 @@ struct city *find_closest_city(const struct tile *ptile, int best_dist = -1; fc_assert_ret_val(ptile != NULL, NULL); + if (only_known || only_player || only_enemy) { + log_error("FIXME: find_closest_city to a player but player is NULL!"); + fc_assert_ret_val(pplayer != NULL, NULL); + } if (pplayer != NULL && only_player && only_enemy) { - log_error("Non of my own cities will be at war with me!"); + log_error("None of my own cities will be at war with me!"); return NULL; } @@ -912,26 +935,44 @@ struct city *find_closest_city(const struct tile *ptile, always palace) with game.server.razechance% chance, barbarians destroy more set the city's shield stock to 0 ****************************************************************************/ -static void raze_city(struct city *pcity) +static int raze_city(struct city *pcity, struct player *ptaker) { - int razechance = game.server.razechance; + int loot_gold = 0; + int razeadd = 0; bool city_remains = TRUE; - /* land barbarians are more likely to destroy city improvements */ + /* TODO: this should now use EFT_RAZE_BUILDING_PCT=150 for barbarians + in the ruleset instead of hard-coding. (150% * 20 = 30) + Land barbarians are more likely to destroy city improvements */ if (is_land_barbarian(city_owner(pcity))) { - razechance += 30; + razeadd += 30; } city_built_iterate(pcity, pimprove) { /* Small wonders should have already been removed by * transfer_city() (with 100% probability). */ fc_assert(!is_small_wonder(pimprove)); + int razechance = game.server.razechance * (100 + + get_target_bonus_effects(NULL, ptaker, NULL, pcity, pimprove, + city_tile(pcity), NULL, NULL, NULL, + NULL, NULL, EFT_RAZE_BUILDING_PCT)) + / 100 + razeadd; + /* DEBUG TESTING + notify_player(ptaker, city_tile(pcity), E_IMP_BUILD, ftc_server, + _("Raze chance for %s in %s is %d%%"), + improvement_name_translation(pimprove), + city_link(pcity), razechance); */ + if (is_improvement(pimprove) && (fc_rand(100) < razechance)) { - /* FIXME: Should maybe have conquering unit instead of NULL as destoryer */ + /* FIXME: Should maybe have conquering unit instead of NULL as destroyer */ city_remains = building_removed(pcity, pimprove, "razed", NULL); if (!city_remains) { break; } + /* LOOT_TRADE_AND_PROPERTY: loot also includes value of destroyed buildings */ + if (game.server.lootstyle == LOOT_TRADE_AND_PROPERTY) { + loot_gold += impr_sell_gold(pimprove); + } } } city_built_iterate_end; @@ -939,6 +980,7 @@ static void raze_city(struct city *pcity) nullify_prechange_production(pcity); pcity->shield_stock = 0; } + return loot_gold; } /************************************************************************//** @@ -987,7 +1029,7 @@ static void reestablish_city_trade_routes(struct city *pcity) /* Give the new owner infos about the city which has a trade route * with the transferred city. */ - reality_check_city(city_owner(pcity), partner->tile); + map_show_tile(city_owner(pcity), partner->tile); update_dumb_city(city_owner(pcity), partner); send_city_info(city_owner(pcity), partner); } trade_routes_iterate_safe_end; @@ -1103,6 +1145,9 @@ bool transfer_city(struct player *ptaker, struct city *pcity, /* Forget old tasks */ clear_worker_tasks(pcity); + /* Forget old rally point */ + city_rally_point_clear(pcity); + /* Activate AI control of the new owner. */ CALL_PLR_AI_FUNC(city_got, ptaker, ptaker, pcity); @@ -1126,6 +1171,10 @@ bool transfer_city(struct player *ptaker, struct city *pcity, BV_CLR_ALL(had_small_wonders); city_built_iterate(pcity, pimprove) { if (is_small_wonder(pimprove)) { + /* LOOT_TRADE_AND_PROPERTY augments loot with value of lost improvements */ + if (raze && game.server.lootstyle == LOOT_TRADE_AND_PROPERTY) { + total_loot += impr_sell_gold(pimprove); + } /* Small wonders are really removed (not restored later). */ building_removed(pcity, pimprove, "conquered", NULL); BV_SET(had_small_wonders, improvement_index(pimprove)); @@ -1133,6 +1182,10 @@ bool transfer_city(struct player *ptaker, struct city *pcity, city_remove_improvement(pcity, pimprove); if (is_great_wonder(pimprove)) { had_great_wonders = TRUE; + /* LOOT_TRADE_AND_PROPERTY augments loot with value of lost improvements */ + if (raze && game.server.lootstyle == LOOT_TRADE_AND_PROPERTY) { + total_loot += impr_sell_gold(pimprove); + } } /* note: internal turn here, next city_built_iterate(). */ pcity->built[improvement_index(pimprove)].turn = game.info.turn; /*I_ACTIVE*/ @@ -1230,7 +1283,7 @@ bool transfer_city(struct player *ptaker, struct city *pcity, struct extra_type *upgradet; if (raze) { - raze_city(pcity); + total_loot += raze_city(pcity, ptaker); } if (taker_had_no_cities) { @@ -1264,18 +1317,18 @@ bool transfer_city(struct player *ptaker, struct city *pcity, const char *clink = city_link(pcity); notify_player(ptaker, pcenter, E_CITY_TRANSFER, ftc_server, - _("💡 The people in %s are stunned by your " + _("[`bulb`] The people in %s are stunned by your " "technological insight!"), clink); if (upgradet != NULL) { notify_player(ptaker, pcenter, E_CITY_TRANSFER, ftc_server, - _("💡 With new tech, Workers upgrade " + _("[`bulb`] With new tech, Workers upgrade " "%s with %s."), clink, extra_name_translation(upgradet)); } else { notify_player(ptaker, pcenter, E_CITY_TRANSFER, ftc_server, - _("💡 Workers spontaneously gather and upgrade " + _("[`bulb`] Workers spontaneously gather and upgrade " "%s infrastructure."), clink); } @@ -1591,7 +1644,7 @@ void create_city(struct player *pplayer, struct tile *ptile, sync_cities(); /* Will also send pwork. */ notify_player(pplayer, ptile, E_CITY_BUILD, ftc_server, - _("🏰 You have founded %s."), + _("[`village`] You have founded %s."), city_link(pcity)); maybe_make_contact(ptile, city_owner(pcity)); @@ -1656,12 +1709,19 @@ void remove_city(struct city *pcity) /* Rehome units in other cities */ unit_list_iterate_safe(pcity->units_supported, punit) { struct city *new_home_city = tile_city(unit_tile(punit)); - - if (new_home_city - && new_home_city != pcity + int rehome_pct = get_target_bonus_effects(NULL,unit_owner(punit),NULL,NULL, + NULL,unit_tile(punit),punit,unit_type_get(punit),NULL,NULL,NULL,EFT_REHOME_PCT); + if (rehome_pct>0 && fc_rand(100) < rehome_pct) { // Handle case where EFT_REHOME_PCT allows a re-home + new_home_city = find_closest_city(unit_tile(punit),game_city_by_number(punit->homecity),unit_owner(punit), + false,false,true,true,false,unit_class_get(punit)); + if (new_home_city) transfer_unit(punit, new_home_city, TRUE, TRUE); + } else if (new_home_city && new_home_city != pcity /* Otherwise re-home if in another domestic city */ && city_owner(new_home_city) == powner && !punit->server.dying) { - transfer_unit(punit, new_home_city, TRUE, TRUE); + transfer_unit(punit, new_home_city, TRUE, TRUE); + } else { + notify_player(unit_owner(punit), unit_tile(punit),E_UNIT_LOST_MISC, ftc_server, + _("[`warning`]%s %s lost when %s was razed."),UNIT_EMOJI(punit),unit_tile_link(punit),city_name_get(pcity)); } } unit_list_iterate_safe_end; @@ -1708,7 +1768,7 @@ void remove_city(struct city *pcity) if (!moved) { notify_player(unit_owner(punit), unit_tile(punit), E_UNIT_LOST_MISC, ftc_server, - _("⚠️ When %s was disbanded your %s could not " + _("[`warning`] When %s was disbanded your %s could not " "get out, and it was therefore lost."), ctl, unit_tile_link(punit)); @@ -1741,7 +1801,7 @@ void remove_city(struct city *pcity) && !is_city_channel_tile(pclass, piter, pcenter)) { notify_player(unit_owner(punit), unit_tile(punit), E_UNIT_LOST_MISC, ftc_server, - _("⚠️ When %s was disbanded your %s in %s was trapped, " + _("[`warning`] When %s was disbanded your %s in %s was trapped, " "and it was therefore lost."), ctl, unit_tile_link(punit), @@ -1871,6 +1931,51 @@ void remove_city(struct city *pcity) sync_cities(); } +/************************************************************************//** + Whether the conquered city loses population from the act of conquest, + and how much. TODO: This function is for allowing future expansion + for mechanics to be specified by game settings and/or rulesets. + Currently, this function emulates hard-coded legacy behaviour, + so that it keeps compatibility for upstream integration. +****************************************************************************/ +static int conquered_city_loses_pop(struct city *pcity, struct unit *punit) +{ + bool killer = true; /* default to legacy hard-coded behaviour */ + int num_killed = 1; /* default to legacy hard-coded behaviour */ + +#ifdef FREECIV_WEB + killer = uclass_has_flag(unit_class_get(punit), UCF_KILLCITIZEN); +#endif + /* TODO: pop. loss for city should be controlled by bit-field + game.info.conquer_pop_reduce, whose values tune when/how pop loss + happens: + + int BITS = game.info.conquer_pop_reduce; + bool killer = false; + killer |= (KILL_ALWAYS & BITS); + killer |= (KILL_IF_ATTACKER_KILLS & BITS) && kills_citizen_after_attack(punit); + killer |= (KILL_IF_KILLER & BITS) && uclass_has_flag(unit_class_get(punit), UCF_KILLCITIZEN); + killer |= (KILL_SIZE1_ALWAYS & BITS) && city_size_get(pcity) <= 1; + */ + + /* TODO: changes in how much pop. to kill go here; this is where rulesets can + further tune or override certain behaviours ... + + if (killer) { + num_killed += get_unit_bonus(punit, EFT_???)); + num_killed -= get_city_bonus(pcity, EFT_???) + ... etc... + } else num_killed = 0; + + return num_killed; + */ + + if (killer) { + return num_killed; + } + return 0; +} + /************************************************************************//** Handle unit conquering a city. - Can't conquer a city when not at war. (Enters cities peacefully @@ -1891,10 +1996,16 @@ bool unit_conquer_city(struct unit *punit, struct city *pcity) { bool try_civil_war = FALSE; bool city_remains; - int coins; + int num_killed = conquered_city_loses_pop(pcity, punit); + struct player *pplayer = unit_owner(punit); struct player *cplayer = city_owner(pcity); + /* Var for accumulated loot is global so that multiple functions + in different locations can accumulate loot through the many + phases of conquering and transferring a city. */ + total_loot = 0; /* starts at 0, at beginning of conquest */ + /* If not at war, may peacefully enter city. */ fc_assert_ret_val_msg(pplayers_at_war(pplayer, cplayer), FALSE, "Can't conquer city during peace."); @@ -1935,14 +2046,14 @@ bool unit_conquer_city(struct unit *punit, struct city *pcity) * We later remove a citizen. Lets check if we can save this since * the city will be destroyed. */ - if (city_size_get(pcity) <= 1) { + if (city_size_get(pcity) <= num_killed) { int saved_id = pcity->id; notify_player(pplayer, city_tile(pcity), E_UNIT_WIN_ATT, ftc_server, - _("💥 You destroy %s completely."), + _("[`skull`] You destroy %s completely."), city_tile_link(pcity)); notify_player(cplayer, city_tile(pcity), E_CITY_LOST, ftc_server, - _("⚠️ %s has been destroyed by %s."), + _("[`skull`] %s has been destroyed by %s."), city_tile_link(pcity), player_name(pplayer)); script_server_signal_emit("city_destroyed", pcity, cplayer, pplayer); @@ -1957,91 +2068,97 @@ bool unit_conquer_city(struct unit *punit, struct city *pcity) return TRUE; } - /* Calculate the loot! */ + /* Calculate phase one base loot, accumulated from the conquest. */ switch (game.server.lootstyle) { case LOOT_OFF: - coins = 0; + total_loot = 0; break; case LOOT_BASE_TRADE: - coins = MIN(cplayer->economic.gold, + case LOOT_TRADE_AND_PROPERTY: + total_loot = MIN(cplayer->economic.gold, pcity->surplus[O_TRADE]); break; default: /* case LOOT_CLASSIC:*/ - coins = cplayer->economic.gold; - coins = MIN(coins, - fc_rand((coins / 20) + 1) - + (coins * (city_size_get(pcity))) / 200); - } - pplayer->economic.gold += coins; - cplayer->economic.gold -= coins; + total_loot = cplayer->economic.gold; + total_loot = MIN(total_loot, + fc_rand((total_loot / 20) + 1) + + (total_loot * (city_size_get(pcity))) / 200); + } + /* Remove base loot from conquered player's treasury. NOTE: Anything added to + total_loot from beyond this point is not taken from the treasury of the player, + but from looted buildings, property, etc., inside an already lost city */ + cplayer->economic.gold -= total_loot; + int treasury_loot = total_loot; + + /* We transfer the city first so that it is in a consistent state when the size is + reduced. If game.server.lootstyle, this also augments the total_loot var */ + city_remains = transfer_city(pplayer, pcity, 0, TRUE, TRUE, TRUE, + !is_barbarian(pplayer)); + + /* Complete the looting process + -----------------------------------------------------------------------------*/ + pplayer->economic.gold += total_loot; send_player_info_c(pplayer, pplayer->connections); send_player_info_c(cplayer, cplayer->connections); if (pcity->original != pplayer) { - if (coins > 0) { + if (total_loot > 0) { notify_player(pplayer, city_tile(pcity), E_UNIT_WIN_ATT, ftc_server, - PL_("💥 You conquer %s; [`gold`] your lootings accumulate" - " to %d gold!", - "💥 You conquer %s; [`gold`] your lootings accumulate" - " to %d gold!", coins), + PL_("[`boom`] You conquer %s; [`gold`] your lootings total %d gold!", + "[`boom`] You conquer %s; [`gold`] your lootings total %d gold!", total_loot), city_link(pcity), - coins); + total_loot); notify_player(cplayer, city_tile(pcity), E_CITY_LOST, ftc_server, - PL_("⚠️ %s conquered %s and looted %d gold" - " from the city.", - "⚠️ %s conquered %s and looted %d gold" - " from the city.", coins), + PL_("[`warning`] %s conquered %s, looting %d gold" + " from your treasury.", + "[`warning`] %s conquered %s, looting %d gold" + " from your treasury.", treasury_loot), player_name(pplayer), city_link(pcity), - coins); + treasury_loot); } else { notify_player(pplayer, city_tile(pcity), E_UNIT_WIN_ATT, ftc_server, - _("💥 You conquer %s."), + _("[`boom`] You conquer %s."), city_link(pcity)); notify_player(cplayer, city_tile(pcity), E_CITY_LOST, ftc_server, - _("⚠️ %s conquered %s."), + _("[`warning`] %s conquered %s."), player_name(pplayer), city_link(pcity)); } } else { - if (coins > 0) { + if (total_loot > 0) { notify_player(pplayer, city_tile(pcity), E_UNIT_WIN_ATT, ftc_server, - PL_("💥 You have liberated %s!" + PL_("[`boom`] You have liberated %s!" " [`gold`] Lootings accumulate to %d gold.", - "💥 You have liberated %s!" - " [`gold`] Lootings accumulate to %d gold.", coins), + "[`boom`] You have liberated %s!" + " [`gold`] Lootings accumulate to %d gold.", total_loot), city_link(pcity), - coins); + total_loot); notify_player(cplayer, city_tile(pcity), E_CITY_LOST, ftc_server, - PL_("⚠️ %s liberated %s and looted %d gold" - " from the city.", - "⚠️ %s liberated %s and looted %d gold" - " from the city.", coins), + PL_("[`warning`] %s liberated %s, looting %d gold from your treasury.", + "[`warning`] %s liberated %s, looting %d gold from your treasury", treasury_loot), player_name(pplayer), city_link(pcity), - coins); + treasury_loot); } else { notify_player(pplayer, city_tile(pcity), E_UNIT_WIN_ATT, ftc_server, - _("💥 You have liberated %s!"), + _("[`boom`] You have liberated %s!"), city_link(pcity)); notify_player(cplayer, city_tile(pcity), E_CITY_LOST, ftc_server, - _("💥 %s liberated %s."), + _("[`boom`] %s liberated %s."), player_name(pplayer), city_link(pcity)); } } + /* Paranoid safety: instantly zero the global var so it's always clean */ + total_loot = 0; + /* Concludes the looting process + -----------------------------------------------------------------------------*/ if (fc_rand(100) < get_unit_bonus(punit, EFT_CONQUEST_TECH_PCT)) { /* Just try to steal. Ignore failures to get tech */ steal_a_tech(pplayer, cplayer, A_UNSET); } - /* We transfer the city first so that it is in a consistent state when - * the size is reduced. */ - /* FIXME: maybe it should be a ruleset option whether barbarians get - * free buildings such as palaces? */ - city_remains = transfer_city(pplayer, pcity, 0, TRUE, TRUE, TRUE, - !is_barbarian(pplayer)); - /* Conquered cities are SUPPOSED to be in Disorder. We will start like the older freeciv and just hard-code in the proper behaviour, then allow people to make settings / effects / or some other options to allow rulesets and players @@ -2050,14 +2167,21 @@ bool unit_conquer_city(struct unit *punit, struct city *pcity) See sentence #3 at https://civilization.fandom.com/wiki/Civil_disorder_(Civ2) */ // For now, allow rulesets to specifically turn it off with EFT_GULAG: //if (!game.server.disorder_in_conquered && !get_city_bonus(pcity, EFT_???) { - if (game.server.fulldisorder) - pcity->anarchy++; + if (game.server.fulldisorder) { + if (punit->owner != pcity->original) { + /* Conquered city starts with 1 turn lawless/disorder (not more) */ + pcity->anarchy=1; + } else { + /* Liberated cities don't get disorder */ + pcity->anarchy=0; + } + } //} if (city_remains) { /* reduce size should not destroy this city */ fc_assert(city_size_get(pcity) > 1); - city_reduce_size(pcity, 1, pplayer, "conquest"); + city_reduce_size(pcity, num_killed, pplayer, "conquest"); } if (try_civil_war) { @@ -2154,7 +2278,7 @@ void refresh_dumb_city(struct city *pcity) (Split off from send_city_info_at_tile() because that was getting too difficult for me to understand... --dwp) ****************************************************************************/ -static void broadcast_city_info(struct city *pcity) +void broadcast_city_info(struct city *pcity) { struct packet_city_info packet; struct packet_web_city_info_addition web_packet; @@ -2163,24 +2287,30 @@ static void broadcast_city_info(struct city *pcity) struct traderoute_packet_list *routes = traderoute_packet_list_new(); /* Send to everyone who can see the city. */ - package_city(pcity, &packet, &web_packet, routes, FALSE); + if (pcity->server.needs_arrange == CNA_NOT) { + /* Send city only when it's in sane state. + * If it's not, it will be sent to everyone once + * rearrangement has been finished. */ + package_city(pcity, &packet, &web_packet, routes, FALSE); + } else { + pcity->server.needs_arrange = CNA_BROADCAST_PENDING; + return; + } players_iterate(pplayer) { if (can_player_see_city_internals(pplayer, pcity)) { if (!send_city_suppressed || pplayer != powner) { - update_dumb_city(powner, pcity); - lsend_packet_city_info(powner->connections, &packet, FALSE); - web_lsend_packet(city_info_addition, powner->connections, &web_packet, FALSE); + update_dumb_city(pplayer, pcity); + lsend_packet_city_info(pplayer->connections, &packet, FALSE); + web_lsend_packet(city_info_addition, pplayer->connections, &web_packet, FALSE); traderoute_packet_list_iterate(routes, route_packet) { - lsend_packet_traderoute_info(powner->connections, route_packet); + lsend_packet_traderoute_info(pplayer->connections, route_packet); } traderoute_packet_list_iterate_end; } - } else { - if (player_can_see_city_externals(pplayer, pcity)) { + } else if (player_can_see_city_externals(pplayer, pcity)) { reality_check_city(pplayer, pcity->tile); - update_dumb_city(pplayer, pcity); - package_dumb_city(pplayer, pcity->tile, &sc_pack); - lsend_packet_city_short_info(pplayer->connections, &sc_pack); - } + update_dumb_city(pplayer, pcity); + package_dumb_city(pplayer, pcity->tile, &sc_pack); + lsend_packet_city_short_info(pplayer->connections, &sc_pack); } } players_iterate_end; @@ -2213,7 +2343,7 @@ void send_all_known_cities(struct conn_list *dest) } whole_map_iterate(&(wld.map), ptile) { if (!pplayer || NULL != map_get_player_site(ptile, pplayer)) { - send_city_info_at_tile(pplayer, pconn->self, NULL, ptile); + send_city_info_at_tile(pplayer, pconn->self, NULL, ptile); } } whole_map_iterate_end; } @@ -2306,6 +2436,11 @@ void send_city_info_at_tile(struct player *pviewer, struct conn_list *dest, if (!pcity) { pcity = tile_city(ptile); } + if (pcity != NULL && pcity->server.needs_arrange != CNA_NOT) { + pcity->server.needs_arrange = CNA_BROADCAST_PENDING; + + return; + } if (pcity) { powner = city_owner(pcity); } @@ -2313,9 +2448,12 @@ void send_city_info_at_tile(struct player *pviewer, struct conn_list *dest, /* send info to owner */ /* This case implies powner non-NULL which means pcity non-NULL */ if (!send_city_suppressed) { + /* Wait that city has been rearranged, if it's currently + * not in sane state. */ + routes = traderoute_packet_list_new(); - /* send all info to the owner */ + /* Send all info to the owner */ update_dumb_city(powner, pcity); package_city(pcity, &packet, &web_packet, routes, FALSE); lsend_packet_city_info(dest, &packet, FALSE); @@ -2337,11 +2475,15 @@ void send_city_info_at_tile(struct player *pviewer, struct conn_list *dest, } } else { /* send info to non-owner */ - if (!pviewer) { /* observer */ + if (!pviewer /* observer */ +#ifdef FREECIV_WEB /* ally with shared vision can see traderoute info etc. */ + || (pplayers_allied(pviewer, powner) && gives_shared_vision(powner, pviewer)) +#endif + ) { if (pcity) { routes = traderoute_packet_list_new(); - package_city(pcity, &packet, &web_packet, routes, FALSE); /* should be dumb_city info? */ + package_city(pcity, &packet, &web_packet, routes, FALSE); /* should be dumb_city info? */ lsend_packet_city_info(dest, &packet, FALSE); web_lsend_packet(city_info_addition, dest, &web_packet, FALSE); traderoute_packet_list_iterate(routes, route_packet) { @@ -2386,6 +2528,9 @@ void package_city(struct city *pcity, struct packet_city_info *packet, { int i; int ppl = 0; + + fc_assert(!pcity->server.needs_arrange); + char can_build_impr_buf[MAX_NUM_ITEMS + 1]; char can_build_unit_buf[MAX_NUM_ITEMS + 1]; char food_output_buf[MAX_NUM_ITEMS + 1]; @@ -2449,6 +2594,7 @@ void package_city(struct city *pcity, struct packet_city_info *packet, packet->buy_cost = city_production_buy_gold_cost(pcity); packet->hangry = pcity->hangry; packet->anarchy = pcity->anarchy; + packet->rapture_status = pcity->rapture_status; if (packet->size != ppl) { static bool recursion = FALSE; @@ -2755,12 +2901,12 @@ static void announce_trade_route_removal(struct city *pc1, struct city *pc2, if (source_gone) { notify_player(plr2, city_tile(pc2), E_CARAVAN_ACTION, ftc_server, - _("⚠️ Trade between %s and %s lost along with city."), + _("[`warning`] Trade between %s and %s lost along with city."), city1_link, city2_link); } else { notify_player(plr1, city_tile(pc1), E_CARAVAN_ACTION, ftc_server, - _("💢 Trade route between %s and %s canceled."), + _("[`anger`] Trade route between %s and %s canceled."), city1_link, city2_link); } } else { @@ -2768,7 +2914,7 @@ static void announce_trade_route_removal(struct city *pc1, struct city *pc2, notify_player(plr2, city_tile(pc2), E_CARAVAN_ACTION, ftc_server, /* TRANS: "...between Spanish city Madrid and Paris..." */ - _("💢 Trade between %s city %s and %s lost along with " + _("[`anger`] Trade between %s city %s and %s lost along with " "their city."), nation_adjective_for_player(plr1), city1_link, city2_link); /* It's implicit to removed city's owner that that city no longer @@ -2776,13 +2922,13 @@ static void announce_trade_route_removal(struct city *pc1, struct city *pc2, } else { notify_player(plr2, city_tile(pc2), E_CARAVAN_ACTION, ftc_server, - _("💢 Sorry, the %s canceled the trade route " + _("[`anger`] Sorry, the %s canceled the trade route " "from %s to your city %s."), nation_plural_for_player(plr1), city1_link, city2_link); notify_player(plr1, city_tile(pc1), E_CARAVAN_ACTION, ftc_server, /* TRANS: "...from Paris to Spanish city Madrid." */ - _("⚠💢 We canceled the trade route " + _("⚠[`anger`] We canceled the trade route " "from %s to %s city %s."), city1_link, nation_adjective_for_player(plr2), city2_link); } @@ -2888,7 +3034,7 @@ void city_illness_strike(struct city *pcity) { notify_player(city_owner(pcity), city_tile(pcity), E_CITY_PLAGUE, ftc_server, - _("➖ %s has been struck by a plague! Population lost!"), + _("[`minus`] %s has been struck by a plague! Population lost!"), city_link(pcity)); city_reduce_size(pcity, 1, NULL, "plague"); pcity->turn_plague = game.info.turn; @@ -3072,7 +3218,7 @@ void change_build_target(struct player *pplayer, struct city *pcity, don't announce that the player has *stopped* building that wonder. */ notify_player(NULL, city_tile(pcity), E_WONDER_STOPPED, ftc_server, - _("💢 The %s have stopped building The %s [`%s`] in %s."), + _("[`anger`] The %s have stopped building The %s [`%s`] in %s."), nation_plural_for_player(pplayer), city_production_name_translation(pcity), city_production_name_translation(pcity), @@ -3126,7 +3272,7 @@ void change_build_target(struct player *pplayer, struct city *pcity, if (VUT_IMPROVEMENT == pcity->production.kind && is_great_wonder(pcity->production.value.building)) { notify_player(NULL, city_tile(pcity), E_WONDER_STARTED, ftc_server, - _("💢 The %s have started building The %s [`%s`] in %s."), + _("[`anger`] The %s have started building The %s [`%s`] in %s."), nation_plural_for_player(pplayer), name, name, city_link(pcity)); diff --git a/freeciv/freeciv/server/citytools.h b/freeciv/freeciv/server/citytools.h index 61d05f217..2717f0bc6 100644 --- a/freeciv/freeciv/server/citytools.h +++ b/freeciv/freeciv/server/citytools.h @@ -50,6 +50,7 @@ void send_city_info_at_tile(struct player *pviewer, struct conn_list *dest, struct city *pcity, struct tile *ptile); void send_all_known_cities(struct conn_list *dest); void send_player_cities(struct player *pplayer); +void broadcast_city_info(struct city *pcity); void package_city(struct city *pcity, struct packet_city_info *packet, struct packet_web_city_info_addition *web_packet, struct traderoute_packet_list *routes, diff --git a/freeciv/freeciv/server/cityturn.c b/freeciv/freeciv/server/cityturn.c index 362c05331..f41d7c167 100644 --- a/freeciv/freeciv/server/cityturn.c +++ b/freeciv/freeciv/server/cityturn.c @@ -252,14 +252,14 @@ void remove_obsolete_buildings_city(struct city *pcity, bool refresh) // wipe it anyway building_lost(pcity, pimprove, "obsolete", NULL); notify_player(NULL, city_tile(pcity), E_WONDER_OBSOLETE, ftc_server, - _("⚠️ [`paxdei`] Pax Dei is now obsolete.")); + _("[`warning`] [`paxdei`] Pax Dei is now obsolete.")); } } if (game.server.pax_dei_set && game.server.pax_dei_counter==0) { if (strcmp(improvement_rule_name(pimprove), "Pax Dei")==0) { building_lost(pcity, pimprove, "obsolete", NULL); notify_player(NULL, city_tile(pcity), E_TREATY_BROKEN, ftc_server, - _("⚠️ [`paxdei`] The Pax Dei movement became unpopular and came to an end.")); + _("[`warning`] [`paxdei`] The Pax Dei movement became unpopular and came to an end.")); } } } city_built_iterate_end; @@ -371,24 +371,29 @@ void auto_arrange_workers(struct city *pcity) { struct cm_parameter cmp; struct cm_result *cmr; + bool broadcast_needed; /* See comment in freeze_workers(): we can't rearrange while * workers are frozen (i.e. multiple updates need to be done). */ if (pcity->server.workers_frozen > 0) { - pcity->server.needs_arrange = TRUE; + if (pcity->server.needs_arrange == CNA_NOT) { + pcity->server.needs_arrange = CNA_NORMAL; + } return; } TIMING_LOG(AIT_CITIZEN_ARRANGE, TIMER_START); + broadcast_needed = (pcity->server.needs_arrange == CNA_BROADCAST_PENDING); + /* Freeze the workers and make sure all the tiles around the city * are up to date. Then thaw, but hackishly make sure that thaw * doesn't call us recursively, which would waste time. */ city_freeze_workers(pcity); - pcity->server.needs_arrange = FALSE; + pcity->server.needs_arrange = CNA_NOT; city_map_update_all(pcity); - pcity->server.needs_arrange = FALSE; + pcity->server.needs_arrange = CNA_NOT; city_thaw_workers(pcity); /* Now start actually rearranging. */ @@ -462,7 +467,7 @@ ABOVE removed Jan2021 for server-side CMA patch */ notify_player(city_owner(pcity), city_tile(pcity), E_CITY_CMA_RELEASE, ftc_server, - _("❌ Governor of %s failed to meet goals and resigned."), + _("[`redx`] Governor of %s failed to meet goals and resigned."), city_link(pcity)); // Don't keep the solution of an incompetent governor. @@ -506,7 +511,7 @@ ABOVE removed Jan2021 for server-side CMA patch */ if (incompetent_governor) { notify_player(city_owner(pcity), city_tile(pcity), E_CITY_CMA_RELEASE, ftc_server, - _("❌ Malfeasant Governor was caught in %s: he failed meeting his goals without reporting it!" + _("[`redx`] Malfeasant Governor was caught in %s: he failed meeting his goals without reporting it!" " Immediate change of tile allocation is recommended. Please report on %%%%Discord."), city_link(pcity)); if (pcity->cm_parameter) { @@ -530,6 +535,10 @@ ABOVE removed Jan2021 for server-side CMA patch */ } sanity_check_city(pcity); + if (broadcast_needed) { + broadcast_city_info(pcity); + } + cm_result_destroy(cmr); TIMING_LOG(AIT_CITIZEN_ARRANGE, TIMER_STOP); } @@ -548,8 +557,10 @@ static void city_global_turn_notify(struct conn_list *dest) && can_city_build_improvement_now(pcity, pimprove))) { notify_conn(dest, city_tile(pcity), E_WONDER_WILL_BE_BUILT, ftc_server, - _("Notice: Wonder %s in %s will be finished next turn."), - improvement_name_translation(pimprove), city_link(pcity)); + _("[`%s`] Notice: %s in %s will finish next turn!"), + improvement_name_translation(pimprove), + improvement_name_translation(pimprove), + city_link(pcity)); } } cities_iterate_end; } @@ -610,7 +621,7 @@ static void city_turn_notify(const struct city *pcity, && 0 > pcity->surplus[O_FOOD]) { package_event(&packet, city_tile(pcity), E_CITY_FAMINE_FEARED, ftc_server, - _("🍴 Warning: Famine feared in %s."), city_link(pcity)); + _("[`knifeandfork`] Warning: Famine feared in %s."), city_link(pcity)); lsend_packet_chat_msg(dest, &packet); if (NULL != cache_for_player) { event_cache_add_for_player(&packet, cache_for_player); @@ -732,13 +743,11 @@ void update_city_activities(struct player *pplayer) /* Accumulate score elements which must be done prior to tile re-arrange */ pplayer->score.mfg += cities[r]->surplus[O_SHIELD]; - /* These are calculated here IFF (game.server.city_output_style == WYSIWYG) */ + /* Specialists are calculated before re-arrange IFF (game.server.city_output_style == WYSIWYG) */ if (game.server.city_output_style) { specialist_type_iterate(sp) { pplayer->score.specialists[sp] += cities[r]->specialists[sp]; } specialist_type_iterate_end; - pplayer->score.bnp += cities[r]->surplus[O_TRADE]; - pplayer->score.techout += cities[r]->prod[O_SCIENCE]; } // 27August2021: @@ -781,7 +790,7 @@ void update_city_activities(struct player *pplayer) * player_balance_treasury_units(). */ if (gold - (gold - pplayer->economic.gold) * 3 < 0) { notify_player(pplayer, NULL, E_LOW_ON_FUNDS, ftc_server, - _("⬇[`gold`]⬇ WARNING, we're LOW on FUNDS, %s."), + _("[`redexclamations`][`gold`][`arrowdown`] WARNING, we're LOW on FUNDS, %s."), ruler_title_for_player(pplayer, buf, sizeof(buf))); } @@ -1037,13 +1046,13 @@ static bool city_increase_size(struct city *pcity, struct player *nationality) if (get_current_construction_bonus(pcity, EFT_SIZE_ADJ, RPT_CERTAIN) > 0 || get_current_construction_bonus(pcity, EFT_SIZE_UNLIMIT, RPT_CERTAIN) > 0) { notify_player(powner, city_tile(pcity), E_CITY_AQ_BUILDING, ftc_server, - _("👉🏻 %s needs %s (being built) to grow beyond size %d."), + _("[`pointright`] %s needs %s (being built) to grow beyond size %d."), city_link(pcity), improvement_name_translation(pimprove), city_size_get(pcity)); } else { notify_player(powner, city_tile(pcity), E_CITY_AQUEDUCT, ftc_server, - _("👉🏻 %s needs an improvement to grow beyond size %d."), + _("[`pointright`] %s needs an improvement to grow beyond size %d."), city_link(pcity), city_size_get(pcity)); } /* Granary can only hold so much */ @@ -1104,8 +1113,10 @@ static bool city_increase_size(struct city *pcity, struct player *nationality) } trade_partners_iterate_end; notify_player(powner, city_tile(pcity), E_CITY_GROWTH, ftc_server, - _("➕ %s grows to size %d."), - city_link(pcity), city_size_get(pcity)); + _("[`plus`] %s %s to size %d."), + city_link(pcity), + (rapture_grow ? "rapture grows" : "grows"), + city_size_get(pcity)); /* Deprecated signal. Connect your lua functions to "city_size_change" that's * emitted from calling functions which know the 'reason' of the increase. */ @@ -1186,7 +1197,7 @@ static bool city_populate(struct city *pcity, struct player *nationality) if (city_had_recent_plague(pcity)) { notify_player(city_owner(pcity), city_tile(pcity), E_CITY_PLAGUE, ftc_server, - _("💢 A recent plague outbreak prevents growth in %s."), + _("[`anger`] A recent plague outbreak prevents growth in %s."), city_link(pcity)); /* Lose excess food */ pcity->food_stock = MIN(pcity->food_stock, granary_size); @@ -1217,7 +1228,7 @@ static bool city_populate(struct city *pcity, struct player *nationality) game.info.muuk_food_wipe)) { notify_player(city_owner(pcity), city_tile(pcity), E_UNIT_LOST_MISC, ftc_server, - _("⚠️ Famine feared in %s, %s [`%s`] lost!"), + _("[`warning`] Famine feared in %s, %s [`%s`] lost!"), city_link(pcity), punit_link, punit_log); } @@ -1231,12 +1242,12 @@ static bool city_populate(struct city *pcity, struct player *nationality) if (city_size_get(pcity) > 1) { notify_player(city_owner(pcity), city_tile(pcity), E_CITY_FAMINE, ftc_server, - _("➖ Famine causes population loss in %s."), + _("[`minus`] Famine causes population loss in %s."), city_link(pcity)); } else { notify_player(city_owner(pcity), city_tile(pcity), E_CITY_FAMINE, ftc_server, - _("💀 Famine destroys %s entirely."), + _("[`skull`] Famine destroys %s entirely."), city_link(pcity)); } city_reset_foodbox(pcity, city_size_get(pcity) - 1); @@ -1258,7 +1269,7 @@ static bool city_populate(struct city *pcity, struct player *nationality) if (gulag) { notify_player(city_owner(pcity), city_tile(pcity), E_CITY_FAMINE, ftc_server, - _("Martial law force of %d not enough to suppress famine disorder in %s."), + _("Martial force of %d not enough to suppress famine disorder in %s."), gulag_force, city_link(pcity)); } return true; // indicates city is hangry from starvation @@ -2140,7 +2151,7 @@ static bool worklist_change_build_target(struct player *pplayer, } else { /* Yep, we can go after pupdate instead. Joy! */ notify_player(pplayer, city_tile(pcity), E_WORKLIST, ftc_server, - _("🔸 Production of %s is upgraded to %s [`%s`] in %s."), + _("[`reddiamond`] Production of %s is upgraded to %s [`%s`] in %s."), utype_name_translation(ptarget), utype_name_translation(pupdate), utype_name_translation(pupdate), @@ -2230,7 +2241,7 @@ static bool worklist_change_build_target(struct player *pplayer, player about it. */ notify_player(pplayer, city_tile(pcity), E_WORKLIST, ftc_server, /* TRANS: The worklist .... */ - _("👉 The %s worklist is now empty."), + _("[`pointright`] The %s worklist is now empty."), city_link(pcity)); } @@ -2314,7 +2325,7 @@ static void upgrade_building_prod(struct city *pcity) if (upgrading && can_city_build_improvement_now(pcity, upgrading)) { notify_player(city_owner(pcity), city_tile(pcity), E_UNIT_UPGRADED, ftc_server, - _("🔸 Production of %s is upgraded to %s [`%s`] in %s."), + _("[`reddiamond`] Production of %s is upgraded to %s [`%s`] in %s."), improvement_name_translation(producing), improvement_name_translation(upgrading), improvement_name_translation(upgrading), @@ -2361,7 +2372,7 @@ static void upgrade_unit_prod(struct city *pcity) if (upgrading && can_city_build_unit_direct(pcity, upgrading)) { notify_player(city_owner(pcity), city_tile(pcity), E_UNIT_UPGRADED, ftc_server, - _("🔸 Production of %s is upgraded to %s [`%s`] in %s."), + _("[`reddiamond`] Production of %s is upgraded to %s [`%s`] in %s."), utype_name_translation(producing), utype_name_translation(upgrading), utype_name_translation(upgrading), @@ -2392,7 +2403,7 @@ static bool city_distribute_surplus_shields(struct player *pplayer, game.info.muuk_shield_wipe)) { notify_player(pplayer, city_tile(pcity), E_UNIT_LOST_MISC, ftc_server, - _("⚠️ %s can't upkeep %s [`%s`], unit disbanded."), + _("[`warning`] %s can't upkeep %s [`%s`], unit disbanded."), city_link(pcity), punit_link, punit_log); } @@ -2412,7 +2423,7 @@ static bool city_distribute_surplus_shields(struct player *pplayer, if (upkeep > 0 && pcity->surplus[O_SHIELD] < 0) { notify_player(pplayer, city_tile(pcity), E_UNIT_LOST_MISC, ftc_server, - _("⚠️ Citizens in %s perish for their failure to " + _("[`warning`] Citizens in %s perish for their failure to " "upkeep %s!"), city_link(pcity), unit_link(punit)); if (!city_reduce_size(pcity, 1, NULL, "upkeep_failure")) { @@ -2460,7 +2471,7 @@ static bool city_build_building(struct player *pplayer, struct city *pcity) // Round to nearest int with 0.5 randomly decided up or down: coinage = (coinage / 1000) + (double)(499.000000001+fc_rand(2))/1000; notify_player(pplayer, city_tile(pcity), E_IMP_BUILD, ftc_server, - _("[`shield`]➡[`gold`] %s %s renders %d shields to %d gold."), + _("[`shield`][`a_rght`][`gold`] %s %s renders %d shields to %d gold."), city_link(pcity), city_improvement_name_translation(pcity, pimprove), pcity->before_change_shields, (int)coinage); pplayer->economic.gold += (int)coinage; @@ -2473,7 +2484,7 @@ static bool city_build_building(struct player *pplayer, struct city *pcity) if (!can_city_build_improvement_now(pcity, pimprove)) { notify_player(pplayer, city_tile(pcity), E_CITY_CANTBUILD, ftc_server, - _("⚠️ %s is building %s, which is currently unavailable."), + _("[`warning`] %s is building %s, which is currently unavailable."), city_link(pcity), city_improvement_name_translation(pcity, pimprove)); script_server_signal_emit("building_cant_be_built", pimprove, pcity, @@ -2513,7 +2524,7 @@ static bool city_build_building(struct player *pplayer, struct city *pcity) /* to eliminate micromanagement */ if (is_great_wonder(pimprove)) { notify_player(NULL, city_tile(pcity), E_WONDER_BUILD, ftc_server, - _("💢[`%s`] The %s have finished building %s in %s."), + _("[`anger`][`%s`] The %s have finished building %s in %s."), improvement_name_translation(pimprove), nation_plural_for_player(pplayer), improvement_name_translation(pimprove), @@ -2532,7 +2543,7 @@ static bool city_build_building(struct player *pplayer, struct city *pcity) } notify_player(pplayer, city_tile(pcity), E_IMP_BUILD, ftc_server, - _("🔨[`%s`] %s has finished building %s."), + _("[`hammer`][`%s`] %s has finished building %s."), improvement_name_translation(pimprove), city_link(pcity), improvement_name_translation(pimprove)); script_server_signal_emit("building_built", pimprove, pcity); @@ -2554,9 +2565,9 @@ static bool city_build_building(struct player *pplayer, struct city *pcity) const char *provider = improvement_name_translation(pimprove); notify_research(presearch, NULL, E_TECH_GAIN, ftc_server, - PL_("💡 %s boosts research; you gain %d immediate " + PL_("[`bulb`] %s boosts research; you gain %d immediate " "advance.", - "💡 %s boosts research; you gain %d immediate " + "[`bulb`] %s boosts research; you gain %d immediate " "advances.", mod), provider, mod); @@ -2568,13 +2579,13 @@ static bool city_build_building(struct player *pplayer, struct city *pcity) give_immediate_free_tech(presearch, tech); notify_research(presearch, NULL, E_TECH_GAIN, ftc_server, /* TRANS: Tech from building (Darwin's Voyage) */ - Q_("?frombldg:💡 Acquired %s from %s."), adv_name, + Q_("?frombldg:[`bulb`] Acquired %s from %s."), adv_name, provider); notify_research_embassies(presearch, NULL, E_TECH_EMBASSY, ftc_server, /* TRANS: Tech from building (Darwin's * Voyage) */ - Q_("?frombldg:💡 The %s have acquired %s " + Q_("?frombldg:[`bulb`] The %s have acquired %s " "from %s."), research_name, adv_name, provider); } @@ -2689,7 +2700,7 @@ static bool city_build_unit(struct player *pplayer, struct city *pcity) if (!can_city_build_unit_direct(pcity, utype) && !is_barbarian(pplayer)) { notify_player(pplayer, city_tile(pcity), E_CITY_CANTBUILD, ftc_server, - _("⚠️ %s is building %s, which is currently unavailable."), + _("[`warning`] %s is building %s, which is currently unavailable."), city_link(pcity), utype_name_translation(utype)); /* Log before signal emitting, so pointers are certainly valid */ @@ -2714,7 +2725,7 @@ static bool city_build_unit(struct player *pplayer, struct city *pcity) if (city_size_get(pcity) <= pop_cost) { notify_player(pplayer, city_tile(pcity), E_CITY_CANTBUILD, ftc_server, /* TRANS: city ... utype ... size ... pop_cost */ - _("❗ %s can't build %s yet. " + _("[`redexclamation`] %s can't build %s yet. " "(city size: %d, unit population cost: %d)"), city_link(pcity), utype_name_translation(utype), city_size_get(pcity), pop_cost); @@ -2798,7 +2809,7 @@ static bool city_build_unit(struct player *pplayer, struct city *pcity) if (punit) { if (punit->goto_tile) { notify_player(pplayer, city_tile(pcity), E_UNIT_BUILT, ftc_server, - _("🎯%s %s built %s, which left for a %s rally point."), + _("[`bullseye`]%s %s built %s, which left for a %s rally point."), UNIT_EMOJI(punit), city_link(pcity), utype_name_translation(utype), pcity->rally_point.persistent ? "constant" : "" @@ -2806,7 +2817,7 @@ static bool city_build_unit(struct player *pplayer, struct city *pcity) } else { notify_player(pplayer, city_tile(pcity), E_UNIT_BUILT, ftc_server, /* TRANS: is finished building . */ - _("🔨[`%s`] %s is finished building %s."), + _("[`hammer`][`%s`] %s is finished building %s."), utype_name_translation(utype), city_link(pcity), utype_name_translation(utype)); } @@ -2829,8 +2840,8 @@ static bool city_build_unit(struct player *pplayer, struct city *pcity) ftc_server, /* TRANS: " cost... shrinks..." * Plural in "%d population", not "size %d". */ - PL_("➖ [`%s`] %s cost %d population. %s shrinks to size %d.", - "➖ [`%s`] %s cost %d population. %s shrinks to size %d.", + PL_("[`minus`] [`%s`] %s cost %d population. %s shrinks to size %d.", + "[`minus`] [`%s`] %s cost %d population. %s shrinks to size %d.", pop_cost), utype_name_translation(utype), utype_name_translation(utype), pop_cost, @@ -2849,12 +2860,7 @@ static bool city_build_unit(struct player *pplayer, struct city *pcity) if (city_exist(saved_city_id)) { if (pcity->rally_point.length && !pcity->rally_point.persistent) { - pcity->rally_point.length = 0; - pcity->rally_point.persistent = FALSE; - pcity->rally_point.vigilant = FALSE; - pcity->rally_point.dest_tile = -1; - free(pcity->rally_point.orders); - pcity->rally_point.orders = NULL; + city_rally_point_clear(pcity); } /* Done building this unit; time to move on to the next. */ @@ -2900,7 +2906,7 @@ static bool city_build_stuff(struct player *pplayer, struct city *pcity) add_message = pcity->hangry ? _("famine") : _("disorder"); notify_player(pplayer, city_tile(pcity), E_CITY_CANTBUILD, ftc_server, /* TRANS: is finished building . */ - _("⚠️ Recent %s in %s halts construction on %s."), + _("[`warning`] Recent %s in %s halts construction on %s."), add_message, city_link(pcity), city_improvement_name_translation(pcity, pimprove)); return true; @@ -2914,7 +2920,7 @@ static bool city_build_stuff(struct player *pplayer, struct city *pcity) add_message = pcity->hangry ? _("famine") : _("disorder"); notify_player(pplayer, city_tile(pcity), E_CITY_CANTBUILD, ftc_server, /* TRANS: is finished building . */ - _("⚠️ Recent %s in %s halts production of %s."), + _("[`warning`] Recent %s in %s halts production of %s."), add_message, city_link(pcity), utype_name_translation(utype)); return true; } @@ -2955,7 +2961,7 @@ static bool sell_random_building(struct player *pplayer, pcityimpr->pimprove, "cant_maintain"); notify_player(pplayer, city_tile(pcityimpr->pcity), E_IMP_AUCTIONED, ftc_server, - _("⚠️[`gold`] Can't afford to maintain %s [`%s`] in %s: sold for %d gold!"), + _("[`warning`][`gold`] Can't afford to maintain %s [`%s`] in %s: sold for %d gold!"), improvement_name_translation(pcityimpr->pimprove), improvement_name_translation(pcityimpr->pimprove), city_link(pcityimpr->pcity), sgold); @@ -3099,7 +3105,7 @@ static struct unit *sell_random_unit(struct player *pplayer, * uk_rem_gold_callback() run as the unit's removal call back. */ notify_player(pplayer, utile, E_UNIT_LOST_MISC, ftc_server, - _("⚠️ Not enough gold. %s [`%s`] disbanded."), + _("[`warning`] Not enough gold. %s [`%s`] disbanded."), punit_link, punit_name); log_debug("%s: unit sold (%s)", player_name(pplayer), punit_name); @@ -3350,7 +3356,9 @@ static void check_pollution(struct city *pcity) the number of happy, unhappy and angry citizens, whether it is celebrating, how close it is to the capital, how many units it has and upkeeps, presence of courthouse, its buildings and wonders, and who - originally built it. + originally built it. NOTE: this is the "actorless" incite cost in a + vacuum, before we know who is the actor player, actor unit, and any + bonus effects tied to those. **************************************************************************/ int city_incite_cost(struct player *pplayer, struct city *pcity) { @@ -3538,7 +3546,7 @@ static void update_city_activity(struct city *pcity) pcity->rapture++; if (pcity->rapture == 1) { notify_player(pplayer, city_tile(pcity), E_CITY_LOVE, ftc_server, - _("🥂 Celebrations in your honor in %s."), + _("[`cincin`] Celebrations in your honor in %s."), city_link(pcity)); } } else { @@ -3546,7 +3554,7 @@ static void update_city_activity(struct city *pcity) if (pcity->hangry) add_message = _(" from recent famine."); else add_message = _("."); notify_player(pplayer, city_tile(pcity), E_CITY_NORMAL, ftc_server, - _("💢 Celebrations canceled in %s%s"), + _("[`anger`] Celebrations canceled in %s%s"), city_link(pcity), add_message); } pcity->rapture = 0; @@ -3568,16 +3576,62 @@ static void update_city_activity(struct city *pcity) /* City population updated here, after the rapture stuff above. --Jing */ saved_id = pcity->id; + pcity->rapture_status = city_would_rapture(pcity); city_is_hangry = city_populate(pcity, pplayer); if (NULL == player_city_by_number(pplayer, saved_id)) { return; } - + + /* Reason/timing bit codes for any contexts where rapture gets delayed. + 1 = raptured this turn + 2 = can rapture next turn. (pauses this turn) + 4 = can rapture in 2 turns. (pauses next turn) + 8 = can rapture in 3 turns. (pauses 2 turns) */ + + /* !1 = Rapture qualifying city who paused rapture this turn. */ + if (pcity->rapture_status && (!pcity->rapture_status & 1)) { + notify_player(pplayer, city_tile(pcity), E_CITY_NORMAL, ftc_server, + _("[`comet`]%s paused rapture."), + city_link(pcity)); + } + /* 3 = Raptured now and can rapture next turn. */ + if (pcity->rapture_status & 2) { /* status of 2||3 may notify */ + /* If/when rapture is never delayed, this message is redundant. */ + int rrate = get_city_bonus(pcity, EFT_RAPTURE_RATE_PM); + bool redundant = game.info.rapturedelay == 1 && (rrate == 0 || rrate == 1000); + if (!redundant) { + notify_player(pplayer, city_tile(pcity), E_CITY_NORMAL, ftc_server, + _("[`star2`]%s can rapture this turn."), + city_link(pcity)); + } + } else /*(!(pcity->rapture_status & 2)) - Can't rapture this turn*/ { + if (pcity->rapture_status & 4) { + notify_player(pplayer, city_tile(pcity), E_CITY_NORMAL, ftc_server, + _("[`comet`]%s will pause rapture this turn."), + city_link(pcity)); + } + else if (pcity->rapture_status & 8) { + notify_player(pplayer, city_tile(pcity), E_CITY_NORMAL, ftc_server, + _("[`comet`]%s will pause rapture for 2 turns."), + city_link(pcity)); + } + } + pcity->did_sell = FALSE; pcity->did_buy = FALSE; pcity->airlift = city_airlift_max(pcity); update_bulbs(pplayer, pcity->prod[O_SCIENCE], FALSE); + /* For WYSIWYG output, tally demographics for Science and Net Trade + when they are counted in each city. This ensures that trade- + and science-boosting improvements are tallied right when city + output is accumulated: i.e., between the code blocks where bulbs + and gold are literally given to the player. */ + if (game.server.city_output_style) { + pplayer->score.bnp += pcity->surplus[O_TRADE]; + pplayer->score.techout += pcity->prod[O_SCIENCE]; + } + /* Update the treasury. */ pplayer->economic.gold += pcity->prod[O_GOLD]; /* Under city_output_style == 0|1, you pay upkeep on a building @@ -3659,18 +3713,18 @@ static void update_city_activity(struct city *pcity) if (pcity->anarchy == 1) { notify_player(pplayer, city_tile(pcity), E_CITY_DISORDER, ftc_server, /* TRANS: second %s is an optional extra sentence */ - _("😡 Civil disorder in %s.%s"), + _("[`mad`] Civil disorder in %s.%s"), city_link(pcity), add_message); } else { notify_player(pplayer, city_tile(pcity), E_CITY_DISORDER, ftc_server, /* TRANS: second %s is an optional extra sentence */ - _("😡 CIVIL DISORDER CONTINUES in %s.%s"), + _("[`mad`] CIVIL DISORDER CONTINUES in %s.%s"), city_link(pcity), add_message); } } else { if (pcity->anarchy != 0 && !city_is_hangry) { notify_player(pplayer, city_tile(pcity), E_CITY_NORMAL, ftc_server, - _("🙂 Order restored in %s."), + _("[`relieved`] Order restored in %s."), city_link(pcity)); } pcity->anarchy = 0; @@ -3682,7 +3736,7 @@ static void update_city_activity(struct city *pcity) if (revolution_turns > 0 && pcity->anarchy > revolution_turns) { notify_player(pplayer, city_tile(pcity), E_ANARCHY, ftc_server, /* TRANS: %s - government form, e.g., Democracy */ - _("👎 The people have overthrown your %s, " + _("[`thumbdown`] The people have overthrown your %s, " "your country is in turmoil."), government_name_translation(gov)); handle_player_change_government(pplayer, government_number(gov)); @@ -4194,7 +4248,7 @@ bool city_empty_food_stock(struct city *pcity) { notify_player(pplayer, ptile, E_DISASTER, ftc_server, /* TRANS: %s is a city name */ - _("🍴 All stored food destroyed in %s."), city_link(pcity)); + _("[`knifeandfork`] All stored food destroyed in %s."), city_link(pcity)); return TRUE; } @@ -4216,7 +4270,7 @@ static void apply_disaster(struct city *pcity, struct disaster_type *pdis) notify_player(pplayer, ptile, E_DISASTER, ftc_server, /* TRANS: Disasters such as Earthquake */ - _("⚠️ %s was hit by %s."), city_name_get(pcity), + _("[`warning`] %s was hit by %s."), city_name_get(pcity), disaster_name_translation(pdis)); if (disaster_has_effect(pdis, DE_POLLUTION)) { @@ -4241,13 +4295,13 @@ static void apply_disaster(struct city *pcity, struct disaster_type *pdis) if (!city_reduce_size(pcity, 1, NULL, "disaster")) { notify_player(pplayer, ptile, E_DISASTER, ftc_server, /* TRANS: "Industrial Accident destroys Bogota entirely." */ - _("💀 %s destroys %s entirely."), + _("[`skull`] %s destroys %s entirely."), disaster_name_translation(pdis), city_link(pcity)); pcity = NULL; } else { notify_player(pplayer, ptile, E_DISASTER, ftc_server, /* TRANS: "Nuclear Accident ... Montreal." */ - _("⚠️ %s causes population loss in %s."), + _("[`warning`] %s causes population loss in %s."), disaster_name_translation(pdis), city_link(pcity)); } @@ -4272,7 +4326,7 @@ static void apply_disaster(struct city *pcity, struct disaster_type *pdis) notify_player(pplayer, ptile, E_DISASTER, ftc_server, /* TRANS: second %s is the name of a city improvement */ - _("⚠️ %s destroys %s in %s."), + _("[`warning`] %s destroys %s in %s."), disaster_name_translation(pdis), improvement_name_translation(imprs[num]), city_link(pcity)); @@ -4297,7 +4351,7 @@ static void apply_disaster(struct city *pcity, struct disaster_type *pdis) universal_name_translation(&pcity->production, prod, sizeof(prod)); notify_player(pplayer, ptile, E_DISASTER, ftc_server, /* TRANS: "Production of Colossus in Rhodes destroyed." */ - _("⚠️ Production of %s in %s destroyed."), + _("[`warning`] Production of %s in %s destroyed."), prod, city_link(pcity)); had_internal_effect = TRUE; diff --git a/freeciv/freeciv/server/commands.c b/freeciv/freeciv/server/commands.c index cc8274de9..976a2abf5 100644 --- a/freeciv/freeciv/server/commands.c +++ b/freeciv/freeciv/server/commands.c @@ -122,6 +122,14 @@ static struct command commands[] = { N_("Quit the game and shutdown the server."), NULL, NULL, CMD_ECHO_ALL, VCF_NONE, 0 }, + {"password", ALLOW_ADMIN, + N_("password \n"), + N_("Sets the password required to connect to the game."), + N_("Click 'GAME' button from pre-launch to set password as a standard user. " + "\nTo remove existing password, use: /password empty"), + NULL, + CMD_ECHO_ADMINS, VCF_NONE, 0 + }, {"cut", ALLOW_CTRL, /* TRANS: translate text between <> only */ N_("cut "), @@ -129,7 +137,8 @@ static struct command commands[] = { N_("Cut specified client's connection to the server, removing that client " "from the game. If the game has not yet started that client's player " "is removed from the game, otherwise there is no effect on the player. " - "Note that this command now takes connection names, not player names."), + "Note that this command now takes connection names, not player names. " + "See also: kick, remove."), NULL, CMD_ECHO_ALL, VCF_NONE, 50 }, @@ -232,21 +241,25 @@ static struct command commands[] = { {"team", ALLOW_CTRL, /* TRANS: translate text between <> only */ N_("team "), - N_("Change a player's team affiliation."), - N_("A team is a group of players that start out allied, with shared " - "vision and embassies, and fight together to achieve team victory " - "with averaged individual scores. Each player is always a member " - "of a team (possibly the only member). This command changes which " - "team a player is a member of. Use \"\" if names contain whitespace."), + N_("Change, add, or remove a player's team affiliation."), + N_("Can not be done during PBEM. Sets a player as member of a team. " + "If no team specified, the player is set teamless. Use \"\" if names " + "contain whitespace. A team is a group of players that start out allied, " + "with shared vision and embassies, and fight together to achieve team " + "victory with averaged individual scores. " + "Each player is always a member of a team (possibly the only member). " + "This command changes which team a player is a member of."), NULL, CMD_ECHO_ALL, VCF_NONE, 50 }, {"name", ALLOW_ADMIN, /* TRANS: translate text between <> only */ N_("name "), - N_("Change a player's name."), + N_("Change the username and playername of a player."), N_("Change the name of a player. Can assist Gamemaster in arranging " - "team game starting positions."), + "team game starting positions. Note: this will change both the " + "username (account login) and the playing-as playername. See /alias " + "for changing playername only"), NULL, CMD_ECHO_ALL, VCF_NONE, 50 }, @@ -329,8 +342,8 @@ static struct command commands[] = { /* TRANS: translate text between <> only */ N_("detach "), N_("Detach from a player."), - N_("Only the console and connections with cmdlevel 'hack' can force " - "other connections to detach from a player."), NULL, + N_("Can not be done during PBEM. Only the console and connections with " + "cmdlevel 'hack' can force other connections to detach from a player."), NULL, CMD_ECHO_ADMINS, VCF_NONE, 0 }, {"create", ALLOW_CTRL, @@ -527,12 +540,12 @@ static struct command commands[] = { }, {"playernation", ALLOW_ADMIN, /* TRANS: translate text between <> and [] only */ - N_("playernation [nation] [is-male] [leader] [style]"), + N_("playernation [player_name] [nation] [is_male] [leader] [style]"), N_("Set the nation and other details of a player."), N_("This command sets the nation of a specific player and optionally, " "the gender, new leader name, and civ graphic style of a player.\n" - "Gender parameter is 0 for female, 1 for male, and defaults male. " - "Omitting all [parameters] will reset the player with that name to " + "is_male parameter is 0 for female, 1 for male, and defaults male. " + "Usually the last 3 parameters are omitted, which results in the " "defaults. [style] is one of the following {european,classical, " "tropical,asian,babylonian,celtic}.\nEXAMPLE:\n /playernation John " "Italian 1 Giovanni classical\n^ sets the nation with leader named " @@ -558,7 +571,7 @@ static struct command commands[] = { {"endgame", ALLOW_ADMIN, /* no translatable parameters */ SYN_ORIG_("endgame"), - N_("End the game immediately in a draw."), NULL, NULL, + N_("End the game immediately."), NULL, NULL, CMD_ECHO_ALL, VCF_NONE, 0 }, {"surrender", ALLOW_BASIC, @@ -575,7 +588,7 @@ static struct command commands[] = { N_("remove "), N_("Fully remove player from game."), N_("This *completely* removes a player from the game, including " - "all cities and units etc. Use with care!"), NULL, + "all cities and units etc. Use with care! See also: cut, kick."), NULL, CMD_ECHO_ALL, VCF_NONE, 50 }, {"save", ALLOW_CTRL, @@ -664,11 +677,12 @@ static struct command commands[] = { }, {"kick", ALLOW_CTRL, /* TRANS: translate text between <> */ - N_("kick "), + N_("kick "), N_("Cut a connection and disallow reconnect."), - N_("The connection given by the 'user' argument will be cut from the " + N_("The connection given by the 'username' argument will be cut from the " "server and not allowed to reconnect. The time the user wouldn't be " - "able to reconnect is controlled by the 'kicktime' setting."), NULL, + "able to reconnect is controlled by the 'kicktime' setting. See also: " + "cut, remove."), NULL, CMD_ECHO_ADMINS, VCF_NOPASSALONE, 50 }, {"delegate", ALLOW_BASIC, @@ -726,12 +740,29 @@ static struct command commands[] = { NULL, mapimg_help, CMD_ECHO_ADMINS, VCF_NONE, 50 }, + {"supercows", ALLOW_BASIC, /* ALLOW_BASIC = show, ALLOW_HACK = to assign */ + /* TRANS: translate text between <> only */ + N_("\nSHOW supercows. Access: Players. Usage:\n/supercows\n" + "\nASSIGN supercows. Access: Admin. Usage:\n/supercows user1 user2 ... user10\n"), + N_("\nShows or assigns the admins for the current game.\n" + "Use up to 10 parameters to set non-player admins for the game."), + N_("To assign admins, you must be an admin and specify non-players by username."), + NULL, + CMD_ECHO_NONE, VCF_NONE, 0 + }, {"rfcstyle", ALLOW_HACK, /* no translatable parameters */ SYN_ORIG_("rfcstyle"), N_("Switch server output between 'RFC-style' and normal style."), NULL, NULL, CMD_ECHO_ADMINS, VCF_NONE, 0 }, + {"label", ALLOW_HACK, + N_("label x y labelname\n"), + N_("Set a label on the map at the tile coordinates"), + N_("Requires cmdlevel 'hack'"), + NULL, + CMD_ECHO_ADMINS, VCF_NONE, 0 + }, {"serverid", ALLOW_INFO, /* no translatable parameters */ SYN_ORIG_("serverid"), diff --git a/freeciv/freeciv/server/commands.h b/freeciv/freeciv/server/commands.h index 2556ce8c5..9db14b2ac 100644 --- a/freeciv/freeciv/server/commands.h +++ b/freeciv/freeciv/server/commands.h @@ -37,6 +37,7 @@ enum command_id { CMD_HELP, CMD_LIST, CMD_QUIT, + CMD_PASSWORD, CMD_CUT, /* completely non-harmful: */ @@ -98,9 +99,11 @@ enum command_id { CMD_AICMD, CMD_FCDB, CMD_MAPIMG, + CMD_SUPERCOWS, /* undocumented */ CMD_RFCSTYLE, + CMD_LABEL, CMD_SRVID, /* pseudo-commands: */ diff --git a/freeciv/freeciv/server/connecthand.c b/freeciv/freeciv/server/connecthand.c index 054f0d5ba..50bc5ee26 100644 --- a/freeciv/freeciv/server/connecthand.c +++ b/freeciv/freeciv/server/connecthand.c @@ -144,22 +144,22 @@ void do_longturn_tech_latejoiner_effect(struct player *pplayer) **************************************************************************/ void attach_longturn_player(struct connection *pc, struct player *pplayer) { - set_as_human(pplayer); + player_set_under_human_control(pplayer); pplayer->economic.gold += game.info.turn * game.server.latejoin_gold; if (pplayer->economic.gold > game.server.latejoin_gold_max) { pplayer->economic.gold = game.server.latejoin_gold_max; } - // Late joiners get 3 bulbs per turn into Alphabet: no you can't pick + // Late joiners get 4 bulbs per turn into Alphabet: no you can't pick // and make up some "latejoin surprise" exploit strategy. struct research *research = research_get(pplayer); - int join_bulbs = game.info.turn * 3; + int join_bulbs = game.info.turn * 4; if (research->bulbs_researched < join_bulbs) { Tech_type_id alphabet_id = 2; research->researching = alphabet_id; research->bulbs_researched = join_bulbs; - research->researching_saved = join_bulbs; + research->researching_saved = alphabet_id; research->inventions[alphabet_id].bulbs_researched_saved += join_bulbs; } @@ -336,7 +336,7 @@ void establish_new_connection(struct connection *pconn) notify_conn(dest, NULL, E_CONNECTION, ftc_server, _("Welcome, Supercow. We've been expecting you.")); } - else { + else if (is_longturn()) { pplayer = find_uncontrolled_idle_player_longturn(); if (pplayer) { attach_longturn_player(pconn, pplayer); @@ -648,9 +648,9 @@ void send_conn_info_remove(struct conn_list *src, struct conn_list *dest) Returns the # of turns idle a player has to be, at this point in the game, to be taken over by a latejoiner player. **************************************************************************/ -static int can_take_idler_turns() +static int can_take_idler_turns(void) { - // Keep this code identical with pregame.js:pick_nation() **************************** !!! + // Keep this code identical with pregame.js:can_take_idler_turns() **************************** !!! /* Turns 1-12: replace idle 3. T12+ increase idle cutoff until max cutoff of 10 */ int threshold = 3; if (game.info.turn > 12) threshold += (game.info.turn - 12); @@ -731,7 +731,14 @@ struct player *find_uncontrolled_player(struct connection *pconn) } /**********************************************************************//** - Search for the first uncontrolled idle player in longturn + Longturn: If a game has no new available slots, we pre-emptively + connect the player to a random idle player and immediately start the + game——bypassing the pre-game option to select your nation before + you are assigned a NewAvailablePlayer slot. + ----------------------------------------------------------------------- + This function seeks and returns a random uncontrolled idle player IFF + there are no NewAvailablePlayer slots. If there are unassigned spots + available or there are no idle players, it returns NULL. **************************************************************************/ struct player *find_uncontrolled_idle_player_longturn(void) { @@ -748,18 +755,18 @@ struct player *find_uncontrolled_idle_player_longturn(void) && played->nturns_idle >= idle_cutoff ) { idle_players[idle_count++] = played; /* store and index the qualifying idler nations */ } else { - /* Shouldn't happen but idlers were STILL getting assigned before - * NewAvailablePlayers. TODO: Remove this when we find out why. */ if (!played->is_connected && played->unassigned_user // specific check for newavail disallows GM made slot for specific player: && strncmp("NewAvailablePlayer", played->name, 18) == 0 && played->is_alive) { - /* We always return an unassigned player before an idler -- the same - idler with bad position kept getting recycled while fresh spots - weren't taken! We shouldn't even be in this function if there were - unassigned, but apparently we were, so we pre-empt it here. */ - return played; + /* We always assign player to a NewAvailable unassigned player before an idler. + This improves a flaw where the same idler with a bad position kept getting + assigned, abandoned, and recycled again, while the fresh spots weren't taken! + By returning NULL, we're instructing the game to not assign an idler because + there are NewAvailable slots it should assign first, after first letting the + player pick his nation. */ + return NULL; } } } players_iterate_end; @@ -768,7 +775,7 @@ struct player *find_uncontrolled_idle_player_longturn(void) if (idle_count > 0) return idle_players[fc_rand(idle_count)]; return NULL; - /* old code + /* old code always assigned idler before a new slot: players_iterate(played) { if (!played->unassigned_user && played->is_alive && played->nturns_idle > 12) { @@ -1079,7 +1086,7 @@ void connection_detach(struct connection *pconn, bool remove_unused_player) } /**********************************************************************//** - Use a delegation to get control over another player. + Use a delegation to get control over another player. **************************************************************************/ bool connection_delegate_take(struct connection *pconn, struct player *dplayer) @@ -1107,9 +1114,9 @@ bool connection_delegate_take(struct connection *pconn, fc_assert_ret_val(strlen(dplayer->server.orig_username) == 0, FALSE); sz_strlcpy(dplayer->server.orig_username, dplayer->username); // Preserve the delegated player's name so we don't lose the alias: - sz_strlcpy(&dplayer_name[0], dplayer->name); + sz_strlcpy(dplayer_name, dplayer->name); // Preserve the taking player's name so that we don't lose the alias: - sz_strlcpy(&oplayer_name[0], player_name(conn_get_player(pconn))); + sz_strlcpy(oplayer_name, player_name(conn_get_player(pconn))); /* Detach the current connection. */ if (NULL != pconn->playing || pconn->observer) { @@ -1140,8 +1147,8 @@ bool connection_delegate_take(struct connection *pconn, /* Paranoid safety: restore players' names because * name != username - at very least, capitalised; but maybe an alias*/ - sz_strlcpy(dplayer->name, &dplayer_name[0]); - sz_strlcpy(oplayer->name, &oplayer_name[0]); + sz_strlcpy(dplayer->name, dplayer_name); + sz_strlcpy(oplayer->name, oplayer_name); /* Only FCW has to do this here because connection_attach was modified to NOT override playername with username in some connection_attach events, because FCW has to worry about idlers, NewAvailablePlayers, @@ -1168,7 +1175,7 @@ bool connection_delegate_restore(struct connection *pconn) /* Preserve names so we don't lose aliases */ //char dplayer_name[MAX_LEN_NAME]; ///char oplayer_name[MAX_LEN_NAME]; - ///sz_strlcpy(&oplayer_name[0], pconn->server.delegation.playing->name); + ///sz_strlcpy(oplayer_name, pconn->server.delegation.playing->name); if (pconn->server.delegation.playing && !pconn->server.delegation.observer) { diff --git a/freeciv/freeciv/server/console.c b/freeciv/freeciv/server/console.c index 0841a6748..1dd854d0b 100644 --- a/freeciv/freeciv/server/console.c +++ b/freeciv/freeciv/server/console.c @@ -68,9 +68,10 @@ static void con_handle_log(enum log_level level, const char *message, } conn_list_iterate_end; notify_conn(NULL, NULL, E_LOG_FATAL, ftc_warning, "%s", message); + /* Reduce size of log files. notify_conn(NULL, NULL, E_LOG_FATAL, ftc_warning, _("Please report this message at %s"), - BUG_URL); + BUG_URL); */ } /* Write debug/verbose message to console only when not written to file. */ diff --git a/freeciv/freeciv/server/diplhand.c b/freeciv/freeciv/server/diplhand.c index 162fb9c54..4ac3b51a2 100644 --- a/freeciv/freeciv/server/diplhand.c +++ b/freeciv/freeciv/server/diplhand.c @@ -333,13 +333,13 @@ void handle_diplomacy_accept_treaty_req(struct player *pplayer, player_number(pplayer)); notify_player(pplayer, NULL, E_DIPLOMACY, ftc_server, - PL_("📜 A treaty containing %d clause was agreed upon.", - "📜 A treaty containing %d clauses was agreed upon.", + PL_("[`scroll`] A treaty containing %d clause was agreed upon.", + "[`scroll`] A treaty containing %d clauses was agreed upon.", nclauses), nclauses); notify_player(pother, NULL, E_DIPLOMACY, ftc_server, - PL_("📜 A treaty containing %d clause was agreed upon.", - "📜 A treaty containing %d clauses was agreed upon.", + PL_("[`scroll`] A treaty containing %d clause was agreed upon.", + "[`scroll`] A treaty containing %d clauses was agreed upon.", nclauses), nclauses); @@ -376,23 +376,23 @@ void handle_diplomacy_accept_treaty_req(struct player *pplayer, pcity = game_city_by_number(pclause->value); if (!pcity) { /* Can't find out cityname any more. */ notify_player(pplayer, NULL, E_DIPLOMACY, ftc_server, - _("📜 One of the cities the %s are giving away" + _("[`scroll`] One of the cities the %s are giving away" " is destroyed! Treaty canceled!"), nation_plural_for_player(pother)); notify_player(pother, NULL, E_DIPLOMACY, ftc_server, - _("📜 One of the cities the %s are giving away" + _("[`scroll`] One of the cities the %s are giving away" " is destroyed! Treaty canceled!"), nation_plural_for_player(pother)); goto cleanup; } if (city_owner(pcity) != pother) { notify_player(pplayer, NULL, E_DIPLOMACY, ftc_server, - _("📜 The %s no longer control %s! " + _("[`scroll`] The %s no longer control %s! " "Treaty canceled!"), nation_plural_for_player(pother), city_link(pcity)); notify_player(pother, NULL, E_DIPLOMACY, ftc_server, - _("📜 The %s no longer control %s! " + _("[`scroll`] The %s no longer control %s! " "Treaty canceled!"), nation_plural_for_player(pother), city_link(pcity)); @@ -430,11 +430,11 @@ void handle_diplomacy_accept_treaty_req(struct player *pplayer, case CLAUSE_GOLD: if (pother->economic.gold < pclause->value) { notify_player(pplayer, NULL, E_DIPLOMACY, ftc_server, - _("📜 The %s don't have the promised amount " + _("[`scroll`] The %s don't have the promised amount " "of gold! Treaty canceled!"), nation_plural_for_player(pother)); notify_player(pother, NULL, E_DIPLOMACY, ftc_server, - _("📜 The %s don't have the promised amount " + _("[`scroll`] The %s don't have the promised amount " "of gold! Treaty canceled!"), nation_plural_for_player(pother)); goto cleanup; @@ -464,10 +464,10 @@ void handle_diplomacy_accept_treaty_req(struct player *pplayer, case CLAUSE_EMBASSY: establish_embassy(pdest, pgiver); /* sic */ notify_player(pgiver, NULL, E_TREATY_EMBASSY, ftc_server, - _("📜 You gave an embassy to %s."), + _("[`scroll`] You gave an embassy to %s."), player_name(pdest)); notify_player(pdest, NULL, E_TREATY_EMBASSY, ftc_server, - _("📜 %s allowed you to create an embassy!"), + _("[`scroll`] %s allowed you to create an embassy!"), player_name(pgiver)); break; case CLAUSE_ADVANCE: @@ -490,7 +490,7 @@ void handle_diplomacy_accept_treaty_req(struct player *pplayer, advance_name = advance_name_translation(advance_by_number (pclause->value)); notify_player(pdest, NULL, E_TECH_GAIN, ftc_server, - _("💡 You are %s %s."), + _("[`bulb`] You are %s %s."), (game.server.blueprints ? _("given blueprints for") : _("taught the knowledge of")), advance_name); @@ -500,7 +500,7 @@ void handle_diplomacy_accept_treaty_req(struct player *pplayer, research_pretty_name(presearch, research_name, sizeof(research_name)); notify_research(presearch, pdest, E_TECH_GAIN, ftc_server, - _("💡 You have acquired %s%s thanks to the %s " + _("[`bulb`] You have acquired %s%s thanks to the %s " "treaty with the %s."), (game.server.blueprints ? _("blueprints for ") : _("")), advance_name, @@ -509,7 +509,7 @@ void handle_diplomacy_accept_treaty_req(struct player *pplayer, notify_research_embassies (presearch, pgiver, E_TECH_EMBASSY, ftc_server, /* TRANS: Tech from another player */ - Q_("?fromplr:💡 The %s have acquired %s%s from the %s."), + Q_("?fromplr:[`bulb`] The %s have acquired %s%s from the %s."), research_name, (game.server.blueprints ? _("blueprints for ") : _("")), advance_name, @@ -536,15 +536,15 @@ void handle_diplomacy_accept_treaty_req(struct player *pplayer, pgiver->economic.gold -= pclause->value; pdest->economic.gold += received; notify_player(pdest, NULL, E_DIPLOMACY, ftc_server, - PL_("​[`gold`] You get %d gold.", - "​[`gold`] You get %d gold.", received), received); + PL_("[`gold`] You get %d gold.", + "[`gold`] You get %d gold.", received), received); } break; case CLAUSE_MAP: give_map_from_player_to_player(pgiver, pdest); notify_player(pdest, NULL, E_DIPLOMACY, ftc_server, /* TRANS: ... Polish worldmap. */ - _("📜 You receive the %s worldmap."), + _("[`scroll`] You receive the %s worldmap."), nation_adjective_for_player(pgiver)); worker_refresh_required = TRUE; /* See CLAUSE_VISION */ @@ -553,7 +553,7 @@ void handle_diplomacy_accept_treaty_req(struct player *pplayer, give_seamap_from_player_to_player(pgiver, pdest); notify_player(pdest, NULL, E_DIPLOMACY, ftc_server, /* TRANS: ... Polish seamap. */ - _("📜 You receive the %s seamap."), + _("[`scroll`] You receive the %s seamap."), nation_adjective_for_player(pgiver)); worker_refresh_required = TRUE; /* See CLAUSE_VISION */ @@ -569,11 +569,11 @@ void handle_diplomacy_accept_treaty_req(struct player *pplayer, } notify_player(pdest, city_tile(pcity), E_CITY_TRANSFER, ftc_server, - _("🏰 You receive the city of %s from %s."), + _("[`village`] You receive the city of %s from %s."), city_link(pcity), player_name(pgiver)); notify_player(pgiver, city_tile(pcity), E_CITY_LOST, ftc_server, - _("🏰 You give the city of %s to %s."), + _("[`village`] You give the city of %s to %s."), city_link(pcity), player_name(pdest)); if (transfer_city(pdest, pcity, -1, TRUE, TRUE, FALSE, @@ -618,17 +618,17 @@ void handle_diplomacy_accept_treaty_req(struct player *pplayer, if (!reaffirmation) { notify_player(pgiver, NULL, E_TREATY_CEASEFIRE, ftc_server, - _("📜[`olivebranch`] You agree on a cease-fire with %s."), + _("[`scroll`][`olivebranch`] You agree on a cease-fire with %s."), player_name(pdest)); notify_player(pdest, NULL, E_TREATY_CEASEFIRE, ftc_server, - _("📜[`olivebranch`] You agree on a cease-fire with %s."), + _("[`scroll`][`olivebranch`] You agree on a cease-fire with %s."), player_name(pgiver)); } else { notify_player(pgiver, NULL, E_TREATY_CEASEFIRE, ftc_server, - _("📜[`olivebranch`] You affirm a cease-fire with %s, agreeing to reset casus belli."), + _("[`scroll`][`olivebranch`] You affirm a cease-fire with %s, agreeing to reset casus belli."), player_name(pdest)); notify_player(pdest, NULL, E_TREATY_CEASEFIRE, ftc_server, - _("📜[`olivebranch`] You affirm a cease-fire with %s, agreeing to reset casus belli."), + _("[`scroll`][`olivebranch`] You affirm a cease-fire with %s, agreeing to reset casus belli."), player_name(pgiver)); } if (old_diplstate == DS_ALLIANCE) { @@ -688,11 +688,11 @@ void handle_diplomacy_accept_treaty_req(struct player *pplayer, notify_player(pgiver, NULL, E_TREATY_PEACE, ftc_server, /* TRANS: ... the Poles ... Polish territory */ - PL_("📜[`dove`] You agree on an armistice with the %s. In %d turn, " + PL_("[`scroll`][`dove`] You agree on an armistice with the %s. In %d turn, " "it will become a peace treaty. Move your " "military units out of %s territory to avoid them " "being disbanded.", - "📜[`dove`] You agree on an armistice with the %s. In %d turns, " + "[`scroll`][`dove`] You agree on an armistice with the %s. In %d turns, " "it will become a peace treaty. Move any " "military units out of %s territory to avoid them " "being disbanded.", @@ -702,11 +702,11 @@ void handle_diplomacy_accept_treaty_req(struct player *pplayer, nation_adjective_for_player(pdest)); notify_player(pdest, NULL, E_TREATY_PEACE, ftc_server, /* TRANS: ... the Poles ... Polish territory */ - PL_("📜[`dove`] You agree on an armistice with the %s. In %d turn, " + PL_("[`scroll`][`dove`] You agree on an armistice with the %s. In %d turn, " "it will become a peace treaty. Move your " "military units out of %s territory to avoid them " "being disbanded.", - "📜[`dove`] You agree on an armistice with the %s. In %d turns, " + "[`scroll`][`dove`] You agree on an armistice with the %s. In %d turns, " "it will become a peace treaty. Move any " "military units out of %s territory to avoid them " "being disbanded.", @@ -737,10 +737,10 @@ void handle_diplomacy_accept_treaty_req(struct player *pplayer, player_diplstate_get(pdest, pgiver)->has_reason_to_cancel = 0; notify_player(pgiver, NULL, E_TREATY_ALLIANCE, ftc_server, - _("📜[`alliance`] You agree on an alliance with %s."), + _("[`scroll`][`alliance`] You agree on an alliance with %s."), player_name(pdest)); notify_player(pdest, NULL, E_TREATY_ALLIANCE, ftc_server, - _("📜[`alliance`] You agree on an alliance with %s."), + _("[`scroll`][`alliance`] You agree on an alliance with %s."), player_name(pgiver)); give_allied_visibility(pgiver, pdest); give_allied_visibility(pdest, pgiver); @@ -750,10 +750,10 @@ void handle_diplomacy_accept_treaty_req(struct player *pplayer, case CLAUSE_VISION: give_shared_vision(pgiver, pdest); notify_player(pgiver, NULL, E_TREATY_SHARED_VISION, ftc_server, - _("📜👁‍🗨 You give shared vision to %s."), + _("[`scroll`][`eye`] You give shared vision to %s."), player_name(pdest)); notify_player(pdest, NULL, E_TREATY_SHARED_VISION, ftc_server, - _("📜👁‍🗨 %s gives you shared vision."), + _("[`scroll`][`eye`] %s gives you shared vision."), player_name(pgiver)); /* Yes, shared vision may let us to _know_ tiles @@ -898,14 +898,14 @@ static void really_diplomacy_cancel_meeting(struct player *pplayer, player_number(pplayer), player_number(pplayer)); notify_player(pother, NULL, E_DIPLOMACY, ftc_server, - _("⛔ %s canceled the meeting!"), + _("[`noentry`] %s canceled the meeting!"), player_name(pplayer)); /* Need to send to pplayer too, for multi-connects: */ dlsend_packet_diplomacy_cancel_meeting(pplayer->connections, player_number(pother), player_number(pplayer)); notify_player(pplayer, NULL, E_DIPLOMACY, ftc_server, - _("⛔ Meeting with %s canceled."), + _("[`noentry`] Meeting with %s canceled."), player_name(pother)); treaty_list_remove(treaties, ptreaty); clear_treaty(ptreaty); @@ -947,7 +947,7 @@ void handle_diplomacy_init_meeting_req(struct player *pplayer, if (get_player_bonus(pplayer, EFT_NO_DIPLOMACY) > 0 || get_player_bonus(pother, EFT_NO_DIPLOMACY) > 0) { notify_player(pplayer, NULL, E_DIPLOMACY, ftc_server, - _("💀 Your diplomatic envoy was decapitated!")); + _("[`skull`] Your diplomatic envoy was decapitated!")); return; } diff --git a/freeciv/freeciv/server/diplomats.c b/freeciv/freeciv/server/diplomats.c index 89308f3d9..984c3bc6f 100644 --- a/freeciv/freeciv/server/diplomats.c +++ b/freeciv/freeciv/server/diplomats.c @@ -25,6 +25,7 @@ /* common */ #include "base.h" +#include "effects.h" #include "events.h" #include "game.h" #include "government.h" @@ -134,12 +135,12 @@ bool spy_poison(struct player *pplayer, struct unit *pdiplomat, if (diplomat_was_caught(pplayer, pdiplomat, pcity, cplayer, paction)) { notify_player(pplayer, ctile, E_MY_DIPLOMAT_FAILED, ftc_server, - _(" ⚠️ Your %s %s was caught trying to" + _(" [`warning`] Your %s %s was caught trying to" " poison %s's water!"), unit_tile_link(pdiplomat), UNIT_EMOJI(pdiplomat), clink); notify_player(cplayer, ctile, E_ENEMY_DIPLOMAT_FAILED, ftc_server, - _(" 💥 You caught %s %s %s %s trying" + _(" [`boom`] You caught %s %s %s %s trying" " to poison the water in %s!"), indefinite_article_for_word(nation_adjective_for_player(pplayer),false), nation_adjective_for_player(pplayer), @@ -160,11 +161,11 @@ bool spy_poison(struct player *pplayer, struct unit *pdiplomat, if (city_reduce_size(pcity, 1, pplayer, "poison")) { /* Notify everybody involved. */ notify_player(pplayer, ctile, E_MY_DIPLOMAT_POISON, ftc_server, - _(" 💥 Your %s %s poisoned the water supply of %s."), + _(" [`boom`] Your %s %s poisoned the water supply of %s."), UNIT_EMOJI(pdiplomat), unit_link(pdiplomat), clink); notify_player(cplayer, ctile, E_ENEMY_DIPLOMAT_POISON, ftc_server, - _(" ⚠️ %s is suspected of poisoning the water supply of %s."), + _(" [`warning`] %s is suspected of poisoning the water supply of %s."), player_name(pplayer), clink); if (game.info.poison_empties_food_stock) { @@ -178,11 +179,11 @@ bool spy_poison(struct player *pplayer, struct unit *pdiplomat, } else { /* Notify everybody involved. */ notify_player(pplayer, ctile, E_MY_DIPLOMAT_POISON, ftc_server, - _(" 💥 Your %s %s destroyed %s by poisoning its water supply."), + _(" [`boom`] Your %s %s destroyed %s by poisoning its water supply."), UNIT_EMOJI(pdiplomat), unit_link(pdiplomat), clink); notify_player(cplayer, ctile, E_ENEMY_DIPLOMAT_POISON, ftc_server, - _(" ⚠️ %s is suspected of destroying %s by poisoning its" + _(" [`warning`] %s is suspected of destroying %s by poisoning its" " water supply."), player_name(pplayer), clink); } @@ -370,7 +371,7 @@ bool diplomat_investigate(struct player *pplayer, struct unit *pdiplomat, if (your_roll >= game.server.diplchance) { // Didn't slip past: notify_player(cplayer, city_tile(pcity), E_ENEMY_DIPLOMAT_FAILED, ftc_server, - _("💢 %s %s %s %s discovered spying on %s!"), + _("[`anger`] %s %s %s %s discovered spying on %s!"), (is_unit_plural(pdiplomat) ? "" : indefinite_article_for_word(nation_adjective_for_player(pplayer),true)), @@ -378,7 +379,7 @@ bool diplomat_investigate(struct player *pplayer, struct unit *pdiplomat, unit_tile_link(pdiplomat), (is_unit_plural(pdiplomat) ? "were" : "was"), city_link(pcity)); notify_player(pplayer, city_tile(pcity), E_MY_DIPLOMAT_FAILED, ftc_server, - _("💢 Our %s %s discovered spying on %s."), + _("[`anger`] Our %s %s discovered spying on %s."), unit_tile_link(pdiplomat), (is_unit_plural(pdiplomat) ? "were" : "was"), city_link(pcity)); @@ -396,13 +397,13 @@ bool diplomat_investigate(struct player *pplayer, struct unit *pdiplomat, if (diplomat_was_caught(pplayer, pdiplomat, pcity, cplayer, paction)) { notify_player(pplayer, city_tile(pcity), E_MY_DIPLOMAT_FAILED, ftc_server, - _(" ⚠️ Your %s %s %s captured trying to " + _(" [`warning`] Your %s %s %s captured trying to " " investigate %s!"), unit_tile_link(pdiplomat), UNIT_EMOJI(pdiplomat), (is_unit_plural(pdiplomat) ? "were" : "was"), city_link(pcity)); notify_player(cplayer, city_tile(pcity), E_ENEMY_DIPLOMAT_FAILED, ftc_server, - _(" 💥 You captured %s %s %s %s spying on %s!"), + _(" [`boom`] You captured %s %s %s %s spying on %s!"), (is_unit_plural(pdiplomat) ? "" : indefinite_article_for_word(nation_adjective_for_player(pplayer),false)), @@ -565,11 +566,11 @@ bool diplomat_embassy(struct player *pplayer, struct unit *pdiplomat, /* Notify everybody involved. */ notify_player(pplayer, city_tile(pcity), E_MY_DIPLOMAT_EMBASSY, ftc_server, - _("💼 You have established an embassy in %s."), + _("[`briefcase`] You have established an embassy in %s."), city_link(pcity)); notify_player(cplayer, city_tile(pcity), E_ENEMY_DIPLOMAT_EMBASSY, ftc_server, - _("💼 The %s have established an embassy in %s."), + _("[`briefcase`] The %s have established an embassy in %s."), nation_plural_for_player(pplayer), city_link(pcity)); @@ -644,14 +645,14 @@ bool spy_sabotage_unit(struct player *pplayer, struct unit *pdiplomat, /* Notify everybody involved. */ notify_player(pplayer, unit_tile(pvictim), E_MY_DIPLOMAT_SABOTAGE, ftc_server, - _("💥 Your %s %s's successful sabotage killed the %s %s %s."), + _("[`boom`] Your %s %s's successful sabotage killed the %s %s %s."), UNIT_EMOJI(pdiplomat), unit_link(pdiplomat), nation_adjective_for_player(uplayer), victim_link, vunit_emoji); notify_player(uplayer, unit_tile(pvictim), E_ENEMY_DIPLOMAT_SABOTAGE, ftc_server, /* TRANS: ... the Poles! */ - _("⚠️ Your %s %s %s killed by %s sabotage!"), + _("[`warning`] Your %s %s %s killed by %s sabotage!"), victim_link, vunit_emoji, (is_unit_plural(pvictim) ? "were" : "was"), nation_plural_for_player(pplayer)); @@ -663,14 +664,14 @@ bool spy_sabotage_unit(struct player *pplayer, struct unit *pdiplomat, /* Notify everybody involved. */ notify_player(pplayer, unit_tile(pvictim), E_MY_DIPLOMAT_SABOTAGE, ftc_server, - _("💣 Your %s %s succeeded in sabotaging the %s %s %s."), + _("[`bomb`] Your %s %s succeeded in sabotaging the %s %s %s."), UNIT_EMOJI(pdiplomat), unit_link(pdiplomat), nation_adjective_for_player(uplayer), victim_link, vunit_emoji); notify_player(uplayer, unit_tile(pvictim), E_ENEMY_DIPLOMAT_SABOTAGE, ftc_server, /* TRANS: ... the Poles! */ - _("💢 Your %s %s %s sabotaged by the %s!"), + _("[`anger`] Your %s %s %s sabotaged by the %s!"), victim_link, vunit_emoji, (is_unit_plural(pvictim) ? "were" : "was"), nation_plural_for_player(pplayer)); @@ -739,6 +740,22 @@ bool diplomat_bribe(struct player *pplayer, struct unit *pdiplomat, /* Get bribe cost, ignoring any previously saved value. */ bribe_cost = unit_bribe_cost(pvictim, pplayer); + /* Actor cost mod. Target cost mod is in unit_bribe_cost(..) */ + bribe_cost += (bribe_cost + * get_target_bonus_effects(NULL, + unit_owner(pdiplomat), + unit_owner(pvictim), + game_city_by_number(pdiplomat->homecity), + NULL, + unit_tile(pvictim), + pdiplomat, + unit_type_get(pdiplomat), + NULL, + NULL, + paction, + EFT_ACTOR_BRIBE_COST_PCT)) + / 100; + /* If player doesn't have enough gold, can't bribe. */ if (pplayer->economic.gold < bribe_cost) { notify_player(pplayer, unit_tile(pdiplomat), @@ -779,7 +796,7 @@ bool diplomat_bribe(struct player *pplayer, struct unit *pdiplomat, /* Notify everybody involved. */ notify_player(pplayer, victim_tile, E_MY_DIPLOMAT_BRIBE, ftc_server, /* TRANS: ... */ - _("​[`gold`] Your %s %s succeeded in bribing the %s %s."), + _("[`gold`] Your %s %s succeeded in bribing the %s %s."), UNIT_EMOJI(pdiplomat), unit_link(pdiplomat), victim_link, vunit_emoji); @@ -789,7 +806,7 @@ bool diplomat_bribe(struct player *pplayer, struct unit *pdiplomat, notify_player(uplayer, victim_tile, E_ENEMY_DIPLOMAT_BRIBE, ftc_server, /* TRANS: ... */ - _("⚠️ Your %s %s %s bribed by the %s."), + _("[`warning`] Your %s %s %s bribed by the %s."), victim_link, vunit_emoji, (is_unit_plural(pvictim) ? "were" : "was"), nation_plural_for_player(pplayer)); @@ -1072,14 +1089,14 @@ bool diplomat_get_tech(struct player *pplayer, struct unit *pdiplomat, notify_player(pplayer, city_tile(pcity), E_MY_DIPLOMAT_FAILED, ftc_server, /* TRANS: Paris was expecting ... Your Spy was caught */ - _(" ⚠️ %s was expecting more tech thefts." + _(" [`warning`] %s was expecting more tech thefts." " Your %s %s was caught and executed."), city_link(pcity), unit_tile_link(pdiplomat), UNIT_EMOJI(pdiplomat)); notify_player(cplayer, city_tile(pcity), E_ENEMY_DIPLOMAT_FAILED, ftc_server, /* TRANS: The Belgian Spy ... from Paris */ - _(" 💥 %s %s %s failed to steal technology again from %s. " + _(" [`boom`] %s %s %s failed to steal technology again from %s. " "We were prepared for the attempt."), indefinite_article_for_word(nation_adjective_for_player(pplayer),true), nation_adjective_for_player(pplayer), @@ -1089,14 +1106,14 @@ bool diplomat_get_tech(struct player *pplayer, struct unit *pdiplomat, notify_player(pplayer, city_tile(pcity), E_MY_DIPLOMAT_FAILED, ftc_server, /* TRANS: Your Spy was caught ... from %s. */ - _(" ⚠️ Your %s %s was caught trying to " + _(" [`warning`] Your %s %s was caught trying to " " steal tech from %s."), unit_tile_link(pdiplomat), UNIT_EMOJI(pdiplomat), city_link(pcity)); notify_player(cplayer, city_tile(pcity), E_ENEMY_DIPLOMAT_FAILED, ftc_server, /* TRANS: The Belgian Spy ... from Paris */ - _(" 💥 %s %s %s %s failed to steal tech from %s."), + _(" [`boom`] %s %s %s %s failed to steal tech from %s."), indefinite_article_for_word(nation_adjective_for_player(pplayer),true), nation_adjective_for_player(pplayer), UNIT_EMOJI(pdiplomat), unit_tile_link(pdiplomat), @@ -1115,7 +1132,7 @@ bool diplomat_get_tech(struct player *pplayer, struct unit *pdiplomat, if (tech_stolen == A_NONE) { notify_player(pplayer, city_tile(pcity), E_MY_DIPLOMAT_FAILED, ftc_server, - _(" 💢 No new technology found in %s."), + _(" [`anger`] No new technology found in %s."), city_link(pcity)); diplomat_charge_movement (pdiplomat, pcity->tile); send_unit_info(NULL, pdiplomat); @@ -1232,11 +1249,26 @@ bool diplomat_incite(struct player *pplayer, struct unit *pdiplomat, /* Get incite cost, ignoring any previously saved value. */ revolt_cost = city_incite_cost(pplayer, pcity); - + /* Actor cost mod. Target cost mod is in city_incite_cost(..) */ + revolt_cost += (revolt_cost + * get_target_bonus_effects(NULL, + unit_owner(pdiplomat), + cplayer, + game_city_by_number(pdiplomat->homecity), + NULL, + ctile, + pdiplomat, + unit_type_get(pdiplomat), + NULL, + NULL, + paction, + EFT_ACTOR_INCITE_COST_PCT)) + / 100; + revolt_cost = MAX(0, revolt_cost); /* If player doesn't have enough gold, can't incite a revolt. */ if (pplayer->economic.gold < revolt_cost) { notify_player(pplayer, ctile, E_MY_DIPLOMAT_FAILED, ftc_server, - _(" ➥ You don't have enough gold to subvert %s."), + _("[`anger`] You don't have enough gold to subvert %s."), clink); log_debug("incite: not enough gold"); return FALSE; @@ -1257,11 +1289,11 @@ bool diplomat_incite(struct player *pplayer, struct unit *pdiplomat, if (diplomat_was_caught(pplayer, pdiplomat, pcity, cplayer, paction)) { notify_player(pplayer, ctile, E_MY_DIPLOMAT_FAILED, ftc_server, - _(" ⚠️ Your %s %s was captured trying" + _(" [`warning`] Your %s %s was captured trying" " to incite a revolt!"), unit_tile_link(pdiplomat), UNIT_EMOJI(pdiplomat)); notify_player(cplayer, ctile, E_ENEMY_DIPLOMAT_FAILED, ftc_server, - _(" 💥 You captured %s %s %s %s trying" + _(" [`boom`] You captured %s %s %s %s trying" " to incite a revolt in %s!"), indefinite_article_for_word(nation_adjective_for_player(pplayer),false), nation_adjective_for_player(pplayer), @@ -1294,7 +1326,7 @@ bool diplomat_incite(struct player *pplayer, struct unit *pdiplomat, _("[`gold`] Revolt incited in %s, you now rule the city!"), clink); notify_player(cplayer, ctile, E_ENEMY_DIPLOMAT_INCITE, ftc_server, - _("⚠️ %s was incited to revolt, and is now under %s control."), + _("[`warning`] %s was incited to revolt, and is now under %s control."), clink, nation_adjective_for_player(pplayer)); @@ -1383,12 +1415,12 @@ bool diplomat_sabotage(struct player *pplayer, struct unit *pdiplomat, paction)) { notify_player(pplayer, city_tile(pcity), E_MY_DIPLOMAT_FAILED, ftc_server, - _(" ⚠️ Your %s %s was caught attempting" + _(" [`warning`] Your %s %s was caught attempting" " industrial sabotage!"), unit_tile_link(pdiplomat), UNIT_EMOJI(pdiplomat)); notify_player(cplayer, city_tile(pcity), E_ENEMY_DIPLOMAT_SABOTAGE, ftc_server, - _(" 💥 You caught %s %s %s %s trying to sabotage %s!"), + _(" [`boom`] You caught %s %s %s %s trying to sabotage %s!"), indefinite_article_for_word(nation_adjective_for_player(pplayer),false), nation_adjective_for_player(pplayer), unit_tile_link(pdiplomat), UNIT_EMOJI(pdiplomat), @@ -1519,14 +1551,14 @@ bool diplomat_sabotage(struct player *pplayer, struct unit *pdiplomat, notify_player(pplayer, city_tile(pcity), E_MY_DIPLOMAT_SABOTAGE, ftc_server, - _(" 💣 Your %s %s succeeded in destroying" + _(" [`bomb`] Your %s %s succeeded in destroying" " the production of %s in %s."), UNIT_EMOJI(pdiplomat), unit_link(pdiplomat), prod, city_name_get(pcity)); notify_player(cplayer, city_tile(pcity), E_ENEMY_DIPLOMAT_SABOTAGE, ftc_server, - _(" ⚠️ The production of %s was destroyed in %s," + _(" [`warning`] The production of %s was destroyed in %s," " %s are suspected."), prod, city_link(pcity), @@ -1565,12 +1597,12 @@ bool diplomat_sabotage(struct player *pplayer, struct unit *pdiplomat, /* Caught! */ notify_player(pplayer, city_tile(pcity), E_MY_DIPLOMAT_FAILED, ftc_server, - _(" ⚠️ Your %s %s was killed trying to destroy the %s!"), + _(" [`warning`] Your %s %s was killed trying to destroy the %s!"), unit_tile_link(pdiplomat), UNIT_EMOJI(pdiplomat), improvement_name_translation(ptarget)); notify_player(cplayer, city_tile(pcity), E_ENEMY_DIPLOMAT_FAILED, ftc_server, - _(" 💥 You caught %s %s %s %s trying" + _(" [`boom`] You caught %s %s %s %s trying" " to destroy the %s in %s!"), indefinite_article_for_word(nation_adjective_for_player(pplayer),false), nation_adjective_for_player(pplayer), @@ -1590,13 +1622,13 @@ bool diplomat_sabotage(struct player *pplayer, struct unit *pdiplomat, /* Report it. */ notify_player(pplayer, city_tile(pcity), E_MY_DIPLOMAT_SABOTAGE, ftc_server, - _(" 💣 Your %s %s destroyed the %s in %s."), + _(" [`bomb`] Your %s %s destroyed the %s in %s."), UNIT_EMOJI(pdiplomat), unit_link(pdiplomat), improvement_name_translation(ptarget), city_link(pcity)); notify_player(cplayer, city_tile(pcity), E_ENEMY_DIPLOMAT_SABOTAGE, ftc_server, - _(" ⚠️ The %s destroyed the %s in %s."), + _(" [`warning`] The %s destroyed the %s in %s."), nation_plural_for_player(pplayer), improvement_name_translation(ptarget), city_link(pcity)); @@ -1695,12 +1727,12 @@ bool spy_steal_gold(struct player *act_player, struct unit *act_unit, if (diplomat_was_caught(act_player, act_unit, tgt_city, tgt_player, paction)) { notify_player(act_player, tgt_tile, E_MY_DIPLOMAT_FAILED, ftc_server, - _(" ⚠️ Your %s %s was caught trying to steal gold!"), + _(" [`warning`] Your %s %s was caught trying to steal gold!"), unit_tile_link(act_unit), UNIT_EMOJI(act_unit)); notify_player(tgt_player, tgt_tile, E_ENEMY_DIPLOMAT_FAILED, ftc_server, /* TRANS: You caught [a] Persian Spy🕵️ trying to steal your gold in Tel Aviv! */ - _(" 💥 You caught %s %s %s %s trying" + _(" [`boom`] You caught %s %s %s %s trying" " to steal your gold in %s!"), (is_unit_plural(act_unit) ? "" : indefinite_article_for_word(nation_adjective_for_player(act_player), false)), nation_adjective_for_player(act_player), @@ -1747,13 +1779,13 @@ bool spy_steal_gold(struct player *act_player, struct unit *act_unit, /* Notify everyone involved. */ notify_player(act_player, tgt_tile, E_MY_SPY_STEAL_GOLD, ftc_server, /* TRANS: unit, gold, city */ - PL_("​[`gold`] Your %s %s stole %d gold from %s.", - "​[`gold`] Your %s %s stole %d gold from %s.", gold_give), + PL_("[`gold`] Your %s %s stole %d gold from %s.", + "[`gold`] Your %s %s stole %d gold from %s.", gold_give), UNIT_EMOJI(act_unit), unit_link(act_unit), gold_give, tgt_city_link); notify_player(tgt_player, tgt_tile, E_ENEMY_SPY_STEAL_GOLD, ftc_server, /* TRANS: gold, city, nation */ - PL_("⚠️ %d gold stolen from %s, %s suspected.", - "⚠️ %d gold stolen from %s, %s suspected.", gold_take), + PL_("[`warning`] %d gold stolen from %s, %s suspected.", + "[`warning`] %d gold stolen from %s, %s suspected.", gold_take), gold_take, tgt_city_link, nation_plural_for_player(act_player)); @@ -1830,13 +1862,13 @@ bool spy_steal_some_maps(struct player *act_player, struct unit *act_unit, if (diplomat_was_caught(act_player, act_unit, tgt_city, tgt_player, paction)) { notify_player(act_player, tgt_tile, E_MY_DIPLOMAT_FAILED, ftc_server, - _(" ⚠️ Your %s %s was captured trying to" + _(" [`warning`] Your %s %s was captured trying to" " steal %s maps!"), unit_tile_link(act_unit), UNIT_EMOJI(act_unit), nation_adjective_for_player(tgt_player)); notify_player(tgt_player, tgt_tile, E_ENEMY_DIPLOMAT_FAILED, ftc_server, - _(" 💥 You caught %s %s %s %s trying to steal" + _(" [`boom`] You caught %s %s %s %s trying to steal" " your maps in %s!"), (is_unit_plural(act_unit) ? "" : indefinite_article_for_word(nation_adjective_for_player(act_player),false)), nation_adjective_for_player(act_player), @@ -1861,12 +1893,12 @@ bool spy_steal_some_maps(struct player *act_player, struct unit *act_unit, /* Notify everyone involved. */ notify_player(act_player, tgt_tile, E_MY_SPY_STEAL_MAP, ftc_server, - _(" 💼 Your %s %s stole parts of the %s world map in %s."), + _(" [`briefcase`] Your %s %s stole parts of the %s world map in %s."), UNIT_EMOJI(act_unit), unit_link(act_unit), nation_adjective_for_player(tgt_player), tgt_city_link); notify_player(tgt_player, tgt_tile, E_ENEMY_SPY_STEAL_MAP, ftc_server, - _(" ⚠️ The %s are suspected of stealing" + _(" [`warning`] The %s are suspected of stealing" " our maps in %s."), nation_plural_for_player(act_player), tgt_city_link); @@ -1933,13 +1965,13 @@ bool spy_nuke_city(struct player *act_player, struct unit *act_unit, if (diplomat_was_caught(act_player, act_unit, tgt_city, tgt_player, paction)) { notify_player(act_player, tgt_tile, E_MY_DIPLOMAT_FAILED, ftc_server, - _(" ⚠️ Your %s %s was captured trying to" + _(" [`warning`] Your %s %s was captured trying to" " hide a nuke in %s!"), unit_tile_link(act_unit), UNIT_EMOJI(act_unit), tgt_city_link); notify_player(tgt_player, tgt_tile, E_ENEMY_DIPLOMAT_FAILED, ftc_server, - _(" 💥 You caught %s %s %s %s trying to hide a nuke in %s!"), + _(" [`boom`] You caught %s %s %s %s trying to hide a nuke in %s!"), indefinite_article_for_word(nation_adjective_for_player(act_player),false), nation_adjective_for_player(act_player), unit_tile_link(act_unit), UNIT_EMOJI(act_unit), @@ -1959,11 +1991,11 @@ bool spy_nuke_city(struct player *act_player, struct unit *act_unit, /* Notify everyone involved. */ notify_player(act_player, tgt_tile, E_MY_SPY_NUKE, ftc_server, - _(" ☢ Your %s %s hid a nuke in %s."), + _(" [`fallout`] Your %s %s hid a nuke in %s."), UNIT_EMOJI(act_unit), unit_link(act_unit), tgt_city_link); notify_player(tgt_player, tgt_tile, E_ENEMY_SPY_NUKE, ftc_server, - _(" ☢ The %s are suspected of hiding a nuke in %s."), + _(" [`fallout`] The %s are suspected of hiding a nuke in %s."), nation_plural_for_player(act_player), tgt_city_link); @@ -2273,7 +2305,7 @@ static bool diplomat_infiltrate_tile(struct player *pplayer, notify_player(pplayer, ptile, E_ENEMY_DIPLOMAT_FAILED, ftc_server, /* TRANS: [A] Persian Spy has been eliminated by your Spy. */ - _(" 💥 %s %s %s %s has been eliminated by your %s %s."), + _(" [`boom`] %s %s %s %s has been eliminated by your %s %s."), (is_unit_plural(punit) ? "" : indefinite_article_for_word(nation_adjective_for_player(uplayer),true)), nation_adjective_for_player(uplayer), link_unit, UNIT_EMOJI(punit), @@ -2283,7 +2315,7 @@ static bool diplomat_infiltrate_tile(struct player *pplayer, if (uplayer == cplayer) { notify_player(cplayer, ptile, E_MY_DIPLOMAT_FAILED, ftc_server, /* TRANS: ... ... */ - _(" ⚠️ Your %s %s has been eliminated defending %s" + _(" [`warning`] Your %s %s has been eliminated defending %s" " against %s %s %s %s."), link_unit, UNIT_EMOJI(punit), link_city, indefinite_article_for_word(nation_adjective_for_player(pplayer),false), @@ -2293,7 +2325,7 @@ static bool diplomat_infiltrate_tile(struct player *pplayer, notify_player(cplayer, ptile, E_MY_DIPLOMAT_FAILED, ftc_server, /* TRANS: ... * TRANS: ... */ - _(" ⚠️ %s %s %s %s has been eliminated defending %s against %s %s %s %s."), + _(" [`warning`] %s %s %s %s has been eliminated defending %s against %s %s %s %s."), indefinite_article_for_word(nation_adjective_for_player(uplayer),true), nation_adjective_for_player(uplayer), link_unit, UNIT_EMOJI(punit), @@ -2304,7 +2336,7 @@ static bool diplomat_infiltrate_tile(struct player *pplayer, notify_player(uplayer, ptile, E_MY_DIPLOMAT_FAILED, ftc_server, /* TRANS: ... ... * TRANS: ... */ - _(" ⚠️ Your %s %s has been eliminated in the %s city of %s " + _(" [`warning`] Your %s %s has been eliminated in the %s city of %s " "by %s %s %s %s."), link_unit, UNIT_EMOJI(punit), nation_adjective_for_player(cplayer), link_city, @@ -2316,7 +2348,7 @@ static bool diplomat_infiltrate_tile(struct player *pplayer, else { // pplayer succeeded in eliminating uplayer's spy. there is no city or cplayer(?) notify_player(uplayer, ptile, E_MY_DIPLOMAT_FAILED, ftc_server, /* TRANS: ... */ - _(" ⚠️ Your %s %s has been eliminated defending " + _(" [`warning`] Your %s %s has been eliminated defending " "against %s %s %s %s."), link_unit, UNIT_EMOJI(punit), indefinite_article_for_word(nation_adjective_for_player(pplayer),false), nation_adjective_for_player(pplayer), @@ -2350,7 +2382,7 @@ static bool diplomat_infiltrate_tile(struct player *pplayer, sprintf(pdiplomat_emoji, "%s", UNIT_EMOJI(pdiplomat)); notify_player(pplayer, ptile, E_MY_DIPLOMAT_FAILED, ftc_server, - _(" ⚠️ Your %s %s %s eliminated by a defending %s %s %s."), + _(" [`warning`] Your %s %s %s eliminated by a defending %s %s %s."), link_diplomat, pdiplomat_emoji, (is_unit_plural(pdiplomat) ? "were" : "was"), nation_adjective_for_player(uplayer), @@ -2359,14 +2391,14 @@ static bool diplomat_infiltrate_tile(struct player *pplayer, if (pcity) { if (uplayer == cplayer) { notify_player(cplayer, ptile, E_ENEMY_DIPLOMAT_FAILED, ftc_server, - _(" 💥 Your %s %s eliminated %s %s %s %s who attacked %s."), + _(" [`boom`] Your %s %s eliminated %s %s %s %s who attacked %s."), UNIT_EMOJI(punit), link_unit, indefinite_article_for_word(nation_adjective_for_player(pplayer),false), nation_adjective_for_player(pplayer), link_diplomat, pdiplomat_emoji, link_city); } else { notify_player(cplayer, ptile, E_ENEMY_DIPLOMAT_FAILED, ftc_server, - _(" 💥 %s %s %s %s eliminated %s %s %s %s who attacked %s."), + _(" [`boom`] %s %s %s %s eliminated %s %s %s %s who attacked %s."), indefinite_article_for_word(nation_adjective_for_player(uplayer),true), nation_adjective_for_player(uplayer), UNIT_EMOJI(punit), link_unit, @@ -2374,7 +2406,7 @@ static bool diplomat_infiltrate_tile(struct player *pplayer, nation_adjective_for_player(pplayer), link_diplomat, pdiplomat_emoji, link_city); notify_player(uplayer, ptile, E_ENEMY_DIPLOMAT_FAILED, ftc_server, - _(" 💥 Your %s %s eliminated %s %s %s %s who attacked %s."), + _(" [`boom`] Your %s %s eliminated %s %s %s %s who attacked %s."), UNIT_EMOJI(punit), link_unit, indefinite_article_for_word(nation_adjective_for_player(pplayer),false), nation_adjective_for_player(pplayer), @@ -2384,7 +2416,7 @@ static bool diplomat_infiltrate_tile(struct player *pplayer, else { // pplayer failed in the open field, there is no city or cplayer? notify_player(uplayer, ptile, E_ENEMY_DIPLOMAT_FAILED, ftc_server, - _(" 💥 Your %s %s killed an attacking %s %s %s in the open field."), + _(" [`boom`] Your %s %s killed an attacking %s %s %s in the open field."), UNIT_EMOJI(punit), link_unit, //indefinite_article_for_word(nation_adjective_for_player(pplayer),false), nation_adjective_for_player(pplayer), @@ -2523,7 +2555,7 @@ static void diplomat_escape_full(struct player *pplayer, || fc_rand (100) < escapechance)) { /* Attacking Spy/Diplomat survives. */ notify_player(pplayer, ptile, E_MY_DIPLOMAT_ESCAPE, ftc_server, - _("💼 Your %s %s completed" + _("[`briefcase`] Your %s %s completed" " the mission and returned to %s."), UNIT_EMOJI(pdiplomat), unit_link(pdiplomat), city_link(spyhome)); @@ -2543,23 +2575,23 @@ static void diplomat_escape_full(struct player *pplayer, } else { if (city_related) { notify_player(pplayer, ptile, E_MY_DIPLOMAT_FAILED, ftc_server, - _("⚠️ Your %s %s was captured after completing" + _("[`warning`] Your %s %s was captured after completing" " the mission in %s."), unit_tile_link(pdiplomat), UNIT_EMOJI(pdiplomat), vlink); notify_player(victim_player, ptile, E_DIPLOMATIC_INCIDENT, ftc_server, - _("⚠️ Enemy %s %s captured after completing" + _("[`warning`] Enemy %s %s captured after completing" " the mission in %s."), unit_tile_link(pdiplomat), UNIT_EMOJI(pdiplomat), vlink); } else { notify_player(pplayer, ptile, E_MY_DIPLOMAT_FAILED, ftc_server, - _("⚠️ Your %s %s was captured after completing" + _("[`warning`] Your %s %s was captured after completing" " the mission."), unit_tile_link(pdiplomat), UNIT_EMOJI(pdiplomat)); notify_player(victim_player, ptile, E_DIPLOMATIC_INCIDENT, ftc_server, - _("⚠️ Enemy %s %s captured after completing" + _("[`warning`] Enemy %s %s captured after completing" " the mission."), unit_tile_link(pdiplomat), UNIT_EMOJI(pdiplomat)); } diff --git a/freeciv/freeciv/server/gamehand.c b/freeciv/freeciv/server/gamehand.c index 7657c4abe..291a30832 100644 --- a/freeciv/freeciv/server/gamehand.c +++ b/freeciv/freeciv/server/gamehand.c @@ -867,7 +867,8 @@ void send_year_to_clients(void) /* Hmm, clients could add this themselves based on above packet? */ notify_conn(game.est_connections, NULL, E_NEXT_YEAR, ftc_any, - _("✨✨Year: %s✨✨"), calendar_text()); + _(" [`sparkle`] [`sparkle`] Year: %s [`earth`] Turn: %d [`sparkle`] [`sparkle`]"), + calendar_text(), game.info.turn); // Pax Dei counter is something players should know: if (game.server.pax_dei_set && game.server.pax_dei_counter>0) { @@ -876,7 +877,7 @@ void send_year_to_clients(void) _("[`paxdei`] %d turns remain in the era of Pax Dei."), game.server.pax_dei_counter); } else notify_player(NULL, NULL, E_DIPLOMACY, ftc_server, - _("⚠️[`paxdei`] This is the final turn of Pax Dei.⚠️")); + _("[`warning`][`paxdei`] This is the final turn of Pax Dei.[`warning`]")); } } diff --git a/freeciv/freeciv/server/handchat.c b/freeciv/freeciv/server/handchat.c index deab7f4c9..7499b07b3 100644 --- a/freeciv/freeciv/server/handchat.c +++ b/freeciv/freeciv/server/handchat.c @@ -185,12 +185,12 @@ static void chat_msg_to_conn(struct connection *sender, /* Repeat the message for the sender. */ send_chat_msg(sender, sender, ftc_any, E_CHAT_MSG_PRIVATE_SENT, - "%s🠄%s
%s", + "%s%s
%s", dest_name, sender_flag, msg); if (sender != dest) { send_chat_msg(dest, sender, ftc_any, E_CHAT_MSG_PRIVATE_RCVD, - "%s %s🠆
%s", + "%s %s
%s", sender_flag, sender_name, msg); } } @@ -232,19 +232,19 @@ static void chat_msg_to_player(struct connection *sender, /* Repeat the message for the sender. */ send_chat_msg(sender, sender, ftc_any, E_CHAT_MSG_PRIVATE_SENT, - "%s🠄%s
%s", + "%s%s
%s", player_name(pdest), sender_flag, msg); /* Send the message to destination. */ if (NULL != dest && dest != sender) { send_chat_msg(dest, sender, ftc_any, E_CHAT_MSG_PRIVATE_RCVD, - "%s %s🠆
%s", + "%s %s
%s", sender_flag, sender_name, msg); }//color="#caa3b3" /* Send the message to player observers. */ package_chat_msg(&packet, sender, ftc_any, E_CHAT_MSG_PRIVATE_RCVD, - "%s %s🠆%s %s:
%s", sender_flag, sender_name, + "%s %s%s %s:
%s", sender_flag, sender_name, player_name(pdest), dest_flag, msg); conn_list_iterate(pdest->connections, pconn) { if (pconn != dest @@ -285,7 +285,7 @@ static void chat_msg_to_allies(struct connection *sender, char *msg) form_chat_flag(sender, sender_flag, sizeof(sender_flag)); package_chat_msg(&packet, sender, ftc_any, E_CHAT_MSG_ALLY, - _("%s %s🠆allies:
%s"), + _("%s %sallies:
%s"), sender_flag, sender_name, msg); players_iterate(aplayer) { diff --git a/freeciv/freeciv/server/maphand.c b/freeciv/freeciv/server/maphand.c index a374cf075..be4046c45 100644 --- a/freeciv/freeciv/server/maphand.c +++ b/freeciv/freeciv/server/maphand.c @@ -107,7 +107,7 @@ void global_warming(int effect) // It can take a while so notify first. notify_player(NULL, NULL, E_GLOBAL_ECO, ftc_server, - _("[`events/globalwarming`]
🌞 Global warming is occurring! " + _("[`events/globalwarming`]
[`sun2`] Global warming is occurring! " "Coastlines are flooding. Hotter climate is " "affecting vegetation.")); @@ -123,7 +123,7 @@ void nuclear_winter(int effect) { // It can take a while so notify first. notify_player(NULL, NULL, E_GLOBAL_ECO, ftc_server, - _("[`events/nuclearwinter`]
⚠️ Nuclear winter is happening!
" + _("[`events/nuclearwinter`]
[`snow`] Nuclear winter is happening!
" "Wetlands are drying. Ranges of plains and " "Grassland may become tundra.")); @@ -312,14 +312,14 @@ void upgrade_all_city_extras(struct player *pplayer, bool discovery) if (discovery) { if (percent >= 75) { notify_player(pplayer, NULL, E_TECH_GAIN, ftc_server, - _("💡 New hope sweeps like fire through the country as " + _("[`bulb`] New hope sweeps like fire through the country as " "the discovery of new infrastructure building technology " "is announced.")); } } else { if (percent >= 75) { notify_player(pplayer, NULL, E_TECH_GAIN, ftc_server, - _("💡 The people are pleased to hear that your " + _("[`bulb`] The people are pleased to hear that your " "scientists finally know about new infrastructure building " "technology.")); } @@ -327,11 +327,11 @@ void upgrade_all_city_extras(struct player *pplayer, bool discovery) if (multiple_types) { notify_player(pplayer, NULL, E_TECH_GAIN, ftc_server, - _("💡 With new tech, Workers upgrade appropriate " + _("[`bulb`] With new tech, Workers upgrade appropriate " "cities with better infrastructure.")); } else { notify_player(pplayer, NULL, E_TECH_GAIN, ftc_server, - _("💡 With new tech, Workers upgrade appropriate " + _("[`bulb`] With new tech, Workers upgrade appropriate " "cities with %s."), extra_name_translation(upgradet)); } } @@ -880,7 +880,7 @@ bool map_is_known_and_seen(const struct tile *ptile, const struct player *pplayer, enum vision_layer vlayer) { - return (map_is_known(ptile, pplayer) + return (ptile && pplayer && map_is_known(ptile, pplayer) && 0 < map_get_seen(pplayer, ptile, vlayer)); } @@ -1785,7 +1785,7 @@ static void check_units_single_tile(struct tile *ptile) unit_rule_name(punit), TILE_XY(unit_tile(punit))); notify_player(unit_owner(punit), unit_tile(punit), E_UNIT_LOST_MISC, ftc_server, - _("⚠️ Disbanded your %s due to changing terrain."), + _("[`warning`] Disbanded your %s due to changing terrain."), unit_tile_link(punit)); wipe_unit(punit, ULR_NONNATIVE_TERR, NULL); } @@ -2305,6 +2305,12 @@ void map_claim_base(struct tile *ptile, struct extra_type *pextra, pbase = extra_base_get(pextra); fc_assert_ret(pbase != NULL); + /* the above line would leave without freeing could_see_unit? + if (pbase == NULL) { + log_error("map_claim_base: pextra is not a base"); + if (could_see_unit) FC_FREE(could_see_unit); + return; + } */ /* Transfer base provided vision to new owner */ if (powner != NULL) { @@ -2346,6 +2352,10 @@ void map_claim_base(struct tile *ptile, struct extra_type *pextra, if (powner != NULL) { map_claim_border_ownership(ptile, powner, ptile); map_claim_border(ptile, powner, -1); + /* Since this is a tile_claiming_base, remove any original claimant (e.g. foreign city)*/ + if (ptile->owner == powner) { + ptile->claimer = ptile; + } } city_thaw_workers_queue(); city_refresh_queue_processing(); @@ -2483,7 +2493,13 @@ void destroy_extra(struct tile *ptile, struct extra_type *pextra) struct player *owner = extra_owner(ptile); if (territory_claiming_base(pbase)) { + /* clear all surrounding tiles claimed by this extra */ map_clear_border(ptile); + /* ownership of the base-tile is maintained on the turn the + * base is destroyed: allows the right city to claim the tile + * on the next turn. */ + ptile->owner = owner; + if (ptile->worked) ptile->claimer = city_tile(ptile->worked); } if (NULL != owner @@ -2697,7 +2713,6 @@ static const char *popup_info_text(struct tile *ptile, struct player *pplayer, vision_type = TILE_UNKNOWN; } const char *activity_text; - int dummy=0; // int * param needed to fetch turns remaining for work if (ptile == NULL || !ptile || !pplayer || pplayer == NULL) return NULL; struct city *pcity = tile_city(ptile); @@ -2863,7 +2878,7 @@ static const char *popup_info_text(struct tile *ptile, struct player *pplayer, astr_add_line(&str, _("Infrastructure: %s%s%s"), bold, infratext, unbold); } } - activity_text = concat_tile_activity_text(ptile, &dummy); + activity_text = concat_tile_activity_text(ptile); if (strlen(activity_text) > 0) { astr_add_line(&str, _("Activity: %s%s%s"), bold, activity_text, unbold); } @@ -2912,29 +2927,44 @@ static const char *popup_info_text(struct tile *ptile, struct player *pplayer, // Info reserved for unit's owner: UWT and exact bribe cost: if (unit_owner(punit) == pplayer) { - /* Show bribe cost for own units and UWT for own units. */ - ///////////UWT GOES HERE: + /* Show UWT for own units: */ if (game.server.unitwaittime > 0) { if (punit->server.action_timestamp > 0) { int dt = time(NULL) - punit->server.action_timestamp; if (dt < game.server.unitwaittime) { char uwt_msg[64]; + char time_release[64]; format_time_duration(game.server.unitwaittime - dt, uwt_msg, sizeof(uwt_msg)); + + struct packet_timeout_info tinfo; + tinfo = game.tinfo; + tinfo.seconds_to_phasedone = game.tinfo.seconds_to_phasedone + - timer_read_seconds(game.server.phase_timer) + - game.server.additional_phase_seconds; + + /* This unit has non-expired UWT on this turn: */ if (punit->server.action_turn == game.info.turn - 1) { astr_add_line(&str, _("Wait Time left this turn: %s%s%s"), bold, uwt_msg, unbold); } - else { // assume order was given this turn - astr_add_line(&str, _("Wait Time left this turn: %sNone.%s"),bold,unbold); - astr_add_line(&str, _("Wait for next turn expires: %s%s%s"), bold, uwt_msg, unbold); + else { /* This unit's UWT comes from an order given this turn: */ + if (game.server.unitwaittime - dt > tinfo.seconds_to_phasedone + 2 /* 0m2s cushion */) { + format_time_duration((game.server.unitwaittime - dt) - tinfo.seconds_to_phasedone, + time_release, sizeof(time_release)); + astr_add_line(&str, _("Wait Time next turn ends in %s%s%s"), + bold, uwt_msg, unbold); + astr_add_line(&str, _(" ... %s%s%s after turn change"), + bold, time_release, unbold); + } } } } } + /* Show bribe cost for own units: */ astr_add_line(&str, _("Bribe cost: %s%d%s"), bold, unit_bribe_cost(punit, pplayer), unbold); } else { - /* We can only give an (lower) boundary for units of other players. */ - astr_add_line(&str, _("Estimated bribe cost: > %s%d%s"), + /* We can only give a (lower) boundary for units of other players. */ + astr_add_line(&str, _("Estimated bribe cost: ≥ %s%d%s gold"), bold, unit_bribe_cost(punit, pplayer), unbold); } diff --git a/freeciv/freeciv/server/notify.c b/freeciv/freeciv/server/notify.c index 74e474073..5f781a24e 100644 --- a/freeciv/freeciv/server/notify.c +++ b/freeciv/freeciv/server/notify.c @@ -763,13 +763,53 @@ void send_pending_events(struct connection *pconn, bool include_public) event_cache_iterate(pdata) { if (event_cache_match(pdata, pplayer, is_global_observer, include_public)) { + pcm = pdata->packet; + if (game.server.event_cache.info) { - /* add turn and time to the message */ - strftime(timestr, sizeof(timestr), "%H:%M:%S", - localtime(&pdata->timestamp)); - pcm = pdata->packet; - fc_snprintf(pcm.message, sizeof(pcm.message), "(T%d - %s) %s", - pdata->packet.turn, timestr, pdata->packet.message); + /* Add turn and time to game critical events where the time is important. + (Not stuff that was manually initiated like changing prod, or what + happens every turn change) */ + switch (pcm.event) { + case E_CITY_LOST: + case E_CITY_NUKED: + case E_CITY_TRANSFER: + case E_CIVIL_WAR: + case E_FIRST_CONTACT: + case E_DIPLOMATIC_INCIDENT: + case E_ENEMY_DIPLOMAT_BRIBE: + case E_ENEMY_DIPLOMAT_EMBASSY: + case E_ENEMY_DIPLOMAT_FAILED: + case E_ENEMY_DIPLOMAT_INCITE: + case E_ENEMY_DIPLOMAT_POISON: + case E_ENEMY_DIPLOMAT_SABOTAGE: + case E_ENEMY_DIPLOMAT_THEFT: + case E_ENEMY_SPY_STEAL_GOLD: + case E_ENEMY_SPY_STEAL_MAP: + case E_ENEMY_SPY_NUKE: + case E_CARAVAN_ACTION: + case E_DESTROYED: + case E_NUKE: + case E_TREATY_BROKEN: + case E_UNIT_LOST_ATT: + case E_UNIT_WIN_ATT: + case E_UNIT_LOST_DEF: + case E_UNIT_WIN_DEF: + case E_UNIT_SENTRY_WAKE: /* sentry reports */ + case E_UNIT_WAS_EXPELLED: + case E_UNIT_ESCAPED: + case E_DIPLOMACY: + case E_CHAT_MSG_PUBLIC: + case E_CHAT_MSG_PRIVATE_SENT: + case E_CHAT_MSG_PRIVATE_RCVD: + case E_CHAT_MSG_ALLY: + strftime(timestr, sizeof(timestr), "%H:%M", + localtime(&pdata->timestamp)); + fc_snprintf(pcm.message, sizeof(pcm.message), "%s %s", + pdata->packet.message, timestr); + break; + default: + break; + } notify_conn_packet(pconn->self, &pcm, FALSE); } else { notify_conn_packet(pconn->self, &pdata->packet, FALSE); diff --git a/freeciv/freeciv/server/plrhand.c b/freeciv/freeciv/server/plrhand.c index a115ddcfc..11cceb8fb 100644 --- a/freeciv/freeciv/server/plrhand.c +++ b/freeciv/freeciv/server/plrhand.c @@ -46,6 +46,7 @@ #include "luascript_types.h" /* server */ +#include "actiontools.h" #include "aiiface.h" #include "barbarian.h" #include "citytools.h" @@ -162,7 +163,7 @@ void kill_player(struct player *pplayer) if (!is_barbarian(pplayer)) { notify_player(NULL, NULL, E_DESTROYED, ftc_server, - _("💀 The %s are no more!"), + _("[`skull`] The %s are no more!"), nation_plural_for_player(pplayer)); } @@ -270,7 +271,10 @@ static int get_player_maxrate(struct player *pplayer) int maxrate = get_player_bonus(pplayer, EFT_MAX_RATES); if (maxrate == 0) { - return 100; /* effects not initialized yet */ + /* 25.3.2020: hacky fix for lt players getting 100 sci, + this shouldn't matter because 60 is just as arbitrary + as 100 */ + return 60; /* effects not initialized yet */ } /* 34 + 33 + 33 = 100 */ @@ -327,6 +331,41 @@ void handle_player_rates(struct player *pplayer, } } +/**********************************************************************//** + Returns whether a play can immediately transition to new governments. +**************************************************************************/ +static bool immediate_revolution(struct player *pplayer) +{ + /* whether transition to new gov is instant or (may) require turn delays: + * EFT_NO_ANARCHY (1..9): instant. EFT_NO_ANARCHY (10+): not instant: + but transitional gov = current gov */ + /* TODO: logic/mechanics for when immediacy happens can be expanded + out of this semi-hard-coded logic to more ruleset fluid logic */ + return get_player_bonus(pplayer, EFT_NO_ANARCHY) >= 1 + && get_player_bonus(pplayer, EFT_NO_ANARCHY) < 10; +} +/**********************************************************************//** + Returns the transition government a player must have during their + revolution period of switching governments. +**************************************************************************/ +static struct government *revolution_government(struct player *pplayer) { + /* Start with the default revolution gov: */ + struct government *plr_revo_gov = game.government_during_revolution; + + /* whether Anarchy gov is needed to transition */ + bool anarchy = get_player_bonus(pplayer, EFT_NO_ANARCHY) <= 0; + bool immediacy = immediate_revolution(pplayer); + + /* if Anarchy gov is not required as transitional government, BUT + the revolution is not immediate, then the player's transitional + government is the same government they have now. */ + if (!anarchy && !immediacy) { + plr_revo_gov = pplayer->government; + } + + return plr_revo_gov; +} + /**********************************************************************//** Finish the revolution and set the player's government. Call this as soon as the player has set a target_government and the revolution_finishes @@ -339,7 +378,7 @@ void government_change(struct player *pplayer, struct government *gov, if (revolution_finished) { fc_assert_ret(pplayer->target_government - != game.government_during_revolution + != revolution_government(pplayer) && NULL != pplayer->target_government); fc_assert_ret(pplayer->revolution_finishes <= game.info.turn); @@ -405,10 +444,15 @@ void government_change(struct player *pplayer, struct government *gov, **************************************************************************/ int revolution_length(struct government *gov, struct player *plr) { + struct government *rev_gov = revolution_government(plr); int turns; - if (!untargeted_revolution_allowed() - && gov == game.government_during_revolution) { + /* [A] REVOLEN_QUICKENING, REVOLEN_RANDQUICK alter revo-time so can't + be targetless. [B] (revo-time && !anarchy) can't be targetless + because its raison d'être is avoiding "SuperGovs" that can exploit + the bonuses of every Gov in a single turn: */ + if (gov==rev_gov && (!untargeted_revolution_allowed() /*[A]*/ + /*[B]*/ || rev_gov != game.government_during_revolution)) { /* Targetless revolution not acceptable */ notify_player(plr, NULL, E_REVOLT_DONE, ftc_server, _("You can't revolt without selecting target government.")); @@ -443,9 +487,10 @@ void handle_player_change_government(struct player *pplayer, Government_type_id government) { int turns; + struct government *plr_revo_gov = revolution_government(pplayer); struct government *gov = government_by_number(government); - bool anarchy; - + bool anarchy; /* whether transitions need an "anarchy/revolution gov" */ + bool immediacy; /* whether the transition to new gov is immediate */ if (!gov || !can_change_to_government(pplayer, gov)) { return; } @@ -457,6 +502,7 @@ void handle_player_change_government(struct player *pplayer, pplayer->revolution_finishes, game.info.turn); anarchy = get_player_bonus(pplayer, EFT_NO_ANARCHY) <= 0; + immediacy = immediate_revolution(pplayer); /* Set revolution_finishes value. */ if (pplayer->revolution_finishes > 0) { @@ -467,8 +513,9 @@ void handle_player_change_government(struct player *pplayer, * a government). */ turns = pplayer->revolution_finishes - game.info.turn; } else if ((is_ai(pplayer) && !has_handicap(pplayer, H_REVOLUTION)) - || !anarchy) { - /* AI players without the H_REVOLUTION handicap can skip anarchy */ + || (!anarchy && immediacy)) { + /* AI players without the H_REVOLUTION handicap, and Human players with + immediacy of transition (&& no anarchy) can skip anarchy */ turns = 0; } else { turns = revolution_length(gov, pplayer); @@ -478,7 +525,7 @@ void handle_player_change_government(struct player *pplayer, } if (anarchy && turns <= 0 - && pplayer->government != game.government_during_revolution) { + && pplayer->government != plr_revo_gov) { /* Multiple changes attempted after single anarchy period */ if (game.info.revolentype == REVOLEN_QUICKENING) { notify_player(pplayer, NULL, E_REVOLT_DONE, ftc_server, @@ -487,9 +534,23 @@ void handle_player_change_government(struct player *pplayer, } } - pplayer->government = game.government_during_revolution; +/* PLACEHOLDER, ruleset flexibility for ruleset-defined transition periods. */ +bool block_rf = false; // blocks multiple changing of govs in the same turn after revo finished +#ifdef FREECIV_WEB + struct impr_type *ecc_pal = improvement_by_rule_name("Ecclesiastical Palace"); + int theo = government_index(government_by_rule_name("Theocracy")); + + if (!immediacy && theo != -1 && ecc_pal != NULL + && theo == government && wonder_is_built(pplayer, ecc_pal)) { + turns = 0; + block_rf = true; + pplayer->revolution_finishes = -1; + } +#endif + + pplayer->government = plr_revo_gov; pplayer->target_government = gov; - pplayer->revolution_finishes = game.info.turn + turns; + if (!block_rf) pplayer->revolution_finishes = game.info.turn + turns; log_debug("Revolution started for %s. Target government is %s. " "Revofin %d (%d).", player_name(pplayer), @@ -497,8 +558,7 @@ void handle_player_change_government(struct player *pplayer, pplayer->revolution_finishes, game.info.turn); /* Now see if the revolution is instantaneous. */ - if (turns <= 0 - && pplayer->target_government != game.government_during_revolution) { + if (turns <= 0 && pplayer->target_government != plr_revo_gov) { government_change(pplayer, pplayer->target_government, TRUE); return; } else if (turns > 0) { @@ -506,19 +566,21 @@ void handle_player_change_government(struct player *pplayer, /* TRANS: this is a message event so don't make it * too long. */ PL_("The %s have incited a revolt! " - "%d turn of anarchy will ensue! " + "%d turn of %s will ensue! " "Target government is %s.", "The %s have incited a revolt! " - "%d turns of anarchy will ensue! " + "%d turns of %s will ensue! " "Target government is %s.", turns), nation_plural_for_player(pplayer), turns, + government_name_translation(plr_revo_gov), government_name_translation(pplayer->target_government)); } else { - fc_assert(pplayer->target_government == game.government_during_revolution); + fc_assert(pplayer->target_government == plr_revo_gov); notify_player(pplayer, NULL, E_REVOLT_START, ftc_server, - _("Revolution: returning to anarchy.")); + _("Revolution: returning to %s."), + government_name_translation(plr_revo_gov)); } check_player_max_rates(pplayer); @@ -539,6 +601,7 @@ void handle_player_change_government(struct player *pplayer, void update_revolution(struct player *pplayer) { struct government *current_gov; + struct government *plr_revo_gov = revolution_government(pplayer); /* The player's revolution counter is stored in the revolution_finishes * field. This value has the following meanings: @@ -558,6 +621,9 @@ void update_revolution(struct player *pplayer) * and the player can leave the revolution at any time. The value * is reset at the end of any turn when a non-anarchy government is * chosen. + * * If the player has non-immediate revolution without transitional + * anarchy/revolutionary gov, then we're forced to end the revolution + * immediately after achieving the new gov (avoids legacy logic mess). */ log_debug("Update revolution for %s. Current government %s, " "target %s, revofin %d, turn %d.", player_name(pplayer), @@ -568,13 +634,19 @@ void update_revolution(struct player *pplayer) current_gov = government_of_player(pplayer); - if (current_gov == game.government_during_revolution + if (current_gov == plr_revo_gov + && -1 < pplayer->revolution_finishes && pplayer->revolution_finishes <= game.info.turn) { - if (pplayer->target_government != game.government_during_revolution) { + if (pplayer->target_government != plr_revo_gov) { /* If the revolution is over and a target government is set, go into * the new government. */ log_debug("Update: finishing revolution for %s.", player_name(pplayer)); government_change(pplayer, pplayer->target_government, TRUE); + /* (!anarchy && !immediate) == no infinite twiddling of govs after revo */ + if (plr_revo_gov != game.government_during_revolution + && pplayer->revolution_finishes <= game.info.turn) { + pplayer->revolution_finishes = -1; + } } else { /* If the revolution is over but there's no target government set, * alert the player. */ @@ -582,9 +654,12 @@ void update_revolution(struct player *pplayer) _("You should choose a new government from the " "government menu.")); } - } else if (government_of_player(pplayer) != game.government_during_revolution - && pplayer->revolution_finishes < game.info.turn) { - /* Reset the revolution counter. If the player has another revolution + } else if ( (government_of_player(pplayer) != plr_revo_gov + && pplayer->revolution_finishes < game.info.turn) + || /* !immediate && !anarchy == can't change constantly */ + (plr_revo_gov != game.government_during_revolution + && pplayer->revolution_finishes < game.info.turn) ) + { /* Reset the revolution counter. If the player has another revolution * they'll have to re-enter anarchy. */ log_debug("Update: resetting revofin for %s.", player_name(pplayer)); pplayer->revolution_finishes = -1; @@ -681,6 +756,12 @@ void enter_war(struct player *pplayer, struct player *pplayer2) maybe_claim_base(ptile, pplayer2, old_owner); } } whole_map_iterate_end; + + /* Give casus belli to allies of both players */ + if (game.server.casusbelli_allies) { + action_give_casus_belli_to_allies(pplayer, pplayer2); + action_give_casus_belli_to_allies(pplayer2, pplayer); + } } /**********************************************************************//** @@ -725,7 +806,7 @@ void handle_diplomacy_cancel_pact(struct player *pplayer, } remove_shared_vision(pplayer, pplayer2); notify_player(pplayer2, NULL, E_TREATY_BROKEN, ftc_server, - _("⚠️ %s no longer gives us shared vision!"), + _("[`warning`] %s no longer gives us shared vision!"), player_name(pplayer)); return; } @@ -739,7 +820,7 @@ void handle_diplomacy_cancel_pact(struct player *pplayer, if (diplcheck == DIPL_SENATE_BLOCKING) { if (game.server.pax_dei_set && game.server.pax_dei_counter > 0) { notify_player(NULL, NULL, E_TREATY_BROKEN, ftc_server, - _("❗[`paxdei`]📜 The Pax Dei movement declares global shame on the " + _("[`redexclamation`][`paxdei`][`scroll`] The Pax Dei movement declares global shame on the " "%s for their unjustified request to %s %s. Pax Dei rejects their " "unrighteous petition and calls for confession!"), nation_plural_for_player(pplayer), @@ -748,7 +829,7 @@ void handle_diplomacy_cancel_pact(struct player *pplayer, } else { notify_player(pplayer, NULL, E_TREATY_BROKEN, ftc_server, - _("❗📜 The senate will not allow you to break treaty " + _("[`redexclamation`][`scroll`] The senate will not allow you to break treaty " "with the %s. You must either dissolve the senate " "or wait until a more timely moment."), nation_plural_for_player(pplayer2)); @@ -800,13 +881,13 @@ void handle_diplomacy_cancel_pact(struct player *pplayer, /* if there's a reason to cancel the pact, do it without penalty */ /* FIXME: in the current implementation if you break more than one - * treaty simultaneously it may partially succed: the first treaty-breaking + * treaty simultaneously it may partially succeed: the first treaty-breaking * will happen but the second one will fail. */ if (get_player_bonus(pplayer, EFT_HAS_SENATE) > 0 && !repeat) { if (ds_plrplr2->has_reason_to_cancel > 0) { if (game.server.pax_dei_set && game.server.pax_dei_counter > 0) { notify_player(NULL, NULL, E_TREATY_BROKEN, ftc_server, - _("✅[`paxdei`]📜 The Pax Dei movement declares the " + _("[`check`][`paxdei`][`scroll`] The Pax Dei movement declares the " "%s request to %s as righteous. They were shamefully provoked by " "the sinful deeds of the %s!"), nation_adjective_for_player(pplayer), @@ -815,7 +896,7 @@ void handle_diplomacy_cancel_pact(struct player *pplayer, } else { notify_player(pplayer, NULL, E_TREATY_BROKEN, ftc_server, - _("✅📜 The senate passes your bill because of the " + _("[`check`][`scroll`] The senate passes your bill because of the " "constant provocations of the %s."), nation_plural_for_player(pplayer2)); } @@ -823,14 +904,14 @@ void handle_diplomacy_cancel_pact(struct player *pplayer, else if (new_type == DS_WAR) { if (game.server.pax_dei_set && game.server.pax_dei_counter > 0) { notify_player(NULL, NULL, E_TREATY_BROKEN, ftc_server, - _("⚠️[`paxdei`]📜 The Pax Dei movement declares global shame on the %s " + _("[`warning`][`paxdei`][`scroll`] The Pax Dei movement declares global shame on the %s " "for breaking their treaty to declare war on the %s. The %s must confess their crimes!"), nation_adjective_for_player(pplayer), nation_plural_for_player(pplayer2), nation_adjective_for_player(pplayer)); } notify_player(pplayer, NULL, E_TREATY_BROKEN, ftc_server, - _("✅📜 Your senate refuses to break treaty with the %s, " + _("[`check`][`scroll`] Your senate refuses to break treaty with the %s, " "but you have no trouble finding a new senate."), nation_plural_for_player(pplayer2)); } @@ -854,14 +935,14 @@ void handle_diplomacy_cancel_pact(struct player *pplayer, sync_cities(); notify_player(pplayer, NULL, E_TREATY_BROKEN, ftc_server, - _("📜[`%s`] The diplomatic state between the %s " + _("[`scroll`][`%s`] The diplomatic state between the %s " "and the %s is now %s."), diplstate_type_translated_name(new_type), nation_plural_for_player(pplayer), nation_plural_for_player(pplayer2), diplstate_type_translated_name(new_type)); notify_player(pplayer2, NULL, E_TREATY_BROKEN, ftc_server, - _("⚠️📜 %s canceled the diplomatic agreement! " + _("[`warning`][`scroll`] %s canceled the diplomatic agreement! " "The diplomatic state between the %s and the %s " "is now %s."), player_name(pplayer), @@ -879,7 +960,7 @@ void handle_diplomacy_cancel_pact(struct player *pplayer, * to the aggressor. This prevents in-alliance wars, which are not * permitted. */ notify_player(other, NULL, E_TREATY_BROKEN, ftc_server, - _("⚠️📜 %s has attacked your ally %s! " + _("[`warning`][`scroll`] %s has attacked your ally %s! " "You cancel your alliance to the aggressor."), player_name(pplayer), player_name(pplayer2)); @@ -892,7 +973,7 @@ void handle_diplomacy_cancel_pact(struct player *pplayer, * alliance with him. We trust our team mate and break alliance * with the attacked player */ notify_player(other, NULL, E_TREATY_BROKEN, ftc_server, - _("⚠️📜 Your team-mate %s declared war on %s. " + _("[`warning`][`scroll`] Your team-mate %s declared war on %s. " "You are obligated to cancel alliance with %s."), player_name(pplayer), nation_plural_for_player(pplayer2), @@ -1320,8 +1401,7 @@ static void package_player_info(struct player *plr, non-global: altered by player- and civ-specific effects */ memset(&web_packet->advance_saved_bulbs, 0, sizeof(web_packet->advance_saved_bulbs)); // clear arrays memset(&web_packet->advance_costs, 0, sizeof(web_packet->advance_costs)); - if (info_level >= INFO_FULL || (receiver && (player_diplstate_get(plr, receiver)->type == DS_TEAM - || player_diplstate_get(plr, receiver)->type == DS_ALLIANCE))) { + if (info_level >= INFO_FULL || (receiver && pplayers_allied(plr, receiver))) { advance_index_iterate(A_NONE, i) { if (research) { /* Both info arrays always have to be present together or always absent together, as @@ -2904,11 +2984,11 @@ struct player *civil_war(struct player *pplayer) nation_rule_name(nation_of_player(pplayer)), nation_rule_name(nation_of_player(cplayer))); notify_player(pplayer, NULL, E_CIVIL_WAR, ftc_server, - _("⚠️ Your nation is thrust into civil war.")); + _("[`warning`] Your nation is thrust into civil war.")); notify_player(pplayer, NULL, E_FIRST_CONTACT, ftc_server, /* TRANS: ... the Poles. */ - _("​[`flag/%s`][`raisedfist`] %s is the rebellious leader of the %s."), + _("[`flag/%s`][`raisedfist`] %s is the rebellious leader of the %s."), nation_of_player(cplayer)->flag_graphic_str, player_name(cplayer), /* [`small_flags/%s:nation_of_player(cplayer)%/_web`] */ nation_plural_for_player(cplayer)); @@ -2931,7 +3011,7 @@ struct player *civil_war(struct player *pplayer) nation_rule_name(nation_of_player(cplayer))); notify_player(pplayer, pcity->tile, E_CITY_LOST, ftc_server, /* TRANS: ... the Poles. */ - _("​[`raisedfist`] %s declares allegiance to the %s."), + _("[`raisedfist`] %s declares allegiance to the %s."), city_link(pcity), nation_plural_for_player(cplayer)); script_server_signal_emit("city_transferred", pcity, pplayer, @@ -2956,9 +3036,9 @@ struct player *civil_war(struct player *pplayer) notify_player(NULL, NULL, E_CIVIL_WAR, ftc_server, /* TRANS: ... Danes ... Poles ... <7> cities. */ - PL_("[`flag/%s`][`events/civilwar`]
⚔️ Civil war partitions the %s;" + PL_("[`flag/%s`][`events/civilwar`]
[`swords`] Civil war partitions the %s;" " the %s now hold %d city [`flag/%s`]", - "[`flag/%s`][`events/civilwar`]
⚔️ Civil war partitions the %s;" + "[`flag/%s`][`events/civilwar`]
[`swords`] Civil war partitions the %s;" " the %s now hold %d cities [`flag/%s`]", i), nation_of_player(pplayer)->flag_graphic_str, diff --git a/freeciv/freeciv/server/sanitycheck.c b/freeciv/freeciv/server/sanitycheck.c index 87932dfd1..b8bf48b01 100644 --- a/freeciv/freeciv/server/sanitycheck.c +++ b/freeciv/freeciv/server/sanitycheck.c @@ -310,7 +310,13 @@ static void check_city_size(struct city *pcity, const char *file, int citizen_count = 0; struct tile *pcenter = city_tile(pcity); +/* FIXME: We have to temporarily suspend checking these until we work out + bugs probably caused by the new WYSIWYG city output sequencing. This + is because output accumulation is [optionally if set by server] done + before tile-rearrange, but not all sanity check logic was adjusted + for that. NB: This FIXME also exists in other check_city_ functions. SANITY_CITY(pcity, city_size_get(pcity) >= 1); + */ city_tile_iterate_skip_free_worked(city_map_radius_sq_get(pcity), pcenter, ptile, _index, _x, _y) { @@ -343,7 +349,12 @@ static void check_city_feelings(const struct city *pcity, const char *file, const char *function, int line) { int feel; - int spe = city_specialists(pcity); + /* part of FIXME below + . + . + . + . + int spe = city_specialists(pcity); */ for (feel = FEELING_BASE; feel < FEELING_LAST; feel++) { int sum = 0; @@ -357,9 +368,16 @@ static void check_city_feelings(const struct city *pcity, const char *file, * savegame despite the fact that city workers_frozen level of the city * is above zero -> can't limit sanitycheck callpoints by that. Instead * we check even more relevant needs_arrange. */ - SANITY_CITY(pcity, !pcity->server.needs_arrange); + + /* FIXME: We have to temporarily stop checking these until we work out + bugs probably caused by the new WYSIWYG city output sequencing. This + is because output accumulation is [optionally if set by server] done + before tile-rearrange, but not all sanity check logic was adjusted + for that. NB: This FIXME also exists in other check_city_ functions. + SANITY_CITY(pcity, pcity->server.needs_arrange == CNA_NOT); SANITY_CITY(pcity, city_size_get(pcity) - spe == sum); + */ } } diff --git a/freeciv/freeciv/server/savegame/savegame3.c b/freeciv/freeciv/server/savegame/savegame3.c index d980fbff3..84020b047 100644 --- a/freeciv/freeciv/server/savegame/savegame3.c +++ b/freeciv/freeciv/server/savegame/savegame3.c @@ -509,6 +509,12 @@ static void savegame3_save_real(struct section_file *file, bool scenario) { struct savedata *saving; + /* trademindist is not used in mp2c so it's a hack to allow GM to turn off + savegame debug logging by setting it to e.g., 14 */ + + /* 29 December 2021 - LIVE PRODUCTION SERVER DEBUG EMERGENCY. All notify_conn + calls are for temporary debugging. This code should have been removed. + Please report if you can read this, so we can remove it. Thanks! */ /* initialise loading */ saving = savedata_new(file, save_reason, scenario); @@ -517,31 +523,45 @@ static void savegame3_save_real(struct section_file *file, /* [scenario] */ /* This should be first section so scanning through all scenarios just for * names and descriptions would go faster. */ + sg_save_scenario(saving); + /* [savefile] */ sg_save_savefile(saving); + /* [game] */ sg_save_game(saving); + /* [random] */ sg_save_random(saving); + /* [script] */ sg_save_script(saving); + /* [settings] */ sg_save_settings(saving); + /* [ruledata] */ sg_save_ruledata(saving); + /* [map] */ sg_save_map(saving); + /* [player] */ sg_save_players(saving); + /* [research] */ sg_save_researches(saving); + /* [event_cache] */ sg_save_event_cache(saving); + /* [treaty] */ sg_save_treaties(saving); + /* [history] */ sg_save_history(saving); + /* [mapimg] */ sg_save_mapimg(saving); diff --git a/freeciv/freeciv/server/scripting/api_server_edit.c b/freeciv/freeciv/server/scripting/api_server_edit.c index e0bae90f5..ce1ab832c 100644 --- a/freeciv/freeciv/server/scripting/api_server_edit.c +++ b/freeciv/freeciv/server/scripting/api_server_edit.c @@ -330,6 +330,7 @@ void api_edit_change_gold(lua_State *L, Player *pplayer, int amount) LUASCRIPT_CHECK_ARG_NIL(L, pplayer, 2, Player); pplayer->economic.gold = MAX(0, pplayer->economic.gold + amount); + send_player_info_c(pplayer, NULL); } /*************************************************************************//** @@ -391,17 +392,17 @@ Tech_Type *api_edit_give_technology(lua_State *L, Player *pplayer, research_pretty_name(presearch, research_name, sizeof(research_name)); notify_player(pplayer, NULL, E_TECH_GAIN, ftc_server, - Q_("?fromscript:You acquire %s."), adv_name); + Q_("?fromscript:[`bulb`] You acquire %s."), adv_name); notify_research(presearch, pplayer, E_TECH_GAIN, ftc_server, /* TRANS: "The Greeks ..." or "The members of * team Red ..." */ - Q_("?fromscript:The %s acquire %s and share this " + Q_("?fromscript:[`bulb`] The %s acquire %s and share this " "advance with you."), nation_plural_for_player(pplayer), adv_name); notify_research_embassies(presearch, NULL, E_TECH_EMBASSY, ftc_server, /* TRANS: "The Greeks ..." or "The members of * team Red ..." */ - Q_("?fromscript:The %s acquire %s."), + Q_("?fromscript:[`bulb`] The %s acquire %s."), research_name, adv_name); } } @@ -518,6 +519,52 @@ void api_edit_tile_set_label(lua_State *L, Tile *ptile, const char *label) } } +/**********************************************************************//** + Reveal tile as it is currently to the player. +**************************************************************************/ +void api_edit_tile_show(lua_State *L, Tile *ptile, Player *pplayer) +{ + LUASCRIPT_CHECK_STATE(L); + LUASCRIPT_CHECK_SELF(L, ptile); + LUASCRIPT_CHECK_ARG_NIL(L, pplayer, 3, Player); + + map_show_tile(pplayer, ptile); +} + +/**********************************************************************//** + Try to hide tile from player. +**************************************************************************/ +bool api_edit_tile_hide(lua_State *L, Tile *ptile, Player *pplayer) +{ + struct city *pcity; + + LUASCRIPT_CHECK_STATE(L, FALSE); + LUASCRIPT_CHECK_SELF(L, ptile, FALSE); + LUASCRIPT_CHECK_ARG_NIL(L, pplayer, 3, Player, FALSE); + + if (map_is_known_and_seen(ptile, pplayer, V_MAIN)) { + /* Can't hide currently seen tile */ + return FALSE; + } + + pcity = tile_city(ptile); + + if (pcity != NULL) { + trade_partners_iterate(pcity, partner) { + if (really_gives_vision(pplayer, city_owner(partner))) { + /* Can't remove vision about trade partner */ + return FALSE; + } + } trade_partners_iterate_end; + } + + dbv_clr(&pplayer->tile_known, tile_index(ptile)); + + send_tile_info(pplayer->connections, ptile, TRUE); + + return TRUE; +} + /*************************************************************************//** Global climate change. *****************************************************************************/ @@ -644,6 +691,18 @@ void api_edit_city_add_history(lua_State *L, City *pcity, int amount) pcity->history += amount; } +/*************************************************************************//** + Add food to city food_stock +*****************************************************************************/ +void api_edit_city_give_food(lua_State *L, City *pcity, int amount) +{ + LUASCRIPT_CHECK_STATE(L); + LUASCRIPT_CHECK_SELF(L, pcity); + + pcity->food_stock += amount; + send_city_info(pcity->owner, pcity); +} + /*************************************************************************//** Add history to a player *****************************************************************************/ @@ -654,3 +713,16 @@ void api_edit_player_add_history(lua_State *L, Player *pplayer, int amount) pplayer->history += amount; } + +/**********************************************************************//** + Give bulbs to a player +**************************************************************************/ +void api_edit_player_give_bulbs(lua_State *L, Player *pplayer, int amount) +{ + LUASCRIPT_CHECK_STATE(L); + LUASCRIPT_CHECK_SELF(L, pplayer); + + update_bulbs(pplayer, amount, TRUE); + + send_player_info_c(pplayer, NULL); +} \ No newline at end of file diff --git a/freeciv/freeciv/server/scripting/api_server_edit.h b/freeciv/freeciv/server/scripting/api_server_edit.h index f478262d7..9b08bbd6a 100644 --- a/freeciv/freeciv/server/scripting/api_server_edit.h +++ b/freeciv/freeciv/server/scripting/api_server_edit.h @@ -64,6 +64,8 @@ void api_edit_create_road(lua_State *L, Tile *ptile, const char *name); void api_edit_remove_extra(lua_State *L, Tile *ptile, const char *name); void api_edit_tile_set_label(lua_State *L, Tile *ptile, const char *label); +void api_edit_tile_show(lua_State *L, Tile *ptile, Player *pplayer); +bool api_edit_tile_hide(lua_State *L, Tile *ptile, Player *pplayer); void api_edit_climate_change(lua_State *L, enum climate_change_type type, int effect); @@ -77,6 +79,10 @@ void api_edit_unit_moving_disallow(lua_State *L, Unit *punit); void api_edit_unit_moving_allow(lua_State *L, Unit *punit); void api_edit_city_add_history(lua_State *L, City *pcity, int amount); +void api_edit_city_give_food(lua_State *L, City *pcity, int amount); + void api_edit_player_add_history(lua_State *L, Player *pplayer, int amount); +void api_edit_player_give_bulbs(lua_State *L, Player *pplayer, int amount); + #endif /* API_SERVER_EDIT_H */ diff --git a/freeciv/freeciv/server/scripting/tolua_server.pkg b/freeciv/freeciv/server/scripting/tolua_server.pkg index b24980e7f..f0668612a 100644 --- a/freeciv/freeciv/server/scripting/tolua_server.pkg +++ b/freeciv/freeciv/server/scripting/tolua_server.pkg @@ -142,6 +142,10 @@ module edit { @ remove_extra (lua_State *L, Tile *ptile, const char *name); void api_edit_tile_set_label @ tile_set_label (lua_State *L, Tile *ptile, const char *label); + void api_edit_tile_show + @ tile_show (lua_State *L, Tile *ptile, Player *pplayer); + bool api_edit_tile_hide + @ tile_hide (lua_State *L, Tile *ptile, Player *pplayer); Player *api_edit_create_player @ create_player(lua_State *L, const char *username, Nation_Type *nation, const char *ai); @@ -187,6 +191,12 @@ module edit { @ add_city_history(lua_State *L, City *self, int amount); void api_edit_player_add_history @ add_player_history(lua_State *L, Player *self, int amount); + + void api_edit_city_give_food + @ give_food(lua_State *L, City *self, int amount); + + void api_edit_player_give_bulbs + @ give_bulbs(lua_State *L, Player *self, int amount); } /* Luadata module. */ @@ -324,11 +334,19 @@ function Player:add_history(amount) edit.add_player_history(self, amount) end +function Player:give_bulbs(amount) + edit.give_bulbs(self, amount) +end + -- Server functions for City module function City:add_history(amount) edit.add_city_history(self, amount) end +function City:give_food(amount) + edit.give_food(self, amount) +end + -- Server functions for Unit module function Unit:teleport(dest) return edit.unit_teleport(self, dest) @@ -397,6 +415,14 @@ function Tile:set_label(label) edit.tile_set_label(self, label) end +function Tile:show(player) + edit.tile_show(self, player) +end + +function Tile:hide(player) + return edit.tile_hide(self, player) +end + $] /* Additions to common Player module. */ diff --git a/freeciv/freeciv/server/settings.c b/freeciv/freeciv/server/settings.c index 363ec1baa..772c3c1d5 100644 --- a/freeciv/freeciv/server/settings.c +++ b/freeciv/freeciv/server/settings.c @@ -480,9 +480,13 @@ static const struct sset_val_name *barbarians_name(int barbarians) static const struct sset_val_name *lootstyle_name(int looting) { switch (looting) { - NAME_CASE(LOOT_CLASSIC, "CLASSIC", N_("Classic loot formula")); + NAME_CASE(LOOT_CLASSIC, "CLASSIC", + N_("Classic loot formula, based on treasury of conquered city's nation")); NAME_CASE(LOOT_OFF, "OFF", N_("Cities yield no loot")); - NAME_CASE(LOOT_BASE_TRADE, "BASE_TRADE", N_("Proportional to Base Trade")); + NAME_CASE(LOOT_BASE_TRADE, "BASE_TRADE", + N_("Proportional to Base Trade of city.")); + NAME_CASE(LOOT_TRADE_AND_PROPERTY, "PROPERTY", + N_("Base Trade stolen from treasury, plus value of razed buildings.")); } return NULL; } @@ -1964,10 +1968,10 @@ static struct setting settings[] = { GEN_BOOL("ec_info", game.server.event_cache.info, SSET_META, SSET_INTERNAL, SSET_SITUATIONAL, ALLOW_NONE, ALLOW_BASIC, - N_("Print turn and time for each cached event"), + N_("Print turn and time for critical events in the event cache"), /* TRANS: Don't translate the text between single quotes. */ - N_("If turned on, all cached events will be marked by the turn " - "and time of the event like '(T2 - 15:29:52)'."), + N_("If turned on, time critical events will be marked by the turn " + "and time of the event, like: 'T2 - 15:29'"), NULL, NULL, GAME_DEFAULT_EVENT_CACHE_INFO) /* Game initialization parameters (only affect the first start of the game, @@ -2080,11 +2084,14 @@ static struct setting settings[] = { GEN_BOOL("multiresearch", game.server.multiresearch, SSET_RULES_FLEXIBLE, SSET_SCIENCE, SSET_RARE, ALLOW_NONE, ALLOW_CTRL, - N_("Allow researching multiple technologies"), - N_("Allows switching to any technology without wasting old " - "research. Bulbs are never transfered to new technology. " - "Techpenalty options are ineffective after enabling that " - "option."), NULL, NULL, + N_("Allow research to invest bulbs in multiple technologies"), + N_("With this setting on, accumulated bulbs in an undiscovered " + "technology can never transfer to new technology. Instead, " + "each bulb that was researched in any specific technology, is " + "permanently assigned to that specific technology.\n\n " + "The techpenalty setting is made useless if this option is " + "enabled, since no bulbs are ever transferred from one tech " + "to another tech."), NULL, NULL, GAME_DEFAULT_MULTIRESEARCH) GEN_INT("techpenalty", game.server.techpenalty, @@ -2473,6 +2480,19 @@ static struct setting settings[] = { GAME_MIN_CEASEFIRELENGTH, GAME_MAX_CEASEFIRELENGTH, GAME_DEFAULT_CEASEFIRELENGTH) + GEN_INT("casusbelli_allies", game.server.casusbelli_allies, + SSET_RULES_FLEXIBLE, SSET_MILITARY, SSET_SITUATIONAL, ALLOW_NONE, ALLOW_CTRL, + N_("Whether casus belli is also given to a nation's allies."), + N_("Under the default setting (0), casus belli may not be given to the " + "allies of a nation when war is declared on it or when an action is done " + "which gives it casus belli. With the setting value of 1, 'an attack on " + "one is an attack on all.' Any declaration of war or action which gives " + "casus belli to a nation, will also give casus belli to all of that " + "nation's allies."), + NULL, NULL, NULL, + GAME_MIN_CASUSBELLI_ALLIES, GAME_MAX_CASUSBELLI_ALLIES, + GAME_DEFAULT_CASUSBELLI_ALLIES) + GEN_INT("casusbelliturns", game.server.casusbelliturns, SSET_RULES_FLEXIBLE, SSET_MILITARY, SSET_SITUATIONAL, ALLOW_NONE, ALLOW_CTRL, N_("Length in turns of a first casus belli before it expires."), @@ -2480,7 +2500,7 @@ static struct setting settings[] = { "incidents will simply refresh it to this value; or, if it is already " "this value or greater, add an additional turn to the length. NOTE: " "any new non-aggression treaty made after casus belli, is considered " - "to supercede violations of past treaties, and eliminate casus belli. " + "to supersede violations of past treaties, and eliminate casus belli. " "Thus, players may re-affirm a treaty that has casus belli on it, and " "eliminate the casus belli status of that treaty."), NULL, NULL, NULL, @@ -2840,8 +2860,8 @@ static struct setting settings[] = { "first Turn Change AFTER a new unit's creation.\n" "\n2. Strict WYSIWYG: The same as WYSIWYG except ALL unit and building " "upkeep is uniformly deferred and deducted on the first Turn Change " - "AFTER creation. The means buildings get free bonus effects on the " - "first turn of existence.\n"), + "AFTER creation. The means buildings get bonus effects on the first " + "turn of existence, with no upkeep on that turn.\n"), NULL, NULL, NULL, GAME_MIN_CITY_OUTPUT_STYLE, GAME_MAX_CITY_OUTPUT_STYLE, GAME_DEFAULT_CITY_OUTPUT_STYLE) @@ -2933,7 +2953,7 @@ static struct setting settings[] = { "flag later but for now it works in rulesets which use S2G " "as the balancing factor to encourage higher population of " "certain units (such as infantry), vis-a-vis the game's " - "aritificial scarcity of City_Build_Slots."), + "artificial scarcity of City_Build_Slots."), NULL, NULL, GAME_DEFAULT_SLOT_CONTROL) GEN_INT("slot_control_style", game.server.slot_control_style, diff --git a/freeciv/freeciv/server/spacerace.c b/freeciv/freeciv/server/spacerace.c index 0a5ca78a7..3766cc5b3 100644 --- a/freeciv/freeciv/server/spacerace.c +++ b/freeciv/freeciv/server/spacerace.c @@ -190,7 +190,7 @@ void handle_spaceship_launch(struct player *pplayer) arrival = ship->launch_year + (int) ship->travel_time; notify_player(NULL, NULL, E_SPACESHIP, ftc_server, - _("[`events/spaceship`]
🚀 The %s have launched a spaceship! " + _("[`events/spaceship`]
[`spaceship`] The %s have launched a spaceship! " "It is estimated to arrive at Alpha Centauri in %s."), nation_plural_for_player(pplayer), textyear(arrival)); @@ -418,7 +418,7 @@ bool do_spaceship_place(struct player *pplayer, enum action_requester from, void spaceship_arrived(struct player *pplayer) { notify_player(NULL, NULL, E_SPACESHIP, ftc_server, - _("[`events/spacelanding`]
🚀 The %s spaceship has arrived at Alpha Centauri."), + _("[`events/spacelanding`]
[`spaceship`] The %s spaceship has arrived at Alpha Centauri."), nation_adjective_for_player(pplayer)); pplayer->spaceship.state = SSHIP_ARRIVED; } diff --git a/freeciv/freeciv/server/srv_main.c b/freeciv/freeciv/server/srv_main.c index a351fc8ab..80bdb974b 100644 --- a/freeciv/freeciv/server/srv_main.c +++ b/freeciv/freeciv/server/srv_main.c @@ -378,9 +378,9 @@ bool check_for_game_over(void) if (winners) { notify_conn(game.est_connections, NULL, E_GAME_END, ftc_server, /* TRANS: There can be several winners listed */ - _("Scenario victory to %s."), astr_str(&str)); + _("[`trophy`] Scenario victory to %s."), astr_str(&str)); astr_free(&str); - return TRUE; + return TRUE && !is_longturn(); } astr_free(&str); @@ -406,8 +406,8 @@ bool check_for_game_over(void) if (0 == candidates) { notify_conn(game.est_connections, NULL, E_GAME_END, ftc_server, - _("Game is over.")); - return TRUE; + _("[`trophy`] Game is over.")); + return TRUE && !is_longturn(); } else if (0 < defeated) { /* If nobody conceded the game, it mays be a solo game or a single team * game. */ @@ -439,13 +439,13 @@ bool check_for_game_over(void) if (team_candidates == candidates && team_defeated < defeated) { /* We need a player in a other team to conced the game here. */ notify_conn(game.est_connections, NULL, E_GAME_END, ftc_server, - _("Team victory to %s."), + _("[`trophy`] Team victory to %s."), team_name_translation(pteam)); /* All players of the team win, even dead and surrended ones. */ player_list_iterate(members, pplayer) { pplayer->is_winner = TRUE; } player_list_iterate_end; - return TRUE; + return TRUE && !is_longturn(); } } teams_iterate_end; } @@ -496,10 +496,10 @@ bool check_for_game_over(void) } player_list_iterate_end; notify_conn(game.est_connections, NULL, E_GAME_END, ftc_server, /* TRANS: There can be several winners listed */ - _("Allied victory to %s."), astr_str(&str)); + _("[`trophy`] Allied victory to %s."), astr_str(&str)); astr_free(&str); player_list_destroy(winner_list); - return TRUE; + return TRUE && !is_longturn(); } } @@ -522,9 +522,9 @@ bool check_for_game_over(void) if (found) { notify_conn(game.est_connections, NULL, E_GAME_END, ftc_server, - _("Game ended in conquest victory for %s."), player_name(victor)); + _("[`trophy`] Game ended in conquest victory for %s."), player_name(victor)); victor->is_winner = TRUE; - return TRUE; + return TRUE && !is_longturn(); } } } @@ -552,11 +552,11 @@ bool check_for_game_over(void) if (best != NULL && best_value >= game.info.culture_vic_points && best_value > second_value * (100 + game.info.culture_vic_lead) / 100) { notify_conn(game.est_connections, NULL, E_GAME_END, ftc_server, - _("Game ended in cultural domination victory for %s."), + _("[`trophy`] Game ended in cultural domination victory for %s."), player_name(best)); best->is_winner = TRUE; - return TRUE; + return TRUE && !is_longturn(); } } @@ -564,7 +564,7 @@ bool check_for_game_over(void) if (game.info.turn > game.server.end_turn) { notify_conn(game.est_connections, NULL, E_GAME_END, ftc_server, _("Game ended as the turn limit was exceeded.")); - return TRUE; + return TRUE && !is_longturn(); } else if (game.info.turn == game.server.end_turn) { /* Give them a chance to decide to extend the game */ notify_conn(game.est_connections, NULL, E_GAME_END, ftc_server, @@ -621,7 +621,7 @@ bool check_for_game_over(void) if (1 < player_list_size(members)) { notify_conn(NULL, NULL, E_GAME_END, ftc_server, - _("Team victory to %s."), + _("[`trophy`] Team victory to %s."), team_name_translation(pplayer->team)); /* All players of the team win, even dead and surrendered ones. */ player_list_iterate(members, pteammate) { @@ -629,10 +629,10 @@ bool check_for_game_over(void) } player_list_iterate_end; } else { notify_conn(NULL, NULL, E_GAME_END, ftc_server, - _("Game ended in victory for %s."), player_name(pplayer)); + _("[`trophy`] Game ended in victory for %s."), player_name(pplayer)); pplayer->is_winner = TRUE; } - return TRUE; + return TRUE && !is_longturn(); } /* Print notice(s) of imminent arrival. These are not infallible @@ -655,7 +655,7 @@ bool check_for_game_over(void) } notify_player(NULL, NULL, E_SPACESHIP, ftc_server, - _("🚀 Notice: the %s spaceship will likely arrive at " + _("[`spaceship`] Notice: the %s spaceship will likely arrive at " "Alpha Centauri next turn."), nation_adjective_for_player(pplayer)); } @@ -825,7 +825,7 @@ static void update_environmental_upset(enum environment_upset_type type, // EU _("—————————————————————————————
" "[`earth`] Scientists release IPCC report on %s:
" "—————————————————————————————
"), - (type == EUT_GLOBAL_WARMING ? "☀️Global Warming" : "[`snowflake`]Nuclear Winter")); + (type == EUT_GLOBAL_WARMING ? "[`sun2`]Global Warming" : "[`snowflake`]Nuclear Winter")); notify_player(NULL, NULL, E_GLOBAL_ECO, ftc_server, _("" "Cumulative Impact = %d units.
" @@ -835,8 +835,8 @@ static void update_environmental_upset(enum environment_upset_type type, // EU "—————————————————————————————
"), *accum, new_level, - (*accum >= new_level ? "⚠️ International action recommended to halt habitat destruction!" - : "💢 Scientists recommend keeping impact below Climate Tolerance.") + (*accum >= new_level ? "[`warning`] International action recommended to halt habitat destruction!" + : "[`anger`] Scientists recommend keeping impact below Climate Tolerance.") ); } @@ -895,8 +895,8 @@ static void notify_illegal_armistice_units(struct player *phost, astr_set(&unitstr, /* TRANS: "... 2 military units in Norwegian territory." */ - PL_("💢 Warning: you still have %d military unit in %s territory.", - "💢 Warning: you still have %d military units in %s territory.", + PL_("[`anger`] Warning: you still have %d military unit in %s territory.", + "[`anger`] Warning: you still have %d military units in %s territory.", nunits), nunits, nation_adjective_for_player(phost)); /* If there's one lousy unit left, we may as well include a link for it */ @@ -924,7 +924,7 @@ static void remove_illegal_armistice_units(struct player *plr1, if (tile_owner(unit_tile(punit)) == plr2 && is_military_unit(punit)) { notify_player(plr1, unit_tile(punit), E_DIPLOMACY, ftc_server, - _("⚠️ Your %s was disbanded in accordance with " + _("[`warning`] Your %s was disbanded in accordance with " "your peace treaty with the %s."), unit_tile_link(punit), nation_plural_for_player(plr2)); @@ -935,7 +935,7 @@ static void remove_illegal_armistice_units(struct player *plr1, if (tile_owner(unit_tile(punit)) == plr1 && is_military_unit(punit)) { notify_player(plr2, unit_tile(punit), E_DIPLOMACY, ftc_server, - _("⚠️ Your %s was disbanded in accordance with " + _("[`warning`] Your %s was disbanded in accordance with " "your peace treaty with the %s."), unit_tile_link(punit), nation_plural_for_player(plr1)); @@ -985,7 +985,7 @@ static void update_diplomatics(void) switch (state->turns_left) { case 1: notify_player(plr1, NULL, E_DIPLOMACY, ftc_server, - _("💢 Concerned citizens point out that the cease-fire " + _("[`anger`] Concerned citizens point out that the cease-fire " "with %s will run out soon."), player_name(plr2)); /* Message to plr2 will be done when plr1 and plr2 will be swapped. * Else, we will get a message duplication. Note the case is not @@ -994,12 +994,12 @@ static void update_diplomatics(void) break; case 0: notify_player(plr1, NULL, E_DIPLOMACY, ftc_server, - _("⚔ The cease-fire with %s has run out. " + _("[`swords`] The cease-fire with %s has run out. " "You are now at war with the %s."), player_name(plr2), nation_plural_for_player(plr2)); notify_player(plr2, NULL, E_DIPLOMACY, ftc_server, - _("⚔ The cease-fire with %s has run out. " + _("[`swords`] The cease-fire with %s has run out. " "You are now at war with the %s."), player_name(plr1), nation_plural_for_player(plr1)); @@ -1039,7 +1039,7 @@ static void update_diplomatics(void) cancel2 = TRUE; notify_player(plr3, NULL, E_TREATY_BROKEN, ftc_server, - _("⚔ The cease-fire between %s and %s has run out. " + _("[`swords`] The cease-fire between %s and %s has run out. " "They are at war. You cancel your alliance " "with %s."), plr1name, plr2name, plr2name); @@ -1049,7 +1049,7 @@ static void update_diplomatics(void) cancel2 = FALSE; notify_player(plr3, NULL, E_TREATY_BROKEN, ftc_server, - _("⚔ The cease-fire between %s and %s has run out. " + _("[`swords`] The cease-fire between %s and %s has run out. " "They are at war. You cancel your alliance " "with %s."), plr1name, plr2name, plr1name); @@ -1059,7 +1059,7 @@ static void update_diplomatics(void) cancel2 = TRUE; notify_player(plr3, NULL, E_TREATY_BROKEN, ftc_server, - _("⚔ The cease-fire between %s and %s has run out. " + _("[`swords`] The cease-fire between %s and %s has run out. " "They are at war. You cancel your alliance " "with both."), player_name(plr1), @@ -1185,6 +1185,27 @@ static void begin_turn(bool is_new_turn) send_game_info(NULL); if (is_new_turn) { + /* Extra (dis)appearance is usually handled at end-turn. However, the end-turn + that happens after God creates the world is never called. Thus, random extras + that the ruleset wants to appear at game start, would go here: + if (game.info.turn == 1) { + extra_type_by_cause_iterate(EC_APPEARANCE, pextra) { + whole_map_iterate(&(wld.map), ptile) { + if (!tile_has_extra(ptile, pextra) + && fc_rand(10000) < pextra->appearance_chance + && can_extra_appear(pextra, ptile)) { + + tile_extra_apply(ptile, pextra); + update_tile_knowledge(ptile); + } + } whole_map_iterate_end; + } extra_type_by_cause_iterate_end; + } + 2021.December.20 - This is tested and works. One time game-start resource + appearance can be handled by putting appearance req as: + "MinYear", "-4000", "World", FALSE + */ + script_server_signal_emit("turn_begin", game.info.turn, game.info.year); script_server_signal_emit("turn_started", game.info.turn > 0 ? game.info.turn - 1 @@ -1514,7 +1535,7 @@ static void end_phase(void) * during this entire turn, autoplace them. */ if (adv_spaceship_autoplace(pplayer, &pplayer->spaceship)) { notify_player(pplayer, NULL, E_SPACESHIP, ftc_server, - _("🚀 Automatically placed spaceship parts that were still not placed.")); + _("[`spaceship`] Automatically placed spaceship parts that were still not placed.")); } // Obsolete Pax Dei when it reaches the end of its counter. Has to happen here so that @@ -2415,7 +2436,11 @@ static void handle_observer_ready(struct connection *pconn) if (pconn->access_level == ALLOW_HACK) { players_iterate(plr) { if (is_human(plr)) { +#ifndef FREECIV_WEB return; +#else /* FCW allows a GM to restart a game. */ + break; +#endif } } players_iterate_end; @@ -2462,6 +2487,10 @@ void handle_player_ready(struct player *requestor, } } } players_iterate_end; + + /* Prevent longturn restarts being locked by pre-game campers: */ + if (is_longturn() && game.info.turn > 1) num_unready = 0; + if (num_unready > 0) { notify_conn(NULL, NULL, E_SETTING, ftc_server, _("Waiting to start game: %d out of %d players " @@ -3157,7 +3186,7 @@ static void srv_scores(void) report_final_scores(NULL); show_map_to_all(); notify_player(NULL, NULL, E_GAME_END, ftc_server, - _("🏆 The game is over...")); + _("[`trophy`] The game is over.")); send_server_info_to_metaserver(META_INFO); if (game.server.save_nturns > 0 @@ -3865,21 +3894,35 @@ bool is_supercow(struct connection * caller) char *pos; int port; + /* Players don't get to be supercows: */ if (caller->playing && 0 != server_state()) { return FALSE; } + /* Convert a temp caller_name to lowercase in order to compare with + the (already) lowercase supercows list: */ + strcpy(caller_name, caller->username); + for(int i = 0; caller_name[i]; i++){ + caller_name[i] = fc_tolower(caller_name[i]); + } + + /* See if our player is in the server-stored list of supercows that were + assigned by the /supercows command (from .serv file or manually): */ + for (int i = 0; iusername); - - for(int i = 0; caller_name[i]; i++){ - *caller_name = fc_tolower(*caller_name); - } - while (fgets(line, 1000, supercow_list)) { if ((pos=strchr(line, '#')) != NULL) { continue; @@ -3894,7 +3937,7 @@ bool is_supercow(struct connection * caller) supercow_list_name = split_line; for(int i = 0; supercow_list_name[i]; i++){ - *supercow_list_name = fc_tolower(*supercow_list_name); + supercow_list_name[i] = fc_tolower(supercow_list_name[i]); } split_line = strtok(NULL, ":"); diff --git a/freeciv/freeciv/server/srv_main.h b/freeciv/freeciv/server/srv_main.h index 3df07fb88..797a6aee3 100644 --- a/freeciv/freeciv/server/srv_main.h +++ b/freeciv/freeciv/server/srv_main.h @@ -78,11 +78,11 @@ extern struct civserver { int nbarbarians; /* this counter creates all the city and unit numbers used. - * arbitrarily starts at 101, but at 65K wraps to 1. + * arbitrarily starts at 101, but wraps to 1. * use identity_number() */ #define IDENTITY_NUMBER_SKIP (100) - unsigned short identity_number; + unsigned identity_number; char game_identifier[MAX_LEN_GAME_IDENTIFIER]; diff --git a/freeciv/freeciv/server/stdinhand.c b/freeciv/freeciv/server/stdinhand.c index cc223911d..efa034195 100644 --- a/freeciv/freeciv/server/stdinhand.c +++ b/freeciv/freeciv/server/stdinhand.c @@ -59,6 +59,7 @@ /* server */ #include "aiiface.h" +#include "auth.h" #include "citytools.h" #include "connecthand.h" #include "diplhand.h" @@ -119,6 +120,8 @@ static struct kick_hash *kick_table_by_user = NULL; static bool cut_client_connection(struct connection *caller, char *name, bool check); +static bool set_password(struct connection *caller, char *password, + bool check); static bool show_help(struct connection *caller, char *arg); static bool show_list(struct connection *caller, char *arg); static void show_colors(struct connection *caller); @@ -138,6 +141,8 @@ static void show_settings_one(struct connection *caller, enum command_id cmd, static void show_ruleset_info(struct connection *caller, enum command_id cmd, bool check, int read_recursion); static void show_mapimg(struct connection *caller, enum command_id cmd); + +static bool set_supercows(struct connection *caller, char *arg, bool check); static bool set_command(struct connection *caller, char *str, bool check); static bool create_command(struct connection *caller, const char *str, @@ -170,6 +175,8 @@ static bool playernation_command(struct connection *caller, char *str, bool check); static bool alias_command(struct connection *caller, char *str, bool check); +static bool label_command(struct connection *caller, + char *str, bool check); static bool mapimg_command(struct connection *caller, char *arg, bool check); static const char *mapimg_accessor(int i); @@ -677,6 +684,11 @@ static bool show_serverid(struct connection *caller, char *arg) static bool save_command(struct connection *caller, char *arg, bool check) { if (!check) { + if (is_longturn() && is_supercow(caller)) { + /* supercow can force timed save into auto-reload dir; + thus letting supercow do a save before game restart */ + save_game_auto("Timer", AS_TIMER); + } save_game(arg, "User request", FALSE); } return TRUE; @@ -1817,6 +1829,10 @@ static void show_help_option_list(struct connection *caller, enum command_id help_cmd) { cmd_reply(help_cmd, caller, C_COMMENT, horiz_line); + cmd_reply(help_cmd, caller, C_COMMENT, + _("CTRL-Click link below for a full list and server settings and options:")); + notify_conn(caller->self, NULL, E_SETTING, ftc_any, + _("Settings")); cmd_reply(help_cmd, caller, C_COMMENT, _("Explanations are available for the following server options:")); cmd_reply(help_cmd, caller, C_COMMENT, horiz_line); @@ -3473,7 +3489,7 @@ bool observe_command(struct connection *caller, char *str, bool check) } } - end:; + end: /* free our args */ for (i = 0; i < ntokens; i++) { free(arg[i]); @@ -3668,8 +3684,8 @@ static bool take_command(struct connection *caller, char *str, bool check) is_barbarian(pplayer) ? _("Barbarian") : is_ai(pplayer) ? _("AI") : _("Human"), pplayer->is_alive ? _("Alive") : _("Dead")); - conn_list_iterate(game.est_connections, pconn) { - send_packet_chat_msg(pconn, &packet); + conn_list_iterate(game.est_connections, pconn2) { + send_packet_chat_msg(pconn2, &packet); } conn_list_iterate_end; event_cache_add_for_all(&packet); } @@ -4484,6 +4500,67 @@ static bool alias_command(struct connection *caller, char *str, bool check) return TRUE; } +/**********************************************************************//** + /label command handler: puts text label on a map tile +**************************************************************************/ +static bool label_command(struct connection *caller, char *str, bool check) +{ + int ntokens = 0; + const int MAX_TOKEN_WORDS = 30; + char *token[MAX_TOKEN_WORDS]; + char label[MAX_LEN_MAP_LABEL]; + char temp[MAX_LEN_MAP_LABEL]; + struct tile *ptile = NULL; + int nat_x, nat_y; + bool succeeded = false; + + ntokens = get_tokens(str, token, MAX_TOKEN_WORDS, TOKEN_DELIMITERS); + + if (ntokens < 3) { + goto finish; + } + + fc_snprintf(label, sizeof(label), "%s", token[2]); + + /* Concatenate args #(4...last) as extra words appended to the 3rd arg: */ + if (ntokens > 3) { + for (int extra_arg=3; extra_arg= MAX_LEN_MAP_LABEL) goto finish; + + if (tile_set_label(ptile, label)) { + send_tile_info(NULL, ptile, FALSE); + succeeded = true; + } + +finish: + if (succeeded) { + notify_conn(caller->self, NULL, E_SETTING, ftc_any, + _("Tile (%d,%d) labeled as: '%s'."), + nat_x, nat_y, label); + } else { + cmd_reply(CMD_LABEL, caller, C_SYNTAX, + _("Error.
Usage: /label x,y Label Description for Tile")); + } + + free_tokens(token, ntokens); + return succeeded; +} + /**********************************************************************//** Handle quit command **************************************************************************/ @@ -4496,6 +4573,15 @@ static bool quit_game(struct connection *caller, bool check) return TRUE; } +/**********************************************************************//** + Handle password command +**************************************************************************/ +static bool set_password(struct connection *caller, char *password, + bool check) +{ + return auth_handle_reply(caller, password); +} + /**********************************************************************//** Main entry point for "command input". **************************************************************************/ @@ -4763,6 +4849,8 @@ static bool handle_stdin_input_real(struct connection *caller, char *str, return set_ai_level_named(caller, arg, command_name_by_number(cmd), check); case CMD_QUIT: return quit_game(caller, check); + case CMD_PASSWORD: + return set_password(caller, arg, check); case CMD_CUT: return cut_client_connection(caller, arg, check); case CMD_SHOW: @@ -4807,6 +4895,8 @@ static bool handle_stdin_input_real(struct connection *caller, char *str, return fcdb_command(caller, arg, check); case CMD_MAPIMG: return mapimg_command(caller, arg, check); + case CMD_SUPERCOWS: + return set_supercows(caller, arg, check); case CMD_RFCSTYLE: /* see console.h for an explanation */ if (!check) { con_set_style(!con_get_style()); @@ -4834,6 +4924,8 @@ static bool handle_stdin_input_real(struct connection *caller, char *str, return playernation_command(caller, arg, check); case CMD_ALIAS: return alias_command(caller, arg, check); + case CMD_LABEL: + return label_command(caller, arg, check); case CMD_NUM: case CMD_UNRECOGNIZED: case CMD_AMBIGUOUS: @@ -5646,7 +5738,7 @@ static bool delegate_command(struct connection *caller, char *arg, fc_assert_ret_val(caller, FALSE); char oplayer_name[MAX_LEN_NAME]; // Remember the taking player's name before it changes to the dplayer - sz_strlcpy(&oplayer_name[0], player_name(conn_get_player(caller))); + sz_strlcpy(oplayer_name, player_name(conn_get_player(caller))); if (caller->server.delegation.status) { cmd_reply(CMD_DELEGATE, caller, C_FAIL, @@ -6030,6 +6122,89 @@ static bool mapimg_command(struct connection *caller, char *arg, bool check) return ret; } +/**********************************************************************//** + Handle supercows command. Returns true if it set new supercows. +**************************************************************************/ +static bool set_supercows(struct connection *caller, char *arg, bool check) +{ + int ntokens; + bool ret=true; + char *token[MAX_NUM_SUPERCOWS]; /* max 10 supercows */ + + ntokens = get_tokens(arg, token, MAX_NUM_SUPERCOWS, TOKEN_DELIMITERS); + + /* Supercow names all get stored as lowercase: */ + for (int i=0; i 0 && ntokens <= MAX_NUM_SUPERCOWS + && + /* command must come from .serv file... */ + (!caller + || /* ...or a human who is a supercow */ + (caller && caller->access_level == ALLOW_HACK))) { + + for (int i=0; iusername); + for (int j=0; plr->username[j]; j++) { + temp_name[j] = fc_tolower(temp_name[j]); + } + if (strcmp(temp_name, token[i]) == 0) { + cmd_reply(CMD_SUPERCOWS, caller, C_FAIL, + _("FAIL: %s is player %s! Players can't be supercows."), + token[i], plr->name); + return false; + } + } players_iterate_end; */ + } + fc_snprintf(game.server.supercows[i], sizeof(game.server.supercows[i]), + _("%s"), token[i]); + cmd_reply(CMD_SUPERCOWS, caller, C_OK, "%s assigned as Admin/Gamemaster #%d", + game.server.supercows[i], i+1); + } else { + /* Clears the rest of the supercow spots in the list: */ + memset(game.server.supercows[i], 0, sizeof(game.server.supercows[i])); + } + } + } + /* No parameters is a simple request to find out identity of your Gamemaster(s): */ + else if (caller) { + for (int i=0; iself, NULL, E_SETTING, ftc_any, + _("Admin/Gamemaster #%d: %s"), + i+1, game.server.supercows[i]); + /* Supercow access required to see non-primary supercows */ + if (i == 0 && caller && caller->access_level != ALLOW_HACK) { + break; + } + } else if (i==0) { + notify_conn(caller->self, NULL, E_SETTING, ftc_any, + _("The game has no assigned Admin/Gamemaster.")); + } else { + break; + } + } + ret = false; + } + return ret; +} + /**********************************************************************//** Execute a command in the context of the AI of the player. **************************************************************************/ @@ -6664,6 +6839,10 @@ static void show_help_command_list(struct connection *caller, enum command_id i; cmd_reply(help_cmd, caller, C_COMMENT, horiz_line); + cmd_reply(help_cmd, caller, C_COMMENT, + _("CTRL-Click link below for a full list and description of server commands:")); + notify_conn(caller->self, NULL, E_SETTING, ftc_any, + _("Command list")); cmd_reply(help_cmd, caller, C_COMMENT, _("The following server commands are available:")); cmd_reply(help_cmd, caller, C_COMMENT, horiz_line); @@ -6844,23 +7023,57 @@ static void show_connections(struct connection *caller) cmd_reply(CMD_LIST, caller, C_COMMENT, _("")); } else { conn_list_iterate(game.all_connections, pconn) { + /**** CONNECTION INFO displayed for: (supercow/admin) Gamemasters: */ if (caller->supercow || DEBUG_CONNS) { - sz_strlcpy(buf, "conn.user: "); - cat_snprintf(buf, sizeof(buf), - "%s\n playing.name: %s\n playing.orig: %s\n del_to: %s", - pconn->username, - (pconn->playing ? pconn->playing->name : "null"), - (pconn->playing->server.orig_username ? pconn->playing->server.orig_username : "null"), - (pconn->playing->server.delegate_to ? pconn->playing->server.delegate_to : "null")); - } else if (caller->supercow) { - sz_strlcpy(buf, conn_description(pconn)); - } else { - sz_strlcpy(buf, player_name(player_by_user(pconn->username))); + /* Info line for players (!observers, !supercows) */ + if (pconn->playing && !pconn->supercow) { + sz_strlcpy(buf, "Username: "); + cat_snprintf(buf, sizeof(buf), + "%s\nPlaying as: %s %s\n", + pconn->username, + (pconn->playing->name ? pconn->playing->name : "same"), + (pconn->playing->server.orig_username && strlen(pconn->playing->server.orig_username) > 1 + ? " * (delegated)" : "")); + /* This portion of Info Line only shows if player being controlled by delegation: */ + if (pconn->playing->server.orig_username) { + if (strlen(pconn->playing->server.orig_username) > 1) { + cat_snprintf(buf, sizeof(buf), + "Original User: %s\n", + pconn->playing->server.orig_username); + } + } + /* This portion of Info Line only shows if player has assigned a delegation: */ + if (pconn->playing->server.delegate_to) { + if (strlen(pconn->playing->server.delegate_to) > 1) { + cat_snprintf(buf, sizeof(buf), + "Delegates to: %s\n", + (pconn->playing->server.delegate_to ? pconn->playing->server.delegate_to : "null")); + } + } + } + /* Info line for Observers and Admins is the old "legacy" conn_description */ + else sz_strlcpy(buf, conn_description(pconn)); + } + /**** CONNECTION INFO displayed for: regular Players: */ + else { + /* Info line for regular Players */ + if (!pconn->observer) { + sz_strlcpy(buf, player_name(player_by_user(pconn->username))); + } + /* Info line for observers */ + else if (!pconn->supercow) { + sz_strlcpy(buf, pconn->username); + cat_snprintf(buf, sizeof(buf), " (observer)"); + } + /* Info line for admins: not shown. */ + else sz_strlcpy(buf, ""); } - if (pconn->established && caller->supercow) { - cat_snprintf(buf, sizeof(buf), " level:%s", + /* Access level appended only for admins to see */ + if (pconn->established && caller->supercow && pconn->access_level > ALLOW_BASIC) { + cat_snprintf(buf, sizeof(buf), " Level: %s", cmdlevel_name(pconn->access_level)); } + if (caller->supercow) cat_snprintf(buf, sizeof(buf), "—————————————————————————————————"); cmd_reply(CMD_LIST, caller, C_COMMENT, "%s", buf); } conn_list_iterate_end; } @@ -6957,7 +7170,7 @@ void show_players(struct connection *caller) } else { players_iterate(pplayer) { char buf[MAX_LEN_CONSOLE_LINE]; - int n; + char player_type[40]; /* Low access level callers don't get to see barbarians in list: */ if (is_barbarian(pplayer) && caller @@ -6965,89 +7178,54 @@ void show_players(struct connection *caller) continue; } - /* The output for each player looks like: - * - * [color]: Team[, Nation][, Username][, Status] - * AI/Barbarian/Human[, AI type, skill level][, Connections] - * [Details for each connection] - */ - - /* ' [color]: [Nation][, Username][, Status]' */ buf[0] = '\0'; + player_type[0] = '\0'; - if (caller->supercow || DEBUG_CONNS) { - // Player: [u:username o:orig_username] d-->delegates_to (is_delegate_active) - cat_snprintf(buf, sizeof(buf), "%s [u:%s o:%s] d-->%s (%s)", + if (is_barbarian(pplayer)) { + sz_strlcat(player_type, _("Barbarian")); + } else if (is_ai(pplayer)) { + sz_strlcat(player_type, _("AI")); + } else { + sz_strlcat(player_type, _("Human")); + } + if (is_ai(pplayer)) { + cat_snprintf(player_type, sizeof(player_type), _(", %s"), ai_name(pplayer->ai)); + cat_snprintf(player_type, sizeof(player_type), _(", difficulty level %s"), + ai_level_translated_name(pplayer->ai_common.skill_level)); + } + + if (S_S_INITIAL != server_state() && (caller->supercow || DEBUG_CONNS)) { + // Name:[Nationality] User:s ([Orig.User]) Human/AI [Delegate: -- (active/untaken)] + cat_snprintf(buf, sizeof(buf), "%s:%s User:%s(%s) %s %s%s %s", player_name(pplayer), + (!game.info.is_new_game ? nation_adjective_for_player(pplayer) : ""), pplayer->username, - pplayer->server.orig_username, - pplayer->server.delegate_to, - player_delegation_active(pplayer) ? _(" (active)") : "(untaken)"); - } else { - cat_snprintf(buf, sizeof(buf), "%s: ", player_name(pplayer)); + (pplayer->server.orig_username ? pplayer->server.orig_username : ""), + player_type, + (strlen(pplayer->server.delegate_to)>0 ? "Delegate:" : ""), + (pplayer->server.delegate_to ? pplayer->server.delegate_to : ""), + (strlen(pplayer->server.delegate_to)>0 + ? (player_delegation_active(pplayer) ? _("(active)") : "(untaken)") + : "") + ); + } else if (strcmp(pplayer->username, "Unassigned")!=0) { + cat_snprintf(buf, sizeof(buf), "%s: %s", player_name(pplayer), player_type); if (!game.info.is_new_game) { - cat_snprintf(buf, sizeof(buf), "%s", + cat_snprintf(buf, sizeof(buf), ", %s", nation_adjective_for_player(pplayer)); } - if (caller->supercow && strlen(pplayer->username) > 0 - && strcmp(pplayer->username, "nouser") != 0) { - cat_snprintf(buf, sizeof(buf), _(", user %s"), pplayer->username); + if (!pplayer->is_alive) { + sz_strlcat(buf, _(" ** Dead **")); } if (S_S_INITIAL == server_state() && pplayer->is_connected) { if (pplayer->is_ready) { - sz_strlcat(buf, _(", ready")); + sz_strlcat(buf, _(", READY!")); } else { - /* Emphasizes this */ - n = strlen(buf); - featured_text_apply_tag(_(", not ready"), - buf + n, sizeof(buf) - n, - TTT_COLOR, 1, FT_OFFSET_UNSET, - ftc_changed); + sz_strlcat(buf, _(", NOT READY")); } - } else if (!pplayer->is_alive) { - sz_strlcat(buf, _(", Dead")); - } - } - cmd_reply(CMD_LIST, caller, C_COMMENT, "%s", buf); - - /* ' AI/Barbarian/Human[, skill level][, Connections]' */ - buf[0] = '\0'; - if (!DEBUG_CONNS) { - if (is_barbarian(pplayer)) { - sz_strlcat(buf, _("Barbarian")); - } else if (is_ai(pplayer)) { - sz_strlcat(buf, _("AI")); - } else { - sz_strlcat(buf, _("Human")); - } - if (is_ai(pplayer)) { - cat_snprintf(buf, sizeof(buf), _(", %s"), ai_name(pplayer->ai)); - cat_snprintf(buf, sizeof(buf), _(", difficulty level %s"), - ai_level_translated_name(pplayer->ai_common.skill_level)); - } - n = conn_list_size(pplayer->connections); - if (n > 0) { - cat_snprintf(buf, sizeof(buf), - PL_(", %d connection:", ", %d connections:", n), n); - } - cmd_reply(CMD_LIST, caller, C_COMMENT, " %s", buf); - - /* ' [Details for each connection]' */ - if (caller->supercow) { - conn_list_iterate(pplayer->connections, pconn) { - fc_snprintf(buf, sizeof(buf), - _("%s from %s (command access level %s), " - "bufsize=%dkb"), pconn->username, pconn->addr, - cmdlevel_name(pconn->access_level), - (pconn->send_buffer->nsize >> 10)); - if (pconn->observer) { - /* TRANS: preserve leading space */ - sz_strlcat(buf, _(" (observer mode)")); - } - cmd_reply(CMD_LIST, caller, C_COMMENT, " %s", buf); - } conn_list_iterate_end; } } + if (strlen(buf)) cmd_reply(CMD_LIST, caller, C_COMMENT, "%s", buf); } players_iterate_end; } cmd_reply(CMD_LIST, caller, C_COMMENT, horiz_line); diff --git a/freeciv/freeciv/server/techtools.c b/freeciv/freeciv/server/techtools.c index 082b04967..a782199b3 100644 --- a/freeciv/freeciv/server/techtools.c +++ b/freeciv/freeciv/server/techtools.c @@ -115,7 +115,7 @@ static void tech_researched(struct research *research) /* Players will be notified when new tech is chosen. */ notify_research_embassies (research, NULL, E_TECH_EMBASSY, ftc_server, - _("💡 The %s have researched %s."), + _("[`bulb`] The %s have researched %s."), research_name, research_advance_name_translation(research, tech)); @@ -200,14 +200,14 @@ void do_tech_parasite_effect(struct player *pplayer) notify_player(pplayer, NULL, E_TECH_GAIN, ftc_server, /* TRANS: Tech from source of an effect * (Great Library) */ - Q_("?fromeffect:💡 %s%s acquired from %s!"), + Q_("?fromeffect:[`bulb`] %s%s acquired from %s!"), (game.server.blueprints ? _("blueprints for ") : _("")), advance_name, astr_str(&effects)); notify_research(plr_research, pplayer, E_TECH_GAIN, ftc_server, /* TRANS: Tech from source of an effect * (Great Library) */ - Q_("?fromeffect:💡 %s%s acquired from %s's %s!"), + Q_("?fromeffect:[`bulb`] %s%s acquired from %s's %s!"), (game.server.blueprints ? _("blueprints for ") : _("")), advance_name, player_name(pplayer), @@ -215,7 +215,7 @@ void do_tech_parasite_effect(struct player *pplayer) notify_research_embassies(plr_research, NULL, E_TECH_EMBASSY, ftc_server, /* TRANS: Tech from source of an effect * (Great Library) */ - Q_("?fromeffect:💡 The %s have acquired %s%s from %s."), + Q_("?fromeffect:[`bulb`] The %s have acquired %s%s from %s."), (game.server.blueprints ? _("blueprints for ") : _("")), research_name, advance_name, @@ -362,7 +362,7 @@ int found_new_blueprint(struct research *research, /* blueprint_discount of 100 results in acquisition of tech */ if (blueprint_discount >= 100) { /* Notify parties who have intel of the event. */ notify_research_embassies(research, NULL, E_TECH_EMBASSY, ftc_server, - _("💡 The %s have acquired %s from blueprints."), + _("[`bulb`] The %s have acquired %s from blueprints."), research_name, research_advance_name_translation(research, tech)); /* really give the tech */ found_new_tech(research, tech, FALSE, TRUE); @@ -408,7 +408,7 @@ int found_new_blueprint(struct research *research, } } notify_research_embassies(research, NULL, E_TECH_EMBASSY, ftc_server, - _("💡 The %s received blueprints for %s."), + _("[`bulb`] The %s received blueprints for %s."), research_name, research_advance_name_translation(research, tech)); @@ -417,7 +417,7 @@ int found_new_blueprint(struct research *research, } research_players_iterate(research, pplayer) { notify_player(pplayer, NULL, E_MY_DIPLOMAT_FAILED, ftc_server, - _("💢 The %s blueprints were useless."), + _("[`anger`] The %s blueprints were useless."), research_advance_name_translation(research, tech)); } research_players_iterate_end; @@ -465,7 +465,7 @@ void found_new_tech(struct research *presearch, Tech_type_id tech_found, && is_great_wonder(pimprove) && (pcity = city_from_great_wonder(pimprove))) { notify_player(city_owner(pcity), NULL, E_WONDER_OBSOLETE, ftc_server, - _("⚠️ Discovery of %s OBSOLETES %s in %s!"), + _("[`warning`] Discovery of %s OBSOLETES %s in %s!"), research_advance_name_translation (research_get(city_owner(pcity)), tech_found), improvement_name_translation(pimprove), @@ -625,7 +625,7 @@ void found_new_tech(struct research *presearch, Tech_type_id tech_found, * before really picking the new technology. */ if (A_UNSET != next_tech) { notify_research(presearch, NULL, E_TECH_LEARNED, ftc_server, - _("​[`techs/%s`] Learned %s.
💡 Scientists now focus on %s; " + _("[`techs/%s`] Learned %s.
[`bulb`] Scientists now focus on %s; " "goal is %s."), advance_name, advance_name, research_advance_name_translation(presearch, @@ -649,11 +649,11 @@ void found_new_tech(struct research *presearch, Tech_type_id tech_found, if (A_UNSET == next_tech) { notify_research(presearch, NULL, E_TECH_LEARNED, ftc_server, - _("​[`techs/%s`] Learned %s.
💡 Scientists ask what to research next."), + _("[`techs/%s`] Learned %s.
[`bulb`] Scientists ask what to research next."), advance_name, advance_name); } else { notify_research(presearch, NULL, E_TECH_LEARNED, ftc_server, - _("​[`techs/%s`] Learned %s.
💡 Our scientists' new goal is %s."), + _("[`techs/%s`] Learned %s.
[`bulb`] Our scientists' new goal is %s."), advance_name, advance_name, research_advance_name_translation(presearch, next_tech)); @@ -692,13 +692,13 @@ void found_new_tech(struct research *presearch, Tech_type_id tech_found, /* FIXME: "your" when it was just civilization of one of the players * sharing the reseach. */ notify_research(presearch, NULL, E_TECH_GAIN, ftc_server, - _("​[`techs/%s`] Scientists from all the " + _("[`techs/%s`] Scientists from all the " "world join your civilization: you learn " "%s immediately."), radv_name, radv_name); } /* TODO: Ruleset should be able to customize this message too */ notify_research_embassies(presearch, NULL, E_TECH_EMBASSY, ftc_server, - _("💡 %s acquire %s as a result of learning %s."), + _("[`bulb`] %s acquire %s as a result of learning %s."), research_name, radv_name, advance_name); } } @@ -739,8 +739,8 @@ static bool lose_tech(struct research *research) The caller is responsible for sending updated player information. - This is called from each city every turn, from caravan revenue, and at the - end of the phase. + This is called from each city every turn, from caravan revenue, at the + end of the phase, and from lua API. ****************************************************************************/ void update_bulbs(struct player *pplayer, int bulbs, bool check_tech) { @@ -789,7 +789,7 @@ void update_bulbs(struct player *pplayer, int bulbs, bool check_tech) /* Make notification after losing the research, in case it is * a future tech (for getting the right tech number). */ notify_research(research, NULL, E_TECH_LOST, ftc_server, - _("⚠️ Insufficient science output. We lost %s."), + _("[`warning`] Insufficient science output. We lost %s."), research_advance_name_translation(research, tech)); } } @@ -910,7 +910,7 @@ static void research_tech_lost(struct research *presearch, Tech_type_id tech) /* Notify after decreasing the future tech counter, to get the right * tech number in the message. */ notify_research_embassies(presearch, NULL, E_TECH_EMBASSY, ftc_server, - _("💢 The %s have lost %s."), + _("[`anger`] The %s have lost %s."), research_name, research_advance_name_translation(presearch, tech)); @@ -922,7 +922,7 @@ static void research_tech_lost(struct research *presearch, Tech_type_id tech) fc_assert_ret(valid_advance_by_number(tech)); notify_research_embassies(presearch, NULL, E_TECH_EMBASSY, ftc_server, /* TRANS: technology loss */ - _("💢 The %s have lost %s."), + _("[`anger`] The %s have lost %s."), research_name, research_advance_name_translation(presearch, tech)); @@ -944,7 +944,7 @@ static void research_tech_lost(struct research *presearch, Tech_type_id tech) struct government *pgov = pick_random_government(pplayer); notify_player(pplayer, NULL, E_NEW_GOVERNMENT, ftc_server, - _("⚠️ The required technology for our government '%s' " + _("[`warning`] The required technology for our government '%s' " "was lost. The citizens have started a " "revolution into '%s'."), government_name_translation(government_of_player @@ -960,7 +960,7 @@ static void research_tech_lost(struct research *presearch, Tech_type_id tech) struct government *pgov = pick_random_government(pplayer); notify_player(pplayer, NULL, E_NEW_GOVERNMENT, ftc_server, - _("⚠️ The required technology for our new government " + _("[`warning`] The required technology for our new government " "'%s' was lost. The citizens chose '%s' as new " "target government."), government_name_translation(pplayer->target_government), @@ -988,7 +988,7 @@ static void research_tech_lost(struct research *presearch, Tech_type_id tech) && !can_city_build_unit_now(pcity, pcity->production.value.utype)) { notify_player(pplayer, city_tile(pcity), E_CITY_CANTBUILD, ftc_server, - _("⚠️ %s can't build %s. The required technology was " + _("[`warning`] %s can't build %s. The required technology was " "lost."), city_link(pcity), utype_name_translation(pcity->production.value.utype)); @@ -1001,7 +1001,7 @@ static void research_tech_lost(struct research *presearch, Tech_type_id tech) pcity->production.value.building)) { notify_player(pplayer, city_tile(pcity), E_CITY_CANTBUILD, ftc_server, - _("⚠️ %s can't build %s. The required technology was " + _("[`warning`] %s can't build %s. The required technology was " "lost."), city_link(pcity), improvement_name_translation @@ -1191,7 +1191,7 @@ void choose_tech_goal(struct research *presearch, Tech_type_id tech) * choose_random_tech() should be called here. */ presearch->tech_goal = tech; notify_research(presearch, NULL, E_TECH_GOAL, ftc_server, - _("💡 Future technology goal is %s."), + _("[`bulb`] Future technology goal is %s."), research_advance_name_translation(presearch, tech)); } @@ -1444,25 +1444,25 @@ Tech_type_id steal_a_tech(struct player *pplayer, struct player *victim, advance_name = research_advance_name_translation(presearch, stolen_tech); research_pretty_name(presearch, research_name, sizeof(research_name)); notify_player(pplayer, NULL, E_MY_DIPLOMAT_THEFT, ftc_server, - _("💡 You steal %s%s from the %s."), + _("[`bulb`] You steal %s%s from the %s."), (game.server.blueprints ? _("blueprints for ") : _("")), advance_name, nation_plural_for_player(victim)); notify_research(presearch, pplayer, E_TECH_GAIN, ftc_server, - _("💡 The %s stole %s%s from the %s and shared it with you."), + _("[`bulb`] The %s stole %s%s from the %s and shared it with you."), nation_plural_for_player(pplayer), (game.server.blueprints ? _("blueprints for ") : _("")), advance_name, nation_plural_for_player(victim)); notify_player(victim, NULL, E_ENEMY_DIPLOMAT_THEFT, ftc_server, - _("⚠️ The %s stole %s%s from you!"), + _("[`warning`] The %s stole %s%s from you!"), nation_plural_for_player(pplayer), (game.server.blueprints ? _("blueprints for ") : _("")), advance_name); notify_research_embassies(presearch, victim, E_TECH_EMBASSY, ftc_server, - _("💢 The %s have stolen %s%s from the %s."), + _("[`anger`] The %s have stolen %s%s from the %s."), research_name, (game.server.blueprints ? _("blueprints for ") : _("")), advance_name, @@ -1579,11 +1579,11 @@ static void forget_tech_transfered(struct player *pplayer, Tech_type_id tech) /* Make notification after losing the research, in case it is a future * tech (for getting the right tech number). */ notify_player(pplayer, NULL, E_TECH_LOST, ftc_server, - _("⚠️ Too bad! You made a mistake transferring the tech %s and " + _("[`warning`] Too bad! You made a mistake transferring the tech %s and " "lost it."), research_advance_name_translation(presearch, tech)); notify_research(presearch, pplayer, E_TECH_LOST, ftc_server, - _("⚠️ Too bad! The %s made a mistake transferring the tech " + _("[`warning`] Too bad! The %s made a mistake transferring the tech " "%s and lost it."), nation_plural_for_player(pplayer), research_advance_name_translation(presearch, tech)); diff --git a/freeciv/freeciv/server/unithand.c b/freeciv/freeciv/server/unithand.c index 9fee33a76..72626e03b 100644 --- a/freeciv/freeciv/server/unithand.c +++ b/freeciv/freeciv/server/unithand.c @@ -253,10 +253,10 @@ void handle_unit_type_upgrade(struct player *pplayer, Unit_type_id uti) conn_list_do_buffer(pplayer->connections); unit_list_iterate(pplayer->units, punit) { if (unit_type_get(punit) == from_unittype) { - struct city *pcity = tile_city(unit_tile(punit)); - if (is_action_enabled_unit_on_city(paction->id, punit, pcity) - && unit_perform_action(pplayer, punit->id, pcity->id, 0, "", + if (is_action_enabled_unit_on_tile(paction->id, punit, unit_tile(punit), NULL) + + && unit_perform_action(pplayer, punit->id, unit_tile(punit)->index, 0, "", paction->id, ACT_REQ_SS_AGENT)) { number_of_upgraded_units++; } else if (UU_NO_MONEY == unit_upgrade_test(punit, FALSE)) { @@ -269,18 +269,26 @@ void handle_unit_type_upgrade(struct player *pplayer, Unit_type_id uti) /* Alert the player about what happened. */ if (number_of_upgraded_units > 0) { const int cost = unit_upgrade_price(pplayer, from_unittype, to_unittype); - notify_player(pplayer, NULL, E_UNIT_UPGRADED, ftc_server, - /* FIXME: plurality of number_of_upgraded_units ignored! - * (Plurality of unit names is messed up anyway.) */ - /* TRANS: "2 Musketeers upgraded to Riflemen for 100 gold." - * Plurality is in gold (second %d), not units. */ - PL_("​[`gold`] %d %s upgraded to %s for %d gold.", - "​[`gold`] %d %s upgraded to %s for %d gold.", - cost * number_of_upgraded_units), - number_of_upgraded_units, - utype_name_translation(from_unittype), - utype_name_translation(to_unittype), - cost * number_of_upgraded_units); + if (cost==0) { + notify_player(pplayer, NULL, E_UNIT_UPGRADED, ftc_server, + _("[`gift`] %d %s upgraded to %s for free!"), + number_of_upgraded_units, + utype_name_translation(from_unittype), + utype_name_translation(to_unittype)); + } else { + notify_player(pplayer, NULL, E_UNIT_UPGRADED, ftc_server, + /* FIXME: plurality of number_of_upgraded_units ignored! + * (Plurality of unit names is messed up anyway.) */ + /* TRANS: "2 Musketeers upgraded to Riflemen for 100 gold." + * Plurality is in gold (second %d), not units. */ + PL_("[`gold`] %d %s upgraded to %s for %d gold.", + "[`gold`] %d %s upgraded to %s for %d gold.", + cost * number_of_upgraded_units), + number_of_upgraded_units, + utype_name_translation(from_unittype), + utype_name_translation(to_unittype), + cost * number_of_upgraded_units); + } send_player_info_c(pplayer, pplayer->connections); } else { notify_player(pplayer, NULL, E_UNIT_UPGRADED, ftc_server, @@ -307,12 +315,19 @@ static bool do_unit_upgrade(struct player *pplayer, if (ordered_by == ACT_REQ_PLAYER) { int cost = unit_upgrade_price(pplayer, from_unit, to_unit); - notify_player(pplayer, unit_tile(punit), E_UNIT_UPGRADED, ftc_server, - PL_("​[`gold`] %s upgraded to %s for %d gold.", - "​[`gold`] %s upgraded to %s for %d gold.", cost), - utype_name_translation(from_unit), - unit_link(punit), - cost); + if (cost==0) { + notify_player(pplayer, unit_tile(punit), E_UNIT_UPGRADED, ftc_server, + "[`gift`] %s upgraded to %s for free.", + utype_name_translation(from_unit), + unit_link(punit)); + } else { + notify_player(pplayer, unit_tile(punit), E_UNIT_UPGRADED, ftc_server, + PL_("[`gold`] %s upgraded to %s for %d gold.", + "[`gold`] %s upgraded to %s for %d gold.", cost), + utype_name_translation(from_unit), + unit_link(punit), + cost); + } } return TRUE; @@ -410,7 +425,7 @@ static bool do_capture_units(struct player *pplayer, notify_player(unit_owner(pcargo), pdesttile, E_ENEMY_DIPLOMAT_BRIBE, ftc_server, - _("⚠️ Your transported %s %s %s lost when the %s ambushed %s %s."), + _("[`warning`] Your transported %s %s %s lost when the %s ambushed %s %s."), unit_name_translation(pcargo), UNIT_EMOJI(pcargo), (is_unit_plural(pcargo) ? "were" : "was"), nation_plural_for_player(pplayer), @@ -425,14 +440,14 @@ static bool do_capture_units(struct player *pplayer, notify_player(pplayer, pdesttile, E_ENEMY_DIPLOMAT_BRIBE, ftc_server, - _("​[`gold`] Captured %s cargo was taken as booty and auctioned for %d gold."), + _("[`gold`] Captured %s cargo was taken as booty and auctioned for %d gold."), unit_name_translation(pcargo), unit_build_shield_cost_base(pcargo)); *****************************************************************************/ if (new_home_city != NULL) { notify_player(pplayer, pdesttile, E_ENEMY_DIPLOMAT_BRIBE, ftc_server, - _("🎁 Captured %s %s %s confiscated as booty and taken to your nearest city, %s."), + _("[`gift`] Captured %s %s %s confiscated as booty and taken to your nearest city, %s."), unit_name_translation(pcargo), UNIT_EMOJI(pcargo), (is_unit_plural(pcargo) ? "were" : "was"), @@ -465,13 +480,13 @@ static bool do_capture_units(struct player *pplayer, /* Notify players */ notify_player(pplayer, pdesttile, E_MY_DIPLOMAT_BRIBE, ftc_server, /* TRANS: ... */ - _("🎁 Your %s succeeded in capturing the %s %s."), + _("[`gift`] Your %s succeeded in capturing the %s %s."), capturer_link, nation_adjective_for_player(uplayer), victim_link); notify_player(uplayer, pdesttile, E_ENEMY_DIPLOMAT_BRIBE, ftc_server, /* TRANS: ... */ - _("⚠️ Your %s %s captured by the %s."), + _("[`warning`] Your %s %s captured by the %s."), victim_link, (is_unit_plural(to_capture) ? "were" : "was"), capturer_nation); @@ -561,12 +576,12 @@ static bool do_expel_unit(struct player *pplayer, /* Notify everybody involved. */ notify_player(pplayer, target_tile, E_UNIT_DID_EXPEL, ftc_server, /* TRANS: ... */ - _("👢 Your %s succeeded in expelling the %s %s."), + _("[`boot`] Your %s succeeded in expelling the %s %s."), unit_link(actor), nation_adjective_for_player(uplayer), target_link); notify_player(uplayer, target_tile, E_UNIT_WAS_EXPELLED, ftc_server, /* TRANS: ... */ - _("👢 Your %s %s expelled by the %s."), + _("[`boot`] Your %s %s expelled by the %s."), target_link, (is_unit_plural(target) ? "were" : "was"), nation_plural_for_player(pplayer)); @@ -654,13 +669,13 @@ static bool do_heal_unit(struct player *act_player, notify_player(act_player, tgt_tile, E_MY_UNIT_DID_HEAL, ftc_server, /* TRANS: If foreign: Your Leader heals Finnish Warrior. * If domestic: Your Leader heals your Warrior. */ - _("🩸 Your %s heals %s %s."), + _("[`tea`] Your %s heals %s %s."), act_unit_link, tgt_unit_owner, tgt_unit_link); if (act_player != tgt_player) { notify_player(tgt_player, tgt_tile, E_MY_UNIT_WAS_HEALED, ftc_server, /* TRANS: Norwegian ... Leader ... Warrior */ - _("🩸 %s %s heals your %s."), + _("[`tea`] %s %s heals your %s."), nation_adjective_for_player(unit_nationality(act_unit)), act_unit_link, tgt_unit_link); } @@ -1673,7 +1688,7 @@ static void explain_why_no_action_enabled(struct unit *punit, break; case ANEK_NO_WAR: notify_player(pplayer, unit_tile(punit), E_BAD_COMMAND, ftc_server, - _("💢 Your %s %s unable to aggress the tile: "), + _("[`anger`] Your %s %s unable to aggress the tile: "), unit_name_translation(punit), (is_unit_plural(punit) ? "are" : "is")); notify_player( @@ -1806,7 +1821,7 @@ static void explain_why_no_action_enabled(struct unit *punit, fc__fallthrough; /* Fall through to unknown cause. */ case ANEK_UNKNOWN: notify_player(pplayer, unit_tile(punit), E_BAD_COMMAND, ftc_server, - _("💢 No action possible for %s %s."), + _("[`anger`] No action possible for %s %s."), unit_tile_link(punit), UNIT_EMOJI(punit)); break; @@ -2457,7 +2472,10 @@ void illegal_action_msg(struct player *pplayer, _("Your %s can't do %s when %s is legal."), unit_name_translation(actor), action_id_name_translation(stopped_action), - action_id_name_translation(explnat->blocker->id)); + /* FCW 8Feb2022: action_id_name_translation(explnat->blocker->id) says, + * "Your Caravan can't do Recycle unit when Recycle unit is legal" + * for blocker->id == ACTION_HELP_WONDER. Use rule_name for now */ + action_id_rule_name(explnat->blocker->id)); break; case ANEK_UNKNOWN: notify_player(pplayer, unit_tile(actor), @@ -2489,6 +2507,8 @@ static void illegal_action(struct player *pplayer, bool disturb_player, const enum action_requester requester) { + if (!actor) return; + int punishment_mp; /* Why didn't the game check before trying something illegal? Did a good @@ -2597,9 +2617,15 @@ void handle_unit_action_query(struct connection *pc, if (punit && is_action_enabled_unit_on_unit(action_type, pactor, punit)) { + int cost = unit_bribe_cost(punit,pplayer); + cost += (cost * get_target_bonus_effects(NULL, unit_owner(pactor), + unit_owner(punit), game_city_by_number(pactor->homecity), + NULL, unit_tile(punit), pactor, unit_type_get(pactor), + NULL, NULL, action_by_number(ACTION_SPY_BRIBE_UNIT), + EFT_ACTOR_BRIBE_COST_PCT)) / 100; dsend_packet_unit_action_answer(pc, actor_id, target_id, - unit_bribe_cost(punit, pplayer), + cost, action_type, disturb_player); } else { illegal_action(pplayer, pactor, action_type, @@ -2614,9 +2640,18 @@ void handle_unit_action_query(struct connection *pc, if (pcity && is_action_enabled_unit_on_city(action_type, pactor, pcity)) { + int incite_cost = city_incite_cost(pplayer, pcity); + /* Actor cost mod. Target cost mod is in city_incite_cost(..) */ + incite_cost += (incite_cost + * get_target_bonus_effects(NULL, unit_owner(pactor), + city_owner(pcity), game_city_by_number(pactor->homecity), + NULL, city_tile(pcity), pactor, unit_type_get(pactor), + NULL, NULL, action_by_number(action_type), + EFT_ACTOR_INCITE_COST_PCT)) / 100; + incite_cost = MAX(0, incite_cost); dsend_packet_unit_action_answer(pc, actor_id, target_id, - city_incite_cost(pplayer, pcity), + incite_cost, action_type, disturb_player); } else { illegal_action(pplayer, pactor, action_type, @@ -2627,14 +2662,13 @@ void handle_unit_action_query(struct connection *pc, } break; case ACTION_UPGRADE_UNIT: - if (pcity - && is_action_enabled_unit_on_city(action_type, - pactor, pcity)) { + if (is_action_enabled_unit_on_tile(action_type, + pactor, unit_tile(pactor), NULL)) { const struct unit_type *tgt_utype; int upgr_cost; tgt_utype = can_upgrade_unittype(pplayer, unit_type_get(pactor)); - /* Already checked via is_action_enabled_unit_on_city() */ + /* Already checked via is_action_enabled_unit_on_tile() */ fc_assert_ret(tgt_utype); upgr_cost = unit_upgrade_price(pplayer, unit_type_get(pactor), tgt_utype); @@ -2645,8 +2679,8 @@ void handle_unit_action_query(struct connection *pc, disturb_player); } else { illegal_action(pplayer, pactor, action_type, - pcity ? city_owner(pcity) : NULL, - NULL, pcity, NULL, disturb_player, ACT_REQ_PLAYER); + tile_owner(unit_tile(pactor)), + unit_tile(pactor), NULL, NULL, disturb_player, ACT_REQ_PLAYER); unit_query_impossible(pc, actor_id, target_id, disturb_player); return; } @@ -2810,7 +2844,6 @@ bool unit_perform_action(struct player *pplayer, success = action_performer; \ if (success) { \ action_success_actor_price(paction, actor_id, actor); \ - action_success_target_pay_mp(paction, target_id, punit); \ } \ return success; \ } else { \ @@ -2836,6 +2869,7 @@ bool unit_perform_action(struct player *pplayer, success = action_performer; \ if (success) { \ action_success_actor_price(paction, actor_id, actor); \ + action_success_target_pay_mp(paction, target_id, punit); \ } \ return success; \ } else { \ @@ -3074,9 +3108,10 @@ bool unit_perform_action(struct player *pplayer, do_unit_change_homecity(actor_unit, pcity)); break; case ACTION_UPGRADE_UNIT: - ACTION_STARTED_UNIT_CITY(action_type, actor_unit, pcity, + target_tile = unit_tile(actor_unit); + ACTION_STARTED_UNIT_TILE(action_type, actor_unit, target_tile, do_unit_upgrade(pplayer, actor_unit, - pcity, requester)); + tile_city(unit_tile(actor_unit)), requester)); break; case ACTION_CONQUER_CITY: case ACTION_CONQUER_CITY2: @@ -3366,7 +3401,7 @@ static bool do_unit_change_homecity(struct unit *punit, notify_player(city_owner(pcity), city_tile(pcity), E_UNIT_BUILT, ftc_server, /* TRANS: other player ... unit type ... city name. */ - _("🎁 %s transferred control over a %s %s to you in %s."), + _("[`gift`] %s transferred control over a %s %s to you in %s."), giver, unit_tile_link(punit), UNIT_EMOJI(punit), @@ -3407,7 +3442,9 @@ static bool unit_do_help_build(struct player *pplayer, act_utype = unit_type_get(punit); - shields = unit_shield_value(punit, unit_type_get(punit), paction); + shields = unit_shield_value(punit, unit_type_get(punit), paction, + /* NULL == we don't want player price/bonus discounts in this calc.*/ + NULL); bool double_contributor = (shields >= unit_type_get(punit)->build_cost * 2) ? true : false; @@ -3470,11 +3507,11 @@ static bool unit_do_help_build(struct player *pplayer, } action_name = (is_unit_plural(punit) ? _("recycle to build") : _("recycles to build")); - if (three_quarters) info_emoji = _("​[`recycle`][`75`]"); + if (three_quarters) info_emoji = _("[`recycle`][`75`]"); else { - if (double_contributor) info_emoji = _("​[`recycle`][`200`]"); + if (double_contributor) info_emoji = _("[`recycle`][`200`]"); else { - info_emoji = full_contributor ? _("​[`recycle`][`100`]") : _("​[`recycle`][`50pct`]"); + info_emoji = full_contributor ? _("[`recycle`][`100`]") : _("[`recycle`][`50pct`]"); } } } @@ -3517,7 +3554,7 @@ static bool unit_do_help_build(struct player *pplayer, E_CARAVAN_ACTION, ftc_server, /* TRANS: We received help to build the Pyramids in Bergen * from [a] Persian Caravan (4 surplus). */ - _("🎁 We received help to build the %s [`%s`] in %s from %s %s %s %s " + _("[`gift`] We received help to build the %s [`%s`] in %s from %s %s %s %s " "(%d %s)."), city_production_name_translation(pcity_dest), city_production_name_translation(pcity_dest), @@ -3575,7 +3612,7 @@ static bool city_add_unit(struct player *pplayer, struct unit *punit, /* Notify the unit owner that the unit successfully joined the city. */ notify_player(pplayer, city_tile(pcity), E_CITY_BUILD, ftc_server, - _("➕ %s added to aid %s in growing."), + _("[`plus`] %s added to aid %s in growing."), unit_tile_link(punit), city_link(pcity)); if (pplayer != city_owner(pcity)) { @@ -3583,7 +3620,7 @@ static bool city_add_unit(struct player *pplayer, struct unit *punit, notify_player(city_owner(pcity), city_tile(pcity), E_CITY_BUILD, ftc_server, /* TRANS: another player had his unit joint your city. */ - _("➕ %s adds %s to your city %s."), + _("[`plus`] %s adds %s to your city %s."), player_name(unit_owner(punit)), unit_tile_link(punit), city_link(pcity));; @@ -3857,13 +3894,18 @@ void handle_unit_change_activity(struct player *pplayer, int unit_id, int target_id) { struct extra_type *activity_target; + struct unit *punit = player_unit_by_number(pplayer, unit_id); + if (NULL == punit) { + /* Probably died or bribed. */ + log_verbose("handle_unit_change_activity() invalid unit %d", unit_id); + return; + } if (activity == ACTIVITY_PILLAGE) { - struct unit *punit = player_unit_by_number(pplayer, unit_id); if (target_id >= ACTIVITY_IPILLAGE_OVERRIDE_FLAG) { // & causes 'true' for target_id == -1 // Client requests to override default iPillage with standard Pillage. target_id -= ACTIVITY_IPILLAGE_OVERRIDE_FLAG; // convert target_id to valid again. - if (punit) punit->server.iPillage_no = true; + punit->server.iPillage_no = true; } else punit->server.iPillage_no = false; } @@ -3877,13 +3919,8 @@ void handle_unit_change_activity(struct player *pplayer, int unit_id, #ifdef FREECIV_WEB /* Web-client is not capable of selecting target, so we do it server side */ if (activity_target == NULL) { - struct unit *punit = player_unit_by_number(pplayer, unit_id); bool required = TRUE; - if (punit == NULL) { - return; - } - if (activity == ACTIVITY_IRRIGATE) { struct tile *ptile = unit_tile(punit); struct terrain *pterrain = tile_terrain(ptile); @@ -4166,11 +4203,11 @@ static bool unit_bombard(struct unit *punit, struct tile *ptile, if (def_hp > 0) { // SURVIVED notify_player(pplayer, ptile, E_UNIT_ACTION_FAILED, ftc_server, - /* TRANS: 💢 Your 🤺Swordsmen assaulted the English Horsemen🏇 (9hp). - or 💢 Your 🤺Swordsmen retaliated against the English Horsemen🏇 (9hp). */ + /* TRANS: X Your 🤺Swordsmen assaulted the English Horsemen🏇 (9hp). + or X Your 🤺Swordsmen retaliated against the English Horsemen🏇 (9hp). */ /* TODO: replace generic "assaulted" with ruleset defined name of action.*/ - _("💢 Your %s %s the %s %s [`%s`] (%dhp)."), + _("[`anger`] Your %s %s the %s %s [`%s`] (%dhp)."), /*UNIT_EMOJI(punit),*/ unit_name_translation(punit), (is_retaliation ? "retaliated against": "assaulted"), nation_adjective_for_player(unit_owner(pdefender)), @@ -4179,11 +4216,11 @@ static bool unit_bombard(struct unit *punit, struct tile *ptile, notify_player(unit_owner(pdefender), ptile, E_UNIT_ESCAPED, ftc_server, - /* TRANS: 💢 French 🤺Swordsmen assaulted your Horsemen🏇 (9hp). - or 💢 French 🤺Swordsmen retaliated against your Horsemen🏇 (9hp). */ + /* TRANS: X French 🤺Swordsmen assaulted your Horsemen🏇 (9hp). + or X French 🤺Swordsmen retaliated against your Horsemen🏇 (9hp). */ /* TODO: replace generic "assaulted" with ruleset defined name of action.*/ - _("💢 %s %s %s %s your %s [`%s`] (%dhp)."), + _("[`anger`] %s %s %s %s your %s [`%s`] (%dhp)."), nation_adjective_for_player(pplayer), UNIT_EMOJI(punit), unit_name_translation(punit), (is_retaliation ? "retaliated against": "assaulted"), @@ -4192,11 +4229,11 @@ static bool unit_bombard(struct unit *punit, struct tile *ptile, } else { // DIED notify_player(pplayer, ptile, E_UNIT_ACTION_FAILED, ftc_server, - /* TRANS: 💥 Your 🤺Swordsmen assault eliminated the English Horsemen🏇. - or 💥 Your 🤺Swordsmen retaliation eliminated the English Horsemen🏇. */ + /* TRANS: * Your 🤺Swordsmen assault eliminated the English Horsemen🏇. + or * Your 🤺Swordsmen retaliation eliminated the English Horsemen🏇. */ /* TODO: replace generic "assaulted" with ruleset defined name of action.*/ - _("💥 Your %s %s %s the %s %s [`%s`]."), + _("[`boom`] Your %s %s %s the %s %s [`%s`]"), /*UNIT_EMOJI(punit), */unit_name_translation(punit), (is_retaliation ? "retaliation": "assault"), get_battle_winner_verb(0), @@ -4205,11 +4242,11 @@ static bool unit_bombard(struct unit *punit, struct tile *ptile, notify_player(unit_owner(pdefender), ptile, E_UNIT_ESCAPED, ftc_server, - /* TRANS: ⚠️ French 🤺Swordsmen assaulted and eliminated your Horsemen🏇. - or ⚠️ French 🤺Swordsmen retaliated and eliminated your Horsemen🏇. */ + /* TRANS: ! French 🤺Swordsmen assaulted and eliminated your Horsemen🏇. + or ! French 🤺Swordsmen retaliated and eliminated your Horsemen🏇. */ /* TODO: replace generic "assaulted" with ruleset defined name of action.*/ - _("⚠️ %s %s %s %s and %s your %s [`%s`]."), + _("[`warning`] %s %s %s %s and %s your %s [`%s`]"), nation_adjective_for_player(pplayer), UNIT_EMOJI(punit), unit_name_translation(punit), (is_retaliation ? "retaliated": "assaulted"), @@ -4304,15 +4341,23 @@ static bool unit_bombard(struct unit *punit, struct tile *ptile, unit_list_iterate_safe(ptile->units, pdefender) { struct extra_unit_stats rstats; unit_get_extra_stats(&rstats, pdefender); - - if (rstats.bombard_retaliate_rounds // a retaliator recursively fights back... - && pdefender->moves_left > 0) { // ... if it has moves_left: + + // Retaliators get a chance to 'recursively' fight back */ + // ... if defender has bombard retaliation capability: + if (rstats.bombard_retaliate_rounds + // ... and if attacker is reachable: + && is_unit_reachable_at(punit, pdefender, unit_tile(punit)) + /* ... and ACTION_BOMBARD is possible on the attacker's tile ... + && is_action_enabled_unit_on_tile(ACTION_BOMBARD, pdefender, + unit_tile(punit), NULL) TODO: commented out because wrongly returns FALSE */ + // ... and if defender has moves_left: + && pdefender->moves_left > 0) { unit_bombard(pdefender, // Defender is now Attacker unit_tile(punit), // Attacker tile is now Defender tile paction, // (still Bombardment, but will be unused) true); // is_retaliation==true, ... - } // ... (so no further recursion) + } // ... (to avoid recursion) } unit_list_iterate_safe_end; } @@ -4339,7 +4384,7 @@ static bool unit_nuke(struct player *pplayer, struct unit *punit, /* unit_type_iterate(ptype) { notify_player(pplayer, unit_tile(punit), E_UNIT_LOST_ATT, ftc_server, - _("​[`/units/%s`] id:%d name: %s"), + _("[`/units/%s`] id:%d name: %s"), utype_name_translation(ptype), ptype->item_number, utype_name_translation(ptype)); @@ -4369,10 +4414,10 @@ static bool unit_nuke(struct player *pplayer, struct unit *punit, if ((pcity = sdi_try_defend(pplayer, def_tile))) { /* FIXME: Remove the hard coded reference to SDI defense. */ notify_player(pplayer, unit_tile(punit), E_UNIT_LOST_ATT, ftc_server, - _("⚠️Your %s was shot down by " + _("[`warning`]Your %s was shot down by " "SDI defenses, what a waste."), unit_tile_link(punit)); notify_player(city_owner(pcity), def_tile, E_UNIT_WIN_DEF, ftc_server, - _("💥The nuclear attack on %s was thwarted by" + _("[`boom`]The nuclear attack on %s was thwarted by" " your SDI defense."), city_link(pcity)); /* Trying to nuke something this close can be... unpopular. */ @@ -4463,14 +4508,14 @@ static bool unit_do_destroy_city(struct player *act_player, /* Let the actor know. */ notify_player(act_player, city_tile(tgt_city), E_UNIT_WIN_ATT, ftc_server, - _("💥You destroy %s completely."), + _("[`skull`] You destroy %s completely."), city_tile_link(tgt_city)); if (tgt_player != act_player) { /* This was done to a foreign city. Inform the victim player. */ notify_player(tgt_player, city_tile(tgt_city), E_CITY_LOST, ftc_server, - _("⚠️%s has been destroyed by %s."), + _("[`skull`] %s has been destroyed by %s."), city_tile_link(tgt_city), player_name(act_player)); } @@ -4619,11 +4664,11 @@ static bool do_attack(struct unit *punit, struct tile *def_tile, if (game.server.killcitizen_pct>0 && game.server.killcitizen_pct<100) { notify_player(pplayer, NULL, E_UNIT_LOST_MISC, ftc_server, - _("💥 Population lost in %s after successful attack:"), + _("[`boom`] Population lost in %s after successful attack:"), city_link(pcity)); notify_player(unit_owner(pdefender), def_tile, E_CITY_FAMINE, ftc_server, //E_CITY_FAMINE is only shared event for pop loss in city. - _("➖ The %s attack caused population loss in %s:"), + _("[`minus`] The %s attack caused population loss in %s:"), nation_adjective_for_player(pplayer), city_link(pcity)); } @@ -4636,11 +4681,11 @@ static bool do_attack(struct unit *punit, struct tile *def_tile, if (game.server.killcitizen_pct>0 && game.server.killcitizen_pct<100) { notify_player(pplayer, NULL, E_CITY_NORMAL, ftc_server, - _("​[`equal`] %s lost no population after your attack:"), + _("[`equal`] %s lost no population after your attack:"), city_link(pcity)); notify_player(unit_owner(pdefender), NULL, E_CITY_NORMAL, ftc_server, - _("​[`equal`] No population loss in %s after %s attack:"), + _("[`equal`] No population loss in %s after %s attack:"), city_link(pcity), nation_adjective_for_player(pplayer)); } @@ -4668,15 +4713,15 @@ static bool do_attack(struct unit *punit, struct tile *def_tile, notify_player(unit_owner(punit), def_tile, E_UNIT_ACTION_FAILED, ftc_server, - /* TRANS: Your 🐎Horsemen (2hp) could not defeat the Australian Horsemen🐎 (2hp)." */ - _("💢 Your %s %s (%dhp) could not defeat the %s %s %s (%dhp).\n"), + /* TRANS: Your Horsemen (2hp) could not defeat the Australian Horsemen (2hp)." */ + _("[`anger`] Your %s %s (%dhp) could not defeat the %s %s %s (%dhp).\n"), punit_emoji, loser_link, punit->hp, nation_adjective_for_player(unit_owner(pdefender)), winner_link, pdefender_emoji, pdefender->hp); notify_player(unit_owner(pdefender), def_tile, E_UNIT_ESCAPED, ftc_server, /* TRANS: "[An] Indian ⛵Galleon (4hp) attacked your Frigate⛵ (6hp), with no casualties. */ - _("💢 %s %s %s %s (%dhp) attacked your %s %s %s (%dhp), with no casualties.\n"), + _("[`anger`] %s %s %s %s (%dhp) attacked your %s %s %s (%dhp), with no casualties.\n"), is_unit_plural(punit) ? "" : indefinite_article_for_word(nation_adjective_for_player(unit_owner(punit)), true), nation_adjective_for_player(unit_owner(punit)), punit_emoji, loser_link, @@ -4718,15 +4763,15 @@ static bool do_attack(struct unit *punit, struct tile *def_tile, nation_rule_name(nation_of_unit(pdefender)), unit_rule_name(pdefender)); - const char *adj = get_battle_survivor_adjective(pdefender); + const char *adjective = get_battle_survivor_adjective(pdefender); notify_player(unit_owner(pwinner), unit_tile(pwinner), E_UNIT_WIN_DEF, ftc_server, /* TRANS: "Your Cannon ... the Polish Destroyer." */ - _("💥 Your %s %s %s survived %s %s attack by %s %s [`%s`] %s."), + _("[`boom`] Your %s %s %s survived %s %s attack by %s %s [`%s`] %s."), (pcity ? city_link(pcity) : ""), winner_link, UNIT_EMOJI(pwinner), - indefinite_article_for_word(adj, false), - adj, + indefinite_article_for_word(adjective, false), + adjective, (is_unit_plural(punit) ? "" : indefinite_article_for_word(nation_adjective_for_player(unit_owner(ploser)),false)), nation_adjective_for_player(unit_owner(ploser)), ploser_name, @@ -4737,10 +4782,11 @@ static bool do_attack(struct unit *punit, struct tile *def_tile, notify_player(unit_owner(ploser), def_tile, E_UNIT_LOST_ATT, ftc_server, /* TRANS: "... Cannon ... the Polish Destroyer." */ - _("⚠️ Your attacking %s failed against the %s %s."), + _("[`warning`] Your attacking %s failed against the %s %s (%dhp)."), loser_link, nation_adjective_for_player(unit_owner(pwinner)), - winner_link); + winner_link, + pwinner->hp); wipe_unit(ploser, ULR_KILLED, unit_owner(pwinner)); } else { /* The defender lost, the attacker punit lives! */ @@ -5063,6 +5109,18 @@ static bool can_unit_move_to_tile_with_notify(struct unit *punit, return FALSE; } +/**********************************************************************//** + Wrapper function for unit_move_handling_real. This handles all + unit_move_handling cases that aren't on a GOTO looping through a + multi-tile voyage. See unit_move_handling_real for further explanation. +**************************************************************************/ +bool unit_move_handling(struct unit *punit, struct tile *pdesttile, + bool igzoc, bool move_do_not_act) +{ + return unit_move_handling_real(punit, pdesttile, + igzoc, move_do_not_act, TRUE); +} + /**********************************************************************//** Will try to move to/attack the tile dest_x,dest_y. Returns TRUE if this was done, FALSE if it wasn't for some reason. Even if this returns TRUE, @@ -5080,15 +5138,26 @@ static bool can_unit_move_to_tile_with_notify(struct unit *punit, it can't and punit is unable to move (or perform another non enabler controlled action) to pdesttile the game will try to explain why. + 'first_move' - indicates whether the unit is on a GOTO departing from + its first tile. This serves two purposes (1) A big increase to + performance: wakeup_neighbor_sentries() can now get called n+1 times + on a path of n tiles instead of 2*(n-1)+1 times. (2) For servers which + use sentry waking as a useful intel function to report movemments to + the console, this reduces doubling of sentry intel messages which were + appearing when a unit arrived on a tile AND when the unit left the tile. + FIXME: This function needs a good cleaning. **************************************************************************/ -bool unit_move_handling(struct unit *punit, struct tile *pdesttile, - bool igzoc, bool move_do_not_act) +bool unit_move_handling_real(struct unit *punit, struct tile *pdesttile, + bool igzoc, bool move_do_not_act, bool first_move) { struct player *pplayer = unit_owner(punit); struct unit *ptrans; struct city *pcity = tile_city(pdesttile); + /* DEBUG:notify_conn(game.est_connections, unit_tile(punit), E_UNIT_LOST_MISC, ftc_server, + _("arrived in unit_move_handling()")); */ + /*** Phase 1: Basic checks ***/ /* this occurs often during lag, and to the AI due to some quirks -- Syela */ @@ -5237,11 +5306,15 @@ bool unit_move_handling(struct unit *punit, struct tile *pdesttile, tile_owner(pdesttile), pdesttile, tile_link(pdesttile)); - unit_move(punit, pdesttile, move_cost, + /* DEBUG:notify_conn(game.est_connections, unit_tile(punit), E_UNIT_LOST_MISC, ftc_server, + _("about to call unit_move_real()")); */ + unit_move_real(punit, pdesttile, move_cost, /* Don't override "Transport Embark" */ NULL, FALSE, /* Don't override "Conquer City" */ - FALSE); + FALSE, + /* Whether this is the first move on a GOTO path */ + first_move); return TRUE; } else { @@ -5426,9 +5499,9 @@ static bool do_unit_establish_trade(struct player *pplayer, notify_player(pplayer, city_tile(pcity_dest), E_CARAVAN_ACTION, ftc_server, /* TRANS: ... Caravan ... Paris ... Stockholm, ... Goods... */ - PL_("​[`gold`] %s %s from %s arrived in %s." + PL_("[`gold`] %s %s from %s arrived in %s." " Revenue: %d gold.", - "​[`gold`] %s %s from %s arrived in %s." + "[`gold`] %s %s from %s arrived in %s." " Revenue: %d gold.", revenue), punit_link, @@ -5441,9 +5514,9 @@ static bool do_unit_establish_trade(struct player *pplayer, notify_player(pplayer, city_tile(pcity_dest), E_CARAVAN_ACTION, ftc_server, /* TRANS: ... Caravan ... Paris ... Stockholm, ... Goods... */ - PL_("💡 %s %s from %s arrived in %s." + PL_("[`bulb`] %s %s from %s arrived in %s." " Bulbs received: %d.", - "💡 %s %s from %s arrived in %s." + "[`bulb`] %s %s from %s arrived in %s." " Bulbs received: %d.", revenue), punit_link, @@ -5456,9 +5529,9 @@ static bool do_unit_establish_trade(struct player *pplayer, notify_player(pplayer, city_tile(pcity_dest), E_CARAVAN_ACTION, ftc_server, /* TRANS: ... Caravan ... Paris ... Stockholm, ... Goods... */ - PL_("​[`gold`]💡 %s %s from %s arrived in %s." + PL_("[`gold`][`bulb`] %s %s from %s arrived in %s." " Revenues: %d gold, %d bulbs.", - "​[`gold`]💡 %s %s from %s arrived in %s." + "[`gold`][`bulb`] %s %s from %s arrived in %s." " Revenues: %d gold, %d bulbs.", revenue), punit_link, @@ -5498,14 +5571,16 @@ static bool do_unit_establish_trade(struct player *pplayer, /* Always tell the unit owner */ notify_player(pplayer, NULL, E_CARAVAN_ACTION, ftc_server, - _("🐫 New trade route established from %s to %s."), + _("%s New trade route established from %s to %s."), + UNIT_EMOJI(punit), homecity_link, destcity_link); if (pplayer != partner_player) { notify_player(partner_player, city_tile(pcity_dest), E_CARAVAN_ACTION, ftc_server, - _("🐫 The %s established a trade route from " + _("%s The %s established a trade route from " "%s to %s."), + UNIT_EMOJI(punit), nation_plural_for_player(pplayer), homecity_link, destcity_link); @@ -5578,9 +5653,9 @@ static bool do_unit_establish_trade(struct player *pplayer, /* Notify each player about the other cities so that they know about * its size for the trade calculation. */ if (pplayer != partner_player) { - reality_check_city(partner_player, city_tile(pcity_homecity)); + map_show_tile(partner_player, city_tile(pcity_homecity)); send_city_info(partner_player, pcity_homecity); - reality_check_city(pplayer, city_tile(pcity_dest)); + map_show_tile(pplayer, city_tile(pcity_dest)); send_city_info(pplayer, pcity_dest); } @@ -5842,7 +5917,7 @@ bool unit_activity_handling_targeted(struct unit *punit, notify_player(unit_owner(punit), unit_tile(punit), E_UNIT_ACTION_TARGET_HOSTILE, ftc_server, /* changing this string below requires changing substring extraction in packhand:handle_iPillage_event() */ - _("💥 Your %s destroyed the %s %s with a %s."), + _("[`boom`] Your %s destroyed the %s %s with a %s."), unit_link(punit), (tile_owner(unit_tile(punit)) ? nation_adjective_for_player(tile_owner(unit_tile(punit))) : " " ), extra_name_translation(punit->activity_target), @@ -5851,7 +5926,7 @@ bool unit_activity_handling_targeted(struct unit *punit, if (tile_owner(punit->tile) && tile_owner(punit->tile) != unit_owner(punit)) { notify_player(tile_owner(punit->tile), unit_tile(punit), E_UNIT_ACTION_TARGET_HOSTILE, ftc_server, - _("⚠️ Your %s %s destroyed from %s %s done by %s %s %s!"), + _("[`warning`] Your %s %s destroyed from %s %s done by %s %s %s!"), extra_name_translation(punit->activity_target), (is_word_plural(extra_name_translation(punit->activity_target)) ? "were" : "was"), indefinite_article_for_word(unit_type_get(punit)->sound_fight_alt, false), @@ -5885,14 +5960,14 @@ bool unit_activity_handling_targeted(struct unit *punit, else { notify_player(unit_owner(punit), unit_tile(punit), E_UNIT_ACTION_ACTOR_FAILURE, ftc_server, - _("💢 Your %s's %s missed its target."), + _("[`anger`] Your %s's %s missed its target."), unit_link(punit), unit_type_get(punit)->sound_fight_alt); //notify other player: if (tile_owner(punit->tile)) { notify_player(tile_owner(punit->tile), unit_tile(punit), E_UNIT_ACTION_ACTOR_FAILURE, ftc_server, - _("💢 %s %s %s failed while trying to %s your %s."), + _("[`anger`] %s %s %s failed while trying to %s your %s."), indefinite_article_for_word(nation_adjective_for_player(unit_owner(punit)), true), nation_adjective_for_player(unit_owner(punit)), unit_link(punit), diff --git a/freeciv/freeciv/server/unithand.h b/freeciv/freeciv/server/unithand.h index de537f5c9..44a7a0107 100644 --- a/freeciv/freeciv/server/unithand.h +++ b/freeciv/freeciv/server/unithand.h @@ -103,6 +103,8 @@ void unit_change_homecity_handling(struct unit *punit, struct city *new_pcity, bool unit_move_handling(struct unit *punit, struct tile *pdesttile, bool igzoc, bool move_diplomat_city); +bool unit_move_handling_real(struct unit *punit, struct tile *pdesttile, + bool igzoc, bool move_do_not_act, bool first_move); void unit_do_action(struct player *pplayer, const int actor_id, diff --git a/freeciv/freeciv/server/unittools.c b/freeciv/freeciv/server/unittools.c index 6ac6325c9..2a446fc01 100644 --- a/freeciv/freeciv/server/unittools.c +++ b/freeciv/freeciv/server/unittools.c @@ -140,7 +140,7 @@ static void update_unit_activity(struct unit *punit, time_t now); static bool try_to_save_unit(struct unit *punit, const struct unit_type *pttype, bool helpless, bool teleporting, const struct city *pexclcity); -static void wakeup_neighbor_sentries(struct unit *punit); +static void wakeup_neighbor_sentries(struct unit *punit, bool departure); static void do_upgrade_effects(struct player *pplayer); static bool maybe_cancel_patrol_due_to_enemy(struct unit *punit); @@ -156,6 +156,8 @@ static void wipe_unit_full(struct unit *punit, bool transported, enum unit_loss_reason reason, struct player *killer); +static char unit_scrambled_id(int id); + /* Cycling index used by uwt scrambler.*/ int unit_wait_cycle = -1; @@ -235,6 +237,19 @@ char *get_web_unit_icon(const struct unit *punit, char *emoji_str) return emoji_str; // returning the parameter assists macro syntax. } +/************************************************************************* + Makes a unit->id into a single base-26 alphabetic letter. This allows + semi-uniquely identifying units to players in a short form that doesn't + reveal intel about the age of the unit, how many units are in the game, + etc. There is a 1/26 chance of confusing two different units as the same, + but who says that never happened in real life? +**************************************************************************/ +static char unit_scrambled_id(int n) +{ + char identifer = (char)(90-(n % 26)); + return identifer; +} + /**********************************************************************//** Unit has a chance to become veteran. This should not be used for settlers for the work they do. @@ -345,7 +360,30 @@ void unit_versus_unit(struct unit *attacker, struct unit *defender, } else if (defensepower == 0) { *def_hp = 0; } - max_rounds = get_unit_bonus(attacker, EFT_COMBAT_ROUNDS); + + + /* Combat_Rounds tests the defended tile rather than attacker tile, + * so that, e.g., it can be reduced during non-native engagements. */ + max_rounds = get_target_bonus_effects(NULL, + unit_owner(attacker), + unit_owner(defender), + unit_tile(defender) ? tile_city(unit_tile(defender)) : NULL, /*based on tile attacke*/ + NULL, + unit_tile(defender), // consistency: same tile used in get_total_attack_power() above. + attacker, + unit_type_get(attacker), + NULL, + NULL, + NULL, + EFT_COMBAT_ROUNDS); + +/* DEBUG TESTS + notify_player(unit_owner(attacker), NULL, E_UNIT_ACTION_FAILED, ftc_server, + _("ATK FP = %d\nATK POW = %d\nmax_rounds = %d"), + attack_firepower, + attackpower, + max_rounds); +*/ for (rounds = 0; *att_hp > 0 && *def_hp > 0 && (max_rounds <= 0 || max_rounds > rounds); @@ -372,6 +410,8 @@ void unit_versus_unit(struct unit *attacker, struct unit *defender, attacker->changed_from = ACTIVITY_IDLE; } } + // Increment number of times unit has attacked this turn: + attacker->server.attacks_this_turn++; } /**********************************************************************//** @@ -492,9 +532,8 @@ static void do_upgrade_effects(struct player *pplayer) transform_unit(punit, type_to, TRUE); notify_player(pplayer, unit_tile(punit), E_UNIT_UPGRADED, ftc_server, - _("🎀 %s %s %s upgraded for free to %s %s."), + _("[`ribbon`] %s %s upgraded for free to %s %s"), old_unit_emoji, utype_name_translation(type_from), - (is_unit_plural(punit) ? "were" : "was"), unit_link(punit), UNIT_EMOJI(punit)); unit_list_remove(candidates, punit); upgrades--; @@ -536,12 +575,12 @@ void player_restore_units(struct player *pplayer) * killed; notify player here */ if (!punit->homecity && 0 < game.server.killunhomed) { notify_player(pplayer, unit_tile(punit), E_UNIT_LOST_MISC, - ftc_server, _("⚠️ Your %s %s has run out of hit points " + ftc_server, _("[`warning`] Your %s %s has run out of hit points " "because it was not supported by a city."), unit_tile_link(punit), UNIT_EMOJI(punit)); } else { notify_player(pplayer, unit_tile(punit), E_UNIT_LOST_MISC, ftc_server, - _("⚠️ Your %s %s has run out of hit points."), + _("[`warning`] Your %s %s has run out of hit points."), unit_tile_link(punit), UNIT_EMOJI(punit)); } @@ -560,6 +599,11 @@ void player_restore_units(struct player *pplayer) && !is_unit_being_refueled(punit)) { struct unit *carrier; + /* auto-refuel is not a UWT event but we can't let it change + the previous UWT timestamp: therefore we will reset it to + whatever UWT timestamp it had before the auto-return */ + time_t original_timestamp = punit->server.action_timestamp; + carrier = transporter_for_unit(punit); if (carrier) { unit_transport_load_tp_status(punit, carrier, FALSE); @@ -603,7 +647,7 @@ void player_restore_units(struct player *pplayer) if (alive) { /* Clear activity. Unit info will be sent in the end of - * the function. */ + * the function. */ unit_activity_handling(punit, ACTIVITY_IDLE); adv_unit_new_task(punit, AUT_NONE, NULL); punit->goto_tile = NULL; @@ -615,11 +659,14 @@ void player_restore_units(struct player *pplayer) } } + /* Auto-refuel is not a human-enacted move so does not incur UWT: */ + punit->server.action_timestamp = original_timestamp; + notify_player(pplayer, unit_tile(punit), E_UNIT_ORDERS, ftc_server, - _("⛽ Your %s %s has returned to refuel."), + _("[`fuel`] Your %s %s has returned to refuel."), UNIT_EMOJI(punit), unit_link(punit)); - } + } pf_path_destroy(path); break; } @@ -639,7 +686,7 @@ void player_restore_units(struct player *pplayer) /* 6) Automatically refuel air units in cities, airbases, and * transporters (carriers). */ if (is_unit_being_refueled(punit)) { - punit->fuel = utype_fuel(unit_type_get(punit)); + punit->fuel = utype_fuel(unit_type_get(punit)); } } } unit_list_iterate_safe_end; @@ -648,7 +695,7 @@ void player_restore_units(struct player *pplayer) unit_list_iterate_safe(pplayer->units, punit) { if (punit->fuel <= 0 && utype_fuel(unit_type_get(punit))) { notify_player(pplayer, unit_tile(punit), E_UNIT_LOST_MISC, ftc_server, - _("⚠️Your %s %s %s lost when %s ran out of fuel."), + _("[`warning`]Your %s %s %s lost when %s ran out of fuel."), unit_tile_link(punit), UNIT_EMOJI(punit), (is_unit_plural(punit) ? "were" : "was"), (is_unit_plural(punit) ? "they" : "it")); @@ -743,6 +790,8 @@ static void unit_restore_movepoints(struct player *pplayer, struct unit *punit) { punit->moves_left = unit_move_rate(punit); punit->done_moving = FALSE; + /* remaining attacks is something to restore also: */ + punit->server.attacks_this_turn = 0; } /**********************************************************************//** @@ -774,7 +823,7 @@ void execute_unit_orders(struct player *pplayer) format_time_duration(game.server.unitwaittime - dt, buf, sizeof(buf)); notify_player(punit->owner, unit_tile(punit), E_UNIT_ORDERS, ftc_server, - _(" ⏳ %s %s movement delayed %s."), + _(" [`hourglass`] %s %s movement delayed %s."), UNIT_EMOJI(punit), unit_link(punit), buf); } } else execute_orders(punit, FALSE); /* Delay_Goto not applicable */ @@ -844,7 +893,16 @@ static int total_activity(struct tile *ptile, enum unit_activity act, bool tgt_matters = activity_requires_target(act); unit_list_iterate(ptile->units, punit) { - if (punit->activity == act + if (unit_is_alive(punit->id) && punit->activity == act +/* 28Jan2022 added unit_is_alive() && ... to hunt segfault. REMOVE + if it ends up being some other problem: +signal SIGSEGV, Segmentation fault: +#0 total_activity (ptile=0x55dc95922d10, tgt=0x0, act=ACTIVITY_MINE) + at ../../freeciv/server/unittools.c:861 +861 if (punit->activity == act +[Current thread is 1 (Thread 0x7fb43c04a800 (LWP 26250))] +#0 total_activity (ptile=0x55dc95922d10, tgt=0x0, act=ACTIVITY_MINE) + at ../../freeciv/server/unittools.c:861 */ && (!tgt_matters || punit->activity_target == tgt)) { total += punit->activity_count; } @@ -885,7 +943,7 @@ void notify_unit_experience(struct unit *punit) notify_player(unit_owner(punit), unit_tile(punit), E_UNIT_BECAME_VET, ftc_server, // TRANS: Your became ... rank of . - _("🥈 ∨%d. Your %s gained experience and %s now %s. %s[`v%d`]"), + _("[`medal`] v%d. Your %s gained experience and %s now %s. %s[`v%d`]"), punit->veteran, unit_link(punit), (is_unit_plural(punit) ? "are" : "is"), name_translation_get(&vlevel->name), UNIT_EMOJI(punit), punit->veteran); @@ -906,7 +964,7 @@ static void unit_convert(struct unit *punit) transform_unit(punit, to_type, TRUE); notify_player(unit_owner(punit), unit_tile(punit), E_UNIT_UPGRADED, ftc_server, - _("[`recycle`] %s converted to %s %s."), + _("[`recycle`] %s converted to %s %s"), utype_name_translation(from_type), utype_name_translation(to_type), UNIT_EMOJI(punit)); } else { @@ -963,7 +1021,7 @@ void unit_activity_complete(struct unit *punit) if (dt>0.99) { format_time_duration(game.server.unitwaittime - dt, buf, sizeof(buf)); notify_player(punit->owner, unit_tile(punit), E_UNIT_ORDERS, ftc_server, - _(" ⏳. %s %s movement delayed %s."), + _(" [`hourglass`] %s %s movement delayed %s."), UNIT_EMOJI(punit), unit_link(punit), buf); } } else { /* Else, no UWT remaining. Force GOTO to happen: */ @@ -1255,16 +1313,16 @@ static void update_unit_activity(struct unit *punit, time_t now) if (!tile_city(unit_tile(punit))) { // fortifying in a city isn't reported, more of a "client UI convenience" notify_player(punit->owner, unit_tile(punit), E_UNIT_ORDERS, ftc_server, - _(" ⏳ %s %s will finish Fortifying in %s."), + _(" [`hourglass`] %s %s will finish Fortifying in %s."), UNIT_EMOJI(punit), unit_link(punit), buf); } } else { /* Only report activities that will be finished THIS TURN after the UWT. */ int turns = 0; - const char *activity_text = concat_tile_activity_text(unit_tile(punit), &turns); - if (turns<=1) { // e.g., no uwt report for Mine finished in 3 more turns. + const char *activity_text = unit_tile_activity_text(punit, &turns); + if (turns<=1) { /* UWT reports are only for activities that finish this turn */ notify_player(punit->owner, unit_tile(punit), E_UNIT_ORDERS, ftc_server, - _(" ⏳ %s %s doing %s will finish in %s."), + _(" [`hourglass`] %s %s doing %s will finish in %s."), UNIT_EMOJI(punit), unit_link(punit), activity_text, buf); } } @@ -1304,7 +1362,7 @@ void finish_unit_wait(struct unit *punit, int activity_count) sprintf(buf,"%s",_("converting")); break; case ACTIVITY_POLLUTION: - sprintf(buf,"%s",_("cleaning pollution")); + sprintf(buf,"%s",_("cleaning Pollution")); break; case ACTIVITY_MINE: sprintf(buf,"%s",_("mining")); @@ -1313,19 +1371,23 @@ void finish_unit_wait(struct unit *punit, int activity_count) sprintf(buf,"%s",_("irrigating")); break; case ACTIVITY_PILLAGE: - sprintf(buf,"%s",_("pillaging")); + sprintf(buf,"%s %s",_("pillaging"), + punit->activity_target ? extra_name_translation(punit->activity_target) + : ""); break; case ACTIVITY_TRANSFORM: sprintf(buf,"%s",_("transforming terrain")); break; case ACTIVITY_FALLOUT: - sprintf(buf,"%s",_("cleaning fallout")); + sprintf(buf,"%s",_("cleaning Fallout")); break; case ACTIVITY_BASE: - sprintf(buf,"%s",_("building base")); + sprintf(buf,"%s %s",_("building"),extra_name_translation(punit->activity_target)); break; - case ACTIVITY_GEN_ROAD: - sprintf(buf,"%s",_("making road")); + case ACTIVITY_GEN_ROAD: + if (punit->activity_target == extra_type_by_rule_name("River")) { + sprintf(buf,"%s",_("digging Well")); + } else sprintf(buf,"%s %s",_("building"),extra_name_translation(punit->activity_target)); break; default: sprintf(buf,"%s",_("moving")); @@ -1334,23 +1396,39 @@ void finish_unit_wait(struct unit *punit, int activity_count) /* DEBUG LEFTOVER notify_player(punit->owner, unit_tile(punit), E_UNIT_RELOCATED, ftc_server, _("fuw.%s #%d getting a uac call to execute."),unit_link(punit),punit->id); */ - + + /* Save id some info in case the unit doesn't exist after doing its action: */ + int saved_id = punit->id; + const struct unit_type *saved_type = unit_type_get(punit); + const struct player *saved_player = unit_owner(punit); + const struct tile *saved_tile = unit_tile(punit); + /* Call the function for finishing activities: */ unit_activity_complete(punit); - /* Send a message if legitimate activity completed */ + /* Unit may have joined a city, established embassy, got auto-attacked, etc. */ + bool is_dead = !unit_is_alive(saved_id); - /* If unit had orders but not anymore, then unit is no longer doing activity */ - orders_finished = had_orders && !punit->has_orders; - - /* Catch false movement cases, bogus orders, etc.: don't print message for these */ - if (possibly_moved==true && (original_tile == punit->tile)) - orders_finished = false; - - /* Report activity is finished: */ - if (orders_finished && punit->activity==ACTIVITY_IDLE) - notify_player(unit_owner(punit), unit_tile(punit), E_UNIT_ORDERS, ftc_server, - _(" ⏰ %s %s finished %s."), unit_link(punit), UNIT_EMOJI(punit), buf); + /* Send a message if legitimate activity completed */ + if (!is_dead) { + /* If unit had orders but not anymore, then unit is no longer doing activity */ + orders_finished = had_orders && !punit->has_orders; + + /* Catch false movement cases, bogus orders, etc.: don't print message for these */ + if (possibly_moved==true && (original_tile == punit->tile)) + orders_finished = false; + + /* Report activity is finished: */ + if (orders_finished && punit->activity==ACTIVITY_IDLE) + notify_player(unit_owner(punit), unit_tile(punit), E_UNIT_ORDERS, ftc_server, + _(" [`clock`] %s %s finished %s."), unit_link(punit), UNIT_EMOJI(punit), buf); + } else { + /* Unit no longer exists after unit_activity_complete() */ + notify_player(saved_player, saved_tile, E_UNIT_ORDERS, ftc_server, + _(" [`clock`] %s %s finished."), + utype_name_translation(saved_type), + (is_word_plural(utype_name_translation(saved_type)) ? "are" : "is")); + } } /**********************************************************************//** @@ -1498,13 +1576,44 @@ void place_partisans(struct tile *pcenter, struct player *powner, { struct tile *ptile = NULL; struct unit_type *u_type = get_role_unit(L_PARTISAN, 0); + int vet_level = 0; + +#ifdef FREECIV_WEB + /* FCW uses bitwise trickery to specify the unit_type. TODO: this function + should be rewritten to let LUA specify the unit_type to generate, as it + would generalize a lot more game events than only partisan spawning. */ + if (count > 255) { + int utype_idx = count; + /* First 8 bits are # of partisans */ + count &= 255; + /* utype index is everything past the first 8 bits */ + utype_idx -= count; + utype_idx = utype_idx >> 8; + u_type = utype_by_number((Unit_type_id)utype_idx); + if (!u_type) return; + } + + /* Cities with Barracks or players with Sun Tzu get vet partisans: */ + vet_level = get_target_bonus_effects(NULL, + powner, + NULL, + tile_city(pcenter), + NULL, + pcenter, + NULL, + u_type, + NULL, + NULL, + NULL, + EFT_VETERAN_BUILD); +#endif while (count-- > 0 && find_a_good_partisan_spot(pcenter, powner, u_type, sq_radius, &ptile)) { struct unit *punit; - punit = create_unit(powner, ptile, u_type, 0, 0, -1); + punit = create_unit(powner, ptile, u_type, vet_level, 0, -1); if (can_unit_do_activity(punit, ACTIVITY_FORTIFYING)) { punit->activity = ACTIVITY_FORTIFIED; /* yes; directly fortified */ send_unit_info(NULL, punit); @@ -1573,6 +1682,7 @@ void bounce_unit(struct unit *punit, bool verbose) pplayer = unit_owner(punit); punit_tile = unit_tile(punit); + /* First preference, bounce to a tile unit can survive */ square_iterate(&(wld.map), punit_tile, DIST, ptile) { if (count >= ARRAY_SIZE(tiles)) { break; @@ -1588,6 +1698,20 @@ void bounce_unit(struct unit *punit, bool verbose) tiles[count++] = ptile; } } square_iterate_end; + /* Second preference, bounce to a tile where unit can exist + * i.e., might lose fuel or helicopter hp */ + if (count == 0) { + square_iterate(&(wld.map), punit_tile, DIST, ptile) { + if (count >= ARRAY_SIZE(tiles)) break; + if ( + ptile == punit_tile) continue; + if (can_unit_exist_at_tile(&(wld.map), punit, ptile) + && !is_non_allied_city_tile(ptile, pplayer) + && !is_non_allied_unit_tile(ptile, pplayer)) { + tiles[count++] = ptile; + } + } square_iterate_end; + } if (count > 0) { struct tile *ptile = tiles[fc_rand(count)]; @@ -1595,7 +1719,7 @@ void bounce_unit(struct unit *punit, bool verbose) if (verbose) { notify_player(pplayer, ptile, E_UNIT_RELOCATED, ftc_server, /* TRANS: A unit is moved to resolve stack conflicts. */ - _("Moved your %s %s."), + _("Moved your %s %s"), unit_link(punit), UNIT_EMOJI(punit)); } /* TODO: should a unit be able to bounce to a transport like is done @@ -1619,7 +1743,7 @@ void bounce_unit(struct unit *punit, bool verbose) if (verbose) { notify_player(pplayer, punit_tile, E_UNIT_LOST_MISC, ftc_server, /* TRANS: A unit is disbanded to resolve stack conflicts. */ - _("⚠️ Disbanded your %s %s."), + _("[`warning`] Disbanded your %s %s"), unit_tile_link(punit), UNIT_EMOJI(punit)); } wipe_unit(punit, ULR_STACK_CONFLICT, NULL); @@ -1876,6 +2000,9 @@ void transform_unit(struct unit *punit, const struct unit_type *to_unit, const struct unit_type *old_type = punit->utype; int old_mr = unit_move_rate(punit); int old_hp = unit_type_get(punit)->hp; + int old_fu = utype_fuel(old_type), + new_fu = utype_fuel(to_unit), + cur_fu = punit->fuel; if (!is_free) { pplayer->economic.gold -= @@ -1896,11 +2023,21 @@ void transform_unit(struct unit *punit, const struct unit_type *to_unit, - game.server.upgrade_veteran_loss, 0); } - /* Scale HP and MP, rounding down. Be careful with integer arithmetic, - * and don't kill the unit. unit_move_rate is used to take into account + /* Scale HP and MP, rounding down. Be careful with integer arithmetic, + * and don't kill the unit. unit_move_rate() is used to take into account * global effects like Magellan's Expedition. */ punit->hp = MAX(punit->hp * unit_type_get(punit)->hp / old_hp, 1); - punit->moves_left = punit->moves_left * unit_move_rate(punit) / old_mr; + if (old_mr == 0) { + punit->moves_left = unit_move_rate(punit); + } else { + punit->moves_left = punit->moves_left * unit_move_rate(punit) / old_mr; + } + /* Scale Fuel. Avoid "unfair" death by covering every case in the logic tree: + * CASE 1. Old type has no fuel? Fill up with 100% fuel. ==(Don't start with no fuel) + * CASE 2. New type has more fuel? Add the difference. ==(Same amount of burnt fuel) + * CASE 3: New type has less fuel? Keep max.legal amount. ==(Avoid unfair death) */ + punit->fuel + = (!old_fu) ? new_fu : MAX(cur_fu + (new_fu - old_fu), MIN(cur_fu, new_fu)); unit_forget_last_activity(punit); @@ -2009,7 +2146,7 @@ struct unit *create_unit_full(struct player *pplayer, struct tile *ptile, send_unit_info(NULL, punit); maybe_make_contact(ptile, unit_owner(punit)); - wakeup_neighbor_sentries(punit); + wakeup_neighbor_sentries(punit, true); /* update unit upkeep */ city_units_upkeep(game_city_by_number(homecity_id)); @@ -2124,11 +2261,11 @@ static void server_remove_unit_full(struct unit *punit, bool transported, /* check if this unit had UTYF_GAMELOSS flag */ if (unit_has_type_flag(punit, UTYF_GAMELOSS) && unit_owner(punit)->is_alive) { notify_conn(game.est_connections, ptile, E_UNIT_LOST_MISC, ftc_server, - _("💥 Unable to defend %s %s, %s has lost the game."), + _("[`boom`] Unable to defend %s %s, %s has lost the game."), unit_link(punit), UNIT_EMOJI(punit), player_name(pplayer)); notify_player(pplayer, ptile, E_GAME_END, ftc_server, - _("⚠️ Losing %s %s meant losing the game! " + _("[`warning`] Losing %s %s meant losing the game! " "Be more careful next time!"), unit_link(punit), UNIT_EMOJI(punit)); player_status_add(unit_owner(punit), PSTATUS_DYING); @@ -2185,7 +2322,7 @@ static void unit_lost_with_transport(const struct player *pplayer, struct player *killer) { notify_player(pplayer, unit_tile(pcargo), E_UNIT_LOST_MISC, ftc_server, - _("⚠️ %s %s lost when %s [`%s`] was lost."), + _("[`warning`] %s %s lost when %s [`%s`] was lost."), unit_tile_link(pcargo), UNIT_EMOJI(pcargo), utype_name_translation(ptransport), utype_name_translation(ptransport) ); @@ -2430,7 +2567,7 @@ static bool try_to_save_unit(struct unit *punit, const struct unit_type *pttype, if (teleport_unit_to_city(punit, pcity, 0, FALSE)) { notify_player(pplayer, ptile, E_UNIT_RELOCATED, ftc_server, - _("💢 %s escaped the destruction of %s, and fled to %s."), + _("[`anger`] %s escaped the destruction of %s, and fled to %s."), tplink, utype_name_translation(pttype), city_link(pcity)); @@ -2507,7 +2644,7 @@ void kill_unit(struct unit *pkiller, struct unit *punit, bool vet) "x other units." */ const int MAX_SECONDARY_CASUALTIES_TO_REPORT = 6; const int MAX_KILLED_UNITS_TO_REPORT_TO_ALL_PLAYERS = 128; - + int others = 0; sz_strlcpy(pkiller_link, unit_link(pkiller)); sz_strlcpy(punit_link, unit_tile_link(punit)); @@ -2572,7 +2709,7 @@ void kill_unit(struct unit *pkiller, struct unit *punit, bool vet) game.server.savepalace = FALSE; /* moving it around is dumb */ - city_list_iterate_safe(pvictim->cities, pcity) { + city_list_iterate_safe(pvictim->cities, scity) { /* kindly ask the citizens to submit */ if (fc_rand(vcsize) < conqsize) { submit = TRUE; @@ -2585,7 +2722,7 @@ void kill_unit(struct unit *pkiller, struct unit *punit, bool vet) * give verbose messages of every unit transferred, * and raze buildings according to raze chance * (also removes palace) */ - (void) transfer_city(pvictor, pcity, 7, TRUE, TRUE, TRUE, + (void) transfer_city(pvictor, scity, 7, TRUE, TRUE, TRUE, !is_barbarian(pvictor)); submit = FALSE; } @@ -2626,8 +2763,8 @@ void kill_unit(struct unit *pkiller, struct unit *punit, bool vet) if (!is_stack_vulnerable(unit_tile(punit)) || unitcount == 1) { notify_player(pvictor, unit_tile(pkiller), E_UNIT_WIN_ATT, ftc_server, - /* TRANS: "💥Your attacking 🏇Horsemen eliminated the Polish Horsemen.🏇" */ - _("💥Your attacking %s %s the %s %s."), + /* TRANS: "[`boom`]Your attacking 🏇Horsemen eliminated the Polish Horsemen.🏇" */ + _("[`boom`]Your attacking %s %s the %s %s."), /*pkiller_emoji,*/ pkiller_link, get_battle_winner_verb(0), nation_adjective_for_player(pvictim), @@ -2636,8 +2773,8 @@ void kill_unit(struct unit *pkiller, struct unit *punit, bool vet) notify_unit_experience(pkiller); } notify_player(pvictim, unit_tile(punit), E_UNIT_LOST_DEF, ftc_server, - /* TRANS: "⚠️Your Horsemen🏇 lost to an attack by [a] Russian 🏇Horsemen." */ - _("⚠️Your %s %s %s lost to an attack by %s %s %s %s"), + /* TRANS: "[`warning`]Your Horsemen🏇 lost to an attack by [a] Russian 🏇Horsemen." */ + _("[`warning`]Your %s %s %s lost to an attack by %s %s %s %s"), (pcity ? city_link(pcity) : ""), punit_link, punit_emoji, is_unit_plural(pkiller) ? "" : indefinite_article_for_word(nation_adjective_for_player(pvictor), false), @@ -2663,7 +2800,7 @@ void kill_unit(struct unit *pkiller, struct unit *punit, bool vet) num_escaped[i] = 0; } - /* count killed units */ + /* count killed units after letting some units (possibly) escape */ unit_list_iterate(ptile->units, vunit) { struct player *vplayer = unit_owner(vunit); @@ -2689,8 +2826,8 @@ void kill_unit(struct unit *pkiller, struct unit *punit, bool vet) NULL, action_by_number(ACTION_ATTACK), EFT_STACK_ESCAPE_PCT); - // Charm the dice a tiny % based on who has more moves: - escape_chance += (vunit->moves_left - pkiller->moves_left); + // Escape Charm. +1% odds for each move point more the defender has over attacker: + escape_chance += ((vunit->moves_left - pkiller->moves_left) / SINGLE_MOVE); // Roll the dice: if (fc_rand(100) MAX_KILLED_UNITS_TO_REPORT_TO_ALL_PLAYERS) { notify_player(pvictor, unit_tile(pkiller), E_UNIT_WIN_ATT, ftc_server, // won't ever be singular, but kept in case we revert to simpler message: - /* TRANS: "💥Your attacking 🏇Horsemen eliminated the Finnish Horsemen🏇 and 10 other units!" */ - PL_("💥Your attacking %s %s the %s %s " + /* TRANS: "[`boom`]Your attacking 🏇Horsemen eliminated the Finnish Horsemen🏇 and 10 other units!" */ + PL_("[`boom`]Your attacking %s %s the %s %s " "and %d other unit!", // This wouldn't happen unless MAX reported casualties is set to 0. - "💥Your attacking %s %s the %s %s " + "[`boom`]Your attacking %s %s the %s %s " "and %d other units!", unitcount - 1), /*pkiller_emoji,*/ pkiller_link, get_battle_winner_verb(kill_counter), @@ -2780,7 +2917,7 @@ void kill_unit(struct unit *pkiller, struct unit *punit, bool vet) if (killed_units[k].id != punit->id) { // Concatenate the result string for secondary casualties sz_strlcpy(casualty_type_name, unit_name_translation(&killed_units[k])); - sprintf(killed_unit_str, " 💥%s %s %s", nation_adjective_for_player(unit_owner(&killed_units[k])), + sprintf(killed_unit_str, " [`boom`]%s %s %s", nation_adjective_for_player(unit_owner(&killed_units[k])), // deverbosify longer lists. >3 secondary casualties just become nation+unit_emoji: (kill_counter<4 ? casualty_type_name : ""), UNIT_EMOJI(&killed_units[k])); @@ -2793,8 +2930,8 @@ void kill_unit(struct unit *pkiller, struct unit *punit, bool vet) // Send final report. if (unitcount-1 == 1) { notify_player(pvictor, unit_tile(pkiller), E_UNIT_WIN_ATT, ftc_server, - /* TRANS "💥Your attacking 🏇Horsemen massacred the Chinese Horsemen🏇 and the 💥North Korean Horsemen🏇."" */ - _("💥Your attacking %s %s the %s %s %s and the %s"), + /* TRANS "[`boom`]Your attacking 🏇Horsemen massacred the Chinese Horsemen🏇 and the [`boom`]North Korean Horsemen🏇."" */ + _("[`boom`]Your attacking %s %s the %s %s %s and the %s"), /*(pkiller_emoji,*/ pkiller_link, get_battle_winner_verb(1), nation_adjective_for_player(pvictim), @@ -2803,8 +2940,8 @@ void kill_unit(struct unit *pkiller, struct unit *punit, bool vet) } else { // Need to cut it up into shorter packets, send two messages. notify_player(pvictor, unit_tile(pkiller), E_UNIT_WIN_ATT, ftc_server, - /* TRANS "💥Your attacking 🏇Horsemen massacred the Chinese Horsemen🏇 and the 💥North Korean Horsemen🏇."" */ - _("💥Your attacking %s %s the %s %s %s and %d other units:"), + /* TRANS "[`boom`]Your attacking 🏇Horsemen massacred the Chinese Horsemen🏇 and the [`boom`]North Korean Horsemen🏇."" */ + _("[`boom`]Your attacking %s %s the %s %s %s and %d other units:"), /*(pkiller_emoji,*/ pkiller_link, get_battle_winner_verb(kill_counter), nation_adjective_for_player(pvictim), @@ -2834,7 +2971,7 @@ void kill_unit(struct unit *pkiller, struct unit *punit, bool vet) notify_player(player_by_number(i), ptile, E_UNIT_LOST_DEF, ftc_server, /* TRANS: "Horsemen🏇 lost to an attack by [a] Polish 🏇Horsemen." */ - _("⚠️%s %s %s lost to an attack by %s %s %s %s"), + _("[`warning`]%s %s %s lost to an attack by %s %s %s %s"), (pcity ? city_link(pcity) : ""), punit_link, punit_emoji, is_unit_plural(pkiller) ? "" : indefinite_article_for_word(nation_adjective_for_player(pvictor), false), @@ -2848,7 +2985,7 @@ void kill_unit(struct unit *pkiller, struct unit *punit, bool vet) notify_player(player_by_number(i), ptile, E_UNIT_LOST_DEF, ftc_server, /* TRANS: "Horsemen🏇 lost when [a] Polish 🏇Horsemen attacked the Latvian Horsemen🏇". */ - _("⚠️%s %s %s lost when %s %s %s %s attacked the %s %s."), + _("[`warning`]%s %s %s lost when %s %s %s %s attacked the %s %s."), (pcity ? city_link(pcity) : ""), unit_link(other_killed[i]), UNIT_EMOJI(other_killed[i]), is_unit_plural(pkiller) ? "" : indefinite_article_for_word(nation_adjective_for_player(pvictor), false), @@ -2862,7 +2999,7 @@ void kill_unit(struct unit *pkiller, struct unit *punit, bool vet) else if (num_killed[i] > 1) { // REPORT for SAME PLAYER as the primary stack defender if (i == player_index(pvictim)) { - int others = num_killed[i] - 1; + others = num_killed[i] - 1; /* Used to have two separate blocks for whether you had one or more than one secondary casualty: This block is no longer necessary but kept around for reference history if (others == 1) { // 2 units lost, meaning one secondary casualty to list @@ -2870,7 +3007,7 @@ void kill_unit(struct unit *pkiller, struct unit *punit, bool vet) E_UNIT_LOST_DEF, ftc_server, // TRANS: "Musketeers (and Cannon) lost to an // attack from the Polish Destroyer." - _("⚠️%s (and %s) were lost to %s %s %s."), + _("[`warning`]%s (and %s) were lost to %s %s %s."), punit_link, unit_link(other_killed[i]), indefinite_article_for_word(nation_adjective_for_player(pvictor), false), @@ -2886,10 +3023,10 @@ void kill_unit(struct unit *pkiller, struct unit *punit, bool vet) notify_player(player_by_number(i), ptile, E_UNIT_LOST_DEF, ftc_server, // TRANS: "Horsemen🏇 and 3 other units lost to an attack from [a] Polish 🏇Horsemen." - PL_("⚠️%s %s %s and %d other unit lost to " - "%s %s %s %s:", - "⚠️%s %s %s and %d other units lost to " - "%s %s %s %s:", others), + PL_("[`warning`]%s %s %s and %d other unit lost to " + "%s %s %s %s.", + "[`warning`]%s %s %s and %d other units lost to " + "%s %s %s %s.", others), (pcity ? city_link(pcity) : ""), punit_link, punit_emoji, others, @@ -2903,97 +3040,107 @@ void kill_unit(struct unit *pkiller, struct unit *punit, bool vet) char dead_units_str[1024]; char killed_unit_str[512]; char plural_string[32]; + others = num_killed[i]-1; plural_string[0] = 0; memset(dead_units_str, '\0', sizeof(dead_units_str)); + int my_killed_count = 0; // used for punctuation by adding "," and ", and" into the string, based on index for (int k = 0; k < kill_counter; k++) { /* 1. Don't show primary stack defender as secondary casualty - 2. Only show casualties belonging to this player to this player */ - if (unit_owner(&killed_units[k])==player_by_number(i) && killed_units[k].id != punit->id) { + 2. Only show casualties belonging to this player */ + if (unit_owner(&killed_units[k])==player_by_number(i) && killed_units[k].id != punit->id) { + my_killed_count++; // Concatenate the result string for secondary casualties sz_strlcpy(casualty_type_name, unit_name_translation(&killed_units[k])); sprintf(killed_unit_str, " ◽%s %s", casualty_type_name, UNIT_EMOJI(&killed_units[k])); strcat(dead_units_str, killed_unit_str); - if (k 1) sprintf(plural_string, "%d", num_killed[i]); - notify_player(player_by_number(i), unit_tile(pkiller), E_UNIT_LOST_DEF, ftc_server, - // TRANS: "Horsemen🏇 and Horsemen🏇 lost to [a] Polish Horsemen🏇." - // or: "Horsemen🏇, Horsemen🏇, and Horsemen🏇 lost to [a] Polish Horsemen🏇. (3 units)" - PL_("⚠️%s %s %s and %s lost to %s %s %s %s.%s", // last %s is null for singular situations - "⚠️%s %s %s, %s lost to %s %s %s %s. (%s units)", num_killed[i] - 1), + if (num_killed[i]-1 > 1) { + sprintf(plural_string, "%d", num_killed[i]-1); + } + /* if 2 units were killed then we don't need to break up two message packets */ + if (num_killed[i]-1 == 1) { + notify_player(player_by_number(i), unit_tile(pkiller), E_UNIT_LOST_DEF, ftc_server, + // TRANS: "Horsemen🏇 and Horsemen🏇 lost to [a] Polish Horsemen🏇." + "[`warning`]%s %s %s and %s lost to %s %s %s %s.", // last %s is null for singular situations + (pcity ? city_link(pcity) : ""), + punit_link, punit_emoji, + dead_units_str, + is_unit_plural(pkiller) ? "" : indefinite_article_for_word(nation_adjective_for_player(pvictor), false), + nation_adjective_for_player(pvictor), + pkiller_emoji, pkiller_link); + } else { + /* otherwise, we need to break into two messages so we don't overflow packet length */ + notify_player(player_by_number(i), unit_tile(pkiller), E_UNIT_LOST_DEF, ftc_server, + /* TRANS: "[a] Viking 🏇 Horsemen killed our London Horsemen🏇 and 2 other units: */ + _("[`warning`]%s %s %s %s killed our %s %s %s and %s other units:"), + is_unit_plural(pkiller) ? "" : indefinite_article_for_word(nation_adjective_for_player(pvictor), true), + nation_adjective_for_player(pvictor), + pkiller_emoji, pkiller_link, + (pcity ? city_link(pcity) : ""), + punit_link, punit_emoji, + plural_string); + notify_player(player_by_number(i), unit_tile(pkiller), E_UNIT_LOST_DEF, ftc_server, + /* Horsemen🏇, and Horsemen🏇." */ + _("%s"), dead_units_str); + } + } + } // case handling for casualty report for owner of the killed stack defender unit + + // Player had secondary casualties but was NOT THE STACK DEFENDER: + else { + bool too_many_casualties = (num_killed[i] > MAX_SECONDARY_CASUALTIES_TO_REPORT + || kill_counter > MAX_KILLED_UNITS_TO_REPORT_TO_ALL_PLAYERS); + bool incoming_list = !too_many_casualties; + + /* In the case of not being the stack defender, we ALWAYS get a report of #n unit(s) lost + when the Attacker killed the [allied] stack defender. If the number of casualties is + too long to list, we stop there; otherwise we insert a colon at the end of that string + to prompt the later notification which lists the casualties: */ + notify_player(player_by_number(i), ptile, + E_UNIT_LOST_DEF, ftc_server, + /* TRANS: "2 units lost when [an] Italian 🏇Horsemen attacked [a] German Horsemen🏇:" */ + PL_("[`warning`] %d %s unit lost when %s %s %s %s attacked %s %s %s%s", + "[`warning`] %d %s units lost when %s %s %s %s attacked %s %s %s%s", num_killed[i]), + num_killed[i], (pcity ? city_link(pcity) : ""), - punit_link, punit_emoji, - dead_units_str, is_unit_plural(pkiller) ? "" : indefinite_article_for_word(nation_adjective_for_player(pvictor), false), nation_adjective_for_player(pvictor), pkiller_emoji, pkiller_link, - plural_string); - } - } // case handling for casualty report for owner of the killed stack defender unit + is_unit_plural(punit) ? "" : indefinite_article_for_word(nation_adjective_for_player(pvictim), false), + nation_adjective_for_player(pvictim), + punit_link, + (incoming_list ? ":" : ".")); - // Player had secondary casualties but was not the stack defender. - // CASE HANDLING: player had too secondary casualties to report them all: - else { - if (num_killed[i]-1 > MAX_SECONDARY_CASUALTIES_TO_REPORT - || kill_counter > MAX_KILLED_UNITS_TO_REPORT_TO_ALL_PLAYERS) { - - notify_player(player_by_number(i), ptile, - E_UNIT_LOST_DEF, ftc_server, - /* TRANS: "2 units lost when [an] Italian 🏇Horsemen attacked the German Horsemen🏇." */ - PL_("⚠️ %d %s unit lost when %s %s %s %s attacked the %s %s %s", - "⚠️ %d %s units lost when %s %s %s %s attacked the %s %s %s", - num_killed[i]), - num_killed[i], - (pcity ? city_link(pcity) : ""), - is_unit_plural(pkiller) ? "" : indefinite_article_for_word(nation_adjective_for_player(pvictor), false), - nation_adjective_for_player(pvictor), - pkiller_emoji, pkiller_link, - nation_adjective_for_player(pvictim), - punit_link, punit_emoji); - } - /* CASE HANDLING: player's secondary casualties less than MAX_SECONDARY_CASUALTIES_TO_REPORT, - so report them all */ - else if (num_killed[i]-1 <= MAX_SECONDARY_CASUALTIES_TO_REPORT - && kill_counter <= MAX_KILLED_UNITS_TO_REPORT_TO_ALL_PLAYERS) - { + /* Player's secondary casualties not more than MAX_SECONDARY_CASUALTIES_TO_REPORT, + so we report them: */ + if (!too_many_casualties) { char dead_units_str[1024]; char killed_unit_str[512]; - char plural_string[32]; - - plural_string[0] = 0; + memset(dead_units_str, '\0', sizeof(dead_units_str)); for (int k = 0; k < kill_counter; k++) { - /* Only show casualties belonging to this player */ + /* Only show casualties belonging to this player */ if (unit_owner(&killed_units[k])==player_by_number(i)) { // Concatenate the result string for secondary casualties sz_strlcpy(casualty_type_name, unit_name_translation(&killed_units[k])); sprintf(killed_unit_str, " ◽%s %s", casualty_type_name, UNIT_EMOJI(&killed_units[k])); strcat(dead_units_str, killed_unit_str); - if (k 0) sprintf(plural_string, "%d", num_killed[i]); - notify_player(player_by_number(i), unit_tile(pkiller), E_UNIT_LOST_DEF, ftc_server, - /* TRANS: "Horsemen🏇 lost to [an] Italian 🏇Horsemen." - "Horsemen🏇, Horsemen🏇, and Horsemen🏇 lost to [an] Italian 🏇Horsemen. (3 units)" */ - PL_("⚠️%s %s lost to %s %s %s %s.%s", // last %s is null for singular situations - "⚠️%s %s lost to %s %s %s %s. (%s units)", num_killed[i]), + //if (num_killed[i]-1 > 0) sprintf(plural_string, "%d", num_killed[i]); + notify_player(player_by_number(i), ptile, E_UNIT_LOST_DEF, ftc_server, + /* TRANS: "Horsemen🏇, Horsemen🏇, and Horsemen🏇" */ + _("%s %s."), (pcity ? city_link(pcity) : ""), - dead_units_str, - is_unit_plural(pkiller) ? "" : indefinite_article_for_word(nation_adjective_for_player(pvictor), false), - nation_adjective_for_player(pvictor), - pkiller_emoji, pkiller_link, - plural_string); + dead_units_str); } } // case handling for player with secondary casualties who did not own the stack defender. } // case handling for each player who lost more than one unit @@ -3006,9 +3153,9 @@ void kill_unit(struct unit *pkiller, struct unit *punit, bool vet) // MAX_SECONDARY_CASUALTIES_TO_REPORT (same logic as above) notify_player(player_by_number(i), unit_tile(punit), E_UNIT_ESCAPED, ftc_server, - /* TRANS: "🏃🏻‍♂️ 2 units escaped from attack by a Swiss Battleship." ;~) */ - PL_("🏃🏻‍♂️ %d unit escaped from attack by %s %s %s", - "🏃🏻‍♂️ %d units escaped from attack by %s %s %s", + /* TRANS: "2 units escaped from attack by a Swiss Battleship." ;~) */ + PL_("[`running`] %d unit escaped from attack by %s %s %s", + "[`running`] %d units escaped from attack by %s %s %s", num_escaped[i]), num_escaped[i], is_unit_plural(pkiller) ? "" : indefinite_article_for_word(nation_adjective_for_player(pvictor), false), @@ -3181,7 +3328,18 @@ void send_unit_info(struct conn_list *dest, struct unit *punit) dest = game.est_connections; } - CHECK_UNIT(punit); + //CHECK_UNIT(punit); + // Segfault hunting + if (!punit + || !unit_type_get(punit) + || !unit_owner(punit) + || player_by_number(player_index(unit_owner(punit))) + != unit_owner(punit) + || !game_unit_by_number(punit->id)) { + + log_error("send_unit_info attempted on non-existent unit or player"); + return; + } powner = unit_owner(punit); package_unit(punit, &info); @@ -3253,6 +3411,19 @@ static void do_nuke_tile(struct player *pplayer, struct tile *ptile, struct city *pcity = NULL; int pop_loss; + bool protected = is_tile_nuke_proof(ptile); + if (protected) { + unit_list_iterate_safe(ptile->units, punit) { + notify_player(unit_owner(punit), ptile, E_UNIT_LOST_MISC, ftc_server, + _("[`nuclearexplosion`] Your tile was unaffected by a %s nuclear blast."), + pplayer == unit_owner(punit) + ? _("self-induced") + : nation_adjective_for_player(pplayer)); + break; /* only one unit per tile triggers this message */ + } unit_list_iterate_safe_end; + return; /* protected tile: avoid all further nuke action below */ + } + pcity = tile_city(ptile); unit_list_iterate_safe(ptile->units, punit) { @@ -3303,7 +3474,7 @@ static void do_nuke_tile(struct player *pplayer, struct tile *ptile, int saved_id = pcity->id; notify_player(city_owner(pcity), ptile, E_CITY_NUKED, ftc_server, - _("💀 %s was annihilated by a nuclear detonation."), + _("[`skull`] %s was annihilated by a nuclear detonation."), city_link(pcity)); if (city_owner(pcity) != pplayer) { @@ -3542,7 +3713,7 @@ bool do_paradrop(struct unit *punit, struct tile *ptile, || !unit_could_load_at(punit, ptile))) { map_show_circle(pplayer, ptile, unit_type_get(punit)->vision_radius_sq); notify_player(pplayer, ptile, E_UNIT_LOST_MISC, ftc_server, - _("⚠️Your %s %s paradropped into the %s and %s lost."), + _("[`warning`]Your %s %s paradropped into the %s and %s lost."), UNIT_EMOJI(punit), unit_tile_link(punit), terrain_name_translation(tile_terrain(ptile)), (is_unit_plural(punit) ? "were" : "was")); @@ -3557,7 +3728,7 @@ bool do_paradrop(struct unit *punit, struct tile *ptile, map_show_circle(pplayer, ptile, unit_type_get(punit)->vision_radius_sq); maybe_make_contact(ptile, pplayer); notify_player(pplayer, ptile, E_UNIT_LOST_MISC, ftc_server, - _("⚠️Your %s %s %s killed by enemy units at the " + _("[`warning`]Your %s %s %s killed by enemy units at the " "paradrop destination."), UNIT_EMOJI(punit), unit_tile_link(punit), (is_unit_plural(punit) ? "were" : "was")); @@ -3618,7 +3789,7 @@ static bool hut_get_limited(struct unit *punit) _("An abandoned village is here.")); } else { notify_player(pplayer, unit_tile(punit), E_HUT_BARB_KILLED, ftc_server, - _("⚠️ Your %s %s has been killed by barbarians!"), + _("[`warning`] Your %s %s has been killed by barbarians!"), UNIT_EMOJI(punit), unit_tile_link(punit)); wipe_unit(punit, ULR_BARB_UNLEASH, NULL); ok = FALSE; @@ -3820,16 +3991,6 @@ static bool unit_survive_autoattack(struct unit *punit) if (!game.server.autoattack) { return TRUE; } - /* AA_PROVOKED_ONLY: only attack Provoking units with non-sentried units -- - Lets ruleset use will_never and "Provoking" to exactly specify autoattack - only for much needed cases like Fighters intercepting Air attackers. Also - allows player to tactically OPT OUT of autoattack, by using sentry. */ - if (game.server.autoattack_style == AA_PROVOKED_ONLY) { - if (!unit_has_type_flag(punit, UTYF_PROVOKING)) { - return TRUE; /* Unit is not Provoking: no autoattack to be done here. */ - } - } - autoattack = autoattack_prob_list_new_full(autoattack_prob_free); /* Kludge to prevent attack power from dropping to zero during calc */ @@ -3849,17 +4010,29 @@ static bool unit_survive_autoattack(struct unit *punit) tgt_tile, tile_city(tgt_tile), punit, NULL); - // If AA_PROVOKED_ONLY, only non-sentry units can autoattack; - // thus, giving human tactical opt-out to decisionmaking. + /* If AA_PROVOKED_ONLY, only vigiling units can auto-attack; + * giving human tactical opt-in to auto-attacking. */ if (game.server.autoattack_style == AA_PROVOKED_ONLY) { if (penemy->activity != ACTIVITY_UNKNOWN) { // vigil continue; // skip/disallow units not under vigil } + /* Vigiling units only auto-attack units flagged as "Provoking" unless + * the vigiling unit has has the Reserved1 flag (which indicates it + * auto-attacks ANYTHING, if it has better odds of winning). */ + if (!unit_has_type_flag(punit, UTYF_PROVOKING)) { // non-provoking + if (!unit_has_type_flag(penemy, UTYF_RESERVED1)) { //non-Reserved1 + // skip units sans "Reserved1" from attacking non-"Provoking" unit + continue; + } else if (unit_has_type_flag(punit, UTYF_CIVILIAN)) { + continue; // Reserved1 units autoattack everything except civilians + } + } } - if (action_prob_possible(probability->prob)) { - probability->unit_id = penemy->id; - autoattack_prob_list_prepend(autoattack, probability); + if (action_prob_possible(probability->prob) + && is_unit_reachable_at(punit, penemy, unit_tile(punit))) { + probability->unit_id = penemy->id; + autoattack_prob_list_prepend(autoattack, probability); } else { FC_FREE(probability); } @@ -3907,11 +4080,22 @@ static bool unit_survive_autoattack(struct unit *punit) tgt_tile, tile_city(tgt_tile), punit, NULL); - /* If AA_PROVOKED_ONLY, sentrying a unit is user decision to not auto-attack */ + /* If AA_PROVOKED_ONLY, only vigil units can auto-attack */ if (game.server.autoattack_style == AA_PROVOKED_ONLY) { if (penemy->activity != ACTIVITY_UNKNOWN) { //ACTIVITY_VIGIL continue; // skip/disallow units not under Vigil } + /* Vigiling units only auto-attack units flagged as "Provoking" unless + * the vigiling unit has the Reserved1 flag (which indicates it + * auto-attacks all !civilians, if it has better odds of winning). */ + if (!unit_has_type_flag(punit, UTYF_PROVOKING)) { // non-provoking + if (!unit_has_type_flag(penemy, UTYF_RESERVED1)) { //non-Reserved1 + // skip units sans "Reserved1" from attacking non-"Provoking" unit + continue; + } else if (unit_has_type_flag(punit, UTYF_CIVILIAN)) { + continue; // Reserved1 units autoattack everything except civilians + } + } } if (!action_prob_possible(peprob->prob)) { @@ -3929,17 +4113,17 @@ static bool unit_survive_autoattack(struct unit *punit) && penemywin > threshold) { notify_player(unit_owner(penemy), unit_tile(punit), E_UNIT_ORDERS, ftc_server, - _("💢 Your %s %s intercepted %s %s %s %s while under vigil."), + _("[`anger`] Your %s %s engaged %s %s %s %s while under vigil."), penemy_emoji, unit_link(penemy), - indefinite_article_for_word(nation_rule_name(nation_of_unit(punit)), false), + (is_unit_plural(punit) ? "" : indefinite_article_for_word(nation_rule_name(nation_of_unit(punit)), false)), nation_rule_name(nation_of_unit(punit)), unit_rule_name(punit), punit_emoji ); notify_player(unit_owner(punit), unit_tile(punit), E_UNIT_ORDERS, ftc_server, - _("💢 Your %s %s %s intercepted by %s %s %s %s under vigil."), + _("[`anger`] Your %s %s %s engaged by %s %s %s %s under vigil."), unit_link(punit), punit_emoji, (is_unit_plural(punit) ? "were" : "was"), - indefinite_article_for_word(nation_rule_name(nation_of_unit(penemy)), false), + (is_unit_plural(punit) ? "" : indefinite_article_for_word(nation_rule_name(nation_of_unit(penemy)), false)), nation_rule_name(nation_of_unit(penemy)), penemy_emoji, unit_rule_name(penemy) ); @@ -3954,9 +4138,10 @@ static bool unit_survive_autoattack(struct unit *punit) action_auto_perf_unit_do(AAPC_UNIT_MOVED_ADJ, penemy, unit_owner(punit), NULL, tgt_tile, tile_city(tgt_tile), punit, NULL); + } else { notify_player(unit_owner(penemy), unit_tile(punit), E_UNIT_ORDERS, ftc_server, - _("💢 Your %s %s declined intercepting %s %s %s %s while under vigil."), + _("[`anger`] Your %s %s declined engaging %s %s %s %s while under vigil."), penemy_emoji, unit_rule_name(penemy), is_unit_plural(punit) ? "" : indefinite_article_for_word(nation_rule_name(nation_of_unit(punit)), false), nation_rule_name(nation_of_unit(punit)), @@ -4004,16 +4189,18 @@ static void cancel_orders(struct unit *punit, char *dbg_msg) /**********************************************************************//** Will wake up any neighboring enemy sentry units or patrolling - units. + units. 'departure' indicates a departure from the tile rather + than arrival at it (used to suppress double-messaging in some cases) **************************************************************************/ -static void wakeup_neighbor_sentries(struct unit *punit) +static void wakeup_neighbor_sentries(struct unit *punit, bool departure) { + bool longturn = is_longturn(); bool alone_in_city; int stile_x, stile_y; // tile of waking sentry unit int mtile_x, mtile_y; // tile of moving unit // Make a reference copy for use. - char punit_emoji[MAX_LEN_LINK], penemy_emoji[MAX_LEN_LINK]; + char punit_emoji[MAX_LEN_LINK]; sprintf(punit_emoji, "%s", UNIT_EMOJI(punit)); if (NULL != tile_city(unit_tile(punit))) { @@ -4033,15 +4220,48 @@ static void wakeup_neighbor_sentries(struct unit *punit) /* There may be sentried units with a sightrange > 3, but we don't wake them up if the punit is farther away than 3. */ + int num_wakings[MAX_NUM_PLAYERS] = {0}; // used to limit spam of wake-up messages + square_iterate(&(wld.map), unit_tile(punit), 3, ptile) { - int num_wakings = 0; /// used to limit spam of wake-up messages + int distance_sq = sq_map_distance(unit_tile(punit), ptile); + + /* if the tile has an extra who reports movement; e.g., Buoy, do that first: */ + const struct extra_type *reporting_extra = tile_get_extra_by_flag(ptile, EF_REPORTS); + if (!departure && reporting_extra) { + int radius_sq = 0; /* "dumb" extras can see someone on their own tile only */ + if (extra_base_get(reporting_extra)) { /* base extras have a vision radius */ + radius_sq = extra_base_get(reporting_extra)->vision_main_sq; + } + if (extra_owner(ptile) + && radius_sq >= distance_sq + && can_player_see_unit(extra_owner(ptile), punit) + && !pplayers_allied(unit_owner(punit), extra_owner(ptile))) { + + if (++num_wakings[player_number(extra_owner(ptile))] <= 1) { + index_to_map_pos(&stile_x, &stile_y, tile_index(ptile)); + index_to_map_pos(&mtile_x, &mtile_y, tile_index(unit_tile(punit)) ); + + notify_player(extra_owner(ptile), unit_tile(punit), + E_UNIT_SENTRY_WAKE, ftc_server, + _("[`eye`] %s (%d,%d) saw %s %s %s%c moving at (%d,%d)"), + extra_name_translation(reporting_extra), + stile_x, stile_y, + nation_rule_name(nation_of_unit(punit)), + unit_name_translation(punit), punit_emoji, + unit_scrambled_id(punit->id), + mtile_x, mtile_y ); + } + } + } + unit_list_iterate(ptile->units, penemy) { - - int distance_sq = sq_map_distance(unit_tile(punit), ptile); + // don't notify the same player twice for movement to this tile + int enemy_playerno = player_number(unit_owner(penemy)); int radius_sq = get_unit_vision_at(penemy, unit_tile(penemy), V_MAIN); if (!pplayers_allied(unit_owner(punit), unit_owner(penemy)) - && penemy->activity == ACTIVITY_SENTRY + && (penemy->activity == ACTIVITY_SENTRY + || unit_has_type_flag(penemy, UTYF_SENTRYALWAYS)) && radius_sq >= distance_sq /* If the unit moved on a city, and the unit is alone, consider * it is visible. */ @@ -4049,26 +4269,34 @@ static void wakeup_neighbor_sentries(struct unit *punit) || can_player_see_unit(unit_owner(penemy), punit)) /* on board transport; don't awaken */ && can_unit_exist_at_tile(&(wld.map), penemy, unit_tile(penemy))) { - set_unit_activity(penemy, ACTIVITY_IDLE); + + /* in !longturn games, ACTIVITY_SENTRY units wake to be ready for orders. */ + if (!longturn && penemy->activity == ACTIVITY_SENTRY) { + set_unit_activity(penemy, ACTIVITY_IDLE); + } send_unit_info(NULL, penemy); - if (true /*is_longturn()*/) { - if (++num_wakings <2) { - index_to_map_pos(&stile_x, &stile_y, tile_index(ptile)); - index_to_map_pos(&mtile_x, &mtile_y, tile_index(unit_tile(punit)) ); - - // Make a reference copy for use. - sprintf(penemy_emoji, "%s", UNIT_EMOJI(penemy)); - - notify_player(unit_owner(penemy), unit_tile(punit), - E_UNIT_ORDERS, ftc_server, - _("👁️ %s (%d,%d) saw %s %s %s moving at (%d,%d)"), - unit_link(penemy), - stile_x, stile_y, - nation_rule_name(nation_of_unit(punit)), - unit_name_translation(punit), punit_emoji, - mtile_x, mtile_y ); + // reporting a departure from a stack can be confused as an arrival to a stack + // and tbh any excuse to limit number of messages is a good excuse. + if (!departure && ++num_wakings[enemy_playerno] <= 1) { + /* longturn games wake only the unit reporting, thus, a single unit moving into + an area won't unsentry all other units who could report on future moves: */ + if (longturn && penemy->activity == ACTIVITY_SENTRY) { + set_unit_activity(penemy, ACTIVITY_IDLE); } + + index_to_map_pos(&stile_x, &stile_y, tile_index(ptile)); + index_to_map_pos(&mtile_x, &mtile_y, tile_index(unit_tile(punit)) ); + + notify_player(unit_owner(penemy), unit_tile(punit), + E_UNIT_SENTRY_WAKE, ftc_server, + _("[`eye`] %s (%d,%d) saw %s %s %s%c moving at (%d,%d)"), + unit_link(penemy), + stile_x, stile_y, + nation_rule_name(nation_of_unit(punit)), + unit_name_translation(punit), punit_emoji, + unit_scrambled_id(punit->id), + mtile_x, mtile_y ); } } } unit_list_iterate_end; @@ -4085,7 +4313,7 @@ static void wakeup_neighbor_sentries(struct unit *punit) cancel_orders(ppatrol, " stopping because of nearby enemy"); notify_player(unit_owner(ppatrol), unit_tile(ppatrol), E_UNIT_ORDERS, ftc_server, - _("Orders for %s %s aborted after enemy movement was " + _("Patrol for %s %s aborted when enemy movement was " "spotted."), UNIT_EMOJI(ppatrol), unit_link(ppatrol)); } } @@ -4346,20 +4574,42 @@ static void unit_move_data_unref(struct unit_move_data *pdata) } } +/**********************************************************************//** + Wrapper function for unit_move_real. This handles all unit_move cases + that aren't on a GOTO looping through a multi-tile voyage. See + unit_move_real for further explanation. +**************************************************************************/ +bool unit_move(struct unit *punit, struct tile *pdesttile, int move_cost, + struct unit *embark_to, bool find_embark_target, + bool conquer_city_allowed) +{ + return unit_move_real(punit, pdesttile, move_cost, embark_to, + find_embark_target, conquer_city_allowed, TRUE); +} + /**********************************************************************//** Moves a unit. No checks whatsoever! This is meant as a practical function for other functions, like do_airline, which do the checking themselves. - If you move a unit you should always use this function, as it also sets - the transport status of the unit correctly. Note that the source tile (the - current tile of the unit) and pdesttile need not be adjacent. + If you move a unit you should always use this function or the wrapper + function above, as it also sets the transport status of the unit + correctly. Note that the source tile (the current tile of the unit) and + pdesttile need not be adjacent. + + 'first_move' - indicates whether the unit is on a GOTO departing from + its first tile. This serves two purposes: (1) A big increase to + performance: wakeup_neighbor_sentries() can now get called n+1 times + on a path of n tiles instead of 2*(n-1)+1 times; (2) For servers which + use sentry waking as a useful intel function to report movemments to + the console, this reduces doubling of sentry intel messages which were + appearing when a unit arrived on a tile AND when the unit left the tile. Returns TRUE iff unit still alive. **************************************************************************/ -bool unit_move(struct unit *punit, struct tile *pdesttile, int move_cost, +bool unit_move_real(struct unit *punit, struct tile *pdesttile, int move_cost, struct unit *embark_to, bool find_embark_target, - bool conquer_city_allowed) + bool conquer_city_allowed, bool first_move) { struct player *pplayer; struct tile *psrctile; @@ -4397,8 +4647,11 @@ bool unit_move(struct unit *punit, struct tile *pdesttile, int move_cost, send_unit_info(NULL, ptransporter); } - /* Wakup units next to us before we move. */ - wakeup_neighbor_sentries(punit); + /* Wakup units next to us before we move. Only called on the first + move to avoid duplicate arrival/departure wakings + spam */ + if (first_move) { + wakeup_neighbor_sentries(punit, true); + } /* Make info packets at 'psrctile'. */ if (adj) { @@ -4606,7 +4859,7 @@ bool unit_move(struct unit *punit, struct tile *pdesttile, int move_cost, /* Wakeup units and make contact. */ if (unit_lives) { - wakeup_neighbor_sentries(punit); + wakeup_neighbor_sentries(punit, false); } maybe_make_contact(pdesttile, pplayer); @@ -5071,8 +5324,12 @@ bool execute_orders(struct unit *punit, const bool fresh) } log_debug(" moving to %d,%d", TILE_XY(dst_tile)); - res = unit_move_handling(punit, dst_tile, FALSE, - order.order != ORDER_ACTION_MOVE); + +/* DEBUG:notify_conn(game.est_connections, unit_tile(punit), E_UNIT_LOST_MISC, ftc_server, + _("about to call unit_move_handling() with %d moves_made"),moves_made);*/ + + res = unit_move_handling_real(punit, dst_tile, FALSE, + order.order != ORDER_ACTION_MOVE, moves_made == 1); if (!player_unit_by_number(pplayer, unitid)) { log_debug(" unit died while moving."); /* A player notification should already have been sent. */ @@ -5112,7 +5369,7 @@ bool execute_orders(struct unit *punit, const bool fresh) format_time_duration(game.server.unitwaittime - dt, buf, sizeof(buf)); notify_player(pplayer, unit_tile(punit), E_UNIT_ORDERS, ftc_server, - _(" ⌛ %s %s movement postponed %s by unitwaittime."), + _(" [`hourglass`] %s %s movement postponed %s by unitwaittime."), UNIT_EMOJI(punit), unit_link(punit), buf); } */ // .... @@ -5464,7 +5721,7 @@ bool unit_can_do_action_now(const struct unit *punit, char *caller_string) /* UWT_DELAY_GOTO means some actions WILL perform with a delay, others not (e.g. investigate city, attack unit) */ notify_player(unit_owner(punit), unit_tile(punit), E_UNIT_ORDERS, - ftc_server, _("⌛ %s %s has wait time and will move " + ftc_server, _("[`hourglass`] %s %s has wait time and will move " " in %s.\n"), UNIT_EMOJI(punit), unit_link(punit), buf); @@ -5473,7 +5730,7 @@ bool unit_can_do_action_now(const struct unit *punit, char *caller_string) if (!is_perform_action) { // An activity is being delayed notify_player(unit_owner(punit), unit_tile(punit), E_UNIT_ORDERS, - ftc_server, _("⌛ %s %s delayed for %s." + ftc_server, _("[`hourglass`] %s %s delayed for %s." " See /help unitwaittime."), UNIT_EMOJI(punit), unit_link(punit), buf); @@ -5481,7 +5738,7 @@ bool unit_can_do_action_now(const struct unit *punit, char *caller_string) // Simply can't give an action order because we have no delayed fulfillent. You have // to wait to give the order. notify_player(unit_owner(punit), unit_tile(punit), E_UNIT_ORDERS, - ftc_server, _("⌛ %s %s can't perform actions for %s." + ftc_server, _("[`hourglass`] %s %s can't perform actions for %s." " See /help unitwaittime."), UNIT_EMOJI(punit), unit_link(punit), buf); diff --git a/freeciv/freeciv/server/unittools.h b/freeciv/freeciv/server/unittools.h index 010bb611f..89cc6f05f 100644 --- a/freeciv/freeciv/server/unittools.h +++ b/freeciv/freeciv/server/unittools.h @@ -174,6 +174,10 @@ void unit_transport_unload_send(struct unit *punit); bool unit_move(struct unit *punit, struct tile *pdesttile, int move_cost, struct unit *embark_to, bool find_embark_target, bool conquer_city_allowed); +bool unit_move_real(struct unit *punit, struct tile *pdesttile, int move_cost, + struct unit *embark_to, bool find_embark_target, + bool conquer_city_allowed, bool first_move); + bool execute_orders(struct unit *punit, const bool fresh); bool unit_can_do_action_now(const struct unit *punit, char *caller_string); diff --git a/freeciv/freeciv/utility/bugs.c b/freeciv/freeciv/utility/bugs.c index 4addd226e..cf8fb98df 100644 --- a/freeciv/freeciv/utility/bugs.c +++ b/freeciv/freeciv/utility/bugs.c @@ -39,5 +39,7 @@ void bugreport_request(const char *reason_format, ...) va_end(args); /* TRANS: No full stop after the URL, could cause confusion. */ + /* Reduce log file size. log_error(_("Please report this message at %s"), BUG_URL); + */ } diff --git a/freeciv/freeciv/utility/log.c b/freeciv/freeciv/utility/log.c index d70fc0d15..aa7350997 100644 --- a/freeciv/freeciv/utility/log.c +++ b/freeciv/freeciv/utility/log.c @@ -559,10 +559,10 @@ void fc_assert_fail(const char *file, const char *function, int line, message, args); va_end(args); } - + /* Reduce gigabyte log files by about 33% by suppressing this line do_log(file, function, line, FALSE, level, - /* TRANS: No full stop after the URL, could cause confusion. */ _("Please report this message at %s"), BUG_URL); + */ if (0 <= fc_fatal_assertions) { /* Emit a signal. */ diff --git a/freeciv/prepare_freeciv.sh b/freeciv/prepare_freeciv.sh index a871a8228..5ec5d1d57 100755 --- a/freeciv/prepare_freeciv.sh +++ b/freeciv/prepare_freeciv.sh @@ -35,6 +35,6 @@ fi ( mkdir -p build cd build - ../freeciv/configure CFLAGS="-O3 $CFLAGS" \ + ../freeciv/configure CFLAGS="-O3 -g $CFLAGS" \ --enable-mapimg=magickwand --with-project-definition=../freeciv-web.project --enable-fcweb --enable-json --disable-delta-protocol --disable-nls --disable-fcmp --enable-freeciv-manual --disable-ruledit --enable-fcdb=no --enable-ai-static=classic --prefix=${HOME}/freeciv/ && make -s -j$(nproc) ) diff --git a/publite2/init-freeciv-web.sh b/publite2/init-freeciv-web.sh index 4f9c11ead..f7cd4b31d 100755 --- a/publite2/init-freeciv-web.sh +++ b/publite2/init-freeciv-web.sh @@ -62,6 +62,11 @@ rm -f "/var/lib/tomcat8/webapps/data/scorelogs/score-${2}.log" # Start Freeciv-proxy in background ../freeciv-proxy/start-freeciv-proxy.sh "${3}" >> "../logs/freeciv-proxy-loop.log" 2>&1 & + + +ulimit -c unlimited + + # Start Freeciv C server proxy_pid=$! && ${HOME}/freeciv/bin/freeciv-web "${args[@]}" > /dev/null 2> "../logs/freeciv-web-stderr-${2}.log" diff --git a/publite2/pubscript_multiplayer.serv b/publite2/pubscript_multiplayer.serv index 13d81ef73..5f6cfda22 100644 --- a/publite2/pubscript_multiplayer.serv +++ b/publite2/pubscript_multiplayer.serv @@ -1,34 +1,38 @@ cmdlevel ctrl first -rulesetdir mpplus -set topology WRAPX +rulesetdir mp2-ag + +#server set nationset all set compresstype xz -set maxplayers 32 set allowtake H1Ah1adOo set autotoggle enabled -set timeout 120 set netwait 15 +set timeout 120 set nettimeout 120 set pingtime 30 set pingtimeout 120 set maxconnectionsperhost 256 set threaded_save enabled set scorelog enabled -set size 4 -set landm 50 -set minp 2 -set generator FAIR +#players +set minplayers 2 +set maxplayers 30 #economic set gold 100 #geological -set landmass 66 +set size 4 +set topology WRAPX +set generator FAIR +set startpos DEFAULT +set landmass 50 set specials 350 -set alltemperate "ENABLED" -set separatepoles "ENABLED" set tinyisles "DISABLED" -set huts 0 +set alltemperate "DISABLED" +set separatepoles "DISABLED" +set polarstrip disabled +set huts 1 #sociological set startunits=cccwwwxx @@ -37,20 +41,48 @@ set trading_city enabled set rapturedelay 1 set revolentype FIXED set revolen 1 -set contactturns 0 -set barbarians DISABLED +set contactturns 10 +set barbarians "disabled" set onsetbarbs 30 +#scientific +set diplbulbcost 0 ; Bulbcost in % of tech traded through the diplomacy window. +set techlevel 0 +set freecost 0 ; Bulbcost in % of tech through stealing (with diplomat/spy) +set conquercost 0 ; Bulbcost in % of tech acquired through conquest. +#set sciencebox 100 ; Used to reduce or increase tech cost. Default is 100. Tech cost in ruleset is multiplicated with this number as %. +#set team_pooled_research "DISABLED" + +set techleak 50 ; +set techlossforgiveness 200 ; How much bulb-debth you can be in before you will lose tech in percent of current tech you are researching. Note: If tech leak is enabled, this can cause naught behaviour when a tech costs goes down, sending some player into more tech debt. +set techlossrestore 0 ; How many bulbs in percent you get back if you lose tech from being in tech-debt + +#victory-conditions +set victories ALLIED +set endspaceship ENABLED + #military -set borders "SEE_INSIDE" -set diplomacy "HUMAN" -set foggedborders enabled +set airliftdestdivisor 3 set airliftingstyle "FROM_ALLIES|TO_ALLIES" -set victories ALLIED -set restrictinfra "ENABLED" +set borders "SEE_INSIDE" ; "ENABLED" only gives vision on tiles city can use, not inside all border. Depending on ruleset, certain techs might change this. +set diplomacy "HUMAN" ; Disabled disables the diplomacywindow +set foggedborders enabled +set nuclearwinter_percent 20 +set restrictinfra "ENABLED" ; non-allied rails only serve as roads +set universal_unload "ENABLED" ; unloading from ships has universal consistency regardless of ocean or river + + +#MP2-AG. Disable this if playing other rulesets. +#set hideouts enabled +#set zoc_purity, enabled ; igZOC units don't lift ZOC for units subject to ZOC +#set autoattack enabled ; Required for Vigil on fighter types +#set autoattack_style 1 ; Required for Vigil on fighters only +#set nukes_minor enabled +#set nukes_major disabled + +#compatibility +set move_bonus_in_frags "ENABLED" ; MP2 may give move bonuses <1 full move point -#scientific -set endspaceship ENABLED metaconnection persistent metamessage New Freeciv-web Multiplayer Game diff --git a/scripts/gen_event_types/HOW_TO.txt b/scripts/gen_event_types/HOW_TO.txt new file mode 100644 index 000000000..d863ff7da --- /dev/null +++ b/scripts/gen_event_types/HOW_TO.txt @@ -0,0 +1,5 @@ +VAGRANT: +./gen_event_types -f /vagrant/freeciv/freeciv -o /vagrant/freeciv-web/src/derived/webapp + +OTHERS: +./gen_event_types -f /freecivpath -o /fcw_path/freeciv-web/src/derived/webapp diff --git a/scripts/generate_js_hand/generate_js_hand.py b/scripts/generate_js_hand/generate_js_hand.py index acd0a9fbf..75cac02bb 100755 --- a/scripts/generate_js_hand/generate_js_hand.py +++ b/scripts/generate_js_hand/generate_js_hand.py @@ -63,7 +63,7 @@ if (p.length > 0) { if (debug_active) clinet_debug_collect(); - update_map_canvas_check(); + if (renderer == RENDERER_2DCANVAS) update_map_canvas_check(); } } catch(err) {
NameNationHighestResearchBulb Sum
"+pplayer.name+"  " + + nations[pplayer['nation']]['adjective']+""+Math.trunc(bulb_sum)+"
+ + +
- +
@@ -107,14 +107,30 @@
-
+
+ +
+ +
+
+ +
+ +
+ +
+
+
+ +
+
@@ -131,6 +147,10 @@
+
+ +
+
diff --git a/freeciv-web/src/main/webapp/webclient/warcalc.jsp b/freeciv-web/src/main/webapp/webclient/warcalc.jsp index bd09de7af..5a5a71424 100644 --- a/freeciv-web/src/main/webapp/webclient/warcalc.jsp +++ b/freeciv-web/src/main/webapp/webclient/warcalc.jsp @@ -20,7 +20,7 @@
Attack